| 1
2 | 6x
| module.exports=function(e){function t(o){Iif(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("boundless-utils-uuid")},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,n){"use strict";function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){Iif("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=n(2),c=n.n(a),u=n(3),p=(n.n(u),n(0)),d=n.n(p),l=n(1),f=n.n(l),h=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},m=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),v="data-focus-index",y="data-focus-skip",O=function(e){function t(){var e,o,s,c;r(this,t);for(var p=arguments.length,d=Array(p),l=0;l<p;l++)d[l]=arguments[l];return o=s=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(d))),s.state={activeChildIndex:s.props.defaultActiveChildIndex},s.handleKeyDown=function(e){switch(e.key){case"ArrowUp":s.props.mode!==t.mode.VERTICAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(-1));break;case"ArrowLeft":s.props.mode!==t.mode.HORIZONTAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(-1));break;case"ArrowDown":s.props.mode!==t.mode.VERTICAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(1));break;case"ArrowRight":s.props.mode!==t.mode.HORIZONTAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(1))}s.props.onKeyDown&&s.props.onKeyDown(e)},s.handleFocus=function(e){if(e.target.hasAttribute(v)){var t=parseInt(e.target.getAttribute(v),10),n=a.Children.toArray(s.props.children)[t];s.setState({activeChildIndex:t}),n.props.onFocus&&n.props.onFocus(e)}},s.persistWrapperElementReference=function(e){s.$wrapper=e instanceof HTMLElement?e:n.i(u.findDOMNode)(e)},c=o,i(s,c)}return s(t,e),m(t,[{key:"componentDidUpdate",value:function(e,t){this.state.activeChildIndex!==t.activeChildIndex&&this.setFocus(this.state.activeChildIndex)}},{key:"componentWillReceiveProps",value:function(e){if(0!==this.state.activeChildIndex){var t=e.children?a.Children.count(e.children):0;0===t?this.setState({activeChildIndex:0}):this.state.activeChildIndex>=t&&this.setState({activeChildIndex:t-1})}}},{key:"setFocus",value:function(e){var t=this.$wrapper.children[e];t&&t.hasAttribute(y)?this.moveFocus(t.compareDocumentPosition(document.activeElement)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1):t&&document.activeElement!==t&&t.focus()}},{key:"moveFocus",value:function(e){var t=this.props.children?a.Children.count(this.props.children):0,n=this.state.activeChildIndex+e;n>=t?n=0:n<0&&(n=t-1),this.setState({activeChildIndex:n})}},{key:"renderChildren",value:function(){var e=this;return a.Children.map(this.props.children,function(t,n){var r;return c.a.cloneElement(t,(r={},o(r,v,n),o(r,y,parseInt(t.props.tabIndex,10)===-1||void 0),o(r,"key",t.key||n),o(r,"tabIndex",e.state.activeChildIndex===n?0:-1),r))})}},{key:"render",value:function(){return c.a.createElement(this.props.component,h({},d()(this.props,t.internalKeys),{ref:this.persistWrapperElementReference,onFocus:this.handleFocus,onKeyDown:this.handleKeyDown}),this.renderChildren())}}]),t}(c.a.PureComponent);O.mode={HORIZONTAL:f()(),VERTICAL:f()(),BOTH:f()()},O.propTypes={"*":a.PropTypes.any,component:a.PropTypes.oneOfType([a.PropTypes.string,a.PropTypes.func]),defaultActiveChildIndex:a.PropTypes.number,mode:a.PropTypes.oneOf([O.mode.BOTH,O.mode.HORIZONTAL,O.mode.VERTICAL])},O.defaultProps={component:"div",defaultActiveChildIndex:0,mode:O.mode.BOTH,onKeyDown:function(){}},O.internalKeys=Object.keys(O.defaultProps),t.default=O}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGEzZDgwOTAwYmVmMGNkNTQ3OTFmIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3QtZG9tXCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1hcnJvdy1rZXktbmF2aWdhdGlvbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImluc3RhbGxlZE1vZHVsZXMiLCJpIiwibCIsImNhbGwiLCJtIiwiYyIsInZhbHVlIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZ2V0IiwibiIsIl9fZXNNb2R1bGUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJyZXF1aXJlIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9kZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsIndyaXRhYmxlIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQiLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJEQVRBX0FUVFJJQlVURV9JTkRFWCIsIkRBVEFfQVRUUklCVVRFX1NLSVAiLCJBcnJvd0tleU5hdmlnYXRpb24iLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJzdGF0ZSIsImFjdGl2ZUNoaWxkSW5kZXgiLCJkZWZhdWx0QWN0aXZlQ2hpbGRJbmRleCIsImhhbmRsZUtleURvd24iLCJldmVudCIsIm1vZGUiLCJWRVJUSUNBTCIsIkJPVEgiLCJwcmV2ZW50RGVmYXVsdCIsIm1vdmVGb2N1cyIsIkhPUklaT05UQUwiLCJvbktleURvd24iLCJoYW5kbGVGb2N1cyIsImhhc0F0dHJpYnV0ZSIsImluZGV4IiwicGFyc2VJbnQiLCJnZXRBdHRyaWJ1dGUiLCJjaGlsZCIsInRvQXJyYXkiLCJjaGlsZHJlbiIsInNldFN0YXRlIiwib25Gb2N1cyIsInBlcnNpc3RXcmFwcGVyRWxlbWVudFJlZmVyZW5jZSIsInVua25vd25UeXBlIiwiJHdyYXBwZXIiLCJIVE1MRWxlbWVudCIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsInNldEZvY3VzIiwibmV4dFByb3BzIiwibnVtQ2hpbGRyZW4iLCJjb3VudCIsImNoaWxkTm9kZSIsImNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwiTm9kZSIsIkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyIsImZvY3VzIiwiZGVsdGEiLCJuZXh0SW5kZXgiLCJfdGhpczIiLCJtYXAiLCJfUmVhY3QkY2xvbmVFbGVtZW50IiwiYSIsImNsb25lRWxlbWVudCIsInRhYkluZGV4IiwidW5kZWZpbmVkIiwiY3JlYXRlRWxlbWVudCIsImNvbXBvbmVudCIsImludGVybmFsS2V5cyIsInJlZiIsInJlbmRlckNoaWxkcmVuIiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsIioiLCJhbnkiLCJvbmVPZlR5cGUiLCJzdHJpbmciLCJmdW5jIiwibnVtYmVyIiwib25lT2YiLCJkZWZhdWx0UHJvcHMiLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFB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RTFCLEVBQU1wRSxLQUFPaUUsR0FIZm5FLEVBQUFnRyxFQUFBLFdBSU9GLEVBQUt6QyxNQUFNQyxtQkFBcUJhLEVBQVEsR0FBSSxHQUpuRDZCLFNOcEVra0w5RixJQUFJLFNBQVN0QixNQUFNLFdNa0ZobUwsTUFDSXVDLEdBQUE4RSxFQUFBSSxjQUFBeEQsS0FBTVosTUFBTXFFLFVBQVo3RSxLQUNRSCxJQUFLdUIsS0FBS1osTUFBT00sRUFBbUJnRSxlQUN4Q0MsSUFBSzNELEtBQUs4QiwrQkFDVkQsUUFBUzdCLEtBQUtvQixZQUNkRCxVQUFXbkIsS0FBS1csZ0JBQ2ZYLEtBQUs0RCxzQk54RjA3TGxFLEdNM0ZoNkxwQixFQUFBOEUsRUFBTVMsY0FBakNuRSxHQUNWbUIsTUFDSEssV0FBWXZDLE1BQ1ptQyxTQUFVbkMsTUFDVm9DLEtBQU1wQyxPQUpPZSxFQU9Wb0UsV0FJSEMsSUFBSzFGLEVBQUEsVUFBVTJGLElBS2ZQLFVBQVdwRixFQUFBLFVBQVU0RixXQUNqQjVGLEVBQUEsVUFBVTZGLE9BQ1Y3RixFQUFBLFVBQVU4RixPQU1kekQsd0JBQXlCckMsRUFBQSxVQUFVK0YsT0FhbkN2RCxLQUFNeEMsRUFBQSxVQUFVZ0csT0FDWjNFLEVBQW1CbUIsS0FBS0UsS0FDeEJyQixFQUFtQm1CLEtBQUtLLFdBQ3hCeEIsRUFBbUJtQixLQUFLQyxZQXhDZnBCLEVBNENWNEUsY0FDSGIsVUFBVyxNQUNYL0Msd0JBQXlCLEVBQ3pCRyxLQUFNbkIsRUFBbUJtQixLQUFLRSxLQUM5QkksVUFBVyxjQWhERXpCLEVBbURWZ0UsYUFBZXRILE9BQU9tSSxLQUFLN0UsRUFBbUI0RSxjTndDZzlOcEgsRUFBNkIsUU0zRmpoT3dDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLGtleSx2YWx1ZSl7aWYoa2V5IGluIG9iail7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixrZXkse3ZhbHVlOnZhbHVlLGVudW1lcmFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZSx3cml0YWJsZTp0cnVlfSk7fWVsc2V7b2JqW2tleV09dmFsdWU7fXJldHVybiBvYmo7fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO312YXIgREFUQV9BVFRSSUJVVEVfSU5ERVg9J2RhdGEtZm9jdXMtaW5kZXgnO3ZhciBEQVRBX0FUVFJJQlVURV9TS0lQPSdkYXRhLWZvY3VzLXNraXAnO3ZhciBBcnJvd0tleU5hdmlnYXRpb249ZnVuY3Rpb24oX1JlYWN0JFB1cmVDb21wb25lbnQpe19pbmhlcml0cyhBcnJvd0tleU5hdmlnYXRpb24sX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIEFycm93S2V5TmF2aWdhdGlvbigpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLEFycm93S2V5TmF2aWdhdGlvbik7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fXJldHVybiBfcmV0PShfdGVtcD0oX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoX3JlZj1BcnJvd0tleU5hdmlnYXRpb24uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoQXJyb3dLZXlOYXZpZ2F0aW9uKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMuc3RhdGU9e2FjdGl2ZUNoaWxkSW5kZXg6X3RoaXMucHJvcHMuZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXh9LF90aGlzLmhhbmRsZUtleURvd249ZnVuY3Rpb24oZXZlbnQpe3N3aXRjaChldmVudC5rZXkpe2Nhc2UnQXJyb3dVcCc6aWYoX3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLlZFUlRJQ0FMfHxfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuQk9USCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtfdGhpcy5tb3ZlRm9jdXMoLTEpO31icmVhaztjYXNlJ0Fycm93TGVmdCc6aWYoX3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUx8fF90aGlzLnByb3BzLm1vZGU9PT1BcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO190aGlzLm1vdmVGb2N1cygtMSk7fWJyZWFrO2Nhc2UnQXJyb3dEb3duJzppZihfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuVkVSVElDQUx8fF90aGlzLnByb3BzLm1vZGU9PT1BcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO190aGlzLm1vdmVGb2N1cygxKTt9YnJlYWs7Y2FzZSdBcnJvd1JpZ2h0JzppZihfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuSE9SSVpPTlRBTHx8X3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X3RoaXMubW92ZUZvY3VzKDEpO31icmVhazt9aWYoX3RoaXMucHJvcHMub25LZXlEb3duKXtfdGhpcy5wcm9wcy5vbktleURvd24oZXZlbnQpO319LF90aGlzLmhhbmRsZUZvY3VzPWZ1bmN0aW9uKGV2ZW50KXtpZihldmVudC50YXJnZXQuaGFzQXR0cmlidXRlKERBVEFfQVRUUklCVVRFX0lOREVYKSl7dmFyIGluZGV4PXBhcnNlSW50KGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoREFUQV9BVFRSSUJVVEVfSU5ERVgpLDEwKTt2YXIgY2hpbGQ9X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJDaGlsZHJlblwiXS50b0FycmF5KF90aGlzLnByb3BzLmNoaWxkcmVuKVtpbmRleF07X3RoaXMuc2V0U3RhdGUoe2FjdGl2ZUNoaWxkSW5kZXg6aW5kZXh9KTtpZihjaGlsZC5wcm9wcy5vbkZvY3VzKXtjaGlsZC5wcm9wcy5vbkZvY3VzKGV2ZW50KTt9fX0sX3RoaXMucGVyc2lzdFdyYXBwZXJFbGVtZW50UmVmZXJlbmNlPWZ1bmN0aW9uKHVua25vd25UeXBlKXtfdGhpcy4kd3JhcHBlcj11bmtub3duVHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50P3Vua25vd25UeXBlOl9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX19bXCJmaW5kRE9NTm9kZVwiXSkodW5rbm93blR5cGUpO30sX3RlbXApLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLF9yZXQpO31fY3JlYXRlQ2xhc3MoQXJyb3dLZXlOYXZpZ2F0aW9uLFt7a2V5Oidjb21wb25lbnREaWRVcGRhdGUnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMscHJldlN0YXRlKXtpZih0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXghPT1wcmV2U3RhdGUuYWN0aXZlQ2hpbGRJbmRleCl7dGhpcy5zZXRGb2N1cyh0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXgpO319fSx7a2V5Oidjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyl7aWYodGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4IT09MCl7dmFyIG51bUNoaWxkcmVuPW5leHRQcm9wcy5jaGlsZHJlbj9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIkNoaWxkcmVuXCJdLmNvdW50KG5leHRQcm9wcy5jaGlsZHJlbik6MDtpZihudW1DaGlsZHJlbj09PTApe3RoaXMuc2V0U3RhdGUoe2FjdGl2ZUNoaWxkSW5kZXg6MH0pO31lbHNlIGlmKHRoaXMuc3RhdGUuYWN0aXZlQ2hpbGRJbmRleD49bnVtQ2hpbGRyZW4pe3RoaXMuc2V0U3RhdGUoe2FjdGl2ZUNoaWxkSW5kZXg6bnVtQ2hpbGRyZW4tMX0pO319fX0se2tleTonc2V0Rm9jdXMnLHZhbHVlOmZ1bmN0aW9uIHNldEZvY3VzKGluZGV4KXt2YXIgY2hpbGROb2RlPXRoaXMuJHdyYXBwZXIuY2hpbGRyZW5baW5kZXhdO2lmKGNoaWxkTm9kZSYmY2hpbGROb2RlLmhhc0F0dHJpYnV0ZShEQVRBX0FUVFJJQlVURV9TS0lQKSl7dGhpcy5tb3ZlRm9jdXMoY2hpbGROb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HPy0xOjEpO31lbHNlIGlmKGNoaWxkTm9kZSYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWNoaWxkTm9kZSl7Y2hpbGROb2RlLmZvY3VzKCk7fX19LHtrZXk6J21vdmVGb2N1cycsdmFsdWU6ZnVuY3Rpb24gbW92ZUZvY3VzKGRlbHRhKXt2YXIgbnVtQ2hpbGRyZW49dGhpcy5wcm9wcy5jaGlsZHJlbj9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIkNoaWxkcmVuXCJdLmNvdW50KHRoaXMucHJvcHMuY2hpbGRyZW4pOjA7dmFyIG5leHRJbmRleD10aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXgrZGVsdGE7aWYobmV4dEluZGV4Pj1udW1DaGlsZHJlbil7bmV4dEluZGV4PTA7fWVsc2UgaWYobmV4dEluZGV4PDApe25leHRJbmRleD1udW1DaGlsZHJlbi0xO310aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4Om5leHRJbmRleH0pO319LHtrZXk6J3JlbmRlckNoaWxkcmVuJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJDaGlsZHJlbigpe3ZhciBfdGhpczI9dGhpcztyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJDaGlsZHJlblwiXS5tYXAodGhpcy5wcm9wcy5jaGlsZHJlbixmdW5jdGlvbihjaGlsZCxpbmRleCl7dmFyIF9SZWFjdCRjbG9uZUVsZW1lbnQ7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jbG9uZUVsZW1lbnQoY2hpbGQsKF9SZWFjdCRjbG9uZUVsZW1lbnQ9e30sX2RlZmluZVByb3BlcnR5KF9SZWFjdCRjbG9uZUVsZW1lbnQsREFUQV9BVFRSSUJVVEVfSU5ERVgsaW5kZXgpLF9kZWZpbmVQcm9wZXJ0eShfUmVhY3QkY2xvbmVFbGVtZW50LERBVEFfQVRUUklCVVRFX1NLSVAscGFyc2VJbnQoY2hpbGQucHJvcHMudGFiSW5kZXgsMTApPT09LTF8fHVuZGVmaW5lZCksX2RlZmluZVByb3BlcnR5KF9SZWFjdCRjbG9uZUVsZW1lbnQsJ2tleScsY2hpbGQua2V5fHxpbmRleCksX2RlZmluZVByb3BlcnR5KF9SZWFjdCRjbG9uZUVsZW1lbnQsJ3RhYkluZGV4JyxfdGhpczIuc3RhdGUuYWN0aXZlQ2hpbGRJbmRleD09PWluZGV4PzA6LTEpLF9SZWFjdCRjbG9uZUVsZW1lbnQpKTt9KTt9fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLmNvbXBvbmVudCxfZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQoKSh0aGlzLnByb3BzLEFycm93S2V5TmF2aWdhdGlvbi5pbnRlcm5hbEtleXMpLHtyZWY6dGhpcy5wZXJzaXN0V3JhcHBlckVsZW1lbnRSZWZlcmVuY2Usb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd259KSx0aGlzLnJlbmRlckNoaWxkcmVuKCkpO319XSk7cmV0dXJuIEFycm93S2V5TmF2aWdhdGlvbjt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtBcnJvd0tleU5hdmlnYXRpb24ubW9kZT17SE9SSVpPTlRBTDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKSxWRVJUSUNBTDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKSxCT1RIOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQoKSgpfTtBcnJvd0tleU5hdmlnYXRpb24ucHJvcFR5cGVzPXsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55LGNvbXBvbmVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZyxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jXSksZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXg6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubnVtYmVyLG1vZGU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2YoW0Fycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgsQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuSE9SSVpPTlRBTCxBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5WRVJUSUNBTF0pfTtBcnJvd0tleU5hdmlnYXRpb24uZGVmYXVsdFByb3BzPXtjb21wb25lbnQ6J2RpdicsZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXg6MCxtb2RlOkFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgsb25LZXlEb3duOmZ1bmN0aW9uIG9uS2V5RG93bigpe319O0Fycm93S2V5TmF2aWdhdGlvbi5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoQXJyb3dLZXlOYXZpZ2F0aW9uLmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IEFycm93S2V5TmF2aWdhdGlvbjtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGEzZDgwOTAwYmVmMGNkNTQ3OTFmIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn1cbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtdXVpZFwifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwifVxuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtDaGlsZHJlbiwgUHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2ZpbmRET01Ob2RlfSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcbmltcG9ydCB1dWlkIGZyb20gJ2JvdW5kbGVzcy11dGlscy11dWlkJztcblxuY29uc3QgREFUQV9BVFRSSUJVVEVfSU5ERVggPSAnZGF0YS1mb2N1cy1pbmRleCc7XG5jb25zdCBEQVRBX0FUVFJJQlVURV9TS0lQID0gJ2RhdGEtZm9jdXMtc2tpcCc7XG5cbi8qKlxuX19BIGhpZ2hlci1vcmRlciBjb21wb25lbnQgZm9yIGFycm93IGtleSBuYXZpZ2F0aW9uIG9uIGEgZ3JvdXBpbmcgb2YgY2hpbGRyZW4uX19cblxuQXJyb3dLZXlOYXZpZ2F0aW9uIGlzIGRlc2lnbmVkIG5vdCB0byBjYXJlIGFib3V0IHRoZSBjb21wb25lbnQgdHlwZXMgaXQgaXMgd3JhcHBpbmcuIER1ZSB0byB0aGlzLCB5b3UgY2FuIHBhc3Mgd2hhdGV2ZXIgSFRNTCB0YWcgeW91IGxpa2UgaW50byBgcHJvcHMuY29tcG9uZW50YCBvciBldmVuIGEgUmVhY3QgY29tcG9uZW50IHlvdSd2ZSBtYWRlIGVsc2V3aGVyZS4gQWRkaXRpb25hbCBwcm9wcyBwYXNzZWQgdG8gYDxBcnJvd0tleU5hdmlnYXRpb24gLi4uPmAgd2lsbCBiZSBmb3J3YXJkZWQgb24gdG8gdGhlIGNvbXBvbmVudCBvciBIVE1MIHRhZyBuYW1lIHlvdSd2ZSBzdXBwbGllZC5cblxuVGhlIGNoaWxkcmVuLCBzaW1pbGFybHksIGNhbiBiZSBhbnkgdHlwZSBvZiBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFycm93S2V5TmF2aWdhdGlvbiBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIHN0YXRpYyBtb2RlID0ge1xuICAgICAgICBIT1JJWk9OVEFMOiB1dWlkKCksXG4gICAgICAgIFZFUlRJQ0FMOiB1dWlkKCksXG4gICAgICAgIEJPVEg6IHV1aWQoKSxcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpXG4gICAgICAgICAqL1xuICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAgICBBbnkgdmFsaWQgSFRNTCB0YWcgbmFtZSBvciBhIFJlYWN0IGNvbXBvbmVudCBmYWN0b3J5LCBhbnl0aGluZyB0aGF0IGNhbiBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGBSZWFjdC5jcmVhdGVFbGVtZW50YFxuICAgICAgICAqL1xuICAgICAgICBjb21wb25lbnQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBdKSxcblxuICAgICAgICAvKipcbiAgICAgICAgICAgIEFsbG93cyBmb3IgYSBwYXJ0aWN1bGFyIGNoaWxkIHRvIGJlIGluaXRpYWxseSByZWFjaGFibGUgdmlhIHRhYmJpbmc7IG9ubHkgYXBwbGllZCBkdXJpbmcgZmlyc3QgcmVuZGVyXG4gICAgICAgICovXG4gICAgICAgIGRlZmF1bHRBY3RpdmVDaGlsZEluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjb250cm9scyB3aGljaCBhcnJvdyBrZXkgZXZlbnRzIGFyZSBjYXB0dXJlZCB0byBtb3ZlIGFjdGl2ZSBmb2N1cyB3aXRoaW4gdGhlIGxpc3Q6XG4gICAgICAgICAqXG4gICAgICAgICAqIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtleXNcbiAgICAgICAgICogLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLS0tLVxuICAgICAgICAgKiBgQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuQk9USGAgICAgICAgfCDirIXvuI8g4p6h77iPIOKshu+4jyDirIfvuI9cbiAgICAgICAgICogYEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUxgIHwg4qyF77iPIOKeoe+4j1xuICAgICAgICAgKiBgQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuVkVSVElDQUxgICAgfCDirIbvuI8g4qyH77iPXG4gICAgICAgICAqXG4gICAgICAgICAqIF9Ob3RlOiBmb2N1cyBsb29wcyB3aGVuIGFycm93aW5nIHBhc3Qgb25lIG9mIHRoZSBib3VuZGFyaWVzOyB0YWJiaW5nIG1vdmVzIHRoZSB1c2VyIGF3YXkgZnJvbSB0aGUgbGlzdC5fXG4gICAgICAgICovXG4gICAgICAgIG1vZGU6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgICAgICAgICBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RILFxuICAgICAgICAgICAgQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuSE9SSVpPTlRBTCxcbiAgICAgICAgICAgIEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLlZFUlRJQ0FMLFxuICAgICAgICBdKSxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBjb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICBkZWZhdWx0QWN0aXZlQ2hpbGRJbmRleDogMCxcbiAgICAgICAgbW9kZTogQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuQk9USCxcbiAgICAgICAgb25LZXlEb3duOiAoKSA9PiB7fSxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoQXJyb3dLZXlOYXZpZ2F0aW9uLmRlZmF1bHRQcm9wcylcblxuICAgIHN0YXRlID0ge1xuICAgICAgICBhY3RpdmVDaGlsZEluZGV4OiB0aGlzLnByb3BzLmRlZmF1bHRBY3RpdmVDaGlsZEluZGV4LFxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4ICE9PSBwcmV2U3RhdGUuYWN0aXZlQ2hpbGRJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5zZXRGb2N1cyh0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlQ2hpbGRJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgbnVtQ2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW4gPyBDaGlsZHJlbi5jb3VudChuZXh0UHJvcHMuY2hpbGRyZW4pIDogMDtcblxuICAgICAgICAgICAgaWYgKG51bUNoaWxkcmVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7YWN0aXZlQ2hpbGRJbmRleDogMH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXggPj0gbnVtQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4OiBudW1DaGlsZHJlbiAtIDF9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEZvY3VzKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHRoaXMuJHdyYXBwZXIuY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmhhc0F0dHJpYnV0ZShEQVRBX0FUVFJJQlVURV9TS0lQKSkge1xuICAgICAgICAgICAgdGhpcy5tb3ZlRm9jdXMoXG4gICAgICAgICAgICAgICAgY2hpbGROb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcgPyAtMSA6IDFcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGROb2RlICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGNoaWxkTm9kZSkge1xuICAgICAgICAgICAgY2hpbGROb2RlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtb3ZlRm9jdXMoZGVsdGEpIHtcbiAgICAgICAgY29uc3QgbnVtQ2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuID8gQ2hpbGRyZW4uY291bnQodGhpcy5wcm9wcy5jaGlsZHJlbikgOiAwO1xuICAgICAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4ICsgZGVsdGE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA+PSBudW1DaGlsZHJlbikge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gMDsgLy8gbG9vcFxuICAgICAgICB9IGVsc2UgaWYgKG5leHRJbmRleCA8IDApIHtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IG51bUNoaWxkcmVuIC0gMTsgLy8gcmV2ZXJzZSBsb29wXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4OiBuZXh0SW5kZXh9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMubW9kZSA9PT0gQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuVkVSVElDQUxcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZUZvY3VzKC0xKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUxcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZUZvY3VzKC0xKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLlZFUlRJQ0FMXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5wcm9wcy5tb2RlID09PSBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVGb2N1cygxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5tb2RlID09PSBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5IT1JJWk9OVEFMXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5wcm9wcy5tb2RlID09PSBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVGb2N1cygxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbktleURvd24pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUZvY3VzID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQuaGFzQXR0cmlidXRlKERBVEFfQVRUUklCVVRFX0lOREVYKSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKERBVEFfQVRUUklCVVRFX0lOREVYKSwgMTApO1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBDaGlsZHJlbi50b0FycmF5KHRoaXMucHJvcHMuY2hpbGRyZW4pW2luZGV4XTtcblxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7YWN0aXZlQ2hpbGRJbmRleDogaW5kZXh9KTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BzLm9uRm9jdXMpIHtcbiAgICAgICAgICAgICAgICBjaGlsZC5wcm9wcy5vbkZvY3VzKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gQ2hpbGRyZW4ubWFwKHRoaXMucHJvcHMuY2hpbGRyZW4sIChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgICAgICAgICAgICBbREFUQV9BVFRSSUJVVEVfSU5ERVhdOiBpbmRleCxcbiAgICAgICAgICAgICAgICBbREFUQV9BVFRSSUJVVEVfU0tJUF06IHBhcnNlSW50KGNoaWxkLnByb3BzLnRhYkluZGV4LCAxMCkgPT09IC0xIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBrZXk6IGNoaWxkLmtleSB8fCBpbmRleCxcbiAgICAgICAgICAgICAgICB0YWJJbmRleDogdGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4ID09PSBpbmRleCA/IDAgOiAtMSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwZXJzaXN0V3JhcHBlckVsZW1lbnRSZWZlcmVuY2UgPSAodW5rbm93blR5cGUpID0+IHtcbiAgICAgICAgdGhpcy4kd3JhcHBlciA9IHVua25vd25UeXBlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyB1bmtub3duVHlwZSA6IGZpbmRET01Ob2RlKHVua25vd25UeXBlKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dGhpcy5wcm9wcy5jb21wb25lbnRcbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBBcnJvd0tleU5hdmlnYXRpb24uaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9e3RoaXMucGVyc2lzdFdyYXBwZXJFbGVtZW50UmVmZXJlbmNlfVxuICAgICAgICAgICAgICAgIG9uRm9jdXM9e3RoaXMuaGFuZGxlRm9jdXN9XG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZUtleURvd259PlxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckNoaWxkcmVuKCl9XG4gICAgICAgICAgICA8L3RoaXMucHJvcHMuY29tcG9uZW50PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1hcnJvdy1rZXktbmF2aWdhdGlvbi9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= |