From 810c48fe2b21611ba4d8305c9473a79f77176345 Mon Sep 17 00:00:00 2001 From: Michele Memoli Date: Thu, 15 Oct 2015 19:20:04 +0100 Subject: [PATCH] fix(message): removed pic.twitter urls Removed anchors to pic.twitter from cards --- dist/react-climb-social.js | 35 ++++++++++++++++++---------------- dist/react-climb-social.min.js | 10 +++++----- src/components/Message.jsx | 6 +++++- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/dist/react-climb-social.js b/dist/react-climb-social.js index 0e82b8d..140b2a8 100644 --- a/dist/react-climb-social.js +++ b/dist/react-climb-social.js @@ -7802,21 +7802,21 @@ return /******/ (function(modules) { // webpackBootstrap /* 11 */ /***/ function(module, exports, __webpack_require__) { - "use strict"; + 'use strict'; - Object.defineProperty(exports, "__esModule", { + Object.defineProperty(exports, '__esModule', { value: true }); - var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - 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) : subClass.__proto__ = superClass; } + 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) : subClass.__proto__ = superClass; } var _react = __webpack_require__(1); @@ -7828,26 +7828,29 @@ return /******/ (function(modules) { // webpackBootstrap function Message() { _classCallCheck(this, Message); - _get(Object.getPrototypeOf(Message.prototype), "constructor", this).apply(this, arguments); + _get(Object.getPrototypeOf(Message.prototype), 'constructor', this).apply(this, arguments); } _createClass(Message, [{ - key: "render", + key: 'render', value: function render() { - return _react2["default"].createElement("div", { className: "climb__tile__message", - dangerouslySetInnerHTML: { __html: this.props.body } }); + + var message = this.props.body.replace(/=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var u=Object.assign||function(t){for(var e=1;e1)for(var n=1;nr;r++)n[r]=t[r];return n}function a(t){return function(){try{return t.apply(this,arguments)}catch(e){return Dt.e=e,Dt}}}function l(t){throw t}function p(t,e){if(Nt&&e.stack&&"object"==typeof t&&null!==t&&t.stack&&-1===t.stack.indexOf(Mt)){for(var n=[],r=e;r;r=r.source)r.stack&&n.unshift(r.stack);n.unshift(t.stack);var i=n.join("\n"+Mt+"\n");t.stack=h(i)}}function h(t){for(var e=t.split("\n"),n=[],r=0,i=e.length;i>r;r++){var o=e[r];f(o)||d(o)||!o||n.push(o)}return n.join("\n")}function f(t){var e=b(t);if(!e)return!1;var n=e[0],r=e[1];return n===Pt&&r>=At&&ci>=r}function d(t){return-1!==t.indexOf("(module.js:")||-1!==t.indexOf("(node.js:")}function v(){if(Nt)try{throw new Error}catch(t){var e=t.stack.split("\n"),n=e[0].indexOf("@")>0?e[1]:e[2],r=b(n);if(!r)return;return Pt=r[0],r[1]}}function b(t){var e=/at .+ \((.+):(\d+):(?:\d+)\)$/.exec(t);if(e)return[e[1],Number(e[2])];var n=/at ([^ ]+):(\d+):(?:\d+)$/.exec(t);if(n)return[n[1],Number(n[2])];var r=/.*@(.+):(\d+)$/.exec(t);return r?[r[1],Number(r[2])]:void 0}function y(t){var e=[];if(!de(t))return e;fe.nonEnumArgs&&t.length&&ve(t)&&(t=ye.call(t));var n=fe.enumPrototypes&&"function"==typeof t,r=fe.enumErrorProps&&(t===ue||t instanceof Error);for(var i in t)n&&"prototype"==i||r&&("message"==i||"name"==i)||e.push(i);if(fe.nonEnumShadows&&t!==ce){var o=t.constructor,s=-1,u=Ht;if(t===(o&&o.prototype))var c=t===ae?re:t===ue?Jt:ie.call(t),a=he[c];for(;++s-1:void 0});return n.pop(),r.pop(),f}function C(t,e){for(var n=new Array(t),r=0;t>r;r++)n[r]=e();return n}function x(t,e){this.id=t,this.value=e}function S(t){this._s=t,this.isDisposed=!1}function E(t){this._s=t}function O(t){this._s=t,this._l=t.length,this._i=0}function D(t){this._a=t}function j(t){this._a=t,this._l=A(t),this._i=0}function N(t){return"number"==typeof t&&yt.isFinite(t)}function k(t){var e,n=t[It];if(!n&&"string"==typeof t)return e=new E(t),e[It]();if(!n&&t.length!==s)return e=new D(t),e[It]();if(!n)throw new TypeError("Object is not iterable");return t[It]()}function P(t){var e=+t;return 0===e?e:isNaN(e)?e:0>e?-1:1}function A(t){var e=+t.length;return isNaN(e)?0:0!==e&&N(e)?(e=P(e)*Math.floor(Math.abs(e)),0>=e?0:e>Dn?Dn:e):e}function M(t,e){this.observer=t,this.parent=e}function T(t,e){var n=t.length;return function(r,i){n>r?(e.onNext(t[r]),i(r+1)):e.onCompleted()}}function L(t,e){return Le(t)||(t=Ue),new Nn(e,t)}function R(t,e){this.observer=t,this.parent=e}function V(t,e){this.observer=t,this.parent=e}function F(){return!1}function I(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return e}function F(){return!1}function I(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return e}function F(){return!1}function U(){return[]}function F(){return!1}function U(){return[]}function I(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return e}function z(t){return function(e){return t.subscribe(e)}}function W(t,e){return function(n){for(var r=n,i=0;e>i;i++){var o=r[t[i]];if("undefined"==typeof o)return s;r=o}return r}}function B(t,e,n,r){var i=new ii;return r.push(Z(i,e,n)),t.apply(e,r),i.asObservable()}function Z(t,e,n){return function(){for(var r=arguments.length,i=new Array(r),o=0;r>o;o++)i[o]=arguments[o];if(Ot(n)){if(i=jt(n).apply(e,i),i===Dt)return t.onError(i.e);t.onNext(i)}else i.length<=1?t.onNext(i[0]):t.onNext(i);t.onCompleted()}}function K(t,e,n,r){var i=new ii;return r.push(H(i,e,n)),t.apply(e,r),i.asObservable()}function H(t,e,n){return function(){var r=arguments[0];if(r)return t.onError(r);for(var i=arguments.length,o=[],s=1;i>s;s++)o[s-1]=arguments[s];if(Ot(n)){var o=jt(n).apply(e,o);if(o===Dt)return t.onError(o.e);t.onNext(o)}else o.length<=1?t.onNext(o[0]):t.onNext(o);t.onCompleted()}}function Q(t){return yt.StaticNodeList?t instanceof yt.StaticNodeList||t instanceof yt.NodeList:"[object NodeList]"===Object.prototype.toString.call(t)}function $(t,e,n){this._e=t,this._n=e,this._fn=n,this._e.addEventListener(this._n,this._fn,!1),this.isDisposed=!1}function Y(t,e,n){var r=new ge,i=Object.prototype.toString.call(t);if(Q(t)||"[object HTMLCollection]"===i)for(var o=0,s=t.length;s>o;o++)r.add(Y(t.item(o),e,n));else t&&r.add(new $(t,e,n));return r}function G(t,e){return new zr(t,e)}function J(t,e,n){return new ti(function(r){var i=t,o=Te(e);return n.scheduleRecursiveFuture(0,i,function(t,e){if(o>0){var s=n.now();i=new Date(i.getTime()+o),i.getTime()<=s&&(i=new Date(s+o))}r.onNext(t),e(t+1,new Date(i))})})}function X(t,e,n){return t===e?new ti(function(t){return n.schedulePeriodic(0,e,function(e){return t.onNext(e),e+1})}):wn(function(){return J(new Date(n.now()+t),e,n)})}function tt(t,e,n){return new ti(function(r){var i,o=!1,s=new Ne,u=null,c=[],a=!1;return i=t.materialize().timestamp(n).subscribe(function(t){var i,l;"E"===t.value.kind?(c=[],c.push(t),u=t.value.error,l=!a):(c.push({value:t.value,timestamp:t.timestamp+e}),l=!o,o=!0),l&&(null!==u?r.onError(u):(i=new je,s.setDisposable(i),i.setDisposable(n.scheduleRecursiveFuture(null,e,function(t,e){var i,s,l,p;if(null===u){a=!0;do l=null,c.length>0&&c[0].timestamp-n.now()<=0&&(l=c.shift().value),null!==l&&l.accept(r);while(null!==l);p=!1,s=0,c.length>0?(p=!0,s=Math.max(0,c[0].timestamp-n.now())):o=!1,i=u,a=!1,null!==i?r.onError(i):p&&e(null,s)}}))))}),new ke(i,s)},t)}function et(t,e,n){return wn(function(){return tt(t,e-n.now(),n)})}function nt(t,e,n){var r,i;return Ot(e)?i=e:(r=e,i=n),new ti(function(e){function n(){c.setDisposable(t.subscribe(function(t){var n=jt(i)(t);if(n===Dt)return e.onError(n.e);var r=new je;s.add(r),r.setDisposable(n.subscribe(function(){e.onNext(t),s.remove(r),o()},function(t){e.onError(t)},function(){e.onNext(t),s.remove(r),o()}))},function(t){e.onError(t)},function(){u=!0,c.dispose(),o()}))}function o(){u&&0===s.length&&e.onCompleted()}var s=new ge,u=!1,c=new Ne;return r?c.setDisposable(r.subscribe(n,function(t){e.onError(t)},n)):n(),new ke(c,s)},this)}function rt(t,e){return new ti(function(n){var r,i=!1,o=new Ne,s=0,u=t.subscribe(function(t){var u=jt(e)(t);if(u===Dt)return n.onError(u.e);Et(u)&&(u=Vr(u)),i=!0,r=t,s++;var c=s,a=new je;o.setDisposable(a),a.setDisposable(u.subscribe(function(){i&&s===c&&n.onNext(r),i=!1,a.dispose()},function(t){n.onError(t)},function(){i&&s===c&&n.onNext(r),i=!1,a.dispose()}))},function(t){o.dispose(),n.onError(t),i=!1,s++},function(){o.dispose(),i&&n.onNext(r),n.onCompleted(),i=!1,s++});return new ke(u,o)},t)}function it(t,e){return new ti(function(n){function r(){s&&(s=!1,n.onNext(i)),o&&n.onCompleted()}var i,o=!1,s=!1,u=new je;return u.setDisposable(t.subscribe(function(t){s=!0,i=t},function(t){n.onError(t)},function(){o=!0,u.dispose()})),new ke(u,e.subscribe(r,function(t){n.onError(t)},r))},t)}function ot(t,e,n,r){return Ot(e)&&(r=n,n=e,e=Mn()),r||(r=In(new Qr)),new ti(function(i){function o(t){function e(){return p=n===l}var n=l,o=new je;c.setDisposable(o),o.setDisposable(t.subscribe(function(){e()&&u.setDisposable(r.subscribe(i)),o.dispose()},function(t){e()&&i.onError(t)},function(){e()&&u.setDisposable(r.subscribe(i))}))}function s(){var t=!p;return t&&l++,t}var u=new Ne,c=new Ne,a=new je;u.setDisposable(a);var l=0,p=!1;return o(e),a.setDisposable(t.subscribe(function(t){if(s()){i.onNext(t);var e=jt(n)(t);if(e===Dt)return i.onError(e.e);o(Et(e)?Vr(e):e)}},function(t){s()&&i.onError(t)},function(){s()&&i.onCompleted()})),new ke(u,c)},t)}function st(t,e,n,r){return Le(n)&&(r=n,n=In(new Qr)),n instanceof Error&&(n=In(n)),Le(r)||(r=Ke),new ti(function(i){function o(){var t=s;l.setDisposable(r.scheduleFuture(null,e,function(){a=s===t,a&&(Et(n)&&(n=Vr(n)),c.setDisposable(n.subscribe(i)))}))}var s=0,u=new je,c=new Ne,a=!1,l=new Ne;return c.setDisposable(u),o(),u.setDisposable(t.subscribe(function(t){a||(s++,i.onNext(t),o())},function(t){a||(s++,i.onError(t))},function(){a||(s++,i.onCompleted())})),new ke(c,l)},t)}function ut(t,e,n){return new ti(function(r){function i(t,e){if(a[e]=t,s[e]=!0,u||(u=s.every(gt))){if(o)return r.onError(o);var i=jt(n).apply(null,a);if(i===Dt)return r.onError(i.e);r.onNext(i)}c&&a[1]&&r.onCompleted()}var o,s=[!1,!1],u=!1,c=!1,a=new Array(2);return new ke(t.subscribe(function(t){i(t,0)},function(t){a[1]?r.onError(t):o=t},function(){c=!0,a[1]&&r.onCompleted()}),e.subscribe(function(t){i(t,1)},function(t){r.onError(t)},function(){c=!0,i(!0,1)}))},t)}function ct(t){return{"@@transducer/init":function(){return t},"@@transducer/step":function(t,e){return t.onNext(e)},"@@transducer/result":function(t){return t.onCompleted()}}}var at={"function":!0,object:!0},lt=at[typeof e]&&e&&!e.nodeType?e:null,pt=at[typeof t]&&t&&!t.nodeType?t:null,ht=u(lt&&pt&&"object"==typeof i&&i),ft=u(at[typeof self]&&self),dt=u(at[typeof window]&&window),vt=pt&&pt.exports===lt?lt:null,bt=u(at[typeof this]&&this),yt=ht||dt!==(bt&&bt.window)&&dt||ft||bt||Function("return this")(),mt={internals:{},config:{Promise:yt.Promise},helpers:{}},_t=mt.helpers.noop=function(){},gt=mt.helpers.identity=function(t){return t},wt=mt.helpers.defaultNow=Date.now,Ct=mt.helpers.defaultComparer=function(t,e){return be(t,e)},xt=mt.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0},St=(mt.helpers.defaultKeySerializer=function(t){return t.toString()},mt.helpers.defaultError=function(t){throw t}),Et=mt.helpers.isPromise=function(t){return!!t&&"function"!=typeof t.subscribe&&"function"==typeof t.then},Ot=mt.helpers.isFunction=function(){var t=function(t){return"function"==typeof t||!1};return t(/x/)&&(t=function(t){return"function"==typeof t&&"[object Function]"==ie.call(t)}),t}(),Dt={e:{}},jt=mt.internals.tryCatch=function(t){if(!Ot(t))throw new TypeError("fn must be a function");return a(t)};mt.config.longStackSupport=!1;var Nt=!1,kt=jt(function(){throw new Error})();Nt=!!kt.e&&!!kt.e.stack;var Pt,At=v(),Mt="From previous event:",Tt=mt.EmptyError=function(){this.message="Sequence contains no elements.",Error.call(this)};Tt.prototype=Object.create(Error.prototype),Tt.prototype.name="EmptyError";var Lt=mt.ObjectDisposedError=function(){this.message="Object has been disposed",Error.call(this)};Lt.prototype=Object.create(Error.prototype),Lt.prototype.name="ObjectDisposedError";var qt=mt.ArgumentOutOfRangeError=function(){this.message="Argument out of range",Error.call(this)};qt.prototype=Object.create(Error.prototype),qt.prototype.name="ArgumentOutOfRangeError";var Rt=mt.NotSupportedError=function(t){this.message=t||"This operation is not supported",Error.call(this)};Rt.prototype=Object.create(Error.prototype),Rt.prototype.name="NotSupportedError";var Vt=mt.NotImplementedError=function(t){this.message=t||"This operation is not implemented",Error.call(this)};Vt.prototype=Object.create(Error.prototype),Vt.prototype.name="NotImplementedError";var Ft=mt.helpers.notImplemented=function(){throw new Vt},It=(mt.helpers.notSupported=function(){throw new Rt},"function"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_");yt.Set&&"function"==typeof(new yt.Set)["@@iterator"]&&(It="@@iterator");var Ut=mt.doneEnumerator={done:!0,value:s},zt=mt.helpers.isIterable=function(t){return t&&t[It]!==s},Wt=mt.helpers.isArrayLike=function(t){return t&&t.length!==s};mt.helpers.iterator=It;var Bt,Zt=mt.internals.bindCallback=function(t,e,n){if("undefined"==typeof e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}},Kt=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],Ht=Kt.length,Qt="[object Arguments]",$t="[object Array]",Yt="[object Boolean]",Gt="[object Date]",Jt="[object Error]",Xt="[object Function]",te="[object Number]",ee="[object Object]",ne="[object RegExp]",re="[object String]",ie=Object.prototype.toString,oe=Object.prototype.hasOwnProperty,se=ie.call(arguments)==Qt,ue=Error.prototype,ce=Object.prototype,ae=String.prototype,le=ce.propertyIsEnumerable;try{Bt=!(ie.call(document)==ee&&!({toString:0}+""))}catch(pe){Bt=!0}var he={};he[$t]=he[Gt]=he[te]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},he[Yt]=he[re]={constructor:!0,toString:!0,valueOf:!0},he[Jt]=he[Xt]=he[ne]={constructor:!0,toString:!0},he[ee]={constructor:!0};var fe={};!function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);fe.enumErrorProps=le.call(ue,"message")||le.call(ue,"name"),fe.enumPrototypes=le.call(t,"prototype"),fe.nonEnumArgs=0!=n,fe.nonEnumShadows=!/valueOf/.test(e)}(1);var de=mt.internals.isObject=function(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1},ve=function(t){return t&&"object"==typeof t?ie.call(t)==Qt:!1};se||(ve=function(t){return t&&"object"==typeof t?oe.call(t,"callee"):!1});var be=mt.internals.isEqual=function(t,e){return w(t,e,[],[])},ye=({}.hasOwnProperty,Array.prototype.slice),me=mt.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},_e=mt.internals.addProperties=function(t){ -for(var e=[],n=1,r=arguments.length;r>n;n++)e.push(arguments[n]);for(var i=0,o=e.length;o>i;i++){var s=e[i];for(var u in s)t[u]=s[u]}},ge=(mt.internals.addRef=function(t,e){return new ti(function(n){return new ke(e.getDisposable(),t.subscribe(n))})},mt.CompositeDisposable=function(){var t,e,n=[];if(Array.isArray(arguments[0]))n=arguments[0],e=n.length;else for(e=arguments.length,n=new Array(e),t=0;e>t;t++)n[t]=arguments[t];this.disposables=n,this.isDisposed=!1,this.length=n.length}),we=ge.prototype;we.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},we.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},we.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;for(var t=this.disposables.length,e=new Array(t),n=0;t>n;n++)e[n]=this.disposables[n];for(this.disposables=[],this.length=0,n=0;t>n;n++)e[n].dispose()}};var Ce=mt.Disposable=function(t){this.isDisposed=!1,this.action=t||_t};Ce.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var xe=Ce.create=function(t){return new Ce(t)},Se=Ce.empty={dispose:_t},Ee=Ce.isDisposable=function(t){return t&&Ot(t.dispose)},Oe=Ce.checkDisposed=function(t){if(t.isDisposed)throw new Lt},De=Ce._fixup=function(t){return Ee(t)?t:Se},je=mt.SingleAssignmentDisposable=function(){this.isDisposed=!1,this.current=null};je.prototype.getDisposable=function(){return this.current},je.prototype.setDisposable=function(t){if(this.current)throw new Error("Disposable has already been assigned");var e=this.isDisposed;!e&&(this.current=t),e&&t&&t.dispose()},je.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.current;this.current=null,t&&t.dispose()}};var Ne=mt.SerialDisposable=function(){this.isDisposed=!1,this.current=null};Ne.prototype.getDisposable=function(){return this.current},Ne.prototype.setDisposable=function(t){var e=this.isDisposed;if(!e){var n=this.current;this.current=t}n&&n.dispose(),e&&t&&t.dispose()},Ne.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.current;this.current=null}t&&t.dispose()};var ke=mt.BinaryDisposable=function(t,e){this._first=t,this._second=e,this.isDisposed=!1};ke.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this._first;this._first=null,t&&t.dispose();var e=this._second;this._second=null,e&&e.dispose()}};var Pe=mt.NAryDisposable=function(t){this._disposables=t,this.isDisposed=!1};Pe.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;for(var t=0,e=this._disposables.length;e>t;t++)this._disposables[t].dispose();this._disposables.length=0}};var Ae=(mt.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?Se:new t(this)},e}(),mt.internals.ScheduledItem=function(t,e,n,r,i){this.scheduler=t,this.state=e,this.action=n,this.dueTime=r,this.comparer=i||xt,this.disposable=new je});Ae.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},Ae.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},Ae.prototype.isCancelled=function(){return this.disposable.isDisposed},Ae.prototype.invokeCore=function(){return De(this.action(this.scheduler,this.state))};var Me=mt.Scheduler=function(){function t(){}t.isScheduler=function(e){return e instanceof t};var e=t.prototype;return e.schedule=function(t,e){throw new Vt},e.scheduleFuture=function(e,n,r){var i=n;return i instanceof Date&&(i-=this.now()),i=t.normalize(i),0===i?this.schedule(e,r):this._scheduleFuture(e,i,r)},e._scheduleFuture=function(t,e,n){throw new Vt},t.now=wt,t.prototype.now=wt,t.normalize=function(t){return 0>t&&(t=0),t},t}(),Te=Me.normalize,Le=Me.isScheduler;!function(t){function e(t,e){function n(e){function r(t,e){return s?o.remove(c):u=!0,i(e,n),Se}var s=!1,u=!1,c=t.schedule(e,r);u||(o.add(c),s=!0)}var r=e[0],i=e[1],o=new ge;return i(r,n),o}function n(t,e){function n(e,r){function s(t,e){return u?o.remove(a):c=!0,i(e,n),Se}var u=!1,c=!1,a=t.scheduleFuture(e,r,s);c||(o.add(a),u=!0)}var r=e[0],i=e[1],o=new ge;return i(r,n),o}t.scheduleRecursive=function(t,n){return this.schedule([t,n],e)},t.scheduleRecursiveFuture=function(t,e,r){return this.scheduleFuture([t,r],e,n)}}(Me.prototype),function(t){Me.prototype.schedulePeriodic=function(t,e,n){if("undefined"==typeof yt.setInterval)throw new Rt;e=Te(e);var r=t,i=yt.setInterval(function(){r=n(r)},e);return xe(function(){yt.clearInterval(i)})}}(Me.prototype);var qe,Re,Ve=function(t){function e(){t.call(this)}return me(e,t),e.prototype.schedule=function(t,e){return De(e(this,t))},e}(Me),Fe=Me.immediate=new Ve,Ie=function(t){function e(){for(;r.length>0;){var t=r.dequeue();!t.isCancelled()&&t.invoke()}}function n(){t.call(this)}var r;return me(n,t),n.prototype.schedule=function(t,n){var i=new Ae(this,t,n,this.now());if(r)r.enqueue(i);else{r=new He(4),r.enqueue(i);var o=jt(e)();r=null,o===Dt&&l(o.e)}return i.disposable},n.prototype.scheduleRequired=function(){return!r},n}(Me),Ue=Me.currentThread=new Ie,ze=(mt.internals.SchedulePeriodicRecursive=function(){function t(t){return function(e,n){n(0,t._period);var r=jt(t._action)(t._state);r===Dt&&(t._cancel.dispose(),l(r.e)),t._state=r}}function e(t,e,n,r){this._scheduler=t,this._state=e,this._period=n,this._action=r}return e.prototype.start=function(){var e=new je;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveFuture(0,this._period,t(this))),e},e}(),function(){var t,e=_t;if(yt.setTimeout)t=yt.setTimeout,e=yt.clearTimeout;else{if(!yt.WScript)throw new Rt;t=function(t,e){yt.WScript.Sleep(e),t()}}return{setTimeout:t,clearTimeout:e}}()),We=ze.setTimeout,Be=ze.clearTimeout;!function(){function t(e){if(i)We(function(){t(e)},0);else{var n=r[e];if(n){i=!0;var o=jt(n)();Re(e),i=!1,o===Dt&&l(o.e)}}}function e(){if(!yt.postMessage||yt.importScripts)return!1;var t=!1,e=yt.onmessage;return yt.onmessage=function(){t=!0},yt.postMessage("","*"),yt.onmessage=e,t}var n=1,r={},i=!1;Re=function(t){delete r[t]};var s=new RegExp("^"+String(ie).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),u="function"==typeof(u=ht&&vt&&ht.setImmediate)&&!s.test(u)&&u;if(Ot(u))qe=function(e){var i=n++;return r[i]=e,u(function(){t(i)}),i};else if("undefined"!=typeof o&&"[object process]"==={}.toString.call(o))qe=function(e){var i=n++;return r[i]=e,o.nextTick(function(){t(i)}),i};else if(e()){var c="ms.rx.schedule"+Math.random(),a=function(e){"string"==typeof e.data&&e.data.substring(0,c.length)===c&&t(e.data.substring(c.length))};yt.addEventListener("message",a,!1),qe=function(t){var e=n++;return r[e]=t,yt.postMessage(c+currentId,"*"),e}}else if(yt.MessageChannel){var p=new yt.MessageChannel;p.port1.onmessage=function(e){t(e.data)},qe=function(t){var e=n++;return r[e]=t,p.port2.postMessage(e),e}}else qe="document"in yt&&"onreadystatechange"in yt.document.createElement("script")?function(e){var i=yt.document.createElement("script"),o=n++;return r[o]=e,i.onreadystatechange=function(){t(o),i.onreadystatechange=null,i.parentNode.removeChild(i),i=null},yt.document.documentElement.appendChild(i),o}:function(e){var i=n++;return r[i]=e,We(function(){t(i)},0),i}}();var Ze=function(t){function e(){t.call(this)}function n(t,e,n,r){return function(){!t.isDisposed&&t.setDisposable(Ce._fixup(e(n,r)))}}function r(t,e){this._id=e,this._method=t,this.isDisposed=!1}return me(e,t),r.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._method.call(null,this._id))},e.prototype.schedule=function(t,e){var i=new je,o=qe(n(i,e,this,t));return new ke(i,new r(Re,o))},e.prototype._scheduleFuture=function(t,e,i){if(0===e)return this.schedule(t,i);var o=new je,s=We(n(o,i,this,t),e);return new ke(o,new r(Be,s))},e}(Me),Ke=Me["default"]=Me.async=new Ze;x.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var He=mt.internals.PriorityQueue=function(t){this.items=new Array(t),this.length=0},Qe=He.prototype;Qe.isHigherPriority=function(t,e){return this.items[t].compareTo(this.items[e])<0},Qe.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},Qe.heapify=function(t){if(+t||(t=0),!(t>=this.length||0>t)){var e=2*t+1,n=2*t+2,r=t;if(e0&&(t=!this.isAcquired,this.isAcquired=!0),t&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(this,function(t,e){var n;if(!(t.queue.length>0))return void(t.isAcquired=!1);n=t.queue.shift();var r=jt(n)();return r===Dt?(t.queue=[],t.hasFaulted=!0,l(r.e)):void e(t)}))},e.prototype.dispose=function(){t.prototype.dispose.call(this),this.disposable.dispose()},e}(sn),ln=mt.ObservableBase=function(t){function e(t){return t&&Ot(t.dispose)?t:Ot(t)?xe(t):Se}function n(t,n){var r=n[0],i=n[1],o=jt(i.subscribeCore).call(i,r);o!==Dt||r.fail(Dt.e)||l(Dt.e),r.setDisposable(e(o))}function r(){t.call(this)}return me(r,t),r.prototype._subscribe=function(t){var e=new ei(t),r=[e,this];return Ue.scheduleRequired()?Ue.schedule(r,n):n(null,r),e},r.prototype.subscribeCore=Ft,r}(cn),pn=mt.FlatMapObservable=function(t){function e(e,n,r,i){this.resultSelector=Ot(r)?r:null,this.selector=Zt(Ot(n)?n:function(){return n},i,3),this.source=e,t.call(this)}function n(t,e,n,r){this.i=0,this.selector=e,this.resultSelector=n,this.source=r,this.o=t,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.selector,this.resultSelector,this))},me(n,sn),n.prototype._wrapResult=function(t,e,n){return this.resultSelector?t.map(function(t,r){return this.resultSelector(e,t,n,r)},this):t},n.prototype.next=function(t){var e=this.i++,n=jt(this.selector)(t,e,this.source);return n===Dt?this.o.onError(n.e):(Et(n)&&(n=Vr(n)),(Wt(n)||zt(n))&&(n=cn.from(n)),void this.o.onNext(this._wrapResult(n,t,e)))},n.prototype.error=function(t){this.o.onError(t)},n.prototype.onCompleted=function(){this.o.onCompleted()},e}(ln),hn=mt.internals.Enumerable=function(){};S.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._s.isDisposed=!0)};var fn=function(t){function e(e){this.sources=e,t.call(this)}function n(t,e,n){this._o=t,this._s=e,this._e=n,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e={isDisposed:!1},r=new Ne,i=Ue.scheduleRecursive(this.sources[It](),function(i,o){if(!e.isDisposed){var s=jt(i.next).call(i);if(s===Dt)return t.onError(s.e);if(s.done)return t.onCompleted();var u=s.value;Et(u)&&(u=Vr(u));var c=new je;r.setDisposable(c),c.setDisposable(u.subscribe(new n(t,o,i)))}});return new Pe([r,i,new S(e)])},me(n,sn),n.prototype.onNext=function(t){this._o.onNext(t)},n.prototype.onError=function(t){this._o.onError(t)},n.prototype.onCompleted=function(){this._s(this._e)},e}(ln);hn.prototype.concat=function(){return new fn(this)};var dn=function(t){function e(e){this.sources=e,t.call(this)}function n(t,e){this._o=t,this._recurse=e,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=this.sources[It](),r={isDisposed:!1},i=new Ne,o=Ue.scheduleRecursive(null,function(o,s){if(!r.isDisposed){var u=jt(e.next).call(e);if(u===Dt)return t.onError(u.e);if(u.done)return null!==o?t.onError(o):t.onCompleted();var c=u.value;Et(c)&&(c=Vr(c));var a=new je;i.setDisposable(a),a.setDisposable(c.subscribe(new n(t,s)))}});return new Pe([i,o,new S(r)])},me(n,sn),n.prototype.next=function(t){this._o.onNext(t)},n.prototype.error=function(t){this._recurse(t)},n.prototype.completed=function(){this._o.onCompleted()},e}(ln);hn.prototype.catchError=function(){return new dn(this)},hn.prototype.catchErrorWhen=function(t){var e=this;return new ti(function(n){var r,i=new ri,o=new ri,s=t(i),u=s.subscribe(o),c=e[It](),a={isDisposed:!1},l=new Ne,p=Ue.scheduleRecursive(null,function(t,e){if(!a.isDisposed){var s=jt(c.next).call(c);if(s===Dt)return n.onError(s.e);if(s.done)return void(r?n.onError(r):n.onCompleted());var u=s.value;Et(u)&&(u=Vr(u));var p=new je,h=new je;l.setDisposable(new ke(h,p)),p.setDisposable(u.subscribe(function(t){n.onNext(t)},function(t){h.setDisposable(o.subscribe(e,function(t){n.onError(t)},function(){n.onCompleted()})),i.onNext(t)},function(){n.onCompleted()}))}});return new Pe([u,l,p,new S(a)])})};var vn=function(t){function e(t,e){this.v=t,this.c=null==e?-1:e}function n(t){this.v=t.v,this.l=t.c}return me(e,t),e.prototype[It]=function(){return new n(this)},n.prototype.next=function(){return 0===this.l?Ut:(this.l>0&&this.l--,{done:!1,value:this.v})},e}(hn),bn=hn.repeat=function(t,e){return new vn(t,e)},yn=function(t){function e(t,e,n){this.s=t,this.fn=e?Zt(e,n,3):null}function n(t){this.i=-1,this.s=t.s,this.l=this.s.length,this.fn=t.fn}return me(e,t),e.prototype[It]=function(){return new n(this)},n.prototype.next=function(){return++this.in;n++)e[n]=arguments[n];return new Nn(e,Ue)},cn.ofWithScheduler=function(t){for(var e=arguments.length,n=new Array(e-1),r=1;e>r;r++)n[r-1]=arguments[r];return new Nn(n,t)};var Tn=function(t){function e(e,n){this.obj=e,this.keys=Object.keys(e),this.scheduler=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new R(t,this);return e.run()},e}(ln);R.prototype.run=function(){function t(t,o){if(i>t){var s=r[t];e.onNext([s,n[s]]),o(t+1)}else e.onCompleted()}var e=this.observer,n=this.parent.obj,r=this.parent.keys,i=r.length;return this.parent.scheduler.scheduleRecursive(0,t)},cn.pairs=function(t,e){return e||(e=Ue),new Tn(t,e)};var Ln=function(t){function e(e,n,r){this.start=e,this.rangeCount=n,this.scheduler=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new qn(t,this);return e.run()},e}(ln),qn=function(){function t(t,e){this.observer=t,this.parent=e}function e(t,e,n){return function(r,i){e>r?(n.onNext(t+r),i(r+1)):n.onCompleted()}}return t.prototype.run=function(){return this.parent.scheduler.scheduleRecursive(0,e(this.parent.start,this.parent.rangeCount,this.observer))},t}();cn.range=function(t,e,n){return Le(n)||(n=Ue),new Ln(t,e,n)};var Rn=function(t){function e(e,n,r){this.value=e,this.repeatCount=null==n?-1:n,this.scheduler=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new V(t,this);return e.run()},e}(ln);V.prototype.run=function(){function t(t,r){return(-1===t||t>0)&&(e.onNext(n),t>0&&t--),0===t?e.onCompleted():void r(t)}var e=this.observer,n=this.parent.value;return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount,t)},cn.repeat=function(t,e,n){return Le(n)||(n=Ue),new Rn(t,e,n)};var Vn=function(t){function e(e,n){this.value=e,this.scheduler=n,t.call(this)}function n(t,e,n){this.observer=t,this.value=e,this.scheduler=n}function r(t,e){var n=e[0],r=e[1];return r.onNext(n),r.onCompleted(),Se}return me(e,t),e.prototype.subscribeCore=function(t){var e=new n(t,this.value,this.scheduler);return e.run()},n.prototype.run=function(){var t=[this.value,this.observer];return this.scheduler===Fe?r(null,t):this.scheduler.schedule(t,r)},e}(ln),Fn=(cn["return"]=cn.just=function(t,e){return Le(e)||(e=Fe),new Vn(t,e)},function(t){function e(e,n){this.error=e,this.scheduler=n,t.call(this)}function n(t,e){this.o=t,this.p=e}function r(t,e){var n=e[0],r=e[1];r.onError(n)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new n(t,this);return e.run()},n.prototype.run=function(){return this.p.scheduler.schedule([this.p.error,this.o],r)},e}(ln)),In=cn["throw"]=function(t,e){return Le(e)||(e=Fe),new Fn(t,e)},Un=function(t){function e(e,n){this.source=e,this._fn=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new je,n=new Ne;return n.setDisposable(e),e.setDisposable(this.source.subscribe(new zn(t,n,this._fn))),n},e}(ln),zn=function(t){function e(e,n,r){this._o=e,this._s=n,this._fn=r,t.call(this)}return me(e,t),e.prototype.next=function(t){this._o.onNext(t)},e.prototype.completed=function(){return this._o.onCompleted()},e.prototype.error=function(t){var e=jt(this._fn)(t);if(e===Dt)return this._o.onError(e.e);Et(e)&&(e=Vr(e));var n=new je;this._s.setDisposable(n),n.setDisposable(e.subscribe(this._o))},e}(sn);$e["catch"]=function(t){return Ot(t)?new Un(this,t):Wn([this,t])};var Wn=cn["catch"]=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{var e=arguments.length;t=new Array(e);for(var n=0;e>n;n++)t[n]=arguments[n]}return mn(t).catchError()};$e.combineLatest=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return Array.isArray(e[0])?e[0].unshift(this):e.unshift(this),Kn.apply(this,e)};var Bn=function(t){function e(e,n){this._params=e,this._cb=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){for(var e=this._params.length,n=new Array(e),r={hasValue:C(e,F),hasValueAll:!1,isDone:C(e,F),values:new Array(e)},i=0;e>i;i++){var o=this._params[i],s=new je;n[i]=s,Et(o)&&(o=Vr(o)),s.setDisposable(o.subscribe(new Zn(t,i,this._cb,r)))}return new Pe(n)},e}(ln),Zn=function(t){function e(e,n,r,i){this._o=e,this._i=n,this._cb=r,this._state=i,t.call(this)}function n(t){return function(e,n){return n!==t}}return me(e,t),e.prototype.next=function(t){if(this._state.values[this._i]=t,this._state.hasValue[this._i]=!0,this._state.hasValueAll||(this._state.hasValueAll=this._state.hasValue.every(gt))){var e=jt(this._cb).apply(null,this._state.values);if(e===Dt)return this._o.onError(e.e);this._o.onNext(e)}else this._state.isDone.filter(n(this._i)).every(gt)&&this._o.onCompleted()},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._state.isDone[this._i]=!0,this._state.isDone.every(gt)&&this._o.onCompleted()},e}(sn),Kn=cn.combineLatest=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=Ot(e[t-1])?e.pop():I;return Array.isArray(e[0])&&(e=e[0]),new Bn(e,r)};$e.concat=function(){for(var t=[],e=0,n=arguments.length;n>e;e++)t.push(arguments[e]);return t.unshift(this),Qn.apply(null,t)};var Hn=function(t){function e(e){this.sources=e,t.call(this)}function n(t,e){this.sources=t,this.o=e}return me(e,t),e.prototype.subscribeCore=function(t){var e=new n(this.sources,t);return e.run()},n.prototype.run=function(){var t,e=new Ne,n=this.sources,r=n.length,i=this.o,o=Fe.scheduleRecursive(0,function(o,s){if(!t){if(o===r)return i.onCompleted();var u=n[o];Et(u)&&(u=Vr(u));var c=new je;e.setDisposable(c),c.setDisposable(u.subscribe(function(t){i.onNext(t)},function(t){i.onError(t)},function(){s(o+1)}))}});return new ge(e,o,xe(function(){t=!0}))},e}(ln),Qn=cn.concat=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{t=new Array(arguments.length);for(var e=0,n=arguments.length;n>e;e++)t[e]=arguments[e]}return new Hn(t)};$e.concatAll=function(){return this.merge(1)};var $n=function(t){function e(e,n){this.source=e,this.maxConcurrent=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new ge;return e.add(this.source.subscribe(new Yn(t,this.maxConcurrent,e))),e},e}(ln),Yn=function(){function t(t,e,n){this.o=t,this.max=e,this.g=n,this.done=!1,this.q=[],this.activeCount=0,this.isStopped=!1}function e(t,e){this.parent=t,this.sad=e,this.isStopped=!1}return t.prototype.handleSubscribe=function(t){var n=new je;this.g.add(n),Et(t)&&(t=Vr(t)),n.setDisposable(t.subscribe(new e(this,n)))},t.prototype.onNext=function(t){this.isStopped||(this.activeCount0?t.handleSubscribe(t.q.shift()):(t.activeCount--,t.done&&0===t.activeCount&&t.o.onCompleted())}},e.prototype.dispose=function(){this.isStopped=!0},e.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},t}();$e.merge=function(t){return"number"!=typeof t?Gn(this,t):new $n(this,t)};var Gn=cn.merge=function(){var t,e,n=[],r=arguments.length;if(arguments[0])if(Le(arguments[0]))for(t=arguments[0],e=1;r>e;e++)n.push(arguments[e]);else for(t=Fe,e=0;r>e;e++)n.push(arguments[e]);else for(t=Fe,e=1;r>e;e++)n.push(arguments[e]);return Array.isArray(n[0])&&(n=n[0]),L(t,n).mergeAll()},Jn=mt.CompositeError=function(t){this.innerErrors=t,this.message="This contains multiple errors. Check the innerErrors",Error.call(this)};Jn.prototype=Object.create(Error.prototype),Jn.prototype.name="CompositeError";var Xn=function(t){function e(e){this.source=e,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new ge,n=new je,r={isStopped:!1,errors:[],o:t};return e.add(n),n.setDisposable(this.source.subscribe(new tr(e,r))),e},e}(ln),tr=function(t){function e(e,n){this._group=e,this._state=n,t.call(this)}function n(t,e){0===e.length?t.onCompleted():1===e.length?t.onError(e[0]):t.onError(new Jn(e))}function r(e,n,r){this._inner=e,this._group=n,this._state=r,t.call(this)}return me(e,t),e.prototype.next=function(t){var e=new je;this._group.add(e),Et(t)&&(t=Vr(t)),e.setDisposable(t.subscribe(new r(e,this._group,this._state)))},e.prototype.error=function(t){this._state.errors.push(t),this._state.isStopped=!0,1===this._group.length&&n(this._state.o,this._state.errors)},e.prototype.completed=function(){this._state.isStopped=!0,1===this._group.length&&n(this._state.o,this._state.errors)},me(r,t),r.prototype.next=function(t){this._state.o.onNext(t)},r.prototype.error=function(t){this._state.errors.push(t),this._group.remove(this._inner),this._state.isStopped&&1===this._group.length&&n(this._state.o,this._state.errors)},r.prototype.completed=function(){this._group.remove(this._inner),this._state.isStopped&&1===this._group.length&&n(this._state.o,this._state.errors)},e}(sn);cn.mergeDelayError=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{var e=arguments.length;t=new Array(e);for(var n=0;e>n;n++)t[n]=arguments[n]}var r=L(null,t);return new Xn(r)};var er=function(t){function e(e){this.source=e,t.call(this)}function n(t,e){this.o=t,this.g=e,this.isStopped=!1,this.done=!1}function r(t,e){this.parent=t,this.sad=e,this.isStopped=!1}return me(e,t),e.prototype.subscribeCore=function(t){var e=new ge,r=new je;return e.add(r),r.setDisposable(this.source.subscribe(new n(t,e))),e},n.prototype.onNext=function(t){if(!this.isStopped){var e=new je;this.g.add(e),Et(t)&&(t=Vr(t)),e.setDisposable(t.subscribe(new r(this,e)))}},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.done=!0,1===this.g.length&&this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},r.prototype.onNext=function(t){this.isStopped||this.parent.o.onNext(t)},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.parent.o.onError(t))},r.prototype.onCompleted=function(){if(!this.isStopped){var t=this.parent;this.isStopped=!0,t.g.remove(this.sad),t.done&&1===t.g.length&&t.o.onCompleted()}},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},e}(ln);$e.mergeAll=function(){return new er(this)};var nr=function(t){function e(e,n){this._s=e,this._o=Et(n)?Vr(n):n,this._open=!1,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){ -var e=new je;e.setDisposable(this._s.subscribe(new rr(t,this))),Et(this._o)&&(this._o=Vr(this._o));var n=new je;return n.setDisposable(this._o.subscribe(new ir(t,this,n))),new ke(e,n)},e}(ln),rr=function(t){function e(e,n){this._o=e,this._p=n,t.call(this)}return me(e,t),e.prototype.next=function(t){this._p._open&&this._o.onNext(t)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.onCompleted=function(){this._p._open&&this._o.onCompleted()},e}(sn),ir=function(t){function e(e,n,r){this._o=e,this._p=n,this._r=r,t.call(this)}return me(e,t),e.prototype.next=function(){this._p._open=!0,this._r.dispose()},e.prototype.error=function(t){this._o.onError(t)},e.prototype.onCompleted=function(){this._r.dispose()},e}(sn);$e.skipUntil=function(t){return new nr(this,t)};var or=function(t){function e(e){this.source=e,t.call(this)}function n(t,e){this.o=t,this.inner=e,this.stopped=!1,this.latest=0,this.hasLatest=!1,sn.call(this)}function r(t,e){this.parent=t,this.id=e,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new Ne,r=this.source.subscribe(new n(t,e));return new ke(r,e)},me(n,sn),n.prototype.next=function(t){var e=new je,n=++this.latest;this.hasLatest=!0,this.inner.setDisposable(e),Et(t)&&(t=Vr(t)),e.setDisposable(t.subscribe(new r(this,n)))},n.prototype.error=function(t){this.o.onError(t)},n.prototype.completed=function(){this.stopped=!0,!this.hasLatest&&this.o.onCompleted()},me(r,sn),r.prototype.next=function(t){this.parent.latest===this.id&&this.parent.o.onNext(t)},r.prototype.error=function(t){this.parent.latest===this.id&&this.parent.o.onError(t)},r.prototype.completed=function(){this.parent.latest===this.id&&(this.parent.hasLatest=!1,this.parent.isStopped&&this.parent.o.onCompleted())},e}(ln);$e["switch"]=$e.switchLatest=function(){return new or(this)};var sr=function(t){function e(e,n){this.source=e,this.other=Et(n)?Vr(n):n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return new ke(this.source.subscribe(t),this.other.subscribe(new ur(t)))},e}(ln),ur=function(t){function e(e){this._o=e,t.call(this)}return me(e,t),e.prototype.next=function(){this._o.onCompleted()},e.prototype.error=function(t){this._o.onError(t)},e.prototype.onCompleted=_t,e}(sn);$e.takeUntil=function(t){return new sr(this,t)};var cr=function(t){function e(e,n,r){this._s=e,this._ss=n,this._cb=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){for(var e=this._ss.length,n={hasValue:C(e,F),hasValueAll:!1,values:new Array(e)},r=this._ss.length,i=new Array(r+1),o=0;r>o;o++){var s=this._ss[o],u=new je;Et(s)&&(s=Vr(s)),u.setDisposable(s.subscribe(new ar(t,o,n))),i[o]=u}var u=new je;return u.setDisposable(this._s.subscribe(new lr(t,this._cb,n))),i[r]=u,new Pe(i)},e}(ln),ar=function(t){function e(e,n,r){this._o=e,this._i=n,this._state=r,t.call(this)}return me(e,t),e.prototype.next=function(t){this._state.values[this._i]=t,this._state.hasValue[this._i]=!0,this._state.hasValueAll=this._state.hasValue.every(gt)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=_t,e}(sn),lr=function(t){function e(e,n,r){this._o=e,this._cb=n,this._state=r,t.call(this)}return me(e,t),e.prototype.next=function(t){var e=[t].concat(this._state.values);if(this._state.hasValueAll){var n=jt(this._cb).apply(null,e);return n===Dt?this._o.onError(n.e):void this._o.onNext(n)}},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.withLatestFrom=function(){if(0===arguments.length)throw new Error("invalid arguments");for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=Ot(e[t-1])?e.pop():I;return Array.isArray(e[0])&&(e=e[0]),new cr(this,e,r)};var pr=function(t){function e(e,n){this._s=e,this._cb=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=this._s.length,n=new Array(e);done=C(e,F),q=C(e,U);for(var r=0;e>r;r++){var i=this._s[r],o=new je;n[r]=o,Et(i)&&(i=Vr(i)),o.setDisposable(i.subscribe(new hr(t,r,this,q,done)))}return new Pe(n)},e}(ln),hr=function(t){function e(e,n,r,i,o){this._o=e,this._i=n,this._p=r,this._q=i,this._d=o,t.call(this)}function n(t){return t.length>0}function r(t){return t.shift()}function i(t){return function(e,n){return n!==t}}return me(e,t),e.prototype.next=function(t){if(this._q[this._i].push(t),this._q.every(n)){var e=this._q.map(r),o=jt(this._p._cb).apply(null,e);if(o===Dt)return this._o.onError(o.e);this._o.onNext(o)}else this._d.filter(i(this._i)).every(gt)&&this._o.onCompleted()},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._d[this._i]=!0,this._d.every(gt)&&this._o.onCompleted()},e}(sn);$e.zip=function(){if(0===arguments.length)throw new Error("invalid arguments");for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=Ot(e[t-1])?e.pop():I;Array.isArray(e[0])&&(e=e[0]);var i=this;return e.unshift(i),new pr(e,r)},cn.zip=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];Array.isArray(e[0])&&(e=Ot(e[1])?e[0].concat(e[1]):e[0]);var r=e.shift();return r.zip.apply(r,e)},$e.zipIterable=function(){if(0===arguments.length)throw new Error("invalid arguments");for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=Ot(e[t-1])?e.pop():I,i=this;return e.unshift(i),new ti(function(t){for(var n=e.length,o=C(n,U),s=C(n,F),u=new Array(n),c=0;n>c;c++)!function(n){var c=e[n],a=new je;(Wt(c)||zt(c))&&(c=jn(c)),a.setDisposable(c.subscribe(function(e){if(o[n].push(e),o.every(function(t){return t.length>0})){var u=o.map(function(t){return t.shift()}),c=jt(r).apply(i,u);if(c===Dt)return t.onError(c.e);t.onNext(c)}else s.filter(function(t,e){return e!==n}).every(gt)&&t.onCompleted()},function(e){t.onError(e)},function(){s[n]=!0,s.every(gt)&&t.onCompleted()})),u[n]=a}(c);return new ge(u)},i)},$e.asObservable=function(){return new ti(z(this),this)};var fr=function(t){function e(e){this.source=e,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new dr(t))},e}(ln),dr=function(t){function e(e){this._o=e,t.call(this)}return me(e,t),e.prototype.next=function(t){t.accept(this._o)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.dematerialize=function(){return new fr(this)};var vr=function(t){function e(e,n,r){this.source=e,this.keyFn=n,this.comparer=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new br(t,this.keyFn,this.comparer))},e}(ln),br=function(t){function e(e,n,r){this.o=e,this.keyFn=n,this.comparer=r,this.hasCurrentKey=!1,this.currentKey=null,t.call(this)}return me(e,t),e.prototype.next=function(t){var e,n=t;return Ot(this.keyFn)&&(n=jt(this.keyFn)(t),n===Dt)?this.o.onError(n.e):this.hasCurrentKey&&(e=jt(this.comparer)(this.currentKey,n),e===Dt)?this.o.onError(e.e):void(this.hasCurrentKey&&e||(this.hasCurrentKey=!0,this.currentKey=n,this.o.onNext(t)))},e.prototype.error=function(t){this.o.onError(t)},e.prototype.completed=function(){this.o.onCompleted()},e}(sn);$e.distinctUntilChanged=function(t,e){return e||(e=Ct),new vr(this,t,e)};var yr=function(t){function e(e,n,r,i){this.source=e,this._oN=n,this._oE=r,this._oC=i,t.call(this)}function n(t,e){this.o=t,this.t=!e._oN||Ot(e._oN)?on(e._oN||_t,e._oE||_t,e._oC||_t):e._oN,this.isStopped=!1,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this))},me(n,sn),n.prototype.next=function(t){var e=jt(this.t.onNext).call(this.t,t);e===Dt&&this.o.onError(e.e),this.o.onNext(t)},n.prototype.error=function(t){var e=jt(this.t.onError).call(this.t,t);return e===Dt?this.o.onError(e.e):void this.o.onError(t)},n.prototype.completed=function(){var t=jt(this.t.onCompleted).call(this.t);return t===Dt?this.o.onError(t.e):void this.o.onCompleted()},e}(ln);$e["do"]=$e.tap=$e.doAction=function(t,e,n){return new yr(this,t,e,n)},$e.doOnNext=$e.tapOnNext=function(t,e){return this.tap("undefined"!=typeof e?function(n){t.call(e,n)}:t)},$e.doOnError=$e.tapOnError=function(t,e){return this.tap(_t,"undefined"!=typeof e?function(n){t.call(e,n)}:t)},$e.doOnCompleted=$e.tapOnCompleted=function(t,e){return this.tap(_t,null,"undefined"!=typeof e?function(){t.call(e)}:t)},$e["finally"]=function(t){var e=this;return new ti(function(n){var r=jt(e.subscribe).call(e,n);return r===Dt?(t(),l(r.e)):xe(function(){var e=jt(r.dispose).call(r);t(),e===Dt&&l(e.e)})},this)};var mr=function(t){function e(e){this.source=e,t.call(this)}function n(t){this.o=t,this.isStopped=!1}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t))},n.prototype.onNext=_t,n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.observer.onError(t),!0)},e}(ln);$e.ignoreElements=function(){return new mr(this)};var _r=function(t){function e(e,n){this.source=e,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new gr(t))},e}(ln),gr=function(t){function e(e){this._o=e,t.call(this)}return me(e,t),e.prototype.next=function(t){this._o.onNext(tn(t))},e.prototype.error=function(t){this._o.onNext(en(t)),this._o.onCompleted()},e.prototype.completed=function(){this._o.onNext(nn()),this._o.onCompleted()},e}(sn);$e.materialize=function(){return new _r(this)},$e.repeat=function(t){return bn(this,t).concat()},$e.retry=function(t){return bn(this,t).catchError()},$e.retryWhen=function(t){return bn(this).catchErrorWhen(t)};var wr=function(t){function e(e,n,r,i){this.source=e,this.accumulator=n,this.hasSeed=r,this.seed=i,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new Cr(t,this))},e}(ln),Cr=function(t){function e(e,n){this._o=e,this._p=n,this._fn=n.accumulator,this._hs=n.hasSeed,this._s=n.seed,this._ha=!1,this._a=null,this._hv=!1,this._i=0,t.call(this)}return me(e,t),e.prototype.next=function(t){return!this._hv&&(this._hv=!0),this._ha?this._a=jt(this._fn)(this._a,t,this._i,this._p):(this._a=this._hs?jt(this._fn)(this._s,t,this._i,this._p):t,this._ha=!0),this._a===Dt?this._o.onError(this._a.e):(this._o.onNext(this._a),void this._i++)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){!this._hv&&this._hs&&this._o.onNext(this._s),this._o.onCompleted()},e}(sn);$e.scan=function(){var t,e=!1,n=arguments[0];return 2===arguments.length&&(e=!0,t=arguments[1]),new wr(this,n,e,t)};var xr=function(t){function e(e,n){this.source=e,this._c=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new Sr(t,this._c))},e}(ln),Sr=function(t){function e(e,n){this._o=e,this._c=n,this._q=[],t.call(this)}return me(e,t),e.prototype.next=function(t){this._q.push(t),this._q.length>this._c&&this._o.onNext(this._q.shift())},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.skipLast=function(t){if(0>t)throw new qt;return new xr(this,t)},$e.startWith=function(){var t,e=0;arguments.length&&Le(arguments[0])?(t=arguments[0],e=1):t=Fe;for(var n=[],r=e,i=arguments.length;i>r;r++)n.push(arguments[r]);return mn([kn(n,t),this]).concat()};var Er=function(t){function e(e,n){this._o=e,this._c=n,this._q=[],t.call(this)}return me(e,t),e.prototype.next=function(t){this._q.push(t),this._q.length>this._c&&this._q.shift()},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){for(;this._q.length>0;)this._o.onNext(this._q.shift());this._o.onCompleted()},e}(sn);$e.takeLast=function(t){if(0>t)throw new qt;var e=this;return new ti(function(n){return e.subscribe(new Er(n,t))},e)},$e.flatMapConcat=$e.concatMap=function(t,e,n){return new pn(this,t,e,n).merge(1)};var Or=function(t){function e(e,n,r){this.source=e,this.selector=Zt(n,r,3),t.call(this)}function n(t,e){return function(n,r,i){return t.call(this,e.selector(n,r,i),r,i)}}function r(t,e,n){this.o=t,this.selector=e,this.source=n,this.i=0,sn.call(this)}return me(e,t),e.prototype.internalMap=function(t,r){return new e(this.source,n(t,this),r)},e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.selector,this))},me(r,sn),r.prototype.next=function(t){var e=jt(this.selector)(t,this.i++,this.source);return e===Dt?this.o.onError(e.e):void this.o.onNext(e)},r.prototype.error=function(t){this.o.onError(t)},r.prototype.completed=function(){this.o.onCompleted()},e}(ln);$e.map=$e.select=function(t,e){var n="function"==typeof t?t:function(){return t};return this instanceof Or?this.internalMap(n,e):new Or(this,n,e)},$e.pluck=function(){var t=arguments.length,e=new Array(t);if(0===t)throw new Error("List of properties cannot be empty.");for(var n=0;t>n;n++)e[n]=arguments[n];return this.map(W(e,t))},$e.flatMap=$e.selectMany=function(t,e,n){return new pn(this,t,e,n).mergeAll()},mt.Observable.prototype.flatMapLatest=function(t,e,n){return new pn(this,t,e,n).switchLatest()};var Dr=function(t){function e(e,n){this.source=e,this.skipCount=n,t.call(this)}function n(t,e){this.c=e,this.r=e,this.o=t,this.isStopped=!1}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.skipCount))},n.prototype.onNext=function(t){this.isStopped||(this.r<=0?this.o.onNext(t):this.r--)},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ln);$e.skip=function(t){if(0>t)throw new qt;return new Dr(this,t)};var jr=function(t){function e(e,n){this.source=e,this._fn=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new Nr(t,this))},e}(ln),Nr=function(t){function e(e,n){this._o=e,this._p=n,this._i=0,this._r=!1,t.call(this)}return me(e,t),e.prototype.next=function(t){if(!this._r){var e=jt(this._p._fn)(t,this._i++,this._p);if(e===Dt)return this._o.onError(e.e);this._r=!e}this._r&&this._o.onNext(t)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.skipWhile=function(t,e){var n=Zt(t,e,3);return new jr(this,n)};var kr=function(t){function e(e,n){this.source=e,this.takeCount=n,t.call(this)}function n(t,e){this.o=t,this.c=e,this.r=e,this.isStopped=!1}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.takeCount))},n.prototype={onNext:function(t){this.isStopped||this.r-->0&&(this.o.onNext(t),this.r<=0&&this.o.onCompleted())},onError:function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},onCompleted:function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},dispose:function(){this.isStopped=!0},fail:function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)}},e}(ln);$e.take=function(t,e){if(0>t)throw new qt;return 0===t?Sn(e):new kr(this,t)};var Pr=function(t){function e(e,n){this.source=e,this._fn=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new Ar(t,this))},e}(ln),Ar=function(t){function e(e,n){this._o=e,this._p=n,this._i=0,this._r=!0,t.call(this)}return me(e,t),e.prototype.next=function(t){return this._r&&(this._r=jt(this._p._fn)(t,this._i++,this._p),this._r===Dt)?this._o.onError(this._r.e):void(this._r?this._o.onNext(t):this._o.onCompleted())},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.takeWhile=function(t,e){var n=Zt(t,e,3);return new Pr(this,n)};var Mr=function(t){function e(e,n,r){this.source=e,this.predicate=Zt(n,r,3),t.call(this)}function n(t,e){return function(n,r,i){return e.predicate(n,r,i)&&t.call(this,n,r,i)}}function r(t,e,n){this.o=t,this.predicate=e,this.source=n,this.i=0,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.predicate,this))},e.prototype.internalFilter=function(t,r){return new e(this.source,n(t,this),r)},me(r,sn),r.prototype.next=function(t){var e=jt(this.predicate)(t,this.i++,this.source);return e===Dt?this.o.onError(e.e):void(e&&this.o.onNext(t))},r.prototype.error=function(t){this.o.onError(t)},r.prototype.completed=function(){this.o.onCompleted()},e}(ln);$e.filter=$e.where=function(t,e){return this instanceof Mr?this.internalFilter(t,e):new Mr(this,t,e)},cn.fromCallback=function(t,e,n){return function(){"undefined"==typeof e&&(e=this);for(var r=arguments.length,i=new Array(r),o=0;r>o;o++)i[o]=arguments[o];return B(t,e,n,i)}},cn.fromNodeCallback=function(t,e,n){return function(){"undefined"==typeof e&&(e=this);for(var r=arguments.length,i=new Array(r),o=0;r>o;o++)i[o]=arguments[o];return K(t,e,n,i)}},$.prototype.dispose=function(){this.isDisposed||(this._e.removeEventListener(this._n,this._fn,!1),this.isDisposed=!0)},mt.config.useNativeEvents=!1;var Tr=function(t){function e(e,n,r){this._el=e,this._n=n,this._fn=r,t.call(this)}function n(t,e){return function(){var n=arguments[0];return Ot(e)&&(n=jt(e).apply(null,arguments),n===Dt)?t.onError(n.e):void t.onNext(n)}}return me(e,t),e.prototype.subscribeCore=function(t){return Y(this._el,this._n,n(t,this._fn))},e}(ln);cn.fromEvent=function(t,e,n){return t.addListener?qr(function(n){t.addListener(e,n)},function(n){t.removeListener(e,n)},n):mt.config.useNativeEvents||"function"!=typeof t.on||"function"!=typeof t.off?new Tr(t,e,n).publish().refCount():qr(function(n){t.on(e,n)},function(n){t.off(e,n)},n)};var Lr=function(t){function e(e,n,r){this._add=e,this._del=n,this._fn=r,t.call(this)}function n(t,e){return function(){var n=arguments[0];return Ot(e)&&(n=jt(e).apply(null,arguments),n===Dt)?t.onError(n.e):void t.onNext(n)}}function r(t,e,n){this._del=t,this._fn=e,this._ret=n,this.isDisposed=!1}return me(e,t),e.prototype.subscribeCore=function(t){var e=n(t,this._fn),i=this._add(e);return new r(this._del,e,i)},r.prototype.dispose=function(){this.isDisposed||Ot(this._del)&&this._del(this._fn,this._ret)},e}(ln),qr=cn.fromEventPattern=function(t,e,n){return new Lr(t,e,n).publish().refCount()},Rr=function(t){function e(e,n){this._p=e,this._s=n,t.call(this)}function n(t,e){var n=e[0],r=e[1];n.onNext(r),n.onCompleted()}function r(t,e){var n=e[0],r=e[1];n.onError(r)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new je,i=this;return this._p.then(function(r){e.setDisposable(i._s.schedule([t,r],n))},function(n){e.setDisposable(i._s.schedule([t,n],r))}),e},e}(ln),Vr=cn.fromPromise=function(t,e){return e||(e=Ke),new Rr(t,e)};$e.toPromise=function(t){if(t||(t=mt.config.Promise),!t)throw new Rt("Promise type not provided nor in Rx.config.Promise");var e=this;return new t(function(t,n){var r;e.subscribe(function(t){r=t},n,function(){t(r)})})},cn.startAsync=function(t){var e=jt(t)();return e===Dt?In(e.e):Vr(e)};var Fr=function(t){function e(e,n,r){this.source=e,this._fn1=n,this._fn2=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=this.source.multicast(this._fn1());return new ke(this._fn2(e).subscribe(t),e.connect())},e}(ln);$e.multicast=function(t,e){return Ot(t)?new Fr(this,t,e):new Ur(this,t)},$e.publish=function(t){return t&&Ot(t)?this.multicast(function(){return new ri},t):this.multicast(new ri)},$e.share=function(){return this.publish().refCount()},$e.publishLast=function(t){return t&&Ot(t)?this.multicast(function(){return new ii},t):this.multicast(new ii)},$e.publishValue=function(t,e){return 2===arguments.length?this.multicast(function(){return new si(e)},t):this.multicast(new si(t))},$e.shareValue=function(t){return this.publishValue(t).refCount()},$e.replay=function(t,e,n,r){return t&&Ot(t)?this.multicast(function(){return new ui(e,n,r)},t):this.multicast(new ui(e,n,r))},$e.shareReplay=function(t,e,n){return this.replay(null,t,e,n).refCount()};var Ir=function(t){function e(e){this.source=e,this._count=0,this._connectableSubscription=null,t.call(this)}function n(t,e){this._p=t,this._s=e,this.isDisposed=!1}return me(e,t),e.prototype.subscribeCore=function(t){var e=1===++this._count,r=this.source.subscribe(t);return e&&(this._connectableSubscription=this.source.connect()),new n(this,r)},n.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._s.dispose(),0===--this._p._count&&this._p._connectableSubscription.dispose())},e}(ln),Ur=mt.ConnectableObservable=function(t){function e(e,n){this.source=e,this._hasSubscription=!1,this._subscription=null,this._sourceObservable=e.asObservable(),this._subject=n,t.call(this)}function n(t){this._p=t,this.isDisposed=!1}return me(e,t),n.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._p._hasSubscription=!1)},e.prototype.connect=function(){return this._hasSubscription||(this._hasSubscription=!0,this._subscription=new ke(this._sourceObservable.subscribe(this._subject),new n(this))),this._subscription},e.prototype._subscribe=function(t){return this._subject.subscribe(t)},e.prototype.refCount=function(){return new Ir(this)},e}(cn),zr=function(t){function e(e,n){this._dt=e,this._s=n,t.call(this)}function n(t,e){e.onNext(0),e.onCompleted()}return me(e,t),e.prototype.subscribeCore=function(t){return this._s.scheduleFuture(t,this._dt,n)},e}(ln),Wr=cn.interval=function(t,e){return X(t,t,Le(e)?e:Ke)};cn.timer=function(t,e,n){var r;return Le(n)||(n=Ke),null!=e&&"number"==typeof e?r=e:Le(e)&&(n=e),(t instanceof Date||"number"==typeof t)&&r===s?G(t,n):t instanceof Date&&r!==s?J(t.getTime(),e,n):X(t,r,n)};$e.delay=function(){var t=arguments[0];if("number"==typeof t||t instanceof Date){var e=t,n=arguments[1];return Le(n)||(n=Ke),e instanceof Date?et(this,e,n):tt(this,e,n)}if(cn.isObservable(t)||Ot(t))return nt(this,t,arguments[1]);throw new Error("Invalid arguments")};var Br=function(t){function e(e,n,r){Le(r)||(r=Ke),this.source=e,this._dt=n,this._s=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new Ne;return new ke(this.source.subscribe(new Zr(t,this.source,this._dt,this._s,e)),e)},e}(ln),Zr=function(t){function e(e,n,r,i,o){this._o=e,this._s=n,this._d=r,this._scheduler=i,this._c=o,this._v=null,this._hv=!1,this._id=0,t.call(this)}return me(e,t),e.prototype.next=function(t){this._hv=!0,this._v=t;var e=++this._id,n=new je;this._c.setDisposable(n),n.setDisposable(this._scheduler.scheduleFuture(this,this._d,function(n,r){r._hv&&r._id===e&&r._o.onNext(t),r._hv=!1}))},e.prototype.error=function(t){this._c.dispose(),this._o.onError(t),this._hv=!1,this._id++},e.prototype.completed=function(){this._c.dispose(),this._hv&&this._o.onNext(this._v),this._o.onCompleted(),this._hv=!1,this._id++},e}(sn);$e.debounce=function(){if(Ot(arguments[0]))return rt(this,arguments[0]);if("number"==typeof arguments[0])return new Br(this,arguments[0],arguments[1]);throw new Error("Invalid arguments")};var Kr=function(t){function e(e,n){this.source=e,this._s=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new Hr(t,this._s))},e}(ln),Hr=function(t){function e(e,n){this._o=e,this._s=n,t.call(this)}return me(e,t),e.prototype.next=function(t){this._o.onNext({value:t,timestamp:this._s.now()})},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.timestamp=function(t){return Le(t)||(t=Ke),new Kr(this,t)},$e.sample=$e.throttleLatest=function(t,e){return Le(e)||(e=Ke),"number"==typeof t?it(this,Wr(t,e)):it(this,t)};var Qr=mt.TimeoutError=function(t){this.message=t||"Timeout has occurred",this.name="TimeoutError",Error.call(this)};Qr.prototype=Object.create(Error.prototype),$e.timeout=function(){var t=arguments[0];if(t instanceof Date||"number"==typeof t)return st(this,t,arguments[1],arguments[2]);if(cn.isObservable(t)||Ot(t))return ot(this,t,arguments[1],arguments[2]);throw new Error("Invalid arguments")},$e.throttle=function(t,e){Le(e)||(e=Ke);var n=+t||0;if(0>=n)throw new RangeError("windowDuration cannot be less or equal zero.");var r=this;return new ti(function(t){var i=0;return r.subscribe(function(r){var o=e.now();(0===i||o-i>=n)&&(i=o,t.onNext(r))},function(e){t.onError(e)},function(){t.onCompleted()})},r)};var $r=function(t){function e(e,n){this.source=e,this.controller=new ri,n&&n.subscribe?this.pauser=this.controller.merge(n):this.pauser=this.controller,t.call(this)}return me(e,t),e.prototype._subscribe=function(t){var e=this.source.publish(),n=e.subscribe(t),r=Se,i=this.pauser.distinctUntilChanged().subscribe(function(t){t?r=e.connect():(r.dispose(),r=Se)});return new Pe([n,r,i])},e.prototype.pause=function(){this.controller.onNext(!1)},e.prototype.resume=function(){this.controller.onNext(!0)},e}(cn);$e.pausable=function(t){return new $r(this,t)};var Yr=function(t){function e(e,n){this.source=e,this.controller=new ri,n&&n.subscribe?this.pauser=this.controller.merge(n):this.pauser=this.controller,t.call(this)}return me(e,t),e.prototype._subscribe=function(t){function e(){for(;r.length>0;)t.onNext(r.shift())}var n,r=[],i=ut(this.source,this.pauser.startWith(!1).distinctUntilChanged(),function(t,e){return{data:t,shouldFire:e}}).subscribe(function(i){n!==s&&i.shouldFire!==n?(n=i.shouldFire,i.shouldFire&&e()):(n=i.shouldFire,i.shouldFire?t.onNext(i.data):r.push(i.data))},function(n){e(),t.onError(n)},function(){e(),t.onCompleted()});return i},e.prototype.pause=function(){this.controller.onNext(!1)},e.prototype.resume=function(){this.controller.onNext(!0)},e}(cn);$e.pausableBuffered=function(t){return new Yr(this,t)};var Gr=function(t){function e(e,n,r){t.call(this),this.subject=new Jr(n,r),this.source=e.multicast(this.subject).refCount()}return me(e,t),e.prototype._subscribe=function(t){return this.source.subscribe(t)},e.prototype.request=function(t){return this.subject.request(null==t?-1:t)},e}(cn),Jr=function(t){function e(e,n){null==e&&(e=!0),t.call(this),this.subject=new ri,this.enableQueue=e,this.queue=e?[]:null,this.requestedCount=0,this.requestedDisposable=null,this.error=null,this.hasFailed=!1,this.hasCompleted=!1,this.scheduler=n||Ue}return me(e,t),_e(e.prototype,rn,{_subscribe:function(t){return this.subject.subscribe(t)},onCompleted:function(){this.hasCompleted=!0,this.enableQueue&&0!==this.queue.length?this.queue.push(Ye.createOnCompleted()):(this.subject.onCompleted(),this.disposeCurrentRequest())},onError:function(t){this.hasFailed=!0,this.error=t,this.enableQueue&&0!==this.queue.length?this.queue.push(Ye.createOnError(t)):(this.subject.onError(t),this.disposeCurrentRequest())},onNext:function(t){this.requestedCount<=0?this.enableQueue&&this.queue.push(Ye.createOnNext(t)):(0===this.requestedCount--&&this.disposeCurrentRequest(),this.subject.onNext(t))},_processRequest:function(t){if(this.enableQueue)for(;this.queue.length>0&&(t>0||"N"!==this.queue[0].kind);){var e=this.queue.shift();e.accept(this.subject),"N"===e.kind?t--:(this.disposeCurrentRequest(),this.queue=[])}return t},request:function(t){this.disposeCurrentRequest();var e=this;return this.requestedDisposable=this.scheduler.schedule(t,function(t,n){var r=e._processRequest(n),i=e.hasCompleted||e.hasFailed;return!i&&r>0?(e.requestedCount=r,xe(function(){e.requestedCount=0})):void 0}),this.requestedDisposable},disposeCurrentRequest:function(){this.requestedDisposable&&(this.requestedDisposable.dispose(),this.requestedDisposable=null)}}),e}(cn);$e.controlled=function(t,e){return t&&Le(t)&&(e=t,t=!0),null==t&&(t=!0),new Gr(this,t,e)},$e.pipe=function(t){function e(){n.resume()}var n=this.pausableBuffered();return t.addListener("drain",e),n.subscribe(function(e){!t.write(String(e))&&n.pause()},function(e){t.emit("error",e)},function(){!t._isStdio&&t.end(),t.removeListener("drain",e)}),n.resume(),t};var Xr=function(t){function e(e,n){this._o=e,this._xform=n,t.call(this)}return me(e,t),e.prototype.next=function(t){var e=jt(this._xform["@@transducer/step"]).call(this._xform,this._o,t);e===Dt&&this._o.onError(e.e)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._xform["@@transducer/result"](this._o)},e}(sn);$e.transduce=function(t){var e=this;return new ti(function(n){var r=t(ct(n));return e.subscribe(new Xr(n,r))},e)};var ti=mt.AnonymousObservable=function(t){function e(t){return t&&Ot(t.dispose)?t:Ot(t)?xe(t):Se}function n(t,n){var r=n[0],i=n[1],o=jt(i.__subscribe).call(i,r);o!==Dt||r.fail(Dt.e)||l(Dt.e),r.setDisposable(e(o))}function r(e,n){this.source=n,this.__subscribe=e,t.call(this)}return me(r,t),r.prototype._subscribe=function(t){var e=new ei(t),r=[e,this];return Ue.scheduleRequired()?Ue.schedule(r,n):n(null,r),e},r}(cn),ei=function(t){function e(e){t.call(this),this.observer=e,this.m=new je}me(e,t);var n=e.prototype;return n.next=function(t){var e=jt(this.observer.onNext).call(this.observer,t);e===Dt&&(this.dispose(),l(e.e))},n.error=function(t){var e=jt(this.observer.onError).call(this.observer,t);this.dispose(),e===Dt&&l(e.e)},n.completed=function(){var t=jt(this.observer.onCompleted).call(this.observer);this.dispose(),t===Dt&&l(t.e)},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(sn),ni=function(t,e){this._s=t,this._o=e};ni.prototype.dispose=function(){if(!this._s.isDisposed&&null!==this._o){var t=this._s.observers.indexOf(this._o);this._s.observers.splice(t,1),this._o=null}};var ri=mt.Subject=function(t){function e(){t.call(this),this.isDisposed=!1,this.isStopped=!1,this.observers=[],this.hasError=!1}return me(e,t),_e(e.prototype,rn.prototype,{_subscribe:function(t){return Oe(this),this.isStopped?this.hasError?(t.onError(this.error),Se):(t.onCompleted(),Se):(this.observers.push(t),new ni(this,t))},hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(Oe(this),!this.isStopped){this.isStopped=!0;for(var t=0,e=c(this.observers),n=e.length;n>t;t++)e[t].onCompleted();this.observers.length=0}},onError:function(t){if(Oe(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;for(var e=0,n=c(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){if(Oe(this),!this.isStopped)for(var e=0,n=c(this.observers),r=n.length;r>e;e++)n[e].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),e.create=function(t,e){return new oi(t,e)},e}(cn),ii=mt.AsyncSubject=function(t){function e(){t.call(this),this.isDisposed=!1,this.isStopped=!1,this.hasValue=!1,this.observers=[],this.hasError=!1}return me(e,t),_e(e.prototype,rn.prototype,{_subscribe:function(t){return Oe(this),this.isStopped?(this.hasError?t.onError(this.error):this.hasValue?(t.onNext(this.value),t.onCompleted()):t.onCompleted(),Se):(this.observers.push(t),new ni(this,t))},hasObservers:function(){return Oe(this),this.observers.length>0},onCompleted:function(){var t,e;if(Oe(this),!this.isStopped){this.isStopped=!0;var n=c(this.observers),e=n.length;if(this.hasValue)for(t=0;e>t;t++){var r=n[t];r.onNext(this.value),r.onCompleted()}else for(t=0;e>t;t++)n[t].onCompleted();this.observers.length=0}},onError:function(t){if(Oe(this),!this.isStopped){this.isStopped=!0,this.hasError=!0,this.error=t;for(var e=0,n=c(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){Oe(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.error=null,this.value=null}}),e}(cn),oi=mt.AnonymousSubject=function(t){function e(e,n){this.observer=e,this.observable=n,t.call(this)}return me(e,t),_e(e.prototype,rn.prototype,{_subscribe:function(t){return this.observable.subscribe(t)},onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t); -},onNext:function(t){this.observer.onNext(t)}}),e}(cn),si=mt.BehaviorSubject=function(t){function e(e){t.call(this),this.value=e,this.observers=[],this.isDisposed=!1,this.isStopped=!1,this.hasError=!1}return me(e,t),_e(e.prototype,rn.prototype,{_subscribe:function(t){return Oe(this),this.isStopped?(this.hasError?t.onError(this.error):t.onCompleted(),Se):(this.observers.push(t),t.onNext(this.value),new ni(this,t))},getValue:function(){if(Oe(this),this.hasError)throw this.error;return this.value},hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(Oe(this),!this.isStopped){this.isStopped=!0;for(var t=0,e=c(this.observers),n=e.length;n>t;t++)e[t].onCompleted();this.observers.length=0}},onError:function(t){if(Oe(this),!this.isStopped){this.isStopped=!0,this.hasError=!0,this.error=t;for(var e=0,n=c(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){if(Oe(this),!this.isStopped){this.value=t;for(var e=0,n=c(this.observers),r=n.length;r>e;e++)n[e].onNext(t)}},dispose:function(){this.isDisposed=!0,this.observers=null,this.value=null,this.error=null}}),e}(cn),ui=mt.ReplaySubject=function(t){function e(t,e){return xe(function(){e.dispose(),!t.isDisposed&&t.observers.splice(t.observers.indexOf(e),1)})}function n(e,n,i){this.bufferSize=null==e?r:e,this.windowSize=null==n?r:n,this.scheduler=i||Ue,this.q=[],this.observers=[],this.isStopped=!1,this.isDisposed=!1,this.hasError=!1,this.error=null,t.call(this)}var r=Math.pow(2,53)-1;return me(n,t),_e(n.prototype,rn.prototype,{_subscribe:function(t){Oe(this);var n=new an(this.scheduler,t),r=e(this,n);this._trim(this.scheduler.now()),this.observers.push(n);for(var i=0,o=this.q.length;o>i;i++)n.onNext(this.q[i].value);return this.hasError?n.onError(this.error):this.isStopped&&n.onCompleted(),n.ensureActive(),r},hasObservers:function(){return this.observers.length>0},_trim:function(t){for(;this.q.length>this.bufferSize;)this.q.shift();for(;this.q.length>0&&t-this.q[0].interval>this.windowSize;)this.q.shift()},onNext:function(t){if(Oe(this),!this.isStopped){var e=this.scheduler.now();this.q.push({interval:e,value:t}),this._trim(e);for(var n=0,r=c(this.observers),i=r.length;i>n;n++){var o=r[n];o.onNext(t),o.ensureActive()}}},onError:function(t){if(Oe(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;var e=this.scheduler.now();this._trim(e);for(var n=0,r=c(this.observers),i=r.length;i>n;n++){var o=r[n];o.onError(t),o.ensureActive()}this.observers.length=0}},onCompleted:function(){if(Oe(this),!this.isStopped){this.isStopped=!0;var t=this.scheduler.now();this._trim(t);for(var e=0,n=c(this.observers),r=n.length;r>e;e++){var i=n[e];i.onCompleted(),i.ensureActive()}this.observers.length=0}},dispose:function(){this.isDisposed=!0,this.observers=null}}),n}(cn);mt.Pauser=function(t){function e(){t.call(this)}return me(e,t),e.prototype.pause=function(){this.onNext(!1)},e.prototype.resume=function(){this.onNext(!0)},e}(ri),yt.Rx=mt,r=function(){return mt}.call(e,n,e,t),!(r!==s&&(t.exports=r));var ci=v()}).call(this)}).call(e,n(34)(t),function(){return this}(),n(6))},function(t,e,n){e=t.exports=n(15)(),e.push([t.id,".climb__wall{width:100%;padding:0;margin:0;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;font-size:100%}.climb__tile,.climb__wall{display:-webkit-flex;display:-ms-flexbox;display:flex}.climb__tile{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:425px;box-sizing:border-box;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;outline:1px solid transparent;margin-bottom:20px;overflow:hidden;text-align:left;border-radius:7px;background-color:#f6f6f6;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.climb__tile__content{z-index:1;padding:26px;background-color:#f6f6f6}.climb__tile--has-no-image .climb__tile__content{height:100%;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;box-sizing:border-box}.climb__tile__image{max-width:100%;position:absolute;top:0;border-top-left-radius:7px;border-top-right-radius:7px}.climb__tile__message{z-index:1;margin-bottom:24px}.climb__tile__message>a{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:260px;display:inline-block;vertical-align:bottom}.climb__tile--has-no-image .climb__tile__message{font-size:185%}.climb__tile__author{display:block;margin:-10px}.climb__tile__author img{border-radius:25px;width:34px}.climb__tile__author .climb__tile__author__username{display:inline-block;margin:0 0 0 10px;line-height:34px;vertical-align:top}.climb-social-badge{position:fixed;bottom:20px;right:20px;z-index:9;background-color:#a9cae2;width:200px;height:66px;border-radius:5px}.climb-social-badge>span{position:absolute!important;top:-9999px!important;left:-9999px!important}",""])},function(t,e){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;ei*l&&(m=0);for(var r=Math.ceil(m/i),o=0;o=m)v[o].nextState=a(i/1e3,p);else for(var _=0;r>_;_++){v[o].nextState=a(i/1e3,f);var g=[f,v[o].nextState];v[o].prevState=g[0],f=g[1]}}m-=r*i;for(var w=1+m/i,o=0;oClimb Logo BetaCreated with Sketch.'},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}}])}); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy9yZWFjdC1jbGltYi1zb2NpYWwubWluLmpzIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBjZTc3MTBkYzJmNGFlNjJiZTYyZiIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIlJlYWN0XCIsXCJjb21tb25qczJcIjpcInJlYWN0XCIsXCJjb21tb25qc1wiOlwicmVhY3RcIixcImFtZFwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvVGlsZS5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvV2FsbC5qc3giLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3ByZXNldHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vfi9wZXJmb3JtYW5jZS1ub3cvbGliL3BlcmZvcm1hbmNlLW5vdy5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvQXV0aG9yLmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9DbGltYkJhZGdlLmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9JbWFnZS5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvTWVzc2FnZS5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvV2FsbENvbnRhaW5lci5qc3giLCJ3ZWJwYWNrOi8vLy4vfi9jbGltYi1zb2NpYWwvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NsaW1iLXNvY2lhbC9+L3J4LWxpdGUvcngubGl0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc3R5bGUvbWFpbi5zY3NzIiwid2VicGFjazovLy8uL34vY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mZXRjaC1qc29ucC9idWlsZC9mZXRjaC1qc29ucC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LW1vdGlvbi9saWIvYW5pbWF0aW9uTG9vcC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LW1vdGlvbi9saWIvY29tcG9uZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LW1vdGlvbi9saWIvZGVwcmVjYXRlZFNwcmluZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL2hhc1JlYWNoZWRTdHlsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LW1vdGlvbi9saWIvbWVyZ2VEaWZmLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtbW90aW9uL2xpYi9ub1ZlbG9jaXR5LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtbW90aW9uL2xpYi9yZWFjdC1tb3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3Jlb3JkZXJLZXlzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtbW90aW9uL2xpYi9zcHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3N0ZXBwZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3N0cmlwU3R5bGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3VwZGF0ZVRyZWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3plcm8uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vfi9yYWYvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9zdHlsZS1sb2FkZXIvYWRkU3R5bGVzLmpzIiwid2VicGFjazovLy8uL3NyYy9zdHlsZS9tYWluLnNjc3M/M2FkYiIsIndlYnBhY2s6Ly8vLi9zcmMvaW1nL2NsaW1iX2xvZ28uc3ZnIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanMiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwicmVxdWlyZSIsImRlZmluZSIsImFtZCIsInRoaXMiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzFfXyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaWQiLCJsb2FkZWQiLCJjYWxsIiwibSIsImMiLCJwIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsIl9yZWFjdCIsIl9yZWFjdDIiLCJfY29tcG9uZW50c1dhbGxDb250YWluZXIiLCJfY29tcG9uZW50c1dhbGxDb250YWluZXIyIiwid2luZG93IiwiQ2xpbWIiLCIkdGFyZ2V0cyIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsImkiLCJsZW5ndGgiLCIkaXRlbSIsImNvbGxlY3Rpb25JZCIsImRhdGFzZXQiLCJsaW1pdCIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJXYWxsQ29udGFpbmVyIiwiX2NvbXBvbmVudHNXYWxsIiwiZW51bWVyYWJsZSIsImdldCIsIldhbGwiLCJfY29tcG9uZW50c1RpbGUiLCJUaWxlIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsInByb3RvdHlwZSIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJ0YXJnZXQiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJrZXkiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJfZ2V0IiwiX3giLCJfeDIiLCJfeDMiLCJfYWdhaW4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInJlY2VpdmVyIiwiZGVzYyIsInBhcmVudCIsImdldHRlciIsInVuZGVmaW5lZCIsIkZ1bmN0aW9uIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ2V0UHJvdG90eXBlT2YiLCJfSW1hZ2UiLCJfSW1hZ2UyIiwiX01lc3NhZ2UiLCJfTWVzc2FnZTIiLCJfQXV0aG9yIiwiX0F1dGhvcjIiLCJfUmVhY3QkQ29tcG9uZW50IiwiaW1hZ2UiLCJfcHJvcHMkaW1hZ2UiLCJzcmMiLCJ1cmwiLCJ3aWR0aCIsImhlaWdodCIsIm1lc3NhZ2UiLCJib2R5IiwiY2xhc3NTdHJpbmciLCJzb3VyY2VfdHlwZSIsInZpZGVvX3VybCIsImNyZWF0ZUltYWdlIiwiY3JlYXRlTWVzc2FnZSIsImNyZWF0ZUNsYXNzU3RyaW5nIiwiYXV0aG9yIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJocmVmIiwibGluayIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImlzUmVxdWlyZWQiLCJ0aW1lc3RhbXAiLCJudW1iZXIiLCJzaGFwZSIsInVzZXJuYW1lIiwicGljdHVyZSIsInZpZGVvX3NyYyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsImtleXMiLCJpbmRleE9mIiwiaGFzT3duUHJvcGVydHkiLCJfZXh0ZW5kcyIsImFzc2lnbiIsImFyZ3VtZW50cyIsInNvdXJjZSIsIl9UaWxlIiwiX1RpbGUyIiwiX3JlYWN0TW90aW9uIiwiX0NvbXBvbmVudCIsImFwcGx5IiwiX3RoaXMiLCJjb25maWdzIiwiaXRlbXMiLCJtYXAiLCJvcGFjaXR5Iiwic3ByaW5nIiwibWFyZ2luIiwiaXRlbSIsIml0ZW1WYWx1ZXMiLCJzdHlsZUNvbmZpZyIsIml0ZW1Qcm9wcyIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsIl90aGlzMiIsIlRyYW5zaXRpb25Nb3Rpb24iLCJzdHlsZXMiLCJnZXRTdHlsZXMiLCJiaW5kIiwid2lsbEVudGVyIiwid2lsbExlYXZlIiwidmFsdWVzIiwicmVuZGVyVGlsZSIsIm5vV29iYmxlIiwiZ2VudGxlIiwid29iYmx5Iiwic3RpZmYiLCJwcm9jZXNzIiwiZ2V0TmFub1NlY29uZHMiLCJocnRpbWUiLCJsb2FkVGltZSIsInBlcmZvcm1hbmNlIiwibm93IiwiaHIiLCJEYXRlIiwiZ2V0VGltZSIsImNsZWFuVXBOZXh0VGljayIsImRyYWluaW5nIiwiY3VycmVudFF1ZXVlIiwicXVldWUiLCJjb25jYXQiLCJxdWV1ZUluZGV4IiwiZHJhaW5RdWV1ZSIsInRpbWVvdXQiLCJzZXRUaW1lb3V0IiwibGVuIiwicnVuIiwiY2xlYXJUaW1lb3V0IiwiSXRlbSIsImZ1biIsImFycmF5Iiwibm9vcCIsIm5leHRUaWNrIiwiYXJncyIsIkFycmF5IiwicHVzaCIsInRpdGxlIiwiYnJvd3NlciIsImVudiIsImFyZ3YiLCJ2ZXJzaW9uIiwidmVyc2lvbnMiLCJvbiIsImFkZExpc3RlbmVyIiwib25jZSIsIm9mZiIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZW1pdCIsImJpbmRpbmciLCJuYW1lIiwiRXJyb3IiLCJjd2QiLCJjaGRpciIsImRpciIsInVtYXNrIiwiQXV0aG9yIiwiYWx0IiwiQ2xpbWJCYWRnZSIsImxvZ28iLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsIl9faHRtbCIsIkltYWdlIiwiZGF0YS13aWR0aCIsImRhdGEtaGVpZ2h0IiwiTWVzc2FnZSIsIl9jbGltYlNvY2lhbCIsIl9jbGltYlNvY2lhbDIiLCJfV2FsbCIsIl9XYWxsMiIsIl9DbGltYkJhZGdlIiwiX0NsaW1iQmFkZ2UyIiwic3RhdGUiLCJnZXRTdHJlYW0iLCJzdWJzY3JpYmUiLCJtYXhTaXplIiwicGFyc2VJbnQiLCJtYXBwZWRJdGVtcyIsInNwbGljZSIsInNldFN0YXRlIiwiaW5pdCIsImNiIiwib25VcGRhdGUiLCJvbmVPZlR5cGUiLCJfcnhMaXRlIiwiX2ZldGNoSnNvbnAiLCJfZmV0Y2hKc29ucDIiLCJwb2xsUmF0ZSIsInJlcXVlc3RTdHJlYW0iLCJPYnNlcnZhYmxlIiwianVzdCIsInVwZGF0ZVN0cmVhbSIsImludGVydmFsIiwic3RhcnRXaXRoIiwicmVzcG9uc2VTdHJlYW0iLCJjb21iaW5lTGF0ZXN0IiwidGljayIsImZsYXRNYXAiLCJiYXNlVXJsIiwicmVxdWVzdFVybCIsImZyb21Qcm9taXNlIiwidGhlbiIsInJlc3AiLCJqc29uIiwiX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18iLCJnbG9iYWwiLCJjaGVja0dsb2JhbCIsImNsb25lQXJyYXkiLCJhcnIiLCJhIiwidHJ5Q2F0Y2hlckdlbiIsInRyeUNhdGNoVGFyZ2V0IiwiZSIsImVycm9yT2JqIiwidGhyb3dlciIsIm1ha2VTdGFja1RyYWNlTG9uZyIsImVycm9yIiwib2JzZXJ2YWJsZSIsImhhc1N0YWNrcyIsInN0YWNrIiwiU1RBQ0tfSlVNUF9TRVBBUkFUT1IiLCJzdGFja3MiLCJvIiwidW5zaGlmdCIsImNvbmNhdGVkU3RhY2tzIiwiam9pbiIsImZpbHRlclN0YWNrU3RyaW5nIiwic3RhY2tTdHJpbmciLCJsaW5lcyIsInNwbGl0IiwiZGVzaXJlZExpbmVzIiwibGluZSIsImlzSW50ZXJuYWxGcmFtZSIsImlzTm9kZUZyYW1lIiwic3RhY2tMaW5lIiwiZmlsZU5hbWVBbmRMaW5lTnVtYmVyIiwiZ2V0RmlsZU5hbWVBbmRMaW5lTnVtYmVyIiwiZmlsZU5hbWUiLCJsaW5lTnVtYmVyIiwickZpbGVOYW1lIiwiclN0YXJ0aW5nTGluZSIsInJFbmRpbmdMaW5lIiwiY2FwdHVyZUxpbmUiLCJmaXJzdExpbmUiLCJhdHRlbXB0MSIsImV4ZWMiLCJOdW1iZXIiLCJhdHRlbXB0MiIsImF0dGVtcHQzIiwia2V5c0luIiwicmVzdWx0IiwiaXNPYmplY3QiLCJzdXBwb3J0Iiwibm9uRW51bUFyZ3MiLCJpc0FyZ3VtZW50cyIsInNsaWNlIiwic2tpcFByb3RvIiwiZW51bVByb3RvdHlwZXMiLCJza2lwRXJyb3JQcm9wcyIsImVudW1FcnJvclByb3BzIiwiZXJyb3JQcm90byIsIm5vbkVudW1TaGFkb3dzIiwib2JqZWN0UHJvdG8iLCJjdG9yIiwiaW5kZXgiLCJkb250RW51bXNMZW5ndGgiLCJzdHJpbmdQcm90byIsInN0cmluZ0NsYXNzIiwiZXJyb3JDbGFzcyIsInRvU3RyaW5nIiwibm9uRW51bSIsIm5vbkVudW1Qcm9wcyIsImRvbnRFbnVtcyIsImludGVybmFsRm9yIiwiY2FsbGJhY2siLCJrZXlzRnVuYyIsImludGVybmFsRm9ySW4iLCJpc05vZGUiLCJkZWVwRXF1YWxzIiwiYiIsInN0YWNrQSIsInN0YWNrQiIsInR5cGUiLCJvdGhlclR5cGUiLCJvdGhlckNsYXNzIiwiYXJnc0NsYXNzIiwib2JqZWN0Q2xhc3MiLCJib29sQ2xhc3MiLCJkYXRlQ2xhc3MiLCJudW1iZXJDbGFzcyIsInJlZ2V4cENsYXNzIiwiU3RyaW5nIiwiaXNBcnIiLCJhcnJheUNsYXNzIiwibm9kZUNsYXNzIiwiY3RvckEiLCJhcmdzT2JqZWN0IiwiY3RvckIiLCJpc0Z1bmN0aW9uIiwic2l6ZSIsInBvcCIsImFycmF5SW5pdGlhbGl6ZSIsImNvdW50IiwiSW5kZXhlZEl0ZW0iLCJJc0Rpc3Bvc2VkRGlzcG9zYWJsZSIsIl9zIiwiaXNEaXNwb3NlZCIsIlN0cmluZ0l0ZXJhYmxlIiwicyIsIlN0cmluZ0l0ZXJhdG9yIiwiX2wiLCJfaSIsIkFycmF5SXRlcmFibGUiLCJfYSIsIkFycmF5SXRlcmF0b3IiLCJ0b0xlbmd0aCIsIm51bWJlcklzRmluaXRlIiwiaXNGaW5pdGUiLCJnZXRJdGVyYWJsZSIsIml0IiwiJGl0ZXJhdG9yJCIsInNpZ24iLCJpc05hTiIsIk1hdGgiLCJmbG9vciIsImFicyIsIm1heFNhZmVJbnRlZ2VyIiwiRnJvbUFycmF5U2luayIsIm9ic2VydmVyIiwibG9vcFJlY3Vyc2l2ZSIsInJlY3Vyc2UiLCJvbk5leHQiLCJvbkNvbXBsZXRlZCIsIm9ic2VydmFibGVPZiIsInNjaGVkdWxlciIsImlzU2NoZWR1bGVyIiwiY3VycmVudFRocmVhZFNjaGVkdWxlciIsIkZyb21BcnJheU9ic2VydmFibGUiLCJQYWlyc1NpbmsiLCJSZXBlYXRTaW5rIiwiZmFsc2VGYWN0b3J5IiwiYXJndW1lbnRzVG9BcnJheSIsImVtcHR5QXJyYXlGYWN0b3J5IiwiYXNPYnNlcnZhYmxlIiwicGx1Y2tlciIsIngiLCJjdXJyZW50UHJvcCIsImNyZWF0ZUNiT2JzZXJ2YWJsZSIsImZuIiwiY3R4Iiwic2VsZWN0b3IiLCJBc3luY1N1YmplY3QiLCJjcmVhdGVDYkhhbmRsZXIiLCJyZXN1bHRzIiwidHJ5Q2F0Y2giLCJvbkVycm9yIiwiY3JlYXRlTm9kZU9ic2VydmFibGUiLCJjcmVhdGVOb2RlSGFuZGxlciIsImVyciIsImlzTm9kZUxpc3QiLCJlbCIsIlN0YXRpY05vZGVMaXN0IiwiTm9kZUxpc3QiLCJMaXN0ZW5EaXNwb3NhYmxlIiwibiIsIl9lIiwiX24iLCJfZm4iLCJhZGRFdmVudExpc3RlbmVyIiwiY3JlYXRlRXZlbnRMaXN0ZW5lciIsImV2ZW50TmFtZSIsImhhbmRsZXIiLCJkaXNwb3NhYmxlcyIsIkNvbXBvc2l0ZURpc3Bvc2FibGUiLCJlbGVtVG9TdHJpbmciLCJhZGQiLCJfb2JzZXJ2YWJsZVRpbWVyIiwiZHVlVGltZSIsIlRpbWVyT2JzZXJ2YWJsZSIsIm9ic2VydmFibGVUaW1lckRhdGVBbmRQZXJpb2QiLCJwZXJpb2QiLCJBbm9ueW1vdXNPYnNlcnZhYmxlIiwiZCIsIm5vcm1hbGl6ZVRpbWUiLCJzY2hlZHVsZVJlY3Vyc2l2ZUZ1dHVyZSIsInNlbGYiLCJvYnNlcnZhYmxlVGltZXJUaW1lU3BhbkFuZFBlcmlvZCIsInNjaGVkdWxlUGVyaW9kaWMiLCJvYnNlcnZhYmxlRGVmZXIiLCJvYnNlcnZhYmxlRGVsYXlSZWxhdGl2ZSIsInN1YnNjcmlwdGlvbiIsImFjdGl2ZSIsImNhbmNlbGFibGUiLCJTZXJpYWxEaXNwb3NhYmxlIiwiZXhjZXB0aW9uIiwicSIsInJ1bm5pbmciLCJtYXRlcmlhbGl6ZSIsIm5vdGlmaWNhdGlvbiIsInNob3VsZFJ1biIsImtpbmQiLCJTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSIsInNldERpc3Bvc2FibGUiLCJfIiwicmVjdXJzZUR1ZVRpbWUiLCJzaG91bGRSZWN1cnNlIiwic2hpZnQiLCJhY2NlcHQiLCJtYXgiLCJCaW5hcnlEaXNwb3NhYmxlIiwib2JzZXJ2YWJsZURlbGF5QWJzb2x1dGUiLCJkZWxheVdpdGhTZWxlY3RvciIsInN1YnNjcmlwdGlvbkRlbGF5IiwiZGVsYXlEdXJhdGlvblNlbGVjdG9yIiwic3ViRGVsYXkiLCJzdGFydCIsImRlbGF5IiwiZGVsYXlzIiwicmVtb3ZlIiwiZG9uZSIsImF0RW5kIiwiZGlzcG9zZSIsImRlYm91bmNlV2l0aFNlbGVjdG9yIiwiZHVyYXRpb25TZWxlY3RvciIsImhhc1ZhbHVlIiwidGhyb3R0bGUiLCJpc1Byb21pc2UiLCJvYnNlcnZhYmxlRnJvbVByb21pc2UiLCJjdXJyZW50aWQiLCJzYW1wbGVPYnNlcnZhYmxlIiwic2FtcGxlciIsInNhbXBsZVN1YnNjcmliZSIsInNvdXJjZVN1YnNjcmlwdGlvbiIsIm5ld1ZhbHVlIiwidGltZW91dFdpdGhTZWxlY3RvciIsImZpcnN0VGltZW91dCIsInRpbWVvdXREdXJhdGlvblNlbGVjdG9yIiwib3RoZXIiLCJvYnNlcnZhYmxlTmV2ZXIiLCJvYnNlcnZhYmxlVGhyb3ciLCJUaW1lb3V0RXJyb3IiLCJzZXRUaW1lciIsInRpbWVyV2lucyIsInN3aXRjaGVkIiwibXlJZCIsInRpbWVyIiwib1dpbnMiLCJyZXMiLCJvcmlnaW5hbCIsImRlZmF1bHRTY2hlZHVsZXIiLCJjcmVhdGVUaW1lciIsInNjaGVkdWxlRnV0dXJlIiwiY29tYmluZUxhdGVzdFNvdXJjZSIsInN1YmplY3QiLCJyZXN1bHRTZWxlY3RvciIsIm5leHQiLCJoYXNWYWx1ZUFsbCIsImV2ZXJ5IiwiaWRlbnRpdHkiLCJpc0RvbmUiLCJ0cmFuc2Zvcm1Gb3JPYnNlcnZlciIsIkBAdHJhbnNkdWNlci9pbml0IiwiQEB0cmFuc2R1Y2VyL3N0ZXAiLCJvYnMiLCJpbnB1dCIsIkBAdHJhbnNkdWNlci9yZXN1bHQiLCJvYmplY3RUeXBlcyIsImZ1bmN0aW9uIiwiZnJlZUV4cG9ydHMiLCJub2RlVHlwZSIsImZyZWVNb2R1bGUiLCJmcmVlR2xvYmFsIiwiZnJlZVNlbGYiLCJmcmVlV2luZG93IiwibW9kdWxlRXhwb3J0cyIsInRoaXNHbG9iYWwiLCJSeCIsImludGVybmFscyIsImNvbmZpZyIsIlByb21pc2UiLCJoZWxwZXJzIiwiZGVmYXVsdE5vdyIsImRlZmF1bHRDb21wYXJlciIsInkiLCJpc0VxdWFsIiwiZGVmYXVsdFN1YkNvbXBhcmVyIiwiZGVmYXVsdEVycm9yIiwiZGVmYXVsdEtleVNlcmlhbGl6ZXIiLCJpc0ZuIiwibG9uZ1N0YWNrU3VwcG9ydCIsIkVtcHR5RXJyb3IiLCJPYmplY3REaXNwb3NlZEVycm9yIiwiQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IiLCJOb3RTdXBwb3J0ZWRFcnJvciIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJub3RJbXBsZW1lbnRlZCIsIm5vdFN1cHBvcnRlZCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiU2V0IiwiZG9uZUVudW1lcmF0b3IiLCJpc0l0ZXJhYmxlIiwiaXNBcnJheUxpa2UiLCJzdXBwb3J0Tm9kZUNsYXNzIiwiYmluZENhbGxiYWNrIiwiZnVuYyIsInRoaXNBcmciLCJhcmdDb3VudCIsImFyZyIsImNvbGxlY3Rpb24iLCJmdW5jQ2xhc3MiLCJzdXBwb3J0c0FyZ3NDbGFzcyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidG9Mb2NhbGVTdHJpbmciLCJ2YWx1ZU9mIiwidGVzdCIsImluaGVyaXRzIiwiY2hpbGQiLCJfXyIsImFkZFByb3BlcnRpZXMiLCJzb3VyY2VzIiwiaWR4IiwibG4iLCJwcm9wIiwiYWRkUmVmIiwieHMiLCJyIiwiZ2V0RGlzcG9zYWJsZSIsImlzQXJyYXkiLCJDb21wb3NpdGVEaXNwb3NhYmxlUHJvdG90eXBlIiwic2hvdWxkRGlzcG9zZSIsImN1cnJlbnREaXNwb3NhYmxlcyIsIkRpc3Bvc2FibGUiLCJhY3Rpb24iLCJkaXNwb3NhYmxlQ3JlYXRlIiwiZGlzcG9zYWJsZUVtcHR5IiwiZW1wdHkiLCJpc0Rpc3Bvc2FibGUiLCJjaGVja0Rpc3Bvc2VkIiwiZGlzcG9zYWJsZSIsImRpc3Bvc2FibGVGaXh1cCIsIl9maXh1cCIsImN1cnJlbnQiLCJvbGQiLCJmaXJzdCIsInNlY29uZCIsIl9maXJzdCIsIl9zZWNvbmQiLCJvbGQxIiwib2xkMiIsIk5BcnlEaXNwb3NhYmxlIiwiX2Rpc3Bvc2FibGVzIiwiU2NoZWR1bGVkSXRlbSIsIlJlZkNvdW50RGlzcG9zYWJsZSIsIklubmVyRGlzcG9zYWJsZSIsImlzSW5uZXJEaXNwb3NlZCIsInVuZGVybHlpbmdEaXNwb3NhYmxlIiwiaXNQcmltYXJ5RGlzcG9zZWQiLCJjb21wYXJlciIsImludm9rZSIsImludm9rZUNvcmUiLCJjb21wYXJlVG8iLCJpc0NhbmNlbGxlZCIsIlNjaGVkdWxlciIsInNjaGVkdWxlclByb3RvIiwic2NoZWR1bGUiLCJkdCIsIm5vcm1hbGl6ZSIsIl9zY2hlZHVsZUZ1dHVyZSIsInRpbWVTcGFuIiwiaW52b2tlUmVjSW1tZWRpYXRlIiwicGFpciIsImlubmVyQWN0aW9uIiwic3RhdGUyIiwic2NoZWR1bGVXb3JrIiwic3RhdGUzIiwiaXNBZGRlZCIsImdyb3VwIiwiaW52b2tlUmVjRGF0ZSIsImR1ZVRpbWUxIiwic2NoZWR1bGVSZWN1cnNpdmUiLCJzZXRJbnRlcnZhbCIsImNsZWFySW50ZXJ2YWwiLCJzY2hlZHVsZU1ldGhvZCIsImNsZWFyTWV0aG9kIiwiSW1tZWRpYXRlU2NoZWR1bGVyIiwiX19zdXBlcl9fIiwiaW1tZWRpYXRlU2NoZWR1bGVyIiwiaW1tZWRpYXRlIiwiQ3VycmVudFRocmVhZFNjaGVkdWxlciIsInJ1blRyYW1wb2xpbmUiLCJkZXF1ZXVlIiwic2kiLCJlbnF1ZXVlIiwiUHJpb3JpdHlRdWV1ZSIsInNjaGVkdWxlUmVxdWlyZWQiLCJjdXJyZW50VGhyZWFkIiwibG9jYWxUaW1lciIsIlNjaGVkdWxlUGVyaW9kaWNSZWN1cnNpdmUiLCJjcmVhdGVUaWNrIiwiY29tbWFuZCIsIl9wZXJpb2QiLCJfYWN0aW9uIiwiX3N0YXRlIiwiX2NhbmNlbCIsIl9zY2hlZHVsZXIiLCJsb2NhbFNldFRpbWVvdXQiLCJsb2NhbENsZWFyVGltZW91dCIsIldTY3JpcHQiLCJ0aW1lIiwiU2xlZXAiLCJydW5UYXNrIiwiaGFuZGxlIiwiY3VycmVudGx5UnVubmluZyIsInRhc2siLCJ0YXNrc0J5SGFuZGxlIiwicG9zdE1lc3NhZ2VTdXBwb3J0ZWQiLCJwb3N0TWVzc2FnZSIsImltcG9ydFNjcmlwdHMiLCJpc0FzeW5jIiwib2xkSGFuZGxlciIsIm9ubWVzc2FnZSIsIm5leHRIYW5kbGUiLCJyZU5hdGl2ZSIsIlJlZ0V4cCIsInJlcGxhY2UiLCJzZXRJbW1lZGlhdGUiLCJNU0dfUFJFRklYIiwicmFuZG9tIiwib25HbG9iYWxQb3N0TWVzc2FnZSIsImV2ZW50IiwiZGF0YSIsInN1YnN0cmluZyIsImN1cnJlbnRJZCIsIk1lc3NhZ2VDaGFubmVsIiwiY2hhbm5lbCIsInBvcnQxIiwicG9ydDIiLCJzY3JpcHRFbGVtZW50Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwiZG9jdW1lbnRFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJEZWZhdWx0U2NoZWR1bGVyIiwic2NoZWR1bGVBY3Rpb24iLCJDbGVhckRpc3Bvc2FibGUiLCJtZXRob2QiLCJfaWQiLCJfbWV0aG9kIiwiYXN5bmMiLCJjYXBhY2l0eSIsInByaW9yaXR5UHJvdG8iLCJpc0hpZ2hlclByaW9yaXR5IiwibGVmdCIsInJpZ2h0IiwicGVyY29sYXRlIiwidGVtcCIsImhlYXBpZnkiLCJwZWVrIiwicmVtb3ZlQXQiLCJvYnNlcnZhYmxlUHJvdG8iLCJOb3RpZmljYXRpb24iLCJfYWNjZXB0IiwiX2FjY2VwdE9ic2VydmFibGUiLCJvYnNlcnZlck9yT25OZXh0IiwidG9PYnNlcnZhYmxlIiwiT25OZXh0Tm90aWZpY2F0aW9uIiwiT25FcnJvck5vdGlmaWNhdGlvbiIsIk9uQ29tcGxldGVkTm90aWZpY2F0aW9uIiwibm90aWZpY2F0aW9uQ3JlYXRlT25OZXh0IiwiY3JlYXRlT25OZXh0Iiwibm90aWZpY2F0aW9uQ3JlYXRlT25FcnJvciIsImNyZWF0ZU9uRXJyb3IiLCJub3RpZmljYXRpb25DcmVhdGVPbkNvbXBsZXRlZCIsImNyZWF0ZU9uQ29tcGxldGVkIiwiT2JzZXJ2ZXIiLCJvYnNlcnZlckNyZWF0ZSIsIkFub255bW91c09ic2VydmVyIiwiQWJzdHJhY3RPYnNlcnZlciIsImlzU3RvcHBlZCIsImNvbXBsZXRlZCIsImZhaWwiLCJfb25OZXh0IiwiX29uRXJyb3IiLCJfb25Db21wbGV0ZWQiLCJtYWtlU3Vic2NyaWJlIiwib2xkT25FcnJvciIsIm9sZFN1YnNjcmliZSIsIl9zdWJzY3JpYmUiLCJpc09ic2VydmFibGUiLCJmb3JFYWNoIiwib09yT25OZXh0Iiwic3Vic2NyaWJlT25OZXh0Iiwic3Vic2NyaWJlT25FcnJvciIsInN1YnNjcmliZU9uQ29tcGxldGVkIiwiU2NoZWR1bGVkT2JzZXJ2ZXIiLCJpc0FjcXVpcmVkIiwiaGFzRmF1bHRlZCIsImVuc3VyZUFjdGl2ZSIsImlzT3duZXIiLCJ3b3JrIiwiT2JzZXJ2YWJsZUJhc2UiLCJmaXhTdWJzY3JpYmVyIiwic3Vic2NyaWJlciIsImFkbyIsInN1YiIsInN1YnNjcmliZUNvcmUiLCJBdXRvRGV0YWNoT2JzZXJ2ZXIiLCJGbGF0TWFwT2JzZXJ2YWJsZSIsIklubmVyT2JzZXJ2ZXIiLCJfd3JhcFJlc3VsdCIsImkyIiwiZnJvbSIsIkVudW1lcmFibGUiLCJDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSIsIl9vIiwiY3VycmVudEl0ZW0iLCJjdXJyZW50VmFsdWUiLCJDYXRjaEVycm9yT2JzZXJ2YWJsZSIsIl9yZWN1cnNlIiwibGFzdEV4Y2VwdGlvbiIsImNhdGNoRXJyb3IiLCJjYXRjaEVycm9yV2hlbiIsIm5vdGlmaWNhdGlvbkhhbmRsZXIiLCJleGNlcHRpb25zIiwiU3ViamVjdCIsIm5vdGlmaWVyIiwiaGFuZGxlZCIsIm5vdGlmaWNhdGlvbkRpc3Bvc2FibGUiLCJvdXRlciIsImlubmVyIiwiZXhuIiwiZXgiLCJSZXBlYXRFbnVtZXJhYmxlIiwidiIsIlJlcGVhdEVudW1lcmF0b3IiLCJsIiwiZW51bWVyYWJsZVJlcGVhdCIsInJlcGVhdCIsInJlcGVhdENvdW50IiwiT2ZFbnVtZXJhYmxlIiwiT2ZFbnVtZXJhdG9yIiwiZW51bWVyYWJsZU9mIiwib2YiLCJUb0FycmF5T2JzZXJ2YWJsZSIsInRvQXJyYXkiLCJEZWZlciIsIl9mIiwiZGVmZXIiLCJvYnNlcnZhYmxlRmFjdG9yeSIsIkVtcHR5T2JzZXJ2YWJsZSIsIkVtcHR5U2luayIsInNjaGVkdWxlSXRlbSIsInNpbmsiLCJFTVBUWV9PQlNFUlZBQkxFIiwib2JzZXJ2YWJsZUVtcHR5IiwiRnJvbU9ic2VydmFibGUiLCJpdGVyYWJsZSIsIm1hcHBlciIsIkZyb21TaW5rIiwibGlzdCIsInBvdyIsImNoYXJBdCIsIm9ic2VydmFibGVGcm9tIiwibWFwRm4iLCJvYnNlcnZhYmxlRnJvbUFycmF5IiwiZnJvbUFycmF5IiwiTmV2ZXJPYnNlcnZhYmxlIiwiTkVWRVJfT0JTRVJWQUJMRSIsIm5ldmVyIiwib2ZXaXRoU2NoZWR1bGVyIiwiUGFpcnNPYnNlcnZhYmxlIiwicGFpcnMiLCJSYW5nZU9ic2VydmFibGUiLCJyYW5nZUNvdW50IiwiUmFuZ2VTaW5rIiwicmFuZ2UiLCJSZXBlYXRPYnNlcnZhYmxlIiwiSnVzdE9ic2VydmFibGUiLCJKdXN0U2luayIsIlRocm93T2JzZXJ2YWJsZSIsIlRocm93U2luayIsIkNhdGNoT2JzZXJ2YWJsZSIsImQxIiwiQ2F0Y2hPYnNlcnZlciIsImhhbmRsZXJPclNlY29uZCIsIm9ic2VydmFibGVDYXRjaCIsIkNvbWJpbmVMYXRlc3RPYnNlcnZhYmxlIiwicGFyYW1zIiwiX3BhcmFtcyIsIl9jYiIsInN1YnNjcmlwdGlvbnMiLCJzYWQiLCJDb21iaW5lTGF0ZXN0T2JzZXJ2ZXIiLCJub3RUaGVTYW1lIiwiaiIsImZpbHRlciIsIm9ic2VydmFibGVDb25jYXQiLCJDb25jYXRPYnNlcnZhYmxlIiwiQ29uY2F0U2luayIsImNvbmNhdEFsbCIsIm1lcmdlIiwiTWVyZ2VPYnNlcnZhYmxlIiwibWF4Q29uY3VycmVudCIsImciLCJNZXJnZU9ic2VydmVyIiwiYWN0aXZlQ291bnQiLCJoYW5kbGVTdWJzY3JpYmUiLCJpbm5lclNvdXJjZSIsIm1heENvbmN1cnJlbnRPck90aGVyIiwib2JzZXJ2YWJsZU1lcmdlIiwibWVyZ2VBbGwiLCJDb21wb3NpdGVFcnJvciIsImVycm9ycyIsImlubmVyRXJyb3JzIiwiTWVyZ2VEZWxheUVycm9yT2JzZXJ2YWJsZSIsIk1lcmdlRGVsYXlFcnJvck9ic2VydmVyIiwiX2dyb3VwIiwic2V0Q29tcGxldGlvbiIsIl9pbm5lciIsIm1lcmdlRGVsYXlFcnJvciIsIk1lcmdlQWxsT2JzZXJ2YWJsZSIsIk1lcmdlQWxsT2JzZXJ2ZXIiLCJTa2lwVW50aWxPYnNlcnZhYmxlIiwiX29wZW4iLCJsZWZ0U3Vic2NyaXB0aW9uIiwiU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIiLCJyaWdodFN1YnNjcmlwdGlvbiIsIlNraXBVbnRpbE90aGVyT2JzZXJ2ZXIiLCJfcCIsIl9yIiwic2tpcFVudGlsIiwiU3dpdGNoT2JzZXJ2YWJsZSIsIlN3aXRjaE9ic2VydmVyIiwic3RvcHBlZCIsImxhdGVzdCIsImhhc0xhdGVzdCIsInN3aXRjaExhdGVzdCIsIlRha2VVbnRpbE9ic2VydmFibGUiLCJUYWtlVW50aWxPYnNlcnZlciIsInRha2VVbnRpbCIsIldpdGhMYXRlc3RGcm9tT2JzZXJ2YWJsZSIsIl9zcyIsIldpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlciIsIldpdGhMYXRlc3RGcm9tU291cmNlT2JzZXJ2ZXIiLCJhbGxWYWx1ZXMiLCJ3aXRoTGF0ZXN0RnJvbSIsIlppcE9ic2VydmFibGUiLCJaaXBPYnNlcnZlciIsIl9xIiwiX2QiLCJub3RFbXB0eSIsInNoaWZ0RWFjaCIsInF1ZXVlZFZhbHVlcyIsInppcCIsInppcEl0ZXJhYmxlIiwicXVldWVzIiwiRGVtYXRlcmlhbGl6ZU9ic2VydmFibGUiLCJEZW1hdGVyaWFsaXplT2JzZXJ2ZXIiLCJkZW1hdGVyaWFsaXplIiwiRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZhYmxlIiwia2V5Rm4iLCJEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyIiwiaGFzQ3VycmVudEtleSIsImN1cnJlbnRLZXkiLCJjb21wYXJlckVxdWFscyIsImRpc3RpbmN0VW50aWxDaGFuZ2VkIiwiVGFwT2JzZXJ2YWJsZSIsIl9vTiIsIl9vRSIsIl9vQyIsInQiLCJ0YXAiLCJkb0FjdGlvbiIsImRvT25OZXh0IiwidGFwT25OZXh0IiwiZG9PbkVycm9yIiwidGFwT25FcnJvciIsImRvT25Db21wbGV0ZWQiLCJ0YXBPbkNvbXBsZXRlZCIsIklnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZSIsImlnbm9yZUVsZW1lbnRzIiwiTWF0ZXJpYWxpemVPYnNlcnZhYmxlIiwiTWF0ZXJpYWxpemVPYnNlcnZlciIsInJldHJ5IiwicmV0cnlDb3VudCIsInJldHJ5V2hlbiIsIlNjYW5PYnNlcnZhYmxlIiwiYWNjdW11bGF0b3IiLCJoYXNTZWVkIiwic2VlZCIsIlNjYW5PYnNlcnZlciIsIl9ocyIsIl9oYSIsIl9odiIsInNjYW4iLCJTa2lwTGFzdE9ic2VydmFibGUiLCJfYyIsIlNraXBMYXN0T2JzZXJ2ZXIiLCJza2lwTGFzdCIsIlRha2VMYXN0T2JzZXJ2ZXIiLCJ0YWtlTGFzdCIsImZsYXRNYXBDb25jYXQiLCJjb25jYXRNYXAiLCJNYXBPYnNlcnZhYmxlIiwiaW5uZXJNYXAiLCJpbnRlcm5hbE1hcCIsInNlbGVjdCIsInNlbGVjdG9yRm4iLCJwbHVjayIsInNlbGVjdE1hbnkiLCJmbGF0TWFwTGF0ZXN0IiwiU2tpcE9ic2VydmFibGUiLCJza2lwQ291bnQiLCJza2lwIiwiU2tpcFdoaWxlT2JzZXJ2YWJsZSIsIlNraXBXaGlsZU9ic2VydmVyIiwic2tpcFdoaWxlIiwicHJlZGljYXRlIiwiVGFrZU9ic2VydmFibGUiLCJ0YWtlQ291bnQiLCJ0YWtlIiwiVGFrZVdoaWxlT2JzZXJ2YWJsZSIsIlRha2VXaGlsZU9ic2VydmVyIiwidGFrZVdoaWxlIiwiRmlsdGVyT2JzZXJ2YWJsZSIsImlubmVyUHJlZGljYXRlIiwiaW50ZXJuYWxGaWx0ZXIiLCJzaG91bGRZaWVsZCIsIndoZXJlIiwiZnJvbUNhbGxiYWNrIiwiZnJvbU5vZGVDYWxsYmFjayIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ1c2VOYXRpdmVFdmVudHMiLCJFdmVudE9ic2VydmFibGUiLCJfZWwiLCJjcmVhdGVIYW5kbGVyIiwiZnJvbUV2ZW50IiwiZWxlbWVudCIsImZyb21FdmVudFBhdHRlcm4iLCJoIiwicHVibGlzaCIsInJlZkNvdW50IiwiRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZSIsImRlbCIsIl9hZGQiLCJfZGVsIiwiRXZlbnRQYXR0ZXJuRGlzcG9zYWJsZSIsInJldCIsIl9yZXQiLCJyZXR1cm5WYWx1ZSIsImFkZEhhbmRsZXIiLCJyZW1vdmVIYW5kbGVyIiwiRnJvbVByb21pc2VPYnNlcnZhYmxlIiwic2NoZWR1bGVOZXh0Iiwic2NoZWR1bGVFcnJvciIsInByb21pc2UiLCJ0b1Byb21pc2UiLCJwcm9taXNlQ3RvciIsInJlc29sdmUiLCJyZWplY3QiLCJzdGFydEFzeW5jIiwiZnVuY3Rpb25Bc3luYyIsIk11bHRpY2FzdE9ic2VydmFibGUiLCJmbjEiLCJmbjIiLCJfZm4xIiwiX2ZuMiIsImNvbm5lY3RhYmxlIiwibXVsdGljYXN0IiwiY29ubmVjdCIsInN1YmplY3RPclN1YmplY3RTZWxlY3RvciIsIkNvbm5lY3RhYmxlT2JzZXJ2YWJsZSIsInNoYXJlIiwicHVibGlzaExhc3QiLCJwdWJsaXNoVmFsdWUiLCJpbml0aWFsVmFsdWVPclNlbGVjdG9yIiwiaW5pdGlhbFZhbHVlIiwiQmVoYXZpb3JTdWJqZWN0Iiwic2hhcmVWYWx1ZSIsInJlcGxheSIsImJ1ZmZlclNpemUiLCJ3aW5kb3dTaXplIiwiUmVwbGF5U3ViamVjdCIsInNoYXJlUmVwbGF5IiwiUmVmQ291bnRPYnNlcnZhYmxlIiwiX2NvdW50IiwiX2Nvbm5lY3RhYmxlU3Vic2NyaXB0aW9uIiwic2hvdWxkQ29ubmVjdCIsIl9oYXNTdWJzY3JpcHRpb24iLCJfc3Vic2NyaXB0aW9uIiwiX3NvdXJjZU9ic2VydmFibGUiLCJfc3ViamVjdCIsIkNvbm5lY3REaXNwb3NhYmxlIiwiX2R0Iiwib2JzZXJ2YWJsZWludGVydmFsIiwicGVyaW9kT3JTY2hlZHVsZXIiLCJmaXJzdEFyZyIsIkRlYm91bmNlT2JzZXJ2YWJsZSIsIkRlYm91bmNlT2JzZXJ2ZXIiLCJfdiIsImRlYm91bmNlIiwiVGltZXN0YW1wT2JzZXJ2YWJsZSIsIlRpbWVzdGFtcE9ic2VydmVyIiwic2FtcGxlIiwidGhyb3R0bGVMYXRlc3QiLCJpbnRlcnZhbE9yU2FtcGxlciIsIndpbmRvd0R1cmF0aW9uIiwiZHVyYXRpb24iLCJSYW5nZUVycm9yIiwibGFzdE9uTmV4dCIsIlBhdXNhYmxlT2JzZXJ2YWJsZSIsInBhdXNlciIsImNvbnRyb2xsZXIiLCJjb25uIiwiY29ubmVjdGlvbiIsInBhdXNhYmxlIiwicGF1c2UiLCJyZXN1bWUiLCJQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZSIsInByZXZpb3VzU2hvdWxkRmlyZSIsInNob3VsZEZpcmUiLCJwYXVzYWJsZUJ1ZmZlcmVkIiwiQ29udHJvbGxlZE9ic2VydmFibGUiLCJlbmFibGVRdWV1ZSIsIkNvbnRyb2xsZWRTdWJqZWN0IiwicmVxdWVzdCIsIm51bWJlck9mSXRlbXMiLCJyZXF1ZXN0ZWRDb3VudCIsInJlcXVlc3RlZERpc3Bvc2FibGUiLCJoYXNGYWlsZWQiLCJoYXNDb21wbGV0ZWQiLCJkaXNwb3NlQ3VycmVudFJlcXVlc3QiLCJfcHJvY2Vzc1JlcXVlc3QiLCJyZW1haW5pbmciLCJjb250cm9sbGVkIiwicGlwZSIsImRlc3QiLCJvbkRyYWluIiwid3JpdGUiLCJfaXNTdGRpbyIsImVuZCIsIlRyYW5zZHVjZU9ic2VydmVyIiwieGZvcm0iLCJfeGZvcm0iLCJ0cmFuc2R1Y2UiLCJ0cmFuc2R1Y2VyIiwiX19zdWJzY3JpYmUiLCJBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUiLCJJbm5lclN1YnNjcmlwdGlvbiIsIm9ic2VydmVycyIsImhhc0Vycm9yIiwiaGFzT2JzZXJ2ZXJzIiwib3MiLCJBbm9ueW1vdXNTdWJqZWN0IiwiZ2V0VmFsdWUiLCJjcmVhdGVSZW1vdmFibGVEaXNwb3NhYmxlIiwic28iLCJfdHJpbSIsIlBhdXNlciIsIm1lZGlhUXVlcnkiLCJhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzIiwiX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fIiwiX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXyIsImdlbmVyYXRlQ2FsbGJhY2tGdW5jdGlvbiIsImNlaWwiLCJjbGVhckZ1bmN0aW9uIiwiZnVuY3Rpb25OYW1lIiwicmVtb3ZlU2NyaXB0Iiwic2NyaXB0SWQiLCJzY3JpcHQiLCJnZXRFbGVtZW50QnlJZCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZGVmYXVsdE9wdGlvbnMiLCJqc29ucENhbGxiYWNrIiwiZmV0Y2hKc29ucCIsIm9wdGlvbnMiLCJ0aW1lb3V0SWQiLCJjYWxsYmFja0Z1bmN0aW9uIiwicmVzcG9uc2UiLCJvayIsImpzb25wU2NyaXB0Iiwic2V0QXR0cmlidXRlIiwiY29uZmlnQW5pbWF0aW9uIiwibG9vcCIsImN1cnJlbnRUaW1lIiwiZnJhbWVUaW1lIiwicHJldlRpbWUiLCJhY2N1bXVsYXRlZFRpbWUiLCJ0aW1lU2NhbGUiLCJ0aW1lU3RlcCIsIm1heFN0ZXBzIiwiZnJhbWVOdW1iZXIiLCJhbmltUnVubmluZyIsIl9hbmltUnVubmluZyRpIiwiYW5pbWF0aW9uU3RlcCIsInByZXZQcmV2U3RhdGUiLCJwcmV2U3RhdGUiLCJwcmV2TmV4dFN0YXRlIiwibmV4dFN0YXRlIiwiX3JlZiIsImFscGhhIiwiX2FuaW1SdW5uaW5nJGkyIiwiYW5pbWF0aW9uUmVuZGVyIiwiX3JlZjIiLCJyYWYiLCJfY29uZmlnJHRpbWVTdGVwIiwiX2NvbmZpZyR0aW1lU2NhbGUiLCJfY29uZmlnJG1heFN0ZXBzIiwiX2NvbmZpZyRyYWYiLCJfcmFmMiIsIl9jb25maWckbm93IiwiX3BlcmZvcm1hbmNlTm93MiIsInZhbCIsInN0b3AiLCJuZXdBbmltIiwiX3BlcmZvcm1hbmNlTm93IiwiX3JhZiIsIm1hcE9iamVjdCIsImYiLCJldmVyeU9iaiIsImNvbXBvbmVudHMiLCJSZWFjdCIsIk1vdGlvbiIsImNyZWF0ZUNsYXNzIiwiZGlzcGxheU5hbWUiLCJkZWZhdWx0VmFsdWUiLCJwcm9wTmFtZSIsImVuZFZhbHVlIiwiZGVmYXVsdFN0eWxlIiwiY2hpbGRyZW4iLCJnZXRJbml0aWFsU3RhdGUiLCJfcHJvcHMiLCJjdXJyZW50U3R5bGUiLCJjdXJyZW50VmVsb2NpdHkiLCJfemVybzIiLCJjb21wb25lbnREaWRNb3VudCIsInN0YXJ0QW5pbWF0aW5nIiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsInRpbWVzdGVwIiwibmV3Q3VycmVudFN0eWxlIiwiX3VwZGF0ZVRyZWUiLCJ1cGRhdGVDdXJyZW50U3R5bGUiLCJuZXdDdXJyZW50VmVsb2NpdHkiLCJ1cGRhdGVDdXJyZW50VmVsb2NpdHkiLCJfbm9WZWxvY2l0eTIiLCJzdG9wQW5pbWF0aW9uIiwiaGFzVW5tb3VudGVkIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJzdGFydEFuaW1hdGlvbiIsImludGVycG9sYXRlVmFsdWUiLCJzdHJpcHBlZFN0eWxlIiwiX3N0cmlwU3R5bGUyIiwicmVuZGVyZWRDaGlsZHJlbiIsIkNoaWxkcmVuIiwib25seSIsIlN0YWdnZXJlZE1vdGlvbiIsImRlZmF1bHRTdHlsZXMiLCJhcnJheU9mIiwiX3Byb3BzMiIsImN1cnJlbnRTdHlsZXMiLCJjdXJyZW50VmVsb2NpdGllcyIsIm5ld0N1cnJlbnRTdHlsZXMiLCJuZXdDdXJyZW50VmVsb2NpdGllcyIsImsiLCJvYmplY3RPZiIsImFueSIsImdldERlZmF1bHRQcm9wcyIsIl9wcm9wczMiLCJfcHJvcHM0IiwibWVyZ2VkU3R5bGVzIiwiaGFzTmV3S2V5IiwiX21lcmdlRGlmZjIiLCJfaGFzUmVhY2hlZFN0eWxlMiIsIl9leHRlbmRzMiIsIl9leHRlbmRzMyIsImVudGVyU3R5bGUiLCJtZXJnZWRTdHlsZSIsIl9kZXByZWNhdGVkU3ByaW5ncyIsIl9kZXByZWNhdGVkU3ByaW5nczMiLCJTcHJpbmciLCJUcmFuc2l0aW9uU3ByaW5nIiwiX25vVmVsb2NpdHkiLCJfaGFzUmVhY2hlZFN0eWxlIiwiX21lcmdlRGlmZiIsIl9hbmltYXRpb25Mb29wIiwiX2FuaW1hdGlvbkxvb3AyIiwiX3plcm8iLCJfZGVwcmVjYXRlZFNwcmluZ3MyIiwiX3N0cmlwU3R5bGUiLCJkZXByZWNhdGVkU3ByaW5ncyIsImNvbXBvbmVudFdpbGxNb3VudCIsImhhc1JlYWNoZWRTdHlsZSIsImRlc3RWYWx1ZSIsIm1lcmdlRGlmZkFyciIsIl94NCIsIl94NSIsIl94NiIsIl94NyIsImFyckEiLCJhcnJCIiwiY29sbEIiLCJpbmRleEEiLCJpbmRleEIiLCJvblJlbW92ZSIsImFjY3VtIiwiZW5kQSIsImVuZEIiLCJrZXlBIiwia2V5QiIsImZpbGwiLCJtZXJnZURpZmYiLCJub1ZlbG9jaXR5IiwiX2NvbXBvbmVudHMyIiwiX2NvbXBvbmVudHMzIiwiX3Jlb3JkZXJLZXlzIiwiX3Jlb3JkZXJLZXlzMiIsIl9jb21wb25lbnRzIiwiX3NwcmluZzIiLCJfc3ByaW5nMyIsIl9wcmVzZXRzMiIsIl9wcmVzZXRzMyIsInByZXNldHMiLCJ1dGlscyIsInJlb3JkZXJLZXlzIiwibmV3S2V5cyIsIl9wcmVzZXRzIiwic3RlcHBlciIsImZyYW1lUmF0ZSIsImRlc3RYIiwiRnNwcmluZyIsIkZkYW1wZXIiLCJuZXdWIiwibmV3WCIsImVycm9yTWFyZ2luIiwic3RyaXBTdHlsZSIsIm5leHRTdHlsZSIsInByZXZTdHlsZSIsInByZXZWYWx1ZSIsIl9zdHlsZSRrZXkkY29uZmlnIiwiX3N0ZXBwZXIyIiwiX3N0eWxlJGtleSRjb25maWcyIiwiX3N0ZXBwZXIiLCJ6ZXJvIiwidmVuZG9ycyIsInN1ZmZpeCIsImNhZiIsImxhc3QiLCJmcmFtZUR1cmF0aW9uIiwiX25vdyIsImNwIiwiY2FuY2VsbGVkIiwicm91bmQiLCJjYW5jZWwiLCJhZGRTdHlsZXNUb0RvbSIsImRvbVN0eWxlIiwic3R5bGVzSW5Eb20iLCJyZWZzIiwicGFydHMiLCJhZGRTdHlsZSIsImxpc3RUb1N0eWxlcyIsIm5ld1N0eWxlcyIsImNzcyIsIm1lZGlhIiwic291cmNlTWFwIiwicGFydCIsImNyZWF0ZVN0eWxlRWxlbWVudCIsInN0eWxlRWxlbWVudCIsImhlYWQiLCJnZXRIZWFkRWxlbWVudCIsImNyZWF0ZUxpbmtFbGVtZW50IiwibGlua0VsZW1lbnQiLCJyZWwiLCJ1cGRhdGUiLCJzaW5nbGV0b24iLCJzdHlsZUluZGV4Iiwic2luZ2xldG9uQ291bnRlciIsInNpbmdsZXRvbkVsZW1lbnQiLCJhcHBseVRvU2luZ2xldG9uVGFnIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwicmV2b2tlT2JqZWN0VVJMIiwiQmxvYiIsImJ0b2EiLCJ1cGRhdGVMaW5rIiwiYXBwbHlUb1RhZyIsIm5ld09iaiIsInN0eWxlU2hlZXQiLCJjc3NUZXh0IiwicmVwbGFjZVRleHQiLCJjc3NOb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJjaGlsZE5vZGVzIiwiaW5zZXJ0QmVmb3JlIiwiZmlyc3RDaGlsZCIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsImJsb2IiLCJvbGRTcmMiLCJtZW1vaXplIiwibWVtbyIsImlzT2xkSUUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ0b0xvd2VyQ2FzZSIsIm5ld0xpc3QiLCJtYXlSZW1vdmUiLCJ0ZXh0U3RvcmUiLCJyZXBsYWNlbWVudCIsIkJvb2xlYW4iLCJjb250ZW50IiwibG9jYWxzIiwid2VicGFja1BvbHlmaWxsIiwiZGVwcmVjYXRlIiwicGF0aHMiXSwibWFwcGluZ3MiOiJDQUFBLFNBQUFBLEVBQUFD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QUMsU2xDdXhTTSxTQUFTdjFDLEVBQVFELEdtQzl4U3ZCQyxFQUFBRCxRQUFBLHNsVG5Db3lTTSxTQUFTQyxFQUFRRCxHb0NweVN2QkMsRUFBQUQsUUFBQSxTQUFBQyxHQVFBLE1BUEFBLEdBQUF3MUMsa0JBQ0F4MUMsRUFBQXkxQyxVQUFBLGFBQ0F6MUMsRUFBQTAxQyxTQUVBMTFDLEVBQUFncUMsWUFDQWhxQyxFQUFBdzFDLGdCQUFBLEdBRUF4MUMiLCJmaWxlIjoicmVhY3QtY2xpbWItc29jaWFsLm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInJlYWN0XCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcInJlYWN0XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInJlYWN0LWNsaW1iLXNvY2lhbFwiXSA9IGZhY3RvcnkocmVxdWlyZShcInJlYWN0XCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJyZWFjdC1jbGltYi1zb2NpYWxcIl0gPSBmYWN0b3J5KHJvb3RbXCJSZWFjdFwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzFfXykge1xucmV0dXJuIFxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvblxuICoqLyIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInJlYWN0XCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcInJlYWN0XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInJlYWN0LWNsaW1iLXNvY2lhbFwiXSA9IGZhY3RvcnkocmVxdWlyZShcInJlYWN0XCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJyZWFjdC1jbGltYi1zb2NpYWxcIl0gPSBmYWN0b3J5KHJvb3RbXCJSZWFjdFwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzFfXykge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9LFxuLyoqKioqKi8gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bG9hZGVkOiBmYWxzZVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9cIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0ICAgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXHRcblx0dmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblx0XG5cdHZhciBfY29tcG9uZW50c1dhbGxDb250YWluZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblx0XG5cdHZhciBfY29tcG9uZW50c1dhbGxDb250YWluZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tcG9uZW50c1dhbGxDb250YWluZXIpO1xuXHRcblx0X193ZWJwYWNrX3JlcXVpcmVfXygzMik7XG5cdFxuXHRpZiAod2luZG93KSB7XG5cdCAgICB3aW5kb3cuQ2xpbWIgPSB3aW5kb3cuQ2xpbWIgfHwge307XG5cdFxuXHQgICAgdmFyICR0YXJnZXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNsaW1iLXdhbGwnKTtcblx0XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8ICR0YXJnZXRzLmxlbmd0aDsgKytpKSB7XG5cdCAgICAgICAgdmFyICRpdGVtID0gJHRhcmdldHNbaV07XG5cdCAgICAgICAgdmFyIGNvbGxlY3Rpb25JZCA9ICRpdGVtLmRhdGFzZXQuY29sbGVjdGlvbklkO1xuXHQgICAgICAgIHZhciBsaW1pdCA9ICRpdGVtLmRhdGFzZXQubGltaXQ7XG5cdFxuXHQgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5yZW5kZXIoX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX2NvbXBvbmVudHNXYWxsQ29udGFpbmVyMlsnZGVmYXVsdCddLCB7IGNvbGxlY3Rpb25JZDogY29sbGVjdGlvbklkLCBsaW1pdDogbGltaXQgfSksICRpdGVtKTtcblx0ICAgIH1cblx0fVxuXHRcblx0ZXhwb3J0cy5XYWxsQ29udGFpbmVyID0gX2NvbXBvbmVudHNXYWxsQ29udGFpbmVyMlsnZGVmYXVsdCddO1xuXHRcblx0dmFyIF9jb21wb25lbnRzV2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ1dhbGwnLCB7XG5cdCAgICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICAgICAgcmV0dXJuIF9jb21wb25lbnRzV2FsbC5XYWxsO1xuXHQgICAgfVxuXHR9KTtcblx0XG5cdHZhciBfY29tcG9uZW50c1RpbGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdUaWxlJywge1xuXHQgICAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgICAgIHJldHVybiBfY29tcG9uZW50c1RpbGUuVGlsZTtcblx0ICAgIH1cblx0fSk7XG5cbi8qKiovIH0sXG4vKiAxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMV9fO1xuXG4vKioqLyB9LFxuLyogMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHQgICAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IGRlc2MgPSBwYXJlbnQgPSBnZXR0ZXIgPSB1bmRlZmluZWQ7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXHRcblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cdFxuXHRmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXHRcblx0dmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblx0XG5cdHZhciBfSW1hZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHRcblx0dmFyIF9JbWFnZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9JbWFnZSk7XG5cdFxuXHR2YXIgX01lc3NhZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcblx0XG5cdHZhciBfTWVzc2FnZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9NZXNzYWdlKTtcblx0XG5cdHZhciBfQXV0aG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblx0XG5cdHZhciBfQXV0aG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0F1dGhvcik7XG5cdFxuXHR2YXIgVGlsZSA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuXHQgICAgX2luaGVyaXRzKFRpbGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXHRcblx0ICAgIGZ1bmN0aW9uIFRpbGUocHJvcHMpIHtcblx0ICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGlsZSk7XG5cdFxuXHQgICAgICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRpbGUucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuY2FsbCh0aGlzLCBwcm9wcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgX2NyZWF0ZUNsYXNzKFRpbGUsIFt7XG5cdCAgICAgICAga2V5OiAnY3JlYXRlSW1hZ2UnLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVJbWFnZSgpIHtcblx0XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmltYWdlICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgX3Byb3BzJGltYWdlID0gdGhpcy5wcm9wcy5pbWFnZTtcblx0ICAgICAgICAgICAgICAgIHZhciBzcmMgPSBfcHJvcHMkaW1hZ2UudXJsO1xuXHQgICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gX3Byb3BzJGltYWdlLndpZHRoO1xuXHQgICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IF9wcm9wcyRpbWFnZS5oZWlnaHQ7XG5cdFxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9JbWFnZTJbJ2RlZmF1bHQnXSwgeyBzcmM6IHNyYyxcblx0ICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXG5cdCAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgfSwge1xuXHQgICAgICAgIGtleTogJ2NyZWF0ZU1lc3NhZ2UnLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVNZXNzYWdlKCkge1xuXHRcblx0ICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMubWVzc2FnZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9NZXNzYWdlMlsnZGVmYXVsdCddLCB7IGJvZHk6IHRoaXMucHJvcHMubWVzc2FnZSB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICB9LCB7XG5cdCAgICAgICAga2V5OiAnY3JlYXRlQ2xhc3NTdHJpbmcnLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVDbGFzc1N0cmluZygpIHtcblx0XG5cdCAgICAgICAgICAgIHZhciBjbGFzc1N0cmluZyA9ICdjbGltYl9fdGlsZSBjbGltYl9fdGlsZS0tJyArIHRoaXMucHJvcHMuc291cmNlX3R5cGU7XG5cdFxuXHQgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5pbWFnZSkge1xuXHQgICAgICAgICAgICAgICAgY2xhc3NTdHJpbmcgKz0gJyBjbGltYl9fdGlsZS0taGFzLW1lZGlhIGNsaW1iX190aWxlLS1oYXMtaW1hZ2UnO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgY2xhc3NTdHJpbmcgKz0gJyBjbGltYl9fdGlsZS0taGFzLW5vLWltYWdlJztcblx0ICAgICAgICAgICAgfVxuXHRcblx0ICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMudmlkZW9fdXJsKSB7XG5cdCAgICAgICAgICAgICAgICBjbGFzc1N0cmluZyArPSAnIGNsaW1iX190aWxlLS1oYXMtbWVkaWEgY2xpbWJfX3RpbGUtLWhhcy12aWRlbyc7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBjbGFzc1N0cmluZyArPSAnIGNsaW1iX190aWxlLS1oYXMtbm8tdmlkZW8nO1xuXHQgICAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgICByZXR1cm4gY2xhc3NTdHJpbmc7XG5cdCAgICAgICAgfVxuXHQgICAgfSwge1xuXHQgICAgICAgIGtleTogJ3JlbmRlcicsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0XG5cdCAgICAgICAgICAgIHZhciBpbWFnZSA9IHRoaXMuY3JlYXRlSW1hZ2UoKTtcblx0ICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSB0aGlzLmNyZWF0ZU1lc3NhZ2UoKTtcblx0ICAgICAgICAgICAgdmFyIGNsYXNzU3RyaW5nID0gdGhpcy5jcmVhdGVDbGFzc1N0cmluZygpO1xuXHQgICAgICAgICAgICB2YXIgYXV0aG9yID0gdGhpcy5wcm9wcy5hdXRob3I7XG5cdFxuXHQgICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBjbGFzc1N0cmluZyxcblx0ICAgICAgICAgICAgICAgICAgICBzdHlsZTogdGhpcy5wcm9wcy5zdHlsZSB9LFxuXHQgICAgICAgICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAgICAgICAgICAgJ2EnLFxuXHQgICAgICAgICAgICAgICAgICAgIHsgaHJlZjogdGhpcy5wcm9wcy5saW5rIH0sXG5cdCAgICAgICAgICAgICAgICAgICAgaW1hZ2Vcblx0ICAgICAgICAgICAgICAgICksXG5cdCAgICAgICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAgICAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogJ2NsaW1iX190aWxlX19jb250ZW50JyB9LFxuXHQgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG5cdCAgICAgICAgICAgICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX0F1dGhvcjJbJ2RlZmF1bHQnXSwgYXV0aG9yKVxuXHQgICAgICAgICAgICAgICAgKVxuXHQgICAgICAgICAgICApO1xuXHQgICAgICAgIH1cblx0ICAgIH1dKTtcblx0XG5cdCAgICByZXR1cm4gVGlsZTtcblx0fSkoX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cdFxuXHRUaWxlLnByb3BUeXBlcyA9IHtcblx0XG5cdCAgICAvLyBSZXF1aXJlZCBhdHRyc1xuXHQgICAgbGluazogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcblx0ICAgIHNvdXJjZV90eXBlOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXHQgICAgdGltZXN0YW1wOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuXHQgICAgYXV0aG9yOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLnNoYXBlKHtcblx0ICAgICAgICB1c2VybmFtZTogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcblx0ICAgICAgICBwaWN0dXJlOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXHQgICAgICAgIGxpbms6IF9yZWFjdDJbJ2RlZmF1bHQnXS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcblx0ICAgIH0pLFxuXHRcblx0ICAgIC8vIE9wdGlvbmFsIGF0dHJzXG5cdCAgICBtZXNzYWdlOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLnN0cmluZyxcblx0ICAgIHZpZGVvX3NyYzogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5zdHJpbmcsXG5cdCAgICBpbWFnZTogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5zaGFwZSh7XG5cdCAgICAgICAgdXJsOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXHQgICAgICAgIHdpZHRoOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuXHQgICAgICAgIGhlaWdodDogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuXHQgICAgfSlcblx0XG5cdH07XG5cdFxuXHRleHBvcnRzWydkZWZhdWx0J10gPSBUaWxlO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSxcbi8qIDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0ICAgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgZGVzYyA9IHBhcmVudCA9IGdldHRlciA9IHVuZGVmaW5lZDsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cdFxuXHRmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cdFxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblx0XG5cdGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cdFxuXHR2YXIgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXHRcblx0dmFyIF9UaWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfVGlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UaWxlKTtcblx0XG5cdHZhciBfcmVhY3RNb3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKTtcblx0XG5cdHZhciBXYWxsID0gKGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG5cdCAgICBfaW5oZXJpdHMoV2FsbCwgX0NvbXBvbmVudCk7XG5cdFxuXHQgICAgZnVuY3Rpb24gV2FsbCgpIHtcblx0ICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2FsbCk7XG5cdFxuXHQgICAgICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFdhbGwucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH1cblx0XG5cdCAgICBfY3JlYXRlQ2xhc3MoV2FsbCwgW3tcblx0ICAgICAgICBrZXk6ICdnZXRTdHlsZXMnLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTdHlsZXMoKSB7XG5cdCAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICAgICAgICB2YXIgY29uZmlncyA9IHt9O1xuXHQgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnByb3BzLml0ZW1zKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuXHQgICAgICAgICAgICAgICAgY29uZmlnc1trZXldID0ge1xuXHQgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6ICgwLCBfcmVhY3RNb3Rpb24uc3ByaW5nKSgxKSxcblx0ICAgICAgICAgICAgICAgICAgICB3aWR0aDogKDAsIF9yZWFjdE1vdGlvbi5zcHJpbmcpKDM3NSksXG5cdCAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAoMCwgX3JlYWN0TW90aW9uLnNwcmluZykoMTApLFxuXHQgICAgICAgICAgICAgICAgICAgIGl0ZW06IF90aGlzLnByb3BzLml0ZW1zW2tleV1cblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICByZXR1cm4gY29uZmlncztcblx0ICAgICAgICB9XG5cdCAgICB9LCB7XG5cdCAgICAgICAga2V5OiAnd2lsbEVudGVyJyxcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gd2lsbEVudGVyKGtleSkge1xuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgb3BhY2l0eTogKDAsIF9yZWFjdE1vdGlvbi5zcHJpbmcpKDApLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6ICgwLCBfcmVhY3RNb3Rpb24uc3ByaW5nKSgwKSxcblx0ICAgICAgICAgICAgICAgIG1hcmdpbjogKDAsIF9yZWFjdE1vdGlvbi5zcHJpbmcpKDApLFxuXHQgICAgICAgICAgICAgICAgaXRlbTogdGhpcy5wcm9wcy5pdGVtc1trZXldXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgfSwge1xuXHQgICAgICAgIGtleTogJ3dpbGxMZWF2ZScsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHdpbGxMZWF2ZShrZXksIHN0eWxlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICBvcGFjaXR5OiAoMCwgX3JlYWN0TW90aW9uLnNwcmluZykoMCksXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogKDAsIF9yZWFjdE1vdGlvbi5zcHJpbmcpKDApLFxuXHQgICAgICAgICAgICAgICAgbWFyZ2luOiAoMCwgX3JlYWN0TW90aW9uLnNwcmluZykoMCksXG5cdCAgICAgICAgICAgICAgICBpdGVtOiBzdHlsZS5pdGVtXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgfSwge1xuXHQgICAgICAgIGtleTogJ3JlbmRlclRpbGUnLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJUaWxlKGtleSwgaXRlbVZhbHVlcykge1xuXHQgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1WYWx1ZXMuaXRlbTtcblx0XG5cdCAgICAgICAgICAgIHZhciBzdHlsZUNvbmZpZyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhpdGVtVmFsdWVzLCBbJ2l0ZW0nXSk7XG5cdFxuXHQgICAgICAgICAgICB2YXIgaXRlbVByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKGl0ZW0sIFtdKTtcblx0XG5cdCAgICAgICAgICAgIHZhciBzdHlsZSA9IHtcblx0ICAgICAgICAgICAgICAgIG9wYWNpdHk6IHN0eWxlQ29uZmlnLm9wYWNpdHksXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogc3R5bGVDb25maWcud2lkdGggKyAncHgnLFxuXHQgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogc3R5bGVDb25maWcubWFyZ2luLFxuXHQgICAgICAgICAgICAgICAgbWFyZ2luUmlnaHQ6IHN0eWxlQ29uZmlnLm1hcmdpblxuXHQgICAgICAgICAgICB9O1xuXHRcblx0ICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9UaWxlMlsnZGVmYXVsdCddLCBfZXh0ZW5kcyh7IGtleToga2V5LFxuXHQgICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlXG5cdCAgICAgICAgICAgIH0sIGl0ZW1Qcm9wcykpO1xuXHQgICAgICAgIH1cblx0ICAgIH0sIHtcblx0ICAgICAgICBrZXk6ICdyZW5kZXInLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAgICAgX3JlYWN0TW90aW9uLlRyYW5zaXRpb25Nb3Rpb24sXG5cdCAgICAgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiB0aGlzLmdldFN0eWxlcy5iaW5kKHRoaXMpKCksXG5cdCAgICAgICAgICAgICAgICAgICAgd2lsbEVudGVyOiB0aGlzLndpbGxFbnRlci5iaW5kKHRoaXMpLFxuXHQgICAgICAgICAgICAgICAgICAgIHdpbGxMZWF2ZTogdGhpcy53aWxsTGVhdmUuYmluZCh0aGlzKSB9LFxuXHQgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlcykge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAgICAgICAgICAgICAgICAgJ2RpdicsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAnY2xpbWJfX3dhbGwnIH0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlcykubWFwKGZ1bmN0aW9uIChrZXkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtVmFsdWVzID0gdmFsdWVzW2tleV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnJlbmRlclRpbGUoa2V5LCBpdGVtVmFsdWVzKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgICAgICApO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICApO1xuXHQgICAgICAgIH1cblx0ICAgIH1dLCBbe1xuXHQgICAgICAgIGtleTogJ3Byb3BUeXBlcycsXG5cdCAgICAgICAgdmFsdWU6IHtcblx0ICAgICAgICAgICAgaXRlbXM6IF9yZWFjdC5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGVudW1lcmFibGU6IHRydWVcblx0ICAgIH1dKTtcblx0XG5cdCAgICByZXR1cm4gV2FsbDtcblx0fSkoX3JlYWN0LkNvbXBvbmVudCk7XG5cdFxuXHRleHBvcnRzWydkZWZhdWx0J10gPSBXYWxsO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSxcbi8qIDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIFtzdGlmZm5lc3MsIGRhbXBpbmddXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB7XG5cdCAgbm9Xb2JibGU6IFsxNzAsIDI2XSwgLy8gdGhlIGRlZmF1bHRcblx0ICBnZW50bGU6IFsxMjAsIDE0XSxcblx0ICB3b2JibHk6IFsxODAsIDEyXSxcblx0ICBzdGlmZjogWzIxMCwgMjBdXG5cdH07XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cbi8qKiovIH0sXG4vKiA1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24ocHJvY2Vzcykgey8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcblx0KGZ1bmN0aW9uKCkge1xuXHQgIHZhciBnZXROYW5vU2Vjb25kcywgaHJ0aW1lLCBsb2FkVGltZTtcblx0XG5cdCAgaWYgKCh0eXBlb2YgcGVyZm9ybWFuY2UgIT09IFwidW5kZWZpbmVkXCIgJiYgcGVyZm9ybWFuY2UgIT09IG51bGwpICYmIHBlcmZvcm1hbmNlLm5vdykge1xuXHQgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuXHQgICAgfTtcblx0ICB9IGVsc2UgaWYgKCh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzICE9PSBudWxsKSAmJiBwcm9jZXNzLmhydGltZSkge1xuXHQgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgcmV0dXJuIChnZXROYW5vU2Vjb25kcygpIC0gbG9hZFRpbWUpIC8gMWU2O1xuXHQgICAgfTtcblx0ICAgIGhydGltZSA9IHByb2Nlc3MuaHJ0aW1lO1xuXHQgICAgZ2V0TmFub1NlY29uZHMgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgdmFyIGhyO1xuXHQgICAgICBociA9IGhydGltZSgpO1xuXHQgICAgICByZXR1cm4gaHJbMF0gKiAxZTkgKyBoclsxXTtcblx0ICAgIH07XG5cdCAgICBsb2FkVGltZSA9IGdldE5hbm9TZWNvbmRzKCk7XG5cdCAgfSBlbHNlIGlmIChEYXRlLm5vdykge1xuXHQgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBsb2FkVGltZTtcblx0ICAgIH07XG5cdCAgICBsb2FkVGltZSA9IERhdGUubm93KCk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGxvYWRUaW1lO1xuXHQgICAgfTtcblx0ICAgIGxvYWRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cdCAgfVxuXHRcblx0fSkuY2FsbCh0aGlzKTtcblx0XG5cdC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpKSlcblxuLyoqKi8gfSxcbi8qIDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXHRcblx0dmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXHR2YXIgcXVldWUgPSBbXTtcblx0dmFyIGRyYWluaW5nID0gZmFsc2U7XG5cdHZhciBjdXJyZW50UXVldWU7XG5cdHZhciBxdWV1ZUluZGV4ID0gLTE7XG5cdFxuXHRmdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG5cdCAgICBkcmFpbmluZyA9IGZhbHNlO1xuXHQgICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcblx0ICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG5cdCAgICB9XG5cdCAgICBpZiAocXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgZHJhaW5RdWV1ZSgpO1xuXHQgICAgfVxuXHR9XG5cdFxuXHRmdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuXHQgICAgaWYgKGRyYWluaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG5cdCAgICBkcmFpbmluZyA9IHRydWU7XG5cdFxuXHQgICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICAgIHdoaWxlKGxlbikge1xuXHQgICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuXHQgICAgICAgIHF1ZXVlID0gW107XG5cdCAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuXHQgICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICAgIH1cblx0ICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG5cdCAgICBkcmFpbmluZyA9IGZhbHNlO1xuXHQgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHR9XG5cdFxuXHRwcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuXHQgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuXHQgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcblx0ICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG5cdCAgICAgICAgc2V0VGltZW91dChkcmFpblF1ZXVlLCAwKTtcblx0ICAgIH1cblx0fTtcblx0XG5cdC8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcblx0ZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG5cdCAgICB0aGlzLmZ1biA9IGZ1bjtcblx0ICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcblx0fVxuXHRJdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcblx0fTtcblx0cHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcblx0cHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcblx0cHJvY2Vzcy5lbnYgPSB7fTtcblx0cHJvY2Vzcy5hcmd2ID0gW107XG5cdHByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xuXHRwcm9jZXNzLnZlcnNpb25zID0ge307XG5cdFxuXHRmdW5jdGlvbiBub29wKCkge31cblx0XG5cdHByb2Nlc3Mub24gPSBub29wO1xuXHRwcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcblx0cHJvY2Vzcy5vbmNlID0gbm9vcDtcblx0cHJvY2Vzcy5vZmYgPSBub29wO1xuXHRwcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xuXHRwcm9jZXNzLmVtaXQgPSBub29wO1xuXHRcblx0cHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0XG5cdHByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5cdHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuXHR9O1xuXHRwcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cbi8qKiovIH0sXG4vKiA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgICAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgZGVzYyA9IHBhcmVudCA9IGdldHRlciA9IHVuZGVmaW5lZDsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXHRcblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblx0XG5cdGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXHRcblx0dmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblx0XG5cdHZhciBBdXRob3IgPSAoZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcblx0ICAgIF9pbmhlcml0cyhBdXRob3IsIF9SZWFjdCRDb21wb25lbnQpO1xuXHRcblx0ICAgIGZ1bmN0aW9uIEF1dGhvcigpIHtcblx0ICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXV0aG9yKTtcblx0XG5cdCAgICAgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQXV0aG9yLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH1cblx0XG5cdCAgICBfY3JlYXRlQ2xhc3MoQXV0aG9yLCBbe1xuXHQgICAgICAgIGtleTogXCJyZW5kZXJcIixcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHRcblx0ICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAgICAgICBcImFcIixcblx0ICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcImNsaW1iX190aWxlX19hdXRob3JcIixcblx0ICAgICAgICAgICAgICAgICAgICBocmVmOiB0aGlzLnByb3BzLmxpbmsgfSxcblx0ICAgICAgICAgICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwgeyBzcmM6IHRoaXMucHJvcHMucGljdHVyZSxcblx0ICAgICAgICAgICAgICAgICAgICBhbHQ6IFwiUHJvZmlsZSBwaWMgb2YgXCIgKyB0aGlzLnByb3BzLm5hbWUgfSksXG5cdCAgICAgICAgICAgICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAgICAgICAgIFwiaDRcIixcblx0ICAgICAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJjbGltYl9fdGlsZV9fYXV0aG9yX191c2VybmFtZVwiIH0sXG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy51c2VybmFtZVxuXHQgICAgICAgICAgICAgICAgKVxuXHQgICAgICAgICAgICApO1xuXHQgICAgICAgIH1cblx0ICAgIH1dKTtcblx0XG5cdCAgICByZXR1cm4gQXV0aG9yO1xuXHR9KShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXHRcblx0QXV0aG9yLnByb3BUeXBlcyA9IHt9O1xuXHRcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBBdXRob3I7XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cbi8qKiovIH0sXG4vKiA4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdCAgICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgZGVzYyA9IHBhcmVudCA9IGdldHRlciA9IHVuZGVmaW5lZDsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cdFxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblx0XG5cdGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cdFxuXHR2YXIgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXHRcblx0dmFyIENsaW1iQmFkZ2UgPSAoZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcblx0ICAgIF9pbmhlcml0cyhDbGltYkJhZGdlLCBfQ29tcG9uZW50KTtcblx0XG5cdCAgICBmdW5jdGlvbiBDbGltYkJhZGdlKCkge1xuXHQgICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDbGltYkJhZGdlKTtcblx0XG5cdCAgICAgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ2xpbWJCYWRnZS5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgfVxuXHRcblx0ICAgIF9jcmVhdGVDbGFzcyhDbGltYkJhZGdlLCBbe1xuXHQgICAgICAgIGtleTogJ3JlbmRlcicsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0XG5cdCAgICAgICAgICAgIHZhciBsb2dvID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMyk7XG5cdFxuXHQgICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2EnLCB7IGhyZWY6ICdodHRwOi8vY2xpbWIuc29jaWFsLycsXG5cdCAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdjbGltYi1zb2NpYWwtYmFkZ2UnLFxuXHQgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiBsb2dvIH0gfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfV0pO1xuXHRcblx0ICAgIHJldHVybiBDbGltYkJhZGdlO1xuXHR9KShfcmVhY3QuQ29tcG9uZW50KTtcblx0XG5cdGV4cG9ydHNbJ2RlZmF1bHQnXSA9IENsaW1iQmFkZ2U7XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9LFxuLyogOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICAgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IGRlc2MgPSBwYXJlbnQgPSBnZXR0ZXIgPSB1bmRlZmluZWQ7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblx0XG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cdFxuXHRmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblx0XG5cdHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cdFxuXHR2YXIgSW1hZ2UgPSAoZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcblx0ICAgIF9pbmhlcml0cyhJbWFnZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cdFxuXHQgICAgZnVuY3Rpb24gSW1hZ2UoKSB7XG5cdCAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEltYWdlKTtcblx0XG5cdCAgICAgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoSW1hZ2UucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgfVxuXHRcblx0ICAgIF9jcmVhdGVDbGFzcyhJbWFnZSwgW3tcblx0ICAgICAgICBrZXk6IFwicmVuZGVyXCIsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwgeyBjbGFzc05hbWU6IFwiY2xpbWJfX3RpbGVfX2ltYWdlXCIsXG5cdCAgICAgICAgICAgICAgICBzcmM6IHRoaXMucHJvcHMuc3JjLCBcImRhdGEtd2lkdGhcIjogdGhpcy5wcm9wcy53aWR0aCwgXCJkYXRhLWhlaWdodFwiOiB0aGlzLnByb3BzLmhlaWdodCB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9XSk7XG5cdFxuXHQgICAgcmV0dXJuIEltYWdlO1xuXHR9KShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXHRcblx0SW1hZ2UucHJvcFR5cGVzID0ge1xuXHQgICAgc3JjOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG5cdCAgICB3aWR0aDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLm51bWJlcixcblx0ICAgIGhlaWdodDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLm51bWJlclxuXHR9O1xuXHRcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBJbWFnZTtcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSxcbi8qIDEwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgICAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgZGVzYyA9IHBhcmVudCA9IGdldHRlciA9IHVuZGVmaW5lZDsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXHRcblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblx0XG5cdGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXHRcblx0dmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblx0XG5cdHZhciBNZXNzYWdlID0gKGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG5cdCAgICBfaW5oZXJpdHMoTWVzc2FnZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cdFxuXHQgICAgZnVuY3Rpb24gTWVzc2FnZSgpIHtcblx0ICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVzc2FnZSk7XG5cdFxuXHQgICAgICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKE1lc3NhZ2UucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgfVxuXHRcblx0ICAgIF9jcmVhdGVDbGFzcyhNZXNzYWdlLCBbe1xuXHQgICAgICAgIGtleTogXCJyZW5kZXJcIixcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJjbGltYl9fdGlsZV9fbWVzc2FnZVwiLFxuXHQgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiB0aGlzLnByb3BzLmJvZHkgfSB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9XSk7XG5cdFxuXHQgICAgcmV0dXJuIE1lc3NhZ2U7XG5cdH0pKF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNvbXBvbmVudCk7XG5cdFxuXHRNZXNzYWdlLnByb3BUeXBlcyA9IHtcblx0ICAgIGJvZHk6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuXHR9O1xuXHRcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBNZXNzYWdlO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9LFxuLyogMTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0ICAgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBkZXNjID0gcGFyZW50ID0gZ2V0dGVyID0gdW5kZWZpbmVkOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblx0XG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXHRcblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblx0XG5cdHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cdFxuXHR2YXIgX2NsaW1iU29jaWFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cdFxuXHR2YXIgX2NsaW1iU29jaWFsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsaW1iU29jaWFsKTtcblx0XG5cdHZhciBfV2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cdFxuXHR2YXIgX1dhbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfV2FsbCk7XG5cdFxuXHR2YXIgX0NsaW1iQmFkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXHRcblx0dmFyIF9DbGltYkJhZGdlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaW1iQmFkZ2UpO1xuXHRcblx0dmFyIFdhbGxDb250YWluZXIgPSAoZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcblx0ICAgIF9pbmhlcml0cyhXYWxsQ29udGFpbmVyLCBfQ29tcG9uZW50KTtcblx0XG5cdCAgICBmdW5jdGlvbiBXYWxsQ29udGFpbmVyKHByb3BzKSB7XG5cdCAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdhbGxDb250YWluZXIpO1xuXHRcblx0ICAgICAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihXYWxsQ29udGFpbmVyLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmNhbGwodGhpcywgcHJvcHMpO1xuXHQgICAgICAgIHRoaXMuc3RhdGUgPSB7XG5cdCAgICAgICAgICAgIGl0ZW1zOiB7fVxuXHQgICAgICAgIH07XG5cdCAgICB9XG5cdFxuXHQgICAgX2NyZWF0ZUNsYXNzKFdhbGxDb250YWluZXIsIFt7XG5cdCAgICAgICAga2V5OiAnaW5pdCcsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG5cdCAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICAgICAgICBpZiAoIXRoaXMucHJvcHMuY29sbGVjdGlvbklkKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblx0XG5cdCAgICAgICAgICAgIF9jbGltYlNvY2lhbDJbJ2RlZmF1bHQnXS5nZXRTdHJlYW0odGhpcy5wcm9wcy5jb2xsZWN0aW9uSWQpLnN1YnNjcmliZShmdW5jdGlvbiAoaXRlbXMpIHtcblx0XG5cdCAgICAgICAgICAgICAgICB2YXIgbWF4U2l6ZSA9IHBhcnNlSW50KF90aGlzLnByb3BzLmxpbWl0LCAwKTtcblx0XG5cdCAgICAgICAgICAgICAgICB2YXIgbWFwcGVkSXRlbXMgPSB7fTtcblx0ICAgICAgICAgICAgICAgIGl0ZW1zLnNwbGljZSgwLCBtYXhTaXplKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcblx0ICAgICAgICAgICAgICAgICAgICBtYXBwZWRJdGVtc1tpdGVtLmlkXSA9IGl0ZW07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG5cdCAgICAgICAgICAgICAgICAgICAgaXRlbXM6IG1hcHBlZEl0ZW1zXG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSwge1xuXHQgICAgICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50Jyxcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0sIHtcblx0ICAgICAgICBrZXk6ICdjb21wb25lbnREaWRVcGRhdGUnLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG5cdCAgICAgICAgICAgIHZhciBjYiA9IHVuZGVmaW5lZDtcblx0ICAgICAgICAgICAgaWYgKHdpbmRvdy5DbGltYiAmJiB3aW5kb3cuQ2xpbWIub25VcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIGNiID0gd2luZG93LkNsaW1iLm9uVXBkYXRlO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gbm9vcFxuXHQgICAgICAgICAgICAgICAgY2IgPSBmdW5jdGlvbiAoKSB7fTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYigpO1xuXHQgICAgICAgIH1cblx0ICAgIH0sIHtcblx0ICAgICAgICBrZXk6ICdyZW5kZXInLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAgICAgICAgICdkaXYnLFxuXHQgICAgICAgICAgICAgICAgbnVsbCxcblx0ICAgICAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9XYWxsMlsnZGVmYXVsdCddLCB7IGl0ZW1zOiB0aGlzLnN0YXRlLml0ZW1zIH0pLFxuXHQgICAgICAgICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX0NsaW1iQmFkZ2UyWydkZWZhdWx0J10sIG51bGwpXG5cdCAgICAgICAgICAgICk7XG5cdCAgICAgICAgfVxuXHQgICAgfV0sIFt7XG5cdCAgICAgICAga2V5OiAncHJvcFR5cGVzJyxcblx0ICAgICAgICB2YWx1ZToge1xuXHQgICAgICAgICAgICBjb2xsZWN0aW9uSWQ6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG5cdCAgICAgICAgICAgIGxpbWl0OiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsIF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXSlcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGVudW1lcmFibGU6IHRydWVcblx0ICAgIH0sIHtcblx0ICAgICAgICBrZXk6ICdkZWZhdWx0UHJvcHMnLFxuXHQgICAgICAgIHZhbHVlOiB7XG5cdCAgICAgICAgICAgIGNvbGxlY3Rpb25JZDogJzU2MWJhNjM0NDUyODRlMTc0MGUwMTZmNycsXG5cdCAgICAgICAgICAgIGxpbWl0OiAzMFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuXHQgICAgfV0pO1xuXHRcblx0ICAgIHJldHVybiBXYWxsQ29udGFpbmVyO1xuXHR9KShfcmVhY3QuQ29tcG9uZW50KTtcblx0XG5cdGV4cG9ydHNbJ2RlZmF1bHQnXSA9IFdhbGxDb250YWluZXI7XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9LFxuLyogMTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0ICAgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXHRcblx0dmFyIF9yeExpdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0XG5cdHZhciBfZmV0Y2hKc29ucCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXHRcblx0dmFyIF9mZXRjaEpzb25wMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZldGNoSnNvbnApO1xuXHRcblx0dmFyIGdldFN0cmVhbSA9IGZ1bmN0aW9uIGdldFN0cmVhbShjb2xsZWN0aW9uSWQpIHtcblx0XG5cdCAgICB2YXIgcG9sbFJhdGUgPSA1ICogMTAwMDtcblx0XG5cdCAgICB2YXIgcmVxdWVzdFN0cmVhbSA9IF9yeExpdGUuT2JzZXJ2YWJsZS5qdXN0KCdodHRwOi8vYXBwLmNsaW1iLnNvY2lhbC9hcGkvdjEvY29sbGVjdGlvbnMvJyArIGNvbGxlY3Rpb25JZCk7XG5cdFxuXHQgICAgdmFyIHVwZGF0ZVN0cmVhbSA9IF9yeExpdGUuT2JzZXJ2YWJsZS5pbnRlcnZhbChwb2xsUmF0ZSkuc3RhcnRXaXRoKG51bGwpO1xuXHRcblx0ICAgIHZhciByZXNwb25zZVN0cmVhbSA9IHVwZGF0ZVN0cmVhbS5jb21iaW5lTGF0ZXN0KHJlcXVlc3RTdHJlYW0sIGZ1bmN0aW9uICh0aWNrLCB1cmwpIHtcblx0ICAgICAgICByZXR1cm4gdXJsO1xuXHQgICAgfSkuZmxhdE1hcChmdW5jdGlvbiAoYmFzZVVybCkge1xuXHRcblx0ICAgICAgICB2YXIgcmVxdWVzdFVybCA9ICcnICsgYmFzZVVybDtcblx0XG5cdCAgICAgICAgcmV0dXJuIF9yeExpdGUuT2JzZXJ2YWJsZS5mcm9tUHJvbWlzZSgoMCwgX2ZldGNoSnNvbnAyWydkZWZhdWx0J10pKHJlcXVlc3RVcmwpLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHJlc3AuanNvbigpO1xuXHQgICAgICAgIH0pKTtcblx0ICAgIH0pO1xuXHRcblx0ICAgIHJldHVybiByZXNwb25zZVN0cmVhbTtcblx0fTtcblx0XG5cdGV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcblx0ICAgIGdldFN0cmVhbTogZ2V0U3RyZWFtXG5cdH07XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKiovIH0sXG4vKiAxMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fOy8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLyhmdW5jdGlvbihtb2R1bGUsIGdsb2JhbCwgcHJvY2Vzcykgey8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0LCBBbGwgcmlnaHRzIHJlc2VydmVkLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblx0XG5cdDsoZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuXHRcblx0ICB2YXIgb2JqZWN0VHlwZXMgPSB7XG5cdCAgICAnZnVuY3Rpb24nOiB0cnVlLFxuXHQgICAgJ29iamVjdCc6IHRydWVcblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBjaGVja0dsb2JhbCh2YWx1ZSkge1xuXHQgICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZS5PYmplY3QgPT09IE9iamVjdCkgPyB2YWx1ZSA6IG51bGw7XG5cdCAgfVxuXHRcblx0ICB2YXIgZnJlZUV4cG9ydHMgPSAob2JqZWN0VHlwZXNbdHlwZW9mIGV4cG9ydHNdICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUpID8gZXhwb3J0cyA6IG51bGw7XG5cdCAgdmFyIGZyZWVNb2R1bGUgPSAob2JqZWN0VHlwZXNbdHlwZW9mIG1vZHVsZV0gJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUpID8gbW9kdWxlIDogbnVsbDtcblx0ICB2YXIgZnJlZUdsb2JhbCA9IGNoZWNrR2xvYmFsKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUgJiYgdHlwZW9mIGdsb2JhbCA9PT0gJ29iamVjdCcgJiYgZ2xvYmFsKTtcblx0ICB2YXIgZnJlZVNlbGYgPSBjaGVja0dsb2JhbChvYmplY3RUeXBlc1t0eXBlb2Ygc2VsZl0gJiYgc2VsZik7XG5cdCAgdmFyIGZyZWVXaW5kb3cgPSBjaGVja0dsb2JhbChvYmplY3RUeXBlc1t0eXBlb2Ygd2luZG93XSAmJiB3aW5kb3cpO1xuXHQgIHZhciBtb2R1bGVFeHBvcnRzID0gKGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cykgPyBmcmVlRXhwb3J0cyA6IG51bGw7XG5cdCAgdmFyIHRoaXNHbG9iYWwgPSBjaGVja0dsb2JhbChvYmplY3RUeXBlc1t0eXBlb2YgdGhpc10gJiYgdGhpcyk7XG5cdCAgdmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8ICgoZnJlZVdpbmRvdyAhPT0gKHRoaXNHbG9iYWwgJiYgdGhpc0dsb2JhbC53aW5kb3cpKSAmJiBmcmVlV2luZG93KSB8fCBmcmVlU2VsZiB8fCB0aGlzR2xvYmFsIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdFxuXHQgIHZhciBSeCA9IHtcblx0ICAgIGludGVybmFsczoge30sXG5cdCAgICBjb25maWc6IHtcblx0ICAgICAgUHJvbWlzZTogcm9vdC5Qcm9taXNlXG5cdCAgICB9LFxuXHQgICAgaGVscGVyczogeyB9XG5cdCAgfTtcblx0XG5cdCAgLy8gRGVmYXVsdHNcblx0ICB2YXIgbm9vcCA9IFJ4LmhlbHBlcnMubm9vcCA9IGZ1bmN0aW9uICgpIHsgfSxcblx0ICAgIGlkZW50aXR5ID0gUnguaGVscGVycy5pZGVudGl0eSA9IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4OyB9LFxuXHQgICAgZGVmYXVsdE5vdyA9IFJ4LmhlbHBlcnMuZGVmYXVsdE5vdyA9IERhdGUubm93LFxuXHQgICAgZGVmYXVsdENvbXBhcmVyID0gUnguaGVscGVycy5kZWZhdWx0Q29tcGFyZXIgPSBmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4gaXNFcXVhbCh4LCB5KTsgfSxcblx0ICAgIGRlZmF1bHRTdWJDb21wYXJlciA9IFJ4LmhlbHBlcnMuZGVmYXVsdFN1YkNvbXBhcmVyID0gZnVuY3Rpb24gKHgsIHkpIHsgcmV0dXJuIHggPiB5ID8gMSA6ICh4IDwgeSA/IC0xIDogMCk7IH0sXG5cdCAgICBkZWZhdWx0S2V5U2VyaWFsaXplciA9IFJ4LmhlbHBlcnMuZGVmYXVsdEtleVNlcmlhbGl6ZXIgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4geC50b1N0cmluZygpOyB9LFxuXHQgICAgZGVmYXVsdEVycm9yID0gUnguaGVscGVycy5kZWZhdWx0RXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7IHRocm93IGVycjsgfSxcblx0ICAgIGlzUHJvbWlzZSA9IFJ4LmhlbHBlcnMuaXNQcm9taXNlID0gZnVuY3Rpb24gKHApIHsgcmV0dXJuICEhcCAmJiB0eXBlb2YgcC5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHAudGhlbiA9PT0gJ2Z1bmN0aW9uJzsgfSxcblx0ICAgIGlzRnVuY3Rpb24gPSBSeC5oZWxwZXJzLmlzRnVuY3Rpb24gPSAoZnVuY3Rpb24gKCkge1xuXHRcblx0ICAgICAgdmFyIGlzRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgfHwgZmFsc2U7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIC8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuXHQgICAgICBpZiAoaXNGbigveC8pKSB7XG5cdCAgICAgICAgaXNGbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgJiYgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblx0ICAgICAgICB9O1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gaXNGbjtcblx0ICAgIH0oKSk7XG5cdFxuXHQgICAgZnVuY3Rpb24gY2xvbmVBcnJheShhcnIpIHtcblx0ICAgICAgdmFyIGxlbiA9IGFyci5sZW5ndGgsIGEgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFbaV0gPSBhcnJbaV07IH1cblx0ICAgICAgcmV0dXJuIGE7XG5cdCAgICB9XG5cdFxuXHQgIHZhciBlcnJvck9iaiA9IHtlOiB7fX07XG5cdCAgXG5cdCAgZnVuY3Rpb24gdHJ5Q2F0Y2hlckdlbih0cnlDYXRjaFRhcmdldCkge1xuXHQgICAgcmV0dXJuIGZ1bmN0aW9uIHRyeUNhdGNoZXIoKSB7XG5cdCAgICAgIHRyeSB7XG5cdCAgICAgICAgcmV0dXJuIHRyeUNhdGNoVGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICBlcnJvck9iai5lID0gZTtcblx0ICAgICAgICByZXR1cm4gZXJyb3JPYmo7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfVxuXHRcblx0ICB2YXIgdHJ5Q2F0Y2ggPSBSeC5pbnRlcm5hbHMudHJ5Q2F0Y2ggPSBmdW5jdGlvbiB0cnlDYXRjaChmbikge1xuXHQgICAgaWYgKCFpc0Z1bmN0aW9uKGZuKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdmbiBtdXN0IGJlIGEgZnVuY3Rpb24nKTsgfVxuXHQgICAgcmV0dXJuIHRyeUNhdGNoZXJHZW4oZm4pO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIHRocm93ZXIoZSkge1xuXHQgICAgdGhyb3cgZTtcblx0ICB9XG5cdFxuXHQgIFJ4LmNvbmZpZy5sb25nU3RhY2tTdXBwb3J0ID0gZmFsc2U7XG5cdCAgdmFyIGhhc1N0YWNrcyA9IGZhbHNlLCBzdGFja3MgPSB0cnlDYXRjaChmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBFcnJvcigpOyB9KSgpO1xuXHQgIGhhc1N0YWNrcyA9ICEhc3RhY2tzLmUgJiYgISFzdGFja3MuZS5zdGFjaztcblx0XG5cdCAgLy8gQWxsIGNvZGUgYWZ0ZXIgdGhpcyBwb2ludCB3aWxsIGJlIGZpbHRlcmVkIGZyb20gc3RhY2sgdHJhY2VzIHJlcG9ydGVkIGJ5IFJ4SlNcblx0ICB2YXIgclN0YXJ0aW5nTGluZSA9IGNhcHR1cmVMaW5lKCksIHJGaWxlTmFtZTtcblx0XG5cdCAgdmFyIFNUQUNLX0pVTVBfU0VQQVJBVE9SID0gJ0Zyb20gcHJldmlvdXMgZXZlbnQ6Jztcblx0XG5cdCAgZnVuY3Rpb24gbWFrZVN0YWNrVHJhY2VMb25nKGVycm9yLCBvYnNlcnZhYmxlKSB7XG5cdCAgICAvLyBJZiBwb3NzaWJsZSwgdHJhbnNmb3JtIHRoZSBlcnJvciBzdGFjayB0cmFjZSBieSByZW1vdmluZyBOb2RlIGFuZCBSeEpTXG5cdCAgICAvLyBjcnVmdCwgdGhlbiBjb25jYXRlbmF0aW5nIHdpdGggdGhlIHN0YWNrIHRyYWNlIG9mIGBvYnNlcnZhYmxlYC5cblx0ICAgIGlmIChoYXNTdGFja3MgJiZcblx0ICAgICAgICBvYnNlcnZhYmxlLnN0YWNrICYmXG5cdCAgICAgICAgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJlxuXHQgICAgICAgIGVycm9yICE9PSBudWxsICYmXG5cdCAgICAgICAgZXJyb3Iuc3RhY2sgJiZcblx0ICAgICAgICBlcnJvci5zdGFjay5pbmRleE9mKFNUQUNLX0pVTVBfU0VQQVJBVE9SKSA9PT0gLTFcblx0ICAgICkge1xuXHQgICAgICB2YXIgc3RhY2tzID0gW107XG5cdCAgICAgIGZvciAodmFyIG8gPSBvYnNlcnZhYmxlOyAhIW87IG8gPSBvLnNvdXJjZSkge1xuXHQgICAgICAgIGlmIChvLnN0YWNrKSB7XG5cdCAgICAgICAgICBzdGFja3MudW5zaGlmdChvLnN0YWNrKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgc3RhY2tzLnVuc2hpZnQoZXJyb3Iuc3RhY2spO1xuXHRcblx0ICAgICAgdmFyIGNvbmNhdGVkU3RhY2tzID0gc3RhY2tzLmpvaW4oJ1xcbicgKyBTVEFDS19KVU1QX1NFUEFSQVRPUiArICdcXG4nKTtcblx0ICAgICAgZXJyb3Iuc3RhY2sgPSBmaWx0ZXJTdGFja1N0cmluZyhjb25jYXRlZFN0YWNrcyk7XG5cdCAgICB9XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiBmaWx0ZXJTdGFja1N0cmluZyhzdGFja1N0cmluZykge1xuXHQgICAgdmFyIGxpbmVzID0gc3RhY2tTdHJpbmcuc3BsaXQoJ1xcbicpLCBkZXNpcmVkTGluZXMgPSBbXTtcblx0ICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICB2YXIgbGluZSA9IGxpbmVzW2ldO1xuXHRcblx0ICAgICAgaWYgKCFpc0ludGVybmFsRnJhbWUobGluZSkgJiYgIWlzTm9kZUZyYW1lKGxpbmUpICYmIGxpbmUpIHtcblx0ICAgICAgICBkZXNpcmVkTGluZXMucHVzaChsaW5lKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIGRlc2lyZWRMaW5lcy5qb2luKCdcXG4nKTtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIGlzSW50ZXJuYWxGcmFtZShzdGFja0xpbmUpIHtcblx0ICAgIHZhciBmaWxlTmFtZUFuZExpbmVOdW1iZXIgPSBnZXRGaWxlTmFtZUFuZExpbmVOdW1iZXIoc3RhY2tMaW5lKTtcblx0ICAgIGlmICghZmlsZU5hbWVBbmRMaW5lTnVtYmVyKSB7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICAgIHZhciBmaWxlTmFtZSA9IGZpbGVOYW1lQW5kTGluZU51bWJlclswXSwgbGluZU51bWJlciA9IGZpbGVOYW1lQW5kTGluZU51bWJlclsxXTtcblx0XG5cdCAgICByZXR1cm4gZmlsZU5hbWUgPT09IHJGaWxlTmFtZSAmJlxuXHQgICAgICBsaW5lTnVtYmVyID49IHJTdGFydGluZ0xpbmUgJiZcblx0ICAgICAgbGluZU51bWJlciA8PSByRW5kaW5nTGluZTtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIGlzTm9kZUZyYW1lKHN0YWNrTGluZSkge1xuXHQgICAgcmV0dXJuIHN0YWNrTGluZS5pbmRleE9mKCcobW9kdWxlLmpzOicpICE9PSAtMSB8fFxuXHQgICAgICBzdGFja0xpbmUuaW5kZXhPZignKG5vZGUuanM6JykgIT09IC0xO1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gY2FwdHVyZUxpbmUoKSB7XG5cdCAgICBpZiAoIWhhc1N0YWNrcykgeyByZXR1cm47IH1cblx0XG5cdCAgICB0cnkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgdmFyIGxpbmVzID0gZS5zdGFjay5zcGxpdCgnXFxuJyk7XG5cdCAgICAgIHZhciBmaXJzdExpbmUgPSBsaW5lc1swXS5pbmRleE9mKCdAJykgPiAwID8gbGluZXNbMV0gOiBsaW5lc1syXTtcblx0ICAgICAgdmFyIGZpbGVOYW1lQW5kTGluZU51bWJlciA9IGdldEZpbGVOYW1lQW5kTGluZU51bWJlcihmaXJzdExpbmUpO1xuXHQgICAgICBpZiAoIWZpbGVOYW1lQW5kTGluZU51bWJlcikgeyByZXR1cm47IH1cblx0XG5cdCAgICAgIHJGaWxlTmFtZSA9IGZpbGVOYW1lQW5kTGluZU51bWJlclswXTtcblx0ICAgICAgcmV0dXJuIGZpbGVOYW1lQW5kTGluZU51bWJlclsxXTtcblx0ICAgIH1cblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIGdldEZpbGVOYW1lQW5kTGluZU51bWJlcihzdGFja0xpbmUpIHtcblx0ICAgIC8vIE5hbWVkIGZ1bmN0aW9uczogJ2F0IGZ1bmN0aW9uTmFtZSAoZmlsZW5hbWU6bGluZU51bWJlcjpjb2x1bW5OdW1iZXIpJ1xuXHQgICAgdmFyIGF0dGVtcHQxID0gL2F0IC4rIFxcKCguKyk6KFxcZCspOig/OlxcZCspXFwpJC8uZXhlYyhzdGFja0xpbmUpO1xuXHQgICAgaWYgKGF0dGVtcHQxKSB7IHJldHVybiBbYXR0ZW1wdDFbMV0sIE51bWJlcihhdHRlbXB0MVsyXSldOyB9XG5cdFxuXHQgICAgLy8gQW5vbnltb3VzIGZ1bmN0aW9uczogJ2F0IGZpbGVuYW1lOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyJ1xuXHQgICAgdmFyIGF0dGVtcHQyID0gL2F0IChbXiBdKyk6KFxcZCspOig/OlxcZCspJC8uZXhlYyhzdGFja0xpbmUpO1xuXHQgICAgaWYgKGF0dGVtcHQyKSB7IHJldHVybiBbYXR0ZW1wdDJbMV0sIE51bWJlcihhdHRlbXB0MlsyXSldOyB9XG5cdFxuXHQgICAgLy8gRmlyZWZveCBzdHlsZTogJ2Z1bmN0aW9uQGZpbGVuYW1lOmxpbmVOdW1iZXIgb3IgQGZpbGVuYW1lOmxpbmVOdW1iZXInXG5cdCAgICB2YXIgYXR0ZW1wdDMgPSAvLipAKC4rKTooXFxkKykkLy5leGVjKHN0YWNrTGluZSk7XG5cdCAgICBpZiAoYXR0ZW1wdDMpIHsgcmV0dXJuIFthdHRlbXB0M1sxXSwgTnVtYmVyKGF0dGVtcHQzWzJdKV07IH1cblx0ICB9XG5cdFxuXHQgIHZhciBFbXB0eUVycm9yID0gUnguRW1wdHlFcnJvciA9IGZ1bmN0aW9uKCkge1xuXHQgICAgdGhpcy5tZXNzYWdlID0gJ1NlcXVlbmNlIGNvbnRhaW5zIG5vIGVsZW1lbnRzLic7XG5cdCAgICBFcnJvci5jYWxsKHRoaXMpO1xuXHQgIH07XG5cdCAgRW1wdHlFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5cdCAgRW1wdHlFcnJvci5wcm90b3R5cGUubmFtZSA9ICdFbXB0eUVycm9yJztcblx0XG5cdCAgdmFyIE9iamVjdERpc3Bvc2VkRXJyb3IgPSBSeC5PYmplY3REaXNwb3NlZEVycm9yID0gZnVuY3Rpb24oKSB7XG5cdCAgICB0aGlzLm1lc3NhZ2UgPSAnT2JqZWN0IGhhcyBiZWVuIGRpc3Bvc2VkJztcblx0ICAgIEVycm9yLmNhbGwodGhpcyk7XG5cdCAgfTtcblx0ICBPYmplY3REaXNwb3NlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcblx0ICBPYmplY3REaXNwb3NlZEVycm9yLnByb3RvdHlwZS5uYW1lID0gJ09iamVjdERpc3Bvc2VkRXJyb3InO1xuXHRcblx0ICB2YXIgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IgPSBSeC5Bcmd1bWVudE91dE9mUmFuZ2VFcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHRoaXMubWVzc2FnZSA9ICdBcmd1bWVudCBvdXQgb2YgcmFuZ2UnO1xuXHQgICAgRXJyb3IuY2FsbCh0aGlzKTtcblx0ICB9O1xuXHQgIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcblx0ICBBcmd1bWVudE91dE9mUmFuZ2VFcnJvci5wcm90b3R5cGUubmFtZSA9ICdBcmd1bWVudE91dE9mUmFuZ2VFcnJvcic7XG5cdFxuXHQgIHZhciBOb3RTdXBwb3J0ZWRFcnJvciA9IFJ4Lk5vdFN1cHBvcnRlZEVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcblx0ICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQnO1xuXHQgICAgRXJyb3IuY2FsbCh0aGlzKTtcblx0ICB9O1xuXHQgIE5vdFN1cHBvcnRlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcblx0ICBOb3RTdXBwb3J0ZWRFcnJvci5wcm90b3R5cGUubmFtZSA9ICdOb3RTdXBwb3J0ZWRFcnJvcic7XG5cdFxuXHQgIHZhciBOb3RJbXBsZW1lbnRlZEVycm9yID0gUnguTm90SW1wbGVtZW50ZWRFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdCAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdUaGlzIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQnO1xuXHQgICAgRXJyb3IuY2FsbCh0aGlzKTtcblx0ICB9O1xuXHQgIE5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuXHQgIE5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnTm90SW1wbGVtZW50ZWRFcnJvcic7XG5cdFxuXHQgIHZhciBub3RJbXBsZW1lbnRlZCA9IFJ4LmhlbHBlcnMubm90SW1wbGVtZW50ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBub3RTdXBwb3J0ZWQgPSBSeC5oZWxwZXJzLm5vdFN1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcigpO1xuXHQgIH07XG5cdFxuXHQgIC8vIFNoaW0gaW4gaXRlcmF0b3Igc3VwcG9ydFxuXHQgIHZhciAkaXRlcmF0b3IkID0gKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yKSB8fFxuXHQgICAgJ19lczZzaGltX2l0ZXJhdG9yXyc7XG5cdCAgLy8gQnVnIGZvciBtb3ppbGxhIHZlcnNpb25cblx0ICBpZiAocm9vdC5TZXQgJiYgdHlwZW9mIG5ldyByb290LlNldCgpWydAQGl0ZXJhdG9yJ10gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICRpdGVyYXRvciQgPSAnQEBpdGVyYXRvcic7XG5cdCAgfVxuXHRcblx0ICB2YXIgZG9uZUVudW1lcmF0b3IgPSBSeC5kb25lRW51bWVyYXRvciA9IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXHRcblx0ICB2YXIgaXNJdGVyYWJsZSA9IFJ4LmhlbHBlcnMuaXNJdGVyYWJsZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICByZXR1cm4gbyAmJiBvWyRpdGVyYXRvciRdICE9PSB1bmRlZmluZWQ7XG5cdCAgfTtcblx0XG5cdCAgdmFyIGlzQXJyYXlMaWtlID0gUnguaGVscGVycy5pc0FycmF5TGlrZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICByZXR1cm4gbyAmJiBvLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuXHQgIH07XG5cdFxuXHQgIFJ4LmhlbHBlcnMuaXRlcmF0b3IgPSAkaXRlcmF0b3IkO1xuXHRcblx0ICB2YXIgYmluZENhbGxiYWNrID0gUnguaW50ZXJuYWxzLmJpbmRDYWxsYmFjayA9IGZ1bmN0aW9uIChmdW5jLCB0aGlzQXJnLCBhcmdDb3VudCkge1xuXHQgICAgaWYgKHR5cGVvZiB0aGlzQXJnID09PSAndW5kZWZpbmVkJykgeyByZXR1cm4gZnVuYzsgfVxuXHQgICAgc3dpdGNoKGFyZ0NvdW50KSB7XG5cdCAgICAgIGNhc2UgMDpcblx0ICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpXG5cdCAgICAgICAgfTtcblx0ICAgICAgY2FzZSAxOlxuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHtcblx0ICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnKTtcblx0ICAgICAgICB9XG5cdCAgICAgIGNhc2UgMjpcblx0ICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7XG5cdCAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgY2FzZSAzOlxuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcblx0ICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcblx0ICAgICAgICB9O1xuXHQgICAgfVxuXHRcblx0ICAgIHJldHVybiBmdW5jdGlvbigpIHtcblx0ICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcblx0ICAgIH07XG5cdCAgfTtcblx0XG5cdCAgLyoqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHZhbHVlcyBhcmUgb2YgdGhlIGxhbmd1YWdlIHR5cGUgT2JqZWN0ICovXG5cdCAgdmFyIGRvbnRFbnVtcyA9IFsndG9TdHJpbmcnLFxuXHQgICAgJ3RvTG9jYWxlU3RyaW5nJyxcblx0ICAgICd2YWx1ZU9mJyxcblx0ICAgICdoYXNPd25Qcm9wZXJ0eScsXG5cdCAgICAnaXNQcm90b3R5cGVPZicsXG5cdCAgICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuXHQgICAgJ2NvbnN0cnVjdG9yJ10sXG5cdCAgZG9udEVudW1zTGVuZ3RoID0gZG9udEVudW1zLmxlbmd0aDtcblx0XG5cdCAgLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCBzaG9ydGN1dHMgKi9cblx0ICB2YXIgYXJnc0NsYXNzID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG5cdCAgICBhcnJheUNsYXNzID0gJ1tvYmplY3QgQXJyYXldJyxcblx0ICAgIGJvb2xDbGFzcyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcblx0ICAgIGRhdGVDbGFzcyA9ICdbb2JqZWN0IERhdGVdJyxcblx0ICAgIGVycm9yQ2xhc3MgPSAnW29iamVjdCBFcnJvcl0nLFxuXHQgICAgZnVuY0NsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcblx0ICAgIG51bWJlckNsYXNzID0gJ1tvYmplY3QgTnVtYmVyXScsXG5cdCAgICBvYmplY3RDbGFzcyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuXHQgICAgcmVnZXhwQ2xhc3MgPSAnW29iamVjdCBSZWdFeHBdJyxcblx0ICAgIHN0cmluZ0NsYXNzID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cdFxuXHQgIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG5cdCAgICBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksXG5cdCAgICBzdXBwb3J0c0FyZ3NDbGFzcyA9IHRvU3RyaW5nLmNhbGwoYXJndW1lbnRzKSA9PSBhcmdzQ2xhc3MsIC8vIEZvciBsZXNzIDxJRTkgJiYgRkY8NFxuXHQgICAgc3VwcG9ydE5vZGVDbGFzcyxcblx0ICAgIGVycm9yUHJvdG8gPSBFcnJvci5wcm90b3R5cGUsXG5cdCAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGUsXG5cdCAgICBzdHJpbmdQcm90byA9IFN0cmluZy5wcm90b3R5cGUsXG5cdCAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXHRcblx0ICB0cnkge1xuXHQgICAgc3VwcG9ydE5vZGVDbGFzcyA9ICEodG9TdHJpbmcuY2FsbChkb2N1bWVudCkgPT0gb2JqZWN0Q2xhc3MgJiYgISh7ICd0b1N0cmluZyc6IDAgfSArICcnKSk7XG5cdCAgfSBjYXRjaCAoZSkge1xuXHQgICAgc3VwcG9ydE5vZGVDbGFzcyA9IHRydWU7XG5cdCAgfVxuXHRcblx0ICB2YXIgbm9uRW51bVByb3BzID0ge307XG5cdCAgbm9uRW51bVByb3BzW2FycmF5Q2xhc3NdID0gbm9uRW51bVByb3BzW2RhdGVDbGFzc10gPSBub25FbnVtUHJvcHNbbnVtYmVyQ2xhc3NdID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9Mb2NhbGVTdHJpbmcnOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlLCAndmFsdWVPZic6IHRydWUgfTtcblx0ICBub25FbnVtUHJvcHNbYm9vbENsYXNzXSA9IG5vbkVudW1Qcm9wc1tzdHJpbmdDbGFzc10gPSB7ICdjb25zdHJ1Y3Rvcic6IHRydWUsICd0b1N0cmluZyc6IHRydWUsICd2YWx1ZU9mJzogdHJ1ZSB9O1xuXHQgIG5vbkVudW1Qcm9wc1tlcnJvckNsYXNzXSA9IG5vbkVudW1Qcm9wc1tmdW5jQ2xhc3NdID0gbm9uRW51bVByb3BzW3JlZ2V4cENsYXNzXSA9IHsgJ2NvbnN0cnVjdG9yJzogdHJ1ZSwgJ3RvU3RyaW5nJzogdHJ1ZSB9O1xuXHQgIG5vbkVudW1Qcm9wc1tvYmplY3RDbGFzc10gPSB7ICdjb25zdHJ1Y3Rvcic6IHRydWUgfTtcblx0XG5cdCAgdmFyIHN1cHBvcnQgPSB7fTtcblx0ICAoZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGN0b3IgPSBmdW5jdGlvbigpIHsgdGhpcy54ID0gMTsgfSxcblx0ICAgICAgcHJvcHMgPSBbXTtcblx0XG5cdCAgICBjdG9yLnByb3RvdHlwZSA9IHsgJ3ZhbHVlT2YnOiAxLCAneSc6IDEgfTtcblx0ICAgIGZvciAodmFyIGtleSBpbiBuZXcgY3RvcikgeyBwcm9wcy5wdXNoKGtleSk7IH1cblx0ICAgIGZvciAoa2V5IGluIGFyZ3VtZW50cykgeyB9XG5cdFxuXHQgICAgLy8gRGV0ZWN0IGlmIGBuYW1lYCBvciBgbWVzc2FnZWAgcHJvcGVydGllcyBvZiBgRXJyb3IucHJvdG90eXBlYCBhcmUgZW51bWVyYWJsZSBieSBkZWZhdWx0LlxuXHQgICAgc3VwcG9ydC5lbnVtRXJyb3JQcm9wcyA9IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZXJyb3JQcm90bywgJ21lc3NhZ2UnKSB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGVycm9yUHJvdG8sICduYW1lJyk7XG5cdFxuXHQgICAgLy8gRGV0ZWN0IGlmIGBwcm90b3R5cGVgIHByb3BlcnRpZXMgYXJlIGVudW1lcmFibGUgYnkgZGVmYXVsdC5cblx0ICAgIHN1cHBvcnQuZW51bVByb3RvdHlwZXMgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGN0b3IsICdwcm90b3R5cGUnKTtcblx0XG5cdCAgICAvLyBEZXRlY3QgaWYgYGFyZ3VtZW50c2Agb2JqZWN0IGluZGV4ZXMgYXJlIG5vbi1lbnVtZXJhYmxlXG5cdCAgICBzdXBwb3J0Lm5vbkVudW1BcmdzID0ga2V5ICE9IDA7XG5cdFxuXHQgICAgLy8gRGV0ZWN0IGlmIHByb3BlcnRpZXMgc2hhZG93aW5nIHRob3NlIG9uIGBPYmplY3QucHJvdG90eXBlYCBhcmUgbm9uLWVudW1lcmFibGUuXG5cdCAgICBzdXBwb3J0Lm5vbkVudW1TaGFkb3dzID0gIS92YWx1ZU9mLy50ZXN0KHByb3BzKTtcblx0ICB9KDEpKTtcblx0XG5cdCAgdmFyIGlzT2JqZWN0ID0gUnguaW50ZXJuYWxzLmlzT2JqZWN0ID0gZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXHQgICAgcmV0dXJuIHZhbHVlICYmICh0eXBlID09ICdmdW5jdGlvbicgfHwgdHlwZSA9PSAnb2JqZWN0JykgfHwgZmFsc2U7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuXHQgICAgdmFyIHJlc3VsdCA9IFtdO1xuXHQgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG5cdCAgICAgIHJldHVybiByZXN1bHQ7XG5cdCAgICB9XG5cdCAgICBpZiAoc3VwcG9ydC5ub25FbnVtQXJncyAmJiBvYmplY3QubGVuZ3RoICYmIGlzQXJndW1lbnRzKG9iamVjdCkpIHtcblx0ICAgICAgb2JqZWN0ID0gc2xpY2UuY2FsbChvYmplY3QpO1xuXHQgICAgfVxuXHQgICAgdmFyIHNraXBQcm90byA9IHN1cHBvcnQuZW51bVByb3RvdHlwZXMgJiYgdHlwZW9mIG9iamVjdCA9PSAnZnVuY3Rpb24nLFxuXHQgICAgICAgIHNraXBFcnJvclByb3BzID0gc3VwcG9ydC5lbnVtRXJyb3JQcm9wcyAmJiAob2JqZWN0ID09PSBlcnJvclByb3RvIHx8IG9iamVjdCBpbnN0YW5jZW9mIEVycm9yKTtcblx0XG5cdCAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG5cdCAgICAgIGlmICghKHNraXBQcm90byAmJiBrZXkgPT0gJ3Byb3RvdHlwZScpICYmXG5cdCAgICAgICAgICAhKHNraXBFcnJvclByb3BzICYmIChrZXkgPT0gJ21lc3NhZ2UnIHx8IGtleSA9PSAnbmFtZScpKSkge1xuXHQgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0XG5cdCAgICBpZiAoc3VwcG9ydC5ub25FbnVtU2hhZG93cyAmJiBvYmplY3QgIT09IG9iamVjdFByb3RvKSB7XG5cdCAgICAgIHZhciBjdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuXHQgICAgICAgICAgaW5kZXggPSAtMSxcblx0ICAgICAgICAgIGxlbmd0aCA9IGRvbnRFbnVtc0xlbmd0aDtcblx0XG5cdCAgICAgIGlmIChvYmplY3QgPT09IChjdG9yICYmIGN0b3IucHJvdG90eXBlKSkge1xuXHQgICAgICAgIHZhciBjbGFzc05hbWUgPSBvYmplY3QgPT09IHN0cmluZ1Byb3RvID8gc3RyaW5nQ2xhc3MgOiBvYmplY3QgPT09IGVycm9yUHJvdG8gPyBlcnJvckNsYXNzIDogdG9TdHJpbmcuY2FsbChvYmplY3QpLFxuXHQgICAgICAgICAgICBub25FbnVtID0gbm9uRW51bVByb3BzW2NsYXNzTmFtZV07XG5cdCAgICAgIH1cblx0ICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0ICAgICAgICBrZXkgPSBkb250RW51bXNbaW5kZXhdO1xuXHQgICAgICAgIGlmICghKG5vbkVudW0gJiYgbm9uRW51bVtrZXldKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuXHQgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiByZXN1bHQ7XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiBpbnRlcm5hbEZvcihvYmplY3QsIGNhbGxiYWNrLCBrZXlzRnVuYykge1xuXHQgICAgdmFyIGluZGV4ID0gLTEsXG5cdCAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcblx0ICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXHRcblx0ICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG5cdCAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG5cdCAgICAgIGlmIChjYWxsYmFjayhvYmplY3Rba2V5XSwga2V5LCBvYmplY3QpID09PSBmYWxzZSkge1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gb2JqZWN0O1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gaW50ZXJuYWxGb3JJbihvYmplY3QsIGNhbGxiYWNrKSB7XG5cdCAgICByZXR1cm4gaW50ZXJuYWxGb3Iob2JqZWN0LCBjYWxsYmFjaywga2V5c0luKTtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIGlzTm9kZSh2YWx1ZSkge1xuXHQgICAgLy8gSUUgPCA5IHByZXNlbnRzIERPTSBub2RlcyBhcyBgT2JqZWN0YCBvYmplY3RzIGV4Y2VwdCB0aGV5IGhhdmUgYHRvU3RyaW5nYFxuXHQgICAgLy8gbWV0aG9kcyB0aGF0IGFyZSBgdHlwZW9mYCBcInN0cmluZ1wiIGFuZCBzdGlsbCBjYW4gY29lcmNlIG5vZGVzIHRvIHN0cmluZ3Ncblx0ICAgIHJldHVybiB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKHZhbHVlICsgJycpID09ICdzdHJpbmcnO1xuXHQgIH1cblx0XG5cdCAgdmFyIGlzQXJndW1lbnRzID0gZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgIHJldHVybiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFyZ3NDbGFzcyA6IGZhbHNlO1xuXHQgIH1cblx0XG5cdCAgLy8gZmFsbGJhY2sgZm9yIGJyb3dzZXJzIHRoYXQgY2FuJ3QgZGV0ZWN0IGBhcmd1bWVudHNgIG9iamVjdHMgYnkgW1tDbGFzc11dXG5cdCAgaWYgKCFzdXBwb3J0c0FyZ3NDbGFzcykge1xuXHQgICAgaXNBcmd1bWVudHMgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JykgPyBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgOiBmYWxzZTtcblx0ICAgIH07XG5cdCAgfVxuXHRcblx0ICB2YXIgaXNFcXVhbCA9IFJ4LmludGVybmFscy5pc0VxdWFsID0gZnVuY3Rpb24gKHgsIHkpIHtcblx0ICAgIHJldHVybiBkZWVwRXF1YWxzKHgsIHksIFtdLCBbXSk7XG5cdCAgfTtcblx0XG5cdCAgLyoqIEBwcml2YXRlXG5cdCAgICogVXNlZCBmb3IgZGVlcCBjb21wYXJpc29uXG5cdCAgICoqL1xuXHQgIGZ1bmN0aW9uIGRlZXBFcXVhbHMoYSwgYiwgc3RhY2tBLCBzdGFja0IpIHtcblx0ICAgIC8vIGV4aXQgZWFybHkgZm9yIGlkZW50aWNhbCB2YWx1ZXNcblx0ICAgIGlmIChhID09PSBiKSB7XG5cdCAgICAgIC8vIHRyZWF0IGArMGAgdnMuIGAtMGAgYXMgbm90IGVxdWFsXG5cdCAgICAgIHJldHVybiBhICE9PSAwIHx8ICgxIC8gYSA9PSAxIC8gYik7XG5cdCAgICB9XG5cdFxuXHQgICAgdmFyIHR5cGUgPSB0eXBlb2YgYSxcblx0ICAgICAgICBvdGhlclR5cGUgPSB0eXBlb2YgYjtcblx0XG5cdCAgICAvLyBleGl0IGVhcmx5IGZvciB1bmxpa2UgcHJpbWl0aXZlIHZhbHVlc1xuXHQgICAgaWYgKGEgPT09IGEgJiYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwgfHxcblx0ICAgICAgICAodHlwZSAhPSAnZnVuY3Rpb24nICYmIHR5cGUgIT0gJ29iamVjdCcgJiYgb3RoZXJUeXBlICE9ICdmdW5jdGlvbicgJiYgb3RoZXJUeXBlICE9ICdvYmplY3QnKSkpIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHRcblx0ICAgIC8vIGNvbXBhcmUgW1tDbGFzc11dIG5hbWVzXG5cdCAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbChhKSxcblx0ICAgICAgICBvdGhlckNsYXNzID0gdG9TdHJpbmcuY2FsbChiKTtcblx0XG5cdCAgICBpZiAoY2xhc3NOYW1lID09IGFyZ3NDbGFzcykge1xuXHQgICAgICBjbGFzc05hbWUgPSBvYmplY3RDbGFzcztcblx0ICAgIH1cblx0ICAgIGlmIChvdGhlckNsYXNzID09IGFyZ3NDbGFzcykge1xuXHQgICAgICBvdGhlckNsYXNzID0gb2JqZWN0Q2xhc3M7XG5cdCAgICB9XG5cdCAgICBpZiAoY2xhc3NOYW1lICE9IG90aGVyQ2xhc3MpIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgICAgc3dpdGNoIChjbGFzc05hbWUpIHtcblx0ICAgICAgY2FzZSBib29sQ2xhc3M6XG5cdCAgICAgIGNhc2UgZGF0ZUNsYXNzOlxuXHQgICAgICAgIC8vIGNvZXJjZSBkYXRlcyBhbmQgYm9vbGVhbnMgdG8gbnVtYmVycywgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzIGFuZCBib29sZWFuc1xuXHQgICAgICAgIC8vIHRvIGAxYCBvciBgMGAgdHJlYXRpbmcgaW52YWxpZCBkYXRlcyBjb2VyY2VkIHRvIGBOYU5gIGFzIG5vdCBlcXVhbFxuXHQgICAgICAgIHJldHVybiArYSA9PSArYjtcblx0XG5cdCAgICAgIGNhc2UgbnVtYmVyQ2xhc3M6XG5cdCAgICAgICAgLy8gdHJlYXQgYE5hTmAgdnMuIGBOYU5gIGFzIGVxdWFsXG5cdCAgICAgICAgcmV0dXJuIChhICE9ICthKSA/XG5cdCAgICAgICAgICBiICE9ICtiIDpcblx0ICAgICAgICAgIC8vIGJ1dCB0cmVhdCBgLTBgIHZzLiBgKzBgIGFzIG5vdCBlcXVhbFxuXHQgICAgICAgICAgKGEgPT0gMCA/ICgxIC8gYSA9PSAxIC8gYikgOiBhID09ICtiKTtcblx0XG5cdCAgICAgIGNhc2UgcmVnZXhwQ2xhc3M6XG5cdCAgICAgIGNhc2Ugc3RyaW5nQ2xhc3M6XG5cdCAgICAgICAgLy8gY29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMC42LjQpXG5cdCAgICAgICAgLy8gdHJlYXQgc3RyaW5nIHByaW1pdGl2ZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGluc3RhbmNlcyBhcyBlcXVhbFxuXHQgICAgICAgIHJldHVybiBhID09IFN0cmluZyhiKTtcblx0ICAgIH1cblx0ICAgIHZhciBpc0FyciA9IGNsYXNzTmFtZSA9PSBhcnJheUNsYXNzO1xuXHQgICAgaWYgKCFpc0Fycikge1xuXHRcblx0ICAgICAgLy8gZXhpdCBmb3IgZnVuY3Rpb25zIGFuZCBET00gbm9kZXNcblx0ICAgICAgaWYgKGNsYXNzTmFtZSAhPSBvYmplY3RDbGFzcyB8fCAoIXN1cHBvcnQubm9kZUNsYXNzICYmIChpc05vZGUoYSkgfHwgaXNOb2RlKGIpKSkpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgLy8gaW4gb2xkZXIgdmVyc2lvbnMgb2YgT3BlcmEsIGBhcmd1bWVudHNgIG9iamVjdHMgaGF2ZSBgQXJyYXlgIGNvbnN0cnVjdG9yc1xuXHQgICAgICB2YXIgY3RvckEgPSAhc3VwcG9ydC5hcmdzT2JqZWN0ICYmIGlzQXJndW1lbnRzKGEpID8gT2JqZWN0IDogYS5jb25zdHJ1Y3Rvcixcblx0ICAgICAgICAgIGN0b3JCID0gIXN1cHBvcnQuYXJnc09iamVjdCAmJiBpc0FyZ3VtZW50cyhiKSA/IE9iamVjdCA6IGIuY29uc3RydWN0b3I7XG5cdFxuXHQgICAgICAvLyBub24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbFxuXHQgICAgICBpZiAoY3RvckEgIT0gY3RvckIgJiZcblx0ICAgICAgICAgICAgIShoYXNPd25Qcm9wZXJ0eS5jYWxsKGEsICdjb25zdHJ1Y3RvcicpICYmIGhhc093blByb3BlcnR5LmNhbGwoYiwgJ2NvbnN0cnVjdG9yJykpICYmXG5cdCAgICAgICAgICAgICEoaXNGdW5jdGlvbihjdG9yQSkgJiYgY3RvckEgaW5zdGFuY2VvZiBjdG9yQSAmJiBpc0Z1bmN0aW9uKGN0b3JCKSAmJiBjdG9yQiBpbnN0YW5jZW9mIGN0b3JCKSAmJlxuXHQgICAgICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBhICYmICdjb25zdHJ1Y3RvcicgaW4gYilcblx0ICAgICAgICAgICkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgLy8gYXNzdW1lIGN5Y2xpYyBzdHJ1Y3R1cmVzIGFyZSBlcXVhbFxuXHQgICAgLy8gdGhlIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nIGN5Y2xpYyBzdHJ1Y3R1cmVzIGlzIGFkYXB0ZWQgZnJvbSBFUyA1LjFcblx0ICAgIC8vIHNlY3Rpb24gMTUuMTIuMywgYWJzdHJhY3Qgb3BlcmF0aW9uIGBKT2AgKGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMTIuMylcblx0ICAgIHZhciBpbml0ZWRTdGFjayA9ICFzdGFja0E7XG5cdCAgICBzdGFja0EgfHwgKHN0YWNrQSA9IFtdKTtcblx0ICAgIHN0YWNrQiB8fCAoc3RhY2tCID0gW10pO1xuXHRcblx0ICAgIHZhciBsZW5ndGggPSBzdGFja0EubGVuZ3RoO1xuXHQgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG5cdCAgICAgIGlmIChzdGFja0FbbGVuZ3RoXSA9PSBhKSB7XG5cdCAgICAgICAgcmV0dXJuIHN0YWNrQltsZW5ndGhdID09IGI7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHZhciBzaXplID0gMDtcblx0ICAgIHZhciByZXN1bHQgPSB0cnVlO1xuXHRcblx0ICAgIC8vIGFkZCBgYWAgYW5kIGBiYCB0byB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHNcblx0ICAgIHN0YWNrQS5wdXNoKGEpO1xuXHQgICAgc3RhY2tCLnB1c2goYik7XG5cdFxuXHQgICAgLy8gcmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKVxuXHQgICAgaWYgKGlzQXJyKSB7XG5cdCAgICAgIC8vIGNvbXBhcmUgbGVuZ3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5XG5cdCAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuXHQgICAgICBzaXplID0gYi5sZW5ndGg7XG5cdCAgICAgIHJlc3VsdCA9IHNpemUgPT0gbGVuZ3RoO1xuXHRcblx0ICAgICAgaWYgKHJlc3VsdCkge1xuXHQgICAgICAgIC8vIGRlZXAgY29tcGFyZSB0aGUgY29udGVudHMsIGlnbm9yaW5nIG5vbi1udW1lcmljIHByb3BlcnRpZXNcblx0ICAgICAgICB3aGlsZSAoc2l6ZS0tKSB7XG5cdCAgICAgICAgICB2YXIgaW5kZXggPSBsZW5ndGgsXG5cdCAgICAgICAgICAgICAgdmFsdWUgPSBiW3NpemVdO1xuXHRcblx0ICAgICAgICAgIGlmICghKHJlc3VsdCA9IGRlZXBFcXVhbHMoYVtzaXplXSwgdmFsdWUsIHN0YWNrQSwgc3RhY2tCKSkpIHtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgLy8gZGVlcCBjb21wYXJlIG9iamVjdHMgdXNpbmcgYGZvckluYCwgaW5zdGVhZCBvZiBgZm9yT3duYCwgdG8gYXZvaWQgYE9iamVjdC5rZXlzYFxuXHQgICAgICAvLyB3aGljaCwgaW4gdGhpcyBjYXNlLCBpcyBtb3JlIGNvc3RseVxuXHQgICAgICBpbnRlcm5hbEZvckluKGIsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGIpIHtcblx0ICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSB7XG5cdCAgICAgICAgICAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIHByb3BlcnRpZXMuXG5cdCAgICAgICAgICBzaXplKys7XG5cdCAgICAgICAgICAvLyBkZWVwIGNvbXBhcmUgZWFjaCBwcm9wZXJ0eSB2YWx1ZS5cblx0ICAgICAgICAgIHJldHVybiAocmVzdWx0ID0gaGFzT3duUHJvcGVydHkuY2FsbChhLCBrZXkpICYmIGRlZXBFcXVhbHMoYVtrZXldLCB2YWx1ZSwgc3RhY2tBLCBzdGFja0IpKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgaWYgKHJlc3VsdCkge1xuXHQgICAgICAgIC8vIGVuc3VyZSBib3RoIG9iamVjdHMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgcHJvcGVydGllc1xuXHQgICAgICAgIGludGVybmFsRm9ySW4oYSwgZnVuY3Rpb24odmFsdWUsIGtleSwgYSkge1xuXHQgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYSwga2V5KSkge1xuXHQgICAgICAgICAgICAvLyBgc2l6ZWAgd2lsbCBiZSBgLTFgIGlmIGBhYCBoYXMgbW9yZSBwcm9wZXJ0aWVzIHRoYW4gYGJgXG5cdCAgICAgICAgICAgIHJldHVybiAocmVzdWx0ID0gLS1zaXplID4gLTEpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBzdGFja0EucG9wKCk7XG5cdCAgICBzdGFja0IucG9wKCk7XG5cdFxuXHQgICAgcmV0dXJuIHJlc3VsdDtcblx0ICB9XG5cdFxuXHQgIHZhciBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHksXG5cdCAgICAgIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXHRcblx0ICB2YXIgaW5oZXJpdHMgPSBSeC5pbnRlcm5hbHMuaW5oZXJpdHMgPSBmdW5jdGlvbiAoY2hpbGQsIHBhcmVudCkge1xuXHQgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfVxuXHQgICAgX18ucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTtcblx0ICAgIGNoaWxkLnByb3RvdHlwZSA9IG5ldyBfXygpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBhZGRQcm9wZXJ0aWVzID0gUnguaW50ZXJuYWxzLmFkZFByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqKSB7XG5cdCAgICBmb3IodmFyIHNvdXJjZXMgPSBbXSwgaSA9IDEsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeyBzb3VyY2VzLnB1c2goYXJndW1lbnRzW2ldKTsgfVxuXHQgICAgZm9yICh2YXIgaWR4ID0gMCwgbG4gPSBzb3VyY2VzLmxlbmd0aDsgaWR4IDwgbG47IGlkeCsrKSB7XG5cdCAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2lkeF07XG5cdCAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7XG5cdCAgICAgICAgb2JqW3Byb3BdID0gc291cmNlW3Byb3BdO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfTtcblx0XG5cdCAgLy8gUnggVXRpbHNcblx0ICB2YXIgYWRkUmVmID0gUnguaW50ZXJuYWxzLmFkZFJlZiA9IGZ1bmN0aW9uICh4cywgcikge1xuXHQgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuXHQgICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoci5nZXREaXNwb3NhYmxlKCksIHhzLnN1YnNjcmliZShvYnNlcnZlcikpO1xuXHQgICAgfSk7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24gYXJyYXlJbml0aWFsaXplKGNvdW50LCBmYWN0b3J5KSB7XG5cdCAgICB2YXIgYSA9IG5ldyBBcnJheShjb3VudCk7XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcblx0ICAgICAgYVtpXSA9IGZhY3RvcnkoKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBhO1xuXHQgIH1cblx0XG5cdCAgLyoqXG5cdCAgICogUmVwcmVzZW50cyBhIGdyb3VwIG9mIGRpc3Bvc2FibGUgcmVzb3VyY2VzIHRoYXQgYXJlIGRpc3Bvc2VkIHRvZ2V0aGVyLlxuXHQgICAqIEBjb25zdHJ1Y3RvclxuXHQgICAqL1xuXHQgIHZhciBDb21wb3NpdGVEaXNwb3NhYmxlID0gUnguQ29tcG9zaXRlRGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBhcmdzID0gW10sIGksIGxlbjtcblx0ICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHtcblx0ICAgICAgYXJncyA9IGFyZ3VtZW50c1swXTtcblx0ICAgICAgbGVuID0gYXJncy5sZW5ndGg7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXHQgICAgICBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIH1cblx0ICAgIHRoaXMuZGlzcG9zYWJsZXMgPSBhcmdzO1xuXHQgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICB0aGlzLmxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuXHQgIH07XG5cdFxuXHQgIHZhciBDb21wb3NpdGVEaXNwb3NhYmxlUHJvdG90eXBlID0gQ29tcG9zaXRlRGlzcG9zYWJsZS5wcm90b3R5cGU7XG5cdFxuXHQgIC8qKlxuXHQgICAqIEFkZHMgYSBkaXNwb3NhYmxlIHRvIHRoZSBDb21wb3NpdGVEaXNwb3NhYmxlIG9yIGRpc3Bvc2VzIHRoZSBkaXNwb3NhYmxlIGlmIHRoZSBDb21wb3NpdGVEaXNwb3NhYmxlIGlzIGRpc3Bvc2VkLlxuXHQgICAqIEBwYXJhbSB7TWl4ZWR9IGl0ZW0gRGlzcG9zYWJsZSB0byBhZGQuXG5cdCAgICovXG5cdCAgQ29tcG9zaXRlRGlzcG9zYWJsZVByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICBpdGVtLmRpc3Bvc2UoKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuZGlzcG9zYWJsZXMucHVzaChpdGVtKTtcblx0ICAgICAgdGhpcy5sZW5ndGgrKztcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBSZW1vdmVzIGFuZCBkaXNwb3NlcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIGRpc3Bvc2FibGUgZnJvbSB0aGUgQ29tcG9zaXRlRGlzcG9zYWJsZS5cblx0ICAgKiBAcGFyYW0ge01peGVkfSBpdGVtIERpc3Bvc2FibGUgdG8gcmVtb3ZlLlxuXHQgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGZvdW5kOyBmYWxzZSBvdGhlcndpc2UuXG5cdCAgICovXG5cdCAgQ29tcG9zaXRlRGlzcG9zYWJsZVByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgdmFyIHNob3VsZERpc3Bvc2UgPSBmYWxzZTtcblx0ICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdCAgICAgIHZhciBpZHggPSB0aGlzLmRpc3Bvc2FibGVzLmluZGV4T2YoaXRlbSk7XG5cdCAgICAgIGlmIChpZHggIT09IC0xKSB7XG5cdCAgICAgICAgc2hvdWxkRGlzcG9zZSA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5zcGxpY2UoaWR4LCAxKTtcblx0ICAgICAgICB0aGlzLmxlbmd0aC0tO1xuXHQgICAgICAgIGl0ZW0uZGlzcG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gc2hvdWxkRGlzcG9zZTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiAgRGlzcG9zZXMgYWxsIGRpc3Bvc2FibGVzIGluIHRoZSBncm91cCBhbmQgcmVtb3ZlcyB0aGVtIGZyb20gdGhlIGdyb3VwLlxuXHQgICAqL1xuXHQgIENvbXBvc2l0ZURpc3Bvc2FibGVQcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgIHZhciBsZW4gPSB0aGlzLmRpc3Bvc2FibGVzLmxlbmd0aCwgY3VycmVudERpc3Bvc2FibGVzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBjdXJyZW50RGlzcG9zYWJsZXNbaV0gPSB0aGlzLmRpc3Bvc2FibGVzW2ldOyB9XG5cdCAgICAgIHRoaXMuZGlzcG9zYWJsZXMgPSBbXTtcblx0ICAgICAgdGhpcy5sZW5ndGggPSAwO1xuXHRcblx0ICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgY3VycmVudERpc3Bvc2FibGVzW2ldLmRpc3Bvc2UoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIFByb3ZpZGVzIGEgc2V0IG9mIHN0YXRpYyBtZXRob2RzIGZvciBjcmVhdGluZyBEaXNwb3NhYmxlcy5cblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaXNwb3NlIEFjdGlvbiB0byBydW4gZHVyaW5nIHRoZSBmaXJzdCBjYWxsIHRvIGRpc3Bvc2UuIFRoZSBhY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBiZSBydW4gYXQgbW9zdCBvbmNlLlxuXHQgICAqL1xuXHQgIHZhciBEaXNwb3NhYmxlID0gUnguRGlzcG9zYWJsZSA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcblx0ICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb24gfHwgbm9vcDtcblx0ICB9O1xuXHRcblx0ICAvKiogUGVyZm9ybXMgdGhlIHRhc2sgb2YgY2xlYW5pbmcgdXAgcmVzb3VyY2VzLiAqL1xuXHQgIERpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICB0aGlzLmFjdGlvbigpO1xuXHQgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgfVxuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIENyZWF0ZXMgYSBkaXNwb3NhYmxlIG9iamVjdCB0aGF0IGludm9rZXMgdGhlIHNwZWNpZmllZCBhY3Rpb24gd2hlbiBkaXNwb3NlZC5cblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaXNwb3NlIEFjdGlvbiB0byBydW4gZHVyaW5nIHRoZSBmaXJzdCBjYWxsIHRvIGRpc3Bvc2UuIFRoZSBhY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBiZSBydW4gYXQgbW9zdCBvbmNlLlxuXHQgICAqIEByZXR1cm4ge0Rpc3Bvc2FibGV9IFRoZSBkaXNwb3NhYmxlIG9iamVjdCB0aGF0IHJ1bnMgdGhlIGdpdmVuIGFjdGlvbiB1cG9uIGRpc3Bvc2FsLlxuXHQgICAqL1xuXHQgIHZhciBkaXNwb3NhYmxlQ3JlYXRlID0gRGlzcG9zYWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoYWN0aW9uKSB7IHJldHVybiBuZXcgRGlzcG9zYWJsZShhY3Rpb24pOyB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBHZXRzIHRoZSBkaXNwb3NhYmxlIHRoYXQgZG9lcyBub3RoaW5nIHdoZW4gZGlzcG9zZWQuXG5cdCAgICovXG5cdCAgdmFyIGRpc3Bvc2FibGVFbXB0eSA9IERpc3Bvc2FibGUuZW1wdHkgPSB7IGRpc3Bvc2U6IG5vb3AgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIGRpc3Bvc2FibGVcblx0ICAgKiBAcGFyYW0ge09iamVjdH0gT2JqZWN0IHRvIHRlc3Qgd2hldGhlciBpdCBoYXMgYSBkaXNwb3NlIG1ldGhvZFxuXHQgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGEgZGlzcG9zYWJsZSBvYmplY3QsIGVsc2UgZmFsc2UuXG5cdCAgICovXG5cdCAgdmFyIGlzRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUuaXNEaXNwb3NhYmxlID0gZnVuY3Rpb24gKGQpIHtcblx0ICAgIHJldHVybiBkICYmIGlzRnVuY3Rpb24oZC5kaXNwb3NlKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgY2hlY2tEaXNwb3NlZCA9IERpc3Bvc2FibGUuY2hlY2tEaXNwb3NlZCA9IGZ1bmN0aW9uIChkaXNwb3NhYmxlKSB7XG5cdCAgICBpZiAoZGlzcG9zYWJsZS5pc0Rpc3Bvc2VkKSB7IHRocm93IG5ldyBPYmplY3REaXNwb3NlZEVycm9yKCk7IH1cblx0ICB9O1xuXHRcblx0ICB2YXIgZGlzcG9zYWJsZUZpeHVwID0gRGlzcG9zYWJsZS5fZml4dXAgPSBmdW5jdGlvbiAocmVzdWx0KSB7XG5cdCAgICByZXR1cm4gaXNEaXNwb3NhYmxlKHJlc3VsdCkgPyByZXN1bHQgOiBkaXNwb3NhYmxlRW1wdHk7XG5cdCAgfTtcblx0XG5cdCAgLy8gU2luZ2xlIGFzc2lnbm1lbnRcblx0ICB2YXIgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUgPSBSeC5TaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcblx0ICB9O1xuXHQgIFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlLnByb3RvdHlwZS5nZXREaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuY3VycmVudDtcblx0ICB9O1xuXHQgIFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlLnByb3RvdHlwZS5zZXREaXNwb3NhYmxlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICBpZiAodGhpcy5jdXJyZW50KSB7IHRocm93IG5ldyBFcnJvcignRGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkJyk7IH1cblx0ICAgIHZhciBzaG91bGREaXNwb3NlID0gdGhpcy5pc0Rpc3Bvc2VkO1xuXHQgICAgIXNob3VsZERpc3Bvc2UgJiYgKHRoaXMuY3VycmVudCA9IHZhbHVlKTtcblx0ICAgIHNob3VsZERpc3Bvc2UgJiYgdmFsdWUgJiYgdmFsdWUuZGlzcG9zZSgpO1xuXHQgIH07XG5cdCAgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICB2YXIgb2xkID0gdGhpcy5jdXJyZW50O1xuXHQgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuXHQgICAgICBvbGQgJiYgb2xkLmRpc3Bvc2UoKTtcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICAvLyBNdWx0aXBsZSBhc3NpZ25tZW50IGRpc3Bvc2FibGVcblx0ICB2YXIgU2VyaWFsRGlzcG9zYWJsZSA9IFJ4LlNlcmlhbERpc3Bvc2FibGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcblx0ICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG5cdCAgfTtcblx0ICBTZXJpYWxEaXNwb3NhYmxlLnByb3RvdHlwZS5nZXREaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuY3VycmVudDtcblx0ICB9O1xuXHQgIFNlcmlhbERpc3Bvc2FibGUucHJvdG90eXBlLnNldERpc3Bvc2FibGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgIHZhciBzaG91bGREaXNwb3NlID0gdGhpcy5pc0Rpc3Bvc2VkO1xuXHQgICAgaWYgKCFzaG91bGREaXNwb3NlKSB7XG5cdCAgICAgIHZhciBvbGQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIHRoaXMuY3VycmVudCA9IHZhbHVlO1xuXHQgICAgfVxuXHQgICAgb2xkICYmIG9sZC5kaXNwb3NlKCk7XG5cdCAgICBzaG91bGREaXNwb3NlICYmIHZhbHVlICYmIHZhbHVlLmRpc3Bvc2UoKTtcblx0ICB9O1xuXHQgIFNlcmlhbERpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICB2YXIgb2xkID0gdGhpcy5jdXJyZW50O1xuXHQgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuXHQgICAgfVxuXHQgICAgb2xkICYmIG9sZC5kaXNwb3NlKCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIEJpbmFyeURpc3Bvc2FibGUgPSBSeC5CaW5hcnlEaXNwb3NhYmxlID0gZnVuY3Rpb24gKGZpcnN0LCBzZWNvbmQpIHtcblx0ICAgIHRoaXMuX2ZpcnN0ID0gZmlyc3Q7XG5cdCAgICB0aGlzLl9zZWNvbmQgPSBzZWNvbmQ7XG5cdCAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcblx0ICB9O1xuXHRcblx0ICBCaW5hcnlEaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgICAgdmFyIG9sZDEgPSB0aGlzLl9maXJzdDtcblx0ICAgICAgdGhpcy5fZmlyc3QgPSBudWxsO1xuXHQgICAgICBvbGQxICYmIG9sZDEuZGlzcG9zZSgpO1xuXHQgICAgICB2YXIgb2xkMiA9IHRoaXMuX3NlY29uZDtcblx0ICAgICAgdGhpcy5fc2Vjb25kID0gbnVsbDtcblx0ICAgICAgb2xkMiAmJiBvbGQyLmRpc3Bvc2UoKTtcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICB2YXIgTkFyeURpc3Bvc2FibGUgPSBSeC5OQXJ5RGlzcG9zYWJsZSA9IGZ1bmN0aW9uIChkaXNwb3NhYmxlcykge1xuXHQgICAgdGhpcy5fZGlzcG9zYWJsZXMgPSBkaXNwb3NhYmxlcztcblx0ICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgIH07XG5cdFxuXHQgIE5BcnlEaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuX2Rpc3Bvc2FibGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgdGhpcy5fZGlzcG9zYWJsZXNbaV0uZGlzcG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG5cdCAgICB9XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmVwcmVzZW50cyBhIGRpc3Bvc2FibGUgcmVzb3VyY2UgdGhhdCBvbmx5IGRpc3Bvc2VzIGl0cyB1bmRlcmx5aW5nIGRpc3Bvc2FibGUgcmVzb3VyY2Ugd2hlbiBhbGwgZGVwZW5kZW50IGRpc3Bvc2FibGUgb2JqZWN0cyBoYXZlIGJlZW4gZGlzcG9zZWQuXG5cdCAgICovXG5cdCAgdmFyIFJlZkNvdW50RGlzcG9zYWJsZSA9IFJ4LlJlZkNvdW50RGlzcG9zYWJsZSA9IChmdW5jdGlvbiAoKSB7XG5cdFxuXHQgICAgZnVuY3Rpb24gSW5uZXJEaXNwb3NhYmxlKGRpc3Bvc2FibGUpIHtcblx0ICAgICAgdGhpcy5kaXNwb3NhYmxlID0gZGlzcG9zYWJsZTtcblx0ICAgICAgdGhpcy5kaXNwb3NhYmxlLmNvdW50Kys7XG5cdCAgICAgIHRoaXMuaXNJbm5lckRpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICB9XG5cdFxuXHQgICAgSW5uZXJEaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBpZiAoIXRoaXMuZGlzcG9zYWJsZS5pc0Rpc3Bvc2VkICYmICF0aGlzLmlzSW5uZXJEaXNwb3NlZCkge1xuXHQgICAgICAgIHRoaXMuaXNJbm5lckRpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmRpc3Bvc2FibGUuY291bnQtLTtcblx0ICAgICAgICBpZiAodGhpcy5kaXNwb3NhYmxlLmNvdW50ID09PSAwICYmIHRoaXMuZGlzcG9zYWJsZS5pc1ByaW1hcnlEaXNwb3NlZCkge1xuXHQgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlLnVuZGVybHlpbmdEaXNwb3NhYmxlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUmVmQ291bnREaXNwb3NhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBkaXNwb3NhYmxlLlxuXHQgICAgICogQGNvbnN0cnVjdG9yXG5cdCAgICAgKiBAcGFyYW0ge0Rpc3Bvc2FibGV9IGRpc3Bvc2FibGUgVW5kZXJseWluZyBkaXNwb3NhYmxlLlxuXHQgICAgICAqL1xuXHQgICAgZnVuY3Rpb24gUmVmQ291bnREaXNwb3NhYmxlKGRpc3Bvc2FibGUpIHtcblx0ICAgICAgdGhpcy51bmRlcmx5aW5nRGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmlzUHJpbWFyeURpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuY291bnQgPSAwO1xuXHQgICAgfVxuXHRcblx0ICAgIC8qKlxuXHQgICAgICogRGlzcG9zZXMgdGhlIHVuZGVybHlpbmcgZGlzcG9zYWJsZSBvbmx5IHdoZW4gYWxsIGRlcGVuZGVudCBkaXNwb3NhYmxlcyBoYXZlIGJlZW4gZGlzcG9zZWRcblx0ICAgICAqL1xuXHQgICAgUmVmQ291bnREaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCAmJiAhdGhpcy5pc1ByaW1hcnlEaXNwb3NlZCkge1xuXHQgICAgICAgIHRoaXMuaXNQcmltYXJ5RGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSB7XG5cdCAgICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdGhpcy51bmRlcmx5aW5nRGlzcG9zYWJsZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9O1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogUmV0dXJucyBhIGRlcGVuZGVudCBkaXNwb3NhYmxlIHRoYXQgd2hlbiBkaXNwb3NlZCBkZWNyZWFzZXMgdGhlIHJlZmNvdW50IG9uIHRoZSB1bmRlcmx5aW5nIGRpc3Bvc2FibGUuXG5cdCAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gQSBkZXBlbmRlbnQgZGlzcG9zYWJsZSBjb250cmlidXRpbmcgdG8gdGhlIHJlZmVyZW5jZSBjb3VudCB0aGF0IG1hbmFnZXMgdGhlIHVuZGVybHlpbmcgZGlzcG9zYWJsZSdzIGxpZmV0aW1lLlxuXHQgICAgICovXG5cdCAgICBSZWZDb3VudERpc3Bvc2FibGUucHJvdG90eXBlLmdldERpc3Bvc2FibGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmlzRGlzcG9zZWQgPyBkaXNwb3NhYmxlRW1wdHkgOiBuZXcgSW5uZXJEaXNwb3NhYmxlKHRoaXMpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gUmVmQ291bnREaXNwb3NhYmxlO1xuXHQgIH0pKCk7XG5cdFxuXHQgIHZhciBTY2hlZHVsZWRJdGVtID0gUnguaW50ZXJuYWxzLlNjaGVkdWxlZEl0ZW0gPSBmdW5jdGlvbiAoc2NoZWR1bGVyLCBzdGF0ZSwgYWN0aW9uLCBkdWVUaW1lLCBjb21wYXJlcikge1xuXHQgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG5cdCAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcblx0ICAgIHRoaXMuZHVlVGltZSA9IGR1ZVRpbWU7XG5cdCAgICB0aGlzLmNvbXBhcmVyID0gY29tcGFyZXIgfHwgZGVmYXVsdFN1YkNvbXBhcmVyO1xuXHQgICAgdGhpcy5kaXNwb3NhYmxlID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgfVxuXHRcblx0ICBTY2hlZHVsZWRJdGVtLnByb3RvdHlwZS5pbnZva2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB0aGlzLmRpc3Bvc2FibGUuc2V0RGlzcG9zYWJsZSh0aGlzLmludm9rZUNvcmUoKSk7XG5cdCAgfTtcblx0XG5cdCAgU2NoZWR1bGVkSXRlbS5wcm90b3R5cGUuY29tcGFyZVRvID0gZnVuY3Rpb24gKG90aGVyKSB7XG5cdCAgICByZXR1cm4gdGhpcy5jb21wYXJlcih0aGlzLmR1ZVRpbWUsIG90aGVyLmR1ZVRpbWUpO1xuXHQgIH07XG5cdFxuXHQgIFNjaGVkdWxlZEl0ZW0ucHJvdG90eXBlLmlzQ2FuY2VsbGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuZGlzcG9zYWJsZS5pc0Rpc3Bvc2VkO1xuXHQgIH07XG5cdFxuXHQgIFNjaGVkdWxlZEl0ZW0ucHJvdG90eXBlLmludm9rZUNvcmUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gZGlzcG9zYWJsZUZpeHVwKHRoaXMuYWN0aW9uKHRoaXMuc2NoZWR1bGVyLCB0aGlzLnN0YXRlKSk7XG5cdCAgfTtcblx0XG5cdCAgLyoqIFByb3ZpZGVzIGEgc2V0IG9mIHN0YXRpYyBwcm9wZXJ0aWVzIHRvIGFjY2VzcyBjb21tb25seSB1c2VkIHNjaGVkdWxlcnMuICovXG5cdCAgdmFyIFNjaGVkdWxlciA9IFJ4LlNjaGVkdWxlciA9IChmdW5jdGlvbiAoKSB7XG5cdFxuXHQgICAgZnVuY3Rpb24gU2NoZWR1bGVyKCkgeyB9XG5cdFxuXHQgICAgLyoqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgc2NoZWR1bGVyICovXG5cdCAgICBTY2hlZHVsZXIuaXNTY2hlZHVsZXIgPSBmdW5jdGlvbiAocykge1xuXHQgICAgICByZXR1cm4gcyBpbnN0YW5jZW9mIFNjaGVkdWxlcjtcblx0ICAgIH07XG5cdFxuXHQgICAgdmFyIHNjaGVkdWxlclByb3RvID0gU2NoZWR1bGVyLnByb3RvdHlwZTtcblx0XG5cdCAgICAvKipcblx0ICAgKiBTY2hlZHVsZXMgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgICAqIEBwYXJhbSBzdGF0ZSBTdGF0ZSBwYXNzZWQgdG8gdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhY3Rpb24gQWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgICAqIEByZXR1cm5zIHtEaXNwb3NhYmxlfSBUaGUgZGlzcG9zYWJsZSBvYmplY3QgdXNlZCB0byBjYW5jZWwgdGhlIHNjaGVkdWxlZCBhY3Rpb24gKGJlc3QgZWZmb3J0KS5cblx0ICAgKi9cblx0ICAgIHNjaGVkdWxlclByb3RvLnNjaGVkdWxlID0gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHtcblx0ICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcblx0ICAgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIFNjaGVkdWxlcyBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZHVlVGltZS5cblx0ICAgKiBAcGFyYW0gc3RhdGUgU3RhdGUgcGFzc2VkIHRvIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWN0aW9uIEFjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICAgKiBAcGFyYW0ge051bWJlcn0gZHVlVGltZSBSZWxhdGl2ZSB0aW1lIGFmdGVyIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIGFjdGlvbi5cblx0ICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHVzZWQgdG8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgYWN0aW9uIChiZXN0IGVmZm9ydCkuXG5cdCAgICovXG5cdCAgICBzY2hlZHVsZXJQcm90by5zY2hlZHVsZUZ1dHVyZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZHVlVGltZSwgYWN0aW9uKSB7XG5cdCAgICAgIHZhciBkdCA9IGR1ZVRpbWU7XG5cdCAgICAgIGR0IGluc3RhbmNlb2YgRGF0ZSAmJiAoZHQgPSBkdCAtIHRoaXMubm93KCkpO1xuXHQgICAgICBkdCA9IFNjaGVkdWxlci5ub3JtYWxpemUoZHQpO1xuXHRcblx0ICAgICAgaWYgKGR0ID09PSAwKSB7IHJldHVybiB0aGlzLnNjaGVkdWxlKHN0YXRlLCBhY3Rpb24pOyB9XG5cdFxuXHQgICAgICByZXR1cm4gdGhpcy5fc2NoZWR1bGVGdXR1cmUoc3RhdGUsIGR0LCBhY3Rpb24pO1xuXHQgICAgfTtcblx0XG5cdCAgICBzY2hlZHVsZXJQcm90by5fc2NoZWR1bGVGdXR1cmUgPSBmdW5jdGlvbiAoc3RhdGUsIGR1ZVRpbWUsIGFjdGlvbikge1xuXHQgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuXHQgICAgfTtcblx0XG5cdCAgICAvKiogR2V0cyB0aGUgY3VycmVudCB0aW1lIGFjY29yZGluZyB0byB0aGUgbG9jYWwgbWFjaGluZSdzIHN5c3RlbSBjbG9jay4gKi9cblx0ICAgIFNjaGVkdWxlci5ub3cgPSBkZWZhdWx0Tm93O1xuXHRcblx0ICAgIC8qKiBHZXRzIHRoZSBjdXJyZW50IHRpbWUgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbCBtYWNoaW5lJ3Mgc3lzdGVtIGNsb2NrLiAqL1xuXHQgICAgU2NoZWR1bGVyLnByb3RvdHlwZS5ub3cgPSBkZWZhdWx0Tm93O1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogTm9ybWFsaXplcyB0aGUgc3BlY2lmaWVkIFRpbWVTcGFuIHZhbHVlIHRvIGEgcG9zaXRpdmUgdmFsdWUuXG5cdCAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZVNwYW4gVGhlIHRpbWUgc3BhbiB2YWx1ZSB0byBub3JtYWxpemUuXG5cdCAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgc3BlY2lmaWVkIFRpbWVTcGFuIHZhbHVlIGlmIGl0IGlzIHplcm8gb3IgcG9zaXRpdmU7IG90aGVyd2lzZSwgMFxuXHQgICAgICovXG5cdCAgICBTY2hlZHVsZXIubm9ybWFsaXplID0gZnVuY3Rpb24gKHRpbWVTcGFuKSB7XG5cdCAgICAgIHRpbWVTcGFuIDwgMCAmJiAodGltZVNwYW4gPSAwKTtcblx0ICAgICAgcmV0dXJuIHRpbWVTcGFuO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU2NoZWR1bGVyO1xuXHQgIH0oKSk7XG5cdFxuXHQgIHZhciBub3JtYWxpemVUaW1lID0gU2NoZWR1bGVyLm5vcm1hbGl6ZSwgaXNTY2hlZHVsZXIgPSBTY2hlZHVsZXIuaXNTY2hlZHVsZXI7XG5cdFxuXHQgIChmdW5jdGlvbiAoc2NoZWR1bGVyUHJvdG8pIHtcblx0XG5cdCAgICBmdW5jdGlvbiBpbnZva2VSZWNJbW1lZGlhdGUoc2NoZWR1bGVyLCBwYWlyKSB7XG5cdCAgICAgIHZhciBzdGF0ZSA9IHBhaXJbMF0sIGFjdGlvbiA9IHBhaXJbMV0sIGdyb3VwID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKTtcblx0ICAgICAgYWN0aW9uKHN0YXRlLCBpbm5lckFjdGlvbik7XG5cdCAgICAgIHJldHVybiBncm91cDtcblx0XG5cdCAgICAgIGZ1bmN0aW9uIGlubmVyQWN0aW9uKHN0YXRlMikge1xuXHQgICAgICAgIHZhciBpc0FkZGVkID0gZmFsc2UsIGlzRG9uZSA9IGZhbHNlO1xuXHRcblx0ICAgICAgICB2YXIgZCA9IHNjaGVkdWxlci5zY2hlZHVsZShzdGF0ZTIsIHNjaGVkdWxlV29yayk7XG5cdCAgICAgICAgaWYgKCFpc0RvbmUpIHtcblx0ICAgICAgICAgIGdyb3VwLmFkZChkKTtcblx0ICAgICAgICAgIGlzQWRkZWQgPSB0cnVlO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVXb3JrKF8sIHN0YXRlMykge1xuXHQgICAgICAgICAgaWYgKGlzQWRkZWQpIHtcblx0ICAgICAgICAgICAgZ3JvdXAucmVtb3ZlKGQpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgaXNEb25lID0gdHJ1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGFjdGlvbihzdGF0ZTMsIGlubmVyQWN0aW9uKTtcblx0ICAgICAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gaW52b2tlUmVjRGF0ZShzY2hlZHVsZXIsIHBhaXIpIHtcblx0ICAgICAgdmFyIHN0YXRlID0gcGFpclswXSwgYWN0aW9uID0gcGFpclsxXSwgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlRGlzcG9zYWJsZSgpO1xuXHQgICAgICBhY3Rpb24oc3RhdGUsIGlubmVyQWN0aW9uKTtcblx0ICAgICAgcmV0dXJuIGdyb3VwO1xuXHRcblx0ICAgICAgZnVuY3Rpb24gaW5uZXJBY3Rpb24oc3RhdGUyLCBkdWVUaW1lMSkge1xuXHQgICAgICAgIHZhciBpc0FkZGVkID0gZmFsc2UsIGlzRG9uZSA9IGZhbHNlO1xuXHRcblx0ICAgICAgICB2YXIgZCA9IHNjaGVkdWxlci5zY2hlZHVsZUZ1dHVyZShzdGF0ZTIsIGR1ZVRpbWUxLCBzY2hlZHVsZVdvcmspO1xuXHQgICAgICAgIGlmICghaXNEb25lKSB7XG5cdCAgICAgICAgICBncm91cC5hZGQoZCk7XG5cdCAgICAgICAgICBpc0FkZGVkID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlV29yayhfLCBzdGF0ZTMpIHtcblx0ICAgICAgICAgIGlmIChpc0FkZGVkKSB7XG5cdCAgICAgICAgICAgIGdyb3VwLnJlbW92ZShkKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGlzRG9uZSA9IHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBhY3Rpb24oc3RhdGUzLCBpbm5lckFjdGlvbik7XG5cdCAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIC8qKlxuXHQgICAgICogU2NoZWR1bGVzIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZCByZWN1cnNpdmVseS5cblx0ICAgICAqIEBwYXJhbSB7TWl4ZWR9IHN0YXRlIFN0YXRlIHBhc3NlZCB0byB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWN0aW9uIEFjdGlvbiB0byBleGVjdXRlIHJlY3Vyc2l2ZWx5LiBUaGUgbGFzdCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBhY3Rpb24gaXMgdXNlZCB0byB0cmlnZ2VyIHJlY3Vyc2l2ZSBzY2hlZHVsaW5nIG9mIHRoZSBhY3Rpb24sIHBhc3NpbmcgaW4gcmVjdXJzaXZlIGludm9jYXRpb24gc3RhdGUuXG5cdCAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHVzZWQgdG8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgYWN0aW9uIChiZXN0IGVmZm9ydCkuXG5cdCAgICAgKi9cblx0ICAgIHNjaGVkdWxlclByb3RvLnNjaGVkdWxlUmVjdXJzaXZlID0gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGUoW3N0YXRlLCBhY3Rpb25dLCBpbnZva2VSZWNJbW1lZGlhdGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIFNjaGVkdWxlcyBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgcmVjdXJzaXZlbHkgYWZ0ZXIgYSBzcGVjaWZpZWQgcmVsYXRpdmUgb3IgYWJzb2x1dGUgZHVlIHRpbWUuXG5cdCAgICAgKiBAcGFyYW0ge01peGVkfSBzdGF0ZSBTdGF0ZSBwYXNzZWQgdG8gdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFjdGlvbiBBY3Rpb24gdG8gZXhlY3V0ZSByZWN1cnNpdmVseS4gVGhlIGxhc3QgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgYWN0aW9uIGlzIHVzZWQgdG8gdHJpZ2dlciByZWN1cnNpdmUgc2NoZWR1bGluZyBvZiB0aGUgYWN0aW9uLCBwYXNzaW5nIGluIHRoZSByZWN1cnNpdmUgZHVlIHRpbWUgYW5kIGludm9jYXRpb24gc3RhdGUuXG5cdCAgICAgKiBAcGFyYW0ge051bWJlciB8IERhdGV9IGR1ZVRpbWUgUmVsYXRpdmUgb3IgYWJzb2x1dGUgdGltZSBhZnRlciB3aGljaCB0byBleGVjdXRlIHRoZSBhY3Rpb24gZm9yIHRoZSBmaXJzdCB0aW1lLlxuXHQgICAgICogQHJldHVybnMge0Rpc3Bvc2FibGV9IFRoZSBkaXNwb3NhYmxlIG9iamVjdCB1c2VkIHRvIGNhbmNlbCB0aGUgc2NoZWR1bGVkIGFjdGlvbiAoYmVzdCBlZmZvcnQpLlxuXHQgICAgICovXG5cdCAgICBzY2hlZHVsZXJQcm90by5zY2hlZHVsZVJlY3Vyc2l2ZUZ1dHVyZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZHVlVGltZSwgYWN0aW9uKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlRnV0dXJlKFtzdGF0ZSwgYWN0aW9uXSwgZHVlVGltZSwgaW52b2tlUmVjRGF0ZSk7XG5cdCAgICB9O1xuXHRcblx0ICB9KFNjaGVkdWxlci5wcm90b3R5cGUpKTtcblx0XG5cdCAgKGZ1bmN0aW9uIChzY2hlZHVsZXJQcm90bykge1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogU2NoZWR1bGVzIGEgcGVyaW9kaWMgcGllY2Ugb2Ygd29yayBieSBkeW5hbWljYWxseSBkaXNjb3ZlcmluZyB0aGUgc2NoZWR1bGVyJ3MgY2FwYWJpbGl0aWVzLiBUaGUgcGVyaW9kaWMgdGFzayB3aWxsIGJlIHNjaGVkdWxlZCB1c2luZyB3aW5kb3cuc2V0SW50ZXJ2YWwgZm9yIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLlxuXHQgICAgICogQHBhcmFtIHtNaXhlZH0gc3RhdGUgSW5pdGlhbCBzdGF0ZSBwYXNzZWQgdG8gdGhlIGFjdGlvbiB1cG9uIHRoZSBmaXJzdCBpdGVyYXRpb24uXG5cdCAgICAgKiBAcGFyYW0ge051bWJlcn0gcGVyaW9kIFBlcmlvZCBmb3IgcnVubmluZyB0aGUgd29yayBwZXJpb2RpY2FsbHkuXG5cdCAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhY3Rpb24gQWN0aW9uIHRvIGJlIGV4ZWN1dGVkLCBwb3RlbnRpYWxseSB1cGRhdGluZyB0aGUgc3RhdGUuXG5cdCAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHVzZWQgdG8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgcmVjdXJyaW5nIGFjdGlvbiAoYmVzdCBlZmZvcnQpLlxuXHQgICAgICovXG5cdCAgICBTY2hlZHVsZXIucHJvdG90eXBlLnNjaGVkdWxlUGVyaW9kaWMgPSBmdW5jdGlvbihzdGF0ZSwgcGVyaW9kLCBhY3Rpb24pIHtcblx0ICAgICAgaWYgKHR5cGVvZiByb290LnNldEludGVydmFsID09PSAndW5kZWZpbmVkJykgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoKTsgfVxuXHQgICAgICBwZXJpb2QgPSBub3JtYWxpemVUaW1lKHBlcmlvZCk7XG5cdCAgICAgIHZhciBzID0gc3RhdGUsIGlkID0gcm9vdC5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7IHMgPSBhY3Rpb24ocyk7IH0sIHBlcmlvZCk7XG5cdCAgICAgIHJldHVybiBkaXNwb3NhYmxlQ3JlYXRlKGZ1bmN0aW9uICgpIHsgcm9vdC5jbGVhckludGVydmFsKGlkKTsgfSk7XG5cdCAgICB9O1xuXHRcblx0ICB9KFNjaGVkdWxlci5wcm90b3R5cGUpKTtcblx0XG5cdCAgLyoqIEdldHMgYSBzY2hlZHVsZXIgdGhhdCBzY2hlZHVsZXMgd29yayBpbW1lZGlhdGVseSBvbiB0aGUgY3VycmVudCB0aHJlYWQuICovXG5cdCAgIHZhciBJbW1lZGlhdGVTY2hlZHVsZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoSW1tZWRpYXRlU2NoZWR1bGVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gSW1tZWRpYXRlU2NoZWR1bGVyKCkge1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBJbW1lZGlhdGVTY2hlZHVsZXIucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHtcblx0ICAgICAgcmV0dXJuIGRpc3Bvc2FibGVGaXh1cChhY3Rpb24odGhpcywgc3RhdGUpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIEltbWVkaWF0ZVNjaGVkdWxlcjtcblx0ICB9KFNjaGVkdWxlcikpO1xuXHRcblx0ICB2YXIgaW1tZWRpYXRlU2NoZWR1bGVyID0gU2NoZWR1bGVyLmltbWVkaWF0ZSA9IG5ldyBJbW1lZGlhdGVTY2hlZHVsZXIoKTtcblx0XG5cdCAgLyoqXG5cdCAgICogR2V0cyBhIHNjaGVkdWxlciB0aGF0IHNjaGVkdWxlcyB3b3JrIGFzIHNvb24gYXMgcG9zc2libGUgb24gdGhlIGN1cnJlbnQgdGhyZWFkLlxuXHQgICAqL1xuXHQgIHZhciBDdXJyZW50VGhyZWFkU2NoZWR1bGVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIHZhciBxdWV1ZTtcblx0XG5cdCAgICBmdW5jdGlvbiBydW5UcmFtcG9saW5lICgpIHtcblx0ICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLmRlcXVldWUoKTtcblx0ICAgICAgICAhaXRlbS5pc0NhbmNlbGxlZCgpICYmIGl0ZW0uaW52b2tlKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0XG5cdCAgICBpbmhlcml0cyhDdXJyZW50VGhyZWFkU2NoZWR1bGVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gQ3VycmVudFRocmVhZFNjaGVkdWxlcigpIHtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgQ3VycmVudFRocmVhZFNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuXHQgICAgICB2YXIgc2kgPSBuZXcgU2NoZWR1bGVkSXRlbSh0aGlzLCBzdGF0ZSwgYWN0aW9uLCB0aGlzLm5vdygpKTtcblx0XG5cdCAgICAgIGlmICghcXVldWUpIHtcblx0ICAgICAgICBxdWV1ZSA9IG5ldyBQcmlvcml0eVF1ZXVlKDQpO1xuXHQgICAgICAgIHF1ZXVlLmVucXVldWUoc2kpO1xuXHRcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2gocnVuVHJhbXBvbGluZSkoKTtcblx0ICAgICAgICBxdWV1ZSA9IG51bGw7XG5cdCAgICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmopIHsgdGhyb3dlcihyZXN1bHQuZSk7IH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBxdWV1ZS5lbnF1ZXVlKHNpKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gc2kuZGlzcG9zYWJsZTtcblx0ICAgIH07XG5cdFxuXHQgICAgQ3VycmVudFRocmVhZFNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGVSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICFxdWV1ZTsgfTtcblx0XG5cdCAgICByZXR1cm4gQ3VycmVudFRocmVhZFNjaGVkdWxlcjtcblx0ICB9KFNjaGVkdWxlcikpO1xuXHRcblx0ICB2YXIgY3VycmVudFRocmVhZFNjaGVkdWxlciA9IFNjaGVkdWxlci5jdXJyZW50VGhyZWFkID0gbmV3IEN1cnJlbnRUaHJlYWRTY2hlZHVsZXIoKTtcblx0XG5cdCAgdmFyIFNjaGVkdWxlUGVyaW9kaWNSZWN1cnNpdmUgPSBSeC5pbnRlcm5hbHMuU2NoZWR1bGVQZXJpb2RpY1JlY3Vyc2l2ZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBjcmVhdGVUaWNrKHNlbGYpIHtcblx0ICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRpY2soY29tbWFuZCwgcmVjdXJzZSkge1xuXHQgICAgICAgIHJlY3Vyc2UoMCwgc2VsZi5fcGVyaW9kKTtcblx0ICAgICAgICB2YXIgc3RhdGUgPSB0cnlDYXRjaChzZWxmLl9hY3Rpb24pKHNlbGYuX3N0YXRlKTtcblx0ICAgICAgICBpZiAoc3RhdGUgPT09IGVycm9yT2JqKSB7XG5cdCAgICAgICAgICBzZWxmLl9jYW5jZWwuZGlzcG9zZSgpO1xuXHQgICAgICAgICAgdGhyb3dlcihzdGF0ZS5lKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgc2VsZi5fc3RhdGUgPSBzdGF0ZTtcblx0ICAgICAgfTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBTY2hlZHVsZVBlcmlvZGljUmVjdXJzaXZlKHNjaGVkdWxlciwgc3RhdGUsIHBlcmlvZCwgYWN0aW9uKSB7XG5cdCAgICAgIHRoaXMuX3NjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0ICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcblx0ICAgICAgdGhpcy5fcGVyaW9kID0gcGVyaW9kO1xuXHQgICAgICB0aGlzLl9hY3Rpb24gPSBhY3Rpb247XG5cdCAgICB9XG5cdFxuXHQgICAgU2NoZWR1bGVQZXJpb2RpY1JlY3Vyc2l2ZS5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgIHRoaXMuX2NhbmNlbCA9IGQ7XG5cdCAgICAgIGQuc2V0RGlzcG9zYWJsZSh0aGlzLl9zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmVGdXR1cmUoMCwgdGhpcy5fcGVyaW9kLCBjcmVhdGVUaWNrKHRoaXMpKSk7XG5cdFxuXHQgICAgICByZXR1cm4gZDtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFNjaGVkdWxlUGVyaW9kaWNSZWN1cnNpdmU7XG5cdCAgfSgpKTtcblx0XG5cdCAgdmFyIHNjaGVkdWxlTWV0aG9kLCBjbGVhck1ldGhvZDtcblx0XG5cdCAgdmFyIGxvY2FsVGltZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGxvY2FsU2V0VGltZW91dCwgbG9jYWxDbGVhclRpbWVvdXQgPSBub29wO1xuXHQgICAgaWYgKCEhcm9vdC5zZXRUaW1lb3V0KSB7XG5cdCAgICAgIGxvY2FsU2V0VGltZW91dCA9IHJvb3Quc2V0VGltZW91dDtcblx0ICAgICAgbG9jYWxDbGVhclRpbWVvdXQgPSByb290LmNsZWFyVGltZW91dDtcblx0ICAgIH0gZWxzZSBpZiAoISFyb290LldTY3JpcHQpIHtcblx0ICAgICAgbG9jYWxTZXRUaW1lb3V0ID0gZnVuY3Rpb24gKGZuLCB0aW1lKSB7XG5cdCAgICAgICAgcm9vdC5XU2NyaXB0LlNsZWVwKHRpbWUpO1xuXHQgICAgICAgIGZuKCk7XG5cdCAgICAgIH07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoKTtcblx0ICAgIH1cblx0XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBzZXRUaW1lb3V0OiBsb2NhbFNldFRpbWVvdXQsXG5cdCAgICAgIGNsZWFyVGltZW91dDogbG9jYWxDbGVhclRpbWVvdXRcblx0ICAgIH07XG5cdCAgfSgpKTtcblx0ICB2YXIgbG9jYWxTZXRUaW1lb3V0ID0gbG9jYWxUaW1lci5zZXRUaW1lb3V0LFxuXHQgICAgbG9jYWxDbGVhclRpbWVvdXQgPSBsb2NhbFRpbWVyLmNsZWFyVGltZW91dDtcblx0XG5cdCAgKGZ1bmN0aW9uICgpIHtcblx0XG5cdCAgICB2YXIgbmV4dEhhbmRsZSA9IDEsIHRhc2tzQnlIYW5kbGUgPSB7fSwgY3VycmVudGx5UnVubmluZyA9IGZhbHNlO1xuXHRcblx0ICAgIGNsZWFyTWV0aG9kID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuXHQgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBydW5UYXNrKGhhbmRsZSkge1xuXHQgICAgICBpZiAoY3VycmVudGx5UnVubmluZykge1xuXHQgICAgICAgIGxvY2FsU2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJ1blRhc2soaGFuZGxlKTsgfSwgMCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdmFyIHRhc2sgPSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG5cdCAgICAgICAgaWYgKHRhc2spIHtcblx0ICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmcgPSB0cnVlO1xuXHQgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRhc2spKCk7XG5cdCAgICAgICAgICBjbGVhck1ldGhvZChoYW5kbGUpO1xuXHQgICAgICAgICAgY3VycmVudGx5UnVubmluZyA9IGZhbHNlO1xuXHQgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmopIHsgdGhyb3dlcihyZXN1bHQuZSk7IH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0XG5cdCAgICB2YXIgcmVOYXRpdmUgPSBuZXcgUmVnRXhwKCdeJyArXG5cdCAgICAgIFN0cmluZyh0b1N0cmluZylcblx0ICAgICAgICAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKVxuXHQgICAgICAgIC5yZXBsYWNlKC90b1N0cmluZ3wgZm9yIFteXFxdXSsvZywgJy4qPycpICsgJyQnXG5cdCAgICApO1xuXHRcblx0ICAgIHZhciBzZXRJbW1lZGlhdGUgPSB0eXBlb2YgKHNldEltbWVkaWF0ZSA9IGZyZWVHbG9iYWwgJiYgbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnNldEltbWVkaWF0ZSkgPT0gJ2Z1bmN0aW9uJyAmJlxuXHQgICAgICAhcmVOYXRpdmUudGVzdChzZXRJbW1lZGlhdGUpICYmIHNldEltbWVkaWF0ZTtcblx0XG5cdCAgICBmdW5jdGlvbiBwb3N0TWVzc2FnZVN1cHBvcnRlZCAoKSB7XG5cdCAgICAgIC8vIEVuc3VyZSBub3QgaW4gYSB3b3JrZXJcblx0ICAgICAgaWYgKCFyb290LnBvc3RNZXNzYWdlIHx8IHJvb3QuaW1wb3J0U2NyaXB0cykgeyByZXR1cm4gZmFsc2U7IH1cblx0ICAgICAgdmFyIGlzQXN5bmMgPSBmYWxzZSwgb2xkSGFuZGxlciA9IHJvb3Qub25tZXNzYWdlO1xuXHQgICAgICAvLyBUZXN0IGZvciBhc3luY1xuXHQgICAgICByb290Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgaXNBc3luYyA9IHRydWU7IH07XG5cdCAgICAgIHJvb3QucG9zdE1lc3NhZ2UoJycsICcqJyk7XG5cdCAgICAgIHJvb3Qub25tZXNzYWdlID0gb2xkSGFuZGxlcjtcblx0XG5cdCAgICAgIHJldHVybiBpc0FzeW5jO1xuXHQgICAgfVxuXHRcblx0ICAgIC8vIFVzZSBpbiBvcmRlciwgc2V0SW1tZWRpYXRlLCBuZXh0VGljaywgcG9zdE1lc3NhZ2UsIE1lc3NhZ2VDaGFubmVsLCBzY3JpcHQgcmVhZHlzdGF0ZWNoYW5nZWQsIHNldFRpbWVvdXRcblx0ICAgIGlmIChpc0Z1bmN0aW9uKHNldEltbWVkaWF0ZSkpIHtcblx0ICAgICAgc2NoZWR1bGVNZXRob2QgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG5cdCAgICAgICAgdmFyIGlkID0gbmV4dEhhbmRsZSsrO1xuXHQgICAgICAgIHRhc2tzQnlIYW5kbGVbaWRdID0gYWN0aW9uO1xuXHQgICAgICAgIHNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7IHJ1blRhc2soaWQpOyB9KTtcblx0XG5cdCAgICAgICAgcmV0dXJuIGlkO1xuXHQgICAgICB9O1xuXHQgICAgfSBlbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYge30udG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nKSB7XG5cdCAgICAgIHNjaGVkdWxlTWV0aG9kID0gZnVuY3Rpb24gKGFjdGlvbikge1xuXHQgICAgICAgIHZhciBpZCA9IG5leHRIYW5kbGUrKztcblx0ICAgICAgICB0YXNrc0J5SGFuZGxlW2lkXSA9IGFjdGlvbjtcblx0ICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuVGFzayhpZCk7IH0pO1xuXHRcblx0ICAgICAgICByZXR1cm4gaWQ7XG5cdCAgICAgIH07XG5cdCAgICB9IGVsc2UgaWYgKHBvc3RNZXNzYWdlU3VwcG9ydGVkKCkpIHtcblx0ICAgICAgdmFyIE1TR19QUkVGSVggPSAnbXMucnguc2NoZWR1bGUnICsgTWF0aC5yYW5kb20oKTtcblx0XG5cdCAgICAgIHZhciBvbkdsb2JhbFBvc3RNZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgLy8gT25seSBpZiB3ZSdyZSBhIG1hdGNoIHRvIGF2b2lkIGFueSBvdGhlciBnbG9iYWwgZXZlbnRzXG5cdCAgICAgICAgaWYgKHR5cGVvZiBldmVudC5kYXRhID09PSAnc3RyaW5nJyAmJiBldmVudC5kYXRhLnN1YnN0cmluZygwLCBNU0dfUFJFRklYLmxlbmd0aCkgPT09IE1TR19QUkVGSVgpIHtcblx0ICAgICAgICAgIHJ1blRhc2soZXZlbnQuZGF0YS5zdWJzdHJpbmcoTVNHX1BSRUZJWC5sZW5ndGgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdFxuXHQgICAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBvbkdsb2JhbFBvc3RNZXNzYWdlLCBmYWxzZSk7XG5cdFxuXHQgICAgICBzY2hlZHVsZU1ldGhvZCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcblx0ICAgICAgICB2YXIgaWQgPSBuZXh0SGFuZGxlKys7XG5cdCAgICAgICAgdGFza3NCeUhhbmRsZVtpZF0gPSBhY3Rpb247XG5cdCAgICAgICAgcm9vdC5wb3N0TWVzc2FnZShNU0dfUFJFRklYICsgY3VycmVudElkLCAnKicpO1xuXHQgICAgICAgIHJldHVybiBpZDtcblx0ICAgICAgfTtcblx0ICAgIH0gZWxzZSBpZiAoISFyb290Lk1lc3NhZ2VDaGFubmVsKSB7XG5cdCAgICAgIHZhciBjaGFubmVsID0gbmV3IHJvb3QuTWVzc2FnZUNoYW5uZWwoKTtcblx0XG5cdCAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsgcnVuVGFzayhlLmRhdGEpOyB9O1xuXHRcblx0ICAgICAgc2NoZWR1bGVNZXRob2QgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG5cdCAgICAgICAgdmFyIGlkID0gbmV4dEhhbmRsZSsrO1xuXHQgICAgICAgIHRhc2tzQnlIYW5kbGVbaWRdID0gYWN0aW9uO1xuXHQgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoaWQpO1xuXHQgICAgICAgIHJldHVybiBpZDtcblx0ICAgICAgfTtcblx0ICAgIH0gZWxzZSBpZiAoJ2RvY3VtZW50JyBpbiByb290ICYmICdvbnJlYWR5c3RhdGVjaGFuZ2UnIGluIHJvb3QuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcblx0XG5cdCAgICAgIHNjaGVkdWxlTWV0aG9kID0gZnVuY3Rpb24gKGFjdGlvbikge1xuXHQgICAgICAgIHZhciBzY3JpcHRFbGVtZW50ID0gcm9vdC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblx0ICAgICAgICB2YXIgaWQgPSBuZXh0SGFuZGxlKys7XG5cdCAgICAgICAgdGFza3NCeUhhbmRsZVtpZF0gPSBhY3Rpb247XG5cdFxuXHQgICAgICAgIHNjcmlwdEVsZW1lbnQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgcnVuVGFzayhpZCk7XG5cdCAgICAgICAgICBzY3JpcHRFbGVtZW50Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cdCAgICAgICAgICBzY3JpcHRFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0RWxlbWVudCk7XG5cdCAgICAgICAgICBzY3JpcHRFbGVtZW50ID0gbnVsbDtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHJvb3QuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuXHQgICAgICAgIHJldHVybiBpZDtcblx0ICAgICAgfTtcblx0XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBzY2hlZHVsZU1ldGhvZCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcblx0ICAgICAgICB2YXIgaWQgPSBuZXh0SGFuZGxlKys7XG5cdCAgICAgICAgdGFza3NCeUhhbmRsZVtpZF0gPSBhY3Rpb247XG5cdCAgICAgICAgbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHJ1blRhc2soaWQpO1xuXHQgICAgICAgIH0sIDApO1xuXHRcblx0ICAgICAgICByZXR1cm4gaWQ7XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgfSgpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogR2V0cyBhIHNjaGVkdWxlciB0aGF0IHNjaGVkdWxlcyB3b3JrIHZpYSBhIHRpbWVkIGNhbGxiYWNrIGJhc2VkIHVwb24gcGxhdGZvcm0uXG5cdCAgICovXG5cdCAgIHZhciBEZWZhdWx0U2NoZWR1bGVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgICBpbmhlcml0cyhEZWZhdWx0U2NoZWR1bGVyLCBfX3N1cGVyX18pO1xuXHQgICAgIGZ1bmN0aW9uIERlZmF1bHRTY2hlZHVsZXIoKSB7XG5cdCAgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgICB9XG5cdFxuXHQgICAgIGZ1bmN0aW9uIHNjaGVkdWxlQWN0aW9uKGRpc3Bvc2FibGUsIGFjdGlvbiwgc2NoZWR1bGVyLCBzdGF0ZSkge1xuXHQgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNjaGVkdWxlKCkge1xuXHQgICAgICAgICAhZGlzcG9zYWJsZS5pc0Rpc3Bvc2VkICYmIGRpc3Bvc2FibGUuc2V0RGlzcG9zYWJsZShEaXNwb3NhYmxlLl9maXh1cChhY3Rpb24oc2NoZWR1bGVyLCBzdGF0ZSkpKTtcblx0ICAgICAgIH07XG5cdCAgICAgfVxuXHRcblx0ICAgICBmdW5jdGlvbiBDbGVhckRpc3Bvc2FibGUobWV0aG9kLCBpZCkge1xuXHQgICAgICAgdGhpcy5faWQgPSBpZDtcblx0ICAgICAgIHRoaXMuX21ldGhvZCA9IG1ldGhvZDtcblx0ICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgIH1cblx0XG5cdCAgICAgQ2xlYXJEaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcblx0ICAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgICAgICAgdGhpcy5fbWV0aG9kLmNhbGwobnVsbCwgdGhpcy5faWQpO1xuXHQgICAgICAgfVxuXHQgICAgIH07XG5cdFxuXHQgICAgRGVmYXVsdFNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuXHQgICAgICB2YXIgZGlzcG9zYWJsZSA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpLFxuXHQgICAgICAgICAgaWQgPSBzY2hlZHVsZU1ldGhvZChzY2hlZHVsZUFjdGlvbihkaXNwb3NhYmxlLCBhY3Rpb24sIHRoaXMsIHN0YXRlKSk7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShkaXNwb3NhYmxlLCBuZXcgQ2xlYXJEaXNwb3NhYmxlKGNsZWFyTWV0aG9kLCBpZCkpO1xuXHQgICAgfTtcblx0XG5cdCAgICBEZWZhdWx0U2NoZWR1bGVyLnByb3RvdHlwZS5fc2NoZWR1bGVGdXR1cmUgPSBmdW5jdGlvbiAoc3RhdGUsIGR1ZVRpbWUsIGFjdGlvbikge1xuXHQgICAgICBpZiAoZHVlVGltZSA9PT0gMCkgeyByZXR1cm4gdGhpcy5zY2hlZHVsZShzdGF0ZSwgYWN0aW9uKTsgfVxuXHQgICAgICB2YXIgZGlzcG9zYWJsZSA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpLFxuXHQgICAgICAgICAgaWQgPSBsb2NhbFNldFRpbWVvdXQoc2NoZWR1bGVBY3Rpb24oZGlzcG9zYWJsZSwgYWN0aW9uLCB0aGlzLCBzdGF0ZSksIGR1ZVRpbWUpO1xuXHQgICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoZGlzcG9zYWJsZSwgbmV3IENsZWFyRGlzcG9zYWJsZShsb2NhbENsZWFyVGltZW91dCwgaWQpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIERlZmF1bHRTY2hlZHVsZXI7XG5cdCAgfShTY2hlZHVsZXIpKTtcblx0XG5cdCAgdmFyIGRlZmF1bHRTY2hlZHVsZXIgPSBTY2hlZHVsZXJbJ2RlZmF1bHQnXSA9IFNjaGVkdWxlci5hc3luYyA9IG5ldyBEZWZhdWx0U2NoZWR1bGVyKCk7XG5cdFxuXHQgIGZ1bmN0aW9uIEluZGV4ZWRJdGVtKGlkLCB2YWx1ZSkge1xuXHQgICAgdGhpcy5pZCA9IGlkO1xuXHQgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgIH1cblx0XG5cdCAgSW5kZXhlZEl0ZW0ucHJvdG90eXBlLmNvbXBhcmVUbyA9IGZ1bmN0aW9uIChvdGhlcikge1xuXHQgICAgdmFyIGMgPSB0aGlzLnZhbHVlLmNvbXBhcmVUbyhvdGhlci52YWx1ZSk7XG5cdCAgICBjID09PSAwICYmIChjID0gdGhpcy5pZCAtIG90aGVyLmlkKTtcblx0ICAgIHJldHVybiBjO1xuXHQgIH07XG5cdFxuXHQgIHZhciBQcmlvcml0eVF1ZXVlID0gUnguaW50ZXJuYWxzLlByaW9yaXR5UXVldWUgPSBmdW5jdGlvbiAoY2FwYWNpdHkpIHtcblx0ICAgIHRoaXMuaXRlbXMgPSBuZXcgQXJyYXkoY2FwYWNpdHkpO1xuXHQgICAgdGhpcy5sZW5ndGggPSAwO1xuXHQgIH07XG5cdFxuXHQgIHZhciBwcmlvcml0eVByb3RvID0gUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGU7XG5cdCAgcHJpb3JpdHlQcm90by5pc0hpZ2hlclByaW9yaXR5ID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG5cdCAgICByZXR1cm4gdGhpcy5pdGVtc1tsZWZ0XS5jb21wYXJlVG8odGhpcy5pdGVtc1tyaWdodF0pIDwgMDtcblx0ICB9O1xuXHRcblx0ICBwcmlvcml0eVByb3RvLnBlcmNvbGF0ZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuXHQgICAgaWYgKGluZGV4ID49IHRoaXMubGVuZ3RoIHx8IGluZGV4IDwgMCkgeyByZXR1cm47IH1cblx0ICAgIHZhciBwYXJlbnQgPSBpbmRleCAtIDEgPj4gMTtcblx0ICAgIGlmIChwYXJlbnQgPCAwIHx8IHBhcmVudCA9PT0gaW5kZXgpIHsgcmV0dXJuOyB9XG5cdCAgICBpZiAodGhpcy5pc0hpZ2hlclByaW9yaXR5KGluZGV4LCBwYXJlbnQpKSB7XG5cdCAgICAgIHZhciB0ZW1wID0gdGhpcy5pdGVtc1tpbmRleF07XG5cdCAgICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gdGhpcy5pdGVtc1twYXJlbnRdO1xuXHQgICAgICB0aGlzLml0ZW1zW3BhcmVudF0gPSB0ZW1wO1xuXHQgICAgICB0aGlzLnBlcmNvbGF0ZShwYXJlbnQpO1xuXHQgICAgfVxuXHQgIH07XG5cdFxuXHQgIHByaW9yaXR5UHJvdG8uaGVhcGlmeSA9IGZ1bmN0aW9uIChpbmRleCkge1xuXHQgICAgK2luZGV4IHx8IChpbmRleCA9IDApO1xuXHQgICAgaWYgKGluZGV4ID49IHRoaXMubGVuZ3RoIHx8IGluZGV4IDwgMCkgeyByZXR1cm47IH1cblx0ICAgIHZhciBsZWZ0ID0gMiAqIGluZGV4ICsgMSxcblx0ICAgICAgICByaWdodCA9IDIgKiBpbmRleCArIDIsXG5cdCAgICAgICAgZmlyc3QgPSBpbmRleDtcblx0ICAgIGlmIChsZWZ0IDwgdGhpcy5sZW5ndGggJiYgdGhpcy5pc0hpZ2hlclByaW9yaXR5KGxlZnQsIGZpcnN0KSkge1xuXHQgICAgICBmaXJzdCA9IGxlZnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocmlnaHQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmlzSGlnaGVyUHJpb3JpdHkocmlnaHQsIGZpcnN0KSkge1xuXHQgICAgICBmaXJzdCA9IHJpZ2h0O1xuXHQgICAgfVxuXHQgICAgaWYgKGZpcnN0ICE9PSBpbmRleCkge1xuXHQgICAgICB2YXIgdGVtcCA9IHRoaXMuaXRlbXNbaW5kZXhdO1xuXHQgICAgICB0aGlzLml0ZW1zW2luZGV4XSA9IHRoaXMuaXRlbXNbZmlyc3RdO1xuXHQgICAgICB0aGlzLml0ZW1zW2ZpcnN0XSA9IHRlbXA7XG5cdCAgICAgIHRoaXMuaGVhcGlmeShmaXJzdCk7XG5cdCAgICB9XG5cdCAgfTtcblx0XG5cdCAgcHJpb3JpdHlQcm90by5wZWVrID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5pdGVtc1swXS52YWx1ZTsgfTtcblx0XG5cdCAgcHJpb3JpdHlQcm90by5yZW1vdmVBdCA9IGZ1bmN0aW9uIChpbmRleCkge1xuXHQgICAgdGhpcy5pdGVtc1tpbmRleF0gPSB0aGlzLml0ZW1zWy0tdGhpcy5sZW5ndGhdO1xuXHQgICAgdGhpcy5pdGVtc1t0aGlzLmxlbmd0aF0gPSB1bmRlZmluZWQ7XG5cdCAgICB0aGlzLmhlYXBpZnkoKTtcblx0ICB9O1xuXHRcblx0ICBwcmlvcml0eVByb3RvLmRlcXVldWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgcmVzdWx0ID0gdGhpcy5wZWVrKCk7XG5cdCAgICB0aGlzLnJlbW92ZUF0KDApO1xuXHQgICAgcmV0dXJuIHJlc3VsdDtcblx0ICB9O1xuXHRcblx0ICBwcmlvcml0eVByb3RvLmVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgdmFyIGluZGV4ID0gdGhpcy5sZW5ndGgrKztcblx0ICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gbmV3IEluZGV4ZWRJdGVtKFByaW9yaXR5UXVldWUuY291bnQrKywgaXRlbSk7XG5cdCAgICB0aGlzLnBlcmNvbGF0ZShpbmRleCk7XG5cdCAgfTtcblx0XG5cdCAgcHJpb3JpdHlQcm90by5yZW1vdmUgPSBmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIGlmICh0aGlzLml0ZW1zW2ldLnZhbHVlID09PSBpdGVtKSB7XG5cdCAgICAgICAgdGhpcy5yZW1vdmVBdChpKTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH07XG5cdCAgUHJpb3JpdHlRdWV1ZS5jb3VudCA9IDA7XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZXByZXNlbnRzIGEgbm90aWZpY2F0aW9uIHRvIGFuIG9ic2VydmVyLlxuXHQgICAqL1xuXHQgIHZhciBOb3RpZmljYXRpb24gPSBSeC5Ob3RpZmljYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTm90aWZpY2F0aW9uKCkge1xuXHRcblx0ICAgIH1cblx0XG5cdCAgICBOb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHQgPSBmdW5jdGlvbiAob25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuXHQgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuXHQgICAgfTtcblx0XG5cdCAgICBOb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHRPYnNlcnZhYmxlID0gZnVuY3Rpb24gKG9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcblx0ICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBJbnZva2VzIHRoZSBkZWxlZ2F0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBub3RpZmljYXRpb24gb3IgdGhlIG9ic2VydmVyJ3MgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vdGlmaWNhdGlvbiBhbmQgcmV0dXJucyB0aGUgcHJvZHVjZWQgcmVzdWx0LlxuXHQgICAgICpcblx0ICAgICAqIEBtZW1iZXJPZiBOb3RpZmljYXRpb25cblx0ICAgICAqIEBwYXJhbSB7QW55fSBvYnNlcnZlck9yT25OZXh0IERlbGVnYXRlIHRvIGludm9rZSBmb3IgYW4gT25OZXh0IG5vdGlmaWNhdGlvbiBvciBPYnNlcnZlciB0byBpbnZva2UgdGhlIG5vdGlmaWNhdGlvbiBvbi4uXG5cdCAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIERlbGVnYXRlIHRvIGludm9rZSBmb3IgYW4gT25FcnJvciBub3RpZmljYXRpb24uXG5cdCAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNvbXBsZXRlZCBEZWxlZ2F0ZSB0byBpbnZva2UgZm9yIGFuIE9uQ29tcGxldGVkIG5vdGlmaWNhdGlvbi5cblx0ICAgICAqIEByZXR1cm5zIHtBbnl9IFJlc3VsdCBwcm9kdWNlZCBieSB0aGUgb2JzZXJ2YXRpb24uXG5cdCAgICAgKi9cblx0ICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24gKG9ic2VydmVyT3JPbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG5cdCAgICAgIHJldHVybiBvYnNlcnZlck9yT25OZXh0ICYmIHR5cGVvZiBvYnNlcnZlck9yT25OZXh0ID09PSAnb2JqZWN0JyA/XG5cdCAgICAgICAgdGhpcy5fYWNjZXB0T2JzZXJ2YWJsZShvYnNlcnZlck9yT25OZXh0KSA6XG5cdCAgICAgICAgdGhpcy5fYWNjZXB0KG9ic2VydmVyT3JPbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKTtcblx0ICAgIH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCBhIHNpbmdsZSBub3RpZmljYXRpb24uXG5cdCAgICAgKlxuXHQgICAgICogQG1lbWJlck9mIE5vdGlmaWNhdGlvbnNcblx0ICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gc2VuZCBvdXQgdGhlIG5vdGlmaWNhdGlvbiBjYWxscyBvbi5cblx0ICAgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHN1cmZhY2VzIHRoZSBiZWhhdmlvciBvZiB0aGUgbm90aWZpY2F0aW9uIHVwb24gc3Vic2NyaXB0aW9uLlxuXHQgICAgICovXG5cdCAgICBOb3RpZmljYXRpb24ucHJvdG90eXBlLnRvT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChzY2hlZHVsZXIpIHtcblx0ICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXHQgICAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBpbW1lZGlhdGVTY2hlZHVsZXIpO1xuXHQgICAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKHNlbGYsIGZ1bmN0aW9uIChfLCBub3RpZmljYXRpb24pIHtcblx0ICAgICAgICAgIG5vdGlmaWNhdGlvbi5fYWNjZXB0T2JzZXJ2YWJsZShvKTtcblx0ICAgICAgICAgIG5vdGlmaWNhdGlvbi5raW5kID09PSAnTicgJiYgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIE5vdGlmaWNhdGlvbjtcblx0ICB9KSgpO1xuXHRcblx0ICB2YXIgT25OZXh0Tm90aWZpY2F0aW9uID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE9uTmV4dE5vdGlmaWNhdGlvbiwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIE9uTmV4dE5vdGlmaWNhdGlvbih2YWx1ZSkge1xuXHQgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgIHRoaXMua2luZCA9ICdOJztcblx0ICAgIH1cblx0XG5cdCAgICBPbk5leHROb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHQgPSBmdW5jdGlvbiAob25OZXh0KSB7XG5cdCAgICAgIHJldHVybiBvbk5leHQodGhpcy52YWx1ZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIE9uTmV4dE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdE9ic2VydmFibGUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gby5vbk5leHQodGhpcy52YWx1ZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIE9uTmV4dE5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiAnT25OZXh0KCcgKyB0aGlzLnZhbHVlICsgJyknO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gT25OZXh0Tm90aWZpY2F0aW9uO1xuXHQgIH0oTm90aWZpY2F0aW9uKSk7XG5cdFxuXHQgIHZhciBPbkVycm9yTm90aWZpY2F0aW9uID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE9uRXJyb3JOb3RpZmljYXRpb24sIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBPbkVycm9yTm90aWZpY2F0aW9uKGVycm9yKSB7XG5cdCAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcblx0ICAgICAgdGhpcy5raW5kID0gJ0UnO1xuXHQgICAgfVxuXHRcblx0ICAgIE9uRXJyb3JOb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHQgPSBmdW5jdGlvbiAob25OZXh0LCBvbkVycm9yKSB7XG5cdCAgICAgIHJldHVybiBvbkVycm9yKHRoaXMuZXJyb3IpO1xuXHQgICAgfTtcblx0XG5cdCAgICBPbkVycm9yTm90aWZpY2F0aW9uLnByb3RvdHlwZS5fYWNjZXB0T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiBvLm9uRXJyb3IodGhpcy5lcnJvcik7XG5cdCAgICB9O1xuXHRcblx0ICAgIE9uRXJyb3JOb3RpZmljYXRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gJ09uRXJyb3IoJyArIHRoaXMuZXJyb3IgKyAnKSc7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBPbkVycm9yTm90aWZpY2F0aW9uO1xuXHQgIH0oTm90aWZpY2F0aW9uKSk7XG5cdFxuXHQgIHZhciBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbiA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbiwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIE9uQ29tcGxldGVkTm90aWZpY2F0aW9uKCkge1xuXHQgICAgICB0aGlzLmtpbmQgPSAnQyc7XG5cdCAgICB9XG5cdFxuXHQgICAgT25Db21wbGV0ZWROb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHQgPSBmdW5jdGlvbiAob25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuXHQgICAgICByZXR1cm4gb25Db21wbGV0ZWQoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgT25Db21wbGV0ZWROb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHRPYnNlcnZhYmxlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgT25Db21wbGV0ZWROb3RpZmljYXRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gJ09uQ29tcGxldGVkKCknO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gT25Db21wbGV0ZWROb3RpZmljYXRpb247XG5cdCAgfShOb3RpZmljYXRpb24pKTtcblx0XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGFuIE9uTmV4dCBub3RpZmljYXRpb24gdG8gYW4gb2JzZXJ2ZXIuXG5cdCAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIG5vdGlmaWNhdGlvbi5cblx0ICAgKiBAcmV0dXJucyB7Tm90aWZpY2F0aW9ufSBUaGUgT25OZXh0IG5vdGlmaWNhdGlvbiBjb250YWluaW5nIHRoZSB2YWx1ZS5cblx0ICAgKi9cblx0ICB2YXIgbm90aWZpY2F0aW9uQ3JlYXRlT25OZXh0ID0gTm90aWZpY2F0aW9uLmNyZWF0ZU9uTmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgcmV0dXJuIG5ldyBPbk5leHROb3RpZmljYXRpb24odmFsdWUpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhbiBPbkVycm9yIG5vdGlmaWNhdGlvbiB0byBhbiBvYnNlcnZlci5cblx0ICAgKiBAcGFyYW0ge0FueX0gZXJyb3IgVGhlIGV4Y2VwdGlvbiBjb250YWluZWQgaW4gdGhlIG5vdGlmaWNhdGlvbi5cblx0ICAgKiBAcmV0dXJucyB7Tm90aWZpY2F0aW9ufSBUaGUgT25FcnJvciBub3RpZmljYXRpb24gY29udGFpbmluZyB0aGUgZXhjZXB0aW9uLlxuXHQgICAqL1xuXHQgIHZhciBub3RpZmljYXRpb25DcmVhdGVPbkVycm9yID0gTm90aWZpY2F0aW9uLmNyZWF0ZU9uRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgIHJldHVybiBuZXcgT25FcnJvck5vdGlmaWNhdGlvbihlcnJvcik7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGFuIE9uQ29tcGxldGVkIG5vdGlmaWNhdGlvbiB0byBhbiBvYnNlcnZlci5cblx0ICAgKiBAcmV0dXJucyB7Tm90aWZpY2F0aW9ufSBUaGUgT25Db21wbGV0ZWQgbm90aWZpY2F0aW9uLlxuXHQgICAqL1xuXHQgIHZhciBub3RpZmljYXRpb25DcmVhdGVPbkNvbXBsZXRlZCA9IE5vdGlmaWNhdGlvbi5jcmVhdGVPbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBuZXcgT25Db21wbGV0ZWROb3RpZmljYXRpb24oKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBTdXBwb3J0cyBwdXNoLXN0eWxlIGl0ZXJhdGlvbiBvdmVyIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICovXG5cdCAgdmFyIE9ic2VydmVyID0gUnguT2JzZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7IH07XG5cdFxuXHQgIC8qKlxuXHQgICAqICBDcmVhdGVzIGFuIG9ic2VydmVyIGZyb20gdGhlIHNwZWNpZmllZCBPbk5leHQsIGFsb25nIHdpdGggb3B0aW9uYWwgT25FcnJvciwgYW5kIE9uQ29tcGxldGVkIGFjdGlvbnMuXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uTmV4dF0gT2JzZXJ2ZXIncyBPbk5leHQgYWN0aW9uIGltcGxlbWVudGF0aW9uLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSBPYnNlcnZlcidzIE9uRXJyb3IgYWN0aW9uIGltcGxlbWVudGF0aW9uLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkNvbXBsZXRlZF0gT2JzZXJ2ZXIncyBPbkNvbXBsZXRlZCBhY3Rpb24gaW1wbGVtZW50YXRpb24uXG5cdCAgICogQHJldHVybnMge09ic2VydmVyfSBUaGUgb2JzZXJ2ZXIgb2JqZWN0IGltcGxlbWVudGVkIHVzaW5nIHRoZSBnaXZlbiBhY3Rpb25zLlxuXHQgICAqL1xuXHQgIHZhciBvYnNlcnZlckNyZWF0ZSA9IE9ic2VydmVyLmNyZWF0ZSA9IGZ1bmN0aW9uIChvbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG5cdCAgICBvbk5leHQgfHwgKG9uTmV4dCA9IG5vb3ApO1xuXHQgICAgb25FcnJvciB8fCAob25FcnJvciA9IGRlZmF1bHRFcnJvcik7XG5cdCAgICBvbkNvbXBsZXRlZCB8fCAob25Db21wbGV0ZWQgPSBub29wKTtcblx0ICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2ZXIob25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBPYnNlcnZlciBjbGFzcy5cblx0ICAgKiBUaGlzIGJhc2UgY2xhc3MgZW5mb3JjZXMgdGhlIGdyYW1tYXIgb2Ygb2JzZXJ2ZXJzIHdoZXJlIE9uRXJyb3IgYW5kIE9uQ29tcGxldGVkIGFyZSB0ZXJtaW5hbCBtZXNzYWdlcy5cblx0ICAgKi9cblx0ICB2YXIgQWJzdHJhY3RPYnNlcnZlciA9IFJ4LmludGVybmFscy5BYnN0cmFjdE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKEFic3RyYWN0T2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBDcmVhdGVzIGEgbmV3IG9ic2VydmVyIGluIGEgbm9uLXN0b3BwZWQgc3RhdGUuXG5cdCAgICAgKi9cblx0ICAgIGZ1bmN0aW9uIEFic3RyYWN0T2JzZXJ2ZXIoKSB7XG5cdCAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICB9XG5cdFxuXHQgICAgLy8gTXVzdCBiZSBpbXBsZW1lbnRlZCBieSBvdGhlciBvYnNlcnZlcnNcblx0ICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBub3RJbXBsZW1lbnRlZDtcblx0ICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gbm90SW1wbGVtZW50ZWQ7XG5cdCAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBub3RJbXBsZW1lbnRlZDtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIE5vdGlmaWVzIHRoZSBvYnNlcnZlciBvZiBhIG5ldyBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cblx0ICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBOZXh0IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLlxuXHQgICAgICovXG5cdCAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgIXRoaXMuaXNTdG9wcGVkICYmIHRoaXMubmV4dCh2YWx1ZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogTm90aWZpZXMgdGhlIG9ic2VydmVyIHRoYXQgYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC5cblx0ICAgICAqIEBwYXJhbSB7QW55fSBlcnJvciBUaGUgZXJyb3IgdGhhdCBoYXMgb2NjdXJyZWQuXG5cdCAgICAgKi9cblx0ICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmVycm9yKGVycm9yKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIE5vdGlmaWVzIHRoZSBvYnNlcnZlciBvZiB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cblx0ICAgICAqL1xuXHQgICAgQWJzdHJhY3RPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5jb21wbGV0ZWQoKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIERpc3Bvc2VzIHRoZSBvYnNlcnZlciwgY2F1c2luZyBpdCB0byB0cmFuc2l0aW9uIHRvIHRoZSBzdG9wcGVkIHN0YXRlLlxuXHQgICAgICovXG5cdCAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH07XG5cdFxuXHQgICAgQWJzdHJhY3RPYnNlcnZlci5wcm90b3R5cGUuZmFpbCA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5lcnJvcihlKTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gQWJzdHJhY3RPYnNlcnZlcjtcblx0ICB9KE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIENsYXNzIHRvIGNyZWF0ZSBhbiBPYnNlcnZlciBpbnN0YW5jZSBmcm9tIGRlbGVnYXRlLWJhc2VkIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgb24qIG1ldGhvZHMuXG5cdCAgICovXG5cdCAgdmFyIEFub255bW91c09ic2VydmVyID0gUnguQW5vbnltb3VzT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQW5vbnltb3VzT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBDcmVhdGVzIGFuIG9ic2VydmVyIGZyb20gdGhlIHNwZWNpZmllZCBPbk5leHQsIE9uRXJyb3IsIGFuZCBPbkNvbXBsZXRlZCBhY3Rpb25zLlxuXHQgICAgICogQHBhcmFtIHtBbnl9IG9uTmV4dCBPYnNlcnZlcidzIE9uTmV4dCBhY3Rpb24gaW1wbGVtZW50YXRpb24uXG5cdCAgICAgKiBAcGFyYW0ge0FueX0gb25FcnJvciBPYnNlcnZlcidzIE9uRXJyb3IgYWN0aW9uIGltcGxlbWVudGF0aW9uLlxuXHQgICAgICogQHBhcmFtIHtBbnl9IG9uQ29tcGxldGVkIE9ic2VydmVyJ3MgT25Db21wbGV0ZWQgYWN0aW9uIGltcGxlbWVudGF0aW9uLlxuXHQgICAgICovXG5cdCAgICBmdW5jdGlvbiBBbm9ueW1vdXNPYnNlcnZlcihvbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgICB0aGlzLl9vbk5leHQgPSBvbk5leHQ7XG5cdCAgICAgIHRoaXMuX29uRXJyb3IgPSBvbkVycm9yO1xuXHQgICAgICB0aGlzLl9vbkNvbXBsZXRlZCA9IG9uQ29tcGxldGVkO1xuXHQgICAgfVxuXHRcblx0ICAgIC8qKlxuXHQgICAgICogQ2FsbHMgdGhlIG9uTmV4dCBhY3Rpb24uXG5cdCAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgTmV4dCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cblx0ICAgICAqL1xuXHQgICAgQW5vbnltb3VzT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgdGhpcy5fb25OZXh0KHZhbHVlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBDYWxscyB0aGUgb25FcnJvciBhY3Rpb24uXG5cdCAgICAgKiBAcGFyYW0ge0FueX0gZXJyb3IgVGhlIGVycm9yIHRoYXQgaGFzIG9jY3VycmVkLlxuXHQgICAgICovXG5cdCAgICBBbm9ueW1vdXNPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgdGhpcy5fb25FcnJvcihlcnJvcik7XG5cdCAgICB9O1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogIENhbGxzIHRoZSBvbkNvbXBsZXRlZCBhY3Rpb24uXG5cdCAgICAgKi9cblx0ICAgIEFub255bW91c09ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX29uQ29tcGxldGVkKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBBbm9ueW1vdXNPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgdmFyIG9ic2VydmFibGVQcm90bztcblx0XG5cdCAgLyoqXG5cdCAgICogUmVwcmVzZW50cyBhIHB1c2gtc3R5bGUgY29sbGVjdGlvbi5cblx0ICAgKi9cblx0ICB2YXIgT2JzZXJ2YWJsZSA9IFJ4Lk9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuXHRcblx0ICAgIGZ1bmN0aW9uIG1ha2VTdWJzY3JpYmUoc2VsZiwgc3Vic2NyaWJlKSB7XG5cdCAgICAgIHJldHVybiBmdW5jdGlvbiAobykge1xuXHQgICAgICAgIHZhciBvbGRPbkVycm9yID0gby5vbkVycm9yO1xuXHQgICAgICAgIG8ub25FcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICBtYWtlU3RhY2tUcmFjZUxvbmcoZSwgc2VsZik7XG5cdCAgICAgICAgICBvbGRPbkVycm9yLmNhbGwobywgZSk7XG5cdCAgICAgICAgfTtcblx0XG5cdCAgICAgICAgcmV0dXJuIHN1YnNjcmliZS5jYWxsKHNlbGYsIG8pO1xuXHQgICAgICB9O1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIE9ic2VydmFibGUoKSB7XG5cdCAgICAgIGlmIChSeC5jb25maWcubG9uZ1N0YWNrU3VwcG9ydCAmJiBoYXNTdGFja3MpIHtcblx0ICAgICAgICB2YXIgb2xkU3Vic2NyaWJlID0gdGhpcy5fc3Vic2NyaWJlO1xuXHQgICAgICAgIHZhciBlID0gdHJ5Q2F0Y2godGhyb3dlcikobmV3IEVycm9yKCkpLmU7XG5cdCAgICAgICAgdGhpcy5zdGFjayA9IGUuc3RhY2suc3Vic3RyaW5nKGUuc3RhY2suaW5kZXhPZignXFxuJykgKyAxKTtcblx0ICAgICAgICB0aGlzLl9zdWJzY3JpYmUgPSBtYWtlU3Vic2NyaWJlKHRoaXMsIG9sZFN1YnNjcmliZSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0XG5cdCAgICBvYnNlcnZhYmxlUHJvdG8gPSBPYnNlcnZhYmxlLnByb3RvdHlwZTtcblx0XG5cdCAgICAvKipcblx0ICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gT2JzZXJ2YWJsZVxuXHQgICAgKiBAcGFyYW0ge0FueX0gQW4gb2JqZWN0IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIGFuIE9ic2VydmFibGVcblx0ICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgYW4gT2JzZXJ2YWJsZSwgZWxzZSBmYWxzZS5cblx0ICAgICovXG5cdCAgICBPYnNlcnZhYmxlLmlzT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiBvICYmIGlzRnVuY3Rpb24oby5zdWJzY3JpYmUpO1xuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqICBTdWJzY3JpYmVzIGFuIG8gdG8gdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICAgKiAgQHBhcmFtIHtNaXhlZH0gW29Pck9uTmV4dF0gVGhlIG9iamVjdCB0aGF0IGlzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvciBhbiBhY3Rpb24gdG8gaW52b2tlIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICAgKiAgQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIEFjdGlvbiB0byBpbnZva2UgdXBvbiBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgICAqICBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Db21wbGV0ZWRdIEFjdGlvbiB0byBpbnZva2UgdXBvbiBncmFjZWZ1bCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgICAqICBAcmV0dXJucyB7RGlwb3NhYmxlfSBBIGRpc3Bvc2FibGUgaGFuZGxpbmcgdGhlIHN1YnNjcmlwdGlvbnMgYW5kIHVuc3Vic2NyaXB0aW9ucy5cblx0ICAgICAqL1xuXHQgICAgb2JzZXJ2YWJsZVByb3RvLnN1YnNjcmliZSA9IG9ic2VydmFibGVQcm90by5mb3JFYWNoID0gZnVuY3Rpb24gKG9Pck9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZSh0eXBlb2Ygb09yT25OZXh0ID09PSAnb2JqZWN0JyA/XG5cdCAgICAgICAgb09yT25OZXh0IDpcblx0ICAgICAgICBvYnNlcnZlckNyZWF0ZShvT3JPbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogU3Vic2NyaWJlcyB0byB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2Ugd2l0aCBhbiBvcHRpb25hbCBcInRoaXNcIiBhcmd1bWVudC5cblx0ICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uTmV4dCBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gT2JqZWN0IHRvIHVzZSBhcyB0aGlzIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxuXHQgICAgICogQHJldHVybnMge0Rpc3Bvc2FibGV9IEEgZGlzcG9zYWJsZSBoYW5kbGluZyB0aGUgc3Vic2NyaXB0aW9ucyBhbmQgdW5zdWJzY3JpcHRpb25zLlxuXHQgICAgICovXG5cdCAgICBvYnNlcnZhYmxlUHJvdG8uc3Vic2NyaWJlT25OZXh0ID0gZnVuY3Rpb24gKG9uTmV4dCwgdGhpc0FyZykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKG9ic2VydmVyQ3JlYXRlKHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uKHgpIHsgb25OZXh0LmNhbGwodGhpc0FyZywgeCk7IH0gOiBvbk5leHQpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBTdWJzY3JpYmVzIHRvIGFuIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbiBpbiB0aGUgc2VxdWVuY2Ugd2l0aCBhbiBvcHRpb25hbCBcInRoaXNcIiBhcmd1bWVudC5cblx0ICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZSB1cG9uIGV4Y2VwdGlvbmFsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAgICogQHBhcmFtIHtBbnl9IFt0aGlzQXJnXSBPYmplY3QgdG8gdXNlIGFzIHRoaXMgd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXG5cdCAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gQSBkaXNwb3NhYmxlIGhhbmRsaW5nIHRoZSBzdWJzY3JpcHRpb25zIGFuZCB1bnN1YnNjcmlwdGlvbnMuXG5cdCAgICAgKi9cblx0ICAgIG9ic2VydmFibGVQcm90by5zdWJzY3JpYmVPbkVycm9yID0gZnVuY3Rpb24gKG9uRXJyb3IsIHRoaXNBcmcpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZShvYnNlcnZlckNyZWF0ZShudWxsLCB0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbihlKSB7IG9uRXJyb3IuY2FsbCh0aGlzQXJnLCBlKTsgfSA6IG9uRXJyb3IpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZSB3aXRoIGFuIG9wdGlvbmFsIFwidGhpc1wiIGFyZ3VtZW50LlxuXHQgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25Db21wbGV0ZWQgVGhlIGZ1bmN0aW9uIHRvIGludm9rZSB1cG9uIGdyYWNlZnVsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAgICogQHBhcmFtIHtBbnl9IFt0aGlzQXJnXSBPYmplY3QgdG8gdXNlIGFzIHRoaXMgd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXG5cdCAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gQSBkaXNwb3NhYmxlIGhhbmRsaW5nIHRoZSBzdWJzY3JpcHRpb25zIGFuZCB1bnN1YnNjcmlwdGlvbnMuXG5cdCAgICAgKi9cblx0ICAgIG9ic2VydmFibGVQcm90by5zdWJzY3JpYmVPbkNvbXBsZXRlZCA9IGZ1bmN0aW9uIChvbkNvbXBsZXRlZCwgdGhpc0FyZykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKG9ic2VydmVyQ3JlYXRlKG51bGwsIG51bGwsIHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uKCkgeyBvbkNvbXBsZXRlZC5jYWxsKHRoaXNBcmcpOyB9IDogb25Db21wbGV0ZWQpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIE9ic2VydmFibGU7XG5cdCAgfSkoKTtcblx0XG5cdCAgdmFyIFNjaGVkdWxlZE9ic2VydmVyID0gUnguaW50ZXJuYWxzLlNjaGVkdWxlZE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFNjaGVkdWxlZE9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIFNjaGVkdWxlZE9ic2VydmVyKHNjaGVkdWxlciwgb2JzZXJ2ZXIpIHtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG5cdCAgICAgIHRoaXMuaXNBY3F1aXJlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmhhc0ZhdWx0ZWQgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuXHQgICAgICB0aGlzLmRpc3Bvc2FibGUgPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpO1xuXHQgICAgfVxuXHRcblx0ICAgIFNjaGVkdWxlZE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgIHZhciBzZWxmID0gdGhpcztcblx0ICAgICAgdGhpcy5xdWV1ZS5wdXNoKGZ1bmN0aW9uICgpIHsgc2VsZi5vYnNlcnZlci5vbk5leHQodmFsdWUpOyB9KTtcblx0ICAgIH07XG5cdFxuXHQgICAgU2NoZWR1bGVkT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXHQgICAgICB0aGlzLnF1ZXVlLnB1c2goZnVuY3Rpb24gKCkgeyBzZWxmLm9ic2VydmVyLm9uRXJyb3IoZSk7IH0pO1xuXHQgICAgfTtcblx0XG5cdCAgICBTY2hlZHVsZWRPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgIHRoaXMucXVldWUucHVzaChmdW5jdGlvbiAoKSB7IHNlbGYub2JzZXJ2ZXIub25Db21wbGV0ZWQoKTsgfSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFNjaGVkdWxlZE9ic2VydmVyLnByb3RvdHlwZS5lbnN1cmVBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBpc093bmVyID0gZmFsc2U7XG5cdCAgICAgIGlmICghdGhpcy5oYXNGYXVsdGVkICYmIHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuXHQgICAgICAgIGlzT3duZXIgPSAhdGhpcy5pc0FjcXVpcmVkO1xuXHQgICAgICAgIHRoaXMuaXNBY3F1aXJlZCA9IHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGlzT3duZXIpIHtcblx0ICAgICAgICB0aGlzLmRpc3Bvc2FibGUuc2V0RGlzcG9zYWJsZSh0aGlzLnNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSh0aGlzLCBmdW5jdGlvbiAocGFyZW50LCBzZWxmKSB7XG5cdCAgICAgICAgICB2YXIgd29yaztcblx0ICAgICAgICAgIGlmIChwYXJlbnQucXVldWUubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICB3b3JrID0gcGFyZW50LnF1ZXVlLnNoaWZ0KCk7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBwYXJlbnQuaXNBY3F1aXJlZCA9IGZhbHNlO1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2god29yaykoKTtcblx0ICAgICAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7XG5cdCAgICAgICAgICAgIHBhcmVudC5xdWV1ZSA9IFtdO1xuXHQgICAgICAgICAgICBwYXJlbnQuaGFzRmF1bHRlZCA9IHRydWU7XG5cdCAgICAgICAgICAgIHJldHVybiB0aHJvd2VyKHJlcy5lKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHNlbGYocGFyZW50KTtcblx0ICAgICAgICB9KSk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdFxuXHQgICAgU2NoZWR1bGVkT2JzZXJ2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIF9fc3VwZXJfXy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICB0aGlzLmRpc3Bvc2FibGUuZGlzcG9zZSgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU2NoZWR1bGVkT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIHZhciBPYnNlcnZhYmxlQmFzZSA9IFJ4Lk9ic2VydmFibGVCYXNlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE9ic2VydmFibGVCYXNlLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIGZpeFN1YnNjcmliZXIoc3Vic2NyaWJlcikge1xuXHQgICAgICByZXR1cm4gc3Vic2NyaWJlciAmJiBpc0Z1bmN0aW9uKHN1YnNjcmliZXIuZGlzcG9zZSkgPyBzdWJzY3JpYmVyIDpcblx0ICAgICAgICBpc0Z1bmN0aW9uKHN1YnNjcmliZXIpID8gZGlzcG9zYWJsZUNyZWF0ZShzdWJzY3JpYmVyKSA6IGRpc3Bvc2FibGVFbXB0eTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBzZXREaXNwb3NhYmxlKHMsIHN0YXRlKSB7XG5cdCAgICAgIHZhciBhZG8gPSBzdGF0ZVswXSwgc2VsZiA9IHN0YXRlWzFdO1xuXHQgICAgICB2YXIgc3ViID0gdHJ5Q2F0Y2goc2VsZi5zdWJzY3JpYmVDb3JlKS5jYWxsKHNlbGYsIGFkbyk7XG5cdCAgICAgIGlmIChzdWIgPT09IGVycm9yT2JqICYmICFhZG8uZmFpbChlcnJvck9iai5lKSkgeyB0aHJvd2VyKGVycm9yT2JqLmUpOyB9XG5cdCAgICAgIGFkby5zZXREaXNwb3NhYmxlKGZpeFN1YnNjcmliZXIoc3ViKSk7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gT2JzZXJ2YWJsZUJhc2UoKSB7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIE9ic2VydmFibGVCYXNlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGFkbyA9IG5ldyBBdXRvRGV0YWNoT2JzZXJ2ZXIobyksIHN0YXRlID0gW2FkbywgdGhpc107XG5cdFxuXHQgICAgICBpZiAoY3VycmVudFRocmVhZFNjaGVkdWxlci5zY2hlZHVsZVJlcXVpcmVkKCkpIHtcblx0ICAgICAgICBjdXJyZW50VGhyZWFkU2NoZWR1bGVyLnNjaGVkdWxlKHN0YXRlLCBzZXREaXNwb3NhYmxlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBzZXREaXNwb3NhYmxlKG51bGwsIHN0YXRlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYWRvO1xuXHQgICAgfTtcblx0XG5cdCAgICBPYnNlcnZhYmxlQmFzZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IG5vdEltcGxlbWVudGVkO1xuXHRcblx0ICAgIHJldHVybiBPYnNlcnZhYmxlQmFzZTtcblx0ICB9KE9ic2VydmFibGUpKTtcblx0XG5cdHZhciBGbGF0TWFwT2JzZXJ2YWJsZSA9IFJ4LkZsYXRNYXBPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHRcblx0ICAgIGluaGVyaXRzKEZsYXRNYXBPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIEZsYXRNYXBPYnNlcnZhYmxlKHNvdXJjZSwgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKSB7XG5cdCAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSBpc0Z1bmN0aW9uKHJlc3VsdFNlbGVjdG9yKSA/IHJlc3VsdFNlbGVjdG9yIDogbnVsbDtcblx0ICAgICAgdGhpcy5zZWxlY3RvciA9IGJpbmRDYWxsYmFjayhpc0Z1bmN0aW9uKHNlbGVjdG9yKSA/IHNlbGVjdG9yIDogZnVuY3Rpb24oKSB7IHJldHVybiBzZWxlY3RvcjsgfSwgdGhpc0FyZywgMyk7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBGbGF0TWFwT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnNlbGVjdG9yLCB0aGlzLnJlc3VsdFNlbGVjdG9yLCB0aGlzKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGluaGVyaXRzKElubmVyT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvYnNlcnZlciwgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCBzb3VyY2UpIHtcblx0ICAgICAgdGhpcy5pID0gMDtcblx0ICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHQgICAgICB0aGlzLnJlc3VsdFNlbGVjdG9yID0gcmVzdWx0U2VsZWN0b3I7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLm8gPSBvYnNlcnZlcjtcblx0ICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLl93cmFwUmVzdWx0ID0gZnVuY3Rpb24ocmVzdWx0LCB4LCBpKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnJlc3VsdFNlbGVjdG9yID9cblx0ICAgICAgICByZXN1bHQubWFwKGZ1bmN0aW9uKHksIGkyKSB7IHJldHVybiB0aGlzLnJlc3VsdFNlbGVjdG9yKHgsIHksIGksIGkyKTsgfSwgdGhpcykgOlxuXHQgICAgICAgIHJlc3VsdDtcblx0ICAgIH07XG5cdFxuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHgpIHtcblx0ICAgICAgdmFyIGkgPSB0aGlzLmkrKztcblx0ICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMuc2VsZWN0b3IpKHgsIGksIHRoaXMuc291cmNlKTtcblx0ICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKHJlc3VsdC5lKTsgfVxuXHRcblx0ICAgICAgaXNQcm9taXNlKHJlc3VsdCkgJiYgKHJlc3VsdCA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShyZXN1bHQpKTtcblx0ICAgICAgKGlzQXJyYXlMaWtlKHJlc3VsdCkgfHwgaXNJdGVyYWJsZShyZXN1bHQpKSAmJiAocmVzdWx0ID0gT2JzZXJ2YWJsZS5mcm9tKHJlc3VsdCkpO1xuXHQgICAgICB0aGlzLm8ub25OZXh0KHRoaXMuX3dyYXBSZXN1bHQocmVzdWx0LCB4LCBpKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZSkgeyB0aGlzLm8ub25FcnJvcihlKTsgfTtcblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uKCkgeyB0aGlzLm8ub25Db21wbGV0ZWQoKTsgfTtcblx0XG5cdCAgICByZXR1cm4gRmxhdE1hcE9ic2VydmFibGU7XG5cdFxuXHR9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBFbnVtZXJhYmxlID0gUnguaW50ZXJuYWxzLkVudW1lcmFibGUgPSBmdW5jdGlvbiAoKSB7IH07XG5cdFxuXHQgIGZ1bmN0aW9uIElzRGlzcG9zZWREaXNwb3NhYmxlKHN0YXRlKSB7XG5cdCAgICB0aGlzLl9zID0gc3RhdGU7XG5cdCAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcblx0ICB9XG5cdFxuXHQgIElzRGlzcG9zZWREaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICB2YXIgQ29uY2F0RW51bWVyYWJsZU9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIENvbmNhdEVudW1lcmFibGVPYnNlcnZhYmxlKHNvdXJjZXMpIHtcblx0ICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgQ29uY2F0RW51bWVyYWJsZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgc3RhdGUgPSB7IGlzRGlzcG9zZWQ6IGZhbHNlIH0sIHN1YnNjcmlwdGlvbiA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG5cdCAgICAgIHZhciBjYW5jZWxhYmxlID0gY3VycmVudFRocmVhZFNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSh0aGlzLnNvdXJjZXNbJGl0ZXJhdG9yJF0oKSwgZnVuY3Rpb24gKGUsIHNlbGYpIHtcblx0ICAgICAgICBpZiAoc3RhdGUuaXNEaXNwb3NlZCkgeyByZXR1cm47IH1cblx0ICAgICAgICB2YXIgY3VycmVudEl0ZW0gPSB0cnlDYXRjaChlLm5leHQpLmNhbGwoZSk7XG5cdCAgICAgICAgaWYgKGN1cnJlbnRJdGVtID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKGN1cnJlbnRJdGVtLmUpOyB9XG5cdFxuXHQgICAgICAgIGlmIChjdXJyZW50SXRlbS5kb25lKSB7XG5cdCAgICAgICAgICByZXR1cm4gby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgLy8gQ2hlY2sgaWYgcHJvbWlzZVxuXHQgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBjdXJyZW50SXRlbS52YWx1ZTtcblx0ICAgICAgICBpc1Byb21pc2UoY3VycmVudFZhbHVlKSAmJiAoY3VycmVudFZhbHVlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKGN1cnJlbnRWYWx1ZSkpO1xuXHRcblx0ICAgICAgICB2YXIgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKGQpO1xuXHQgICAgICAgIGQuc2V0RGlzcG9zYWJsZShjdXJyZW50VmFsdWUuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHNlbGYsIGUpKSk7XG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgcmV0dXJuIG5ldyBOQXJ5RGlzcG9zYWJsZShbc3Vic2NyaXB0aW9uLCBjYW5jZWxhYmxlLCBuZXcgSXNEaXNwb3NlZERpc3Bvc2FibGUoc3RhdGUpXSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGluaGVyaXRzKElubmVyT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvLCBzLCBlKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9zID0gcztcblx0ICAgICAgdGhpcy5fZSA9IGU7XG5cdCAgICAgIEFic3RyYWN0T2JzZXJ2ZXIuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uICh4KSB7IHRoaXMuX28ub25OZXh0KHgpOyB9O1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuX28ub25FcnJvcihlKTsgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9zKHRoaXMuX2UpOyB9O1xuXHRcblx0ICAgIHJldHVybiBDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIEVudW1lcmFibGUucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBuZXcgQ29uY2F0RW51bWVyYWJsZU9ic2VydmFibGUodGhpcyk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIENhdGNoRXJyb3JPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQ2F0Y2hFcnJvck9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBDYXRjaEVycm9yT2JzZXJ2YWJsZShzb3VyY2VzKSB7XG5cdCAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIENhdGNoRXJyb3JPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGUgPSB0aGlzLnNvdXJjZXNbJGl0ZXJhdG9yJF0oKTtcblx0XG5cdCAgICAgIHZhciBzdGF0ZSA9IHsgaXNEaXNwb3NlZDogZmFsc2UgfSwgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKTtcblx0ICAgICAgdmFyIGNhbmNlbGFibGUgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKG51bGwsIGZ1bmN0aW9uIChsYXN0RXhjZXB0aW9uLCBzZWxmKSB7XG5cdCAgICAgICAgaWYgKHN0YXRlLmlzRGlzcG9zZWQpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgdmFyIGN1cnJlbnRJdGVtID0gdHJ5Q2F0Y2goZS5uZXh0KS5jYWxsKGUpO1xuXHQgICAgICAgIGlmIChjdXJyZW50SXRlbSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihjdXJyZW50SXRlbS5lKTsgfVxuXHRcblx0ICAgICAgICBpZiAoY3VycmVudEl0ZW0uZG9uZSkge1xuXHQgICAgICAgICAgcmV0dXJuIGxhc3RFeGNlcHRpb24gIT09IG51bGwgPyBvLm9uRXJyb3IobGFzdEV4Y2VwdGlvbikgOiBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICAvLyBDaGVjayBpZiBwcm9taXNlXG5cdCAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRJdGVtLnZhbHVlO1xuXHQgICAgICAgIGlzUHJvbWlzZShjdXJyZW50VmFsdWUpICYmIChjdXJyZW50VmFsdWUgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoY3VycmVudFZhbHVlKSk7XG5cdFxuXHQgICAgICAgIHZhciBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgICAgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUoZCk7XG5cdCAgICAgICAgZC5zZXREaXNwb3NhYmxlKGN1cnJlbnRWYWx1ZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobywgc2VsZikpKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiBuZXcgTkFyeURpc3Bvc2FibGUoW3N1YnNjcmlwdGlvbiwgY2FuY2VsYWJsZSwgbmV3IElzRGlzcG9zZWREaXNwb3NhYmxlKHN0YXRlKV0pO1xuXHQgICAgfTtcblx0XG5cdCAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcblx0ICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIobywgcmVjdXJzZSkge1xuXHQgICAgICB0aGlzLl9vID0gbztcblx0ICAgICAgdGhpcy5fcmVjdXJzZSA9IHJlY3Vyc2U7XG5cdCAgICAgIEFic3RyYWN0T2JzZXJ2ZXIuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHsgdGhpcy5fby5vbk5leHQoeCk7IH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuX3JlY3Vyc2UoZSk7IH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX28ub25Db21wbGV0ZWQoKTsgfTtcblx0XG5cdCAgICByZXR1cm4gQ2F0Y2hFcnJvck9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICBFbnVtZXJhYmxlLnByb3RvdHlwZS5jYXRjaEVycm9yID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIG5ldyBDYXRjaEVycm9yT2JzZXJ2YWJsZSh0aGlzKTtcblx0ICB9O1xuXHRcblx0ICBFbnVtZXJhYmxlLnByb3RvdHlwZS5jYXRjaEVycm9yV2hlbiA9IGZ1bmN0aW9uIChub3RpZmljYXRpb25IYW5kbGVyKSB7XG5cdCAgICB2YXIgc291cmNlcyA9IHRoaXM7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGV4Y2VwdGlvbnMgPSBuZXcgU3ViamVjdCgpLFxuXHQgICAgICAgIG5vdGlmaWVyID0gbmV3IFN1YmplY3QoKSxcblx0ICAgICAgICBoYW5kbGVkID0gbm90aWZpY2F0aW9uSGFuZGxlcihleGNlcHRpb25zKSxcblx0ICAgICAgICBub3RpZmljYXRpb25EaXNwb3NhYmxlID0gaGFuZGxlZC5zdWJzY3JpYmUobm90aWZpZXIpO1xuXHRcblx0ICAgICAgdmFyIGUgPSBzb3VyY2VzWyRpdGVyYXRvciRdKCk7XG5cdFxuXHQgICAgICB2YXIgc3RhdGUgPSB7IGlzRGlzcG9zZWQ6IGZhbHNlIH0sXG5cdCAgICAgICAgbGFzdEV4Y2VwdGlvbixcblx0ICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpO1xuXHQgICAgICB2YXIgY2FuY2VsYWJsZSA9IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUobnVsbCwgZnVuY3Rpb24gKF8sIHNlbGYpIHtcblx0ICAgICAgICBpZiAoc3RhdGUuaXNEaXNwb3NlZCkgeyByZXR1cm47IH1cblx0ICAgICAgICB2YXIgY3VycmVudEl0ZW0gPSB0cnlDYXRjaChlLm5leHQpLmNhbGwoZSk7XG5cdCAgICAgICAgaWYgKGN1cnJlbnRJdGVtID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKGN1cnJlbnRJdGVtLmUpOyB9XG5cdFxuXHQgICAgICAgIGlmIChjdXJyZW50SXRlbS5kb25lKSB7XG5cdCAgICAgICAgICBpZiAobGFzdEV4Y2VwdGlvbikge1xuXHQgICAgICAgICAgICBvLm9uRXJyb3IobGFzdEV4Y2VwdGlvbik7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICAvLyBDaGVjayBpZiBwcm9taXNlXG5cdCAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRJdGVtLnZhbHVlO1xuXHQgICAgICAgIGlzUHJvbWlzZShjdXJyZW50VmFsdWUpICYmIChjdXJyZW50VmFsdWUgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoY3VycmVudFZhbHVlKSk7XG5cdFxuXHQgICAgICAgIHZhciBvdXRlciA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICAgIHZhciBpbm5lciA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG5ldyBCaW5hcnlEaXNwb3NhYmxlKGlubmVyLCBvdXRlcikpO1xuXHQgICAgICAgIG91dGVyLnNldERpc3Bvc2FibGUoY3VycmVudFZhbHVlLnN1YnNjcmliZShcblx0ICAgICAgICAgIGZ1bmN0aW9uKHgpIHsgby5vbk5leHQoeCk7IH0sXG5cdCAgICAgICAgICBmdW5jdGlvbiAoZXhuKSB7XG5cdCAgICAgICAgICAgIGlubmVyLnNldERpc3Bvc2FibGUobm90aWZpZXIuc3Vic2NyaWJlKHNlbGYsIGZ1bmN0aW9uKGV4KSB7XG5cdCAgICAgICAgICAgICAgby5vbkVycm9yKGV4KTtcblx0ICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgICAgICB9KSk7XG5cdFxuXHQgICAgICAgICAgICBleGNlcHRpb25zLm9uTmV4dChleG4pO1xuXHQgICAgICAgICAgfSxcblx0ICAgICAgICAgIGZ1bmN0aW9uKCkgeyBvLm9uQ29tcGxldGVkKCk7IH0pKTtcblx0ICAgICAgfSk7XG5cdFxuXHQgICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKFtub3RpZmljYXRpb25EaXNwb3NhYmxlLCBzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUsIG5ldyBJc0Rpc3Bvc2VkRGlzcG9zYWJsZShzdGF0ZSldKTtcblx0ICAgIH0pO1xuXHQgIH07XG5cdFxuXHQgIHZhciBSZXBlYXRFbnVtZXJhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFJlcGVhdEVudW1lcmFibGUsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gUmVwZWF0RW51bWVyYWJsZSh2LCBjKSB7XG5cdCAgICAgIHRoaXMudiA9IHY7XG5cdCAgICAgIHRoaXMuYyA9IGMgPT0gbnVsbCA/IC0xIDogYztcblx0ICAgIH1cblx0ICAgIFJlcGVhdEVudW1lcmFibGUucHJvdG90eXBlWyRpdGVyYXRvciRdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gbmV3IFJlcGVhdEVudW1lcmF0b3IodGhpcyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGZ1bmN0aW9uIFJlcGVhdEVudW1lcmF0b3IocCkge1xuXHQgICAgICB0aGlzLnYgPSBwLnY7XG5cdCAgICAgIHRoaXMubCA9IHAuYztcblx0ICAgIH1cblx0ICAgIFJlcGVhdEVudW1lcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGlmICh0aGlzLmwgPT09IDApIHsgcmV0dXJuIGRvbmVFbnVtZXJhdG9yOyB9XG5cdCAgICAgIGlmICh0aGlzLmwgPiAwKSB7IHRoaXMubC0tOyB9XG5cdCAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdGhpcy52IH07XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBSZXBlYXRFbnVtZXJhYmxlO1xuXHQgIH0oRW51bWVyYWJsZSkpO1xuXHRcblx0ICB2YXIgZW51bWVyYWJsZVJlcGVhdCA9IEVudW1lcmFibGUucmVwZWF0ID0gZnVuY3Rpb24gKHZhbHVlLCByZXBlYXRDb3VudCkge1xuXHQgICAgcmV0dXJuIG5ldyBSZXBlYXRFbnVtZXJhYmxlKHZhbHVlLCByZXBlYXRDb3VudCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIE9mRW51bWVyYWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE9mRW51bWVyYWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIE9mRW51bWVyYWJsZShzLCBmbiwgdGhpc0FyZykge1xuXHQgICAgICB0aGlzLnMgPSBzO1xuXHQgICAgICB0aGlzLmZuID0gZm4gPyBiaW5kQ2FsbGJhY2soZm4sIHRoaXNBcmcsIDMpIDogbnVsbDtcblx0ICAgIH1cblx0ICAgIE9mRW51bWVyYWJsZS5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiBuZXcgT2ZFbnVtZXJhdG9yKHRoaXMpO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBPZkVudW1lcmF0b3IocCkge1xuXHQgICAgICB0aGlzLmkgPSAtMTtcblx0ICAgICAgdGhpcy5zID0gcC5zO1xuXHQgICAgICB0aGlzLmwgPSB0aGlzLnMubGVuZ3RoO1xuXHQgICAgICB0aGlzLmZuID0gcC5mbjtcblx0ICAgIH1cblx0ICAgIE9mRW51bWVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICByZXR1cm4gKyt0aGlzLmkgPCB0aGlzLmwgP1xuXHQgICAgICAgeyBkb25lOiBmYWxzZSwgdmFsdWU6ICF0aGlzLmZuID8gdGhpcy5zW3RoaXMuaV0gOiB0aGlzLmZuKHRoaXMuc1t0aGlzLmldLCB0aGlzLmksIHRoaXMucykgfSA6XG5cdCAgICAgICBkb25lRW51bWVyYXRvcjtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIE9mRW51bWVyYWJsZTtcblx0ICB9KEVudW1lcmFibGUpKTtcblx0XG5cdCAgdmFyIGVudW1lcmFibGVPZiA9IEVudW1lcmFibGUub2YgPSBmdW5jdGlvbiAoc291cmNlLCBzZWxlY3RvciwgdGhpc0FyZykge1xuXHQgICAgcmV0dXJuIG5ldyBPZkVudW1lcmFibGUoc291cmNlLCBzZWxlY3RvciwgdGhpc0FyZyk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFRvQXJyYXlPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoVG9BcnJheU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBUb0FycmF5T2JzZXJ2YWJsZShzb3VyY2UpIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFRvQXJyYXlPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24obykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8pKTtcblx0ICAgIH07XG5cdFxuXHQgICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG5cdCAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8pIHtcblx0ICAgICAgdGhpcy5vID0gbztcblx0ICAgICAgdGhpcy5hID0gW107XG5cdCAgICAgIEFic3RyYWN0T2JzZXJ2ZXIuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0ICAgIFxuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7IHRoaXMuYS5wdXNoKHgpOyB9O1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLm8ub25FcnJvcihlKTsgIH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuby5vbk5leHQodGhpcy5hKTsgdGhpcy5vLm9uQ29tcGxldGVkKCk7IH07XG5cdFxuXHQgICAgcmV0dXJuIFRvQXJyYXlPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgKiBDcmVhdGVzIGFuIGFycmF5IGZyb20gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgYSBzaW5nbGUgZWxlbWVudCB3aXRoIGEgbGlzdCBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cblx0ICAqL1xuXHQgIG9ic2VydmFibGVQcm90by50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIG5ldyBUb0FycmF5T2JzZXJ2YWJsZSh0aGlzKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiAgQ3JlYXRlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGZyb20gYSBzcGVjaWZpZWQgc3Vic2NyaWJlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi5cblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5jcmVhdGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IH0gKTtcblx0ICAgKiAgdmFyIHJlcyA9IFJ4Lk9ic2VydmFibGUuY3JlYXRlKGZ1bmN0aW9uIChvYnNlcnZlcikgeyByZXR1cm4gUnguRGlzcG9zYWJsZS5lbXB0eTsgfSApO1xuXHQgICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5jcmVhdGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7IH0gKTtcblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWJzY3JpYmUgSW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc3VsdGluZyBvYnNlcnZhYmxlIHNlcXVlbmNlJ3Mgc3Vic2NyaWJlIG1ldGhvZCwgcmV0dXJuaW5nIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHdyYXBwZWQgaW4gYSBEaXNwb3NhYmxlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTdWJzY3JpYmUgbWV0aG9kLlxuXHQgICAqL1xuXHQgIE9ic2VydmFibGUuY3JlYXRlID0gZnVuY3Rpb24gKHN1YnNjcmliZSwgcGFyZW50KSB7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoc3Vic2NyaWJlLCBwYXJlbnQpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBEZWZlciA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKERlZmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gRGVmZXIoZmFjdG9yeSkge1xuXHQgICAgICB0aGlzLl9mID0gZmFjdG9yeTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgRGVmZXIucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godGhpcy5fZikoKTtcblx0ICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG9ic2VydmFibGVUaHJvdyhyZXN1bHQuZSkuc3Vic2NyaWJlKG8pO31cblx0ICAgICAgaXNQcm9taXNlKHJlc3VsdCkgJiYgKHJlc3VsdCA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShyZXN1bHQpKTtcblx0ICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzY3JpYmUobyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBEZWZlcjtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBpbnZva2VzIHRoZSBzcGVjaWZpZWQgZmFjdG9yeSBmdW5jdGlvbiB3aGVuZXZlciBhIG5ldyBvYnNlcnZlciBzdWJzY3JpYmVzLlxuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiAgdmFyIHJlcyA9IFJ4Lk9ic2VydmFibGUuZGVmZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gUnguT2JzZXJ2YWJsZS5mcm9tQXJyYXkoWzEsMiwzXSk7IH0pO1xuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9ic2VydmFibGVGYWN0b3J5IE9ic2VydmFibGUgZmFjdG9yeSBmdW5jdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggb2JzZXJ2ZXIgdGhhdCBzdWJzY3JpYmVzIHRvIHRoZSByZXN1bHRpbmcgc2VxdWVuY2Ugb3IgUHJvbWlzZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBvYnNlcnZlcnMgdHJpZ2dlciBhbiBpbnZvY2F0aW9uIG9mIHRoZSBnaXZlbiBvYnNlcnZhYmxlIGZhY3RvcnkgZnVuY3Rpb24uXG5cdCAgICovXG5cdCAgdmFyIG9ic2VydmFibGVEZWZlciA9IE9ic2VydmFibGUuZGVmZXIgPSBmdW5jdGlvbiAob2JzZXJ2YWJsZUZhY3RvcnkpIHtcblx0ICAgIHJldHVybiBuZXcgRGVmZXIob2JzZXJ2YWJsZUZhY3RvcnkpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBFbXB0eU9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhFbXB0eU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBFbXB0eU9ic2VydmFibGUoc2NoZWR1bGVyKSB7XG5cdCAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBFbXB0eU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcblx0ICAgICAgdmFyIHNpbmsgPSBuZXcgRW1wdHlTaW5rKG9ic2VydmVyLCB0aGlzLnNjaGVkdWxlcik7XG5cdCAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBFbXB0eVNpbmsob2JzZXJ2ZXIsIHNjaGVkdWxlcikge1xuXHQgICAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG5cdCAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIHNjaGVkdWxlSXRlbShzLCBzdGF0ZSkge1xuXHQgICAgICBzdGF0ZS5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuXHQgICAgfVxuXHRcblx0ICAgIEVtcHR5U2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB2YXIgc3RhdGUgPSB0aGlzLm9ic2VydmVyO1xuXHQgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZXIgPT09IGltbWVkaWF0ZVNjaGVkdWxlciA/XG5cdCAgICAgICAgc2NoZWR1bGVJdGVtKG51bGwsIHN0YXRlKSA6XG5cdCAgICAgICAgdGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUoc3RhdGUsIHNjaGVkdWxlSXRlbSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBFbXB0eU9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgRU1QVFlfT0JTRVJWQUJMRSA9IG5ldyBFbXB0eU9ic2VydmFibGUoaW1tZWRpYXRlU2NoZWR1bGVyKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJldHVybnMgYW4gZW1wdHkgb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2hlZHVsZXIgdG8gc2VuZCBvdXQgdGhlIHNpbmdsZSBPbkNvbXBsZXRlZCBtZXNzYWdlLlxuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiAgdmFyIHJlcyA9IFJ4Lk9ic2VydmFibGUuZW1wdHkoKTtcblx0ICAgKiAgdmFyIHJlcyA9IFJ4Lk9ic2VydmFibGUuZW1wdHkoUnguU2NoZWR1bGVyLnRpbWVvdXQpO1xuXHQgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gc2VuZCB0aGUgdGVybWluYXRpb24gY2FsbCBvbi5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIG5vIGVsZW1lbnRzLlxuXHQgICAqL1xuXHQgIHZhciBvYnNlcnZhYmxlRW1wdHkgPSBPYnNlcnZhYmxlLmVtcHR5ID0gZnVuY3Rpb24gKHNjaGVkdWxlcikge1xuXHQgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyKTtcblx0ICAgIHJldHVybiBzY2hlZHVsZXIgPT09IGltbWVkaWF0ZVNjaGVkdWxlciA/IEVNUFRZX09CU0VSVkFCTEUgOiBuZXcgRW1wdHlPYnNlcnZhYmxlKHNjaGVkdWxlcik7XG5cdCAgfTtcblx0XG5cdCAgdmFyIEZyb21PYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRnJvbU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBGcm9tT2JzZXJ2YWJsZShpdGVyYWJsZSwgbWFwcGVyLCBzY2hlZHVsZXIpIHtcblx0ICAgICAgdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlO1xuXHQgICAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIEZyb21PYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIHNpbmsgPSBuZXcgRnJvbVNpbmsobywgdGhpcyk7XG5cdCAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gRnJvbU9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgRnJvbVNpbmsgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRnJvbVNpbmsobywgcGFyZW50KSB7XG5cdCAgICAgIHRoaXMubyA9IG87XG5cdCAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHRcblx0ICAgIEZyb21TaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBsaXN0ID0gT2JqZWN0KHRoaXMucGFyZW50Lml0ZXJhYmxlKSxcblx0ICAgICAgICAgIGl0ID0gZ2V0SXRlcmFibGUobGlzdCksXG5cdCAgICAgICAgICBvID0gdGhpcy5vLFxuXHQgICAgICAgICAgbWFwcGVyID0gdGhpcy5wYXJlbnQubWFwcGVyO1xuXHRcblx0ICAgICAgZnVuY3Rpb24gbG9vcFJlY3Vyc2l2ZShpLCByZWN1cnNlKSB7XG5cdCAgICAgICAgdmFyIG5leHQgPSB0cnlDYXRjaChpdC5uZXh0KS5jYWxsKGl0KTtcblx0ICAgICAgICBpZiAobmV4dCA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihuZXh0LmUpOyB9XG5cdCAgICAgICAgaWYgKG5leHQuZG9uZSkgeyByZXR1cm4gby5vbkNvbXBsZXRlZCgpOyB9XG5cdFxuXHQgICAgICAgIHZhciByZXN1bHQgPSBuZXh0LnZhbHVlO1xuXHRcblx0ICAgICAgICBpZiAoaXNGdW5jdGlvbihtYXBwZXIpKSB7XG5cdCAgICAgICAgICByZXN1bHQgPSB0cnlDYXRjaChtYXBwZXIpKHJlc3VsdCwgaSk7XG5cdCAgICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdC5lKTsgfVxuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgby5vbk5leHQocmVzdWx0KTtcblx0ICAgICAgICByZWN1cnNlKGkgKyAxKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIHRoaXMucGFyZW50LnNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSgwLCBsb29wUmVjdXJzaXZlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIEZyb21TaW5rO1xuXHQgIH0oKSk7XG5cdFxuXHQgIHZhciBtYXhTYWZlSW50ZWdlciA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG5cdFxuXHQgIGZ1bmN0aW9uIFN0cmluZ0l0ZXJhYmxlKHMpIHtcblx0ICAgIHRoaXMuX3MgPSBzO1xuXHQgIH1cblx0XG5cdCAgU3RyaW5nSXRlcmFibGUucHJvdG90eXBlWyRpdGVyYXRvciRdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIG5ldyBTdHJpbmdJdGVyYXRvcih0aGlzLl9zKTtcblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBTdHJpbmdJdGVyYXRvcihzKSB7XG5cdCAgICB0aGlzLl9zID0gcztcblx0ICAgIHRoaXMuX2wgPSBzLmxlbmd0aDtcblx0ICAgIHRoaXMuX2kgPSAwO1xuXHQgIH1cblx0XG5cdCAgU3RyaW5nSXRlcmF0b3IucHJvdG90eXBlWyRpdGVyYXRvciRdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIHRoaXM7XG5cdCAgfTtcblx0XG5cdCAgU3RyaW5nSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5faSA8IHRoaXMuX2wgPyB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdGhpcy5fcy5jaGFyQXQodGhpcy5faSsrKSB9IDogZG9uZUVudW1lcmF0b3I7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24gQXJyYXlJdGVyYWJsZShhKSB7XG5cdCAgICB0aGlzLl9hID0gYTtcblx0ICB9XG5cdFxuXHQgIEFycmF5SXRlcmFibGUucHJvdG90eXBlWyRpdGVyYXRvciRdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKHRoaXMuX2EpO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIEFycmF5SXRlcmF0b3IoYSkge1xuXHQgICAgdGhpcy5fYSA9IGE7XG5cdCAgICB0aGlzLl9sID0gdG9MZW5ndGgoYSk7XG5cdCAgICB0aGlzLl9pID0gMDtcblx0ICB9XG5cdFxuXHQgIEFycmF5SXRlcmF0b3IucHJvdG90eXBlWyRpdGVyYXRvciRdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIHRoaXM7XG5cdCAgfTtcblx0XG5cdCAgQXJyYXlJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9pIDwgdGhpcy5fbCA/IHsgZG9uZTogZmFsc2UsIHZhbHVlOiB0aGlzLl9hW3RoaXMuX2krK10gfSA6IGRvbmVFbnVtZXJhdG9yO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIG51bWJlcklzRmluaXRlKHZhbHVlKSB7XG5cdCAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiByb290LmlzRmluaXRlKHZhbHVlKTtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIGlzTmFuKG4pIHtcblx0ICAgIHJldHVybiBuICE9PSBuO1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gZ2V0SXRlcmFibGUobykge1xuXHQgICAgdmFyIGkgPSBvWyRpdGVyYXRvciRdLCBpdDtcblx0ICAgIGlmICghaSAmJiB0eXBlb2YgbyA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgaXQgPSBuZXcgU3RyaW5nSXRlcmFibGUobyk7XG5cdCAgICAgIHJldHVybiBpdFskaXRlcmF0b3IkXSgpO1xuXHQgICAgfVxuXHQgICAgaWYgKCFpICYmIG8ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgaXQgPSBuZXcgQXJyYXlJdGVyYWJsZShvKTtcblx0ICAgICAgcmV0dXJuIGl0WyRpdGVyYXRvciRdKCk7XG5cdCAgICB9XG5cdCAgICBpZiAoIWkpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0IGlzIG5vdCBpdGVyYWJsZScpOyB9XG5cdCAgICByZXR1cm4gb1skaXRlcmF0b3IkXSgpO1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gc2lnbih2YWx1ZSkge1xuXHQgICAgdmFyIG51bWJlciA9ICt2YWx1ZTtcblx0ICAgIGlmIChudW1iZXIgPT09IDApIHsgcmV0dXJuIG51bWJlcjsgfVxuXHQgICAgaWYgKGlzTmFOKG51bWJlcikpIHsgcmV0dXJuIG51bWJlcjsgfVxuXHQgICAgcmV0dXJuIG51bWJlciA8IDAgPyAtMSA6IDE7XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiB0b0xlbmd0aChvKSB7XG5cdCAgICB2YXIgbGVuID0gK28ubGVuZ3RoO1xuXHQgICAgaWYgKGlzTmFOKGxlbikpIHsgcmV0dXJuIDA7IH1cblx0ICAgIGlmIChsZW4gPT09IDAgfHwgIW51bWJlcklzRmluaXRlKGxlbikpIHsgcmV0dXJuIGxlbjsgfVxuXHQgICAgbGVuID0gc2lnbihsZW4pICogTWF0aC5mbG9vcihNYXRoLmFicyhsZW4pKTtcblx0ICAgIGlmIChsZW4gPD0gMCkgeyByZXR1cm4gMDsgfVxuXHQgICAgaWYgKGxlbiA+IG1heFNhZmVJbnRlZ2VyKSB7IHJldHVybiBtYXhTYWZlSW50ZWdlcjsgfVxuXHQgICAgcmV0dXJuIGxlbjtcblx0ICB9XG5cdFxuXHQgIC8qKlxuXHQgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBPYnNlcnZhYmxlIHNlcXVlbmNlIGZyb20gYW4gYXJyYXktbGlrZSBvciBpdGVyYWJsZSBvYmplY3QuXG5cdCAgKiBAcGFyYW0ge0FueX0gYXJyYXlMaWtlIEFuIGFycmF5LWxpa2Ugb3IgaXRlcmFibGUgb2JqZWN0IHRvIGNvbnZlcnQgdG8gYW4gT2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqIEBwYXJhbSB7RnVuY3Rpb259IFttYXBGbl0gTWFwIGZ1bmN0aW9uIHRvIGNhbGwgb24gZXZlcnkgZWxlbWVudCBvZiB0aGUgYXJyYXkuXG5cdCAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIFRoZSBjb250ZXh0IHRvIHVzZSBjYWxsaW5nIHRoZSBtYXBGbiBpZiBwcm92aWRlZC5cblx0ICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBPcHRpb25hbCBzY2hlZHVsZXIgdG8gdXNlIGZvciBzY2hlZHVsaW5nLiAgSWYgbm90IHByb3ZpZGVkLCBkZWZhdWx0cyB0byBTY2hlZHVsZXIuY3VycmVudFRocmVhZC5cblx0ICAqL1xuXHQgIHZhciBvYnNlcnZhYmxlRnJvbSA9IE9ic2VydmFibGUuZnJvbSA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgbWFwRm4sIHRoaXNBcmcsIHNjaGVkdWxlcikge1xuXHQgICAgaWYgKGl0ZXJhYmxlID09IG51bGwpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKCdpdGVyYWJsZSBjYW5ub3QgYmUgbnVsbC4nKVxuXHQgICAgfVxuXHQgICAgaWYgKG1hcEZuICYmICFpc0Z1bmN0aW9uKG1hcEZuKSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hcEZuIHdoZW4gcHJvdmlkZWQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdCAgICB9XG5cdCAgICBpZiAobWFwRm4pIHtcblx0ICAgICAgdmFyIG1hcHBlciA9IGJpbmRDYWxsYmFjayhtYXBGbiwgdGhpc0FyZywgMik7XG5cdCAgICB9XG5cdCAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyKTtcblx0ICAgIHJldHVybiBuZXcgRnJvbU9ic2VydmFibGUoaXRlcmFibGUsIG1hcHBlciwgc2NoZWR1bGVyKTtcblx0ICB9XG5cdFxuXHQgIHZhciBGcm9tQXJyYXlPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRnJvbUFycmF5T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIEZyb21BcnJheU9ic2VydmFibGUoYXJncywgc2NoZWR1bGVyKSB7XG5cdCAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG5cdCAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBGcm9tQXJyYXlPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG5cdCAgICAgIHZhciBzaW5rID0gbmV3IEZyb21BcnJheVNpbmsob2JzZXJ2ZXIsIHRoaXMpO1xuXHQgICAgICByZXR1cm4gc2luay5ydW4oKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIEZyb21BcnJheU9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICBmdW5jdGlvbiBGcm9tQXJyYXlTaW5rKG9ic2VydmVyLCBwYXJlbnQpIHtcblx0ICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcblx0ICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gbG9vcFJlY3Vyc2l2ZShhcmdzLCBvYnNlcnZlcikge1xuXHQgICAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuXHQgICAgcmV0dXJuIGZ1bmN0aW9uIGxvb3AgKGksIHJlY3Vyc2UpIHtcblx0ICAgICAgaWYgKGkgPCBsZW4pIHtcblx0ICAgICAgICBvYnNlcnZlci5vbk5leHQoYXJnc1tpXSk7XG5cdCAgICAgICAgcmVjdXJzZShpICsgMSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICB9XG5cdFxuXHQgIEZyb21BcnJheVNpbmsucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUoMCwgbG9vcFJlY3Vyc2l2ZSh0aGlzLnBhcmVudC5hcmdzLCB0aGlzLm9ic2VydmVyKSk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgKiAgQ29udmVydHMgYW4gYXJyYXkgdG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgdXNpbmcgYW4gb3B0aW9uYWwgc2NoZWR1bGVyIHRvIGVudW1lcmF0ZSB0aGUgYXJyYXkuXG5cdCAgKiBAZGVwcmVjYXRlZCB1c2UgT2JzZXJ2YWJsZS5mcm9tIG9yIE9ic2VydmFibGUub2Zcblx0ICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gcnVuIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgaW5wdXQgc2VxdWVuY2Ugb24uXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hvc2UgZWxlbWVudHMgYXJlIHB1bGxlZCBmcm9tIHRoZSBnaXZlbiBlbnVtZXJhYmxlIHNlcXVlbmNlLlxuXHQgICovXG5cdCAgdmFyIG9ic2VydmFibGVGcm9tQXJyYXkgPSBPYnNlcnZhYmxlLmZyb21BcnJheSA9IGZ1bmN0aW9uIChhcnJheSwgc2NoZWR1bGVyKSB7XG5cdCAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyKTtcblx0ICAgIHJldHVybiBuZXcgRnJvbUFycmF5T2JzZXJ2YWJsZShhcnJheSwgc2NoZWR1bGVyKVxuXHQgIH07XG5cdFxuXHQgIHZhciBOZXZlck9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhOZXZlck9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBOZXZlck9ic2VydmFibGUoKSB7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIE5ldmVyT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuXHQgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gTmV2ZXJPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIE5FVkVSX09CU0VSVkFCTEUgPSBuZXcgTmV2ZXJPYnNlcnZhYmxlKCk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIFJldHVybnMgYSBub24tdGVybWluYXRpbmcgb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGVub3RlIGFuIGluZmluaXRlIGR1cmF0aW9uIChlLmcuIHdoZW4gdXNpbmcgcmVhY3RpdmUgam9pbnMpLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHdob3NlIG9ic2VydmVycyB3aWxsIG5ldmVyIGdldCBjYWxsZWQuXG5cdCAgICovXG5cdCAgdmFyIG9ic2VydmFibGVOZXZlciA9IE9ic2VydmFibGUubmV2ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gTkVWRVJfT0JTRVJWQUJMRTtcblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBvYnNlcnZhYmxlT2YgKHNjaGVkdWxlciwgYXJyYXkpIHtcblx0ICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIpO1xuXHQgICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFycmF5LCBzY2hlZHVsZXIpO1xuXHQgIH1cblx0XG5cdCAgLyoqXG5cdCAgKiAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBPYnNlcnZhYmxlIGluc3RhbmNlIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLCByZWdhcmRsZXNzIG9mIG51bWJlciBvciB0eXBlIG9mIHRoZSBhcmd1bWVudHMuXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hvc2UgZWxlbWVudHMgYXJlIHB1bGxlZCBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudHMuXG5cdCAgKi9cblx0ICBPYnNlcnZhYmxlLm9mID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgICByZXR1cm4gbmV3IEZyb21BcnJheU9ic2VydmFibGUoYXJncywgY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgKiAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBPYnNlcnZhYmxlIGluc3RhbmNlIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLCByZWdhcmRsZXNzIG9mIG51bWJlciBvciB0eXBlIG9mIHRoZSBhcmd1bWVudHMuXG5cdCAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIEEgc2NoZWR1bGVyIHRvIHVzZSBmb3Igc2NoZWR1bGluZyB0aGUgYXJndW1lbnRzLlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdob3NlIGVsZW1lbnRzIGFyZSBwdWxsZWQgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnRzLlxuXHQgICovXG5cdCAgT2JzZXJ2YWJsZS5vZldpdGhTY2hlZHVsZXIgPSBmdW5jdGlvbiAoc2NoZWR1bGVyKSB7XG5cdCAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcblx0ICAgIGZvcih2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgeyBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFyZ3MsIHNjaGVkdWxlcik7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFBhaXJzT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFBhaXJzT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFBhaXJzT2JzZXJ2YWJsZShvYmosIHNjaGVkdWxlcikge1xuXHQgICAgICB0aGlzLm9iaiA9IG9iajtcblx0ICAgICAgdGhpcy5rZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFBhaXJzT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuXHQgICAgICB2YXIgc2luayA9IG5ldyBQYWlyc1Npbmsob2JzZXJ2ZXIsIHRoaXMpO1xuXHQgICAgICByZXR1cm4gc2luay5ydW4oKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFBhaXJzT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIGZ1bmN0aW9uIFBhaXJzU2luayhvYnNlcnZlciwgcGFyZW50KSB7XG5cdCAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG5cdCAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblx0ICB9XG5cdFxuXHQgIFBhaXJzU2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIG9ic2VydmVyID0gdGhpcy5vYnNlcnZlciwgb2JqID0gdGhpcy5wYXJlbnQub2JqLCBrZXlzID0gdGhpcy5wYXJlbnQua2V5cywgbGVuID0ga2V5cy5sZW5ndGg7XG5cdCAgICBmdW5jdGlvbiBsb29wUmVjdXJzaXZlKGksIHJlY3Vyc2UpIHtcblx0ICAgICAgaWYgKGkgPCBsZW4pIHtcblx0ICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblx0ICAgICAgICBvYnNlcnZlci5vbk5leHQoW2tleSwgb2JqW2tleV1dKTtcblx0ICAgICAgICByZWN1cnNlKGkgKyAxKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBvYnNlcnZlci5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdFxuXHQgICAgcmV0dXJuIHRoaXMucGFyZW50LnNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSgwLCBsb29wUmVjdXJzaXZlKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBDb252ZXJ0IGFuIG9iamVjdCBpbnRvIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugb2YgW2tleSwgdmFsdWVdIHBhaXJzLlxuXHQgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuXHQgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gcnVuIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgaW5wdXQgc2VxdWVuY2Ugb24uXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2Ugb2YgW2tleSwgdmFsdWVdIHBhaXJzIGZyb20gdGhlIG9iamVjdC5cblx0ICAgKi9cblx0ICBPYnNlcnZhYmxlLnBhaXJzID0gZnVuY3Rpb24gKG9iaiwgc2NoZWR1bGVyKSB7XG5cdCAgICBzY2hlZHVsZXIgfHwgKHNjaGVkdWxlciA9IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIpO1xuXHQgICAgcmV0dXJuIG5ldyBQYWlyc09ic2VydmFibGUob2JqLCBzY2hlZHVsZXIpO1xuXHQgIH07XG5cdFxuXHQgICAgdmFyIFJhbmdlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFJhbmdlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFJhbmdlT2JzZXJ2YWJsZShzdGFydCwgY291bnQsIHNjaGVkdWxlcikge1xuXHQgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG5cdCAgICAgIHRoaXMucmFuZ2VDb3VudCA9IGNvdW50O1xuXHQgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgUmFuZ2VPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG5cdCAgICAgIHZhciBzaW5rID0gbmV3IFJhbmdlU2luayhvYnNlcnZlciwgdGhpcyk7XG5cdCAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gUmFuZ2VPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIFJhbmdlU2luayA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBSYW5nZVNpbmsob2JzZXJ2ZXIsIHBhcmVudCkge1xuXHQgICAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG5cdCAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIGxvb3BSZWN1cnNpdmUoc3RhcnQsIGNvdW50LCBvYnNlcnZlcikge1xuXHQgICAgICByZXR1cm4gZnVuY3Rpb24gbG9vcCAoaSwgcmVjdXJzZSkge1xuXHQgICAgICAgIGlmIChpIDwgY291bnQpIHtcblx0ICAgICAgICAgIG9ic2VydmVyLm9uTmV4dChzdGFydCArIGkpO1xuXHQgICAgICAgICAgcmVjdXJzZShpICsgMSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG9ic2VydmVyLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHRcblx0ICAgIFJhbmdlU2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuc2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKFxuXHQgICAgICAgIDAsXG5cdCAgICAgICAgbG9vcFJlY3Vyc2l2ZSh0aGlzLnBhcmVudC5zdGFydCwgdGhpcy5wYXJlbnQucmFuZ2VDb3VudCwgdGhpcy5vYnNlcnZlcilcblx0ICAgICAgKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFJhbmdlU2luaztcblx0ICB9KCkpO1xuXHRcblx0ICAvKipcblx0ICAqICBHZW5lcmF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBpbnRlZ3JhbCBudW1iZXJzIHdpdGhpbiBhIHNwZWNpZmllZCByYW5nZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2hlZHVsZXIgdG8gc2VuZCBvdXQgb2JzZXJ2ZXIgbWVzc2FnZXMuXG5cdCAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnQgVGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBpbnRlZ2VyIGluIHRoZSBzZXF1ZW5jZS5cblx0ICAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgaW50ZWdlcnMgdG8gZ2VuZXJhdGUuXG5cdCAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gU2NoZWR1bGVyIHRvIHJ1biB0aGUgZ2VuZXJhdG9yIGxvb3Agb24uIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIFNjaGVkdWxlci5jdXJyZW50VGhyZWFkLlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyBhIHJhbmdlIG9mIHNlcXVlbnRpYWwgaW50ZWdyYWwgbnVtYmVycy5cblx0ICAqL1xuXHQgIE9ic2VydmFibGUucmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGNvdW50LCBzY2hlZHVsZXIpIHtcblx0ICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIpO1xuXHQgICAgcmV0dXJuIG5ldyBSYW5nZU9ic2VydmFibGUoc3RhcnQsIGNvdW50LCBzY2hlZHVsZXIpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBSZXBlYXRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoUmVwZWF0T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFJlcGVhdE9ic2VydmFibGUodmFsdWUsIHJlcGVhdENvdW50LCBzY2hlZHVsZXIpIHtcblx0ICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICB0aGlzLnJlcGVhdENvdW50ID0gcmVwZWF0Q291bnQgPT0gbnVsbCA/IC0xIDogcmVwZWF0Q291bnQ7XG5cdCAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBSZXBlYXRPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG5cdCAgICAgIHZhciBzaW5rID0gbmV3IFJlcGVhdFNpbmsob2JzZXJ2ZXIsIHRoaXMpO1xuXHQgICAgICByZXR1cm4gc2luay5ydW4oKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFJlcGVhdE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICBmdW5jdGlvbiBSZXBlYXRTaW5rKG9ic2VydmVyLCBwYXJlbnQpIHtcblx0ICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcblx0ICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXHQgIH1cblx0XG5cdCAgUmVwZWF0U2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIG9ic2VydmVyID0gdGhpcy5vYnNlcnZlciwgdmFsdWUgPSB0aGlzLnBhcmVudC52YWx1ZTtcblx0ICAgIGZ1bmN0aW9uIGxvb3BSZWN1cnNpdmUoaSwgcmVjdXJzZSkge1xuXHQgICAgICBpZiAoaSA9PT0gLTEgfHwgaSA+IDApIHtcblx0ICAgICAgICBvYnNlcnZlci5vbk5leHQodmFsdWUpO1xuXHQgICAgICAgIGkgPiAwICYmIGktLTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoaSA9PT0gMCkgeyByZXR1cm4gb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTsgfVxuXHQgICAgICByZWN1cnNlKGkpO1xuXHQgICAgfVxuXHRcblx0ICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUodGhpcy5wYXJlbnQucmVwZWF0Q291bnQsIGxvb3BSZWN1cnNpdmUpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqICBHZW5lcmF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHJlcGVhdHMgdGhlIGdpdmVuIGVsZW1lbnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMsIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2NoZWR1bGVyIHRvIHNlbmQgb3V0IG9ic2VydmVyIG1lc3NhZ2VzLlxuXHQgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIEVsZW1lbnQgdG8gcmVwZWF0LlxuXHQgICAqIEBwYXJhbSB7TnVtYmVyfSByZXBlYXRDb3VudCBbT3B0aW9uYV0gTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgZWxlbWVudC4gSWYgbm90IHNwZWNpZmllZCwgcmVwZWF0cyBpbmRlZmluaXRlbHkuXG5cdCAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciBTY2hlZHVsZXIgdG8gcnVuIHRoZSBwcm9kdWNlciBsb29wIG9uLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBTY2hlZHVsZXIuaW1tZWRpYXRlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgcmVwZWF0cyB0aGUgZ2l2ZW4gZWxlbWVudCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcy5cblx0ICAgKi9cblx0ICBPYnNlcnZhYmxlLnJlcGVhdCA9IGZ1bmN0aW9uICh2YWx1ZSwgcmVwZWF0Q291bnQsIHNjaGVkdWxlcikge1xuXHQgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG5cdCAgICByZXR1cm4gbmV3IFJlcGVhdE9ic2VydmFibGUodmFsdWUsIHJlcGVhdENvdW50LCBzY2hlZHVsZXIpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBKdXN0T2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKEp1c3RPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gSnVzdE9ic2VydmFibGUodmFsdWUsIHNjaGVkdWxlcikge1xuXHQgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBKdXN0T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuXHQgICAgICB2YXIgc2luayA9IG5ldyBKdXN0U2luayhvYnNlcnZlciwgdGhpcy52YWx1ZSwgdGhpcy5zY2hlZHVsZXIpO1xuXHQgICAgICByZXR1cm4gc2luay5ydW4oKTtcblx0ICAgIH07XG5cdFxuXHQgICAgZnVuY3Rpb24gSnVzdFNpbmsob2JzZXJ2ZXIsIHZhbHVlLCBzY2hlZHVsZXIpIHtcblx0ICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuXHQgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIHNjaGVkdWxlSXRlbShzLCBzdGF0ZSkge1xuXHQgICAgICB2YXIgdmFsdWUgPSBzdGF0ZVswXSwgb2JzZXJ2ZXIgPSBzdGF0ZVsxXTtcblx0ICAgICAgb2JzZXJ2ZXIub25OZXh0KHZhbHVlKTtcblx0ICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcblx0ICAgICAgcmV0dXJuIGRpc3Bvc2FibGVFbXB0eTtcblx0ICAgIH1cblx0XG5cdCAgICBKdXN0U2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB2YXIgc3RhdGUgPSBbdGhpcy52YWx1ZSwgdGhpcy5vYnNlcnZlcl07XG5cdCAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlciA9PT0gaW1tZWRpYXRlU2NoZWR1bGVyID9cblx0ICAgICAgICBzY2hlZHVsZUl0ZW0obnVsbCwgc3RhdGUpIDpcblx0ICAgICAgICB0aGlzLnNjaGVkdWxlci5zY2hlZHVsZShzdGF0ZSwgc2NoZWR1bGVJdGVtKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIEp1c3RPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGVsZW1lbnQsIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2NoZWR1bGVyIHRvIHNlbmQgb3V0IG9ic2VydmVyIG1lc3NhZ2VzLlxuXHQgICAqICBUaGVyZSBpcyBhbiBhbGlhcyBjYWxsZWQgJ2p1c3QnIG9yIGJyb3dzZXJzIDxJRTkuXG5cdCAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgU2luZ2xlIGVsZW1lbnQgaW4gdGhlIHJlc3VsdGluZyBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBzY2hlZHVsZXIgU2NoZWR1bGVyIHRvIHNlbmQgdGhlIHNpbmdsZSBlbGVtZW50IG9uLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBTY2hlZHVsZXIuaW1tZWRpYXRlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHNpbmdsZSBzcGVjaWZpZWQgZWxlbWVudC5cblx0ICAgKi9cblx0ICB2YXIgb2JzZXJ2YWJsZVJldHVybiA9IE9ic2VydmFibGVbJ3JldHVybiddID0gT2JzZXJ2YWJsZS5qdXN0ID0gZnVuY3Rpb24gKHZhbHVlLCBzY2hlZHVsZXIpIHtcblx0ICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGltbWVkaWF0ZVNjaGVkdWxlcik7XG5cdCAgICByZXR1cm4gbmV3IEp1c3RPYnNlcnZhYmxlKHZhbHVlLCBzY2hlZHVsZXIpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBUaHJvd09ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhUaHJvd09ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBUaHJvd09ic2VydmFibGUoZXJyb3IsIHNjaGVkdWxlcikge1xuXHQgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG5cdCAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBUaHJvd09ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgc2luayA9IG5ldyBUaHJvd1NpbmsobywgdGhpcyk7XG5cdCAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBUaHJvd1NpbmsobywgcCkge1xuXHQgICAgICB0aGlzLm8gPSBvO1xuXHQgICAgICB0aGlzLnAgPSBwO1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIHNjaGVkdWxlSXRlbShzLCBzdGF0ZSkge1xuXHQgICAgICB2YXIgZSA9IHN0YXRlWzBdLCBvID0gc3RhdGVbMV07XG5cdCAgICAgIG8ub25FcnJvcihlKTtcblx0ICAgIH1cblx0XG5cdCAgICBUaHJvd1NpbmsucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMucC5zY2hlZHVsZXIuc2NoZWR1bGUoW3RoaXMucC5lcnJvciwgdGhpcy5vXSwgc2NoZWR1bGVJdGVtKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFRocm93T2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCB0ZXJtaW5hdGVzIHdpdGggYW4gZXhjZXB0aW9uLCB1c2luZyB0aGUgc3BlY2lmaWVkIHNjaGVkdWxlciB0byBzZW5kIG91dCB0aGUgc2luZ2xlIG9uRXJyb3IgbWVzc2FnZS5cblx0ICAgKiAgVGhlcmUgaXMgYW4gYWxpYXMgdG8gdGhpcyBtZXRob2QgY2FsbGVkICd0aHJvd0Vycm9yJyBmb3IgYnJvd3NlcnMgPElFOS5cblx0ICAgKiBAcGFyYW0ge01peGVkfSBlcnJvciBBbiBvYmplY3QgdXNlZCBmb3IgdGhlIHNlcXVlbmNlJ3MgdGVybWluYXRpb24uXG5cdCAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciBTY2hlZHVsZXIgdG8gc2VuZCB0aGUgZXhjZXB0aW9uYWwgdGVybWluYXRpb24gY2FsbCBvbi4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gU2NoZWR1bGVyLmltbWVkaWF0ZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCB0ZXJtaW5hdGVzIGV4Y2VwdGlvbmFsbHkgd2l0aCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvYmplY3QuXG5cdCAgICovXG5cdCAgdmFyIG9ic2VydmFibGVUaHJvdyA9IE9ic2VydmFibGVbJ3Rocm93J10gPSBmdW5jdGlvbiAoZXJyb3IsIHNjaGVkdWxlcikge1xuXHQgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyKTtcblx0ICAgIHJldHVybiBuZXcgVGhyb3dPYnNlcnZhYmxlKGVycm9yLCBzY2hlZHVsZXIpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBDYXRjaE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQ2F0Y2hPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gQ2F0Y2hPYnNlcnZhYmxlKHNvdXJjZSwgZm4pIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuX2ZuID0gZm47XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIENhdGNoT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBkMSA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpLCBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpO1xuXHQgICAgICBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShkMSk7XG5cdCAgICAgIGQxLnNldERpc3Bvc2FibGUodGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBDYXRjaE9ic2VydmVyKG8sIHN1YnNjcmlwdGlvbiwgdGhpcy5fZm4pKSk7XG5cdCAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBDYXRjaE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgQ2F0Y2hPYnNlcnZlciA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKENhdGNoT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBDYXRjaE9ic2VydmVyKG8sIHMsIGZuKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9zID0gcztcblx0ICAgICAgdGhpcy5fZm4gPSBmbjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgQ2F0Y2hPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7IHRoaXMuX28ub25OZXh0KHgpOyB9O1xuXHQgICAgQ2F0Y2hPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuXHQgICAgQ2F0Y2hPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godGhpcy5fZm4pKGUpO1xuXHQgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlc3VsdC5lKTsgfVxuXHQgICAgICBpc1Byb21pc2UocmVzdWx0KSAmJiAocmVzdWx0ID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHJlc3VsdCkpO1xuXHRcblx0ICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgdGhpcy5fcy5zZXREaXNwb3NhYmxlKGQpO1xuXHQgICAgICBkLnNldERpc3Bvc2FibGUocmVzdWx0LnN1YnNjcmliZSh0aGlzLl9vKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBDYXRjaE9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICAvKipcblx0ICAgKiBDb250aW51ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZXhjZXB0aW9uIHdpdGggdGhlIG5leHQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgKiBAcGFyYW0ge01peGVkfSBoYW5kbGVyT3JTZWNvbmQgRXhjZXB0aW9uIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgZ2l2ZW4gdGhlIGVycm9yIHRoYXQgb2NjdXJyZWQgaW4gdGhlIGZpcnN0IHNlcXVlbmNlLCBvciBhIHNlY29uZCBvYnNlcnZhYmxlIHNlcXVlbmNlIHVzZWQgdG8gcHJvZHVjZSByZXN1bHRzIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpcnN0IHNlcXVlbmNlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIGZpcnN0IHNlcXVlbmNlJ3MgZWxlbWVudHMsIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cyBvZiB0aGUgaGFuZGxlciBzZXF1ZW5jZSBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZC5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG9bJ2NhdGNoJ10gPSBmdW5jdGlvbiAoaGFuZGxlck9yU2Vjb25kKSB7XG5cdCAgICByZXR1cm4gaXNGdW5jdGlvbihoYW5kbGVyT3JTZWNvbmQpID8gbmV3IENhdGNoT2JzZXJ2YWJsZSh0aGlzLCBoYW5kbGVyT3JTZWNvbmQpIDogb2JzZXJ2YWJsZUNhdGNoKFt0aGlzLCBoYW5kbGVyT3JTZWNvbmRdKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBDb250aW51ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZXhjZXB0aW9uIHdpdGggdGhlIG5leHQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgKiBAcGFyYW0ge0FycmF5IHwgQXJndW1lbnRzfSBhcmdzIEFyZ3VtZW50cyBvciBhbiBhcnJheSB0byB1c2UgYXMgdGhlIG5leHQgc2VxdWVuY2UgaWYgYW4gZXJyb3Igb2NjdXJzLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgZWxlbWVudHMgZnJvbSBjb25zZWN1dGl2ZSBzb3VyY2Ugc2VxdWVuY2VzIHVudGlsIGEgc291cmNlIHNlcXVlbmNlIHRlcm1pbmF0ZXMgc3VjY2Vzc2Z1bGx5LlxuXHQgICAqL1xuXHQgIHZhciBvYnNlcnZhYmxlQ2F0Y2ggPSBPYnNlcnZhYmxlWydjYXRjaCddID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGl0ZW1zO1xuXHQgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuXHQgICAgICBpdGVtcyA9IGFyZ3VtZW50c1swXTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXHQgICAgICBpdGVtcyA9IG5ldyBBcnJheShsZW4pO1xuXHQgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgaXRlbXNbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBlbnVtZXJhYmxlT2YoaXRlbXMpLmNhdGNoRXJyb3IoKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBNZXJnZXMgdGhlIHNwZWNpZmllZCBvYnNlcnZhYmxlIHNlcXVlbmNlcyBpbnRvIG9uZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGJ5IHVzaW5nIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aGVuZXZlciBhbnkgb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzIG9yIFByb21pc2VzIHByb2R1Y2VzIGFuIGVsZW1lbnQuXG5cdCAgICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYW4gYXJndW1lbnQgbGlzdCBvZiBvYnNlcnZhYmxlcyBvciBhbiBhcnJheS5cblx0ICAgKlxuXHQgICAqIEBleGFtcGxlXG5cdCAgICogMSAtIG9icyA9IG9ic2VydmFibGUuY29tYmluZUxhdGVzdChvYnMxLCBvYnMyLCBvYnMzLCBmdW5jdGlvbiAobzEsIG8yLCBvMykgeyByZXR1cm4gbzEgKyBvMiArIG8zOyB9KTtcblx0ICAgKiAyIC0gb2JzID0gb2JzZXJ2YWJsZS5jb21iaW5lTGF0ZXN0KFtvYnMxLCBvYnMyLCBvYnMzXSwgZnVuY3Rpb24gKG8xLCBvMiwgbzMpIHsgcmV0dXJuIG8xICsgbzIgKyBvMzsgfSk7XG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGNvbWJpbmluZyBlbGVtZW50cyBvZiB0aGUgc291cmNlcyB1c2luZyB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZWxlY3RvciBmdW5jdGlvbi5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uY29tYmluZUxhdGVzdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcblx0ICAgICAgYXJnc1swXS51bnNoaWZ0KHRoaXMpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QuYXBwbHkodGhpcywgYXJncyk7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24gZmFsc2VGYWN0b3J5KCkgeyByZXR1cm4gZmFsc2U7IH1cblx0ICBmdW5jdGlvbiBhcmd1bWVudHNUb0FycmF5KCkge1xuXHQgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgICByZXR1cm4gYXJncztcblx0ICB9XG5cdFxuXHQgIHZhciBDb21iaW5lTGF0ZXN0T2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKENvbWJpbmVMYXRlc3RPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gQ29tYmluZUxhdGVzdE9ic2VydmFibGUocGFyYW1zLCBjYikge1xuXHQgICAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgIHRoaXMuX2NiID0gY2I7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIENvbWJpbmVMYXRlc3RPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcblx0ICAgICAgdmFyIGxlbiA9IHRoaXMuX3BhcmFtcy5sZW5ndGgsXG5cdCAgICAgICAgICBzdWJzY3JpcHRpb25zID0gbmV3IEFycmF5KGxlbik7XG5cdFxuXHQgICAgICB2YXIgc3RhdGUgPSB7XG5cdCAgICAgICAgaGFzVmFsdWU6IGFycmF5SW5pdGlhbGl6ZShsZW4sIGZhbHNlRmFjdG9yeSksXG5cdCAgICAgICAgaGFzVmFsdWVBbGw6IGZhbHNlLFxuXHQgICAgICAgIGlzRG9uZTogYXJyYXlJbml0aWFsaXplKGxlbiwgZmFsc2VGYWN0b3J5KSxcblx0ICAgICAgICB2YWx1ZXM6IG5ldyBBcnJheShsZW4pXG5cdCAgICAgIH07XG5cdFxuXHQgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuX3BhcmFtc1tpXSwgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgICAgc3Vic2NyaXB0aW9uc1tpXSA9IHNhZDtcblx0ICAgICAgICBpc1Byb21pc2Uoc291cmNlKSAmJiAoc291cmNlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHNvdXJjZSkpO1xuXHQgICAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUobmV3IENvbWJpbmVMYXRlc3RPYnNlcnZlcihvYnNlcnZlciwgaSwgdGhpcy5fY2IsIHN0YXRlKSkpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbnMpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gQ29tYmluZUxhdGVzdE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgQ29tYmluZUxhdGVzdE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKENvbWJpbmVMYXRlc3RPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIENvbWJpbmVMYXRlc3RPYnNlcnZlcihvLCBpLCBjYiwgc3RhdGUpIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX2kgPSBpO1xuXHQgICAgICB0aGlzLl9jYiA9IGNiO1xuXHQgICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBub3RUaGVTYW1lKGkpIHtcblx0ICAgICAgcmV0dXJuIGZ1bmN0aW9uICh4LCBqKSB7XG5cdCAgICAgICAgcmV0dXJuIGogIT09IGk7XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdFxuXHQgICAgQ29tYmluZUxhdGVzdE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgdGhpcy5fc3RhdGUudmFsdWVzW3RoaXMuX2ldID0geDtcblx0ICAgICAgdGhpcy5fc3RhdGUuaGFzVmFsdWVbdGhpcy5faV0gPSB0cnVlO1xuXHQgICAgICBpZiAodGhpcy5fc3RhdGUuaGFzVmFsdWVBbGwgfHwgKHRoaXMuX3N0YXRlLmhhc1ZhbHVlQWxsID0gdGhpcy5fc3RhdGUuaGFzVmFsdWUuZXZlcnkoaWRlbnRpdHkpKSkge1xuXHQgICAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh0aGlzLl9jYikuYXBwbHkobnVsbCwgdGhpcy5fc3RhdGUudmFsdWVzKTtcblx0ICAgICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuXHQgICAgICAgIHRoaXMuX28ub25OZXh0KHJlcyk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhdGUuaXNEb25lLmZpbHRlcihub3RUaGVTYW1lKHRoaXMuX2kpKS5ldmVyeShpZGVudGl0eSkpIHtcblx0ICAgICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdFxuXHQgICAgQ29tYmluZUxhdGVzdE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgQ29tYmluZUxhdGVzdE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX3N0YXRlLmlzRG9uZVt0aGlzLl9pXSA9IHRydWU7XG5cdCAgICAgIHRoaXMuX3N0YXRlLmlzRG9uZS5ldmVyeShpZGVudGl0eSkgJiYgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gQ29tYmluZUxhdGVzdE9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICAvKipcblx0ICAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gb25lIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgdXNpbmcgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHdoZW5ldmVyIGFueSBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgb3IgUHJvbWlzZXMgcHJvZHVjZXMgYW4gZWxlbWVudC5cblx0ICAqXG5cdCAgKiBAZXhhbXBsZVxuXHQgICogMSAtIG9icyA9IFJ4Lk9ic2VydmFibGUuY29tYmluZUxhdGVzdChvYnMxLCBvYnMyLCBvYnMzLCBmdW5jdGlvbiAobzEsIG8yLCBvMykgeyByZXR1cm4gbzEgKyBvMiArIG8zOyB9KTtcblx0ICAqIDIgLSBvYnMgPSBSeC5PYnNlcnZhYmxlLmNvbWJpbmVMYXRlc3QoW29iczEsIG9iczIsIG9iczNdLCBmdW5jdGlvbiAobzEsIG8yLCBvMykgeyByZXR1cm4gbzEgKyBvMiArIG8zOyB9KTtcblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIHNvdXJjZXMgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG5cdCAgKi9cblx0ICB2YXIgY29tYmluZUxhdGVzdCA9IE9ic2VydmFibGUuY29tYmluZUxhdGVzdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgICAgdmFyIHJlc3VsdFNlbGVjdG9yID0gaXNGdW5jdGlvbihhcmdzW2xlbiAtIDFdKSA/IGFyZ3MucG9wKCkgOiBhcmd1bWVudHNUb0FycmF5O1xuXHQgICAgQXJyYXkuaXNBcnJheShhcmdzWzBdKSAmJiAoYXJncyA9IGFyZ3NbMF0pO1xuXHQgICAgcmV0dXJuIG5ldyBDb21iaW5lTGF0ZXN0T2JzZXJ2YWJsZShhcmdzLCByZXN1bHRTZWxlY3Rvcik7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogQ29uY2F0ZW5hdGVzIGFsbCB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuICBUaGlzIHRha2VzIGluIGVpdGhlciBhbiBhcnJheSBvciB2YXJpYWJsZSBhcmd1bWVudHMgdG8gY29uY2F0ZW5hdGUuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgZWFjaCBnaXZlbiBzZXF1ZW5jZSwgaW4gc2VxdWVudGlhbCBvcmRlci5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uY29uY2F0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgZm9yKHZhciBhcmdzID0gW10sIGkgPSAwLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7IH1cblx0ICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcblx0ICAgIHJldHVybiBvYnNlcnZhYmxlQ29uY2F0LmFwcGx5KG51bGwsIGFyZ3MpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBDb25jYXRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQ29uY2F0T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIENvbmNhdE9ic2VydmFibGUoc291cmNlcykge1xuXHQgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBDb25jYXRPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24obykge1xuXHQgICAgICB2YXIgc2luayA9IG5ldyBDb25jYXRTaW5rKHRoaXMuc291cmNlcywgbyk7XG5cdCAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBDb25jYXRTaW5rKHNvdXJjZXMsIG8pIHtcblx0ICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcblx0ICAgICAgdGhpcy5vID0gbztcblx0ICAgIH1cblx0ICAgIENvbmNhdFNpbmsucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIGlzRGlzcG9zZWQsIHN1YnNjcmlwdGlvbiA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksIHNvdXJjZXMgPSB0aGlzLnNvdXJjZXMsIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLCBvID0gdGhpcy5vO1xuXHQgICAgICB2YXIgY2FuY2VsYWJsZSA9IGltbWVkaWF0ZVNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSgwLCBmdW5jdGlvbiAoaSwgc2VsZikge1xuXHQgICAgICAgIGlmIChpc0Rpc3Bvc2VkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIGlmIChpID09PSBsZW5ndGgpIHtcblx0ICAgICAgICAgIHJldHVybiBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICAvLyBDaGVjayBpZiBwcm9taXNlXG5cdCAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHNvdXJjZXNbaV07XG5cdCAgICAgICAgaXNQcm9taXNlKGN1cnJlbnRWYWx1ZSkgJiYgKGN1cnJlbnRWYWx1ZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShjdXJyZW50VmFsdWUpKTtcblx0XG5cdCAgICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgICBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShkKTtcblx0ICAgICAgICBkLnNldERpc3Bvc2FibGUoY3VycmVudFZhbHVlLnN1YnNjcmliZShcblx0ICAgICAgICAgIGZ1bmN0aW9uICh4KSB7IG8ub25OZXh0KHgpOyB9LFxuXHQgICAgICAgICAgZnVuY3Rpb24gKGUpIHsgby5vbkVycm9yKGUpOyB9LFxuXHQgICAgICAgICAgZnVuY3Rpb24gKCkgeyBzZWxmKGkgKyAxKTsgfVxuXHQgICAgICAgICkpO1xuXHQgICAgICB9KTtcblx0XG5cdCAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlRGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUsIGRpc3Bvc2FibGVDcmVhdGUoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICB9KSk7XG5cdCAgICB9O1xuXHRcblx0XG5cdCAgICByZXR1cm4gQ29uY2F0T2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIENvbmNhdGVuYXRlcyBhbGwgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzLlxuXHQgICAqIEBwYXJhbSB7QXJyYXkgfCBBcmd1bWVudHN9IGFyZ3MgQXJndW1lbnRzIG9yIGFuIGFycmF5IHRvIGNvbmNhdCB0byB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBlYWNoIGdpdmVuIHNlcXVlbmNlLCBpbiBzZXF1ZW50aWFsIG9yZGVyLlxuXHQgICAqL1xuXHQgIHZhciBvYnNlcnZhYmxlQ29uY2F0ID0gT2JzZXJ2YWJsZS5jb25jYXQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgYXJncztcblx0ICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHtcblx0ICAgICAgYXJncyA9IGFyZ3VtZW50c1swXTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG5cdCAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gbmV3IENvbmNhdE9ic2VydmFibGUoYXJncyk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogQ29uY2F0ZW5hdGVzIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugb2Ygb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgZWFjaCBvYnNlcnZlZCBpbm5lciBzZXF1ZW5jZSwgaW4gc2VxdWVudGlhbCBvcmRlci5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uY29uY2F0QWxsID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVyZ2UoMSk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIE1lcmdlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhNZXJnZU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gTWVyZ2VPYnNlcnZhYmxlKHNvdXJjZSwgbWF4Q29uY3VycmVudCkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5tYXhDb25jdXJyZW50ID0gbWF4Q29uY3VycmVudDtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgTWVyZ2VPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcblx0ICAgICAgdmFyIGcgPSBuZXcgQ29tcG9zaXRlRGlzcG9zYWJsZSgpO1xuXHQgICAgICBnLmFkZCh0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IE1lcmdlT2JzZXJ2ZXIob2JzZXJ2ZXIsIHRoaXMubWF4Q29uY3VycmVudCwgZykpKTtcblx0ICAgICAgcmV0dXJuIGc7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBNZXJnZU9ic2VydmFibGU7XG5cdFxuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIE1lcmdlT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTWVyZ2VPYnNlcnZlcihvLCBtYXgsIGcpIHtcblx0ICAgICAgdGhpcy5vID0gbztcblx0ICAgICAgdGhpcy5tYXggPSBtYXg7XG5cdCAgICAgIHRoaXMuZyA9IGc7XG5cdCAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuXHQgICAgICB0aGlzLnEgPSBbXTtcblx0ICAgICAgdGhpcy5hY3RpdmVDb3VudCA9IDA7XG5cdCAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5oYW5kbGVTdWJzY3JpYmUgPSBmdW5jdGlvbiAoeHMpIHtcblx0ICAgICAgdmFyIHNhZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICB0aGlzLmcuYWRkKHNhZCk7XG5cdCAgICAgIGlzUHJvbWlzZSh4cykgJiYgKHhzID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHhzKSk7XG5cdCAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHhzLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcih0aGlzLCBzYWQpKSk7XG5cdCAgICB9O1xuXHQgICAgTWVyZ2VPYnNlcnZlci5wcm90b3R5cGUub25OZXh0ID0gZnVuY3Rpb24gKGlubmVyU291cmNlKSB7XG5cdCAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cblx0ICAgICAgICBpZih0aGlzLmFjdGl2ZUNvdW50IDwgdGhpcy5tYXgpIHtcblx0ICAgICAgICAgIHRoaXMuYWN0aXZlQ291bnQrKztcblx0ICAgICAgICAgIHRoaXMuaGFuZGxlU3Vic2NyaWJlKGlubmVyU291cmNlKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5xLnB1c2goaW5uZXJTb3VyY2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgTWVyZ2VPYnNlcnZlci5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXHQgICAgICAgICAgdGhpcy5hY3RpdmVDb3VudCA9PT0gMCAmJiB0aGlzLm8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIE1lcmdlT2JzZXJ2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOyB9O1xuXHQgICAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLm8ub25FcnJvcihlKTtcblx0ICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9O1xuXHRcblx0ICAgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihwYXJlbnQsIHNhZCkge1xuXHQgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXHQgICAgICAgIHRoaXMuc2FkID0gc2FkO1xuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25OZXh0ID0gZnVuY3Rpb24gKHgpIHsgaWYoIXRoaXMuaXNTdG9wcGVkKSB7IHRoaXMucGFyZW50Lm8ub25OZXh0KHgpOyB9IH07XG5cdCAgICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICAgIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuXHQgICAgICAgICAgcGFyZW50LmcucmVtb3ZlKHRoaXMuc2FkKTtcblx0ICAgICAgICAgIGlmIChwYXJlbnQucS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIHBhcmVudC5oYW5kbGVTdWJzY3JpYmUocGFyZW50LnEuc2hpZnQoKSk7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBwYXJlbnQuYWN0aXZlQ291bnQtLTtcblx0ICAgICAgICAgICAgcGFyZW50LmRvbmUgJiYgcGFyZW50LmFjdGl2ZUNvdW50ID09PSAwICYmIHBhcmVudC5vLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcblx0ICAgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZmFpbCA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdGhpcy5wYXJlbnQuby5vbkVycm9yKGUpO1xuXHQgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH07XG5cdFxuXHQgICAgICByZXR1cm4gTWVyZ2VPYnNlcnZlcjtcblx0ICB9KCkpO1xuXHRcblx0XG5cdFxuXHRcblx0XG5cdCAgLyoqXG5cdCAgKiBNZXJnZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBvYnNlcnZhYmxlIHNlcXVlbmNlcyBpbnRvIGFuIG9ic2VydmFibGUgc2VxdWVuY2UsIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBzdWJzY3JpcHRpb25zIHRvIGlubmVyIHNlcXVlbmNlcy5cblx0ICAqIE9yIG1lcmdlcyB0d28gb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBhIHNpbmdsZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICpcblx0ICAqIEBleGFtcGxlXG5cdCAgKiAxIC0gbWVyZ2VkID0gc291cmNlcy5tZXJnZSgxKTtcblx0ICAqIDIgLSBtZXJnZWQgPSBzb3VyY2UubWVyZ2Uob3RoZXJTb3VyY2UpO1xuXHQgICogQHBhcmFtIHtNaXhlZH0gW21heENvbmN1cnJlbnRPck90aGVyXSBNYXhpbXVtIG51bWJlciBvZiBpbm5lciBvYnNlcnZhYmxlIHNlcXVlbmNlcyBiZWluZyBzdWJzY3JpYmVkIHRvIGNvbmN1cnJlbnRseSBvciB0aGUgc2Vjb25kIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBtZXJnZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBpbm5lciBzZXF1ZW5jZXMuXG5cdCAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ubWVyZ2UgPSBmdW5jdGlvbiAobWF4Q29uY3VycmVudE9yT3RoZXIpIHtcblx0ICAgIHJldHVybiB0eXBlb2YgbWF4Q29uY3VycmVudE9yT3RoZXIgIT09ICdudW1iZXInID9cblx0ICAgICAgb2JzZXJ2YWJsZU1lcmdlKHRoaXMsIG1heENvbmN1cnJlbnRPck90aGVyKSA6XG5cdCAgICAgIG5ldyBNZXJnZU9ic2VydmFibGUodGhpcywgbWF4Q29uY3VycmVudE9yT3RoZXIpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIE1lcmdlcyBhbGwgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gYSBzaW5nbGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgKiBUaGUgc2NoZWR1bGVyIGlzIG9wdGlvbmFsIGFuZCBpZiBub3Qgc3BlY2lmaWVkLCB0aGUgaW1tZWRpYXRlIHNjaGVkdWxlciBpcyB1c2VkLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IG1lcmdlcyB0aGUgZWxlbWVudHMgb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzLlxuXHQgICAqL1xuXHQgIHZhciBvYnNlcnZhYmxlTWVyZ2UgPSBPYnNlcnZhYmxlLm1lcmdlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIHNjaGVkdWxlciwgc291cmNlcyA9IFtdLCBpLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXHQgICAgaWYgKCFhcmd1bWVudHNbMF0pIHtcblx0ICAgICAgc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyO1xuXHQgICAgICBmb3IoaSA9IDE7IGkgPCBsZW47IGkrKykgeyBzb3VyY2VzLnB1c2goYXJndW1lbnRzW2ldKTsgfVxuXHQgICAgfSBlbHNlIGlmIChpc1NjaGVkdWxlcihhcmd1bWVudHNbMF0pKSB7XG5cdCAgICAgIHNjaGVkdWxlciA9IGFyZ3VtZW50c1swXTtcblx0ICAgICAgZm9yKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsgc291cmNlcy5wdXNoKGFyZ3VtZW50c1tpXSk7IH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHNjaGVkdWxlciA9IGltbWVkaWF0ZVNjaGVkdWxlcjtcblx0ICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgc291cmNlcy5wdXNoKGFyZ3VtZW50c1tpXSk7IH1cblx0ICAgIH1cblx0ICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZXNbMF0pKSB7XG5cdCAgICAgIHNvdXJjZXMgPSBzb3VyY2VzWzBdO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG9ic2VydmFibGVPZihzY2hlZHVsZXIsIHNvdXJjZXMpLm1lcmdlQWxsKCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIENvbXBvc2l0ZUVycm9yID0gUnguQ29tcG9zaXRlRXJyb3IgPSBmdW5jdGlvbihlcnJvcnMpIHtcblx0ICAgIHRoaXMuaW5uZXJFcnJvcnMgPSBlcnJvcnM7XG5cdCAgICB0aGlzLm1lc3NhZ2UgPSAnVGhpcyBjb250YWlucyBtdWx0aXBsZSBlcnJvcnMuIENoZWNrIHRoZSBpbm5lckVycm9ycyc7XG5cdCAgICBFcnJvci5jYWxsKHRoaXMpO1xuXHQgIH07XG5cdCAgQ29tcG9zaXRlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuXHQgIENvbXBvc2l0ZUVycm9yLnByb3RvdHlwZS5uYW1lID0gJ0NvbXBvc2l0ZUVycm9yJztcblx0XG5cdCAgdmFyIE1lcmdlRGVsYXlFcnJvck9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gTWVyZ2VEZWxheUVycm9yT2JzZXJ2YWJsZShzb3VyY2UpIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIE1lcmdlRGVsYXlFcnJvck9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlRGlzcG9zYWJsZSgpLFxuXHQgICAgICAgIG0gPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKSxcblx0ICAgICAgICBzdGF0ZSA9IHsgaXNTdG9wcGVkOiBmYWxzZSwgZXJyb3JzOiBbXSwgbzogbyB9O1xuXHRcblx0ICAgICAgZ3JvdXAuYWRkKG0pO1xuXHQgICAgICBtLnNldERpc3Bvc2FibGUodGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBNZXJnZURlbGF5RXJyb3JPYnNlcnZlcihncm91cCwgc3RhdGUpKSk7XG5cdFxuXHQgICAgICByZXR1cm4gZ3JvdXA7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIE1lcmdlRGVsYXlFcnJvck9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoTWVyZ2VEZWxheUVycm9yT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBNZXJnZURlbGF5RXJyb3JPYnNlcnZlcihncm91cCwgc3RhdGUpIHtcblx0ICAgICAgdGhpcy5fZ3JvdXAgPSBncm91cDtcblx0ICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gc2V0Q29tcGxldGlvbihvLCBlcnJvcnMpIHtcblx0ICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMSkge1xuXHQgICAgICAgIG8ub25FcnJvcihlcnJvcnNbMF0pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIG8ub25FcnJvcihuZXcgQ29tcG9zaXRlRXJyb3IoZXJyb3JzKSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0XG5cdCAgICBNZXJnZURlbGF5RXJyb3JPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHZhciBpbm5lciA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICB0aGlzLl9ncm91cC5hZGQoaW5uZXIpO1xuXHRcblx0ICAgICAgLy8gQ2hlY2sgZm9yIHByb21pc2VzIHN1cHBvcnRcblx0ICAgICAgaXNQcm9taXNlKHgpICYmICh4ID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHgpKTtcblx0ICAgICAgaW5uZXIuc2V0RGlzcG9zYWJsZSh4LnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihpbm5lciwgdGhpcy5fZ3JvdXAsIHRoaXMuX3N0YXRlKSkpO1xuXHQgICAgfTtcblx0XG5cdCAgICBNZXJnZURlbGF5RXJyb3JPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICB0aGlzLl9zdGF0ZS5lcnJvcnMucHVzaChlKTtcblx0ICAgICAgdGhpcy5fc3RhdGUuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fZ3JvdXAubGVuZ3RoID09PSAxICYmIHNldENvbXBsZXRpb24odGhpcy5fc3RhdGUubywgdGhpcy5fc3RhdGUuZXJyb3JzKTtcblx0ICAgIH07XG5cdFxuXHQgICAgTWVyZ2VEZWxheUVycm9yT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fc3RhdGUuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fZ3JvdXAubGVuZ3RoID09PSAxICYmIHNldENvbXBsZXRpb24odGhpcy5fc3RhdGUubywgdGhpcy5fc3RhdGUuZXJyb3JzKTtcblx0ICAgIH07XG5cdFxuXHQgICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIoaW5uZXIsIGdyb3VwLCBzdGF0ZSkge1xuXHQgICAgICB0aGlzLl9pbm5lciA9IGlubmVyO1xuXHQgICAgICB0aGlzLl9ncm91cCA9IGdyb3VwO1xuXHQgICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHsgdGhpcy5fc3RhdGUuby5vbk5leHQoeCk7IH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuX3N0YXRlLmVycm9ycy5wdXNoKGUpO1xuXHQgICAgICB0aGlzLl9ncm91cC5yZW1vdmUodGhpcy5faW5uZXIpO1xuXHQgICAgICB0aGlzLl9zdGF0ZS5pc1N0b3BwZWQgJiYgdGhpcy5fZ3JvdXAubGVuZ3RoID09PSAxICYmIHNldENvbXBsZXRpb24odGhpcy5fc3RhdGUubywgdGhpcy5fc3RhdGUuZXJyb3JzKTtcblx0ICAgIH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX2dyb3VwLnJlbW92ZSh0aGlzLl9pbm5lcik7XG5cdCAgICAgIHRoaXMuX3N0YXRlLmlzU3RvcHBlZCAmJiB0aGlzLl9ncm91cC5sZW5ndGggPT09IDEgJiYgc2V0Q29tcGxldGlvbih0aGlzLl9zdGF0ZS5vLCB0aGlzLl9zdGF0ZS5lcnJvcnMpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gTWVyZ2VEZWxheUVycm9yT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICogRmxhdHRlbnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIE9ic2VydmFibGVzIGludG8gb25lIE9ic2VydmFibGUsIGluIGEgd2F5IHRoYXQgYWxsb3dzIGFuIE9ic2VydmVyIHRvXG5cdCAgKiByZWNlaXZlIGFsbCBzdWNjZXNzZnVsbHkgZW1pdHRlZCBpdGVtcyBmcm9tIGFsbCBvZiB0aGUgc291cmNlIE9ic2VydmFibGVzIHdpdGhvdXQgYmVpbmcgaW50ZXJydXB0ZWQgYnlcblx0ICAqIGFuIGVycm9yIG5vdGlmaWNhdGlvbiBmcm9tIG9uZSBvZiB0aGVtLlxuXHQgICpcblx0ICAqIFRoaXMgYmVoYXZlcyBsaWtlIE9ic2VydmFibGUucHJvdG90eXBlLm1lcmdlQWxsIGV4Y2VwdCB0aGF0IGlmIGFueSBvZiB0aGUgbWVyZ2VkIE9ic2VydmFibGVzIG5vdGlmeSBvZiBhblxuXHQgICogZXJyb3IgdmlhIHRoZSBPYnNlcnZlcidzIG9uRXJyb3IsIG1lcmdlRGVsYXlFcnJvciB3aWxsIHJlZnJhaW4gZnJvbSBwcm9wYWdhdGluZyB0aGF0XG5cdCAgKiBlcnJvciBub3RpZmljYXRpb24gdW50aWwgYWxsIG9mIHRoZSBtZXJnZWQgT2JzZXJ2YWJsZXMgaGF2ZSBmaW5pc2hlZCBlbWl0dGluZyBpdGVtcy5cblx0ICAqIEBwYXJhbSB7QXJyYXkgfCBBcmd1bWVudHN9IGFyZ3MgQXJndW1lbnRzIG9yIGFuIGFycmF5IHRvIG1lcmdlLlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhbGwgb2YgdGhlIGl0ZW1zIGVtaXR0ZWQgYnkgdGhlIE9ic2VydmFibGVzIGVtaXR0ZWQgYnkgdGhlIE9ic2VydmFibGVcblx0ICAqL1xuXHQgIE9ic2VydmFibGUubWVyZ2VEZWxheUVycm9yID0gZnVuY3Rpb24oKSB7XG5cdCAgICB2YXIgYXJncztcblx0ICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHtcblx0ICAgICAgYXJncyA9IGFyZ3VtZW50c1swXTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXHQgICAgICBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgICB9XG5cdCAgICB2YXIgc291cmNlID0gb2JzZXJ2YWJsZU9mKG51bGwsIGFyZ3MpO1xuXHQgICAgcmV0dXJuIG5ldyBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlKHNvdXJjZSk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIE1lcmdlQWxsT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhNZXJnZUFsbE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gTWVyZ2VBbGxPYnNlcnZhYmxlKHNvdXJjZSkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgTWVyZ2VBbGxPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG5cdCAgICAgIHZhciBnID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKSwgbSA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICBnLmFkZChtKTtcblx0ICAgICAgbS5zZXREaXNwb3NhYmxlKHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgTWVyZ2VBbGxPYnNlcnZlcihvYnNlcnZlciwgZykpKTtcblx0ICAgICAgcmV0dXJuIGc7XG5cdCAgICB9O1xuXHRcblx0ICAgIGZ1bmN0aW9uIE1lcmdlQWxsT2JzZXJ2ZXIobywgZykge1xuXHQgICAgICB0aGlzLm8gPSBvO1xuXHQgICAgICB0aGlzLmcgPSBnO1xuXHQgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIE1lcmdlQWxsT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uKGlubmVyU291cmNlKSB7XG5cdCAgICAgIGlmKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuXHQgICAgICB2YXIgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgIHRoaXMuZy5hZGQoc2FkKTtcblx0XG5cdCAgICAgIGlzUHJvbWlzZShpbm5lclNvdXJjZSkgJiYgKGlubmVyU291cmNlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKGlubmVyU291cmNlKSk7XG5cdFxuXHQgICAgICBzYWQuc2V0RGlzcG9zYWJsZShpbm5lclNvdXJjZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIodGhpcywgc2FkKSkpO1xuXHQgICAgfTtcblx0ICAgIE1lcmdlQWxsT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICBNZXJnZUFsbE9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgaWYoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5nLmxlbmd0aCA9PT0gMSAmJiB0aGlzLm8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICAgIE1lcmdlQWxsT2JzZXJ2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOyB9O1xuXHQgICAgTWVyZ2VBbGxPYnNlcnZlci5wcm90b3R5cGUuZmFpbCA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH07XG5cdFxuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihwYXJlbnQsIHNhZCkge1xuXHQgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblx0ICAgICAgdGhpcy5zYWQgPSBzYWQ7XG5cdCAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBmdW5jdGlvbiAoeCkgeyBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7IHRoaXMucGFyZW50Lm8ub25OZXh0KHgpOyB9IH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHBhcmVudC5nLnJlbW92ZSh0aGlzLnNhZCk7XG5cdCAgICAgICAgcGFyZW50LmRvbmUgJiYgcGFyZW50LmcubGVuZ3RoID09PSAxICYmIHBhcmVudC5vLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gTWVyZ2VBbGxPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgKiBNZXJnZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBvYnNlcnZhYmxlIHNlcXVlbmNlcyBpbnRvIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBtZXJnZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBpbm5lciBzZXF1ZW5jZXMuXG5cdCAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ubWVyZ2VBbGwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gbmV3IE1lcmdlQWxsT2JzZXJ2YWJsZSh0aGlzKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgU2tpcFVudGlsT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFNraXBVbnRpbE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gU2tpcFVudGlsT2JzZXJ2YWJsZShzb3VyY2UsIG90aGVyKSB7XG5cdCAgICAgIHRoaXMuX3MgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuX28gPSBpc1Byb21pc2Uob3RoZXIpID8gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKG90aGVyKSA6IG90aGVyO1xuXHQgICAgICB0aGlzLl9vcGVuID0gZmFsc2U7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFNraXBVbnRpbE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG5cdCAgICAgIHZhciBsZWZ0U3Vic2NyaXB0aW9uID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgIGxlZnRTdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZSh0aGlzLl9zLnN1YnNjcmliZShuZXcgU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIobywgdGhpcykpKTtcblx0XG5cdCAgICAgIGlzUHJvbWlzZSh0aGlzLl9vKSAmJiAodGhpcy5fbyA9IG9ic2VydmFibGVGcm9tUHJvbWlzZSh0aGlzLl9vKSk7XG5cdFxuXHQgICAgICB2YXIgcmlnaHRTdWJzY3JpcHRpb24gPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgcmlnaHRTdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZSh0aGlzLl9vLnN1YnNjcmliZShuZXcgU2tpcFVudGlsT3RoZXJPYnNlcnZlcihvLCB0aGlzLCByaWdodFN1YnNjcmlwdGlvbikpKTtcblx0XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShsZWZ0U3Vic2NyaXB0aW9uLCByaWdodFN1YnNjcmlwdGlvbik7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTa2lwVW50aWxPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIFNraXBVbnRpbFNvdXJjZU9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBTa2lwVW50aWxTb3VyY2VPYnNlcnZlcihvLCBwKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9wID0gcDtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICB0aGlzLl9wLl9vcGVuICYmIHRoaXMuX28ub25OZXh0KHgpO1xuXHQgICAgfTtcblx0XG5cdCAgICBTa2lwVW50aWxTb3VyY2VPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgIHRoaXMuX28ub25FcnJvcihlcnIpO1xuXHQgICAgfTtcblx0XG5cdCAgICBTa2lwVW50aWxTb3VyY2VPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX3AuX29wZW4gJiYgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU2tpcFVudGlsU291cmNlT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIHZhciBTa2lwVW50aWxPdGhlck9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoU2tpcFVudGlsT3RoZXJPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFNraXBVbnRpbE90aGVyT2JzZXJ2ZXIobywgcCwgcikge1xuXHQgICAgICB0aGlzLl9vID0gbztcblx0ICAgICAgdGhpcy5fcCA9IHA7XG5cdCAgICAgIHRoaXMuX3IgPSByO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBTa2lwVW50aWxPdGhlck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLl9wLl9vcGVuID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fci5kaXNwb3NlKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFNraXBVbnRpbE90aGVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuXHQgICAgICB0aGlzLl9vLm9uRXJyb3IoZXJyKTtcblx0ICAgIH07XG5cdFxuXHQgICAgU2tpcFVudGlsT3RoZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX3IuZGlzcG9zZSgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU2tpcFVudGlsT3RoZXJPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyB0aGUgdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBvYnNlcnZhYmxlIHNlcXVlbmNlIG9ubHkgYWZ0ZXIgdGhlIG90aGVyIG9ic2VydmFibGUgc2VxdWVuY2UgcHJvZHVjZXMgYSB2YWx1ZS5cblx0ICAgKiBAcGFyYW0ge09ic2VydmFibGUgfCBQcm9taXNlfSBvdGhlciBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvciBQcm9taXNlIHRoYXQgdHJpZ2dlcnMgcHJvcGFnYXRpb24gb2YgZWxlbWVudHMgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgc291cmNlIHNlcXVlbmNlIHN0YXJ0aW5nIGZyb20gdGhlIHBvaW50IHRoZSBvdGhlciBzZXF1ZW5jZSB0cmlnZ2VyZWQgcHJvcGFnYXRpb24uXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnNraXBVbnRpbCA9IGZ1bmN0aW9uIChvdGhlcikge1xuXHQgICAgcmV0dXJuIG5ldyBTa2lwVW50aWxPYnNlcnZhYmxlKHRoaXMsIG90aGVyKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgU3dpdGNoT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFN3aXRjaE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBTd2l0Y2hPYnNlcnZhYmxlKHNvdXJjZSkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgU3dpdGNoT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBpbm5lciA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksIHMgPSB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IFN3aXRjaE9ic2VydmVyKG8sIGlubmVyKSk7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzLCBpbm5lcik7XG5cdCAgICB9O1xuXHRcblx0ICAgIGluaGVyaXRzKFN3aXRjaE9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcblx0ICAgIGZ1bmN0aW9uIFN3aXRjaE9ic2VydmVyKG8sIGlubmVyKSB7XG5cdCAgICAgIHRoaXMubyA9IG87XG5cdCAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcblx0ICAgICAgdGhpcy5zdG9wcGVkID0gZmFsc2U7XG5cdCAgICAgIHRoaXMubGF0ZXN0ID0gMDtcblx0ICAgICAgdGhpcy5oYXNMYXRlc3QgPSBmYWxzZTtcblx0ICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFN3aXRjaE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKGlubmVyU291cmNlKSB7XG5cdCAgICAgIHZhciBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksIGlkID0gKyt0aGlzLmxhdGVzdDtcblx0ICAgICAgdGhpcy5oYXNMYXRlc3QgPSB0cnVlO1xuXHQgICAgICB0aGlzLmlubmVyLnNldERpc3Bvc2FibGUoZCk7XG5cdCAgICAgIGlzUHJvbWlzZShpbm5lclNvdXJjZSkgJiYgKGlubmVyU291cmNlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKGlubmVyU291cmNlKSk7XG5cdCAgICAgIGQuc2V0RGlzcG9zYWJsZShpbm5lclNvdXJjZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIodGhpcywgaWQpKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFN3aXRjaE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBTd2l0Y2hPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAhdGhpcy5oYXNMYXRlc3QgJiYgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGluaGVyaXRzKElubmVyT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihwYXJlbnQsIGlkKSB7XG5cdCAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXHQgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgIEFic3RyYWN0T2JzZXJ2ZXIuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICB0aGlzLnBhcmVudC5sYXRlc3QgPT09IHRoaXMuaWQgJiYgdGhpcy5wYXJlbnQuby5vbk5leHQoeCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdGhpcy5wYXJlbnQubGF0ZXN0ID09PSB0aGlzLmlkICYmIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBpZiAodGhpcy5wYXJlbnQubGF0ZXN0ID09PSB0aGlzLmlkKSB7XG5cdCAgICAgICAgdGhpcy5wYXJlbnQuaGFzTGF0ZXN0ID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5wYXJlbnQuaXNTdG9wcGVkICYmIHRoaXMucGFyZW50Lm8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU3dpdGNoT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICogVHJhbnNmb3JtcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9mIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBwcm9kdWNpbmcgdmFsdWVzIG9ubHkgZnJvbSB0aGUgbW9zdCByZWNlbnQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGF0IGFueSBwb2ludCBpbiB0aW1lIHByb2R1Y2VzIHRoZSBlbGVtZW50cyBvZiB0aGUgbW9zdCByZWNlbnQgaW5uZXIgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGhhcyBiZWVuIHJlY2VpdmVkLlxuXHQgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvWydzd2l0Y2gnXSA9IG9ic2VydmFibGVQcm90by5zd2l0Y2hMYXRlc3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gbmV3IFN3aXRjaE9ic2VydmFibGUodGhpcyk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFRha2VVbnRpbE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhUYWtlVW50aWxPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIFRha2VVbnRpbE9ic2VydmFibGUoc291cmNlLCBvdGhlcikge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5vdGhlciA9IGlzUHJvbWlzZShvdGhlcikgPyBvYnNlcnZhYmxlRnJvbVByb21pc2Uob3RoZXIpIDogb3RoZXI7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFRha2VVbnRpbE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShcblx0ICAgICAgICB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobyksXG5cdCAgICAgICAgdGhpcy5vdGhlci5zdWJzY3JpYmUobmV3IFRha2VVbnRpbE9ic2VydmVyKG8pKVxuXHQgICAgICApO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gVGFrZVVudGlsT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBUYWtlVW50aWxPYnNlcnZlciA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFRha2VVbnRpbE9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gVGFrZVVudGlsT2JzZXJ2ZXIobykge1xuXHQgICAgICB0aGlzLl9vID0gbztcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgVGFrZVVudGlsT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgVGFrZVVudGlsT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuXHQgICAgICB0aGlzLl9vLm9uRXJyb3IoZXJyKTtcblx0ICAgIH07XG5cdFxuXHQgICAgVGFrZVVudGlsT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gbm9vcDtcblx0XG5cdCAgICByZXR1cm4gVGFrZVVudGlsT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIFJldHVybnMgdGhlIHZhbHVlcyBmcm9tIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBzZXF1ZW5jZSB1bnRpbCB0aGUgb3RoZXIgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBwcm9kdWNlcyBhIHZhbHVlLlxuXHQgICAqIEBwYXJhbSB7T2JzZXJ2YWJsZSB8IFByb21pc2V9IG90aGVyIE9ic2VydmFibGUgc2VxdWVuY2Ugb3IgUHJvbWlzZSB0aGF0IHRlcm1pbmF0ZXMgcHJvcGFnYXRpb24gb2YgZWxlbWVudHMgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgc291cmNlIHNlcXVlbmNlIHVwIHRvIHRoZSBwb2ludCB0aGUgb3RoZXIgc2VxdWVuY2UgaW50ZXJydXB0ZWQgZnVydGhlciBwcm9wYWdhdGlvbi5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8udGFrZVVudGlsID0gZnVuY3Rpb24gKG90aGVyKSB7XG5cdCAgICByZXR1cm4gbmV3IFRha2VVbnRpbE9ic2VydmFibGUodGhpcywgb3RoZXIpO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIGZhbHNlRmFjdG9yeSgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdCAgZnVuY3Rpb24gYXJndW1lbnRzVG9BcnJheSgpIHtcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgICAgcmV0dXJuIGFyZ3M7XG5cdCAgfVxuXHRcblx0ICB2YXIgV2l0aExhdGVzdEZyb21PYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoV2l0aExhdGVzdEZyb21PYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gV2l0aExhdGVzdEZyb21PYnNlcnZhYmxlKHNvdXJjZSwgc291cmNlcywgcmVzdWx0U2VsZWN0b3IpIHtcblx0ICAgICAgdGhpcy5fcyA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5fc3MgPSBzb3VyY2VzO1xuXHQgICAgICB0aGlzLl9jYiA9IHJlc3VsdFNlbGVjdG9yO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBXaXRoTGF0ZXN0RnJvbU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgbGVuID0gdGhpcy5fc3MubGVuZ3RoO1xuXHQgICAgICB2YXIgc3RhdGUgPSB7XG5cdCAgICAgICAgaGFzVmFsdWU6IGFycmF5SW5pdGlhbGl6ZShsZW4sIGZhbHNlRmFjdG9yeSksXG5cdCAgICAgICAgaGFzVmFsdWVBbGw6IGZhbHNlLFxuXHQgICAgICAgIHZhbHVlczogbmV3IEFycmF5KGxlbilcblx0ICAgICAgfTtcblx0XG5cdCAgICAgIHZhciBuID0gdGhpcy5fc3MubGVuZ3RoLCBzdWJzY3JpcHRpb25zID0gbmV3IEFycmF5KG4gKyAxKTtcblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcblx0ICAgICAgICB2YXIgb3RoZXIgPSB0aGlzLl9zc1tpXSwgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgICAgaXNQcm9taXNlKG90aGVyKSAmJiAob3RoZXIgPSBvYnNlcnZhYmxlRnJvbVByb21pc2Uob3RoZXIpKTtcblx0ICAgICAgICBzYWQuc2V0RGlzcG9zYWJsZShvdGhlci5zdWJzY3JpYmUobmV3IFdpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlcihvLCBpLCBzdGF0ZSkpKTtcblx0ICAgICAgICBzdWJzY3JpcHRpb25zW2ldID0gc2FkO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHRoaXMuX3Muc3Vic2NyaWJlKG5ldyBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyKG8sIHRoaXMuX2NiLCBzdGF0ZSkpKTtcblx0ICAgICAgc3Vic2NyaXB0aW9uc1tuXSA9IHNhZDtcblx0XG5cdCAgICAgIHJldHVybiBuZXcgTkFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9ucyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBXaXRoTGF0ZXN0RnJvbU9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFdpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFdpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlcihvLCBpLCBzdGF0ZSkge1xuXHQgICAgICB0aGlzLl9vID0gbztcblx0ICAgICAgdGhpcy5faSA9IGk7XG5cdCAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFdpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHRoaXMuX3N0YXRlLnZhbHVlc1t0aGlzLl9pXSA9IHg7XG5cdCAgICAgIHRoaXMuX3N0YXRlLmhhc1ZhbHVlW3RoaXMuX2ldID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fc3RhdGUuaGFzVmFsdWVBbGwgPSB0aGlzLl9zdGF0ZS5oYXNWYWx1ZS5ldmVyeShpZGVudGl0eSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFdpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICB0aGlzLl9vLm9uRXJyb3IoZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFdpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gbm9vcDtcblx0XG5cdCAgICByZXR1cm4gV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICB2YXIgV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlcihvLCBjYiwgc3RhdGUpIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX2NiID0gY2I7XG5cdCAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFdpdGhMYXRlc3RGcm9tU291cmNlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICB2YXIgYWxsVmFsdWVzID0gW3hdLmNvbmNhdCh0aGlzLl9zdGF0ZS52YWx1ZXMpO1xuXHQgICAgICBpZiAoIXRoaXMuX3N0YXRlLmhhc1ZhbHVlQWxsKSB7IHJldHVybjsgfVxuXHQgICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2godGhpcy5fY2IpLmFwcGx5KG51bGwsIGFsbFZhbHVlcyk7XG5cdCAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLl9vLm9uRXJyb3IocmVzLmUpOyB9XG5cdCAgICAgIHRoaXMuX28ub25OZXh0KHJlcyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFdpdGhMYXRlc3RGcm9tU291cmNlT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFdpdGhMYXRlc3RGcm9tU291cmNlT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gb25lIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgdXNpbmcgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIG9ubHkgd2hlbiB0aGUgKGZpcnN0KSBzb3VyY2Ugb2JzZXJ2YWJsZSBzZXF1ZW5jZSBwcm9kdWNlcyBhbiBlbGVtZW50LlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIHNvdXJjZXMgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLndpdGhMYXRlc3RGcm9tID0gZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50cycpOyB9XG5cdFxuXHQgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBpc0Z1bmN0aW9uKGFyZ3NbbGVuIC0gMV0pID8gYXJncy5wb3AoKSA6IGFyZ3VtZW50c1RvQXJyYXk7XG5cdCAgICBBcnJheS5pc0FycmF5KGFyZ3NbMF0pICYmIChhcmdzID0gYXJnc1swXSk7XG5cdFxuXHQgICAgcmV0dXJuIG5ldyBXaXRoTGF0ZXN0RnJvbU9ic2VydmFibGUodGhpcywgYXJncywgcmVzdWx0U2VsZWN0b3IpO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIGZhbHNlRmFjdG9yeSgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdCAgZnVuY3Rpb24gZW1wdHlBcnJheUZhY3RvcnkoKSB7IHJldHVybiBbXTsgfVxuXHRcblx0ICB2YXIgWmlwT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFppcE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBaaXBPYnNlcnZhYmxlKHNvdXJjZXMsIHJlc3VsdFNlbGVjdG9yKSB7XG5cdCAgICAgIHRoaXMuX3MgPSBzb3VyY2VzO1xuXHQgICAgICB0aGlzLl9jYiA9IHJlc3VsdFNlbGVjdG9yO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBaaXBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcblx0ICAgICAgdmFyIG4gPSB0aGlzLl9zLmxlbmd0aCxcblx0ICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXkobik7XG5cdCAgICAgICAgICBkb25lID0gYXJyYXlJbml0aWFsaXplKG4sIGZhbHNlRmFjdG9yeSksXG5cdCAgICAgICAgICBxID0gYXJyYXlJbml0aWFsaXplKG4sIGVtcHR5QXJyYXlGYWN0b3J5KTtcblx0XG5cdCAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG5cdCAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuX3NbaV0sIHNhZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICAgIHN1YnNjcmlwdGlvbnNbaV0gPSBzYWQ7XG5cdCAgICAgICAgaXNQcm9taXNlKHNvdXJjZSkgJiYgKHNvdXJjZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShzb3VyY2UpKTtcblx0ICAgICAgICBzYWQuc2V0RGlzcG9zYWJsZShzb3VyY2Uuc3Vic2NyaWJlKG5ldyBaaXBPYnNlcnZlcihvYnNlcnZlciwgaSwgdGhpcywgcSwgZG9uZSkpKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIG5ldyBOQXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb25zKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFppcE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgWmlwT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoWmlwT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBaaXBPYnNlcnZlcihvLCBpLCBwLCBxLCBkKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9pID0gaTtcblx0ICAgICAgdGhpcy5fcCA9IHA7XG5cdCAgICAgIHRoaXMuX3EgPSBxO1xuXHQgICAgICB0aGlzLl9kID0gZDtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gbm90RW1wdHkoeCkgeyByZXR1cm4geC5sZW5ndGggPiAwOyB9XG5cdCAgICBmdW5jdGlvbiBzaGlmdEVhY2goeCkgeyByZXR1cm4geC5zaGlmdCgpOyB9XG5cdCAgICBmdW5jdGlvbiBub3RUaGVTYW1lKGkpIHtcblx0ICAgICAgcmV0dXJuIGZ1bmN0aW9uICh4LCBqKSB7XG5cdCAgICAgICAgcmV0dXJuIGogIT09IGk7XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdFxuXHQgICAgWmlwT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICB0aGlzLl9xW3RoaXMuX2ldLnB1c2goeCk7XG5cdCAgICAgIGlmICh0aGlzLl9xLmV2ZXJ5KG5vdEVtcHR5KSkge1xuXHQgICAgICAgIHZhciBxdWV1ZWRWYWx1ZXMgPSB0aGlzLl9xLm1hcChzaGlmdEVhY2gpO1xuXHQgICAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh0aGlzLl9wLl9jYikuYXBwbHkobnVsbCwgcXVldWVkVmFsdWVzKTtcblx0ICAgICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuXHQgICAgICAgIHRoaXMuX28ub25OZXh0KHJlcyk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5fZC5maWx0ZXIobm90VGhlU2FtZSh0aGlzLl9pKSkuZXZlcnkoaWRlbnRpdHkpKSB7XG5cdCAgICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHRcblx0ICAgIFppcE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgWmlwT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fZFt0aGlzLl9pXSA9IHRydWU7XG5cdCAgICAgIHRoaXMuX2QuZXZlcnkoaWRlbnRpdHkpICYmIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFppcE9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICAvKipcblx0ICAgKiBNZXJnZXMgdGhlIHNwZWNpZmllZCBvYnNlcnZhYmxlIHNlcXVlbmNlcyBpbnRvIG9uZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGJ5IHVzaW5nIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aGVuZXZlciBhbGwgb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzIG9yIGFuIGFycmF5IGhhdmUgcHJvZHVjZWQgYW4gZWxlbWVudCBhdCBhIGNvcnJlc3BvbmRpbmcgaW5kZXguXG5cdCAgICogVGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJndW1lbnRzIG11c3QgYmUgYSBmdW5jdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggc2VyaWVzIG9mIGVsZW1lbnRzIGF0IGNvcnJlc3BvbmRpbmcgaW5kZXhlcyBpbiB0aGUgYXJncy5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY29tYmluaW5nIGVsZW1lbnRzIG9mIHRoZSBhcmdzIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVzdWx0IHNlbGVjdG9yIGZ1bmN0aW9uLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by56aXAgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnRzJyk7IH1cblx0XG5cdCAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuXHQgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIHZhciByZXN1bHRTZWxlY3RvciA9IGlzRnVuY3Rpb24oYXJnc1tsZW4gLSAxXSkgPyBhcmdzLnBvcCgpIDogYXJndW1lbnRzVG9BcnJheTtcblx0ICAgIEFycmF5LmlzQXJyYXkoYXJnc1swXSkgJiYgKGFyZ3MgPSBhcmdzWzBdKTtcblx0XG5cdCAgICB2YXIgcGFyZW50ID0gdGhpcztcblx0ICAgIGFyZ3MudW5zaGlmdChwYXJlbnQpO1xuXHRcblx0ICAgIHJldHVybiBuZXcgWmlwT2JzZXJ2YWJsZShhcmdzLCByZXN1bHRTZWxlY3Rvcik7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogTWVyZ2VzIHRoZSBzcGVjaWZpZWQgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBvbmUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSB1c2luZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gd2hlbmV2ZXIgYWxsIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlcyBoYXZlIHByb2R1Y2VkIGFuIGVsZW1lbnQgYXQgYSBjb3JyZXNwb25kaW5nIGluZGV4LlxuXHQgICAqIEBwYXJhbSBhcmd1bWVudHMgT2JzZXJ2YWJsZSBzb3VyY2VzLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc3VsdFNlbGVjdG9yIEZ1bmN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBzZXJpZXMgb2YgZWxlbWVudHMgYXQgY29ycmVzcG9uZGluZyBpbmRleGVzIGluIHRoZSBzb3VyY2VzLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIHNvdXJjZXMgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG5cdCAgICovXG5cdCAgT2JzZXJ2YWJsZS56aXAgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuXHQgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XG5cdCAgICAgIGFyZ3MgPSBpc0Z1bmN0aW9uKGFyZ3NbMV0pID8gYXJnc1swXS5jb25jYXQoYXJnc1sxXSkgOiBhcmdzWzBdO1xuXHQgICAgfVxuXHQgICAgdmFyIGZpcnN0ID0gYXJncy5zaGlmdCgpO1xuXHQgICAgcmV0dXJuIGZpcnN0LnppcC5hcHBseShmaXJzdCwgYXJncyk7XG5cdCAgfTtcblx0XG5cdGZ1bmN0aW9uIGZhbHNlRmFjdG9yeSgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGZ1bmN0aW9uIGVtcHR5QXJyYXlGYWN0b3J5KCkgeyByZXR1cm4gW107IH1cblx0ZnVuY3Rpb24gYXJndW1lbnRzVG9BcnJheSgpIHtcblx0ICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuXHQgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgcmV0dXJuIGFyZ3M7XG5cdH1cblx0XG5cdC8qKlxuXHQgKiBNZXJnZXMgdGhlIHNwZWNpZmllZCBvYnNlcnZhYmxlIHNlcXVlbmNlcyBpbnRvIG9uZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGJ5IHVzaW5nIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aGVuZXZlciBhbGwgb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzIG9yIGFuIGFycmF5IGhhdmUgcHJvZHVjZWQgYW4gZWxlbWVudCBhdCBhIGNvcnJlc3BvbmRpbmcgaW5kZXguXG5cdCAqIFRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFyZ3VtZW50cyBtdXN0IGJlIGEgZnVuY3Rpb24gdG8gaW52b2tlIGZvciBlYWNoIHNlcmllcyBvZiBlbGVtZW50cyBhdCBjb3JyZXNwb25kaW5nIGluZGV4ZXMgaW4gdGhlIGFyZ3MuXG5cdCAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIGFyZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG5cdCAqL1xuXHRvYnNlcnZhYmxlUHJvdG8uemlwSXRlcmFibGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50cycpOyB9XG5cdFxuXHQgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBpc0Z1bmN0aW9uKGFyZ3NbbGVuIC0gMV0pID8gYXJncy5wb3AoKSA6IGFyZ3VtZW50c1RvQXJyYXk7XG5cdFxuXHQgIHZhciBwYXJlbnQgPSB0aGlzO1xuXHQgIGFyZ3MudW5zaGlmdChwYXJlbnQpO1xuXHQgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuXHQgICAgdmFyIG4gPSBhcmdzLmxlbmd0aCxcblx0ICAgICAgcXVldWVzID0gYXJyYXlJbml0aWFsaXplKG4sIGVtcHR5QXJyYXlGYWN0b3J5KSxcblx0ICAgICAgaXNEb25lID0gYXJyYXlJbml0aWFsaXplKG4sIGZhbHNlRmFjdG9yeSk7XG5cdFxuXHQgICAgdmFyIHN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXkobik7XG5cdCAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBuOyBpZHgrKykge1xuXHQgICAgICAoZnVuY3Rpb24gKGkpIHtcblx0ICAgICAgICB2YXIgc291cmNlID0gYXJnc1tpXSwgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdFxuXHQgICAgICAgIChpc0FycmF5TGlrZShzb3VyY2UpIHx8IGlzSXRlcmFibGUoc291cmNlKSkgJiYgKHNvdXJjZSA9IG9ic2VydmFibGVGcm9tKHNvdXJjZSkpO1xuXHRcblx0ICAgICAgICBzYWQuc2V0RGlzcG9zYWJsZShzb3VyY2Uuc3Vic2NyaWJlKGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgICAgICBxdWV1ZXNbaV0ucHVzaCh4KTtcblx0ICAgICAgICAgIGlmIChxdWV1ZXMuZXZlcnkoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHgubGVuZ3RoID4gMDsgfSkpIHtcblx0ICAgICAgICAgICAgdmFyIHF1ZXVlZFZhbHVlcyA9IHF1ZXVlcy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguc2hpZnQoKTsgfSksXG5cdCAgICAgICAgICAgICAgICByZXMgPSB0cnlDYXRjaChyZXN1bHRTZWxlY3RvcikuYXBwbHkocGFyZW50LCBxdWV1ZWRWYWx1ZXMpO1xuXHQgICAgICAgICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlcy5lKTsgfVxuXHQgICAgICAgICAgICBvLm9uTmV4dChyZXMpO1xuXHQgICAgICAgICAgfSBlbHNlIGlmIChpc0RvbmUuZmlsdGVyKGZ1bmN0aW9uICh4LCBqKSB7IHJldHVybiBqICE9PSBpOyB9KS5ldmVyeShpZGVudGl0eSkpIHtcblx0ICAgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgaXNEb25lW2ldID0gdHJ1ZTtcblx0ICAgICAgICAgIGlzRG9uZS5ldmVyeShpZGVudGl0eSkgJiYgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgIH0pKTtcblx0ICAgICAgICBzdWJzY3JpcHRpb25zW2ldID0gc2FkO1xuXHQgICAgICB9KShpZHgpO1xuXHQgICAgfVxuXHRcblx0ICAgIHJldHVybiBuZXcgQ29tcG9zaXRlRGlzcG9zYWJsZShzdWJzY3JpcHRpb25zKTtcblx0ICB9LCBwYXJlbnQpO1xuXHR9O1xuXHRcblx0ICBmdW5jdGlvbiBhc09ic2VydmFibGUoc291cmNlKSB7XG5cdCAgICByZXR1cm4gZnVuY3Rpb24gc3Vic2NyaWJlKG8pIHsgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobyk7IH07XG5cdCAgfVxuXHRcblx0ICAvKipcblx0ICAgKiAgSGlkZXMgdGhlIGlkZW50aXR5IG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBoaWRlcyB0aGUgaWRlbnRpdHkgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uYXNPYnNlcnZhYmxlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGFzT2JzZXJ2YWJsZSh0aGlzKSwgdGhpcyk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIERlbWF0ZXJpYWxpemVPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKERlbWF0ZXJpYWxpemVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gRGVtYXRlcmlhbGl6ZU9ic2VydmFibGUoc291cmNlKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBEZW1hdGVyaWFsaXplT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IERlbWF0ZXJpYWxpemVPYnNlcnZlcihvKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBEZW1hdGVyaWFsaXplT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBEZW1hdGVyaWFsaXplT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRGVtYXRlcmlhbGl6ZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIERlbWF0ZXJpYWxpemVPYnNlcnZlcihvKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBEZW1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkgeyB4LmFjY2VwdCh0aGlzLl9vKTsgfTtcblx0ICAgIERlbWF0ZXJpYWxpemVPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uRXJyb3IoZSk7IH07XG5cdCAgICBEZW1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuXHRcblx0ICAgIHJldHVybiBEZW1hdGVyaWFsaXplT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIERlbWF0ZXJpYWxpemVzIHRoZSBleHBsaWNpdCBub3RpZmljYXRpb24gdmFsdWVzIG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgaW1wbGljaXQgbm90aWZpY2F0aW9ucy5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBleGhpYml0aW5nIHRoZSBiZWhhdmlvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzb3VyY2Ugc2VxdWVuY2UncyBub3RpZmljYXRpb24gdmFsdWVzLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5kZW1hdGVyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIG5ldyBEZW1hdGVyaWFsaXplT2JzZXJ2YWJsZSh0aGlzKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZhYmxlKHNvdXJjZSwga2V5Rm4sIGNvbXBhcmVyKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLmtleUZuID0ga2V5Rm47XG5cdCAgICAgIHRoaXMuY29tcGFyZXIgPSBjb21wYXJlcjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZlcihvLCB0aGlzLmtleUZuLCB0aGlzLmNvbXBhcmVyKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZlciA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyKG8sIGtleUZuLCBjb21wYXJlcikge1xuXHQgICAgICB0aGlzLm8gPSBvO1xuXHQgICAgICB0aGlzLmtleUZuID0ga2V5Rm47XG5cdCAgICAgIHRoaXMuY29tcGFyZXIgPSBjb21wYXJlcjtcblx0ICAgICAgdGhpcy5oYXNDdXJyZW50S2V5ID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuY3VycmVudEtleSA9IG51bGw7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICB2YXIga2V5ID0geCwgY29tcGFyZXJFcXVhbHM7XG5cdCAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMua2V5Rm4pKSB7XG5cdCAgICAgICAga2V5ID0gdHJ5Q2F0Y2godGhpcy5rZXlGbikoeCk7XG5cdCAgICAgICAgaWYgKGtleSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKGtleS5lKTsgfVxuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLmhhc0N1cnJlbnRLZXkpIHtcblx0ICAgICAgICBjb21wYXJlckVxdWFscyA9IHRyeUNhdGNoKHRoaXMuY29tcGFyZXIpKHRoaXMuY3VycmVudEtleSwga2V5KTtcblx0ICAgICAgICBpZiAoY29tcGFyZXJFcXVhbHMgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLm8ub25FcnJvcihjb21wYXJlckVxdWFscy5lKTsgfVxuXHQgICAgICB9XG5cdCAgICAgIGlmICghdGhpcy5oYXNDdXJyZW50S2V5IHx8ICFjb21wYXJlckVxdWFscykge1xuXHQgICAgICAgIHRoaXMuaGFzQ3VycmVudEtleSA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50S2V5ID0ga2V5O1xuXHQgICAgICAgIHRoaXMuby5vbk5leHQoeCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGUpIHtcblx0ICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG5cdCAgICB9O1xuXHQgICAgRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLm8ub25Db21wbGV0ZWQoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIG9ubHkgZGlzdGluY3QgY29udGlndW91cyBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlIGtleUZuIGFuZCB0aGUgY29tcGFyZXIuXG5cdCAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBba2V5Rm5dIEEgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgY29tcGFyaXNvbiBrZXkgZm9yIGVhY2ggZWxlbWVudC4gSWYgbm90IHByb3ZpZGVkLCBpdCBwcm9qZWN0cyB0aGUgdmFsdWUuXG5cdCAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyZXJdIEVxdWFsaXR5IGNvbXBhcmVyIGZvciBjb21wdXRlZCBrZXkgdmFsdWVzLiBJZiBub3QgcHJvdmlkZWQsIGRlZmF1bHRzIHRvIGFuIGVxdWFsaXR5IGNvbXBhcmVyIGZ1bmN0aW9uLlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2Ugb25seSBjb250YWluaW5nIHRoZSBkaXN0aW5jdCBjb250aWd1b3VzIGVsZW1lbnRzLCBiYXNlZCBvbiBhIGNvbXB1dGVkIGtleSB2YWx1ZSwgZnJvbSB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLmRpc3RpbmN0VW50aWxDaGFuZ2VkID0gZnVuY3Rpb24gKGtleUZuLCBjb21wYXJlcikge1xuXHQgICAgY29tcGFyZXIgfHwgKGNvbXBhcmVyID0gZGVmYXVsdENvbXBhcmVyKTtcblx0ICAgIHJldHVybiBuZXcgRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZhYmxlKHRoaXMsIGtleUZuLCBjb21wYXJlcik7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFRhcE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhUYXBPYnNlcnZhYmxlLF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBUYXBPYnNlcnZhYmxlKHNvdXJjZSwgb2JzZXJ2ZXJPck9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuX29OID0gb2JzZXJ2ZXJPck9uTmV4dDtcblx0ICAgICAgdGhpcy5fb0UgPSBvbkVycm9yO1xuXHQgICAgICB0aGlzLl9vQyA9IG9uQ29tcGxldGVkO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBUYXBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24obykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHRoaXMpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG5cdCAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIHApIHtcblx0ICAgICAgdGhpcy5vID0gbztcblx0ICAgICAgdGhpcy50ID0gIXAuX29OIHx8IGlzRnVuY3Rpb24ocC5fb04pID9cblx0ICAgICAgICBvYnNlcnZlckNyZWF0ZShwLl9vTiB8fCBub29wLCBwLl9vRSB8fCBub29wLCBwLl9vQyB8fCBub29wKSA6XG5cdCAgICAgICAgcC5fb047XG5cdCAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICAgIEFic3RyYWN0T2JzZXJ2ZXIuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih4KSB7XG5cdCAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh0aGlzLnQub25OZXh0KS5jYWxsKHRoaXMudCwgeCk7XG5cdCAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHRoaXMuby5vbkVycm9yKHJlcy5lKTsgfVxuXHQgICAgICB0aGlzLm8ub25OZXh0KHgpO1xuXHQgICAgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG5cdCAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh0aGlzLnQub25FcnJvcikuY2FsbCh0aGlzLnQsIGVycik7XG5cdCAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLm8ub25FcnJvcihyZXMuZSk7IH1cblx0ICAgICAgdGhpcy5vLm9uRXJyb3IoZXJyKTtcblx0ICAgIH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMudC5vbkNvbXBsZXRlZCkuY2FsbCh0aGlzLnQpO1xuXHQgICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5vLm9uRXJyb3IocmVzLmUpOyB9XG5cdCAgICAgIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gVGFwT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICogIEludm9rZXMgYW4gYWN0aW9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIG9ic2VydmFibGUgc2VxdWVuY2UgYW5kIGludm9rZXMgYW4gYWN0aW9uIHVwb24gZ3JhY2VmdWwgb3IgZXhjZXB0aW9uYWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgKiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZywgbG9nZ2luZywgZXRjLiBvZiBxdWVyeSBiZWhhdmlvciBieSBpbnRlcmNlcHRpbmcgdGhlIG1lc3NhZ2Ugc3RyZWFtIHRvIHJ1biBhcmJpdHJhcnkgYWN0aW9ucyBmb3IgbWVzc2FnZXMgb24gdGhlIHBpcGVsaW5lLlxuXHQgICogQHBhcmFtIHtGdW5jdGlvbiB8IE9ic2VydmVyfSBvYnNlcnZlck9yT25OZXh0IEFjdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvciBhbiBvLlxuXHQgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdICBBY3Rpb24gdG8gaW52b2tlIHVwb24gZXhjZXB0aW9uYWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuIFVzZWQgaWYgb25seSB0aGUgb2JzZXJ2ZXJPck9uTmV4dCBwYXJhbWV0ZXIgaXMgYWxzbyBhIGZ1bmN0aW9uLlxuXHQgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uQ29tcGxldGVkXSAgQWN0aW9uIHRvIGludm9rZSB1cG9uIGdyYWNlZnVsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLiBVc2VkIGlmIG9ubHkgdGhlIG9ic2VydmVyT3JPbk5leHQgcGFyYW1ldGVyIGlzIGFsc28gYSBmdW5jdGlvbi5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHdpdGggdGhlIHNpZGUtZWZmZWN0aW5nIGJlaGF2aW9yIGFwcGxpZWQuXG5cdCAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG9bJ2RvJ10gPSBvYnNlcnZhYmxlUHJvdG8udGFwID0gb2JzZXJ2YWJsZVByb3RvLmRvQWN0aW9uID0gZnVuY3Rpb24gKG9ic2VydmVyT3JPbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG5cdCAgICByZXR1cm4gbmV3IFRhcE9ic2VydmFibGUodGhpcywgb2JzZXJ2ZXJPck9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICogIEludm9rZXMgYW4gYWN0aW9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgKiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZywgbG9nZ2luZywgZXRjLiBvZiBxdWVyeSBiZWhhdmlvciBieSBpbnRlcmNlcHRpbmcgdGhlIG1lc3NhZ2Ugc3RyZWFtIHRvIHJ1biBhcmJpdHJhcnkgYWN0aW9ucyBmb3IgbWVzc2FnZXMgb24gdGhlIHBpcGVsaW5lLlxuXHQgICogQHBhcmFtIHtGdW5jdGlvbn0gb25OZXh0IEFjdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gT2JqZWN0IHRvIHVzZSBhcyB0aGlzIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aCB0aGUgc2lkZS1lZmZlY3RpbmcgYmVoYXZpb3IgYXBwbGllZC5cblx0ICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5kb09uTmV4dCA9IG9ic2VydmFibGVQcm90by50YXBPbk5leHQgPSBmdW5jdGlvbiAob25OZXh0LCB0aGlzQXJnKSB7XG5cdCAgICByZXR1cm4gdGhpcy50YXAodHlwZW9mIHRoaXNBcmcgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24gKHgpIHsgb25OZXh0LmNhbGwodGhpc0FyZywgeCk7IH0gOiBvbk5leHQpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICogIEludm9rZXMgYW4gYWN0aW9uIHVwb24gZXhjZXB0aW9uYWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgKiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZywgbG9nZ2luZywgZXRjLiBvZiBxdWVyeSBiZWhhdmlvciBieSBpbnRlcmNlcHRpbmcgdGhlIG1lc3NhZ2Ugc3RyZWFtIHRvIHJ1biBhcmJpdHJhcnkgYWN0aW9ucyBmb3IgbWVzc2FnZXMgb24gdGhlIHBpcGVsaW5lLlxuXHQgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBBY3Rpb24gdG8gaW52b2tlIHVwb24gZXhjZXB0aW9uYWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHdpdGggdGhlIHNpZGUtZWZmZWN0aW5nIGJlaGF2aW9yIGFwcGxpZWQuXG5cdCAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uZG9PbkVycm9yID0gb2JzZXJ2YWJsZVByb3RvLnRhcE9uRXJyb3IgPSBmdW5jdGlvbiAob25FcnJvciwgdGhpc0FyZykge1xuXHQgICAgcmV0dXJuIHRoaXMudGFwKG5vb3AsIHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uIChlKSB7IG9uRXJyb3IuY2FsbCh0aGlzQXJnLCBlKTsgfSA6IG9uRXJyb3IpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICogIEludm9rZXMgYW4gYWN0aW9uIHVwb24gZ3JhY2VmdWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgKiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZywgbG9nZ2luZywgZXRjLiBvZiBxdWVyeSBiZWhhdmlvciBieSBpbnRlcmNlcHRpbmcgdGhlIG1lc3NhZ2Ugc3RyZWFtIHRvIHJ1biBhcmJpdHJhcnkgYWN0aW9ucyBmb3IgbWVzc2FnZXMgb24gdGhlIHBpcGVsaW5lLlxuXHQgICogQHBhcmFtIHtGdW5jdGlvbn0gb25Db21wbGV0ZWQgQWN0aW9uIHRvIGludm9rZSB1cG9uIGdyYWNlZnVsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICogQHBhcmFtIHtBbnl9IFt0aGlzQXJnXSBPYmplY3QgdG8gdXNlIGFzIHRoaXMgd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIHNvdXJjZSBzZXF1ZW5jZSB3aXRoIHRoZSBzaWRlLWVmZmVjdGluZyBiZWhhdmlvciBhcHBsaWVkLlxuXHQgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLmRvT25Db21wbGV0ZWQgPSBvYnNlcnZhYmxlUHJvdG8udGFwT25Db21wbGV0ZWQgPSBmdW5jdGlvbiAob25Db21wbGV0ZWQsIHRoaXNBcmcpIHtcblx0ICAgIHJldHVybiB0aGlzLnRhcChub29wLCBudWxsLCB0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoKSB7IG9uQ29tcGxldGVkLmNhbGwodGhpc0FyZyk7IH0gOiBvbkNvbXBsZXRlZCk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogIEludm9rZXMgYSBzcGVjaWZpZWQgYWN0aW9uIGFmdGVyIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0ZXJtaW5hdGVzIGdyYWNlZnVsbHkgb3IgZXhjZXB0aW9uYWxseS5cblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5hbGx5QWN0aW9uIEFjdGlvbiB0byBpbnZva2UgYWZ0ZXIgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRlcm1pbmF0ZXMuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IFNvdXJjZSBzZXF1ZW5jZSB3aXRoIHRoZSBhY3Rpb24taW52b2tpbmcgdGVybWluYXRpb24gYmVoYXZpb3IgYXBwbGllZC5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG9bJ2ZpbmFsbHknXSA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcblx0ICAgIHZhciBzb3VyY2UgPSB0aGlzO1xuXHQgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuXHQgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gdHJ5Q2F0Y2goc291cmNlLnN1YnNjcmliZSkuY2FsbChzb3VyY2UsIG9ic2VydmVyKTtcblx0ICAgICAgaWYgKHN1YnNjcmlwdGlvbiA9PT0gZXJyb3JPYmopIHtcblx0ICAgICAgICBhY3Rpb24oKTtcblx0ICAgICAgICByZXR1cm4gdGhyb3dlcihzdWJzY3JpcHRpb24uZSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGRpc3Bvc2FibGVDcmVhdGUoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciByID0gdHJ5Q2F0Y2goc3Vic2NyaXB0aW9uLmRpc3Bvc2UpLmNhbGwoc3Vic2NyaXB0aW9uKTtcblx0ICAgICAgICBhY3Rpb24oKTtcblx0ICAgICAgICByID09PSBlcnJvck9iaiAmJiB0aHJvd2VyKHIuZSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfSwgdGhpcyk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0XG5cdCAgICBmdW5jdGlvbiBJZ25vcmVFbGVtZW50c09ic2VydmFibGUoc291cmNlKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBJZ25vcmVFbGVtZW50c09ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8pKTtcblx0ICAgIH07XG5cdFxuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvKSB7XG5cdCAgICAgIHRoaXMubyA9IG87XG5cdCAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBub29wO1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcblx0ICAgICAgaWYoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuby5vbkVycm9yKGVycik7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgaWYoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLm9ic2VydmVyLm9uRXJyb3IoZSk7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqICBJZ25vcmVzIGFsbCBlbGVtZW50cyBpbiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGxlYXZpbmcgb25seSB0aGUgdGVybWluYXRpb24gbWVzc2FnZXMuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIGVtcHR5IG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBzaWduYWxzIHRlcm1pbmF0aW9uLCBzdWNjZXNzZnVsIG9yIGV4Y2VwdGlvbmFsLCBvZiB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5pZ25vcmVFbGVtZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBuZXcgSWdub3JlRWxlbWVudHNPYnNlcnZhYmxlKHRoaXMpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBNYXRlcmlhbGl6ZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoTWF0ZXJpYWxpemVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gTWF0ZXJpYWxpemVPYnNlcnZhYmxlKHNvdXJjZSwgZm4pIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIE1hdGVyaWFsaXplT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IE1hdGVyaWFsaXplT2JzZXJ2ZXIobykpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gTWF0ZXJpYWxpemVPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIE1hdGVyaWFsaXplT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoTWF0ZXJpYWxpemVPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0XG5cdCAgICBmdW5jdGlvbiBNYXRlcmlhbGl6ZU9ic2VydmVyKG8pIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIE1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkgeyB0aGlzLl9vLm9uTmV4dChub3RpZmljYXRpb25DcmVhdGVPbk5leHQoeCkpIH07XG5cdCAgICBNYXRlcmlhbGl6ZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuX28ub25OZXh0KG5vdGlmaWNhdGlvbkNyZWF0ZU9uRXJyb3IoZSkpOyB0aGlzLl9vLm9uQ29tcGxldGVkKCk7IH07XG5cdCAgICBNYXRlcmlhbGl6ZU9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX28ub25OZXh0KG5vdGlmaWNhdGlvbkNyZWF0ZU9uQ29tcGxldGVkKCkpOyB0aGlzLl9vLm9uQ29tcGxldGVkKCk7IH07XG5cdFxuXHQgICAgcmV0dXJuIE1hdGVyaWFsaXplT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqICBNYXRlcmlhbGl6ZXMgdGhlIGltcGxpY2l0IG5vdGlmaWNhdGlvbnMgb2YgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBhcyBleHBsaWNpdCBub3RpZmljYXRpb24gdmFsdWVzLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIG1hdGVyaWFsaXplZCBub3RpZmljYXRpb24gdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ubWF0ZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gbmV3IE1hdGVyaWFsaXplT2JzZXJ2YWJsZSh0aGlzKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiAgUmVwZWF0cyB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBhIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMuIElmIHRoZSByZXBlYXQgY291bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHNlcXVlbmNlIHJlcGVhdHMgaW5kZWZpbml0ZWx5LlxuXHQgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmVwZWF0Q291bnRdICBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzZXF1ZW5jZS4gSWYgbm90IHByb3ZpZGVkLCByZXBlYXRzIHRoZSBzZXF1ZW5jZSBpbmRlZmluaXRlbHkuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2luZyB0aGUgZWxlbWVudHMgb2YgdGhlIGdpdmVuIHNlcXVlbmNlIHJlcGVhdGVkbHkuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnJlcGVhdCA9IGZ1bmN0aW9uIChyZXBlYXRDb3VudCkge1xuXHQgICAgcmV0dXJuIGVudW1lcmFibGVSZXBlYXQodGhpcywgcmVwZWF0Q291bnQpLmNvbmNhdCgpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZXBlYXRzIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcyBvciB1bnRpbCBpdCBzdWNjZXNzZnVsbHkgdGVybWluYXRlcy4gSWYgdGhlIHJldHJ5IGNvdW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0IHJldHJpZXMgaW5kZWZpbml0ZWx5LlxuXHQgICAqICBOb3RlIGlmIHlvdSBlbmNvdW50ZXIgYW4gZXJyb3IgYW5kIHdhbnQgaXQgdG8gcmV0cnkgb25jZSwgdGhlbiB5b3UgbXVzdCB1c2UgLnJldHJ5KDIpO1xuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiAgdmFyIHJlcyA9IHJldHJpZWQgPSByZXRyeS5yZXBlYXQoKTtcblx0ICAgKiAgdmFyIHJlcyA9IHJldHJpZWQgPSByZXRyeS5yZXBlYXQoMik7XG5cdCAgICogQHBhcmFtIHtOdW1iZXJ9IFtyZXRyeUNvdW50XSAgTnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IHRoZSBzZXF1ZW5jZS4gSWYgbm90IHByb3ZpZGVkLCByZXRyeSB0aGUgc2VxdWVuY2UgaW5kZWZpbml0ZWx5LlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2luZyB0aGUgZWxlbWVudHMgb2YgdGhlIGdpdmVuIHNlcXVlbmNlIHJlcGVhdGVkbHkgdW50aWwgaXQgdGVybWluYXRlcyBzdWNjZXNzZnVsbHkuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnJldHJ5ID0gZnVuY3Rpb24gKHJldHJ5Q291bnQpIHtcblx0ICAgIHJldHVybiBlbnVtZXJhYmxlUmVwZWF0KHRoaXMsIHJldHJ5Q291bnQpLmNhdGNoRXJyb3IoKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiAgUmVwZWF0cyB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2UgdXBvbiBlcnJvciBlYWNoIHRpbWUgdGhlIG5vdGlmaWVyIGVtaXRzIG9yIHVudGlsIGl0IHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVzLiBcblx0ICAgKiAgaWYgdGhlIG5vdGlmaWVyIGNvbXBsZXRlcywgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UgY29tcGxldGVzLlxuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiAgdmFyIHRpbWVyID0gT2JzZXJ2YWJsZS50aW1lcig1MDApO1xuXHQgICAqICB2YXIgc291cmNlID0gb2JzZXJ2YWJsZS5yZXRyeVdoZW4odGltZXIpO1xuXHQgICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gW25vdGlmaWVyXSBBbiBvYnNlcnZhYmxlIHRoYXQgdHJpZ2dlcnMgdGhlIHJldHJpZXMgb3IgY29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdpdGggb25OZXh0IG9yIG9uQ29tcGxldGVkIHJlc3BlY3RpdmVseS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBwcm9kdWNpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBzZXF1ZW5jZSByZXBlYXRlZGx5IHVudGlsIGl0IHRlcm1pbmF0ZXMgc3VjY2Vzc2Z1bGx5LlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5yZXRyeVdoZW4gPSBmdW5jdGlvbiAobm90aWZpZXIpIHtcblx0ICAgIHJldHVybiBlbnVtZXJhYmxlUmVwZWF0KHRoaXMpLmNhdGNoRXJyb3JXaGVuKG5vdGlmaWVyKTtcblx0ICB9O1xuXHQgIHZhciBTY2FuT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFNjYW5PYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gU2Nhbk9ic2VydmFibGUoc291cmNlLCBhY2N1bXVsYXRvciwgaGFzU2VlZCwgc2VlZCkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5hY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yO1xuXHQgICAgICB0aGlzLmhhc1NlZWQgPSBoYXNTZWVkO1xuXHQgICAgICB0aGlzLnNlZWQgPSBzZWVkO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBTY2FuT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgU2Nhbk9ic2VydmVyKG8sdGhpcykpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU2Nhbk9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgU2Nhbk9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFNjYW5PYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFNjYW5PYnNlcnZlcihvLCBwYXJlbnQpIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX3AgPSBwYXJlbnQ7XG5cdCAgICAgIHRoaXMuX2ZuID0gcGFyZW50LmFjY3VtdWxhdG9yO1xuXHQgICAgICB0aGlzLl9ocyA9IHBhcmVudC5oYXNTZWVkO1xuXHQgICAgICB0aGlzLl9zID0gcGFyZW50LnNlZWQ7XG5cdCAgICAgIHRoaXMuX2hhID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuX2EgPSBudWxsO1xuXHQgICAgICB0aGlzLl9odiA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9pID0gMDtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgU2Nhbk9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgIXRoaXMuX2h2ICYmICh0aGlzLl9odiA9IHRydWUpO1xuXHQgICAgICBpZiAodGhpcy5faGEpIHtcblx0ICAgICAgICB0aGlzLl9hID0gdHJ5Q2F0Y2godGhpcy5fZm4pKHRoaXMuX2EsIHgsIHRoaXMuX2ksIHRoaXMuX3ApO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuX2EgPSB0aGlzLl9ocyA/IHRyeUNhdGNoKHRoaXMuX2ZuKSh0aGlzLl9zLCB4LCB0aGlzLl9pLCB0aGlzLl9wKSA6IHg7XG5cdCAgICAgICAgdGhpcy5faGEgPSB0cnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9hID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHRoaXMuX2EuZSk7IH1cblx0ICAgICAgdGhpcy5fby5vbk5leHQodGhpcy5fYSk7XG5cdCAgICAgIHRoaXMuX2krKztcblx0ICAgIH07XG5cdFxuXHQgICAgU2Nhbk9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgU2Nhbk9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICF0aGlzLl9odiAmJiB0aGlzLl9ocyAmJiB0aGlzLl9vLm9uTmV4dCh0aGlzLl9zKTtcblx0ICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU2Nhbk9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICAvKipcblx0ICAqICBBcHBsaWVzIGFuIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIG92ZXIgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBhbmQgcmV0dXJucyBlYWNoIGludGVybWVkaWF0ZSByZXN1bHQuIFRoZSBvcHRpb25hbCBzZWVkIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUuXG5cdCAgKiAgRm9yIGFnZ3JlZ2F0aW9uIGJlaGF2aW9yIHdpdGggbm8gaW50ZXJtZWRpYXRlIHJlc3VsdHMsIHNlZSBPYnNlcnZhYmxlLmFnZ3JlZ2F0ZS5cblx0ICAqIEBwYXJhbSB7TWl4ZWR9IFtzZWVkXSBUaGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZS5cblx0ICAqIEBwYXJhbSB7RnVuY3Rpb259IGFjY3VtdWxhdG9yIEFuIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgb24gZWFjaCBlbGVtZW50LlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgYWNjdW11bGF0ZWQgdmFsdWVzLlxuXHQgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnNjYW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgaGFzU2VlZCA9IGZhbHNlLCBzZWVkLCBhY2N1bXVsYXRvciA9IGFyZ3VtZW50c1swXTtcblx0ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG5cdCAgICAgIGhhc1NlZWQgPSB0cnVlO1xuXHQgICAgICBzZWVkID0gYXJndW1lbnRzWzFdO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG5ldyBTY2FuT2JzZXJ2YWJsZSh0aGlzLCBhY2N1bXVsYXRvciwgaGFzU2VlZCwgc2VlZCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFNraXBMYXN0T2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhTa2lwTGFzdE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBTa2lwTGFzdE9ic2VydmFibGUoc291cmNlLCBjKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLl9jID0gYztcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgU2tpcExhc3RPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgU2tpcExhc3RPYnNlcnZlcihvLCB0aGlzLl9jKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTa2lwTGFzdE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgU2tpcExhc3RPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhTa2lwTGFzdE9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gU2tpcExhc3RPYnNlcnZlcihvLCBjKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9jID0gYztcblx0ICAgICAgdGhpcy5fcSA9IFtdO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBTa2lwTGFzdE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgdGhpcy5fcS5wdXNoKHgpO1xuXHQgICAgICB0aGlzLl9xLmxlbmd0aCA+IHRoaXMuX2MgJiYgdGhpcy5fby5vbk5leHQodGhpcy5fcS5zaGlmdCgpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgU2tpcExhc3RPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICB0aGlzLl9vLm9uRXJyb3IoZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFNraXBMYXN0T2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU2tpcExhc3RPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIEJ5cGFzc2VzIGEgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cyBhdCB0aGUgZW5kIG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICogQGRlc2NyaXB0aW9uXG5cdCAgICogIFRoaXMgb3BlcmF0b3IgYWNjdW11bGF0ZXMgYSBxdWV1ZSB3aXRoIGEgbGVuZ3RoIGVub3VnaCB0byBzdG9yZSB0aGUgZmlyc3QgYGNvdW50YCBlbGVtZW50cy4gQXMgbW9yZSBlbGVtZW50cyBhcmVcblx0ICAgKiAgcmVjZWl2ZWQsIGVsZW1lbnRzIGFyZSB0YWtlbiBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgYW5kIHByb2R1Y2VkIG9uIHRoZSByZXN1bHQgc2VxdWVuY2UuIFRoaXMgY2F1c2VzIGVsZW1lbnRzIHRvIGJlIGRlbGF5ZWQuXG5cdCAgICogQHBhcmFtIGNvdW50IE51bWJlciBvZiBlbGVtZW50cyB0byBieXBhc3MgYXQgdGhlIGVuZCBvZiB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBzZXF1ZW5jZSBlbGVtZW50cyBleGNlcHQgZm9yIHRoZSBieXBhc3NlZCBvbmVzIGF0IHRoZSBlbmQuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnNraXBMYXN0ID0gZnVuY3Rpb24gKGNvdW50KSB7XG5cdCAgICBpZiAoY291bnQgPCAwKSB7IHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcigpOyB9XG5cdCAgICByZXR1cm4gbmV3IFNraXBMYXN0T2JzZXJ2YWJsZSh0aGlzLCBjb3VudCk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFByZXBlbmRzIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHRvIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCBhbiBvcHRpb25hbCBzY2hlZHVsZXIgYW5kIGFuIGFyZ3VtZW50IGxpc3Qgb2YgdmFsdWVzIHRvIHByZXBlbmQuXG5cdCAgICogIEBleGFtcGxlXG5cdCAgICogIHZhciByZXMgPSBzb3VyY2Uuc3RhcnRXaXRoKDEsIDIsIDMpO1xuXHQgICAqICB2YXIgcmVzID0gc291cmNlLnN0YXJ0V2l0aChSeC5TY2hlZHVsZXIudGltZW91dCwgMSwgMiwgMyk7XG5cdCAgICogQHBhcmFtIHtBcmd1bWVudHN9IGFyZ3MgVGhlIHNwZWNpZmllZCB2YWx1ZXMgdG8gcHJlcGVuZCB0byB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZVxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHByZXBlbmRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5zdGFydFdpdGggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgdmFsdWVzLCBzY2hlZHVsZXIsIHN0YXJ0ID0gMDtcblx0ICAgIGlmICghIWFyZ3VtZW50cy5sZW5ndGggJiYgaXNTY2hlZHVsZXIoYXJndW1lbnRzWzBdKSkge1xuXHQgICAgICBzY2hlZHVsZXIgPSBhcmd1bWVudHNbMF07XG5cdCAgICAgIHN0YXJ0ID0gMTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHNjaGVkdWxlciA9IGltbWVkaWF0ZVNjaGVkdWxlcjtcblx0ICAgIH1cblx0ICAgIGZvcih2YXIgYXJncyA9IFtdLCBpID0gc3RhcnQsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeyBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsgfVxuXHQgICAgcmV0dXJuIGVudW1lcmFibGVPZihbb2JzZXJ2YWJsZUZyb21BcnJheShhcmdzLCBzY2hlZHVsZXIpLCB0aGlzXSkuY29uY2F0KCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFRha2VMYXN0T2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoVGFrZUxhc3RPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFRha2VMYXN0T2JzZXJ2ZXIobywgYykge1xuXHQgICAgICB0aGlzLl9vID0gbztcblx0ICAgICAgdGhpcy5fYyA9IGM7XG5cdCAgICAgIHRoaXMuX3EgPSBbXTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgVGFrZUxhc3RPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHRoaXMuX3EucHVzaCh4KTtcblx0ICAgICAgdGhpcy5fcS5sZW5ndGggPiB0aGlzLl9jICYmIHRoaXMuX3Euc2hpZnQoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgVGFrZUxhc3RPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICB0aGlzLl9vLm9uRXJyb3IoZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFRha2VMYXN0T2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgd2hpbGUgKHRoaXMuX3EubGVuZ3RoID4gMCkgeyB0aGlzLl9vLm9uTmV4dCh0aGlzLl9xLnNoaWZ0KCkpOyB9XG5cdCAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFRha2VMYXN0T2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZXR1cm5zIGEgc3BlY2lmaWVkIG51bWJlciBvZiBjb250aWd1b3VzIGVsZW1lbnRzIGZyb20gdGhlIGVuZCBvZiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqIEBkZXNjcmlwdGlvblxuXHQgICAqICBUaGlzIG9wZXJhdG9yIGFjY3VtdWxhdGVzIGEgYnVmZmVyIHdpdGggYSBsZW5ndGggZW5vdWdoIHRvIHN0b3JlIGVsZW1lbnRzIGNvdW50IGVsZW1lbnRzLiBVcG9uIGNvbXBsZXRpb24gb2Zcblx0ICAgKiAgdGhlIHNvdXJjZSBzZXF1ZW5jZSwgdGhpcyBidWZmZXIgaXMgZHJhaW5lZCBvbiB0aGUgcmVzdWx0IHNlcXVlbmNlLiBUaGlzIGNhdXNlcyB0aGUgZWxlbWVudHMgdG8gYmUgZGVsYXllZC5cblx0ICAgKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UgZnJvbSB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8udGFrZUxhc3QgPSBmdW5jdGlvbiAoY291bnQpIHtcblx0ICAgIGlmIChjb3VudCA8IDApIHsgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yKCk7IH1cblx0ICAgIHZhciBzb3VyY2UgPSB0aGlzO1xuXHQgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBUYWtlTGFzdE9ic2VydmVyKG8sIGNvdW50KSk7XG5cdCAgICB9LCBzb3VyY2UpO1xuXHQgIH07XG5cdFxuXHRvYnNlcnZhYmxlUHJvdG8uZmxhdE1hcENvbmNhdCA9IG9ic2VydmFibGVQcm90by5jb25jYXRNYXAgPSBmdW5jdGlvbihzZWxlY3RvciwgcmVzdWx0U2VsZWN0b3IsIHRoaXNBcmcpIHtcblx0ICAgIHJldHVybiBuZXcgRmxhdE1hcE9ic2VydmFibGUodGhpcywgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKS5tZXJnZSgxKTtcblx0fTtcblx0ICB2YXIgTWFwT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhNYXBPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIE1hcE9ic2VydmFibGUoc291cmNlLCBzZWxlY3RvciwgdGhpc0FyZykge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5zZWxlY3RvciA9IGJpbmRDYWxsYmFjayhzZWxlY3RvciwgdGhpc0FyZywgMyk7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIGlubmVyTWFwKHNlbGVjdG9yLCBzZWxmKSB7XG5cdCAgICAgIHJldHVybiBmdW5jdGlvbiAoeCwgaSwgbykgeyByZXR1cm4gc2VsZWN0b3IuY2FsbCh0aGlzLCBzZWxmLnNlbGVjdG9yKHgsIGksIG8pLCBpLCBvKTsgfVxuXHQgICAgfVxuXHRcblx0ICAgIE1hcE9ic2VydmFibGUucHJvdG90eXBlLmludGVybmFsTWFwID0gZnVuY3Rpb24gKHNlbGVjdG9yLCB0aGlzQXJnKSB7XG5cdCAgICAgIHJldHVybiBuZXcgTWFwT2JzZXJ2YWJsZSh0aGlzLnNvdXJjZSwgaW5uZXJNYXAoc2VsZWN0b3IsIHRoaXMpLCB0aGlzQXJnKTtcblx0ICAgIH07XG5cdFxuXHQgICAgTWFwT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobywgdGhpcy5zZWxlY3RvciwgdGhpcykpO1xuXHQgICAgfTtcblx0XG5cdCAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcblx0ICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIobywgc2VsZWN0b3IsIHNvdXJjZSkge1xuXHQgICAgICB0aGlzLm8gPSBvO1xuXHQgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLmkgPSAwO1xuXHQgICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHgpIHtcblx0ICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMuc2VsZWN0b3IpKHgsIHRoaXMuaSsrLCB0aGlzLnNvdXJjZSk7XG5cdCAgICAgIGlmIChyZXN1bHQgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLm8ub25FcnJvcihyZXN1bHQuZSk7IH1cblx0ICAgICAgdGhpcy5vLm9uTmV4dChyZXN1bHQpO1xuXHQgICAgfTtcblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gTWFwT2JzZXJ2YWJsZTtcblx0XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICAvKipcblx0ICAqIFByb2plY3RzIGVhY2ggZWxlbWVudCBvZiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGludG8gYSBuZXcgZm9ybSBieSBpbmNvcnBvcmF0aW5nIHRoZSBlbGVtZW50J3MgaW5kZXguXG5cdCAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxlY3RvciBBIHRyYW5zZm9ybSBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIHNvdXJjZSBlbGVtZW50OyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgdGhlIHNvdXJjZSBlbGVtZW50LlxuXHQgICogQHBhcmFtIHtBbnl9IFt0aGlzQXJnXSBPYmplY3QgdG8gdXNlIGFzIHRoaXMgd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uIG9uIGVhY2ggZWxlbWVudCBvZiBzb3VyY2UuXG5cdCAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ubWFwID0gb2JzZXJ2YWJsZVByb3RvLnNlbGVjdCA9IGZ1bmN0aW9uIChzZWxlY3RvciwgdGhpc0FyZykge1xuXHQgICAgdmFyIHNlbGVjdG9yRm4gPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICdmdW5jdGlvbicgPyBzZWxlY3RvciA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlbGVjdG9yOyB9O1xuXHQgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBNYXBPYnNlcnZhYmxlID9cblx0ICAgICAgdGhpcy5pbnRlcm5hbE1hcChzZWxlY3RvckZuLCB0aGlzQXJnKSA6XG5cdCAgICAgIG5ldyBNYXBPYnNlcnZhYmxlKHRoaXMsIHNlbGVjdG9yRm4sIHRoaXNBcmcpO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIHBsdWNrZXIoYXJncywgbGVuKSB7XG5cdCAgICByZXR1cm4gZnVuY3Rpb24gbWFwcGVyKHgpIHtcblx0ICAgICAgdmFyIGN1cnJlbnRQcm9wID0geDtcblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgIHZhciBwID0gY3VycmVudFByb3BbYXJnc1tpXV07XG5cdCAgICAgICAgaWYgKHR5cGVvZiBwICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgICAgICAgY3VycmVudFByb3AgPSBwO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gY3VycmVudFByb3A7XG5cdCAgICB9XG5cdCAgfVxuXHRcblx0ICAvKipcblx0ICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIG5lc3RlZCBwcm9wZXJ0eSBmcm9tIGFsbCBlbGVtZW50cyBpblxuXHQgICAqIHRoZSBPYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqIEBwYXJhbSB7QXJndW1lbnRzfSBhcmd1bWVudHMgVGhlIG5lc3RlZCBwcm9wZXJ0aWVzIHRvIHBsdWNrLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBSZXR1cm5zIGEgbmV3IE9ic2VydmFibGUgc2VxdWVuY2Ugb2YgcHJvcGVydHkgdmFsdWVzLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5wbHVjayA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICBpZiAobGVuID09PSAwKSB7IHRocm93IG5ldyBFcnJvcignTGlzdCBvZiBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBlbXB0eS4nKTsgfVxuXHQgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIHJldHVybiB0aGlzLm1hcChwbHVja2VyKGFyZ3MsIGxlbikpO1xuXHQgIH07XG5cdFxuXHRvYnNlcnZhYmxlUHJvdG8uZmxhdE1hcCA9IG9ic2VydmFibGVQcm90by5zZWxlY3RNYW55ID0gZnVuY3Rpb24oc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKSB7XG5cdCAgICByZXR1cm4gbmV3IEZsYXRNYXBPYnNlcnZhYmxlKHRoaXMsIHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykubWVyZ2VBbGwoKTtcblx0fTtcblx0XG5cdFxuXHQvL1xuXHQvL1J4Lk9ic2VydmFibGUucHJvdG90eXBlLmZsYXRNYXBXaXRoTWF4Q29uY3VycmVudCA9IGZ1bmN0aW9uKGxpbWl0LCBzZWxlY3RvciwgcmVzdWx0U2VsZWN0b3IsIHRoaXNBcmcpIHtcblx0Ly8gICAgcmV0dXJuIG5ldyBGbGF0TWFwT2JzZXJ2YWJsZSh0aGlzLCBzZWxlY3RvciwgcmVzdWx0U2VsZWN0b3IsIHRoaXNBcmcpLm1lcmdlKGxpbWl0KTtcblx0Ly99O1xuXHQvL1xuXHRcblx0UnguT2JzZXJ2YWJsZS5wcm90b3R5cGUuZmxhdE1hcExhdGVzdCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykge1xuXHQgICAgcmV0dXJuIG5ldyBGbGF0TWFwT2JzZXJ2YWJsZSh0aGlzLCBzZWxlY3RvciwgcmVzdWx0U2VsZWN0b3IsIHRoaXNBcmcpLnN3aXRjaExhdGVzdCgpO1xuXHR9O1xuXHQgIHZhciBTa2lwT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFNraXBPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gU2tpcE9ic2VydmFibGUoc291cmNlLCBjb3VudCkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5za2lwQ291bnQgPSBjb3VudDtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdCAgICBcblx0ICAgIFNraXBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnNraXBDb3VudCkpO1xuXHQgICAgfTtcblx0ICAgIFxuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvLCBjKSB7XG5cdCAgICAgIHRoaXMuYyA9IGM7XG5cdCAgICAgIHRoaXMuciA9IGM7XG5cdCAgICAgIHRoaXMubyA9IG87XG5cdCAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG5cdCAgICAgIGlmICh0aGlzLnIgPD0gMCkgeyBcblx0ICAgICAgICB0aGlzLm8ub25OZXh0KHgpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuci0tO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uKGUpIHtcblx0ICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IHRoaXMuby5vbkVycm9yKGUpOyB9XG5cdCAgICB9O1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IHRoaXMuby5vbkNvbXBsZXRlZCgpOyB9XG5cdCAgICB9O1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24oZSkge1xuXHQgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH07XG5cdCAgICBcblx0ICAgIHJldHVybiBTa2lwT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7ICBcblx0ICBcblx0ICAvKipcblx0ICAgKiBCeXBhc3NlcyBhIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBhbmQgdGhlbiByZXR1cm5zIHRoZSByZW1haW5pbmcgZWxlbWVudHMuXG5cdCAgICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHRoZSByZW1haW5pbmcgZWxlbWVudHMuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgdGhhdCBvY2N1ciBhZnRlciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBpbnB1dCBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uc2tpcCA9IGZ1bmN0aW9uIChjb3VudCkge1xuXHQgICAgaWYgKGNvdW50IDwgMCkgeyB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IoKTsgfVxuXHQgICAgcmV0dXJuIG5ldyBTa2lwT2JzZXJ2YWJsZSh0aGlzLCBjb3VudCk7XG5cdCAgfTtcblx0ICB2YXIgU2tpcFdoaWxlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhTa2lwV2hpbGVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gU2tpcFdoaWxlT2JzZXJ2YWJsZShzb3VyY2UsIGZuKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLl9mbiA9IGZuO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBTa2lwV2hpbGVPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgU2tpcFdoaWxlT2JzZXJ2ZXIobywgdGhpcykpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU2tpcFdoaWxlT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBTa2lwV2hpbGVPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhTa2lwV2hpbGVPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0XG5cdCAgICBmdW5jdGlvbiBTa2lwV2hpbGVPYnNlcnZlcihvLCBwKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9wID0gcDtcblx0ICAgICAgdGhpcy5faSA9IDA7XG5cdCAgICAgIHRoaXMuX3IgPSBmYWxzZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgU2tpcFdoaWxlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICBpZiAoIXRoaXMuX3IpIHtcblx0ICAgICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2godGhpcy5fcC5fZm4pKHgsIHRoaXMuX2krKywgdGhpcy5fcCk7XG5cdCAgICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuX28ub25FcnJvcihyZXMuZSk7IH1cblx0ICAgICAgICB0aGlzLl9yID0gIXJlcztcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLl9yICYmIHRoaXMuX28ub25OZXh0KHgpO1xuXHQgICAgfTtcblx0ICAgIFNraXBXaGlsZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuX28ub25FcnJvcihlKTsgfTtcblx0ICAgIFNraXBXaGlsZU9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX28ub25Db21wbGV0ZWQoKTsgfTtcblx0XG5cdCAgICByZXR1cm4gU2tpcFdoaWxlT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqICBCeXBhc3NlcyBlbGVtZW50cyBpbiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGFzIGxvbmcgYXMgYSBzcGVjaWZpZWQgY29uZGl0aW9uIGlzIHRydWUgYW5kIHRoZW4gcmV0dXJucyB0aGUgcmVtYWluaW5nIGVsZW1lbnRzLlxuXHQgICAqICBUaGUgZWxlbWVudCdzIGluZGV4IGlzIHVzZWQgaW4gdGhlIGxvZ2ljIG9mIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24uXG5cdCAgICpcblx0ICAgKiAgdmFyIHJlcyA9IHNvdXJjZS5za2lwV2hpbGUoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZSA8IDEwOyB9KTtcblx0ICAgKiAgdmFyIHJlcyA9IHNvdXJjZS5za2lwV2hpbGUoZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkgeyByZXR1cm4gdmFsdWUgPCAxMCB8fCBpbmRleCA8IDEwOyB9KTtcblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgQSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudCBmb3IgYSBjb25kaXRpb247IHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiByZXByZXNlbnRzIHRoZSBpbmRleCBvZiB0aGUgc291cmNlIGVsZW1lbnQuXG5cdCAgICogQHBhcmFtIHtBbnl9IFt0aGlzQXJnXSBPYmplY3QgdG8gdXNlIGFzIHRoaXMgd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgZnJvbSB0aGUgaW5wdXQgc2VxdWVuY2Ugc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGxpbmVhciBzZXJpZXMgdGhhdCBkb2VzIG5vdCBwYXNzIHRoZSB0ZXN0IHNwZWNpZmllZCBieSBwcmVkaWNhdGUuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnNraXBXaGlsZSA9IGZ1bmN0aW9uIChwcmVkaWNhdGUsIHRoaXNBcmcpIHtcblx0ICAgIHZhciBmbiA9IGJpbmRDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpO1xuXHQgICAgcmV0dXJuIG5ldyBTa2lwV2hpbGVPYnNlcnZhYmxlKHRoaXMsIGZuKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgVGFrZU9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhUYWtlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIFxuXHQgICAgZnVuY3Rpb24gVGFrZU9ic2VydmFibGUoc291cmNlLCBjb3VudCkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy50YWtlQ291bnQgPSBjb3VudDtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdCAgICBcblx0ICAgIFRha2VPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnRha2VDb3VudCkpO1xuXHQgICAgfTtcblx0ICAgIFxuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvLCBjKSB7XG5cdCAgICAgIHRoaXMubyA9IG87XG5cdCAgICAgIHRoaXMuYyA9IGM7XG5cdCAgICAgIHRoaXMuciA9IGM7XG5cdCAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZSA9IHtcblx0ICAgICAgb25OZXh0OiBmdW5jdGlvbiAoeCkge1xuXHQgICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cblx0ICAgICAgICBpZiAodGhpcy5yLS0gPiAwKSB7XG5cdCAgICAgICAgICB0aGlzLm8ub25OZXh0KHgpO1xuXHQgICAgICAgICAgdGhpcy5yIDw9IDAgJiYgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdGhpcy5vLm9uRXJyb3IoZXJyKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIG9uQ29tcGxldGVkOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfSxcblx0ICAgICAgZmFpbDogZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLm8ub25FcnJvcihlKTtcblx0ICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICBcblx0ICAgIHJldHVybiBUYWtlT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7ICBcblx0ICBcblx0ICAvKipcblx0ICAgKiAgUmV0dXJucyBhIHNwZWNpZmllZCBudW1iZXIgb2YgY29udGlndW91cyBlbGVtZW50cyBmcm9tIHRoZSBzdGFydCBvZiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLCB1c2luZyB0aGUgc3BlY2lmaWVkIHNjaGVkdWxlciBmb3IgdGhlIGVkZ2UgY2FzZSBvZiB0YWtlKDApLlxuXHQgICAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHVybi5cblx0ICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gU2NoZWR1bGVyIHVzZWQgdG8gcHJvZHVjZSBhbiBPbkNvbXBsZXRlZCBtZXNzYWdlIGluIGNhc2UgPHBhcmFtcmVmIG5hbWU9XCJjb3VudCBjb3VudDwvcGFyYW1yZWY+IGlzIHNldCB0byAwLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IHNlcXVlbmNlLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by50YWtlID0gZnVuY3Rpb24gKGNvdW50LCBzY2hlZHVsZXIpIHtcblx0ICAgIGlmIChjb3VudCA8IDApIHsgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yKCk7IH1cblx0ICAgIGlmIChjb3VudCA9PT0gMCkgeyByZXR1cm4gb2JzZXJ2YWJsZUVtcHR5KHNjaGVkdWxlcik7IH1cblx0ICAgIHJldHVybiBuZXcgVGFrZU9ic2VydmFibGUodGhpcywgY291bnQpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBUYWtlV2hpbGVPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFRha2VXaGlsZU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBUYWtlV2hpbGVPYnNlcnZhYmxlKHNvdXJjZSwgZm4pIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuX2ZuID0gZm47XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFRha2VXaGlsZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBUYWtlV2hpbGVPYnNlcnZlcihvLCB0aGlzKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBUYWtlV2hpbGVPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIFRha2VXaGlsZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFRha2VXaGlsZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIFRha2VXaGlsZU9ic2VydmVyKG8sIHApIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX3AgPSBwO1xuXHQgICAgICB0aGlzLl9pID0gMDtcblx0ICAgICAgdGhpcy5fciA9IHRydWU7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFRha2VXaGlsZU9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgaWYgKHRoaXMuX3IpIHtcblx0ICAgICAgICB0aGlzLl9yID0gdHJ5Q2F0Y2godGhpcy5fcC5fZm4pKHgsIHRoaXMuX2krKywgdGhpcy5fcCk7XG5cdCAgICAgICAgaWYgKHRoaXMuX3IgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLl9vLm9uRXJyb3IodGhpcy5fci5lKTsgfVxuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9yKSB7XG5cdCAgICAgICAgdGhpcy5fby5vbk5leHQoeCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgICAgVGFrZVdoaWxlT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHsgdGhpcy5fby5vbkVycm9yKGUpOyB9O1xuXHQgICAgVGFrZVdoaWxlT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuXHRcblx0ICAgIHJldHVybiBUYWtlV2hpbGVPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJldHVybnMgZWxlbWVudHMgZnJvbSBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGFzIGxvbmcgYXMgYSBzcGVjaWZpZWQgY29uZGl0aW9uIGlzIHRydWUuXG5cdCAgICogIFRoZSBlbGVtZW50J3MgaW5kZXggaXMgdXNlZCBpbiB0aGUgbG9naWMgb2YgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgQSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudCBmb3IgYSBjb25kaXRpb247IHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiByZXByZXNlbnRzIHRoZSBpbmRleCBvZiB0aGUgc291cmNlIGVsZW1lbnQuXG5cdCAgICogQHBhcmFtIHtBbnl9IFt0aGlzQXJnXSBPYmplY3QgdG8gdXNlIGFzIHRoaXMgd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgZnJvbSB0aGUgaW5wdXQgc2VxdWVuY2UgdGhhdCBvY2N1ciBiZWZvcmUgdGhlIGVsZW1lbnQgYXQgd2hpY2ggdGhlIHRlc3Qgbm8gbG9uZ2VyIHBhc3Nlcy5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8udGFrZVdoaWxlID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgdGhpc0FyZykge1xuXHQgICAgdmFyIGZuID0gYmluZENhbGxiYWNrKHByZWRpY2F0ZSwgdGhpc0FyZywgMyk7XG5cdCAgICByZXR1cm4gbmV3IFRha2VXaGlsZU9ic2VydmFibGUodGhpcywgZm4pO1xuXHQgIH07XG5cdFxuXHQgIHZhciBGaWx0ZXJPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKEZpbHRlck9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gRmlsdGVyT2JzZXJ2YWJsZShzb3VyY2UsIHByZWRpY2F0ZSwgdGhpc0FyZykge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5wcmVkaWNhdGUgPSBiaW5kQ2FsbGJhY2socHJlZGljYXRlLCB0aGlzQXJnLCAzKTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgRmlsdGVyT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobywgdGhpcy5wcmVkaWNhdGUsIHRoaXMpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgZnVuY3Rpb24gaW5uZXJQcmVkaWNhdGUocHJlZGljYXRlLCBzZWxmKSB7XG5cdCAgICAgIHJldHVybiBmdW5jdGlvbih4LCBpLCBvKSB7IHJldHVybiBzZWxmLnByZWRpY2F0ZSh4LCBpLCBvKSAmJiBwcmVkaWNhdGUuY2FsbCh0aGlzLCB4LCBpLCBvKTsgfVxuXHQgICAgfVxuXHRcblx0ICAgIEZpbHRlck9ic2VydmFibGUucHJvdG90eXBlLmludGVybmFsRmlsdGVyID0gZnVuY3Rpb24ocHJlZGljYXRlLCB0aGlzQXJnKSB7XG5cdCAgICAgIHJldHVybiBuZXcgRmlsdGVyT2JzZXJ2YWJsZSh0aGlzLnNvdXJjZSwgaW5uZXJQcmVkaWNhdGUocHJlZGljYXRlLCB0aGlzKSwgdGhpc0FyZyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGluaGVyaXRzKElubmVyT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvLCBwcmVkaWNhdGUsIHNvdXJjZSkge1xuXHQgICAgICB0aGlzLm8gPSBvO1xuXHQgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuaSA9IDA7XG5cdCAgICAgIEFic3RyYWN0T2JzZXJ2ZXIuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oeCkge1xuXHQgICAgICB2YXIgc2hvdWxkWWllbGQgPSB0cnlDYXRjaCh0aGlzLnByZWRpY2F0ZSkoeCwgdGhpcy5pKyssIHRoaXMuc291cmNlKTtcblx0ICAgICAgaWYgKHNob3VsZFlpZWxkID09PSBlcnJvck9iaikge1xuXHQgICAgICAgIHJldHVybiB0aGlzLm8ub25FcnJvcihzaG91bGRZaWVsZC5lKTtcblx0ICAgICAgfVxuXHQgICAgICBzaG91bGRZaWVsZCAmJiB0aGlzLm8ub25OZXh0KHgpO1xuXHQgICAgfTtcblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gRmlsdGVyT2JzZXJ2YWJsZTtcblx0XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICAvKipcblx0ICAqICBGaWx0ZXJzIHRoZSBlbGVtZW50cyBvZiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGJhc2VkIG9uIGEgcHJlZGljYXRlIGJ5IGluY29ycG9yYXRpbmcgdGhlIGVsZW1lbnQncyBpbmRleC5cblx0ICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBBIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBzb3VyY2UgZWxlbWVudCBmb3IgYSBjb25kaXRpb247IHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiByZXByZXNlbnRzIHRoZSBpbmRleCBvZiB0aGUgc291cmNlIGVsZW1lbnQuXG5cdCAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgZWxlbWVudHMgZnJvbSB0aGUgaW5wdXQgc2VxdWVuY2UgdGhhdCBzYXRpc2Z5IHRoZSBjb25kaXRpb24uXG5cdCAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uZmlsdGVyID0gb2JzZXJ2YWJsZVByb3RvLndoZXJlID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgdGhpc0FyZykge1xuXHQgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBGaWx0ZXJPYnNlcnZhYmxlID8gdGhpcy5pbnRlcm5hbEZpbHRlcihwcmVkaWNhdGUsIHRoaXNBcmcpIDpcblx0ICAgICAgbmV3IEZpbHRlck9ic2VydmFibGUodGhpcywgcHJlZGljYXRlLCB0aGlzQXJnKTtcblx0ICB9O1xuXHRcblx0ZnVuY3Rpb24gY3JlYXRlQ2JPYnNlcnZhYmxlKGZuLCBjdHgsIHNlbGVjdG9yLCBhcmdzKSB7XG5cdCAgdmFyIG8gPSBuZXcgQXN5bmNTdWJqZWN0KCk7XG5cdFxuXHQgIGFyZ3MucHVzaChjcmVhdGVDYkhhbmRsZXIobywgY3R4LCBzZWxlY3RvcikpO1xuXHQgIGZuLmFwcGx5KGN0eCwgYXJncyk7XG5cdFxuXHQgIHJldHVybiBvLmFzT2JzZXJ2YWJsZSgpO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBjcmVhdGVDYkhhbmRsZXIobywgY3R4LCBzZWxlY3Rvcikge1xuXHQgIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyICgpIHtcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN1bHRzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgcmVzdWx0c1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHRcblx0ICAgIGlmIChpc0Z1bmN0aW9uKHNlbGVjdG9yKSkge1xuXHQgICAgICByZXN1bHRzID0gdHJ5Q2F0Y2goc2VsZWN0b3IpLmFwcGx5KGN0eCwgcmVzdWx0cyk7XG5cdCAgICAgIGlmIChyZXN1bHRzID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdHMuZSk7IH1cblx0ICAgICAgby5vbk5leHQocmVzdWx0cyk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPD0gMSkge1xuXHQgICAgICAgIG8ub25OZXh0KHJlc3VsdHNbMF0pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIG8ub25OZXh0KHJlc3VsdHMpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdFxuXHQgICAgby5vbkNvbXBsZXRlZCgpO1xuXHQgIH07XG5cdH1cblx0XG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHdpdGggYSBjYWxsYmFjayBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIgdG8gY29udmVydCB0byBhbiBPYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgKiBAcGFyYW0ge01peGVkfSBbY3R4XSBUaGUgY29udGV4dCBmb3IgdGhlIGZ1bmMgcGFyYW1ldGVyIHRvIGJlIGV4ZWN1dGVkLiAgSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdW5kZWZpbmVkLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIEEgc2VsZWN0b3Igd2hpY2ggdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsYmFjayB0byBwcm9kdWNlIGEgc2luZ2xlIGl0ZW0gdG8geWllbGQgb24gbmV4dC5cblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGV4ZWN1dGVkIHdpdGggdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgbWludXMgdGhlIGNhbGxiYWNrLCBwcm9kdWNlcyBhbiBPYnNlcnZhYmxlIHNlcXVlbmNlIHdpdGggYSBzaW5nbGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUgY2FsbGJhY2sgYXMgYW4gYXJyYXkuXG5cdCAqL1xuXHRPYnNlcnZhYmxlLmZyb21DYWxsYmFjayA9IGZ1bmN0aW9uIChmbiwgY3R4LCBzZWxlY3Rvcikge1xuXHQgIHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdCAgICB0eXBlb2YgY3R4ID09PSAndW5kZWZpbmVkJyAmJiAoY3R4ID0gdGhpcyk7IFxuXHRcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbilcblx0ICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgICByZXR1cm4gY3JlYXRlQ2JPYnNlcnZhYmxlKGZuLCBjdHgsIHNlbGVjdG9yLCBhcmdzKTtcblx0ICB9O1xuXHR9O1xuXHRcblx0ZnVuY3Rpb24gY3JlYXRlTm9kZU9ic2VydmFibGUoZm4sIGN0eCwgc2VsZWN0b3IsIGFyZ3MpIHtcblx0ICB2YXIgbyA9IG5ldyBBc3luY1N1YmplY3QoKTtcblx0XG5cdCAgYXJncy5wdXNoKGNyZWF0ZU5vZGVIYW5kbGVyKG8sIGN0eCwgc2VsZWN0b3IpKTtcblx0ICBmbi5hcHBseShjdHgsIGFyZ3MpO1xuXHRcblx0ICByZXR1cm4gby5hc09ic2VydmFibGUoKTtcblx0fVxuXHRcblx0ZnVuY3Rpb24gY3JlYXRlTm9kZUhhbmRsZXIobywgY3R4LCBzZWxlY3Rvcikge1xuXHQgIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyICgpIHtcblx0ICAgIHZhciBlcnIgPSBhcmd1bWVudHNbMF07XG5cdCAgICBpZiAoZXJyKSB7IHJldHVybiBvLm9uRXJyb3IoZXJyKTsgfVxuXHRcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN1bHRzID0gW107XG5cdCAgICBmb3IodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIHsgcmVzdWx0c1tpIC0gMV0gPSBhcmd1bWVudHNbaV07IH1cblx0XG5cdCAgICBpZiAoaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcblx0ICAgICAgdmFyIHJlc3VsdHMgPSB0cnlDYXRjaChzZWxlY3RvcikuYXBwbHkoY3R4LCByZXN1bHRzKTtcblx0ICAgICAgaWYgKHJlc3VsdHMgPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IocmVzdWx0cy5lKTsgfVxuXHQgICAgICBvLm9uTmV4dChyZXN1bHRzKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8PSAxKSB7XG5cdCAgICAgICAgby5vbk5leHQocmVzdWx0c1swXSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgby5vbk5leHQocmVzdWx0cyk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0XG5cdCAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgfTtcblx0fVxuXHRcblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgTm9kZS5qcyBjYWxsYmFjayBzdHlsZSBmdW5jdGlvbiB0byBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLiAgVGhpcyBtdXN0IGJlIGluIGZ1bmN0aW9uIChlcnIsIC4uLikgZm9ybWF0LlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbFxuXHQgKiBAcGFyYW0ge01peGVkfSBbY3R4XSBUaGUgY29udGV4dCBmb3IgdGhlIGZ1bmMgcGFyYW1ldGVyIHRvIGJlIGV4ZWN1dGVkLiAgSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdW5kZWZpbmVkLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIEEgc2VsZWN0b3Igd2hpY2ggdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsYmFjayBtaW51cyB0aGUgZXJyb3IgdG8gcHJvZHVjZSBhIHNpbmdsZSBpdGVtIHRvIHlpZWxkIG9uIG5leHQuXG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQW4gYXN5bmMgZnVuY3Rpb24gd2hpY2ggd2hlbiBhcHBsaWVkLCByZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCB0aGUgY2FsbGJhY2sgYXJndW1lbnRzIGFzIGFuIGFycmF5LlxuXHQgKi9cblx0T2JzZXJ2YWJsZS5mcm9tTm9kZUNhbGxiYWNrID0gZnVuY3Rpb24gKGZuLCBjdHgsIHNlbGVjdG9yKSB7XG5cdCAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgIHR5cGVvZiBjdHggPT09ICd1bmRlZmluZWQnICYmIChjdHggPSB0aGlzKTsgXG5cdCAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuXHQgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIHJldHVybiBjcmVhdGVOb2RlT2JzZXJ2YWJsZShmbiwgY3R4LCBzZWxlY3RvciwgYXJncyk7XG5cdCAgfTtcblx0fTtcblx0XG5cdCAgZnVuY3Rpb24gaXNOb2RlTGlzdChlbCkge1xuXHQgICAgaWYgKHJvb3QuU3RhdGljTm9kZUxpc3QpIHtcblx0ICAgICAgLy8gSUU4IFNwZWNpZmljXG5cdCAgICAgIC8vIGluc3RhbmNlb2YgaXMgc2xvd2VyIHRoYW4gT2JqZWN0I3RvU3RyaW5nLCBidXQgT2JqZWN0I3RvU3RyaW5nIHdpbGwgbm90IHdvcmsgYXMgaW50ZW5kZWQgaW4gSUU4XG5cdCAgICAgIHJldHVybiBlbCBpbnN0YW5jZW9mIHJvb3QuU3RhdGljTm9kZUxpc3QgfHwgZWwgaW5zdGFuY2VvZiByb290Lk5vZGVMaXN0O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbCkgPT09ICdbb2JqZWN0IE5vZGVMaXN0XSc7XG5cdCAgICB9XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiBMaXN0ZW5EaXNwb3NhYmxlKGUsIG4sIGZuKSB7XG5cdCAgICB0aGlzLl9lID0gZTtcblx0ICAgIHRoaXMuX24gPSBuO1xuXHQgICAgdGhpcy5fZm4gPSBmbjtcblx0ICAgIHRoaXMuX2UuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl9uLCB0aGlzLl9mbiwgZmFsc2UpO1xuXHQgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgfVxuXHQgIExpc3RlbkRpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICB0aGlzLl9lLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fbiwgdGhpcy5fZm4sIGZhbHNlKTtcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBjcmVhdGVFdmVudExpc3RlbmVyIChlbCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG5cdCAgICB2YXIgZGlzcG9zYWJsZXMgPSBuZXcgQ29tcG9zaXRlRGlzcG9zYWJsZSgpO1xuXHRcblx0ICAgIC8vIEFzdW1lIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uXG5cdCAgICB2YXIgZWxlbVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVsKTtcblx0ICAgIGlmIChpc05vZGVMaXN0KGVsKSB8fCBlbGVtVG9TdHJpbmcgPT09ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXScpIHtcblx0ICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgZGlzcG9zYWJsZXMuYWRkKGNyZWF0ZUV2ZW50TGlzdGVuZXIoZWwuaXRlbShpKSwgZXZlbnROYW1lLCBoYW5kbGVyKSk7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAoZWwpIHtcblx0ICAgICAgZGlzcG9zYWJsZXMuYWRkKG5ldyBMaXN0ZW5EaXNwb3NhYmxlKGVsLCBldmVudE5hbWUsIGhhbmRsZXIpKTtcblx0ICAgIH1cblx0XG5cdCAgICByZXR1cm4gZGlzcG9zYWJsZXM7XG5cdCAgfVxuXHRcblx0ICAvKipcblx0ICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciB0byB1c2UgbmF0aXZlIGV2ZW50cyBvbmx5XG5cdCAgICovXG5cdCAgUnguY29uZmlnLnVzZU5hdGl2ZUV2ZW50cyA9IGZhbHNlO1xuXHRcblx0ICB2YXIgRXZlbnRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRXZlbnRPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gRXZlbnRPYnNlcnZhYmxlKGVsLCBuYW1lLCBmbikge1xuXHQgICAgICB0aGlzLl9lbCA9IGVsO1xuXHQgICAgICB0aGlzLl9uID0gbmFtZTtcblx0ICAgICAgdGhpcy5fZm4gPSBmbjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihvLCBmbikge1xuXHQgICAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlciAoKSB7XG5cdCAgICAgICAgdmFyIHJlc3VsdHMgPSBhcmd1bWVudHNbMF07XG5cdCAgICAgICAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG5cdCAgICAgICAgICByZXN1bHRzID0gdHJ5Q2F0Y2goZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICBpZiAocmVzdWx0cyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihyZXN1bHRzLmUpOyB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIG8ub25OZXh0KHJlc3VsdHMpO1xuXHQgICAgICB9O1xuXHQgICAgfVxuXHRcblx0ICAgIEV2ZW50T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiBjcmVhdGVFdmVudExpc3RlbmVyKFxuXHQgICAgICAgIHRoaXMuX2VsLFxuXHQgICAgICAgIHRoaXMuX24sXG5cdCAgICAgICAgY3JlYXRlSGFuZGxlcihvLCB0aGlzLl9mbikpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gRXZlbnRPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGJ5IGFkZGluZyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgbWF0Y2hpbmcgRE9NRWxlbWVudCBvciBlYWNoIGl0ZW0gaW4gdGhlIE5vZGVMaXN0LlxuXHQgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IFRoZSBET01FbGVtZW50IG9yIE5vZGVMaXN0IHRvIGF0dGFjaCBhIGxpc3RlbmVyLlxuXHQgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gYXR0YWNoIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtzZWxlY3Rvcl0gQSBzZWxlY3RvciB3aGljaCB0YWtlcyB0aGUgYXJndW1lbnRzIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIgdG8gcHJvZHVjZSBhIHNpbmdsZSBpdGVtIHRvIHlpZWxkIG9uIG5leHQuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2Ugb2YgZXZlbnRzIGZyb20gdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuXHQgICAqL1xuXHQgIE9ic2VydmFibGUuZnJvbUV2ZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50TmFtZSwgc2VsZWN0b3IpIHtcblx0ICAgIC8vIE5vZGUuanMgc3BlY2lmaWNcblx0ICAgIGlmIChlbGVtZW50LmFkZExpc3RlbmVyKSB7XG5cdCAgICAgIHJldHVybiBmcm9tRXZlbnRQYXR0ZXJuKFxuXHQgICAgICAgIGZ1bmN0aW9uIChoKSB7IGVsZW1lbnQuYWRkTGlzdGVuZXIoZXZlbnROYW1lLCBoKTsgfSxcblx0ICAgICAgICBmdW5jdGlvbiAoaCkgeyBlbGVtZW50LnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgaCk7IH0sXG5cdCAgICAgICAgc2VsZWN0b3IpO1xuXHQgICAgfVxuXHRcblx0ICAgIC8vIFVzZSBvbmx5IGlmIG5vbi1uYXRpdmUgZXZlbnRzIGFyZSBhbGxvd2VkXG5cdCAgICBpZiAoIVJ4LmNvbmZpZy51c2VOYXRpdmVFdmVudHMpIHtcblx0ICAgICAgLy8gSGFuZGxlcyBqcSwgQW5ndWxhci5qcywgWmVwdG8sIE1hcmlvbmV0dGUsIEVtYmVyLmpzXG5cdCAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5vbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZWxlbWVudC5vZmYgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICByZXR1cm4gZnJvbUV2ZW50UGF0dGVybihcblx0ICAgICAgICAgIGZ1bmN0aW9uIChoKSB7IGVsZW1lbnQub24oZXZlbnROYW1lLCBoKTsgfSxcblx0ICAgICAgICAgIGZ1bmN0aW9uIChoKSB7IGVsZW1lbnQub2ZmKGV2ZW50TmFtZSwgaCk7IH0sXG5cdCAgICAgICAgICBzZWxlY3Rvcik7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0XG5cdCAgICByZXR1cm4gbmV3IEV2ZW50T2JzZXJ2YWJsZShlbGVtZW50LCBldmVudE5hbWUsIHNlbGVjdG9yKS5wdWJsaXNoKCkucmVmQ291bnQoKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKEV2ZW50UGF0dGVybk9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBFdmVudFBhdHRlcm5PYnNlcnZhYmxlKGFkZCwgZGVsLCBmbikge1xuXHQgICAgICB0aGlzLl9hZGQgPSBhZGQ7XG5cdCAgICAgIHRoaXMuX2RlbCA9IGRlbDtcblx0ICAgICAgdGhpcy5fZm4gPSBmbjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihvLCBmbikge1xuXHQgICAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlciAoKSB7XG5cdCAgICAgICAgdmFyIHJlc3VsdHMgPSBhcmd1bWVudHNbMF07XG5cdCAgICAgICAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG5cdCAgICAgICAgICByZXN1bHRzID0gdHJ5Q2F0Y2goZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICBpZiAocmVzdWx0cyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihyZXN1bHRzLmUpOyB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIG8ub25OZXh0KHJlc3VsdHMpO1xuXHQgICAgICB9O1xuXHQgICAgfVxuXHRcblx0ICAgIEV2ZW50UGF0dGVybk9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgZm4gPSBjcmVhdGVIYW5kbGVyKG8sIHRoaXMuX2ZuKTtcblx0ICAgICAgdmFyIHJldHVyblZhbHVlID0gdGhpcy5fYWRkKGZuKTtcblx0ICAgICAgcmV0dXJuIG5ldyBFdmVudFBhdHRlcm5EaXNwb3NhYmxlKHRoaXMuX2RlbCwgZm4sIHJldHVyblZhbHVlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgZnVuY3Rpb24gRXZlbnRQYXR0ZXJuRGlzcG9zYWJsZShkZWwsIGZuLCByZXQpIHtcblx0ICAgICAgdGhpcy5fZGVsID0gZGVsO1xuXHQgICAgICB0aGlzLl9mbiA9IGZuO1xuXHQgICAgICB0aGlzLl9yZXQgPSByZXQ7XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgfVxuXHRcblx0ICAgIEV2ZW50UGF0dGVybkRpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGlmKCF0aGlzLmlzRGlzcG9zZWQpIHtcblx0ICAgICAgICBpc0Z1bmN0aW9uKHRoaXMuX2RlbCkgJiYgdGhpcy5fZGVsKHRoaXMuX2ZuLCB0aGlzLl9yZXQpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBFdmVudFBhdHRlcm5PYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGZyb20gYW4gZXZlbnQgZW1pdHRlciB2aWEgYW4gYWRkSGFuZGxlci9yZW1vdmVIYW5kbGVyIHBhaXIuXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWRkSGFuZGxlciBUaGUgZnVuY3Rpb24gdG8gYWRkIGEgaGFuZGxlciB0byB0aGUgZW1pdHRlci5cblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVtb3ZlSGFuZGxlcl0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIGhhbmRsZXIgZnJvbSBhbiBlbWl0dGVyLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtzZWxlY3Rvcl0gQSBzZWxlY3RvciB3aGljaCB0YWtlcyB0aGUgYXJndW1lbnRzIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIgdG8gcHJvZHVjZSBhIHNpbmdsZSBpdGVtIHRvIHlpZWxkIG9uIG5leHQuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hpY2ggd3JhcHMgYW4gZXZlbnQgZnJvbSBhbiBldmVudCBlbWl0dGVyXG5cdCAgICovXG5cdCAgdmFyIGZyb21FdmVudFBhdHRlcm4gPSBPYnNlcnZhYmxlLmZyb21FdmVudFBhdHRlcm4gPSBmdW5jdGlvbiAoYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlciwgc2VsZWN0b3IpIHtcblx0ICAgIHJldHVybiBuZXcgRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZShhZGRIYW5kbGVyLCByZW1vdmVIYW5kbGVyLCBzZWxlY3RvcikucHVibGlzaCgpLnJlZkNvdW50KCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIEZyb21Qcm9taXNlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKEZyb21Qcm9taXNlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIEZyb21Qcm9taXNlT2JzZXJ2YWJsZShwLCBzKSB7XG5cdCAgICAgIHRoaXMuX3AgPSBwO1xuXHQgICAgICB0aGlzLl9zID0gcztcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gc2NoZWR1bGVOZXh0KHMsIHN0YXRlKSB7XG5cdCAgICAgIHZhciBvID0gc3RhdGVbMF0sIGRhdGEgPSBzdGF0ZVsxXTtcblx0ICAgICAgby5vbk5leHQoZGF0YSk7XG5cdCAgICAgIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBzY2hlZHVsZUVycm9yKHMsIHN0YXRlKSB7XG5cdCAgICAgIHZhciBvID0gc3RhdGVbMF0sIGVyciA9IHN0YXRlWzFdO1xuXHQgICAgICBvLm9uRXJyb3IoZXJyKTtcblx0ICAgIH1cblx0XG5cdCAgICBGcm9tUHJvbWlzZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG5cdCAgICAgIHZhciBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKSwgc2VsZiA9IHRoaXM7XG5cdFxuXHQgICAgICB0aGlzLl9wXG5cdCAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHNlbGYuX3Muc2NoZWR1bGUoW28sIGRhdGFdLCBzY2hlZHVsZU5leHQpKTtcblx0ICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgICAgICBzYWQuc2V0RGlzcG9zYWJsZShzZWxmLl9zLnNjaGVkdWxlKFtvLCBlcnJdLCBzY2hlZHVsZUVycm9yKSk7XG5cdCAgICAgICAgfSk7XG5cdFxuXHQgICAgICByZXR1cm4gc2FkO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gRnJvbVByb21pc2VPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgKiBDb252ZXJ0cyBhIFByb21pc2UgdG8gYW4gT2JzZXJ2YWJsZSBzZXF1ZW5jZVxuXHQgICogQHBhcmFtIHtQcm9taXNlfSBBbiBFUzYgQ29tcGxpYW50IHByb21pc2UuXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aGljaCB3cmFwcyB0aGUgZXhpc3RpbmcgcHJvbWlzZSBzdWNjZXNzIGFuZCBmYWlsdXJlLlxuXHQgICovXG5cdCAgdmFyIG9ic2VydmFibGVGcm9tUHJvbWlzZSA9IE9ic2VydmFibGUuZnJvbVByb21pc2UgPSBmdW5jdGlvbiAocHJvbWlzZSwgc2NoZWR1bGVyKSB7XG5cdCAgICBzY2hlZHVsZXIgfHwgKHNjaGVkdWxlciA9IGRlZmF1bHRTY2hlZHVsZXIpO1xuXHQgICAgcmV0dXJuIG5ldyBGcm9tUHJvbWlzZU9ic2VydmFibGUocHJvbWlzZSwgc2NoZWR1bGVyKTtcblx0ICB9O1xuXHRcblx0ICAvKlxuXHQgICAqIENvbnZlcnRzIGFuIGV4aXN0aW5nIG9ic2VydmFibGUgc2VxdWVuY2UgdG8gYW4gRVM2IENvbXBhdGlibGUgUHJvbWlzZVxuXHQgICAqIEBleGFtcGxlXG5cdCAgICogdmFyIHByb21pc2UgPSBSeC5PYnNlcnZhYmxlLnJldHVybig0MikudG9Qcm9taXNlKFJTVlAuUHJvbWlzZSk7XG5cdCAgICpcblx0ICAgKiAvLyBXaXRoIGNvbmZpZ1xuXHQgICAqIFJ4LmNvbmZpZy5Qcm9taXNlID0gUlNWUC5Qcm9taXNlO1xuXHQgICAqIHZhciBwcm9taXNlID0gUnguT2JzZXJ2YWJsZS5yZXR1cm4oNDIpLnRvUHJvbWlzZSgpO1xuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9taXNlQ3Rvcl0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBwcm9taXNlLiBJZiBub3QgcHJvdmlkZWQsIGl0IGxvb2tzIGZvciBpdCBpbiBSeC5jb25maWcuUHJvbWlzZS5cblx0ICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQW4gRVM2IGNvbXBhdGlibGUgcHJvbWlzZSB3aXRoIHRoZSBsYXN0IHZhbHVlIGZyb20gdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnRvUHJvbWlzZSA9IGZ1bmN0aW9uIChwcm9taXNlQ3Rvcikge1xuXHQgICAgcHJvbWlzZUN0b3IgfHwgKHByb21pc2VDdG9yID0gUnguY29uZmlnLlByb21pc2UpO1xuXHQgICAgaWYgKCFwcm9taXNlQ3RvcikgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoJ1Byb21pc2UgdHlwZSBub3QgcHJvdmlkZWQgbm9yIGluIFJ4LmNvbmZpZy5Qcm9taXNlJyk7IH1cblx0ICAgIHZhciBzb3VyY2UgPSB0aGlzO1xuXHQgICAgcmV0dXJuIG5ldyBwcm9taXNlQ3RvcihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdCAgICAgIC8vIE5vIGNhbmNlbGxhdGlvbiBjYW4gYmUgZG9uZVxuXHQgICAgICB2YXIgdmFsdWU7XG5cdCAgICAgIHNvdXJjZS5zdWJzY3JpYmUoZnVuY3Rpb24gKHYpIHtcblx0ICAgICAgICB2YWx1ZSA9IHY7XG5cdCAgICAgIH0sIHJlamVjdCwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJlc29sdmUodmFsdWUpO1xuXHQgICAgICB9KTtcblx0ICAgIH0pO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIEludm9rZXMgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiwgc3VyZmFjaW5nIHRoZSByZXN1bHQgdGhyb3VnaCBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uQXN5bmMgQXN5bmNocm9ub3VzIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBQcm9taXNlIHRvIHJ1bi5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBleHBvc2luZyB0aGUgZnVuY3Rpb24ncyByZXN1bHQgdmFsdWUsIG9yIGFuIGV4Y2VwdGlvbi5cblx0ICAgKi9cblx0ICBPYnNlcnZhYmxlLnN0YXJ0QXN5bmMgPSBmdW5jdGlvbiAoZnVuY3Rpb25Bc3luYykge1xuXHQgICAgdmFyIHByb21pc2UgPSB0cnlDYXRjaChmdW5jdGlvbkFzeW5jKSgpO1xuXHQgICAgaWYgKHByb21pc2UgPT09IGVycm9yT2JqKSB7IHJldHVybiBvYnNlcnZhYmxlVGhyb3cocHJvbWlzZS5lKTsgfVxuXHQgICAgcmV0dXJuIG9ic2VydmFibGVGcm9tUHJvbWlzZShwcm9taXNlKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgTXVsdGljYXN0T2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhNdWx0aWNhc3RPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gTXVsdGljYXN0T2JzZXJ2YWJsZShzb3VyY2UsIGZuMSwgZm4yKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLl9mbjEgPSBmbjE7XG5cdCAgICAgIHRoaXMuX2ZuMiA9IGZuMjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgTXVsdGljYXN0T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBjb25uZWN0YWJsZSA9IHRoaXMuc291cmNlLm11bHRpY2FzdCh0aGlzLl9mbjEoKSk7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZSh0aGlzLl9mbjIoY29ubmVjdGFibGUpLnN1YnNjcmliZShvKSwgY29ubmVjdGFibGUuY29ubmVjdCgpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIE11bHRpY2FzdE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICAvKipcblx0ICAgKiBNdWx0aWNhc3RzIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugbm90aWZpY2F0aW9ucyB0aHJvdWdoIGFuIGluc3RhbnRpYXRlZCBzdWJqZWN0IGludG8gYWxsIHVzZXMgb2YgdGhlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLiBFYWNoXG5cdCAgICogc3Vic2NyaXB0aW9uIHRvIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UgY2F1c2VzIGEgc2VwYXJhdGUgbXVsdGljYXN0IGludm9jYXRpb24sIGV4cG9zaW5nIHRoZSBzZXF1ZW5jZSByZXN1bHRpbmcgZnJvbSB0aGUgc2VsZWN0b3IgZnVuY3Rpb24nc1xuXHQgICAqIGludm9jYXRpb24uIEZvciBzcGVjaWFsaXphdGlvbnMgd2l0aCBmaXhlZCBzdWJqZWN0IHR5cGVzLCBzZWUgUHVibGlzaCwgUHVibGlzaExhc3QsIGFuZCBSZXBsYXkuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqIDEgLSByZXMgPSBzb3VyY2UubXVsdGljYXN0KG9ic2VydmFibGUpO1xuXHQgICAqIDIgLSByZXMgPSBzb3VyY2UubXVsdGljYXN0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBTdWJqZWN0KCk7IH0sIGZ1bmN0aW9uICh4KSB7IHJldHVybiB4OyB9KTtcblx0ICAgKlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb258U3ViamVjdH0gc3ViamVjdE9yU3ViamVjdFNlbGVjdG9yXG5cdCAgICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gaW50ZXJtZWRpYXRlIHN1YmplY3QgdGhyb3VnaCB3aGljaCB0aGUgc291cmNlIHNlcXVlbmNlJ3MgZWxlbWVudHMgd2lsbCBiZSBtdWx0aWNhc3QgdG8gdGhlIHNlbGVjdG9yIGZ1bmN0aW9uLlxuXHQgICAqIE9yOlxuXHQgICAqIFN1YmplY3QgdG8gcHVzaCBzb3VyY2UgZWxlbWVudHMgaW50by5cblx0ICAgKlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtzZWxlY3Rvcl0gT3B0aW9uYWwgc2VsZWN0b3IgZnVuY3Rpb24gd2hpY2ggY2FuIHVzZSB0aGUgbXVsdGljYXN0ZWQgc291cmNlIHNlcXVlbmNlIHN1YmplY3QgdG8gdGhlIHBvbGljaWVzIGVuZm9yY2VkIGJ5IHRoZSBjcmVhdGVkIHN1YmplY3QuIFNwZWNpZmllZCBvbmx5IGlmIDxwYXJhbXJlZiBuYW1lPVwic3ViamVjdE9yU3ViamVjdFNlbGVjdG9yXCIgaXMgYSBmYWN0b3J5IGZ1bmN0aW9uLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aGluIGEgc2VsZWN0b3IgZnVuY3Rpb24uXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLm11bHRpY2FzdCA9IGZ1bmN0aW9uIChzdWJqZWN0T3JTdWJqZWN0U2VsZWN0b3IsIHNlbGVjdG9yKSB7XG5cdCAgICByZXR1cm4gaXNGdW5jdGlvbihzdWJqZWN0T3JTdWJqZWN0U2VsZWN0b3IpID9cblx0ICAgICAgbmV3IE11bHRpY2FzdE9ic2VydmFibGUodGhpcywgc3ViamVjdE9yU3ViamVjdFNlbGVjdG9yLCBzZWxlY3RvcikgOlxuXHQgICAgICBuZXcgQ29ubmVjdGFibGVPYnNlcnZhYmxlKHRoaXMsIHN1YmplY3RPclN1YmplY3RTZWxlY3Rvcik7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgc2VsZWN0b3Igb24gYSBjb25uZWN0YWJsZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cblx0ICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgTXVsdGljYXN0IHVzaW5nIGEgcmVndWxhciBTdWJqZWN0LlxuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiB2YXIgcmVzcmVzID0gc291cmNlLnB1Ymxpc2goKTtcblx0ICAgKiB2YXIgcmVzID0gc291cmNlLnB1Ymxpc2goZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHg7IH0pO1xuXHQgICAqXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NlbGVjdG9yXSBTZWxlY3RvciBmdW5jdGlvbiB3aGljaCBjYW4gdXNlIHRoZSBtdWx0aWNhc3RlZCBzb3VyY2Ugc2VxdWVuY2UgYXMgbWFueSB0aW1lcyBhcyBuZWVkZWQsIHdpdGhvdXQgY2F1c2luZyBtdWx0aXBsZSBzdWJzY3JpcHRpb25zIHRvIHRoZSBzb3VyY2Ugc2VxdWVuY2UuIFN1YnNjcmliZXJzIHRvIHRoZSBnaXZlbiBzb3VyY2Ugd2lsbCByZWNlaXZlIGFsbCBub3RpZmljYXRpb25zIG9mIHRoZSBzb3VyY2UgZnJvbSB0aGUgdGltZSBvZiB0aGUgc3Vic2NyaXB0aW9uIG9uLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aGluIGEgc2VsZWN0b3IgZnVuY3Rpb24uXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnB1Ymxpc2ggPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcblx0ICAgIHJldHVybiBzZWxlY3RvciAmJiBpc0Z1bmN0aW9uKHNlbGVjdG9yKSA/XG5cdCAgICAgIHRoaXMubXVsdGljYXN0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBTdWJqZWN0KCk7IH0sIHNlbGVjdG9yKSA6XG5cdCAgICAgIHRoaXMubXVsdGljYXN0KG5ldyBTdWJqZWN0KCkpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNoYXJlcyBhIHNpbmdsZSBzdWJzY3JpcHRpb24gdG8gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UuXG5cdCAgICogVGhpcyBvcGVyYXRvciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIHB1Ymxpc2ggd2hpY2ggY3JlYXRlcyBhIHN1YnNjcmlwdGlvbiB3aGVuIHRoZSBudW1iZXIgb2Ygb2JzZXJ2ZXJzIGdvZXMgZnJvbSB6ZXJvIHRvIG9uZSwgdGhlbiBzaGFyZXMgdGhhdCBzdWJzY3JpcHRpb24gd2l0aCBhbGwgc3Vic2VxdWVudCBvYnNlcnZlcnMgdW50aWwgdGhlIG51bWJlciBvZiBvYnNlcnZlcnMgcmV0dXJucyB0byB6ZXJvLCBhdCB3aGljaCBwb2ludCB0aGUgc3Vic2NyaXB0aW9uIGlzIGRpc3Bvc2VkLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnNoYXJlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIHRoaXMucHVibGlzaCgpLnJlZkNvdW50KCk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgc2VsZWN0b3Igb24gYSBjb25uZWN0YWJsZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSBjb250YWluaW5nIG9ubHkgdGhlIGxhc3Qgbm90aWZpY2F0aW9uLlxuXHQgICAqIFRoaXMgb3BlcmF0b3IgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiBNdWx0aWNhc3QgdXNpbmcgYSBBc3luY1N1YmplY3QuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqIHZhciByZXMgPSBzb3VyY2UucHVibGlzaExhc3QoKTtcblx0ICAgKiB2YXIgcmVzID0gc291cmNlLnB1Ymxpc2hMYXN0KGZ1bmN0aW9uICh4KSB7IHJldHVybiB4OyB9KTtcblx0ICAgKlxuXHQgICAqIEBwYXJhbSBzZWxlY3RvciBbT3B0aW9uYWxdIFNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiB1c2UgdGhlIG11bHRpY2FzdGVkIHNvdXJjZSBzZXF1ZW5jZSBhcyBtYW55IHRpbWVzIGFzIG5lZWRlZCwgd2l0aG91dCBjYXVzaW5nIG11bHRpcGxlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNvdXJjZSBzZXF1ZW5jZS4gU3Vic2NyaWJlcnMgdG8gdGhlIGdpdmVuIHNvdXJjZSB3aWxsIG9ubHkgcmVjZWl2ZSB0aGUgbGFzdCBub3RpZmljYXRpb24gb2YgdGhlIHNvdXJjZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5wdWJsaXNoTGFzdCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuXHQgICAgcmV0dXJuIHNlbGVjdG9yICYmIGlzRnVuY3Rpb24oc2VsZWN0b3IpID9cblx0ICAgICAgdGhpcy5tdWx0aWNhc3QoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEFzeW5jU3ViamVjdCgpOyB9LCBzZWxlY3RvcikgOlxuXHQgICAgICB0aGlzLm11bHRpY2FzdChuZXcgQXN5bmNTdWJqZWN0KCkpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIHNlbGVjdG9yIG9uIGEgY29ubmVjdGFibGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNoYXJlcyBhIHNpbmdsZSBzdWJzY3JpcHRpb24gdG8gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UgYW5kIHN0YXJ0cyB3aXRoIGluaXRpYWxWYWx1ZS5cblx0ICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgTXVsdGljYXN0IHVzaW5nIGEgQmVoYXZpb3JTdWJqZWN0LlxuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiB2YXIgcmVzID0gc291cmNlLnB1Ymxpc2hWYWx1ZSg0Mik7XG5cdCAgICogdmFyIHJlcyA9IHNvdXJjZS5wdWJsaXNoVmFsdWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguc2VsZWN0KGZ1bmN0aW9uICh5KSB7IHJldHVybiB5ICogeTsgfSkgfSwgNDIpO1xuXHQgICAqXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NlbGVjdG9yXSBPcHRpb25hbCBzZWxlY3RvciBmdW5jdGlvbiB3aGljaCBjYW4gdXNlIHRoZSBtdWx0aWNhc3RlZCBzb3VyY2Ugc2VxdWVuY2UgYXMgbWFueSB0aW1lcyBhcyBuZWVkZWQsIHdpdGhvdXQgY2F1c2luZyBtdWx0aXBsZSBzdWJzY3JpcHRpb25zIHRvIHRoZSBzb3VyY2Ugc2VxdWVuY2UuIFN1YnNjcmliZXJzIHRvIHRoZSBnaXZlbiBzb3VyY2Ugd2lsbCByZWNlaXZlIGltbWVkaWF0ZWx5IHJlY2VpdmUgdGhlIGluaXRpYWwgdmFsdWUsIGZvbGxvd2VkIGJ5IGFsbCBub3RpZmljYXRpb25zIG9mIHRoZSBzb3VyY2UgZnJvbSB0aGUgdGltZSBvZiB0aGUgc3Vic2NyaXB0aW9uIG9uLlxuXHQgICAqIEBwYXJhbSB7TWl4ZWR9IGluaXRpYWxWYWx1ZSBJbml0aWFsIHZhbHVlIHJlY2VpdmVkIGJ5IG9ic2VydmVycyB1cG9uIHN1YnNjcmlwdGlvbi5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5wdWJsaXNoVmFsdWUgPSBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlT3JTZWxlY3RvciwgaW5pdGlhbFZhbHVlKSB7XG5cdCAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMiA/XG5cdCAgICAgIHRoaXMubXVsdGljYXN0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IEJlaGF2aW9yU3ViamVjdChpbml0aWFsVmFsdWUpO1xuXHQgICAgICB9LCBpbml0aWFsVmFsdWVPclNlbGVjdG9yKSA6XG5cdCAgICAgIHRoaXMubXVsdGljYXN0KG5ldyBCZWhhdmlvclN1YmplY3QoaW5pdGlhbFZhbHVlT3JTZWxlY3RvcikpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNoYXJlcyBhIHNpbmdsZSBzdWJzY3JpcHRpb24gdG8gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UgYW5kIHN0YXJ0cyB3aXRoIGFuIGluaXRpYWxWYWx1ZS5cblx0ICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgcHVibGlzaFZhbHVlIHdoaWNoIGNyZWF0ZXMgYSBzdWJzY3JpcHRpb24gd2hlbiB0aGUgbnVtYmVyIG9mIG9ic2VydmVycyBnb2VzIGZyb20gemVybyB0byBvbmUsIHRoZW4gc2hhcmVzIHRoYXQgc3Vic2NyaXB0aW9uIHdpdGggYWxsIHN1YnNlcXVlbnQgb2JzZXJ2ZXJzIHVudGlsIHRoZSBudW1iZXIgb2Ygb2JzZXJ2ZXJzIHJldHVybnMgdG8gemVybywgYXQgd2hpY2ggcG9pbnQgdGhlIHN1YnNjcmlwdGlvbiBpcyBkaXNwb3NlZC5cblx0ICAgKiBAcGFyYW0ge01peGVkfSBpbml0aWFsVmFsdWUgSW5pdGlhbCB2YWx1ZSByZWNlaXZlZCBieSBvYnNlcnZlcnMgdXBvbiBzdWJzY3JpcHRpb24uXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBwcm9kdWNlZCBieSBtdWx0aWNhc3RpbmcgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uc2hhcmVWYWx1ZSA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcblx0ICAgIHJldHVybiB0aGlzLnB1Ymxpc2hWYWx1ZShpbml0aWFsVmFsdWUpLnJlZkNvdW50KCk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgc2VsZWN0b3Igb24gYSBjb25uZWN0YWJsZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSByZXBsYXlpbmcgbm90aWZpY2F0aW9ucyBzdWJqZWN0IHRvIGEgbWF4aW11bSB0aW1lIGxlbmd0aCBmb3IgdGhlIHJlcGxheSBidWZmZXIuXG5cdCAgICogVGhpcyBvcGVyYXRvciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIE11bHRpY2FzdCB1c2luZyBhIFJlcGxheVN1YmplY3QuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqIHZhciByZXMgPSBzb3VyY2UucmVwbGF5KG51bGwsIDMpO1xuXHQgICAqIHZhciByZXMgPSBzb3VyY2UucmVwbGF5KG51bGwsIDMsIDUwMCk7XG5cdCAgICogdmFyIHJlcyA9IHNvdXJjZS5yZXBsYXkobnVsbCwgMywgNTAwLCBzY2hlZHVsZXIpO1xuXHQgICAqIHZhciByZXMgPSBzb3VyY2UucmVwbGF5KGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LnRha2UoNikucmVwZWF0KCk7IH0sIDMsIDUwMCwgc2NoZWR1bGVyKTtcblx0ICAgKlxuXHQgICAqIEBwYXJhbSBzZWxlY3RvciBbT3B0aW9uYWxdIFNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiB1c2UgdGhlIG11bHRpY2FzdGVkIHNvdXJjZSBzZXF1ZW5jZSBhcyBtYW55IHRpbWVzIGFzIG5lZWRlZCwgd2l0aG91dCBjYXVzaW5nIG11bHRpcGxlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNvdXJjZSBzZXF1ZW5jZS4gU3Vic2NyaWJlcnMgdG8gdGhlIGdpdmVuIHNvdXJjZSB3aWxsIHJlY2VpdmUgYWxsIHRoZSBub3RpZmljYXRpb25zIG9mIHRoZSBzb3VyY2Ugc3ViamVjdCB0byB0aGUgc3BlY2lmaWVkIHJlcGxheSBidWZmZXIgdHJpbW1pbmcgcG9saWN5LlxuXHQgICAqIEBwYXJhbSBidWZmZXJTaXplIFtPcHRpb25hbF0gTWF4aW11bSBlbGVtZW50IGNvdW50IG9mIHRoZSByZXBsYXkgYnVmZmVyLlxuXHQgICAqIEBwYXJhbSB3aW5kb3dTaXplIFtPcHRpb25hbF0gTWF4aW11bSB0aW1lIGxlbmd0aCBvZiB0aGUgcmVwbGF5IGJ1ZmZlci5cblx0ICAgKiBAcGFyYW0gc2NoZWR1bGVyIFtPcHRpb25hbF0gU2NoZWR1bGVyIHdoZXJlIGNvbm5lY3RlZCBvYnNlcnZlcnMgd2l0aGluIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb24uXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBwcm9kdWNlZCBieSBtdWx0aWNhc3RpbmcgdGhlIHNvdXJjZSBzZXF1ZW5jZSB3aXRoaW4gYSBzZWxlY3RvciBmdW5jdGlvbi5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ucmVwbGF5ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBidWZmZXJTaXplLCB3aW5kb3dTaXplLCBzY2hlZHVsZXIpIHtcblx0ICAgIHJldHVybiBzZWxlY3RvciAmJiBpc0Z1bmN0aW9uKHNlbGVjdG9yKSA/XG5cdCAgICAgIHRoaXMubXVsdGljYXN0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBSZXBsYXlTdWJqZWN0KGJ1ZmZlclNpemUsIHdpbmRvd1NpemUsIHNjaGVkdWxlcik7IH0sIHNlbGVjdG9yKSA6XG5cdCAgICAgIHRoaXMubXVsdGljYXN0KG5ldyBSZXBsYXlTdWJqZWN0KGJ1ZmZlclNpemUsIHdpbmRvd1NpemUsIHNjaGVkdWxlcikpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNoYXJlcyBhIHNpbmdsZSBzdWJzY3JpcHRpb24gdG8gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UgcmVwbGF5aW5nIG5vdGlmaWNhdGlvbnMgc3ViamVjdCB0byBhIG1heGltdW0gdGltZSBsZW5ndGggZm9yIHRoZSByZXBsYXkgYnVmZmVyLlxuXHQgICAqIFRoaXMgb3BlcmF0b3IgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiByZXBsYXkgd2hpY2ggY3JlYXRlcyBhIHN1YnNjcmlwdGlvbiB3aGVuIHRoZSBudW1iZXIgb2Ygb2JzZXJ2ZXJzIGdvZXMgZnJvbSB6ZXJvIHRvIG9uZSwgdGhlbiBzaGFyZXMgdGhhdCBzdWJzY3JpcHRpb24gd2l0aCBhbGwgc3Vic2VxdWVudCBvYnNlcnZlcnMgdW50aWwgdGhlIG51bWJlciBvZiBvYnNlcnZlcnMgcmV0dXJucyB0byB6ZXJvLCBhdCB3aGljaCBwb2ludCB0aGUgc3Vic2NyaXB0aW9uIGlzIGRpc3Bvc2VkLlxuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiB2YXIgcmVzID0gc291cmNlLnNoYXJlUmVwbGF5KDMpO1xuXHQgICAqIHZhciByZXMgPSBzb3VyY2Uuc2hhcmVSZXBsYXkoMywgNTAwKTtcblx0ICAgKiB2YXIgcmVzID0gc291cmNlLnNoYXJlUmVwbGF5KDMsIDUwMCwgc2NoZWR1bGVyKTtcblx0ICAgKlxuXHRcblx0ICAgKiBAcGFyYW0gYnVmZmVyU2l6ZSBbT3B0aW9uYWxdIE1heGltdW0gZWxlbWVudCBjb3VudCBvZiB0aGUgcmVwbGF5IGJ1ZmZlci5cblx0ICAgKiBAcGFyYW0gd2luZG93IFtPcHRpb25hbF0gTWF4aW11bSB0aW1lIGxlbmd0aCBvZiB0aGUgcmVwbGF5IGJ1ZmZlci5cblx0ICAgKiBAcGFyYW0gc2NoZWR1bGVyIFtPcHRpb25hbF0gU2NoZWR1bGVyIHdoZXJlIGNvbm5lY3RlZCBvYnNlcnZlcnMgd2l0aGluIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb24uXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBwcm9kdWNlZCBieSBtdWx0aWNhc3RpbmcgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uc2hhcmVSZXBsYXkgPSBmdW5jdGlvbiAoYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKSB7XG5cdCAgICByZXR1cm4gdGhpcy5yZXBsYXkobnVsbCwgYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKS5yZWZDb3VudCgpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBSZWZDb3VudE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoUmVmQ291bnRPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gUmVmQ291bnRPYnNlcnZhYmxlKHNvdXJjZSkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5fY291bnQgPSAwO1xuXHQgICAgICB0aGlzLl9jb25uZWN0YWJsZVN1YnNjcmlwdGlvbiA9IG51bGw7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFJlZkNvdW50T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBzaG91bGRDb25uZWN0ID0gKyt0aGlzLl9jb3VudCA9PT0gMSwgc3Vic2NyaXB0aW9uID0gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG8pO1xuXHQgICAgICBzaG91bGRDb25uZWN0ICYmICh0aGlzLl9jb25uZWN0YWJsZVN1YnNjcmlwdGlvbiA9IHRoaXMuc291cmNlLmNvbm5lY3QoKSk7XG5cdCAgICAgIHJldHVybiBuZXcgUmVmQ291bnREaXNwb3NhYmxlKHRoaXMsIHN1YnNjcmlwdGlvbik7XG5cdCAgICB9O1xuXHRcblx0ICAgIGZ1bmN0aW9uIFJlZkNvdW50RGlzcG9zYWJsZShwLCBzKSB7XG5cdCAgICAgIHRoaXMuX3AgPSBwO1xuXHQgICAgICB0aGlzLl9zID0gcztcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICB9XG5cdFxuXHQgICAgUmVmQ291bnREaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5fcy5kaXNwb3NlKCk7XG5cdCAgICAgICAgLS10aGlzLl9wLl9jb3VudCA9PT0gMCAmJiB0aGlzLl9wLl9jb25uZWN0YWJsZVN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFJlZkNvdW50T2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBDb25uZWN0YWJsZU9ic2VydmFibGUgPSBSeC5Db25uZWN0YWJsZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQ29ubmVjdGFibGVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gQ29ubmVjdGFibGVPYnNlcnZhYmxlKHNvdXJjZSwgc3ViamVjdCkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5faGFzU3Vic2NyaXB0aW9uICA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSBudWxsO1xuXHQgICAgICB0aGlzLl9zb3VyY2VPYnNlcnZhYmxlID0gc291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXHQgICAgICB0aGlzLl9zdWJqZWN0ID0gc3ViamVjdDtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gQ29ubmVjdERpc3Bvc2FibGUocGFyZW50KSB7XG5cdCAgICAgIHRoaXMuX3AgPSBwYXJlbnQ7XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgfVxuXHRcblx0ICAgIENvbm5lY3REaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5fcC5faGFzU3Vic2NyaXB0aW9uID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdFxuXHQgICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBpZiAoIXRoaXMuX2hhc1N1YnNjcmlwdGlvbikge1xuXHQgICAgICAgIHRoaXMuX2hhc1N1YnNjcmlwdGlvbiA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbmV3IEJpbmFyeURpc3Bvc2FibGUoXG5cdCAgICAgICAgICB0aGlzLl9zb3VyY2VPYnNlcnZhYmxlLnN1YnNjcmliZSh0aGlzLl9zdWJqZWN0KSxcblx0ICAgICAgICAgIG5ldyBDb25uZWN0RGlzcG9zYWJsZSh0aGlzKVxuXHQgICAgICAgICk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmlwdGlvbjtcblx0ICAgIH07XG5cdFxuXHQgICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N1YmplY3Quc3Vic2NyaWJlKG8pO1xuXHQgICAgfTtcblx0XG5cdCAgICBDb25uZWN0YWJsZU9ic2VydmFibGUucHJvdG90eXBlLnJlZkNvdW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gbmV3IFJlZkNvdW50T2JzZXJ2YWJsZSh0aGlzKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGUpKTtcblx0XG5cdCAgdmFyIFRpbWVyT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFRpbWVyT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFRpbWVyT2JzZXJ2YWJsZShkdCwgcykge1xuXHQgICAgICB0aGlzLl9kdCA9IGR0O1xuXHQgICAgICB0aGlzLl9zID0gcztcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgVGltZXJPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3Muc2NoZWR1bGVGdXR1cmUobywgdGhpcy5fZHQsIHNjaGVkdWxlTWV0aG9kKTtcblx0ICAgIH07XG5cdFxuXHQgICAgZnVuY3Rpb24gc2NoZWR1bGVNZXRob2Qocywgbykge1xuXHQgICAgICBvLm9uTmV4dCgwKTtcblx0ICAgICAgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfVxuXHRcblx0ICAgIHJldHVybiBUaW1lck9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICBmdW5jdGlvbiBfb2JzZXJ2YWJsZVRpbWVyKGR1ZVRpbWUsIHNjaGVkdWxlcikge1xuXHQgICAgcmV0dXJuIG5ldyBUaW1lck9ic2VydmFibGUoZHVlVGltZSwgc2NoZWR1bGVyKTtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIG9ic2VydmFibGVUaW1lckRhdGVBbmRQZXJpb2QoZHVlVGltZSwgcGVyaW9kLCBzY2hlZHVsZXIpIHtcblx0ICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcblx0ICAgICAgdmFyIGQgPSBkdWVUaW1lLCBwID0gbm9ybWFsaXplVGltZShwZXJpb2QpO1xuXHQgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlRnV0dXJlKDAsIGQsIGZ1bmN0aW9uIChjb3VudCwgc2VsZikge1xuXHQgICAgICAgIGlmIChwID4gMCkge1xuXHQgICAgICAgICAgdmFyIG5vdyA9IHNjaGVkdWxlci5ub3coKTtcblx0ICAgICAgICAgIGQgPSBuZXcgRGF0ZShkLmdldFRpbWUoKSArIHApO1xuXHQgICAgICAgICAgZC5nZXRUaW1lKCkgPD0gbm93ICYmIChkID0gbmV3IERhdGUobm93ICsgcCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBvYnNlcnZlci5vbk5leHQoY291bnQpO1xuXHQgICAgICAgIHNlbGYoY291bnQgKyAxLCBuZXcgRGF0ZShkKSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfSk7XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiBvYnNlcnZhYmxlVGltZXJUaW1lU3BhbkFuZFBlcmlvZChkdWVUaW1lLCBwZXJpb2QsIHNjaGVkdWxlcikge1xuXHQgICAgcmV0dXJuIGR1ZVRpbWUgPT09IHBlcmlvZCA/XG5cdCAgICAgIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuXHQgICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGVQZXJpb2RpYygwLCBwZXJpb2QsIGZ1bmN0aW9uIChjb3VudCkge1xuXHQgICAgICAgICAgb2JzZXJ2ZXIub25OZXh0KGNvdW50KTtcblx0ICAgICAgICAgIHJldHVybiBjb3VudCArIDE7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pIDpcblx0ICAgICAgb2JzZXJ2YWJsZURlZmVyKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVRpbWVyRGF0ZUFuZFBlcmlvZChuZXcgRGF0ZShzY2hlZHVsZXIubm93KCkgKyBkdWVUaW1lKSwgcGVyaW9kLCBzY2hlZHVsZXIpO1xuXHQgICAgICB9KTtcblx0ICB9XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBwcm9kdWNlcyBhIHZhbHVlIGFmdGVyIGVhY2ggcGVyaW9kLlxuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiAgMSAtIHJlcyA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCk7XG5cdCAgICogIDIgLSByZXMgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDAsIFJ4LlNjaGVkdWxlci50aW1lb3V0KTtcblx0ICAgKlxuXHQgICAqIEBwYXJhbSB7TnVtYmVyfSBwZXJpb2QgUGVyaW9kIGZvciBwcm9kdWNpbmcgdGhlIHZhbHVlcyBpbiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlIChzcGVjaWZpZWQgYXMgYW4gaW50ZWdlciBkZW5vdGluZyBtaWxsaXNlY29uZHMpLlxuXHQgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gcnVuIHRoZSB0aW1lciBvbi4gSWYgbm90IHNwZWNpZmllZCwgUnguU2NoZWR1bGVyLnRpbWVvdXQgaXMgdXNlZC5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYWZ0ZXIgZWFjaCBwZXJpb2QuXG5cdCAgICovXG5cdCAgdmFyIG9ic2VydmFibGVpbnRlcnZhbCA9IE9ic2VydmFibGUuaW50ZXJ2YWwgPSBmdW5jdGlvbiAocGVyaW9kLCBzY2hlZHVsZXIpIHtcblx0ICAgIHJldHVybiBvYnNlcnZhYmxlVGltZXJUaW1lU3BhbkFuZFBlcmlvZChwZXJpb2QsIHBlcmlvZCwgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSA/IHNjaGVkdWxlciA6IGRlZmF1bHRTY2hlZHVsZXIpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBwcm9kdWNlcyBhIHZhbHVlIGFmdGVyIGR1ZVRpbWUgaGFzIGVsYXBzZWQgYW5kIHRoZW4gYWZ0ZXIgZWFjaCBwZXJpb2QuXG5cdCAgICogQHBhcmFtIHtOdW1iZXJ9IGR1ZVRpbWUgQWJzb2x1dGUgKHNwZWNpZmllZCBhcyBhIERhdGUgb2JqZWN0KSBvciByZWxhdGl2ZSB0aW1lIChzcGVjaWZpZWQgYXMgYW4gaW50ZWdlciBkZW5vdGluZyBtaWxsaXNlY29uZHMpIGF0IHdoaWNoIHRvIHByb2R1Y2UgdGhlIGZpcnN0IHZhbHVlLlxuXHQgICAqIEBwYXJhbSB7TWl4ZWR9IFtwZXJpb2RPclNjaGVkdWxlcl0gIFBlcmlvZCB0byBwcm9kdWNlIHN1YnNlcXVlbnQgdmFsdWVzIChzcGVjaWZpZWQgYXMgYW4gaW50ZWdlciBkZW5vdGluZyBtaWxsaXNlY29uZHMpLCBvciB0aGUgc2NoZWR1bGVyIHRvIHJ1biB0aGUgdGltZXIgb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSByZXN1bHRpbmcgdGltZXIgaXMgbm90IHJlY3VycmluZy5cblx0ICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gIFNjaGVkdWxlciB0byBydW4gdGhlIHRpbWVyIG9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdGltZW91dCBzY2hlZHVsZXIgaXMgdXNlZC5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYWZ0ZXIgZHVlIHRpbWUgaGFzIGVsYXBzZWQgYW5kIHRoZW4gZWFjaCBwZXJpb2QuXG5cdCAgICovXG5cdCAgdmFyIG9ic2VydmFibGVUaW1lciA9IE9ic2VydmFibGUudGltZXIgPSBmdW5jdGlvbiAoZHVlVGltZSwgcGVyaW9kT3JTY2hlZHVsZXIsIHNjaGVkdWxlcikge1xuXHQgICAgdmFyIHBlcmlvZDtcblx0ICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGRlZmF1bHRTY2hlZHVsZXIpO1xuXHQgICAgaWYgKHBlcmlvZE9yU2NoZWR1bGVyICE9IG51bGwgJiYgdHlwZW9mIHBlcmlvZE9yU2NoZWR1bGVyID09PSAnbnVtYmVyJykge1xuXHQgICAgICBwZXJpb2QgPSBwZXJpb2RPclNjaGVkdWxlcjtcblx0ICAgIH0gZWxzZSBpZiAoaXNTY2hlZHVsZXIocGVyaW9kT3JTY2hlZHVsZXIpKSB7XG5cdCAgICAgIHNjaGVkdWxlciA9IHBlcmlvZE9yU2NoZWR1bGVyO1xuXHQgICAgfVxuXHQgICAgaWYgKChkdWVUaW1lIGluc3RhbmNlb2YgRGF0ZSB8fCB0eXBlb2YgZHVlVGltZSA9PT0gJ251bWJlcicpICYmIHBlcmlvZCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRpbWVyKGR1ZVRpbWUsIHNjaGVkdWxlcik7XG5cdCAgICB9XG5cdCAgICBpZiAoZHVlVGltZSBpbnN0YW5jZW9mIERhdGUgJiYgcGVyaW9kICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgcmV0dXJuIG9ic2VydmFibGVUaW1lckRhdGVBbmRQZXJpb2QoZHVlVGltZS5nZXRUaW1lKCksIHBlcmlvZE9yU2NoZWR1bGVyLCBzY2hlZHVsZXIpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG9ic2VydmFibGVUaW1lclRpbWVTcGFuQW5kUGVyaW9kKGR1ZVRpbWUsIHBlcmlvZCwgc2NoZWR1bGVyKTtcblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBvYnNlcnZhYmxlRGVsYXlSZWxhdGl2ZShzb3VyY2UsIGR1ZVRpbWUsIHNjaGVkdWxlcikge1xuXHQgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBhY3RpdmUgPSBmYWxzZSxcblx0ICAgICAgICBjYW5jZWxhYmxlID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKSxcblx0ICAgICAgICBleGNlcHRpb24gPSBudWxsLFxuXHQgICAgICAgIHEgPSBbXSxcblx0ICAgICAgICBydW5uaW5nID0gZmFsc2UsXG5cdCAgICAgICAgc3Vic2NyaXB0aW9uO1xuXHQgICAgICBzdWJzY3JpcHRpb24gPSBzb3VyY2UubWF0ZXJpYWxpemUoKS50aW1lc3RhbXAoc2NoZWR1bGVyKS5zdWJzY3JpYmUoZnVuY3Rpb24gKG5vdGlmaWNhdGlvbikge1xuXHQgICAgICAgIHZhciBkLCBzaG91bGRSdW47XG5cdCAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi52YWx1ZS5raW5kID09PSAnRScpIHtcblx0ICAgICAgICAgIHEgPSBbXTtcblx0ICAgICAgICAgIHEucHVzaChub3RpZmljYXRpb24pO1xuXHQgICAgICAgICAgZXhjZXB0aW9uID0gbm90aWZpY2F0aW9uLnZhbHVlLmVycm9yO1xuXHQgICAgICAgICAgc2hvdWxkUnVuID0gIXJ1bm5pbmc7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHEucHVzaCh7IHZhbHVlOiBub3RpZmljYXRpb24udmFsdWUsIHRpbWVzdGFtcDogbm90aWZpY2F0aW9uLnRpbWVzdGFtcCArIGR1ZVRpbWUgfSk7XG5cdCAgICAgICAgICBzaG91bGRSdW4gPSAhYWN0aXZlO1xuXHQgICAgICAgICAgYWN0aXZlID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHNob3VsZFJ1bikge1xuXHQgICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICBvLm9uRXJyb3IoZXhjZXB0aW9uKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgICAgICAgY2FuY2VsYWJsZS5zZXREaXNwb3NhYmxlKGQpO1xuXHQgICAgICAgICAgICBkLnNldERpc3Bvc2FibGUoc2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlRnV0dXJlKG51bGwsIGR1ZVRpbWUsIGZ1bmN0aW9uIChfLCBzZWxmKSB7XG5cdCAgICAgICAgICAgICAgdmFyIGUsIHJlY3Vyc2VEdWVUaW1lLCByZXN1bHQsIHNob3VsZFJlY3Vyc2U7XG5cdCAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICBydW5uaW5nID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICBkbyB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgaWYgKHEubGVuZ3RoID4gMCAmJiBxWzBdLnRpbWVzdGFtcCAtIHNjaGVkdWxlci5ub3coKSA8PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHEuc2hpZnQoKS52YWx1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgcmVzdWx0LmFjY2VwdChvKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICB9IHdoaWxlIChyZXN1bHQgIT09IG51bGwpO1xuXHQgICAgICAgICAgICAgIHNob3VsZFJlY3Vyc2UgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICByZWN1cnNlRHVlVGltZSA9IDA7XG5cdCAgICAgICAgICAgICAgaWYgKHEubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgc2hvdWxkUmVjdXJzZSA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICByZWN1cnNlRHVlVGltZSA9IE1hdGgubWF4KDAsIHFbMF0udGltZXN0YW1wIC0gc2NoZWR1bGVyLm5vdygpKTtcblx0ICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYWN0aXZlID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgIGUgPSBleGNlcHRpb247XG5cdCAgICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgIGlmIChlICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICBvLm9uRXJyb3IoZSk7XG5cdCAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSZWN1cnNlKSB7XG5cdCAgICAgICAgICAgICAgICBzZWxmKG51bGwsIHJlY3Vyc2VEdWVUaW1lKTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0pKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9uLCBjYW5jZWxhYmxlKTtcblx0ICAgIH0sIHNvdXJjZSk7XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiBvYnNlcnZhYmxlRGVsYXlBYnNvbHV0ZShzb3VyY2UsIGR1ZVRpbWUsIHNjaGVkdWxlcikge1xuXHQgICAgcmV0dXJuIG9ic2VydmFibGVEZWZlcihmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiBvYnNlcnZhYmxlRGVsYXlSZWxhdGl2ZShzb3VyY2UsIGR1ZVRpbWUgLSBzY2hlZHVsZXIubm93KCksIHNjaGVkdWxlcik7XG5cdCAgICB9KTtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIGRlbGF5V2l0aFNlbGVjdG9yKHNvdXJjZSwgc3Vic2NyaXB0aW9uRGVsYXksIGRlbGF5RHVyYXRpb25TZWxlY3Rvcikge1xuXHQgICAgdmFyIHN1YkRlbGF5LCBzZWxlY3Rvcjtcblx0ICAgIGlmIChpc0Z1bmN0aW9uKHN1YnNjcmlwdGlvbkRlbGF5KSkge1xuXHQgICAgICBzZWxlY3RvciA9IHN1YnNjcmlwdGlvbkRlbGF5O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgc3ViRGVsYXkgPSBzdWJzY3JpcHRpb25EZWxheTtcblx0ICAgICAgc2VsZWN0b3IgPSBkZWxheUR1cmF0aW9uU2VsZWN0b3I7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGRlbGF5cyA9IG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKCksIGF0RW5kID0gZmFsc2UsIHN1YnNjcmlwdGlvbiA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG5cdFxuXHQgICAgICBmdW5jdGlvbiBzdGFydCgpIHtcblx0ICAgICAgICBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShzb3VyY2Uuc3Vic2NyaWJlKFxuXHQgICAgICAgICAgZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgICAgICAgdmFyIGRlbGF5ID0gdHJ5Q2F0Y2goc2VsZWN0b3IpKHgpO1xuXHQgICAgICAgICAgICBpZiAoZGVsYXkgPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IoZGVsYXkuZSk7IH1cblx0ICAgICAgICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgICAgICAgZGVsYXlzLmFkZChkKTtcblx0ICAgICAgICAgICAgZC5zZXREaXNwb3NhYmxlKGRlbGF5LnN1YnNjcmliZShcblx0ICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICBvLm9uTmV4dCh4KTtcblx0ICAgICAgICAgICAgICAgIGRlbGF5cy5yZW1vdmUoZCk7XG5cdCAgICAgICAgICAgICAgICBkb25lKCk7XG5cdCAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sXG5cdCAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgby5vbk5leHQoeCk7XG5cdCAgICAgICAgICAgICAgICBkZWxheXMucmVtb3ZlKGQpO1xuXHQgICAgICAgICAgICAgICAgZG9uZSgpO1xuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgKSk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgZnVuY3Rpb24gKGUpIHsgby5vbkVycm9yKGUpOyB9LFxuXHQgICAgICAgICAgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBhdEVuZCA9IHRydWU7XG5cdCAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG5cdCAgICAgICAgICAgIGRvbmUoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICApKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgZnVuY3Rpb24gZG9uZSAoKSB7XG5cdCAgICAgICAgYXRFbmQgJiYgZGVsYXlzLmxlbmd0aCA9PT0gMCAmJiBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmICghc3ViRGVsYXkpIHtcblx0ICAgICAgICBzdGFydCgpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKHN1YkRlbGF5LnN1YnNjcmliZShzdGFydCwgZnVuY3Rpb24gKGUpIHsgby5vbkVycm9yKGUpOyB9LCBzdGFydCkpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9uLCBkZWxheXMpO1xuXHQgICAgfSwgdGhpcyk7XG5cdCAgfVxuXHRcblx0ICAvKipcblx0ICAgKiAgVGltZSBzaGlmdHMgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgZHVlVGltZS5cblx0ICAgKiAgVGhlIHJlbGF0aXZlIHRpbWUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIHZhbHVlcyBhcmUgcHJlc2VydmVkLlxuXHQgICAqXG5cdCAgICogQHBhcmFtIHtOdW1iZXJ9IGR1ZVRpbWUgQWJzb2x1dGUgKHNwZWNpZmllZCBhcyBhIERhdGUgb2JqZWN0KSBvciByZWxhdGl2ZSB0aW1lIChzcGVjaWZpZWQgYXMgYW4gaW50ZWdlciBkZW5vdGluZyBtaWxsaXNlY29uZHMpIGJ5IHdoaWNoIHRvIHNoaWZ0IHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gcnVuIHRoZSBkZWxheSB0aW1lcnMgb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0aW1lb3V0IHNjaGVkdWxlciBpcyB1c2VkLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaW1lLXNoaWZ0ZWQgc2VxdWVuY2UuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLmRlbGF5ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGZpcnN0QXJnID0gYXJndW1lbnRzWzBdO1xuXHQgICAgaWYgKHR5cGVvZiBmaXJzdEFyZyA9PT0gJ251bWJlcicgfHwgZmlyc3RBcmcgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdCAgICAgIHZhciBkdWVUaW1lID0gZmlyc3RBcmcsIHNjaGVkdWxlciA9IGFyZ3VtZW50c1sxXTtcblx0ICAgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gZGVmYXVsdFNjaGVkdWxlcik7XG5cdCAgICAgIHJldHVybiBkdWVUaW1lIGluc3RhbmNlb2YgRGF0ZSA/XG5cdCAgICAgICAgb2JzZXJ2YWJsZURlbGF5QWJzb2x1dGUodGhpcywgZHVlVGltZSwgc2NoZWR1bGVyKSA6XG5cdCAgICAgICAgb2JzZXJ2YWJsZURlbGF5UmVsYXRpdmUodGhpcywgZHVlVGltZSwgc2NoZWR1bGVyKTtcblx0ICAgIH0gZWxzZSBpZiAoT2JzZXJ2YWJsZS5pc09ic2VydmFibGUoZmlyc3RBcmcpIHx8IGlzRnVuY3Rpb24oZmlyc3RBcmcpKSB7XG5cdCAgICAgIHJldHVybiBkZWxheVdpdGhTZWxlY3Rvcih0aGlzLCBmaXJzdEFyZywgYXJndW1lbnRzWzFdKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMnKTtcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICB2YXIgRGVib3VuY2VPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKERlYm91bmNlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIERlYm91bmNlT2JzZXJ2YWJsZShzb3VyY2UsIGR0LCBzKSB7XG5cdCAgICAgIGlzU2NoZWR1bGVyKHMpIHx8IChzID0gZGVmYXVsdFNjaGVkdWxlcik7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLl9kdCA9IGR0O1xuXHQgICAgICB0aGlzLl9zID0gcztcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgRGVib3VuY2VPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGNhbmNlbGFibGUgPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpO1xuXHQgICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoXG5cdCAgICAgICAgdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZWJvdW5jZU9ic2VydmVyKG8sIHRoaXMuc291cmNlLCB0aGlzLl9kdCwgdGhpcy5fcywgY2FuY2VsYWJsZSkpLFxuXHQgICAgICAgIGNhbmNlbGFibGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gRGVib3VuY2VPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIERlYm91bmNlT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRGVib3VuY2VPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIERlYm91bmNlT2JzZXJ2ZXIob2JzZXJ2ZXIsIHNvdXJjZSwgZHVlVGltZSwgc2NoZWR1bGVyLCBjYW5jZWxhYmxlKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvYnNlcnZlcjtcblx0ICAgICAgdGhpcy5fcyA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5fZCA9IGR1ZVRpbWU7XG5cdCAgICAgIHRoaXMuX3NjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0ICAgICAgdGhpcy5fYyA9IGNhbmNlbGFibGU7XG5cdCAgICAgIHRoaXMuX3YgPSBudWxsO1xuXHQgICAgICB0aGlzLl9odiA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9pZCA9IDA7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIERlYm91bmNlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICB0aGlzLl9odiA9IHRydWU7XG5cdCAgICAgIHRoaXMuX3YgPSB4O1xuXHQgICAgICB2YXIgY3VycmVudElkID0gKyt0aGlzLl9pZCwgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICB0aGlzLl9jLnNldERpc3Bvc2FibGUoZCk7XG5cdCAgICAgIGQuc2V0RGlzcG9zYWJsZSh0aGlzLl9zY2hlZHVsZXIuc2NoZWR1bGVGdXR1cmUodGhpcywgdGhpcy5fZCwgZnVuY3Rpb24gKF8sIHNlbGYpIHtcblx0ICAgICAgICBzZWxmLl9odiAmJiBzZWxmLl9pZCA9PT0gY3VycmVudElkICYmIHNlbGYuX28ub25OZXh0KHgpO1xuXHQgICAgICAgIHNlbGYuX2h2ID0gZmFsc2U7XG5cdCAgICAgIH0pKTtcblx0ICAgIH07XG5cdFxuXHQgICAgRGVib3VuY2VPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICB0aGlzLl9jLmRpc3Bvc2UoKTtcblx0ICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuXHQgICAgICB0aGlzLl9odiA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9pZCsrO1xuXHQgICAgfTtcblx0XG5cdCAgICBEZWJvdW5jZU9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX2MuZGlzcG9zZSgpO1xuXHQgICAgICB0aGlzLl9odiAmJiB0aGlzLl9vLm9uTmV4dCh0aGlzLl92KTtcblx0ICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB0aGlzLl9odiA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9pZCsrO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gRGVib3VuY2VPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgZnVuY3Rpb24gZGVib3VuY2VXaXRoU2VsZWN0b3Ioc291cmNlLCBkdXJhdGlvblNlbGVjdG9yKSB7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIHZhbHVlLCBoYXNWYWx1ZSA9IGZhbHNlLCBjYW5jZWxhYmxlID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKSwgaWQgPSAwO1xuXHQgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gc291cmNlLnN1YnNjcmliZShcblx0ICAgICAgICBmdW5jdGlvbiAoeCkge1xuXHQgICAgICAgICAgdmFyIHRocm90dGxlID0gdHJ5Q2F0Y2goZHVyYXRpb25TZWxlY3RvcikoeCk7XG5cdCAgICAgICAgICBpZiAodGhyb3R0bGUgPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IodGhyb3R0bGUuZSk7IH1cblx0XG5cdCAgICAgICAgICBpc1Byb21pc2UodGhyb3R0bGUpICYmICh0aHJvdHRsZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZSh0aHJvdHRsZSkpO1xuXHRcblx0ICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcblx0ICAgICAgICAgIHZhbHVlID0geDtcblx0ICAgICAgICAgIGlkKys7XG5cdCAgICAgICAgICB2YXIgY3VycmVudGlkID0gaWQsIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgICAgIGNhbmNlbGFibGUuc2V0RGlzcG9zYWJsZShkKTtcblx0ICAgICAgICAgIGQuc2V0RGlzcG9zYWJsZSh0aHJvdHRsZS5zdWJzY3JpYmUoXG5cdCAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICBoYXNWYWx1ZSAmJiBpZCA9PT0gY3VycmVudGlkICYmIG8ub25OZXh0KHZhbHVlKTtcblx0ICAgICAgICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgIGQuZGlzcG9zZSgpO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sXG5cdCAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICBoYXNWYWx1ZSAmJiBpZCA9PT0gY3VycmVudGlkICYmIG8ub25OZXh0KHZhbHVlKTtcblx0ICAgICAgICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgIGQuZGlzcG9zZSgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICApKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICBjYW5jZWxhYmxlLmRpc3Bvc2UoKTtcblx0ICAgICAgICAgIG8ub25FcnJvcihlKTtcblx0ICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG5cdCAgICAgICAgICBpZCsrO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgY2FuY2VsYWJsZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgICBoYXNWYWx1ZSAmJiBvLm9uTmV4dCh2YWx1ZSk7XG5cdCAgICAgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlO1xuXHQgICAgICAgICAgaWQrKztcblx0ICAgICAgICB9XG5cdCAgICAgICk7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUpO1xuXHQgICAgfSwgc291cmNlKTtcblx0ICB9XG5cdFxuXHQgIG9ic2VydmFibGVQcm90by5kZWJvdW5jZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmIChpc0Z1bmN0aW9uIChhcmd1bWVudHNbMF0pKSB7XG5cdCAgICAgIHJldHVybiBkZWJvdW5jZVdpdGhTZWxlY3Rvcih0aGlzLCBhcmd1bWVudHNbMF0pO1xuXHQgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnbnVtYmVyJykge1xuXHQgICAgICByZXR1cm4gbmV3IERlYm91bmNlT2JzZXJ2YWJsZSh0aGlzLCBhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzJyk7XG5cdCAgICB9XG5cdCAgfTtcblx0XG5cdCAgdmFyIFRpbWVzdGFtcE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoVGltZXN0YW1wT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFRpbWVzdGFtcE9ic2VydmFibGUoc291cmNlLCBzKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLl9zID0gcztcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgVGltZXN0YW1wT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IFRpbWVzdGFtcE9ic2VydmVyKG8sIHRoaXMuX3MpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFRpbWVzdGFtcE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgVGltZXN0YW1wT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoVGltZXN0YW1wT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBUaW1lc3RhbXBPYnNlcnZlcihvLCBzKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9zID0gcztcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgVGltZXN0YW1wT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICB0aGlzLl9vLm9uTmV4dCh7IHZhbHVlOiB4LCB0aW1lc3RhbXA6IHRoaXMuX3Mubm93KCkgfSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFRpbWVzdGFtcE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgVGltZXN0YW1wT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gVGltZXN0YW1wT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZWNvcmRzIHRoZSB0aW1lc3RhbXAgZm9yIGVhY2ggdmFsdWUgaW4gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgKlxuXHQgICAqIEBleGFtcGxlXG5cdCAgICogIDEgLSByZXMgPSBzb3VyY2UudGltZXN0YW1wKCk7IC8vIHByb2R1Y2VzIHsgdmFsdWU6IHgsIHRpbWVzdGFtcDogdHMgfVxuXHQgICAqICAyIC0gcmVzID0gc291cmNlLnRpbWVzdGFtcChSeC5TY2hlZHVsZXIuZGVmYXVsdCk7XG5cdCAgICpcblx0ICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gIFNjaGVkdWxlciB1c2VkIHRvIGNvbXB1dGUgdGltZXN0YW1wcy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgc2NoZWR1bGVyIGlzIHVzZWQuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCB0aW1lc3RhbXAgaW5mb3JtYXRpb24gb24gdmFsdWVzLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by50aW1lc3RhbXAgPSBmdW5jdGlvbiAoc2NoZWR1bGVyKSB7XG5cdCAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcblx0ICAgIHJldHVybiBuZXcgVGltZXN0YW1wT2JzZXJ2YWJsZSh0aGlzLCBzY2hlZHVsZXIpO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIHNhbXBsZU9ic2VydmFibGUoc291cmNlLCBzYW1wbGVyKSB7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGF0RW5kID0gZmFsc2UsIHZhbHVlLCBoYXNWYWx1ZSA9IGZhbHNlO1xuXHRcblx0ICAgICAgZnVuY3Rpb24gc2FtcGxlU3Vic2NyaWJlKCkge1xuXHQgICAgICAgIGlmIChoYXNWYWx1ZSkge1xuXHQgICAgICAgICAgaGFzVmFsdWUgPSBmYWxzZTtcblx0ICAgICAgICAgIG8ub25OZXh0KHZhbHVlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXRFbmQgJiYgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgc291cmNlU3Vic2NyaXB0aW9uID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgIHNvdXJjZVN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoXG5cdCAgICAgICAgZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG5cdCAgICAgICAgICBoYXNWYWx1ZSA9IHRydWU7XG5cdCAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZnVuY3Rpb24gKGUpIHsgby5vbkVycm9yKGUpOyB9LFxuXHQgICAgICAgIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIGF0RW5kID0gdHJ1ZTtcblx0ICAgICAgICAgIHNvdXJjZVN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICApKTtcblx0XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShcblx0ICAgICAgICBzb3VyY2VTdWJzY3JpcHRpb24sXG5cdCAgICAgICAgc2FtcGxlci5zdWJzY3JpYmUoc2FtcGxlU3Vic2NyaWJlLCBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sIHNhbXBsZVN1YnNjcmliZSlcblx0ICAgICAgKTtcblx0ICAgIH0sIHNvdXJjZSk7XG5cdCAgfVxuXHRcblx0ICAvKipcblx0ICAgKiAgU2FtcGxlcyB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBhdCBlYWNoIGludGVydmFsLlxuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiAgMSAtIHJlcyA9IHNvdXJjZS5zYW1wbGUoc2FtcGxlT2JzZXJ2YWJsZSk7IC8vIFNhbXBsZXIgdGljayBzZXF1ZW5jZVxuXHQgICAqICAyIC0gcmVzID0gc291cmNlLnNhbXBsZSg1MDAwKTsgLy8gNSBzZWNvbmRzXG5cdCAgICogIDIgLSByZXMgPSBzb3VyY2Uuc2FtcGxlKDUwMDAsIFJ4LlNjaGVkdWxlci50aW1lb3V0KTsgLy8gNSBzZWNvbmRzXG5cdCAgICpcblx0ICAgKiBAcGFyYW0ge01peGVkfSBpbnRlcnZhbE9yU2FtcGxlciBJbnRlcnZhbCBhdCB3aGljaCB0byBzYW1wbGUgKHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGRlbm90aW5nIG1pbGxpc2Vjb25kcykgb3IgU2FtcGxlciBPYnNlcnZhYmxlLlxuXHQgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSAgU2NoZWR1bGVyIHRvIHJ1biB0aGUgc2FtcGxpbmcgdGltZXIgb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0aW1lb3V0IHNjaGVkdWxlciBpcyB1c2VkLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBTYW1wbGVkIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnNhbXBsZSA9IG9ic2VydmFibGVQcm90by50aHJvdHRsZUxhdGVzdCA9IGZ1bmN0aW9uIChpbnRlcnZhbE9yU2FtcGxlciwgc2NoZWR1bGVyKSB7XG5cdCAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcblx0ICAgIHJldHVybiB0eXBlb2YgaW50ZXJ2YWxPclNhbXBsZXIgPT09ICdudW1iZXInID9cblx0ICAgICAgc2FtcGxlT2JzZXJ2YWJsZSh0aGlzLCBvYnNlcnZhYmxlaW50ZXJ2YWwoaW50ZXJ2YWxPclNhbXBsZXIsIHNjaGVkdWxlcikpIDpcblx0ICAgICAgc2FtcGxlT2JzZXJ2YWJsZSh0aGlzLCBpbnRlcnZhbE9yU2FtcGxlcik7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFRpbWVvdXRFcnJvciA9IFJ4LlRpbWVvdXRFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcblx0ICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1RpbWVvdXQgaGFzIG9jY3VycmVkJztcblx0ICAgIHRoaXMubmFtZSA9ICdUaW1lb3V0RXJyb3InO1xuXHQgICAgRXJyb3IuY2FsbCh0aGlzKTtcblx0ICB9O1xuXHQgIFRpbWVvdXRFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5cdFxuXHQgIGZ1bmN0aW9uIHRpbWVvdXRXaXRoU2VsZWN0b3Ioc291cmNlLCBmaXJzdFRpbWVvdXQsIHRpbWVvdXREdXJhdGlvblNlbGVjdG9yLCBvdGhlcikge1xuXHQgICAgaWYgKGlzRnVuY3Rpb24oZmlyc3RUaW1lb3V0KSkge1xuXHQgICAgICBvdGhlciA9IHRpbWVvdXREdXJhdGlvblNlbGVjdG9yO1xuXHQgICAgICB0aW1lb3V0RHVyYXRpb25TZWxlY3RvciA9IGZpcnN0VGltZW91dDtcblx0ICAgICAgZmlyc3RUaW1lb3V0ID0gb2JzZXJ2YWJsZU5ldmVyKCk7XG5cdCAgICB9XG5cdCAgICBvdGhlciB8fCAob3RoZXIgPSBvYnNlcnZhYmxlVGhyb3cobmV3IFRpbWVvdXRFcnJvcigpKSk7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksXG5cdCAgICAgICAgdGltZXIgPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpLFxuXHQgICAgICAgIG9yaWdpbmFsID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdFxuXHQgICAgICBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShvcmlnaW5hbCk7XG5cdFxuXHQgICAgICB2YXIgaWQgPSAwLCBzd2l0Y2hlZCA9IGZhbHNlO1xuXHRcblx0ICAgICAgZnVuY3Rpb24gc2V0VGltZXIodGltZW91dCkge1xuXHQgICAgICAgIHZhciBteUlkID0gaWQsIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0XG5cdCAgICAgICAgZnVuY3Rpb24gdGltZXJXaW5zKCkge1xuXHQgICAgICAgICAgc3dpdGNoZWQgPSAobXlJZCA9PT0gaWQpO1xuXHQgICAgICAgICAgcmV0dXJuIHN3aXRjaGVkO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgdGltZXIuc2V0RGlzcG9zYWJsZShkKTtcblx0ICAgICAgICBkLnNldERpc3Bvc2FibGUodGltZW91dC5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgdGltZXJXaW5zKCkgJiYgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUob3RoZXIuc3Vic2NyaWJlKG8pKTtcblx0ICAgICAgICAgIGQuZGlzcG9zZSgpO1xuXHQgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICB0aW1lcldpbnMoKSAmJiBvLm9uRXJyb3IoZSk7XG5cdCAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgdGltZXJXaW5zKCkgJiYgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUob3RoZXIuc3Vic2NyaWJlKG8pKTtcblx0ICAgICAgICB9KSk7XG5cdCAgICAgIH07XG5cdFxuXHQgICAgICBzZXRUaW1lcihmaXJzdFRpbWVvdXQpO1xuXHRcblx0ICAgICAgZnVuY3Rpb24gb1dpbnMoKSB7XG5cdCAgICAgICAgdmFyIHJlcyA9ICFzd2l0Y2hlZDtcblx0ICAgICAgICBpZiAocmVzKSB7IGlkKys7IH1cblx0ICAgICAgICByZXR1cm4gcmVzO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBvcmlnaW5hbC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgICBpZiAob1dpbnMoKSkge1xuXHQgICAgICAgICAgby5vbk5leHQoeCk7XG5cdCAgICAgICAgICB2YXIgdGltZW91dCA9IHRyeUNhdGNoKHRpbWVvdXREdXJhdGlvblNlbGVjdG9yKSh4KTtcblx0ICAgICAgICAgIGlmICh0aW1lb3V0ID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHRpbWVvdXQuZSk7IH1cblx0ICAgICAgICAgIHNldFRpbWVyKGlzUHJvbWlzZSh0aW1lb3V0KSA/IG9ic2VydmFibGVGcm9tUHJvbWlzZSh0aW1lb3V0KSA6IHRpbWVvdXQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSwgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBvV2lucygpICYmIG8ub25FcnJvcihlKTtcblx0ICAgICAgfSwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIG9XaW5zKCkgJiYgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9KSk7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIHRpbWVyKTtcblx0ICAgIH0sIHNvdXJjZSk7XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiB0aW1lb3V0KHNvdXJjZSwgZHVlVGltZSwgb3RoZXIsIHNjaGVkdWxlcikge1xuXHQgICAgaWYgKGlzU2NoZWR1bGVyKG90aGVyKSkge1xuXHQgICAgICBzY2hlZHVsZXIgPSBvdGhlcjtcblx0ICAgICAgb3RoZXIgPSBvYnNlcnZhYmxlVGhyb3cobmV3IFRpbWVvdXRFcnJvcigpKTtcblx0ICAgIH1cblx0ICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEVycm9yKSB7IG90aGVyID0gb2JzZXJ2YWJsZVRocm93KG90aGVyKTsgfVxuXHQgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gZGVmYXVsdFNjaGVkdWxlcik7XG5cdFxuXHQgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBpZCA9IDAsXG5cdCAgICAgICAgb3JpZ2luYWwgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKSxcblx0ICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpLFxuXHQgICAgICAgIHN3aXRjaGVkID0gZmFsc2UsXG5cdCAgICAgICAgdGltZXIgPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpO1xuXHRcblx0ICAgICAgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUob3JpZ2luYWwpO1xuXHRcblx0ICAgICAgZnVuY3Rpb24gY3JlYXRlVGltZXIoKSB7XG5cdCAgICAgICAgdmFyIG15SWQgPSBpZDtcblx0ICAgICAgICB0aW1lci5zZXREaXNwb3NhYmxlKHNjaGVkdWxlci5zY2hlZHVsZUZ1dHVyZShudWxsLCBkdWVUaW1lLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICBzd2l0Y2hlZCA9IGlkID09PSBteUlkO1xuXHQgICAgICAgICAgaWYgKHN3aXRjaGVkKSB7XG5cdCAgICAgICAgICAgIGlzUHJvbWlzZShvdGhlcikgJiYgKG90aGVyID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKG90aGVyKSk7XG5cdCAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG90aGVyLnN1YnNjcmliZShvKSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSkpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBjcmVhdGVUaW1lcigpO1xuXHRcblx0ICAgICAgb3JpZ2luYWwuc2V0RGlzcG9zYWJsZShzb3VyY2Uuc3Vic2NyaWJlKGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgICAgaWYgKCFzd2l0Y2hlZCkge1xuXHQgICAgICAgICAgaWQrKztcblx0ICAgICAgICAgIG8ub25OZXh0KHgpO1xuXHQgICAgICAgICAgY3JlYXRlVGltZXIoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgaWYgKCFzd2l0Y2hlZCkge1xuXHQgICAgICAgICAgaWQrKztcblx0ICAgICAgICAgIG8ub25FcnJvcihlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoIXN3aXRjaGVkKSB7XG5cdCAgICAgICAgICBpZCsrO1xuXHQgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSkpO1xuXHQgICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9uLCB0aW1lcik7XG5cdCAgICB9LCBzb3VyY2UpO1xuXHQgIH1cblx0XG5cdCAgb2JzZXJ2YWJsZVByb3RvLnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgZmlyc3RBcmcgPSBhcmd1bWVudHNbMF07XG5cdCAgICBpZiAoZmlyc3RBcmcgaW5zdGFuY2VvZiBEYXRlIHx8IHR5cGVvZiBmaXJzdEFyZyA9PT0gJ251bWJlcicpIHtcblx0ICAgICAgcmV0dXJuIHRpbWVvdXQodGhpcywgZmlyc3RBcmcsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcblx0ICAgIH0gZWxzZSBpZiAoT2JzZXJ2YWJsZS5pc09ic2VydmFibGUoZmlyc3RBcmcpIHx8IGlzRnVuY3Rpb24oZmlyc3RBcmcpKSB7XG5cdCAgICAgIHJldHVybiB0aW1lb3V0V2l0aFNlbGVjdG9yKHRoaXMsIGZpcnN0QXJnLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzJyk7XG5cdCAgICB9XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgb25seSB0aGUgZmlyc3QgaXRlbSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBkdXJpbmcgc2VxdWVudGlhbCB0aW1lIHdpbmRvd3Mgb2YgYSBzcGVjaWZpZWQgZHVyYXRpb24uXG5cdCAgICogQHBhcmFtIHtOdW1iZXJ9IHdpbmRvd0R1cmF0aW9uIHRpbWUgdG8gd2FpdCBiZWZvcmUgZW1pdHRpbmcgYW5vdGhlciBpdGVtIGFmdGVyIGVtaXR0aW5nIHRoZSBsYXN0IGl0ZW1cblx0ICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gdGhlIFNjaGVkdWxlciB0byB1c2UgaW50ZXJuYWxseSB0byBtYW5hZ2UgdGhlIHRpbWVycyB0aGF0IGhhbmRsZSB0aW1lb3V0IGZvciBlYWNoIGl0ZW0uIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gU2NoZWR1bGVyLnRpbWVvdXQuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgdGhhdCBwZXJmb3JtcyB0aGUgdGhyb3R0bGUgb3BlcmF0aW9uLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by50aHJvdHRsZSA9IGZ1bmN0aW9uICh3aW5kb3dEdXJhdGlvbiwgc2NoZWR1bGVyKSB7XG5cdCAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcblx0ICAgIHZhciBkdXJhdGlvbiA9ICt3aW5kb3dEdXJhdGlvbiB8fCAwO1xuXHQgICAgaWYgKGR1cmF0aW9uIDw9IDApIHsgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3dpbmRvd0R1cmF0aW9uIGNhbm5vdCBiZSBsZXNzIG9yIGVxdWFsIHplcm8uJyk7IH1cblx0ICAgIHZhciBzb3VyY2UgPSB0aGlzO1xuXHQgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBsYXN0T25OZXh0ID0gMDtcblx0ICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUoXG5cdCAgICAgICAgZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgICAgIHZhciBub3cgPSBzY2hlZHVsZXIubm93KCk7XG5cdCAgICAgICAgICBpZiAobGFzdE9uTmV4dCA9PT0gMCB8fCBub3cgLSBsYXN0T25OZXh0ID49IGR1cmF0aW9uKSB7XG5cdCAgICAgICAgICAgIGxhc3RPbk5leHQgPSBub3c7XG5cdCAgICAgICAgICAgIG8ub25OZXh0KHgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0sZnVuY3Rpb24gKGUpIHsgby5vbkVycm9yKGUpOyB9LCBmdW5jdGlvbiAoKSB7IG8ub25Db21wbGV0ZWQoKTsgfVxuXHQgICAgICApO1xuXHQgICAgfSwgc291cmNlKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgUGF1c2FibGVPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFBhdXNhYmxlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFBhdXNhYmxlT2JzZXJ2YWJsZShzb3VyY2UsIHBhdXNlcikge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IFN1YmplY3QoKTtcblx0XG5cdCAgICAgIGlmIChwYXVzZXIgJiYgcGF1c2VyLnN1YnNjcmliZSkge1xuXHQgICAgICAgIHRoaXMucGF1c2VyID0gdGhpcy5jb250cm9sbGVyLm1lcmdlKHBhdXNlcik7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5wYXVzZXIgPSB0aGlzLmNvbnRyb2xsZXI7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFBhdXNhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBjb25uID0gdGhpcy5zb3VyY2UucHVibGlzaCgpLFxuXHQgICAgICAgIHN1YnNjcmlwdGlvbiA9IGNvbm4uc3Vic2NyaWJlKG8pLFxuXHQgICAgICAgIGNvbm5lY3Rpb24gPSBkaXNwb3NhYmxlRW1wdHk7XG5cdFxuXHQgICAgICB2YXIgcGF1c2FibGUgPSB0aGlzLnBhdXNlci5kaXN0aW5jdFVudGlsQ2hhbmdlZCgpLnN1YnNjcmliZShmdW5jdGlvbiAoYikge1xuXHQgICAgICAgIGlmIChiKSB7XG5cdCAgICAgICAgICBjb25uZWN0aW9uID0gY29ubi5jb25uZWN0KCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGNvbm5lY3Rpb24uZGlzcG9zZSgpO1xuXHQgICAgICAgICAgY29ubmVjdGlvbiA9IGRpc3Bvc2FibGVFbXB0eTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgcmV0dXJuIG5ldyBOQXJ5RGlzcG9zYWJsZShbc3Vic2NyaXB0aW9uLCBjb25uZWN0aW9uLCBwYXVzYWJsZV0pO1xuXHQgICAgfTtcblx0XG5cdCAgICBQYXVzYWJsZU9ic2VydmFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmNvbnRyb2xsZXIub25OZXh0KGZhbHNlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgUGF1c2FibGVPYnNlcnZhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuY29udHJvbGxlci5vbk5leHQodHJ1ZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBQYXVzYWJsZU9ic2VydmFibGU7XG5cdFxuXHQgIH0oT2JzZXJ2YWJsZSkpO1xuXHRcblx0ICAvKipcblx0ICAgKiBQYXVzZXMgdGhlIHVuZGVybHlpbmcgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBiYXNlZCB1cG9uIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIHlpZWxkcyB0cnVlL2ZhbHNlLlxuXHQgICAqIEBleGFtcGxlXG5cdCAgICogdmFyIHBhdXNlciA9IG5ldyBSeC5TdWJqZWN0KCk7XG5cdCAgICogdmFyIHNvdXJjZSA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwKS5wYXVzYWJsZShwYXVzZXIpO1xuXHQgICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gcGF1c2VyIFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHVzZWQgdG8gcGF1c2UgdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIGlzIHBhdXNlZCBiYXNlZCB1cG9uIHRoZSBwYXVzZXIuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnBhdXNhYmxlID0gZnVuY3Rpb24gKHBhdXNlcikge1xuXHQgICAgcmV0dXJuIG5ldyBQYXVzYWJsZU9ic2VydmFibGUodGhpcywgcGF1c2VyKTtcblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBjb21iaW5lTGF0ZXN0U291cmNlKHNvdXJjZSwgc3ViamVjdCwgcmVzdWx0U2VsZWN0b3IpIHtcblx0ICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgaGFzVmFsdWUgPSBbZmFsc2UsIGZhbHNlXSxcblx0ICAgICAgICBoYXNWYWx1ZUFsbCA9IGZhbHNlLFxuXHQgICAgICAgIGlzRG9uZSA9IGZhbHNlLFxuXHQgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheSgyKSxcblx0ICAgICAgICBlcnI7XG5cdFxuXHQgICAgICBmdW5jdGlvbiBuZXh0KHgsIGkpIHtcblx0ICAgICAgICB2YWx1ZXNbaV0gPSB4O1xuXHQgICAgICAgIGhhc1ZhbHVlW2ldID0gdHJ1ZTtcblx0ICAgICAgICBpZiAoaGFzVmFsdWVBbGwgfHwgKGhhc1ZhbHVlQWxsID0gaGFzVmFsdWUuZXZlcnkoaWRlbnRpdHkpKSkge1xuXHQgICAgICAgICAgaWYgKGVycikgeyByZXR1cm4gby5vbkVycm9yKGVycik7IH1cblx0ICAgICAgICAgIHZhciByZXMgPSB0cnlDYXRjaChyZXN1bHRTZWxlY3RvcikuYXBwbHkobnVsbCwgdmFsdWVzKTtcblx0ICAgICAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IocmVzLmUpOyB9XG5cdCAgICAgICAgICBvLm9uTmV4dChyZXMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpc0RvbmUgJiYgdmFsdWVzWzFdICYmIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKFxuXHQgICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoXG5cdCAgICAgICAgICBmdW5jdGlvbiAoeCkge1xuXHQgICAgICAgICAgICBuZXh0KHgsIDApO1xuXHQgICAgICAgICAgfSxcblx0ICAgICAgICAgIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgIGlmICh2YWx1ZXNbMV0pIHtcblx0ICAgICAgICAgICAgICBvLm9uRXJyb3IoZSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgZXJyID0gZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfSxcblx0ICAgICAgICAgIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaXNEb25lID0gdHJ1ZTtcblx0ICAgICAgICAgICAgdmFsdWVzWzFdICYmIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICAgIH0pLFxuXHQgICAgICAgIHN1YmplY3Quc3Vic2NyaWJlKFxuXHQgICAgICAgICAgZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgICAgICAgbmV4dCh4LCAxKTtcblx0ICAgICAgICAgIH0sXG5cdCAgICAgICAgICBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sXG5cdCAgICAgICAgICBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlzRG9uZSA9IHRydWU7XG5cdCAgICAgICAgICAgIG5leHQodHJ1ZSwgMSk7XG5cdCAgICAgICAgICB9KVxuXHQgICAgICAgICk7XG5cdCAgICB9LCBzb3VyY2UpO1xuXHQgIH1cblx0XG5cdCAgdmFyIFBhdXNhYmxlQnVmZmVyZWRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFBhdXNhYmxlQnVmZmVyZWRPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUoc291cmNlLCBwYXVzZXIpIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBTdWJqZWN0KCk7XG5cdFxuXHQgICAgICBpZiAocGF1c2VyICYmIHBhdXNlci5zdWJzY3JpYmUpIHtcblx0ICAgICAgICB0aGlzLnBhdXNlciA9IHRoaXMuY29udHJvbGxlci5tZXJnZShwYXVzZXIpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMucGF1c2VyID0gdGhpcy5jb250cm9sbGVyO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBxID0gW10sIHByZXZpb3VzU2hvdWxkRmlyZTtcblx0XG5cdCAgICAgIGZ1bmN0aW9uIGRyYWluUXVldWUoKSB7IHdoaWxlIChxLmxlbmd0aCA+IDApIHsgby5vbk5leHQocS5zaGlmdCgpKTsgfSB9XG5cdFxuXHQgICAgICB2YXIgc3Vic2NyaXB0aW9uID1cblx0ICAgICAgICBjb21iaW5lTGF0ZXN0U291cmNlKFxuXHQgICAgICAgICAgdGhpcy5zb3VyY2UsXG5cdCAgICAgICAgICB0aGlzLnBhdXNlci5zdGFydFdpdGgoZmFsc2UpLmRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG5cdCAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc2hvdWxkRmlyZSkge1xuXHQgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBkYXRhLCBzaG91bGRGaXJlOiBzaG91bGRGaXJlIH07XG5cdCAgICAgICAgICB9KVxuXHQgICAgICAgICAgLnN1YnNjcmliZShcblx0ICAgICAgICAgICAgZnVuY3Rpb24gKHJlc3VsdHMpIHtcblx0ICAgICAgICAgICAgICBpZiAocHJldmlvdXNTaG91bGRGaXJlICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0cy5zaG91bGRGaXJlICE9PSBwcmV2aW91c1Nob3VsZEZpcmUpIHtcblx0ICAgICAgICAgICAgICAgIHByZXZpb3VzU2hvdWxkRmlyZSA9IHJlc3VsdHMuc2hvdWxkRmlyZTtcblx0ICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBpbiBzaG91bGRGaXJlXG5cdCAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5zaG91bGRGaXJlKSB7IGRyYWluUXVldWUoKTsgfVxuXHQgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBwcmV2aW91c1Nob3VsZEZpcmUgPSByZXN1bHRzLnNob3VsZEZpcmU7XG5cdCAgICAgICAgICAgICAgICAvLyBuZXcgZGF0YVxuXHQgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMuc2hvdWxkRmlyZSkge1xuXHQgICAgICAgICAgICAgICAgICBvLm9uTmV4dChyZXN1bHRzLmRhdGEpO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgcS5wdXNoKHJlc3VsdHMuZGF0YSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgZHJhaW5RdWV1ZSgpO1xuXHQgICAgICAgICAgICAgIG8ub25FcnJvcihlcnIpO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgZHJhaW5RdWV1ZSgpO1xuXHQgICAgICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgKTtcblx0ICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsgICAgICBcblx0ICAgIH07XG5cdFxuXHQgICAgUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmNvbnRyb2xsZXIub25OZXh0KGZhbHNlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5jb250cm9sbGVyLm9uTmV4dCh0cnVlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFBhdXNhYmxlQnVmZmVyZWRPYnNlcnZhYmxlO1xuXHRcblx0ICB9KE9ic2VydmFibGUpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogUGF1c2VzIHRoZSB1bmRlcmx5aW5nIG9ic2VydmFibGUgc2VxdWVuY2UgYmFzZWQgdXBvbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aGljaCB5aWVsZHMgdHJ1ZS9mYWxzZSxcblx0ICAgKiBhbmQgeWllbGRzIHRoZSB2YWx1ZXMgdGhhdCB3ZXJlIGJ1ZmZlcmVkIHdoaWxlIHBhdXNlZC5cblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqIHZhciBwYXVzZXIgPSBuZXcgUnguU3ViamVjdCgpO1xuXHQgICAqIHZhciBzb3VyY2UgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMCkucGF1c2FibGVCdWZmZXJlZChwYXVzZXIpO1xuXHQgICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gcGF1c2VyIFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHVzZWQgdG8gcGF1c2UgdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIGlzIHBhdXNlZCBiYXNlZCB1cG9uIHRoZSBwYXVzZXIuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnBhdXNhYmxlQnVmZmVyZWQgPSBmdW5jdGlvbiAoc3ViamVjdCkge1xuXHQgICAgcmV0dXJuIG5ldyBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZSh0aGlzLCBzdWJqZWN0KTtcblx0ICB9O1xuXHRcblx0ICB2YXIgQ29udHJvbGxlZE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQ29udHJvbGxlZE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBDb250cm9sbGVkT2JzZXJ2YWJsZSAoc291cmNlLCBlbmFibGVRdWV1ZSwgc2NoZWR1bGVyKSB7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgICB0aGlzLnN1YmplY3QgPSBuZXcgQ29udHJvbGxlZFN1YmplY3QoZW5hYmxlUXVldWUsIHNjaGVkdWxlcik7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlLm11bHRpY2FzdCh0aGlzLnN1YmplY3QpLnJlZkNvdW50KCk7XG5cdCAgICB9XG5cdFxuXHQgICAgQ29udHJvbGxlZE9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG8pO1xuXHQgICAgfTtcblx0XG5cdCAgICBDb250cm9sbGVkT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIChudW1iZXJPZkl0ZW1zKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnN1YmplY3QucmVxdWVzdChudW1iZXJPZkl0ZW1zID09IG51bGwgPyAtMSA6IG51bWJlck9mSXRlbXMpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gQ29udHJvbGxlZE9ic2VydmFibGU7XG5cdFxuXHQgIH0oT2JzZXJ2YWJsZSkpO1xuXHRcblx0ICB2YXIgQ29udHJvbGxlZFN1YmplY3QgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQ29udHJvbGxlZFN1YmplY3QsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBDb250cm9sbGVkU3ViamVjdChlbmFibGVRdWV1ZSwgc2NoZWR1bGVyKSB7XG5cdCAgICAgIGVuYWJsZVF1ZXVlID09IG51bGwgJiYgKGVuYWJsZVF1ZXVlID0gdHJ1ZSk7XG5cdFxuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgICAgdGhpcy5zdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcblx0ICAgICAgdGhpcy5lbmFibGVRdWV1ZSA9IGVuYWJsZVF1ZXVlO1xuXHQgICAgICB0aGlzLnF1ZXVlID0gZW5hYmxlUXVldWUgPyBbXSA6IG51bGw7XG5cdCAgICAgIHRoaXMucmVxdWVzdGVkQ291bnQgPSAwO1xuXHQgICAgICB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUgPSBudWxsO1xuXHQgICAgICB0aGlzLmVycm9yID0gbnVsbDtcblx0ICAgICAgdGhpcy5oYXNGYWlsZWQgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXIgfHwgY3VycmVudFRocmVhZFNjaGVkdWxlcjtcblx0ICAgIH1cblx0XG5cdCAgICBhZGRQcm9wZXJ0aWVzKENvbnRyb2xsZWRTdWJqZWN0LnByb3RvdHlwZSwgT2JzZXJ2ZXIsIHtcblx0ICAgICAgX3N1YnNjcmliZTogZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5zdWJqZWN0LnN1YnNjcmliZShvKTtcblx0ICAgICAgfSxcblx0ICAgICAgb25Db21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IHRydWU7XG5cdCAgICAgICAgaWYgKCF0aGlzLmVuYWJsZVF1ZXVlIHx8IHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICB0aGlzLnN1YmplY3Qub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICAgIHRoaXMuZGlzcG9zZUN1cnJlbnRSZXF1ZXN0KCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMucXVldWUucHVzaChOb3RpZmljYXRpb24uY3JlYXRlT25Db21wbGV0ZWQoKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgICB0aGlzLmhhc0ZhaWxlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuXHQgICAgICAgIGlmICghdGhpcy5lbmFibGVRdWV1ZSB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgICAgdGhpcy5zdWJqZWN0Lm9uRXJyb3IoZXJyb3IpO1xuXHQgICAgICAgICAgdGhpcy5kaXNwb3NlQ3VycmVudFJlcXVlc3QoKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKE5vdGlmaWNhdGlvbi5jcmVhdGVPbkVycm9yKGVycm9yKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICBvbk5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIGlmICh0aGlzLnJlcXVlc3RlZENvdW50IDw9IDApIHtcblx0ICAgICAgICAgIHRoaXMuZW5hYmxlUXVldWUgJiYgdGhpcy5xdWV1ZS5wdXNoKE5vdGlmaWNhdGlvbi5jcmVhdGVPbk5leHQodmFsdWUpKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgKHRoaXMucmVxdWVzdGVkQ291bnQtLSA9PT0gMCkgJiYgdGhpcy5kaXNwb3NlQ3VycmVudFJlcXVlc3QoKTtcblx0ICAgICAgICAgIHRoaXMuc3ViamVjdC5vbk5leHQodmFsdWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgX3Byb2Nlc3NSZXF1ZXN0OiBmdW5jdGlvbiAobnVtYmVyT2ZJdGVtcykge1xuXHQgICAgICAgIGlmICh0aGlzLmVuYWJsZVF1ZXVlKSB7XG5cdCAgICAgICAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwICYmIChudW1iZXJPZkl0ZW1zID4gMCB8fCB0aGlzLnF1ZXVlWzBdLmtpbmQgIT09ICdOJykpIHtcblx0ICAgICAgICAgICAgdmFyIGZpcnN0ID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuXHQgICAgICAgICAgICBmaXJzdC5hY2NlcHQodGhpcy5zdWJqZWN0KTtcblx0ICAgICAgICAgICAgaWYgKGZpcnN0LmtpbmQgPT09ICdOJykge1xuXHQgICAgICAgICAgICAgIG51bWJlck9mSXRlbXMtLTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VDdXJyZW50UmVxdWVzdCgpO1xuXHQgICAgICAgICAgICAgIHRoaXMucXVldWUgPSBbXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgcmV0dXJuIG51bWJlck9mSXRlbXM7XG5cdCAgICAgIH0sXG5cdCAgICAgIHJlcXVlc3Q6IGZ1bmN0aW9uIChudW1iZXIpIHtcblx0ICAgICAgICB0aGlzLmRpc3Bvc2VDdXJyZW50UmVxdWVzdCgpO1xuXHQgICAgICAgIHZhciBzZWxmID0gdGhpcztcblx0XG5cdCAgICAgICAgdGhpcy5yZXF1ZXN0ZWREaXNwb3NhYmxlID0gdGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUobnVtYmVyLFxuXHQgICAgICAgIGZ1bmN0aW9uKHMsIGkpIHtcblx0ICAgICAgICAgIHZhciByZW1haW5pbmcgPSBzZWxmLl9wcm9jZXNzUmVxdWVzdChpKTtcblx0ICAgICAgICAgIHZhciBzdG9wcGVkID0gc2VsZi5oYXNDb21wbGV0ZWQgfHwgc2VsZi5oYXNGYWlsZWQ7XG5cdCAgICAgICAgICBpZiAoIXN0b3BwZWQgJiYgcmVtYWluaW5nID4gMCkge1xuXHQgICAgICAgICAgICBzZWxmLnJlcXVlc3RlZENvdW50ID0gcmVtYWluaW5nO1xuXHRcblx0ICAgICAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGVDcmVhdGUoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgIHNlbGYucmVxdWVzdGVkQ291bnQgPSAwO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAvLyBTY2hlZHVsZWQgaXRlbSBpcyBzdGlsbCBpbiBwcm9ncmVzcy4gUmV0dXJuIGEgbmV3XG5cdCAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSB0byBhbGxvdyB0aGUgcmVxdWVzdCB0byBiZSBpbnRlcnJ1cHRlZFxuXHQgICAgICAgICAgICAgIC8vIHZpYSBkaXNwb3NlLlxuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHRcblx0ICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0ZWREaXNwb3NhYmxlO1xuXHQgICAgICB9LFxuXHQgICAgICBkaXNwb3NlQ3VycmVudFJlcXVlc3Q6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5yZXF1ZXN0ZWREaXNwb3NhYmxlKSB7XG5cdCAgICAgICAgICB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUuZGlzcG9zZSgpO1xuXHQgICAgICAgICAgdGhpcy5yZXF1ZXN0ZWREaXNwb3NhYmxlID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHRcblx0ICAgIHJldHVybiBDb250cm9sbGVkU3ViamVjdDtcblx0ICB9KE9ic2VydmFibGUpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogQXR0YWNoZXMgYSBjb250cm9sbGVyIHRvIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdpdGggdGhlIGFiaWxpdHkgdG8gcXVldWUuXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiB2YXIgc291cmNlID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDApLmNvbnRyb2xsZWQoKTtcblx0ICAgKiBzb3VyY2UucmVxdWVzdCgzKTsgLy8gUmVhZHMgMyB2YWx1ZXNcblx0ICAgKiBAcGFyYW0ge2Jvb2x9IGVuYWJsZVF1ZXVlIHRydXRoeSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdmFsdWVzIHNob3VsZCBiZSBxdWV1ZWQgcGVuZGluZyB0aGUgbmV4dCByZXF1ZXN0XG5cdCAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciBkZXRlcm1pbmVzIGhvdyB0aGUgcmVxdWVzdHMgd2lsbCBiZSBzY2hlZHVsZWRcblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hpY2ggb25seSBwcm9wYWdhdGVzIHZhbHVlcyBvbiByZXF1ZXN0LlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5jb250cm9sbGVkID0gZnVuY3Rpb24gKGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpIHtcblx0XG5cdCAgICBpZiAoZW5hYmxlUXVldWUgJiYgaXNTY2hlZHVsZXIoZW5hYmxlUXVldWUpKSB7XG5cdCAgICAgIHNjaGVkdWxlciA9IGVuYWJsZVF1ZXVlO1xuXHQgICAgICBlbmFibGVRdWV1ZSA9IHRydWU7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKGVuYWJsZVF1ZXVlID09IG51bGwpIHsgIGVuYWJsZVF1ZXVlID0gdHJ1ZTsgfVxuXHQgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkT2JzZXJ2YWJsZSh0aGlzLCBlbmFibGVRdWV1ZSwgc2NoZWR1bGVyKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBQaXBlcyB0aGUgZXhpc3RpbmcgT2JzZXJ2YWJsZSBzZXF1ZW5jZSBpbnRvIGEgTm9kZS5qcyBTdHJlYW0uXG5cdCAgICogQHBhcmFtIHtTdHJlYW19IGRlc3QgVGhlIGRlc3RpbmF0aW9uIE5vZGUuanMgc3RyZWFtLlxuXHQgICAqIEByZXR1cm5zIHtTdHJlYW19IFRoZSBkZXN0aW5hdGlvbiBzdHJlYW0uXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuXHQgICAgdmFyIHNvdXJjZSA9IHRoaXMucGF1c2FibGVCdWZmZXJlZCgpO1xuXHRcblx0ICAgIGZ1bmN0aW9uIG9uRHJhaW4oKSB7XG5cdCAgICAgIHNvdXJjZS5yZXN1bWUoKTtcblx0ICAgIH1cblx0XG5cdCAgICBkZXN0LmFkZExpc3RlbmVyKCdkcmFpbicsIG9uRHJhaW4pO1xuXHRcblx0ICAgIHNvdXJjZS5zdWJzY3JpYmUoXG5cdCAgICAgIGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgICAgIWRlc3Qud3JpdGUoU3RyaW5nKHgpKSAmJiBzb3VyY2UucGF1c2UoKTtcblx0ICAgICAgfSxcblx0ICAgICAgZnVuY3Rpb24gKGVycikge1xuXHQgICAgICAgIGRlc3QuZW1pdCgnZXJyb3InLCBlcnIpO1xuXHQgICAgICB9LFxuXHQgICAgICBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gSGFjayBjaGVjayBiZWNhdXNlIFNURElPIGlzIG5vdCBjbG9zYWJsZVxuXHQgICAgICAgICFkZXN0Ll9pc1N0ZGlvICYmIGRlc3QuZW5kKCk7XG5cdCAgICAgICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbkRyYWluKTtcblx0ICAgICAgfSk7XG5cdFxuXHQgICAgc291cmNlLnJlc3VtZSgpO1xuXHRcblx0ICAgIHJldHVybiBkZXN0O1xuXHQgIH07XG5cdFxuXHQgIHZhciBUcmFuc2R1Y2VPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhUcmFuc2R1Y2VPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFRyYW5zZHVjZU9ic2VydmVyKG8sIHhmb3JtKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl94Zm9ybSA9IHhmb3JtO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBUcmFuc2R1Y2VPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh0aGlzLl94Zm9ybVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSkuY2FsbCh0aGlzLl94Zm9ybSwgdGhpcy5fbywgeCk7XG5cdCAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHRoaXMuX28ub25FcnJvcihyZXMuZSk7IH1cblx0ICAgIH07XG5cdFxuXHQgICAgVHJhbnNkdWNlT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHsgdGhpcy5fby5vbkVycm9yKGUpOyB9O1xuXHRcblx0ICAgIFRyYW5zZHVjZU9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX3hmb3JtWydAQHRyYW5zZHVjZXIvcmVzdWx0J10odGhpcy5fbyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBUcmFuc2R1Y2VPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgZnVuY3Rpb24gdHJhbnNmb3JtRm9yT2JzZXJ2ZXIobykge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgJ0BAdHJhbnNkdWNlci9pbml0JzogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgcmV0dXJuIG87XG5cdCAgICAgIH0sXG5cdCAgICAgICdAQHRyYW5zZHVjZXIvc3RlcCc6IGZ1bmN0aW9uKG9icywgaW5wdXQpIHtcblx0ICAgICAgICByZXR1cm4gb2JzLm9uTmV4dChpbnB1dCk7XG5cdCAgICAgIH0sXG5cdCAgICAgICdAQHRyYW5zZHVjZXIvcmVzdWx0JzogZnVuY3Rpb24ob2JzKSB7XG5cdCAgICAgICAgcmV0dXJuIG9icy5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgIH1cblx0XG5cdCAgLyoqXG5cdCAgICogRXhlY3V0ZXMgYSB0cmFuc2R1Y2VyIHRvIHRyYW5zZm9ybSB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZVxuXHQgICAqIEBwYXJhbSB7VHJhbnNkdWNlcn0gdHJhbnNkdWNlciBBIHRyYW5zZHVjZXIgdG8gZXhlY3V0ZVxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMgZnJvbSB0aGUgdHJhbnNkdWNlci5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8udHJhbnNkdWNlID0gZnVuY3Rpb24odHJhbnNkdWNlcikge1xuXHQgICAgdmFyIHNvdXJjZSA9IHRoaXM7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24obykge1xuXHQgICAgICB2YXIgeGZvcm0gPSB0cmFuc2R1Y2VyKHRyYW5zZm9ybUZvck9ic2VydmVyKG8pKTtcblx0ICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRyYW5zZHVjZU9ic2VydmVyKG8sIHhmb3JtKSk7XG5cdCAgICB9LCBzb3VyY2UpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBBbm9ueW1vdXNPYnNlcnZhYmxlID0gUnguQW5vbnltb3VzT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhBbm9ueW1vdXNPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIC8vIEZpeCBzdWJzY3JpYmVyIHRvIGNoZWNrIGZvciB1bmRlZmluZWQgb3IgZnVuY3Rpb24gcmV0dXJuZWQgdG8gZGVjb3JhdGUgYXMgRGlzcG9zYWJsZVxuXHQgICAgZnVuY3Rpb24gZml4U3Vic2NyaWJlcihzdWJzY3JpYmVyKSB7XG5cdCAgICAgIHJldHVybiBzdWJzY3JpYmVyICYmIGlzRnVuY3Rpb24oc3Vic2NyaWJlci5kaXNwb3NlKSA/IHN1YnNjcmliZXIgOlxuXHQgICAgICAgIGlzRnVuY3Rpb24oc3Vic2NyaWJlcikgPyBkaXNwb3NhYmxlQ3JlYXRlKHN1YnNjcmliZXIpIDogZGlzcG9zYWJsZUVtcHR5O1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIHNldERpc3Bvc2FibGUocywgc3RhdGUpIHtcblx0ICAgICAgdmFyIGFkbyA9IHN0YXRlWzBdLCBzZWxmID0gc3RhdGVbMV07XG5cdCAgICAgIHZhciBzdWIgPSB0cnlDYXRjaChzZWxmLl9fc3Vic2NyaWJlKS5jYWxsKHNlbGYsIGFkbyk7XG5cdCAgICAgIGlmIChzdWIgPT09IGVycm9yT2JqICYmICFhZG8uZmFpbChlcnJvck9iai5lKSkgeyB0aHJvd2VyKGVycm9yT2JqLmUpOyB9XG5cdCAgICAgIGFkby5zZXREaXNwb3NhYmxlKGZpeFN1YnNjcmliZXIoc3ViKSk7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gQW5vbnltb3VzT2JzZXJ2YWJsZShzdWJzY3JpYmUsIHBhcmVudCkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHBhcmVudDtcblx0ICAgICAgdGhpcy5fX3N1YnNjcmliZSA9IHN1YnNjcmliZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgQW5vbnltb3VzT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBhZG8gPSBuZXcgQXV0b0RldGFjaE9ic2VydmVyKG8pLCBzdGF0ZSA9IFthZG8sIHRoaXNdO1xuXHRcblx0ICAgICAgaWYgKGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGVSZXF1aXJlZCgpKSB7XG5cdCAgICAgICAgY3VycmVudFRocmVhZFNjaGVkdWxlci5zY2hlZHVsZShzdGF0ZSwgc2V0RGlzcG9zYWJsZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgc2V0RGlzcG9zYWJsZShudWxsLCBzdGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGFkbztcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIEFub255bW91c09ic2VydmFibGU7XG5cdFxuXHQgIH0oT2JzZXJ2YWJsZSkpO1xuXHRcblx0ICB2YXIgQXV0b0RldGFjaE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKEF1dG9EZXRhY2hPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0XG5cdCAgICBmdW5jdGlvbiBBdXRvRGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcblx0ICAgICAgdGhpcy5tID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICB9XG5cdFxuXHQgICAgdmFyIEF1dG9EZXRhY2hPYnNlcnZlclByb3RvdHlwZSA9IEF1dG9EZXRhY2hPYnNlcnZlci5wcm90b3R5cGU7XG5cdFxuXHQgICAgQXV0b0RldGFjaE9ic2VydmVyUHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMub2JzZXJ2ZXIub25OZXh0KS5jYWxsKHRoaXMub2JzZXJ2ZXIsIHZhbHVlKTtcblx0ICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmopIHtcblx0ICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aHJvd2VyKHJlc3VsdC5lKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0XG5cdCAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgIHZhciByZXN1bHQgPSB0cnlDYXRjaCh0aGlzLm9ic2VydmVyLm9uRXJyb3IpLmNhbGwodGhpcy5vYnNlcnZlciwgZXJyKTtcblx0ICAgICAgdGhpcy5kaXNwb3NlKCk7XG5cdCAgICAgIHJlc3VsdCA9PT0gZXJyb3JPYmogJiYgdGhyb3dlcihyZXN1bHQuZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIEF1dG9EZXRhY2hPYnNlcnZlclByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciByZXN1bHQgPSB0cnlDYXRjaCh0aGlzLm9ic2VydmVyLm9uQ29tcGxldGVkKS5jYWxsKHRoaXMub2JzZXJ2ZXIpO1xuXHQgICAgICB0aGlzLmRpc3Bvc2UoKTtcblx0ICAgICAgcmVzdWx0ID09PSBlcnJvck9iaiAmJiB0aHJvd2VyKHJlc3VsdC5lKTtcblx0ICAgIH07XG5cdFxuXHQgICAgQXV0b0RldGFjaE9ic2VydmVyUHJvdG90eXBlLnNldERpc3Bvc2FibGUgPSBmdW5jdGlvbiAodmFsdWUpIHsgdGhpcy5tLnNldERpc3Bvc2FibGUodmFsdWUpOyB9O1xuXHQgICAgQXV0b0RldGFjaE9ic2VydmVyUHJvdG90eXBlLmdldERpc3Bvc2FibGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm0uZ2V0RGlzcG9zYWJsZSgpOyB9O1xuXHRcblx0ICAgIEF1dG9EZXRhY2hPYnNlcnZlclByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBfX3N1cGVyX18ucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgdGhpcy5tLmRpc3Bvc2UoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIEF1dG9EZXRhY2hPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgdmFyIElubmVyU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKHMsIG8pIHtcblx0ICAgIHRoaXMuX3MgPSBzO1xuXHQgICAgdGhpcy5fbyA9IG87XG5cdCAgfTtcblx0XG5cdCAgSW5uZXJTdWJzY3JpcHRpb24ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAoIXRoaXMuX3MuaXNEaXNwb3NlZCAmJiB0aGlzLl9vICE9PSBudWxsKSB7XG5cdCAgICAgIHZhciBpZHggPSB0aGlzLl9zLm9ic2VydmVycy5pbmRleE9mKHRoaXMuX28pO1xuXHQgICAgICB0aGlzLl9zLm9ic2VydmVycy5zcGxpY2UoaWR4LCAxKTtcblx0ICAgICAgdGhpcy5fbyA9IG51bGw7XG5cdCAgICB9XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJlcHJlc2VudHMgYW4gb2JqZWN0IHRoYXQgaXMgYm90aCBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGFzIHdlbGwgYXMgYW4gb2JzZXJ2ZXIuXG5cdCAgICogIEVhY2ggbm90aWZpY2F0aW9uIGlzIGJyb2FkY2FzdGVkIHRvIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycy5cblx0ICAgKi9cblx0ICB2YXIgU3ViamVjdCA9IFJ4LlN1YmplY3QgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoU3ViamVjdCwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFN1YmplY3QoKSB7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5vYnNlcnZlcnMgPSBbXTtcblx0ICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuXHQgICAgfVxuXHRcblx0ICAgIGFkZFByb3BlcnRpZXMoU3ViamVjdC5wcm90b3R5cGUsIE9ic2VydmVyLnByb3RvdHlwZSwge1xuXHQgICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChvKTtcblx0ICAgICAgICAgIHJldHVybiBuZXcgSW5uZXJTdWJzY3JpcHRpb24odGhpcywgbyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmhhc0Vycm9yKSB7XG5cdCAgICAgICAgICBvLm9uRXJyb3IodGhpcy5lcnJvcik7XG5cdCAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGVFbXB0eTtcblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdWJqZWN0IGhhcyBvYnNlcnZlcnMgc3Vic2NyaWJlZCB0byBpdC5cblx0ICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdWJqZWN0IGhhcyBvYnNlcnZlcnMgc3Vic2NyaWJlZCB0byBpdC5cblx0ICAgICAgICovXG5cdCAgICAgIGhhc09ic2VydmVyczogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5vYnNlcnZlcnMubGVuZ3RoID4gMDsgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIE5vdGlmaWVzIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycyBhYm91dCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cblx0ICAgICAgICovXG5cdCAgICAgIG9uQ29tcGxldGVkOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgb3NbaV0ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICAgIH1cblx0XG5cdCAgICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIE5vdGlmaWVzIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycyBhYm91dCB0aGUgZXhjZXB0aW9uLlxuXHQgICAgICAgKiBAcGFyYW0ge01peGVkfSBlcnJvciBUaGUgZXhjZXB0aW9uIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVycy5cblx0ICAgICAgICovXG5cdCAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuXHQgICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG5cdCAgICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgb3NbaV0ub25FcnJvcihlcnJvcik7XG5cdCAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGFycml2YWwgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cblx0ICAgICAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVycy5cblx0ICAgICAgICovXG5cdCAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgb3NbaV0ub25OZXh0KHZhbHVlKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBVbnN1YnNjcmliZSBhbGwgb2JzZXJ2ZXJzIGFuZCByZWxlYXNlIHJlc291cmNlcy5cblx0ICAgICAgICovXG5cdCAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBDcmVhdGVzIGEgc3ViamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgb2JzZXJ2ZXIgYW5kIG9ic2VydmFibGUuXG5cdCAgICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciBUaGUgb2JzZXJ2ZXIgdXNlZCB0byBzZW5kIG1lc3NhZ2VzIHRvIHRoZSBzdWJqZWN0LlxuXHQgICAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBvYnNlcnZhYmxlIFRoZSBvYnNlcnZhYmxlIHVzZWQgdG8gc3Vic2NyaWJlIHRvIG1lc3NhZ2VzIHNlbnQgZnJvbSB0aGUgc3ViamVjdC5cblx0ICAgICAqIEByZXR1cm5zIHtTdWJqZWN0fSBTdWJqZWN0IGltcGxlbWVudGVkIHVzaW5nIHRoZSBnaXZlbiBvYnNlcnZlciBhbmQgb2JzZXJ2YWJsZS5cblx0ICAgICAqL1xuXHQgICAgU3ViamVjdC5jcmVhdGUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIsIG9ic2VydmFibGUpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTdWJqZWN0KG9ic2VydmVyLCBvYnNlcnZhYmxlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFN1YmplY3Q7XG5cdCAgfShPYnNlcnZhYmxlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi5cblx0ICAgKiAgVGhlIGxhc3QgdmFsdWUgYmVmb3JlIHRoZSBPbkNvbXBsZXRlZCBub3RpZmljYXRpb24sIG9yIHRoZSBlcnJvciByZWNlaXZlZCB0aHJvdWdoIE9uRXJyb3IsIGlzIHNlbnQgdG8gYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzLlxuXHQgICAqL1xuXHQgIHZhciBBc3luY1N1YmplY3QgPSBSeC5Bc3luY1N1YmplY3QgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQXN5bmNTdWJqZWN0LCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogQ3JlYXRlcyBhIHN1YmplY3QgdGhhdCBjYW4gb25seSByZWNlaXZlIG9uZSB2YWx1ZSBhbmQgdGhhdCB2YWx1ZSBpcyBjYWNoZWQgZm9yIGFsbCBmdXR1cmUgb2JzZXJ2YXRpb25zLlxuXHQgICAgICogQGNvbnN0cnVjdG9yXG5cdCAgICAgKi9cblx0ICAgIGZ1bmN0aW9uIEFzeW5jU3ViamVjdCgpIHtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7XG5cdCAgICAgIHRoaXMub2JzZXJ2ZXJzID0gW107XG5cdCAgICAgIHRoaXMuaGFzRXJyb3IgPSBmYWxzZTtcblx0ICAgIH1cblx0XG5cdCAgICBhZGRQcm9wZXJ0aWVzKEFzeW5jU3ViamVjdC5wcm90b3R5cGUsIE9ic2VydmVyLnByb3RvdHlwZSwge1xuXHQgICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdFxuXHQgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gobyk7XG5cdCAgICAgICAgICByZXR1cm4gbmV3IElubmVyU3Vic2NyaXB0aW9uKHRoaXMsIG8pO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgaWYgKHRoaXMuaGFzRXJyb3IpIHtcblx0ICAgICAgICAgIG8ub25FcnJvcih0aGlzLmVycm9yKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzVmFsdWUpIHtcblx0ICAgICAgICAgIG8ub25OZXh0KHRoaXMudmFsdWUpO1xuXHQgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuXHQgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuXHQgICAgICAgKi9cblx0ICAgICAgaGFzT2JzZXJ2ZXJzOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMubGVuZ3RoID4gMDtcblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIE5vdGlmaWVzIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycyBhYm91dCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSwgYWxzbyBjYXVzaW5nIHRoZSBsYXN0IHJlY2VpdmVkIHZhbHVlIHRvIGJlIHNlbnQgb3V0IChpZiBhbnkpLlxuXHQgICAgICAgKi9cblx0ICAgICAgb25Db21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgaSwgbGVuO1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdmFyIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDtcblx0XG5cdCAgICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZSkge1xuXHQgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgICB2YXIgbyA9IG9zW2ldO1xuXHQgICAgICAgICAgICAgIG8ub25OZXh0KHRoaXMudmFsdWUpO1xuXHQgICAgICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgb3NbaV0ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHRcblx0ICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBlcnJvci5cblx0ICAgICAgICogQHBhcmFtIHtNaXhlZH0gZXJyb3IgVGhlIEVycm9yIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVycy5cblx0ICAgICAgICovXG5cdCAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG5cdFxuXHQgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgIG9zW2ldLm9uRXJyb3IoZXJyb3IpO1xuXHQgICAgICAgICAgfVxuXHRcblx0ICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogU2VuZHMgYSB2YWx1ZSB0byB0aGUgc3ViamVjdC4gVGhlIGxhc3QgdmFsdWUgcmVjZWl2ZWQgYmVmb3JlIHN1Y2Nlc3NmdWwgdGVybWluYXRpb24gd2lsbCBiZSBzZW50IHRvIGFsbCBzdWJzY3JpYmVkIGFuZCBmdXR1cmUgb2JzZXJ2ZXJzLlxuXHQgICAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIHN1YmplY3QuXG5cdCAgICAgICAqL1xuXHQgICAgICBvbk5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTtcblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIFVuc3Vic2NyaWJlIGFsbCBvYnNlcnZlcnMgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLlxuXHQgICAgICAgKi9cblx0ICAgICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0XG5cdCAgICByZXR1cm4gQXN5bmNTdWJqZWN0O1xuXHQgIH0oT2JzZXJ2YWJsZSkpO1xuXHRcblx0ICB2YXIgQW5vbnltb3VzU3ViamVjdCA9IFJ4LkFub255bW91c1N1YmplY3QgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQW5vbnltb3VzU3ViamVjdCwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIEFub255bW91c1N1YmplY3Qob2JzZXJ2ZXIsIG9ic2VydmFibGUpIHtcblx0ICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuXHQgICAgICB0aGlzLm9ic2VydmFibGUgPSBvYnNlcnZhYmxlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBhZGRQcm9wZXJ0aWVzKEFub255bW91c1N1YmplY3QucHJvdG90eXBlLCBPYnNlcnZlci5wcm90b3R5cGUsIHtcblx0ICAgICAgX3N1YnNjcmliZTogZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZShvKTtcblx0ICAgICAgfSxcblx0ICAgICAgb25Db21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLm9ic2VydmVyLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH0sXG5cdCAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgIHRoaXMub2JzZXJ2ZXIub25FcnJvcihlcnJvcik7XG5cdCAgICAgIH0sXG5cdCAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgdGhpcy5vYnNlcnZlci5vbk5leHQodmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0XG5cdCAgICByZXR1cm4gQW5vbnltb3VzU3ViamVjdDtcblx0ICB9KE9ic2VydmFibGUpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJlcHJlc2VudHMgYSB2YWx1ZSB0aGF0IGNoYW5nZXMgb3ZlciB0aW1lLlxuXHQgICAqICBPYnNlcnZlcnMgY2FuIHN1YnNjcmliZSB0byB0aGUgc3ViamVjdCB0byByZWNlaXZlIHRoZSBsYXN0IChvciBpbml0aWFsKSB2YWx1ZSBhbmQgYWxsIHN1YnNlcXVlbnQgbm90aWZpY2F0aW9ucy5cblx0ICAgKi9cblx0ICB2YXIgQmVoYXZpb3JTdWJqZWN0ID0gUnguQmVoYXZpb3JTdWJqZWN0ID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKEJlaGF2aW9yU3ViamVjdCwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIEJlaGF2aW9yU3ViamVjdCh2YWx1ZSkge1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuXHQgICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuXHQgICAgfVxuXHRcblx0ICAgIGFkZFByb3BlcnRpZXMoQmVoYXZpb3JTdWJqZWN0LnByb3RvdHlwZSwgT2JzZXJ2ZXIucHJvdG90eXBlLCB7XG5cdCAgICAgIF9zdWJzY3JpYmU6IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLm9ic2VydmVycy5wdXNoKG8pO1xuXHQgICAgICAgICAgby5vbk5leHQodGhpcy52YWx1ZSk7XG5cdCAgICAgICAgICByZXR1cm4gbmV3IElubmVyU3Vic2NyaXB0aW9uKHRoaXMsIG8pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikge1xuXHQgICAgICAgICAgby5vbkVycm9yKHRoaXMuZXJyb3IpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9yIHRocm93cyBhbiBleGNlcHRpb24uXG5cdCAgICAgICAqIFZhbHVlIGlzIGZyb3plbiBhZnRlciBvbkNvbXBsZXRlZCBpcyBjYWxsZWQuXG5cdCAgICAgICAqIEFmdGVyIG9uRXJyb3IgaXMgY2FsbGVkIGFsd2F5cyB0aHJvd3MgdGhlIHNwZWNpZmllZCBleGNlcHRpb24uXG5cdCAgICAgICAqIEFuIGV4Y2VwdGlvbiBpcyBhbHdheXMgdGhyb3duIGFmdGVyIGRpc3Bvc2UgaXMgY2FsbGVkLlxuXHQgICAgICAgKiBAcmV0dXJucyB7TWl4ZWR9IFRoZSBpbml0aWFsIHZhbHVlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgdW50aWwgb25OZXh0IGlzIGNhbGxlZDsgYWZ0ZXIgd2hpY2gsIHRoZSBsYXN0IHZhbHVlIHBhc3NlZCB0byBvbk5leHQuXG5cdCAgICAgICAqL1xuXHQgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICAgIGlmICh0aGlzLmhhc0Vycm9yKSB7XG5cdCAgICAgICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuXHQgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuXHQgICAgICAgKi9cblx0ICAgICAgaGFzT2JzZXJ2ZXJzOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm9ic2VydmVycy5sZW5ndGggPiAwOyB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuXHQgICAgICAgKi9cblx0ICAgICAgb25Db21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXHQgICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICBvc1tpXS5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIE5vdGlmaWVzIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycyBhYm91dCB0aGUgZXhjZXB0aW9uLlxuXHQgICAgICAgKiBAcGFyYW0ge01peGVkfSBlcnJvciBUaGUgZXhjZXB0aW9uIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVycy5cblx0ICAgICAgICovXG5cdCAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG5cdFxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwLCBvcyA9IGNsb25lQXJyYXkodGhpcy5vYnNlcnZlcnMpLCBsZW4gPSBvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgb3NbaV0ub25FcnJvcihlcnJvcik7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBhcnJpdmFsIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UuXG5cdCAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZW5kIHRvIGFsbCBvYnNlcnZlcnMuXG5cdCAgICAgICAqL1xuXHQgICAgICBvbk5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgIG9zW2ldLm9uTmV4dCh2YWx1ZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogVW5zdWJzY3JpYmUgYWxsIG9ic2VydmVycyBhbmQgcmVsZWFzZSByZXNvdXJjZXMuXG5cdCAgICAgICAqL1xuXHQgICAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLm9ic2VydmVycyA9IG51bGw7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHRcblx0ICAgIHJldHVybiBCZWhhdmlvclN1YmplY3Q7XG5cdCAgfShPYnNlcnZhYmxlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIFJlcHJlc2VudHMgYW4gb2JqZWN0IHRoYXQgaXMgYm90aCBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGFzIHdlbGwgYXMgYW4gb2JzZXJ2ZXIuXG5cdCAgICogRWFjaCBub3RpZmljYXRpb24gaXMgYnJvYWRjYXN0ZWQgdG8gYWxsIHN1YnNjcmliZWQgYW5kIGZ1dHVyZSBvYnNlcnZlcnMsIHN1YmplY3QgdG8gYnVmZmVyIHRyaW1taW5nIHBvbGljaWVzLlxuXHQgICAqL1xuXHQgIHZhciBSZXBsYXlTdWJqZWN0ID0gUnguUmVwbGF5U3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdFxuXHQgICAgdmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcblx0XG5cdCAgICBmdW5jdGlvbiBjcmVhdGVSZW1vdmFibGVEaXNwb3NhYmxlKHN1YmplY3QsIG9ic2VydmVyKSB7XG5cdCAgICAgIHJldHVybiBkaXNwb3NhYmxlQ3JlYXRlKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBvYnNlcnZlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgIXN1YmplY3QuaXNEaXNwb3NlZCAmJiBzdWJqZWN0Lm9ic2VydmVycy5zcGxpY2Uoc3ViamVjdC5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlciksIDEpO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0XG5cdCAgICBpbmhlcml0cyhSZXBsYXlTdWJqZWN0LCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZXBsYXlTdWJqZWN0IGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZSwgd2luZG93IHNpemUgYW5kIHNjaGVkdWxlci5cblx0ICAgICAqICBAcGFyYW0ge051bWJlcn0gW2J1ZmZlclNpemVdIE1heGltdW0gZWxlbWVudCBjb3VudCBvZiB0aGUgcmVwbGF5IGJ1ZmZlci5cblx0ICAgICAqICBAcGFyYW0ge051bWJlcn0gW3dpbmRvd1NpemVdIE1heGltdW0gdGltZSBsZW5ndGggb2YgdGhlIHJlcGxheSBidWZmZXIuXG5cdCAgICAgKiAgQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0aGUgb2JzZXJ2ZXJzIGFyZSBpbnZva2VkIG9uLlxuXHQgICAgICovXG5cdCAgICBmdW5jdGlvbiBSZXBsYXlTdWJqZWN0KGJ1ZmZlclNpemUsIHdpbmRvd1NpemUsIHNjaGVkdWxlcikge1xuXHQgICAgICB0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplID09IG51bGwgPyBtYXhTYWZlSW50ZWdlciA6IGJ1ZmZlclNpemU7XG5cdCAgICAgIHRoaXMud2luZG93U2l6ZSA9IHdpbmRvd1NpemUgPT0gbnVsbCA/IG1heFNhZmVJbnRlZ2VyIDogd2luZG93U2l6ZTtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXIgfHwgY3VycmVudFRocmVhZFNjaGVkdWxlcjtcblx0ICAgICAgdGhpcy5xID0gW107XG5cdCAgICAgIHRoaXMub2JzZXJ2ZXJzID0gW107XG5cdCAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBhZGRQcm9wZXJ0aWVzKFJlcGxheVN1YmplY3QucHJvdG90eXBlLCBPYnNlcnZlci5wcm90b3R5cGUsIHtcblx0ICAgICAgX3N1YnNjcmliZTogZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXHQgICAgICAgIHZhciBzbyA9IG5ldyBTY2hlZHVsZWRPYnNlcnZlcih0aGlzLnNjaGVkdWxlciwgbyksIHN1YnNjcmlwdGlvbiA9IGNyZWF0ZVJlbW92YWJsZURpc3Bvc2FibGUodGhpcywgc28pO1xuXHRcblx0ICAgICAgICB0aGlzLl90cmltKHRoaXMuc2NoZWR1bGVyLm5vdygpKTtcblx0ICAgICAgICB0aGlzLm9ic2VydmVycy5wdXNoKHNvKTtcblx0XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMucS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgc28ub25OZXh0KHRoaXMucVtpXS52YWx1ZSk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikge1xuXHQgICAgICAgICAgc28ub25FcnJvcih0aGlzLmVycm9yKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICBzby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgc28uZW5zdXJlQWN0aXZlKCk7XG5cdCAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdWJqZWN0IGhhcyBvYnNlcnZlcnMgc3Vic2NyaWJlZCB0byBpdC5cblx0ICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdWJqZWN0IGhhcyBvYnNlcnZlcnMgc3Vic2NyaWJlZCB0byBpdC5cblx0ICAgICAgICovXG5cdCAgICAgIGhhc09ic2VydmVyczogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5sZW5ndGggPiAwO1xuXHQgICAgICB9LFxuXHQgICAgICBfdHJpbTogZnVuY3Rpb24gKG5vdykge1xuXHQgICAgICAgIHdoaWxlICh0aGlzLnEubGVuZ3RoID4gdGhpcy5idWZmZXJTaXplKSB7XG5cdCAgICAgICAgICB0aGlzLnEuc2hpZnQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgd2hpbGUgKHRoaXMucS5sZW5ndGggPiAwICYmIChub3cgLSB0aGlzLnFbMF0uaW50ZXJ2YWwpID4gdGhpcy53aW5kb3dTaXplKSB7XG5cdCAgICAgICAgICB0aGlzLnEuc2hpZnQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGFycml2YWwgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cblx0ICAgICAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVycy5cblx0ICAgICAgICovXG5cdCAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgdmFyIG5vdyA9IHRoaXMuc2NoZWR1bGVyLm5vdygpO1xuXHQgICAgICAgIHRoaXMucS5wdXNoKHsgaW50ZXJ2YWw6IG5vdywgdmFsdWU6IHZhbHVlIH0pO1xuXHQgICAgICAgIHRoaXMuX3RyaW0obm93KTtcblx0XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBvc1tpXTtcblx0ICAgICAgICAgIG9ic2VydmVyLm9uTmV4dCh2YWx1ZSk7XG5cdCAgICAgICAgICBvYnNlcnZlci5lbnN1cmVBY3RpdmUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGV4Y2VwdGlvbi5cblx0ICAgICAgICogQHBhcmFtIHtNaXhlZH0gZXJyb3IgVGhlIGV4Y2VwdGlvbiB0byBzZW5kIHRvIGFsbCBvYnNlcnZlcnMuXG5cdCAgICAgICAqL1xuXHQgICAgICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXHQgICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuXHQgICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xuXHQgICAgICAgIHZhciBub3cgPSB0aGlzLnNjaGVkdWxlci5ub3coKTtcblx0ICAgICAgICB0aGlzLl90cmltKG5vdyk7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBvc1tpXTtcblx0ICAgICAgICAgIG9ic2VydmVyLm9uRXJyb3IoZXJyb3IpO1xuXHQgICAgICAgICAgb2JzZXJ2ZXIuZW5zdXJlQWN0aXZlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuXG5cdCAgICAgICAqL1xuXHQgICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgbm93ID0gdGhpcy5zY2hlZHVsZXIubm93KCk7XG5cdCAgICAgICAgdGhpcy5fdHJpbShub3cpO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwLCBvcyA9IGNsb25lQXJyYXkodGhpcy5vYnNlcnZlcnMpLCBsZW4gPSBvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgdmFyIG9ic2VydmVyID0gb3NbaV07XG5cdCAgICAgICAgICBvYnNlcnZlci5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgICAgb2JzZXJ2ZXIuZW5zdXJlQWN0aXZlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBVbnN1YnNjcmliZSBhbGwgb2JzZXJ2ZXJzIGFuZCByZWxlYXNlIHJlc291cmNlcy5cblx0ICAgICAgICovXG5cdCAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdFxuXHQgICAgcmV0dXJuIFJlcGxheVN1YmplY3Q7XG5cdCAgfShPYnNlcnZhYmxlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICogVXNlZCB0byBwYXVzZSBhbmQgcmVzdW1lIHN0cmVhbXMuXG5cdCAgKi9cblx0ICBSeC5QYXVzZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoUGF1c2VyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gUGF1c2VyKCkge1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICAvKipcblx0ICAgICAqIFBhdXNlcyB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cblx0ICAgICAqL1xuXHQgICAgUGF1c2VyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHsgdGhpcy5vbk5leHQoZmFsc2UpOyB9O1xuXHRcblx0ICAgIC8qKlxuXHQgICAgKiBSZXN1bWVzIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlLlxuXHQgICAgKi9cblx0ICAgIFBhdXNlci5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkgeyB0aGlzLm9uTmV4dCh0cnVlKTsgfTtcblx0XG5cdCAgICByZXR1cm4gUGF1c2VyO1xuXHQgIH0oU3ViamVjdCkpO1xuXHRcblx0ICBpZiAodHJ1ZSkge1xuXHQgICAgcm9vdC5SeCA9IFJ4O1xuXHRcblx0ICAgICEoX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gPSBmdW5jdGlvbigpIHtcblx0ICAgICAgcmV0dXJuIFJ4O1xuXHQgICAgfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18sIGV4cG9ydHMsIG1vZHVsZSksIF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fICE9PSB1bmRlZmluZWQgJiYgKG1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18pKTtcblx0ICB9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0ICAgIC8vIGluIE5vZGUuanMgb3IgUmluZ29KU1xuXHQgICAgaWYgKG1vZHVsZUV4cG9ydHMpIHtcblx0ICAgICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IFJ4KS5SeCA9IFJ4O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgZnJlZUV4cG9ydHMuUnggPSBSeDtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgLy8gaW4gYSBicm93c2VyIG9yIFJoaW5vXG5cdCAgICByb290LlJ4ID0gUng7XG5cdCAgfVxuXHRcblx0ICAvLyBBbGwgY29kZSBiZWZvcmUgdGhpcyBwb2ludCB3aWxsIGJlIGZpbHRlcmVkIGZyb20gc3RhY2sgdHJhY2VzLlxuXHQgIHZhciByRW5kaW5nTGluZSA9IGNhcHR1cmVMaW5lKCk7XG5cdFxuXHR9LmNhbGwodGhpcykpO1xuXHRcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oMzQpKG1vZHVsZSksIChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0oKSksIF9fd2VicGFja19yZXF1aXJlX18oNikpKVxuXG4vKioqLyB9LFxuLyogMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLmNsaW1iX193YWxse3dpZHRoOjEwMCU7cGFkZGluZzowO21hcmdpbjowOy13ZWJraXQtanVzdGlmeS1jb250ZW50OmNlbnRlcjstbXMtZmxleC1wYWNrOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOy13ZWJraXQtZmxleC1kaXJlY3Rpb246cm93Oy1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93Oy13ZWJraXQtZmxleC13cmFwOndyYXA7LW1zLWZsZXgtd3JhcDp3cmFwO2ZsZXgtd3JhcDp3cmFwO2ZvbnQtc2l6ZToxMDAlfS5jbGltYl9fdGlsZSwuY2xpbWJfX3dhbGx7ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXh9LmNsaW1iX190aWxley13ZWJraXQtZmxleC1zaHJpbms6MDstbXMtZmxleC1uZWdhdGl2ZTowO2ZsZXgtc2hyaW5rOjA7aGVpZ2h0OjQyNXB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWp1c3RpZnktY29udGVudDpmbGV4LWVuZDstbXMtZmxleC1wYWNrOmVuZDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47b3V0bGluZToxcHggc29saWQgdHJhbnNwYXJlbnQ7bWFyZ2luLWJvdHRvbToyMHB4O292ZXJmbG93OmhpZGRlbjt0ZXh0LWFsaWduOmxlZnQ7Ym9yZGVyLXJhZGl1czo3cHg7YmFja2dyb3VuZC1jb2xvcjojZjZmNmY2Oy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC1wZXJzcGVjdGl2ZToxMDAwcHg7cGVyc3BlY3RpdmU6MTAwMHB4fS5jbGltYl9fdGlsZV9fY29udGVudHt6LWluZGV4OjE7cGFkZGluZzoyNnB4O2JhY2tncm91bmQtY29sb3I6I2Y2ZjZmNn0uY2xpbWJfX3RpbGUtLWhhcy1uby1pbWFnZSAuY2xpbWJfX3RpbGVfX2NvbnRlbnR7aGVpZ2h0OjEwMCU7ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjstbXMtZmxleC1wYWNrOmp1c3RpZnk7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Ym94LXNpemluZzpib3JkZXItYm94fS5jbGltYl9fdGlsZV9faW1hZ2V7bWF4LXdpZHRoOjEwMCU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo3cHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6N3B4fS5jbGltYl9fdGlsZV9fbWVzc2FnZXt6LWluZGV4OjE7bWFyZ2luLWJvdHRvbToyNHB4fS5jbGltYl9fdGlsZV9fbWVzc2FnZT5he3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczttYXgtd2lkdGg6MjYwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246Ym90dG9tfS5jbGltYl9fdGlsZS0taGFzLW5vLWltYWdlIC5jbGltYl9fdGlsZV9fbWVzc2FnZXtmb250LXNpemU6MTg1JX0uY2xpbWJfX3RpbGVfX2F1dGhvcntkaXNwbGF5OmJsb2NrO21hcmdpbjotMTBweH0uY2xpbWJfX3RpbGVfX2F1dGhvciBpbWd7Ym9yZGVyLXJhZGl1czoyNXB4O3dpZHRoOjM0cHh9LmNsaW1iX190aWxlX19hdXRob3IgLmNsaW1iX190aWxlX19hdXRob3JfX3VzZXJuYW1le2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowIDAgMCAxMHB4O2xpbmUtaGVpZ2h0OjM0cHg7dmVydGljYWwtYWxpZ246dG9wfS5jbGltYi1zb2NpYWwtYmFkZ2V7cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjIwcHg7cmlnaHQ6MjBweDt6LWluZGV4Ojk7YmFja2dyb3VuZC1jb2xvcjojYTljYWUyO3dpZHRoOjIwMHB4O2hlaWdodDo2NnB4O2JvcmRlci1yYWRpdXM6NXB4fS5jbGltYi1zb2NpYWwtYmFkZ2U+c3Bhbntwb3NpdGlvbjphYnNvbHV0ZSFpbXBvcnRhbnQ7dG9wOi05OTk5cHghaW1wb3J0YW50O2xlZnQ6LTk5OTlweCFpbXBvcnRhbnR9XCIsIFwiXCJdKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXHJcblx0XHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5cdFx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxyXG5cdCovXHJcblx0Ly8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcclxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGxpc3QgPSBbXTtcclxuXHRcclxuXHRcdC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcclxuXHRcdGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcclxuXHRcdFx0dmFyIHJlc3VsdCA9IFtdO1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpdGVtID0gdGhpc1tpXTtcclxuXHRcdFx0XHRpZihpdGVtWzJdKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaChcIkBtZWRpYSBcIiArIGl0ZW1bMl0gKyBcIntcIiArIGl0ZW1bMV0gKyBcIn1cIik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1bMV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0LmpvaW4oXCJcIik7XHJcblx0XHR9O1xyXG5cdFxyXG5cdFx0Ly8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcclxuXHRcdGxpc3QuaSA9IGZ1bmN0aW9uKG1vZHVsZXMsIG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0aWYodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpXHJcblx0XHRcdFx0bW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgXCJcIl1dO1xyXG5cdFx0XHR2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpZCA9IHRoaXNbaV1bMF07XHJcblx0XHRcdFx0aWYodHlwZW9mIGlkID09PSBcIm51bWJlclwiKVxyXG5cdFx0XHRcdFx0YWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvcihpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaXRlbSA9IG1vZHVsZXNbaV07XHJcblx0XHRcdFx0Ly8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxyXG5cdFx0XHRcdC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IDEwMCUgcGVyZmVjdCBmb3Igd2VpcmQgbWVkaWEgcXVlcnkgY29tYmluYXRpb25zXHJcblx0XHRcdFx0Ly8gIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cclxuXHRcdFx0XHQvLyAgSSBob3BlIHRoaXMgd2lsbCBuZXZlciBvY2N1ciAoSGV5IHRoaXMgd2F5IHdlIGhhdmUgc21hbGxlciBidW5kbGVzKVxyXG5cdFx0XHRcdGlmKHR5cGVvZiBpdGVtWzBdICE9PSBcIm51bWJlclwiIHx8ICFhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XHJcblx0XHRcdFx0XHRpZihtZWRpYVF1ZXJ5ICYmICFpdGVtWzJdKSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmKG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0XHRcdFx0aXRlbVsyXSA9IFwiKFwiICsgaXRlbVsyXSArIFwiKSBhbmQgKFwiICsgbWVkaWFRdWVyeSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHRcdHJldHVybiBsaXN0O1xyXG5cdH07XHJcblxuXG4vKioqLyB9LFxuLyogMTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18sIF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18sIF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdCAgaWYgKHRydWUpIHtcblx0ICAgICEoX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXyA9IFtleHBvcnRzLCBtb2R1bGVdLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18gPSAoZmFjdG9yeSksIF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fID0gKHR5cGVvZiBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18gPT09ICdmdW5jdGlvbicgPyAoX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLmFwcGx5KGV4cG9ydHMsIF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18pKSA6IF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyksIF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fICE9PSB1bmRlZmluZWQgJiYgKG1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18pKTtcblx0ICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgZmFjdG9yeShleHBvcnRzLCBtb2R1bGUpO1xuXHQgIH0gZWxzZSB7XG5cdCAgICB2YXIgbW9kID0ge1xuXHQgICAgICBleHBvcnRzOiB7fVxuXHQgICAgfTtcblx0ICAgIGZhY3RvcnkobW9kLmV4cG9ydHMsIG1vZCk7XG5cdCAgICBnbG9iYWwuZmV0Y2hKc29ucCA9IG1vZC5leHBvcnRzO1xuXHQgIH1cblx0fSkodGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsIG1vZHVsZSkge1xuXHQgICd1c2Ugc3RyaWN0Jztcblx0XG5cdCAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuXHQgICAgdGltZW91dDogNTAwMCxcblx0ICAgIGpzb25wQ2FsbGJhY2s6ICdjYWxsYmFjaydcblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBnZW5lcmF0ZUNhbGxiYWNrRnVuY3Rpb24oKSB7XG5cdCAgICByZXR1cm4gJ2pzb25wXycgKyBEYXRlLm5vdygpICsgJ18nICsgTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiAxMDAwMDApO1xuXHQgIH1cblx0XG5cdCAgLy8gS25vd24gaXNzdWU6IFdpbGwgdGhyb3cgJ1VuY2F1Z2h0IFJlZmVyZW5jZUVycm9yOiBjYWxsYmFja18qKiogaXMgbm90IGRlZmluZWQnIGVycm9yIGlmIHJlcXVlc3QgdGltZW91dFxuXHQgIGZ1bmN0aW9uIGNsZWFyRnVuY3Rpb24oZnVuY3Rpb25OYW1lKSB7XG5cdCAgICAvLyBJRTggdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIHlvdSB0cnkgdG8gZGVsZXRlIGEgcHJvcGVydHkgb24gd2luZG93XG5cdCAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xODI0MjI4Lzc1MTA4OVxuXHQgICAgdHJ5IHtcblx0ICAgICAgZGVsZXRlIHdpbmRvd1tmdW5jdGlvbk5hbWVdO1xuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICB3aW5kb3dbZnVuY3Rpb25OYW1lXSA9IHVuZGVmaW5lZDtcblx0ICAgIH1cblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIHJlbW92ZVNjcmlwdChzY3JpcHRJZCkge1xuXHQgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNjcmlwdElkKTtcblx0ICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXS5yZW1vdmVDaGlsZChzY3JpcHQpO1xuXHQgIH1cblx0XG5cdCAgdmFyIGZldGNoSnNvbnAgPSBmdW5jdGlvbiBmZXRjaEpzb25wKHVybCkge1xuXHQgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTtcblx0XG5cdCAgICB2YXIgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCAhPSBudWxsID8gb3B0aW9ucy50aW1lb3V0IDogZGVmYXVsdE9wdGlvbnMudGltZW91dDtcblx0ICAgIHZhciBqc29ucENhbGxiYWNrID0gb3B0aW9ucy5qc29ucENhbGxiYWNrICE9IG51bGwgPyBvcHRpb25zLmpzb25wQ2FsbGJhY2sgOiBkZWZhdWx0T3B0aW9ucy5qc29ucENhbGxiYWNrO1xuXHRcblx0ICAgIHZhciB0aW1lb3V0SWQgPSB1bmRlZmluZWQ7XG5cdFxuXHQgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0ICAgICAgdmFyIGNhbGxiYWNrRnVuY3Rpb24gPSBnZW5lcmF0ZUNhbGxiYWNrRnVuY3Rpb24oKTtcblx0XG5cdCAgICAgIHdpbmRvd1tjYWxsYmFja0Z1bmN0aW9uXSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHQgICAgICAgIHJlc29sdmUoe1xuXHQgICAgICAgICAgb2s6IHRydWUsXG5cdCAgICAgICAgICAvLyBrZWVwIGNvbnNpc3RlbnQgd2l0aCBmZXRjaCBBUElcblx0ICAgICAgICAgIGpzb246IGZ1bmN0aW9uIGpzb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHRcblx0ICAgICAgICBpZiAodGltZW91dElkKSBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblx0XG5cdCAgICAgICAgcmVtb3ZlU2NyaXB0KGpzb25wQ2FsbGJhY2sgKyAnXycgKyBjYWxsYmFja0Z1bmN0aW9uKTtcblx0XG5cdCAgICAgICAgY2xlYXJGdW5jdGlvbihjYWxsYmFja0Z1bmN0aW9uKTtcblx0ICAgICAgfTtcblx0XG5cdCAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHNldCB0aGVpciBvd24gcGFyYW1zLCBhbmQgaWYgbm90IGFkZCBhID8gdG8gc3RhcnQgYSBsaXN0IG9mIHBhcmFtc1xuXHQgICAgICB1cmwgKz0gdXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJic7XG5cdFxuXHQgICAgICB2YXIganNvbnBTY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblx0ICAgICAganNvbnBTY3JpcHQuc2V0QXR0cmlidXRlKFwic3JjXCIsIHVybCArIGpzb25wQ2FsbGJhY2sgKyAnPScgKyBjYWxsYmFja0Z1bmN0aW9uKTtcblx0ICAgICAganNvbnBTY3JpcHQuaWQgPSBqc29ucENhbGxiYWNrICsgJ18nICsgY2FsbGJhY2tGdW5jdGlvbjtcblx0ICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdLmFwcGVuZENoaWxkKGpzb25wU2NyaXB0KTtcblx0XG5cdCAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0pTT05QIHJlcXVlc3QgdG8gJyArIHVybCArICcgdGltZWQgb3V0JykpO1xuXHRcblx0ICAgICAgICBjbGVhckZ1bmN0aW9uKGNhbGxiYWNrRnVuY3Rpb24pO1xuXHQgICAgICAgIHJlbW92ZVNjcmlwdChqc29ucENhbGxiYWNrICsgJ18nICsgY2FsbGJhY2tGdW5jdGlvbik7XG5cdCAgICAgIH0sIHRpbWVvdXQpO1xuXHQgICAgfSk7XG5cdCAgfTtcblx0XG5cdCAgLy8gZXhwb3J0IGFzIGdsb2JhbCBmdW5jdGlvblxuXHQgIC8qXG5cdCAgbGV0IGxvY2FsO1xuXHQgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgbG9jYWwgPSBnbG9iYWw7XG5cdCAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgIGxvY2FsID0gc2VsZjtcblx0ICB9IGVsc2Uge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgbG9jYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BvbHlmaWxsIGZhaWxlZCBiZWNhdXNlIGdsb2JhbCBvYmplY3QgaXMgdW5hdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBcblx0ICBsb2NhbC5mZXRjaEpzb25wID0gZmV0Y2hKc29ucDtcblx0ICAqL1xuXHRcblx0ICBtb2R1bGUuZXhwb3J0cyA9IGZldGNoSnNvbnA7XG5cdH0pO1xuXG4vKioqLyB9LFxuLyogMTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNvbmZpZ0FuaW1hdGlvbjtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblx0XG5cdHZhciBfcGVyZm9ybWFuY2VOb3cgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHRcblx0dmFyIF9wZXJmb3JtYW5jZU5vdzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wZXJmb3JtYW5jZU5vdyk7XG5cdFxuXHR2YXIgX3JhZiA9IF9fd2VicGFja19yZXF1aXJlX18oMzApO1xuXHRcblx0dmFyIF9yYWYyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmFmKTtcblx0XG5cdGZ1bmN0aW9uIGNvbmZpZ0FuaW1hdGlvbigpIHtcblx0ICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cdCAgdmFyIF9jb25maWckdGltZVN0ZXAgPSBjb25maWcudGltZVN0ZXA7XG5cdCAgdmFyIHRpbWVTdGVwID0gX2NvbmZpZyR0aW1lU3RlcCA9PT0gdW5kZWZpbmVkID8gMSAvIDYwICogMTAwMCA6IF9jb25maWckdGltZVN0ZXA7XG5cdCAgdmFyIF9jb25maWckdGltZVNjYWxlID0gY29uZmlnLnRpbWVTY2FsZTtcblx0ICB2YXIgdGltZVNjYWxlID0gX2NvbmZpZyR0aW1lU2NhbGUgPT09IHVuZGVmaW5lZCA/IDEgOiBfY29uZmlnJHRpbWVTY2FsZTtcblx0ICB2YXIgX2NvbmZpZyRtYXhTdGVwcyA9IGNvbmZpZy5tYXhTdGVwcztcblx0ICB2YXIgbWF4U3RlcHMgPSBfY29uZmlnJG1heFN0ZXBzID09PSB1bmRlZmluZWQgPyAxMCA6IF9jb25maWckbWF4U3RlcHM7XG5cdCAgdmFyIF9jb25maWckcmFmID0gY29uZmlnLnJhZjtcblx0ICB2YXIgcmFmID0gX2NvbmZpZyRyYWYgPT09IHVuZGVmaW5lZCA/IF9yYWYyWydkZWZhdWx0J10gOiBfY29uZmlnJHJhZjtcblx0ICB2YXIgX2NvbmZpZyRub3cgPSBjb25maWcubm93O1xuXHQgIHZhciBub3cgPSBfY29uZmlnJG5vdyA9PT0gdW5kZWZpbmVkID8gX3BlcmZvcm1hbmNlTm93MlsnZGVmYXVsdCddIDogX2NvbmZpZyRub3c7XG5cdFxuXHQgIHZhciBhbmltUnVubmluZyA9IFtdO1xuXHQgIHZhciBydW5uaW5nID0gZmFsc2U7XG5cdCAgdmFyIHByZXZUaW1lID0gMDtcblx0ICB2YXIgYWNjdW11bGF0ZWRUaW1lID0gMDtcblx0XG5cdCAgZnVuY3Rpb24gbG9vcCgpIHtcblx0ICAgIHZhciBjdXJyZW50VGltZSA9IG5vdygpO1xuXHQgICAgdmFyIGZyYW1lVGltZSA9IGN1cnJlbnRUaW1lIC0gcHJldlRpbWU7IC8vIGRlbHRhXG5cdFxuXHQgICAgcHJldlRpbWUgPSBjdXJyZW50VGltZTtcblx0ICAgIGFjY3VtdWxhdGVkVGltZSArPSBmcmFtZVRpbWUgKiB0aW1lU2NhbGU7XG5cdFxuXHQgICAgaWYgKGFjY3VtdWxhdGVkVGltZSA+IHRpbWVTdGVwICogbWF4U3RlcHMpIHtcblx0ICAgICAgYWNjdW11bGF0ZWRUaW1lID0gMDtcblx0ICAgIH1cblx0XG5cdCAgICB2YXIgZnJhbWVOdW1iZXIgPSBNYXRoLmNlaWwoYWNjdW11bGF0ZWRUaW1lIC8gdGltZVN0ZXApO1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmltUnVubmluZy5sZW5ndGg7IGkrKykge1xuXHQgICAgICB2YXIgX2FuaW1SdW5uaW5nJGkgPSBhbmltUnVubmluZ1tpXTtcblx0ICAgICAgdmFyIGFjdGl2ZSA9IF9hbmltUnVubmluZyRpLmFjdGl2ZTtcblx0ICAgICAgdmFyIGFuaW1hdGlvblN0ZXAgPSBfYW5pbVJ1bm5pbmckaS5hbmltYXRpb25TdGVwO1xuXHQgICAgICB2YXIgcHJldlByZXZTdGF0ZSA9IF9hbmltUnVubmluZyRpLnByZXZTdGF0ZTtcblx0ICAgICAgdmFyIHByZXZOZXh0U3RhdGUgPSBhbmltUnVubmluZ1tpXS5uZXh0U3RhdGU7XG5cdFxuXHQgICAgICBpZiAoIWFjdGl2ZSkge1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICAvLyBTZWVtcyBsaWtlIGJlY2F1c2UgdGhlIFRTIHNldHMgZGVzdFZhbHMgYXMgZW50ZXJWYWxzIGZvciB0aGUgZmlyc3Rcblx0ICAgICAgLy8gdGljaywgd2UgbWlnaHQgcmVuZGVyIHRoYXQgdmFsdWUgdHdpY2UuIFdlIHJlbmRlciBpdCBvbmNlLCBjdXJyVmFsdWUgaXNcblx0ICAgICAgLy8gZW50ZXJWYWwgYW5kIGRlc3RWYWwgaXMgZW50ZXJWYWwuIFRoZSBuZXh0IHRpY2sgaXMgZmFzdGVyIHRoYW4gMTZtcyxcblx0ICAgICAgLy8gc28gYWNjdW11bGF0ZWRUaW1lICh3aGljaCB3b3VsZCBiZSBhYm91dCAtMTZtcyBmcm9tIHRoZSBwcmV2aW91cyB0aWNrKVxuXHQgICAgICAvLyBpcyBuZWdhdGl2ZSAoLTE2bXMgKyBhbnkgbnVtYmVyIGxlc3MgdGhhbiAxNm1zIDwgMCkuIFNvIHdlIGp1c3QgcmVuZGVyXG5cdCAgICAgIC8vIHBhcnQgd2F5cyB0b3dhcmRzIHRoZSBuZXh0U3RhdGUsIGJ1dCB0aGF0J3MgZW50ZXJWYWwgc3RpbGwuIFdlIHJlbmRlclxuXHQgICAgICAvLyBzYXkgNzUlIGJldHdlZW4gY3VyclZhbHVlICg9PT0gZW50ZXJWYWwpIGFuZCBkZXN0VmFsdWUgKD09PSBlbnRlclZhbCkuXG5cdCAgICAgIC8vIFNvIHdlIHJlbmRlciB0aGUgc2FtZSB2YWx1ZSBhIHNlY29uZCB0aW1lLlxuXHQgICAgICAvLyBUaGUgc29sdXRpb24gYmVsb3cgaXMgdG8gcmVjYWxjdWxhdGUgdGhlIGRlc3RpbmF0aW9uIHN0YXRlIGV2ZW4gd2hlblxuXHQgICAgICAvLyB5b3UncmUgbW92aW5nIHBhcnRpYWxseSB0b3dhcmRzIGl0LlxuXHQgICAgICBpZiAoYWNjdW11bGF0ZWRUaW1lIDw9IDApIHtcblx0ICAgICAgICBhbmltUnVubmluZ1tpXS5uZXh0U3RhdGUgPSBhbmltYXRpb25TdGVwKHRpbWVTdGVwIC8gMTAwMCwgcHJldlByZXZTdGF0ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmcmFtZU51bWJlcjsgaisrKSB7XG5cdCAgICAgICAgICBhbmltUnVubmluZ1tpXS5uZXh0U3RhdGUgPSBhbmltYXRpb25TdGVwKHRpbWVTdGVwIC8gMTAwMCwgcHJldk5leHRTdGF0ZSk7XG5cdCAgICAgICAgICB2YXIgX3JlZiA9IFtwcmV2TmV4dFN0YXRlLCBhbmltUnVubmluZ1tpXS5uZXh0U3RhdGVdO1xuXHQgICAgICAgICAgYW5pbVJ1bm5pbmdbaV0ucHJldlN0YXRlID0gX3JlZlswXTtcblx0ICAgICAgICAgIHByZXZOZXh0U3RhdGUgPSBfcmVmWzFdO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIGFjY3VtdWxhdGVkVGltZSA9IGFjY3VtdWxhdGVkVGltZSAtIGZyYW1lTnVtYmVyICogdGltZVN0ZXA7XG5cdFxuXHQgICAgLy8gUmVuZGVyIGFuZCBmaWx0ZXIgaW4gb25lIGl0ZXJhdGlvbi5cblx0ICAgIHZhciBhbHBoYSA9IDEgKyBhY2N1bXVsYXRlZFRpbWUgLyB0aW1lU3RlcDtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5pbVJ1bm5pbmcubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgdmFyIF9hbmltUnVubmluZyRpMiA9IGFuaW1SdW5uaW5nW2ldO1xuXHQgICAgICB2YXIgYW5pbWF0aW9uUmVuZGVyID0gX2FuaW1SdW5uaW5nJGkyLmFuaW1hdGlvblJlbmRlcjtcblx0ICAgICAgdmFyIG5leHRTdGF0ZSA9IF9hbmltUnVubmluZyRpMi5uZXh0U3RhdGU7XG5cdCAgICAgIHZhciBwcmV2U3RhdGUgPSBfYW5pbVJ1bm5pbmckaTIucHJldlN0YXRlO1xuXHRcblx0ICAgICAgLy8gTWlnaHQgbXV0YXRlIGFuaW1SdW5uaW5nLi4uLi4uLi5cblx0ICAgICAgYW5pbWF0aW9uUmVuZGVyKGFscGhhLCBuZXh0U3RhdGUsIHByZXZTdGF0ZSk7XG5cdCAgICB9XG5cdFxuXHQgICAgYW5pbVJ1bm5pbmcgPSBhbmltUnVubmluZy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG5cdCAgICAgIHZhciBhY3RpdmUgPSBfcmVmMi5hY3RpdmU7XG5cdCAgICAgIHJldHVybiBhY3RpdmU7XG5cdCAgICB9KTtcblx0XG5cdCAgICBpZiAoYW5pbVJ1bm5pbmcubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJhZihsb29wKTtcblx0ICAgIH1cblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIHN0YXJ0KCkge1xuXHQgICAgaWYgKCFydW5uaW5nKSB7XG5cdCAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuXHQgICAgICBwcmV2VGltZSA9IG5vdygpO1xuXHQgICAgICBhY2N1bXVsYXRlZFRpbWUgPSAwO1xuXHQgICAgICByYWYobG9vcCk7XG5cdCAgICB9XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oc3RhdGUsIGFuaW1hdGlvblN0ZXAsIGFuaW1hdGlvblJlbmRlcikge1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmltUnVubmluZy5sZW5ndGg7IGkrKykge1xuXHQgICAgICB2YXIgdmFsID0gYW5pbVJ1bm5pbmdbaV07XG5cdCAgICAgIGlmICh2YWwuYW5pbWF0aW9uU3RlcCA9PT0gYW5pbWF0aW9uU3RlcCkge1xuXHQgICAgICAgIHZhbC5hY3RpdmUgPSB0cnVlO1xuXHQgICAgICAgIHZhbC5wcmV2U3RhdGUgPSBzdGF0ZTtcblx0ICAgICAgICBzdGFydCgpO1xuXHQgICAgICAgIHJldHVybiB2YWwuc3RvcDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIHZhciBuZXdBbmltID0ge1xuXHQgICAgICBhbmltYXRpb25TdGVwOiBhbmltYXRpb25TdGVwLFxuXHQgICAgICBhbmltYXRpb25SZW5kZXI6IGFuaW1hdGlvblJlbmRlcixcblx0ICAgICAgcHJldlN0YXRlOiBzdGF0ZSxcblx0ICAgICAgbmV4dFN0YXRlOiBzdGF0ZSxcblx0ICAgICAgYWN0aXZlOiB0cnVlXG5cdCAgICB9O1xuXHRcblx0ICAgIG5ld0FuaW0uc3RvcCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIG5ld0FuaW0uYWN0aXZlID0gZmFsc2U7XG5cdCAgICB9O1xuXHQgICAgYW5pbVJ1bm5pbmcucHVzaChuZXdBbmltKTtcblx0XG5cdCAgICBzdGFydCgpO1xuXHRcblx0ICAgIHJldHVybiBuZXdBbmltLnN0b3A7XG5cdCAgfTtcblx0fVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0sXG4vKiAxOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0XG5cdHZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cdFxuXHRleHBvcnRzWydkZWZhdWx0J10gPSBjb21wb25lbnRzO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXHRcblx0dmFyIF9ub1ZlbG9jaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMik7XG5cdFxuXHR2YXIgX25vVmVsb2NpdHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbm9WZWxvY2l0eSk7XG5cdFxuXHR2YXIgX2hhc1JlYWNoZWRTdHlsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xuXHRcblx0dmFyIF9oYXNSZWFjaGVkU3R5bGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFzUmVhY2hlZFN0eWxlKTtcblx0XG5cdHZhciBfbWVyZ2VEaWZmID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG5cdFxuXHR2YXIgX21lcmdlRGlmZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9tZXJnZURpZmYpO1xuXHRcblx0dmFyIF9hbmltYXRpb25Mb29wID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7XG5cdFxuXHR2YXIgX2FuaW1hdGlvbkxvb3AyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYW5pbWF0aW9uTG9vcCk7XG5cdFxuXHR2YXIgX3plcm8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTtcblx0XG5cdHZhciBfemVybzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF96ZXJvKTtcblx0XG5cdHZhciBfdXBkYXRlVHJlZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpO1xuXHRcblx0dmFyIF9kZXByZWNhdGVkU3ByaW5nczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTtcblx0XG5cdHZhciBfZGVwcmVjYXRlZFNwcmluZ3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVwcmVjYXRlZFNwcmluZ3MyKTtcblx0XG5cdHZhciBfc3RyaXBTdHlsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjcpO1xuXHRcblx0dmFyIF9zdHJpcFN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0cmlwU3R5bGUpO1xuXHRcblx0dmFyIHN0YXJ0QW5pbWF0aW9uID0gX2FuaW1hdGlvbkxvb3AyWydkZWZhdWx0J10oKTtcblx0XG5cdGZ1bmN0aW9uIG1hcE9iamVjdChmLCBvYmopIHtcblx0ICB2YXIgcmV0ID0ge307XG5cdCAgZm9yICh2YXIga2V5IGluIG9iaikge1xuXHQgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIHJldFtrZXldID0gZihvYmpba2V5XSwga2V5KTtcblx0ICB9XG5cdCAgcmV0dXJuIHJldDtcblx0fVxuXHRcblx0ZnVuY3Rpb24gZXZlcnlPYmooZiwgb2JqKSB7XG5cdCAgZm9yICh2YXIga2V5IGluIG9iaikge1xuXHQgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIGlmICghZihvYmpba2V5XSwga2V5KSkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiB0cnVlO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBjb21wb25lbnRzKFJlYWN0KSB7XG5cdCAgdmFyIFByb3BUeXBlcyA9IFJlYWN0LlByb3BUeXBlcztcblx0XG5cdCAgdmFyIE1vdGlvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblx0ICAgIGRpc3BsYXlOYW1lOiAnTW90aW9uJyxcblx0XG5cdCAgICBwcm9wVHlwZXM6IHtcblx0ICAgICAgLy8gVE9PRDogd2FybiBhZ2FpbnN0IHB1dHRpbmcgYSBjb25maWcgaW4gaGVyZVxuXHQgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZShwcm9wLCBwcm9wTmFtZSkge1xuXHQgICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignU3ByaW5nXFwncyBgZGVmYXVsdFZhbHVlYCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGBkZWZhdWx0U3R5bGVgLiAnICsgJ0l0cyBmb3JtYXQgcmVjZWl2ZWQgYSBmZXcgKGVhc3kgdG8gdXBkYXRlISkgY2hhbmdlcyBhcyB3ZWxsLicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgZW5kVmFsdWU6IGZ1bmN0aW9uIGVuZFZhbHVlKHByb3AsIHByb3BOYW1lKSB7XG5cdCAgICAgICAgaWYgKHByb3BbcHJvcE5hbWVdKSB7XG5cdCAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdTcHJpbmdcXCdzIGBlbmRWYWx1ZWAgaGFzIGJlZW4gY2hhbmdlZCB0byBgc3R5bGVgLiBJdHMgZm9ybWF0ICcgKyAncmVjZWl2ZWQgYSBmZXcgKGVhc3kgdG8gdXBkYXRlISkgY2hhbmdlcyBhcyB3ZWxsLicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgZGVmYXVsdFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuXHQgICAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuXHQgICAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuXHQgICAgfSxcblx0XG5cdCAgICBnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcblx0ICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHM7XG5cdCAgICAgIHZhciBkZWZhdWx0U3R5bGUgPSBfcHJvcHMuZGVmYXVsdFN0eWxlO1xuXHQgICAgICB2YXIgc3R5bGUgPSBfcHJvcHMuc3R5bGU7XG5cdFxuXHQgICAgICB2YXIgY3VycmVudFN0eWxlID0gZGVmYXVsdFN0eWxlIHx8IHN0eWxlO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGN1cnJlbnRTdHlsZTogY3VycmVudFN0eWxlLFxuXHQgICAgICAgIGN1cnJlbnRWZWxvY2l0eTogbWFwT2JqZWN0KF96ZXJvMlsnZGVmYXVsdCddLCBjdXJyZW50U3R5bGUpXG5cdCAgICAgIH07XG5cdCAgICB9LFxuXHRcblx0ICAgIGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcblx0ICAgICAgdGhpcy5zdGFydEFuaW1hdGluZygpO1xuXHQgICAgfSxcblx0XG5cdCAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkge1xuXHQgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG5cdCAgICB9LFxuXHRcblx0ICAgIGFuaW1hdGlvblN0ZXA6IGZ1bmN0aW9uIGFuaW1hdGlvblN0ZXAodGltZXN0ZXAsIHN0YXRlKSB7XG5cdCAgICAgIHZhciBjdXJyZW50U3R5bGUgPSBzdGF0ZS5jdXJyZW50U3R5bGU7XG5cdCAgICAgIHZhciBjdXJyZW50VmVsb2NpdHkgPSBzdGF0ZS5jdXJyZW50VmVsb2NpdHk7XG5cdCAgICAgIHZhciBzdHlsZSA9IHRoaXMucHJvcHMuc3R5bGU7XG5cdFxuXHQgICAgICB2YXIgbmV3Q3VycmVudFN0eWxlID0gX3VwZGF0ZVRyZWUudXBkYXRlQ3VycmVudFN0eWxlKHRpbWVzdGVwLCBjdXJyZW50U3R5bGUsIGN1cnJlbnRWZWxvY2l0eSwgc3R5bGUpO1xuXHQgICAgICB2YXIgbmV3Q3VycmVudFZlbG9jaXR5ID0gX3VwZGF0ZVRyZWUudXBkYXRlQ3VycmVudFZlbG9jaXR5KHRpbWVzdGVwLCBjdXJyZW50U3R5bGUsIGN1cnJlbnRWZWxvY2l0eSwgc3R5bGUpO1xuXHRcblx0ICAgICAgLy8gVE9PRDogdGhpcyBpc24ndCBuZWNlc3NhcnkgYW55bW9yZS4gSXQgd2FzIHVzZWQgb25seSBhZ2FpbnN0IGVuZFZhbHVlIGZ1bmNcblx0ICAgICAgaWYgKF9ub1ZlbG9jaXR5MlsnZGVmYXVsdCddKGN1cnJlbnRWZWxvY2l0eSwgbmV3Q3VycmVudFN0eWxlKSAmJiBfbm9WZWxvY2l0eTJbJ2RlZmF1bHQnXShuZXdDdXJyZW50VmVsb2NpdHksIG5ld0N1cnJlbnRTdHlsZSkpIHtcblx0ICAgICAgICAvLyBjaGVjayBleHBsYW5hdGlvbiBpbiBgTW90aW9uLmFuaW1hdGlvblJlbmRlcmBcblx0ICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTsgLy8gTmFzdHkgc2lkZSBlZmZlY3RzLi4uLlxuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGN1cnJlbnRTdHlsZTogbmV3Q3VycmVudFN0eWxlLFxuXHQgICAgICAgIGN1cnJlbnRWZWxvY2l0eTogbmV3Q3VycmVudFZlbG9jaXR5XG5cdCAgICAgIH07XG5cdCAgICB9LFxuXHRcblx0ICAgIHN0b3BBbmltYXRpb246IG51bGwsXG5cdFxuXHQgICAgLy8gdXNlZCBpbiBhbmltYXRpb25SZW5kZXJcblx0ICAgIGhhc1VubW91bnRlZDogZmFsc2UsXG5cdFxuXHQgICAgY29tcG9uZW50V2lsbFVubW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuXHQgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcblx0ICAgICAgdGhpcy5oYXNVbm1vdW50ZWQgPSB0cnVlO1xuXHQgICAgfSxcblx0XG5cdCAgICBzdGFydEFuaW1hdGluZzogZnVuY3Rpb24gc3RhcnRBbmltYXRpbmcoKSB7XG5cdCAgICAgIC8vIElzIHNtYXJ0IGVub3VnaCB0byBub3Qgc3RhcnQgaXQgdHdpY2Vcblx0ICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uID0gc3RhcnRBbmltYXRpb24odGhpcy5zdGF0ZSwgdGhpcy5hbmltYXRpb25TdGVwLCB0aGlzLmFuaW1hdGlvblJlbmRlcik7XG5cdCAgICB9LFxuXHRcblx0ICAgIGFuaW1hdGlvblJlbmRlcjogZnVuY3Rpb24gYW5pbWF0aW9uUmVuZGVyKGFscGhhLCBuZXh0U3RhdGUsIHByZXZTdGF0ZSkge1xuXHQgICAgICAvLyBgdGhpcy5oYXNVbm1vdW50ZWRgIG1pZ2h0IGJlIHRydWUgaW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb246XG5cdCAgICAgIC8vIHVzZXIgZG9lcyBzb21lIGNoZWNrcyBpbiBgc3R5bGVgIGFuZCBjYWxscyBhbiBvd25lciBoYW5kbGVyXG5cdCAgICAgIC8vIG93bmVyIHNldHMgc3RhdGUgaW4gdGhlIGNhbGxiYWNrLCB0cmlnZ2VyaW5nIGEgcmUtcmVuZGVyXG5cdCAgICAgIC8vIHVubW91bnRzIE1vdGlvblxuXHQgICAgICBpZiAoIXRoaXMuaGFzVW5tb3VudGVkKSB7XG5cdCAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG5cdCAgICAgICAgICBjdXJyZW50U3R5bGU6IF91cGRhdGVUcmVlLmludGVycG9sYXRlVmFsdWUoYWxwaGEsIG5leHRTdGF0ZS5jdXJyZW50U3R5bGUsIHByZXZTdGF0ZS5jdXJyZW50U3R5bGUpLFxuXHQgICAgICAgICAgY3VycmVudFZlbG9jaXR5OiBuZXh0U3RhdGUuY3VycmVudFZlbG9jaXR5XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdFxuXHQgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHZhciBzdHJpcHBlZFN0eWxlID0gX3N0cmlwU3R5bGUyWydkZWZhdWx0J10odGhpcy5zdGF0ZS5jdXJyZW50U3R5bGUpO1xuXHQgICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW4oc3RyaXBwZWRTdHlsZSk7XG5cdCAgICAgIHJldHVybiByZW5kZXJlZENoaWxkcmVuICYmIFJlYWN0LkNoaWxkcmVuLm9ubHkocmVuZGVyZWRDaGlsZHJlbik7XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHZhciBTdGFnZ2VyZWRNb3Rpb24gPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdCAgICBkaXNwbGF5TmFtZTogJ1N0YWdnZXJlZE1vdGlvbicsXG5cdFxuXHQgICAgcHJvcFR5cGVzOiB7XG5cdCAgICAgIGRlZmF1bHRTdHlsZTogZnVuY3Rpb24gZGVmYXVsdFN0eWxlKHByb3AsIHByb3BOYW1lKSB7XG5cdCAgICAgICAgaWYgKHByb3BbcHJvcE5hbWVdKSB7XG5cdCAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdZb3UgZm9yZ290IHRoZSBcInNcIiBmb3IgYFN0YWdnZXJlZE1vdGlvbmBcXCdzIGBkZWZhdWx0U3R5bGVzYC4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShwcm9wLCBwcm9wTmFtZSkge1xuXHQgICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignWW91IGZvcmdvdCB0aGUgXCJzXCIgZm9yIGBTdGFnZ2VyZWRNb3Rpb25gXFwncyBgc3R5bGVzYC4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIC8vIFRPT0Q6IHdhcm4gYWdhaW5zdCBwdXR0aW5nIGNvbmZpZ3MgaW4gaGVyZVxuXHQgICAgICBkZWZhdWx0U3R5bGVzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcblx0ICAgICAgc3R5bGVzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuXHQgICAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuXHQgICAgfSxcblx0XG5cdCAgICBnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcblx0ICAgICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzO1xuXHQgICAgICB2YXIgc3R5bGVzID0gX3Byb3BzMi5zdHlsZXM7XG5cdCAgICAgIHZhciBkZWZhdWx0U3R5bGVzID0gX3Byb3BzMi5kZWZhdWx0U3R5bGVzO1xuXHRcblx0ICAgICAgdmFyIGN1cnJlbnRTdHlsZXMgPSBkZWZhdWx0U3R5bGVzID8gZGVmYXVsdFN0eWxlcyA6IHN0eWxlcygpO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGN1cnJlbnRTdHlsZXM6IGN1cnJlbnRTdHlsZXMsXG5cdCAgICAgICAgY3VycmVudFZlbG9jaXRpZXM6IGN1cnJlbnRTdHlsZXMubWFwKGZ1bmN0aW9uIChzKSB7XG5cdCAgICAgICAgICByZXR1cm4gbWFwT2JqZWN0KF96ZXJvMlsnZGVmYXVsdCddLCBzKTtcblx0ICAgICAgICB9KVxuXHQgICAgICB9O1xuXHQgICAgfSxcblx0XG5cdCAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG5cdCAgICAgIHRoaXMuc3RhcnRBbmltYXRpbmcoKTtcblx0ICAgIH0sXG5cdFxuXHQgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpIHtcblx0ICAgICAgdGhpcy5zdGFydEFuaW1hdGluZygpO1xuXHQgICAgfSxcblx0XG5cdCAgICBhbmltYXRpb25TdGVwOiBmdW5jdGlvbiBhbmltYXRpb25TdGVwKHRpbWVzdGVwLCBzdGF0ZSkge1xuXHQgICAgICB2YXIgY3VycmVudFN0eWxlcyA9IHN0YXRlLmN1cnJlbnRTdHlsZXM7XG5cdCAgICAgIHZhciBjdXJyZW50VmVsb2NpdGllcyA9IHN0YXRlLmN1cnJlbnRWZWxvY2l0aWVzO1xuXHRcblx0ICAgICAgdmFyIHN0eWxlcyA9IHRoaXMucHJvcHMuc3R5bGVzKGN1cnJlbnRTdHlsZXMubWFwKF9zdHJpcFN0eWxlMlsnZGVmYXVsdCddKSk7XG5cdFxuXHQgICAgICB2YXIgbmV3Q3VycmVudFN0eWxlcyA9IGN1cnJlbnRTdHlsZXMubWFwKGZ1bmN0aW9uIChjdXJyZW50U3R5bGUsIGkpIHtcblx0ICAgICAgICByZXR1cm4gX3VwZGF0ZVRyZWUudXBkYXRlQ3VycmVudFN0eWxlKHRpbWVzdGVwLCBjdXJyZW50U3R5bGUsIGN1cnJlbnRWZWxvY2l0aWVzW2ldLCBzdHlsZXNbaV0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgdmFyIG5ld0N1cnJlbnRWZWxvY2l0aWVzID0gY3VycmVudFN0eWxlcy5tYXAoZnVuY3Rpb24gKGN1cnJlbnRTdHlsZSwgaSkge1xuXHQgICAgICAgIHJldHVybiBfdXBkYXRlVHJlZS51cGRhdGVDdXJyZW50VmVsb2NpdHkodGltZXN0ZXAsIGN1cnJlbnRTdHlsZSwgY3VycmVudFZlbG9jaXRpZXNbaV0sIHN0eWxlc1tpXSk7XG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgLy8gVE9ETzogaXMgdGhpcyByaWdodD9cblx0ICAgICAgaWYgKGN1cnJlbnRWZWxvY2l0aWVzLmV2ZXJ5KGZ1bmN0aW9uICh2LCBrKSB7XG5cdCAgICAgICAgcmV0dXJuIF9ub1ZlbG9jaXR5MlsnZGVmYXVsdCddKHYsIGN1cnJlbnRTdHlsZXNba10pO1xuXHQgICAgICB9KSAmJiBuZXdDdXJyZW50VmVsb2NpdGllcy5ldmVyeShmdW5jdGlvbiAodiwgaykge1xuXHQgICAgICAgIHJldHVybiBfbm9WZWxvY2l0eTJbJ2RlZmF1bHQnXSh2LCBuZXdDdXJyZW50U3R5bGVzW2tdKTtcblx0ICAgICAgfSkpIHtcblx0ICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICBjdXJyZW50U3R5bGVzOiBuZXdDdXJyZW50U3R5bGVzLFxuXHQgICAgICAgIGN1cnJlbnRWZWxvY2l0aWVzOiBuZXdDdXJyZW50VmVsb2NpdGllc1xuXHQgICAgICB9O1xuXHQgICAgfSxcblx0XG5cdCAgICBzdG9wQW5pbWF0aW9uOiBudWxsLFxuXHRcblx0ICAgIC8vIHVzZWQgaW4gYW5pbWF0aW9uUmVuZGVyXG5cdCAgICBoYXNVbm1vdW50ZWQ6IGZhbHNlLFxuXHRcblx0ICAgIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcblx0ICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XG5cdCAgICAgIHRoaXMuaGFzVW5tb3VudGVkID0gdHJ1ZTtcblx0ICAgIH0sXG5cdFxuXHQgICAgc3RhcnRBbmltYXRpbmc6IGZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW5nKCkge1xuXHQgICAgICB0aGlzLnN0b3BBbmltYXRpb24gPSBzdGFydEFuaW1hdGlvbih0aGlzLnN0YXRlLCB0aGlzLmFuaW1hdGlvblN0ZXAsIHRoaXMuYW5pbWF0aW9uUmVuZGVyKTtcblx0ICAgIH0sXG5cdFxuXHQgICAgYW5pbWF0aW9uUmVuZGVyOiBmdW5jdGlvbiBhbmltYXRpb25SZW5kZXIoYWxwaGEsIG5leHRTdGF0ZSwgcHJldlN0YXRlKSB7XG5cdCAgICAgIC8vIFNlZSBjb21tZW50IGluIE1vdGlvbi5cblx0ICAgICAgaWYgKCF0aGlzLmhhc1VubW91bnRlZCkge1xuXHQgICAgICAgIHZhciBjdXJyZW50U3R5bGVzID0gbmV4dFN0YXRlLmN1cnJlbnRTdHlsZXMubWFwKGZ1bmN0aW9uIChzdHlsZSwgaSkge1xuXHQgICAgICAgICAgcmV0dXJuIF91cGRhdGVUcmVlLmludGVycG9sYXRlVmFsdWUoYWxwaGEsIHN0eWxlLCBwcmV2U3RhdGUuY3VycmVudFN0eWxlc1tpXSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG5cdCAgICAgICAgICBjdXJyZW50U3R5bGVzOiBjdXJyZW50U3R5bGVzLFxuXHQgICAgICAgICAgY3VycmVudFZlbG9jaXRpZXM6IG5leHRTdGF0ZS5jdXJyZW50VmVsb2NpdGllc1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHRcblx0ICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICB2YXIgc3RyaXBwZWRTdHlsZSA9IHRoaXMuc3RhdGUuY3VycmVudFN0eWxlcy5tYXAoX3N0cmlwU3R5bGUyWydkZWZhdWx0J10pO1xuXHQgICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW4oc3RyaXBwZWRTdHlsZSk7XG5cdCAgICAgIHJldHVybiByZW5kZXJlZENoaWxkcmVuICYmIFJlYWN0LkNoaWxkcmVuLm9ubHkocmVuZGVyZWRDaGlsZHJlbik7XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHZhciBUcmFuc2l0aW9uTW90aW9uID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHQgICAgZGlzcGxheU5hbWU6ICdUcmFuc2l0aW9uTW90aW9uJyxcblx0XG5cdCAgICBwcm9wVHlwZXM6IHtcblx0ICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VmFsdWUocHJvcCwgcHJvcE5hbWUpIHtcblx0ICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcblx0ICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1RyYW5zaXRpb25TcHJpbmdcXCdzIGBkZWZhdWx0VmFsdWVgIGhhcyBiZWVuIGNoYW5nZWQgdG8gJyArICdgZGVmYXVsdFN0eWxlc2AuIEl0cyBmb3JtYXQgcmVjZWl2ZWQgYSBmZXcgKGVhc3kgdG8gdXBkYXRlISkgJyArICdjaGFuZ2VzIGFzIHdlbGwuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICBlbmRWYWx1ZTogZnVuY3Rpb24gZW5kVmFsdWUocHJvcCwgcHJvcE5hbWUpIHtcblx0ICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcblx0ICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1RyYW5zaXRpb25TcHJpbmdcXCdzIGBlbmRWYWx1ZWAgaGFzIGJlZW4gY2hhbmdlZCB0byBgc3R5bGVzYC4gJyArICdJdHMgZm9ybWF0IHJlY2VpdmVkIGEgZmV3IChlYXN5IHRvIHVwZGF0ZSEpIGNoYW5nZXMgYXMgd2VsbC4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIGRlZmF1bHRTdHlsZTogZnVuY3Rpb24gZGVmYXVsdFN0eWxlKHByb3AsIHByb3BOYW1lKSB7XG5cdCAgICAgICAgaWYgKHByb3BbcHJvcE5hbWVdKSB7XG5cdCAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdZb3UgZm9yZ290IHRoZSBcInNcIiBmb3IgYFRyYW5zaXRpb25Nb3Rpb25gXFwncyBgZGVmYXVsdFN0eWxlc2AuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICBzdHlsZTogZnVuY3Rpb24gc3R5bGUocHJvcCwgcHJvcE5hbWUpIHtcblx0ICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcblx0ICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBmb3Jnb3QgdGhlIFwic1wiIGZvciBgVHJhbnNpdGlvbk1vdGlvbmBcXCdzIGBzdHlsZXNgLicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgLy8gVE9PRDogd2FybiBhZ2FpbnN0IHB1dHRpbmcgY29uZmlncyBpbiBoZXJlXG5cdCAgICAgIGRlZmF1bHRTdHlsZXM6IFByb3BUeXBlcy5vYmplY3RPZihQcm9wVHlwZXMuYW55KSxcblx0ICAgICAgc3R5bGVzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLm9iamVjdE9mKFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCldKS5pc1JlcXVpcmVkLFxuXHQgICAgICB3aWxsTGVhdmU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jXSksXG5cdCAgICAgIC8vIFRPT0Q6IHdhcm4gYWdhaW5zdCBwdXR0aW5nIGNvbmZpZ3MgaW4gaGVyZVxuXHQgICAgICB3aWxsRW50ZXI6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jXSksXG5cdCAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG5cdCAgICB9LFxuXHRcblx0ICAgIGdldERlZmF1bHRQcm9wczogZnVuY3Rpb24gZ2V0RGVmYXVsdFByb3BzKCkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHdpbGxFbnRlcjogZnVuY3Rpb24gd2lsbEVudGVyKGtleSwgdmFsdWUpIHtcblx0ICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHdpbGxMZWF2ZTogZnVuY3Rpb24gd2lsbExlYXZlKCkge1xuXHQgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfSxcblx0XG5cdCAgICBnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcblx0ICAgICAgdmFyIF9wcm9wczMgPSB0aGlzLnByb3BzO1xuXHQgICAgICB2YXIgc3R5bGVzID0gX3Byb3BzMy5zdHlsZXM7XG5cdCAgICAgIHZhciBkZWZhdWx0U3R5bGVzID0gX3Byb3BzMy5kZWZhdWx0U3R5bGVzO1xuXHRcblx0ICAgICAgdmFyIGN1cnJlbnRTdHlsZXMgPSB1bmRlZmluZWQ7XG5cdCAgICAgIGlmIChkZWZhdWx0U3R5bGVzID09IG51bGwpIHtcblx0ICAgICAgICBpZiAodHlwZW9mIHN0eWxlcyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgY3VycmVudFN0eWxlcyA9IHN0eWxlcygpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBjdXJyZW50U3R5bGVzID0gc3R5bGVzO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjdXJyZW50U3R5bGVzID0gZGVmYXVsdFN0eWxlcztcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGN1cnJlbnRTdHlsZXM6IGN1cnJlbnRTdHlsZXMsXG5cdCAgICAgICAgY3VycmVudFZlbG9jaXRpZXM6IG1hcE9iamVjdChmdW5jdGlvbiAocykge1xuXHQgICAgICAgICAgcmV0dXJuIG1hcE9iamVjdChfemVybzJbJ2RlZmF1bHQnXSwgcyk7XG5cdCAgICAgICAgfSwgY3VycmVudFN0eWxlcylcblx0ICAgICAgfTtcblx0ICAgIH0sXG5cdFxuXHQgICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuXHQgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG5cdCAgICB9LFxuXHRcblx0ICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKSB7XG5cdCAgICAgIHRoaXMuc3RhcnRBbmltYXRpbmcoKTtcblx0ICAgIH0sXG5cdFxuXHQgICAgYW5pbWF0aW9uU3RlcDogZnVuY3Rpb24gYW5pbWF0aW9uU3RlcCh0aW1lc3RlcCwgc3RhdGUpIHtcblx0ICAgICAgdmFyIGN1cnJlbnRTdHlsZXMgPSBzdGF0ZS5jdXJyZW50U3R5bGVzO1xuXHQgICAgICB2YXIgY3VycmVudFZlbG9jaXRpZXMgPSBzdGF0ZS5jdXJyZW50VmVsb2NpdGllcztcblx0ICAgICAgdmFyIF9wcm9wczQgPSB0aGlzLnByb3BzO1xuXHQgICAgICB2YXIgc3R5bGVzID0gX3Byb3BzNC5zdHlsZXM7XG5cdCAgICAgIHZhciB3aWxsRW50ZXIgPSBfcHJvcHM0LndpbGxFbnRlcjtcblx0ICAgICAgdmFyIHdpbGxMZWF2ZSA9IF9wcm9wczQud2lsbExlYXZlO1xuXHRcblx0ICAgICAgaWYgKHR5cGVvZiBzdHlsZXMgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICBzdHlsZXMgPSBzdHlsZXMoY3VycmVudFN0eWxlcyk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIC8vIFRPRE86IGh1aD9cblx0ICAgICAgdmFyIG1lcmdlZFN0eWxlcyA9IHN0eWxlczsgLy8gc2V0IG1lcmdlZFN0eWxlcyB0byBzdHlsZXMgYXMgdGhlIGRlZmF1bHRcblx0ICAgICAgdmFyIGhhc05ld0tleSA9IGZhbHNlO1xuXHRcblx0ICAgICAgbWVyZ2VkU3R5bGVzID0gX21lcmdlRGlmZjJbJ2RlZmF1bHQnXShjdXJyZW50U3R5bGVzLCBzdHlsZXMsXG5cdCAgICAgIC8vIFRPRE86IHN0b3AgYWxsb2NhdGluZyBsaWtlIGNyYXp5IGluIHRoaXMgd2hvbGUgY29kZSBwYXRoXG5cdCAgICAgIGZ1bmN0aW9uIChrZXkpIHtcblx0ICAgICAgICB2YXIgcmVzID0gd2lsbExlYXZlKGtleSwgY3VycmVudFN0eWxlc1trZXldLCBzdHlsZXMsIGN1cnJlbnRTdHlsZXMsIGN1cnJlbnRWZWxvY2l0aWVzKTtcblx0ICAgICAgICBpZiAocmVzID09IG51bGwpIHtcblx0ICAgICAgICAgIC8vIEZvciBsZWdhY3kgcmVhc29uLiBXZSB3b24ndCBhbGxvdyByZXR1cm5pbmcgbnVsbCBzb29uXG5cdCAgICAgICAgICAvLyBUT0RPOiByZW1vdmUsIGFmdGVyIG5leHQgcmVsZWFzZVxuXHQgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBpZiAoX25vVmVsb2NpdHkyWydkZWZhdWx0J10oY3VycmVudFZlbG9jaXRpZXNba2V5XSwgY3VycmVudFN0eWxlc1trZXldKSAmJiBfaGFzUmVhY2hlZFN0eWxlMlsnZGVmYXVsdCddKGN1cnJlbnRTdHlsZXNba2V5XSwgcmVzKSkge1xuXHQgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXM7XG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgT2JqZWN0LmtleXMobWVyZ2VkU3R5bGVzKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuXHQgICAgICAgIHJldHVybiAhY3VycmVudFN0eWxlcy5oYXNPd25Qcm9wZXJ0eShrZXkpO1xuXHQgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0ICAgICAgICB2YXIgX2V4dGVuZHMyLCBfZXh0ZW5kczM7XG5cdFxuXHQgICAgICAgIGhhc05ld0tleSA9IHRydWU7XG5cdCAgICAgICAgdmFyIGVudGVyU3R5bGUgPSB3aWxsRW50ZXIoa2V5LCBtZXJnZWRTdHlsZXNba2V5XSwgc3R5bGVzLCBjdXJyZW50U3R5bGVzLCBjdXJyZW50VmVsb2NpdGllcyk7XG5cdFxuXHQgICAgICAgIC8vIFdlIGNhbiBtdXRhdGUgdGhpcyBoZXJlIGJlY2F1c2UgbWVyZ2VEaWZmIHJldHVybnMgYSBuZXcgT2JqXG5cdCAgICAgICAgbWVyZ2VkU3R5bGVzW2tleV0gPSBlbnRlclN0eWxlO1xuXHRcblx0ICAgICAgICBjdXJyZW50U3R5bGVzID0gX2V4dGVuZHMoe30sIGN1cnJlbnRTdHlsZXMsIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW2tleV0gPSBlbnRlclN0eWxlLCBfZXh0ZW5kczIpKTtcblx0ICAgICAgICBjdXJyZW50VmVsb2NpdGllcyA9IF9leHRlbmRzKHt9LCBjdXJyZW50VmVsb2NpdGllcywgKF9leHRlbmRzMyA9IHt9LCBfZXh0ZW5kczNba2V5XSA9IG1hcE9iamVjdChfemVybzJbJ2RlZmF1bHQnXSwgZW50ZXJTdHlsZSksIF9leHRlbmRzMykpO1xuXHQgICAgICB9KTtcblx0XG5cdCAgICAgIHZhciBuZXdDdXJyZW50U3R5bGVzID0gbWFwT2JqZWN0KGZ1bmN0aW9uIChtZXJnZWRTdHlsZSwga2V5KSB7XG5cdCAgICAgICAgcmV0dXJuIF91cGRhdGVUcmVlLnVwZGF0ZUN1cnJlbnRTdHlsZSh0aW1lc3RlcCwgY3VycmVudFN0eWxlc1trZXldLCBjdXJyZW50VmVsb2NpdGllc1trZXldLCBtZXJnZWRTdHlsZSk7XG5cdCAgICAgIH0sIG1lcmdlZFN0eWxlcyk7XG5cdCAgICAgIHZhciBuZXdDdXJyZW50VmVsb2NpdGllcyA9IG1hcE9iamVjdChmdW5jdGlvbiAobWVyZ2VkU3R5bGUsIGtleSkge1xuXHQgICAgICAgIHJldHVybiBfdXBkYXRlVHJlZS51cGRhdGVDdXJyZW50VmVsb2NpdHkodGltZXN0ZXAsIGN1cnJlbnRTdHlsZXNba2V5XSwgY3VycmVudFZlbG9jaXRpZXNba2V5XSwgbWVyZ2VkU3R5bGUpO1xuXHQgICAgICB9LCBtZXJnZWRTdHlsZXMpO1xuXHRcblx0ICAgICAgaWYgKCFoYXNOZXdLZXkgJiYgZXZlcnlPYmooZnVuY3Rpb24gKHYsIGspIHtcblx0ICAgICAgICByZXR1cm4gX25vVmVsb2NpdHkyWydkZWZhdWx0J10odiwgY3VycmVudFN0eWxlc1trXSk7XG5cdCAgICAgIH0sIGN1cnJlbnRWZWxvY2l0aWVzKSAmJiBldmVyeU9iaihmdW5jdGlvbiAodiwgaykge1xuXHQgICAgICAgIHJldHVybiBfbm9WZWxvY2l0eTJbJ2RlZmF1bHQnXSh2LCBuZXdDdXJyZW50U3R5bGVzW2tdKTtcblx0ICAgICAgfSwgbmV3Q3VycmVudFZlbG9jaXRpZXMpKSB7XG5cdCAgICAgICAgLy8gY2hlY2sgZXhwbGFuYXRpb24gaW4gYE1vdGlvbi5hbmltYXRpb25SZW5kZXJgXG5cdCAgICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7IC8vIE5hc3R5IHNpZGUgZWZmZWN0cy4uLi5cblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICBjdXJyZW50U3R5bGVzOiBuZXdDdXJyZW50U3R5bGVzLFxuXHQgICAgICAgIGN1cnJlbnRWZWxvY2l0aWVzOiBuZXdDdXJyZW50VmVsb2NpdGllc1xuXHQgICAgICB9O1xuXHQgICAgfSxcblx0XG5cdCAgICBzdG9wQW5pbWF0aW9uOiBudWxsLFxuXHRcblx0ICAgIC8vIHVzZWQgaW4gYW5pbWF0aW9uUmVuZGVyXG5cdCAgICBoYXNVbm1vdW50ZWQ6IGZhbHNlLFxuXHRcblx0ICAgIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcblx0ICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XG5cdCAgICAgIHRoaXMuaGFzVW5tb3VudGVkID0gdHJ1ZTtcblx0ICAgIH0sXG5cdFxuXHQgICAgc3RhcnRBbmltYXRpbmc6IGZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW5nKCkge1xuXHQgICAgICB0aGlzLnN0b3BBbmltYXRpb24gPSBzdGFydEFuaW1hdGlvbih0aGlzLnN0YXRlLCB0aGlzLmFuaW1hdGlvblN0ZXAsIHRoaXMuYW5pbWF0aW9uUmVuZGVyKTtcblx0ICAgIH0sXG5cdFxuXHQgICAgYW5pbWF0aW9uUmVuZGVyOiBmdW5jdGlvbiBhbmltYXRpb25SZW5kZXIoYWxwaGEsIG5leHRTdGF0ZSwgcHJldlN0YXRlKSB7XG5cdCAgICAgIC8vIFNlZSBjb21tZW50IGluIE1vdGlvbi5cblx0ICAgICAgaWYgKCF0aGlzLmhhc1VubW91bnRlZCkge1xuXHQgICAgICAgIHZhciBjdXJyZW50U3R5bGVzID0gbWFwT2JqZWN0KGZ1bmN0aW9uIChzdHlsZSwga2V5KSB7XG5cdCAgICAgICAgICByZXR1cm4gX3VwZGF0ZVRyZWUuaW50ZXJwb2xhdGVWYWx1ZShhbHBoYSwgc3R5bGUsIHByZXZTdGF0ZS5jdXJyZW50U3R5bGVzW2tleV0pO1xuXHQgICAgICAgIH0sIG5leHRTdGF0ZS5jdXJyZW50U3R5bGVzKTtcblx0ICAgICAgICB0aGlzLnNldFN0YXRlKHtcblx0ICAgICAgICAgIGN1cnJlbnRTdHlsZXM6IGN1cnJlbnRTdHlsZXMsXG5cdCAgICAgICAgICBjdXJyZW50VmVsb2NpdGllczogbmV4dFN0YXRlLmN1cnJlbnRWZWxvY2l0aWVzXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdFxuXHQgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHZhciBzdHJpcHBlZFN0eWxlID0gbWFwT2JqZWN0KF9zdHJpcFN0eWxlMlsnZGVmYXVsdCddLCB0aGlzLnN0YXRlLmN1cnJlbnRTdHlsZXMpO1xuXHQgICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW4oc3RyaXBwZWRTdHlsZSk7XG5cdCAgICAgIHJldHVybiByZW5kZXJlZENoaWxkcmVuICYmIFJlYWN0LkNoaWxkcmVuLm9ubHkocmVuZGVyZWRDaGlsZHJlbik7XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHZhciBfZGVwcmVjYXRlZFNwcmluZ3MgPSBfZGVwcmVjYXRlZFNwcmluZ3MzWydkZWZhdWx0J10oUmVhY3QpO1xuXHRcblx0ICB2YXIgU3ByaW5nID0gX2RlcHJlY2F0ZWRTcHJpbmdzLlNwcmluZztcblx0ICB2YXIgVHJhbnNpdGlvblNwcmluZyA9IF9kZXByZWNhdGVkU3ByaW5ncy5UcmFuc2l0aW9uU3ByaW5nO1xuXHRcblx0ICByZXR1cm4geyBTcHJpbmc6IFNwcmluZywgVHJhbnNpdGlvblNwcmluZzogVHJhbnNpdGlvblNwcmluZywgTW90aW9uOiBNb3Rpb24sIFN0YWdnZXJlZE1vdGlvbjogU3RhZ2dlcmVkTW90aW9uLCBUcmFuc2l0aW9uTW90aW9uOiBUcmFuc2l0aW9uTW90aW9uIH07XG5cdH1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9LFxuLyogMTkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbJ2RlZmF1bHQnXSA9IGRlcHJlY2F0ZWRTcHJpbmdzO1xuXHR2YXIgaGFzV2FybmVkRm9yU3ByaW5nID0ge307XG5cdHZhciBoYXNXYXJuZWRGb3JUcmFuc2l0aW9uU3ByaW5nID0ge307XG5cdFxuXHRmdW5jdGlvbiBkZXByZWNhdGVkU3ByaW5ncyhSZWFjdCkge1xuXHQgIHZhciBTcHJpbmcgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdCAgICBkaXNwbGF5TmFtZTogJ1NwcmluZycsXG5cdFxuXHQgICAgY29tcG9uZW50V2lsbE1vdW50OiBmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG5cdCAgICAgIGlmIChmYWxzZSkge1xuXHQgICAgICAgIHZhciBvd25lck5hbWUgPSB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lciAmJiB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lci5nZXROYW1lKCk7XG5cdCAgICAgICAgaWYgKCFoYXNXYXJuZWRGb3JTcHJpbmdbb3duZXJOYW1lXSkge1xuXHQgICAgICAgICAgaGFzV2FybmVkRm9yU3ByaW5nW293bmVyTmFtZV0gPSB0cnVlO1xuXHQgICAgICAgICAgY29uc29sZS5lcnJvcignU3ByaW5nICh1c2VkIGluICVzcmVuZGVyKSBoYXMgbm93IGJlZW4gcmVuYW1lZCB0byBNb3Rpb24uICcgKyAnUGxlYXNlIHNlZSB0aGUgcmVsZWFzZSBub3RlIGZvciB0aGUgdXBncmFkZSBwYXRoLiBUaGFuayB5b3UhJywgb3duZXJOYW1lID8gb3duZXJOYW1lICsgJ1xcJ3MgJyA6ICdSZWFjdC4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdFxuXHQgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICB2YXIgVHJhbnNpdGlvblNwcmluZyA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblx0ICAgIGRpc3BsYXlOYW1lOiAnVHJhbnNpdGlvblNwcmluZycsXG5cdFxuXHQgICAgY29tcG9uZW50V2lsbE1vdW50OiBmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG5cdCAgICAgIGlmIChmYWxzZSkge1xuXHQgICAgICAgIHZhciBvd25lck5hbWUgPSB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lciAmJiB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lci5nZXROYW1lKCk7XG5cdCAgICAgICAgaWYgKCFoYXNXYXJuZWRGb3JUcmFuc2l0aW9uU3ByaW5nW293bmVyTmFtZV0pIHtcblx0ICAgICAgICAgIGhhc1dhcm5lZEZvclRyYW5zaXRpb25TcHJpbmdbb3duZXJOYW1lXSA9IHRydWU7XG5cdCAgICAgICAgICBjb25zb2xlLmVycm9yKCdUcmFuc2l0aW9uU3ByaW5nICh1c2VkIGluICVzcmVuZGVyKSBoYXMgbm93IGJlZW4gcmVuYW1lZCB0byAnICsgJ1RyYW5zaXRpb25Nb3Rpb24uIFBsZWFzZSBzZWUgdGhlIHJlbGVhc2Ugbm90ZSBmb3IgdGhlIHVwZ3JhZGUgJyArICdwYXRoLiBUaGFuayB5b3UhJywgb3duZXJOYW1lID8gb3duZXJOYW1lICsgJ1xcJ3MgJyA6ICdSZWFjdC4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdFxuXHQgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4geyBTcHJpbmc6IFNwcmluZywgVHJhbnNpdGlvblNwcmluZzogVHJhbnNpdGlvblNwcmluZyB9O1xuXHR9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSxcbi8qIDIwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaGFzUmVhY2hlZFN0eWxlO1xuXHRcblx0ZnVuY3Rpb24gaGFzUmVhY2hlZFN0eWxlKGN1cnJlbnRTdHlsZSwgc3R5bGUpIHtcblx0ICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcblx0ICAgIGlmICghc3R5bGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIHZhciBjdXJyZW50VmFsdWUgPSBjdXJyZW50U3R5bGVba2V5XTtcblx0ICAgIHZhciBkZXN0VmFsdWUgPSBzdHlsZVtrZXldO1xuXHQgICAgaWYgKCFkZXN0VmFsdWUuY29uZmlnKSB7XG5cdCAgICAgIC8vIG5vdCBhIHNwcmluZyBjb25maWdcblx0ICAgICAgY29udGludWU7XG5cdCAgICB9XG5cdCAgICBpZiAoY3VycmVudFZhbHVlLmNvbmZpZyAmJiBjdXJyZW50VmFsdWUudmFsICE9PSBkZXN0VmFsdWUudmFsKSB7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICAgIGlmICghY3VycmVudFZhbHVlLmNvbmZpZyAmJiBjdXJyZW50VmFsdWUgIT09IGRlc3RWYWx1ZS52YWwpIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgcmV0dXJuIHRydWU7XG5cdH1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cbi8qKiovIH0sXG4vKiAyMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gdGhpcyBmdW5jdGlvbiBpcyBhbGxvY2F0aW9uLWxlc3MgdGhhbmtzIHRvIGJhYmVsLCB3aGljaCB0cmFuc2Zvcm1zIHRoZSB0YWlsXG5cdC8vIGNhbGxzIGludG8gbG9vcHNcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1lcmdlRGlmZjtcblx0ZnVuY3Rpb24gbWVyZ2VEaWZmQXJyKF94LCBfeDIsIF94MywgX3g0LCBfeDUsIF94NiwgX3g3KSB7XG5cdCAgdmFyIF9hZ2FpbiA9IHRydWU7XG5cdFxuXHQgIF9mdW5jdGlvbjogd2hpbGUgKF9hZ2Fpbikge1xuXHQgICAgdmFyIGFyckEgPSBfeCxcblx0ICAgICAgICBhcnJCID0gX3gyLFxuXHQgICAgICAgIGNvbGxCID0gX3gzLFxuXHQgICAgICAgIGluZGV4QSA9IF94NCxcblx0ICAgICAgICBpbmRleEIgPSBfeDUsXG5cdCAgICAgICAgb25SZW1vdmUgPSBfeDYsXG5cdCAgICAgICAgYWNjdW0gPSBfeDc7XG5cdCAgICBlbmRBID0gZW5kQiA9IGtleUEgPSBrZXlCID0gZmlsbCA9IGZpbGwgPSB1bmRlZmluZWQ7XG5cdCAgICBfYWdhaW4gPSBmYWxzZTtcblx0XG5cdCAgICB2YXIgZW5kQSA9IGluZGV4QSA9PT0gYXJyQS5sZW5ndGg7XG5cdCAgICB2YXIgZW5kQiA9IGluZGV4QiA9PT0gYXJyQi5sZW5ndGg7XG5cdCAgICB2YXIga2V5QSA9IGFyckFbaW5kZXhBXTtcblx0ICAgIHZhciBrZXlCID0gYXJyQltpbmRleEJdO1xuXHQgICAgaWYgKGVuZEEgJiYgZW5kQikge1xuXHQgICAgICAvLyByZXR1cm5pbmcgbnVsbCBoZXJlLCBvdGhlcndpc2UgbGludCBjb21wbGFpbnMgdGhhdCB3ZSdyZSBub3QgZXhwZWN0aW5nXG5cdCAgICAgIC8vIGEgcmV0dXJuIHZhbHVlIGluIHN1YnNlcXVlbnQgY2FsbHMuIFdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZy5cblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKGVuZEEpIHtcblx0ICAgICAgYWNjdW1ba2V5Ql0gPSBjb2xsQltrZXlCXTtcblx0ICAgICAgX3ggPSBhcnJBO1xuXHQgICAgICBfeDIgPSBhcnJCO1xuXHQgICAgICBfeDMgPSBjb2xsQjtcblx0ICAgICAgX3g0ID0gaW5kZXhBO1xuXHQgICAgICBfeDUgPSBpbmRleEIgKyAxO1xuXHQgICAgICBfeDYgPSBvblJlbW92ZTtcblx0ICAgICAgX3g3ID0gYWNjdW07XG5cdCAgICAgIF9hZ2FpbiA9IHRydWU7XG5cdCAgICAgIGNvbnRpbnVlIF9mdW5jdGlvbjtcblx0ICAgIH1cblx0XG5cdCAgICBpZiAoZW5kQikge1xuXHQgICAgICB2YXIgZmlsbCA9IG9uUmVtb3ZlKGtleUEpO1xuXHQgICAgICBpZiAoZmlsbCAhPSBudWxsKSB7XG5cdCAgICAgICAgYWNjdW1ba2V5QV0gPSBmaWxsO1xuXHQgICAgICB9XG5cdCAgICAgIF94ID0gYXJyQTtcblx0ICAgICAgX3gyID0gYXJyQjtcblx0ICAgICAgX3gzID0gY29sbEI7XG5cdCAgICAgIF94NCA9IGluZGV4QSArIDE7XG5cdCAgICAgIF94NSA9IGluZGV4Qjtcblx0ICAgICAgX3g2ID0gb25SZW1vdmU7XG5cdCAgICAgIF94NyA9IGFjY3VtO1xuXHQgICAgICBfYWdhaW4gPSB0cnVlO1xuXHQgICAgICBjb250aW51ZSBfZnVuY3Rpb247XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKGtleUEgPT09IGtleUIpIHtcblx0ICAgICAgYWNjdW1ba2V5QV0gPSBjb2xsQltrZXlBXTtcblx0ICAgICAgX3ggPSBhcnJBO1xuXHQgICAgICBfeDIgPSBhcnJCO1xuXHQgICAgICBfeDMgPSBjb2xsQjtcblx0ICAgICAgX3g0ID0gaW5kZXhBICsgMTtcblx0ICAgICAgX3g1ID0gaW5kZXhCICsgMTtcblx0ICAgICAgX3g2ID0gb25SZW1vdmU7XG5cdCAgICAgIF94NyA9IGFjY3VtO1xuXHQgICAgICBfYWdhaW4gPSB0cnVlO1xuXHQgICAgICBjb250aW51ZSBfZnVuY3Rpb247XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKCFjb2xsQi5oYXNPd25Qcm9wZXJ0eShrZXlBKSkge1xuXHQgICAgICB2YXIgZmlsbCA9IG9uUmVtb3ZlKGtleUEpO1xuXHQgICAgICBpZiAoZmlsbCAhPSBudWxsKSB7XG5cdCAgICAgICAgYWNjdW1ba2V5QV0gPSBmaWxsO1xuXHQgICAgICB9XG5cdCAgICAgIF94ID0gYXJyQTtcblx0ICAgICAgX3gyID0gYXJyQjtcblx0ICAgICAgX3gzID0gY29sbEI7XG5cdCAgICAgIF94NCA9IGluZGV4QSArIDE7XG5cdCAgICAgIF94NSA9IGluZGV4Qjtcblx0ICAgICAgX3g2ID0gb25SZW1vdmU7XG5cdCAgICAgIF94NyA9IGFjY3VtO1xuXHQgICAgICBfYWdhaW4gPSB0cnVlO1xuXHQgICAgICBjb250aW51ZSBfZnVuY3Rpb247XG5cdCAgICB9XG5cdFxuXHQgICAgX3ggPSBhcnJBO1xuXHQgICAgX3gyID0gYXJyQjtcblx0ICAgIF94MyA9IGNvbGxCO1xuXHQgICAgX3g0ID0gaW5kZXhBICsgMTtcblx0ICAgIF94NSA9IGluZGV4Qjtcblx0ICAgIF94NiA9IG9uUmVtb3ZlO1xuXHQgICAgX3g3ID0gYWNjdW07XG5cdCAgICBfYWdhaW4gPSB0cnVlO1xuXHQgICAgY29udGludWUgX2Z1bmN0aW9uO1xuXHQgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gbWVyZ2VEaWZmKGEsIGIsIG9uUmVtb3ZlKSB7XG5cdCAgdmFyIHJldCA9IHt9O1xuXHQgIC8vIGlmIGFueW9uZSBjYW4gbWFrZSB0aGlzIHdvcmsgd2l0aG91dCBhbGxvY2F0aW5nIHRoZSBhcnJheXMgaGVyZSwgd2UnbGxcblx0ICAvLyBnaXZlIHlvdSBhIG1lZGFsXG5cdCAgbWVyZ2VEaWZmQXJyKE9iamVjdC5rZXlzKGEpLCBPYmplY3Qua2V5cyhiKSwgYiwgMCwgMCwgb25SZW1vdmUsIHJldCk7XG5cdCAgcmV0dXJuIHJldDtcblx0fVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSxcbi8qIDIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBjdXJyZW50U3R5bGUga2VlcHMgdGhlIGluZm8gYWJvdXQgd2hldGhlciBhIHByb3AgaXMgY29uZmlndXJlZCBhcyBhIHNwcmluZ1xuXHQvLyBvciBpZiBpdCdzIGp1c3QgYSByYW5kb20gcHJvcCB0aGF0IGhhcHBlbnMgdG8gYmUgcHJlc2VudCBvbiB0aGUgc3R5bGVcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IG5vVmVsb2NpdHk7XG5cdFxuXHRmdW5jdGlvbiBub1ZlbG9jaXR5KGN1cnJlbnRWZWxvY2l0eSwgY3VycmVudFN0eWxlKSB7XG5cdCAgZm9yICh2YXIga2V5IGluIGN1cnJlbnRWZWxvY2l0eSkge1xuXHQgICAgaWYgKCFjdXJyZW50VmVsb2NpdHkuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIGlmIChjdXJyZW50U3R5bGVba2V5XS5jb25maWcgJiYgY3VycmVudFZlbG9jaXR5W2tleV0gIT09IDApIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gdHJ1ZTtcblx0fVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSxcbi8qIDIzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXHRcblx0dmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblx0XG5cdHZhciBfY29tcG9uZW50czIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KTtcblx0XG5cdHZhciBfY29tcG9uZW50czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb21wb25lbnRzMik7XG5cdFxuXHR2YXIgX3Jlb3JkZXJLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5cdFxuXHR2YXIgX3Jlb3JkZXJLZXlzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Jlb3JkZXJLZXlzKTtcblx0XG5cdHZhciBfY29tcG9uZW50cyA9IF9jb21wb25lbnRzM1snZGVmYXVsdCddKF9yZWFjdDJbJ2RlZmF1bHQnXSk7XG5cdFxuXHR2YXIgU3ByaW5nID0gX2NvbXBvbmVudHMuU3ByaW5nO1xuXHR2YXIgVHJhbnNpdGlvblNwcmluZyA9IF9jb21wb25lbnRzLlRyYW5zaXRpb25TcHJpbmc7XG5cdHZhciBNb3Rpb24gPSBfY29tcG9uZW50cy5Nb3Rpb247XG5cdHZhciBTdGFnZ2VyZWRNb3Rpb24gPSBfY29tcG9uZW50cy5TdGFnZ2VyZWRNb3Rpb247XG5cdHZhciBUcmFuc2l0aW9uTW90aW9uID0gX2NvbXBvbmVudHMuVHJhbnNpdGlvbk1vdGlvbjtcblx0ZXhwb3J0cy5TcHJpbmcgPSBTcHJpbmc7XG5cdGV4cG9ydHMuVHJhbnNpdGlvblNwcmluZyA9IFRyYW5zaXRpb25TcHJpbmc7XG5cdGV4cG9ydHMuTW90aW9uID0gTW90aW9uO1xuXHRleHBvcnRzLlN0YWdnZXJlZE1vdGlvbiA9IFN0YWdnZXJlZE1vdGlvbjtcblx0ZXhwb3J0cy5UcmFuc2l0aW9uTW90aW9uID0gVHJhbnNpdGlvbk1vdGlvbjtcblx0XG5cdHZhciBfc3ByaW5nMiA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xuXHRcblx0dmFyIF9zcHJpbmczID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ByaW5nMik7XG5cdFxuXHRleHBvcnRzLnNwcmluZyA9IF9zcHJpbmczWydkZWZhdWx0J107XG5cdFxuXHR2YXIgX3ByZXNldHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0XG5cdHZhciBfcHJlc2V0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcmVzZXRzMik7XG5cdFxuXHRleHBvcnRzLnByZXNldHMgPSBfcHJlc2V0czNbJ2RlZmF1bHQnXTtcblx0dmFyIHV0aWxzID0ge1xuXHQgIHJlb3JkZXJLZXlzOiBfcmVvcmRlcktleXMyWydkZWZhdWx0J11cblx0fTtcblx0ZXhwb3J0cy51dGlscyA9IHV0aWxzO1xuXG4vKioqLyB9LFxuLyogMjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSByZW9yZGVyS2V5cztcblx0XG5cdGZ1bmN0aW9uIHJlb3JkZXJLZXlzKG9iaiwgZikge1xuXHQgIHZhciBuZXdLZXlzID0gZihPYmplY3Qua2V5cyhvYmopKTtcblx0ICB2YXIgcmV0ID0ge307XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICB2YXIga2V5ID0gbmV3S2V5c1tpXTtcblx0ICAgIHJldFtrZXldID0gb2JqW2tleV07XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9LFxuLyogMjUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbJ2RlZmF1bHQnXSA9IHNwcmluZztcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblx0XG5cdHZhciBfcHJlc2V0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdFxuXHR2YXIgX3ByZXNldHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJlc2V0cyk7XG5cdFxuXHQvLyBpbnN0ZWFkIG9mIGV4cG9zaW5nIHt2YWw6IGJsYSwgY29uZmlnOiBibGF9LCB1c2UgYSBoZWxwZXJcblx0XG5cdGZ1bmN0aW9uIHNwcmluZyh2YWwpIHtcblx0ICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gX3ByZXNldHMyWydkZWZhdWx0J10ubm9Xb2JibGUgOiBhcmd1bWVudHNbMV07XG5cdFxuXHQgIHJldHVybiB7IHZhbDogdmFsLCBjb25maWc6IGNvbmZpZyB9O1xuXHR9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSxcbi8qIDI2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gc3RlcHBlcjtcblx0dmFyIGVycm9yTWFyZ2luID0gMC4wMDAxO1xuXHRcblx0ZnVuY3Rpb24gc3RlcHBlcihmcmFtZVJhdGUsIHgsIHYsIGRlc3RYLCBrLCBiKSB7XG5cdCAgLy8gU3ByaW5nIHN0aWZmbmVzcywgaW4ga2cgLyBzXjJcblx0XG5cdCAgLy8gZm9yIGFuaW1hdGlvbnMsIGRlc3RYIGlzIHJlYWxseSBzcHJpbmcgbGVuZ3RoIChzcHJpbmcgYXQgcmVzdCkuIGluaXRpYWxcblx0ICAvLyBwb3NpdGlvbiBpcyBjb25zaWRlcmVkIGFzIHRoZSBzdHJldGNoZWQvY29tcHJlc3NlZCBwb3NpdGlvbiBvZiBhIHNwcmluZ1xuXHQgIHZhciBGc3ByaW5nID0gLWsgKiAoeCAtIGRlc3RYKTtcblx0XG5cdCAgLy8gRGFtcGluZywgaW4ga2cgLyBzXG5cdCAgdmFyIEZkYW1wZXIgPSAtYiAqIHY7XG5cdFxuXHQgIC8vIHVzdWFsbHkgd2UgcHV0IG1hc3MgaGVyZSwgYnV0IGZvciBhbmltYXRpb24gcHVycG9zZXMsIHNwZWNpZnlpbmcgbWFzcyBpcyBhXG5cdCAgLy8gYml0IHJlZHVuZGFudC4geW91IGNvdWxkIHNpbXBseSBhZGp1c3QgayBhbmQgYiBhY2NvcmRpbmdseVxuXHQgIC8vIGxldCBhID0gKEZzcHJpbmcgKyBGZGFtcGVyKSAvIG1hc3M7XG5cdCAgdmFyIGEgPSBGc3ByaW5nICsgRmRhbXBlcjtcblx0XG5cdCAgdmFyIG5ld1YgPSB2ICsgYSAqIGZyYW1lUmF0ZTtcblx0ICB2YXIgbmV3WCA9IHggKyBuZXdWICogZnJhbWVSYXRlO1xuXHRcblx0ICBpZiAoTWF0aC5hYnMobmV3ViAtIHYpIDwgZXJyb3JNYXJnaW4gJiYgTWF0aC5hYnMobmV3WCAtIHgpIDwgZXJyb3JNYXJnaW4pIHtcblx0ICAgIHJldHVybiBbZGVzdFgsIDBdO1xuXHQgIH1cblx0XG5cdCAgcmV0dXJuIFtuZXdYLCBuZXdWXTtcblx0fVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSxcbi8qIDI3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyB0dXJuIHt4OiB7dmFsOiAxLCBjb25maWc6IFsxLCAyXX0sIHk6IDJ9IGludG8ge3g6IDEsIHk6IDJ9XG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBzdHJpcFN0eWxlO1xuXHRcblx0ZnVuY3Rpb24gc3RyaXBTdHlsZShzdHlsZSkge1xuXHQgIHZhciByZXQgPSB7fTtcblx0ICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcblx0ICAgIGlmICghc3R5bGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIHJldFtrZXldID0gc3R5bGVba2V5XS52YWwgPT0gbnVsbCA/IHN0eWxlW2tleV0gOiBzdHlsZVtrZXldLnZhbDtcblx0ICB9XG5cdCAgcmV0dXJuIHJldDtcblx0fVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSxcbi8qIDI4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLmludGVycG9sYXRlVmFsdWUgPSBpbnRlcnBvbGF0ZVZhbHVlO1xuXHRleHBvcnRzLnVwZGF0ZUN1cnJlbnRTdHlsZSA9IHVwZGF0ZUN1cnJlbnRTdHlsZTtcblx0ZXhwb3J0cy51cGRhdGVDdXJyZW50VmVsb2NpdHkgPSB1cGRhdGVDdXJyZW50VmVsb2NpdHk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cdFxuXHR2YXIgX3N0ZXBwZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KTtcblx0XG5cdHZhciBfc3RlcHBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdGVwcGVyKTtcblx0XG5cdC8vIFRPRE86IHJlZmFjdG9yIGNvbW1vbiBsb2dpYyB3aXRoIHVwZGF0ZUN1cnJWYWx1ZSBhbmQgdXBkYXRlQ3VyclZlbG9jaXR5XG5cdFxuXHRmdW5jdGlvbiBpbnRlcnBvbGF0ZVZhbHVlKGFscGhhLCBuZXh0U3R5bGUsIHByZXZTdHlsZSkge1xuXHQgIC8vIG1pZ2h0IGJlIHVzZWQgYnkgYSBUcmFuc2l0aW9uTW90aW9uLCB3aGVyZSBwcmV2U3R5bGUgbWlnaHQgbm90IGV4aXN0IGFueW1vcmVcblx0ICBpZiAoIXByZXZTdHlsZSkge1xuXHQgICAgcmV0dXJuIG5leHRTdHlsZTtcblx0ICB9XG5cdFxuXHQgIHZhciByZXQgPSB7fTtcblx0ICBmb3IgKHZhciBrZXkgaW4gbmV4dFN0eWxlKSB7XG5cdCAgICBpZiAoIW5leHRTdHlsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHRcblx0ICAgIGlmICghbmV4dFN0eWxlW2tleV0uY29uZmlnKSB7XG5cdCAgICAgIHJldFtrZXldID0gbmV4dFN0eWxlW2tleV07XG5cdCAgICAgIC8vIG5vdCBhIHNwcmluZyBjb25maWcsIG5vdCBzb21ldGhpbmcgd2Ugd2FudCB0byBpbnRlcnBvbGF0ZVxuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIHZhciBwcmV2VmFsdWUgPSBwcmV2U3R5bGVba2V5XS5jb25maWcgPyBwcmV2U3R5bGVba2V5XS52YWwgOiBwcmV2U3R5bGVba2V5XTtcblx0ICAgIHJldFtrZXldID0ge1xuXHQgICAgICB2YWw6IG5leHRTdHlsZVtrZXldLnZhbCAqIGFscGhhICsgcHJldlZhbHVlICogKDEgLSBhbHBoYSksXG5cdCAgICAgIGNvbmZpZzogbmV4dFN0eWxlW2tleV0uY29uZmlnXG5cdCAgICB9O1xuXHQgIH1cblx0XG5cdCAgcmV0dXJuIHJldDtcblx0fVxuXHRcblx0Ly8gVE9ETzogcmVmYWN0b3IgY29tbW9uIGxvZ2ljIHdpdGggdXBkYXRlQ3VycmVudFZlbG9jaXR5XG5cdFxuXHRmdW5jdGlvbiB1cGRhdGVDdXJyZW50U3R5bGUoZnJhbWVSYXRlLCBjdXJyZW50U3R5bGUsIGN1cnJlbnRWZWxvY2l0eSwgc3R5bGUpIHtcblx0ICB2YXIgcmV0ID0ge307XG5cdCAgZm9yICh2YXIga2V5IGluIHN0eWxlKSB7XG5cdCAgICBpZiAoIXN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0ICAgICAgY29udGludWU7XG5cdCAgICB9XG5cdCAgICBpZiAoIXN0eWxlW2tleV0uY29uZmlnKSB7XG5cdCAgICAgIHJldFtrZXldID0gc3R5bGVba2V5XTtcblx0ICAgICAgLy8gbm90IGEgc3ByaW5nIGNvbmZpZywgbm90IHNvbWV0aGluZyB3ZSB3YW50IHRvIGludGVycG9sYXRlXG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgdmFyIF9zdHlsZSRrZXkkY29uZmlnID0gc3R5bGVba2V5XS5jb25maWc7XG5cdCAgICB2YXIgayA9IF9zdHlsZSRrZXkkY29uZmlnWzBdO1xuXHQgICAgdmFyIGIgPSBfc3R5bGUka2V5JGNvbmZpZ1sxXTtcblx0XG5cdCAgICB2YXIgdmFsID0gX3N0ZXBwZXIyWydkZWZhdWx0J10oZnJhbWVSYXRlLFxuXHQgICAgLy8gbWlnaHQgaGF2ZSBiZWVuIGEgbm9uLXNwcmluZ2VkIHByb3AgdGhhdCBqdXN0IGJlY2FtZSBvbmVcblx0ICAgIGN1cnJlbnRTdHlsZVtrZXldLnZhbCA9PSBudWxsID8gY3VycmVudFN0eWxlW2tleV0gOiBjdXJyZW50U3R5bGVba2V5XS52YWwsIGN1cnJlbnRWZWxvY2l0eVtrZXldLCBzdHlsZVtrZXldLnZhbCwgaywgYilbMF07XG5cdCAgICByZXRba2V5XSA9IHtcblx0ICAgICAgdmFsOiB2YWwsXG5cdCAgICAgIGNvbmZpZzogc3R5bGVba2V5XS5jb25maWdcblx0ICAgIH07XG5cdCAgfVxuXHQgIHJldHVybiByZXQ7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIHVwZGF0ZUN1cnJlbnRWZWxvY2l0eShmcmFtZVJhdGUsIGN1cnJlbnRTdHlsZSwgY3VycmVudFZlbG9jaXR5LCBzdHlsZSkge1xuXHQgIHZhciByZXQgPSB7fTtcblx0ICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcblx0ICAgIGlmICghc3R5bGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIGlmICghc3R5bGVba2V5XS5jb25maWcpIHtcblx0ICAgICAgLy8gbm90IGEgc3ByaW5nIGNvbmZpZywgbm90IHNvbWV0aGluZyB3ZSB3YW50IHRvIGludGVycG9sYXRlXG5cdCAgICAgIHJldFtrZXldID0gMDtcblx0ICAgICAgY29udGludWU7XG5cdCAgICB9XG5cdCAgICB2YXIgX3N0eWxlJGtleSRjb25maWcyID0gc3R5bGVba2V5XS5jb25maWc7XG5cdCAgICB2YXIgayA9IF9zdHlsZSRrZXkkY29uZmlnMlswXTtcblx0ICAgIHZhciBiID0gX3N0eWxlJGtleSRjb25maWcyWzFdO1xuXHRcblx0ICAgIHZhciB2YWwgPSBfc3RlcHBlcjJbJ2RlZmF1bHQnXShmcmFtZVJhdGUsXG5cdCAgICAvLyBtaWdodCBoYXZlIGJlZW4gYSBub24tc3ByaW5nZWQgcHJvcCB0aGF0IGp1c3QgYmVjYW1lIG9uZVxuXHQgICAgY3VycmVudFN0eWxlW2tleV0udmFsID09IG51bGwgPyBjdXJyZW50U3R5bGVba2V5XSA6IGN1cnJlbnRTdHlsZVtrZXldLnZhbCwgY3VycmVudFZlbG9jaXR5W2tleV0sIHN0eWxlW2tleV0udmFsLCBrLCBiKVsxXTtcblx0ICAgIHJldFtrZXldID0gdmFsO1xuXHQgIH1cblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cbi8qKiovIH0sXG4vKiAyOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gdXNlZCBieSB0aGUgdHJlZS13YWxraW5nIHVwZGF0ZXMgYW5kIHNwcmluZ3MuIEF2b2lkcyBzb21lIGFsbG9jYXRpb25zXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB6ZXJvO1xuXHRcblx0ZnVuY3Rpb24gemVybygpIHtcblx0ICByZXR1cm4gMDtcblx0fVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSxcbi8qIDMwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgbm93ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KVxuXHQgICwgZ2xvYmFsID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyB7fSA6IHdpbmRvd1xuXHQgICwgdmVuZG9ycyA9IFsnbW96JywgJ3dlYmtpdCddXG5cdCAgLCBzdWZmaXggPSAnQW5pbWF0aW9uRnJhbWUnXG5cdCAgLCByYWYgPSBnbG9iYWxbJ3JlcXVlc3QnICsgc3VmZml4XVxuXHQgICwgY2FmID0gZ2xvYmFsWydjYW5jZWwnICsgc3VmZml4XSB8fCBnbG9iYWxbJ2NhbmNlbFJlcXVlc3QnICsgc3VmZml4XVxuXHRcblx0Zm9yKHZhciBpID0gMDsgaSA8IHZlbmRvcnMubGVuZ3RoICYmICFyYWY7IGkrKykge1xuXHQgIHJhZiA9IGdsb2JhbFt2ZW5kb3JzW2ldICsgJ1JlcXVlc3QnICsgc3VmZml4XVxuXHQgIGNhZiA9IGdsb2JhbFt2ZW5kb3JzW2ldICsgJ0NhbmNlbCcgKyBzdWZmaXhdXG5cdCAgICAgIHx8IGdsb2JhbFt2ZW5kb3JzW2ldICsgJ0NhbmNlbFJlcXVlc3QnICsgc3VmZml4XVxuXHR9XG5cdFxuXHQvLyBTb21lIHZlcnNpb25zIG9mIEZGIGhhdmUgckFGIGJ1dCBub3QgY0FGXG5cdGlmKCFyYWYgfHwgIWNhZikge1xuXHQgIHZhciBsYXN0ID0gMFxuXHQgICAgLCBpZCA9IDBcblx0ICAgICwgcXVldWUgPSBbXVxuXHQgICAgLCBmcmFtZUR1cmF0aW9uID0gMTAwMCAvIDYwXG5cdFxuXHQgIHJhZiA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cdCAgICBpZihxdWV1ZS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgdmFyIF9ub3cgPSBub3coKVxuXHQgICAgICAgICwgbmV4dCA9IE1hdGgubWF4KDAsIGZyYW1lRHVyYXRpb24gLSAoX25vdyAtIGxhc3QpKVxuXHQgICAgICBsYXN0ID0gbmV4dCArIF9ub3dcblx0ICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0ICAgICAgICB2YXIgY3AgPSBxdWV1ZS5zbGljZSgwKVxuXHQgICAgICAgIC8vIENsZWFyIHF1ZXVlIGhlcmUgdG8gcHJldmVudFxuXHQgICAgICAgIC8vIGNhbGxiYWNrcyBmcm9tIGFwcGVuZGluZyBsaXN0ZW5lcnNcblx0ICAgICAgICAvLyB0byB0aGUgY3VycmVudCBmcmFtZSdzIHF1ZXVlXG5cdCAgICAgICAgcXVldWUubGVuZ3RoID0gMFxuXHQgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgaWYoIWNwW2ldLmNhbmNlbGxlZCkge1xuXHQgICAgICAgICAgICB0cnl7XG5cdCAgICAgICAgICAgICAgY3BbaV0uY2FsbGJhY2sobGFzdClcblx0ICAgICAgICAgICAgfSBjYXRjaChlKSB7XG5cdCAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgdGhyb3cgZSB9LCAwKVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9LCBNYXRoLnJvdW5kKG5leHQpKVxuXHQgICAgfVxuXHQgICAgcXVldWUucHVzaCh7XG5cdCAgICAgIGhhbmRsZTogKytpZCxcblx0ICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuXHQgICAgICBjYW5jZWxsZWQ6IGZhbHNlXG5cdCAgICB9KVxuXHQgICAgcmV0dXJuIGlkXG5cdCAgfVxuXHRcblx0ICBjYWYgPSBmdW5jdGlvbihoYW5kbGUpIHtcblx0ICAgIGZvcih2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuXHQgICAgICBpZihxdWV1ZVtpXS5oYW5kbGUgPT09IGhhbmRsZSkge1xuXHQgICAgICAgIHF1ZXVlW2ldLmNhbmNlbGxlZCA9IHRydWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbikge1xuXHQgIC8vIFdyYXAgaW4gYSBuZXcgZnVuY3Rpb24gdG8gcHJldmVudFxuXHQgIC8vIGBjYW5jZWxgIHBvdGVudGlhbGx5IGJlaW5nIGFzc2lnbmVkXG5cdCAgLy8gdG8gdGhlIG5hdGl2ZSByQUYgZnVuY3Rpb25cblx0ICByZXR1cm4gcmFmLmNhbGwoZ2xvYmFsLCBmbilcblx0fVxuXHRtb2R1bGUuZXhwb3J0cy5jYW5jZWwgPSBmdW5jdGlvbigpIHtcblx0ICBjYWYuYXBwbHkoZ2xvYmFsLCBhcmd1bWVudHMpXG5cdH1cblxuXG4vKioqLyB9LFxuLyogMzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qXHJcblx0XHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5cdFx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxyXG5cdCovXHJcblx0dmFyIHN0eWxlc0luRG9tID0ge30sXHJcblx0XHRtZW1vaXplID0gZnVuY3Rpb24oZm4pIHtcclxuXHRcdFx0dmFyIG1lbW87XHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0aWYgKHR5cGVvZiBtZW1vID09PSBcInVuZGVmaW5lZFwiKSBtZW1vID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuXHRcdFx0XHRyZXR1cm4gbWVtbztcclxuXHRcdFx0fTtcclxuXHRcdH0sXHJcblx0XHRpc09sZElFID0gbWVtb2l6ZShmdW5jdGlvbigpIHtcclxuXHRcdFx0cmV0dXJuIC9tc2llIFs2LTldXFxiLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpO1xyXG5cdFx0fSksXHJcblx0XHRnZXRIZWFkRWxlbWVudCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRyZXR1cm4gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XHJcblx0XHR9KSxcclxuXHRcdHNpbmdsZXRvbkVsZW1lbnQgPSBudWxsLFxyXG5cdFx0c2luZ2xldG9uQ291bnRlciA9IDA7XHJcblx0XHJcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihsaXN0LCBvcHRpb25zKSB7XHJcblx0XHRpZih0cnVlKSB7XHJcblx0XHRcdGlmKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xyXG5cdFx0fVxyXG5cdFxyXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblx0XHQvLyBGb3JjZSBzaW5nbGUtdGFnIHNvbHV0aW9uIG9uIElFNi05LCB3aGljaCBoYXMgYSBoYXJkIGxpbWl0IG9uIHRoZSAjIG9mIDxzdHlsZT5cclxuXHRcdC8vIHRhZ3MgaXQgd2lsbCBhbGxvdyBvbiBhIHBhZ2VcclxuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5zaW5nbGV0b24gPT09IFwidW5kZWZpbmVkXCIpIG9wdGlvbnMuc2luZ2xldG9uID0gaXNPbGRJRSgpO1xyXG5cdFxyXG5cdFx0dmFyIHN0eWxlcyA9IGxpc3RUb1N0eWxlcyhsaXN0KTtcclxuXHRcdGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucyk7XHJcblx0XHJcblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcclxuXHRcdFx0dmFyIG1heVJlbW92ZSA9IFtdO1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XHJcblx0XHRcdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XHJcblx0XHRcdFx0ZG9tU3R5bGUucmVmcy0tO1xyXG5cdFx0XHRcdG1heVJlbW92ZS5wdXNoKGRvbVN0eWxlKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZihuZXdMaXN0KSB7XHJcblx0XHRcdFx0dmFyIG5ld1N0eWxlcyA9IGxpc3RUb1N0eWxlcyhuZXdMaXN0KTtcclxuXHRcdFx0XHRhZGRTdHlsZXNUb0RvbShuZXdTdHlsZXMsIG9wdGlvbnMpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtYXlSZW1vdmUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgZG9tU3R5bGUgPSBtYXlSZW1vdmVbaV07XHJcblx0XHRcdFx0aWYoZG9tU3R5bGUucmVmcyA9PT0gMCkge1xyXG5cdFx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKVxyXG5cdFx0XHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXSgpO1xyXG5cdFx0XHRcdFx0ZGVsZXRlIHN0eWxlc0luRG9tW2RvbVN0eWxlLmlkXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fVxyXG5cdFxyXG5cdGZ1bmN0aW9uIGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucykge1xyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcclxuXHRcdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XHJcblx0XHRcdGlmKGRvbVN0eWxlKSB7XHJcblx0XHRcdFx0ZG9tU3R5bGUucmVmcysrO1xyXG5cdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdFx0ZG9tU3R5bGUucGFydHNbal0oaXRlbS5wYXJ0c1tqXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGZvcig7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRkb21TdHlsZS5wYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dmFyIHBhcnRzID0gW107XHJcblx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdHBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRzdHlsZXNJbkRvbVtpdGVtLmlkXSA9IHtpZDogaXRlbS5pZCwgcmVmczogMSwgcGFydHM6IHBhcnRzfTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHRmdW5jdGlvbiBsaXN0VG9TdHlsZXMobGlzdCkge1xyXG5cdFx0dmFyIHN0eWxlcyA9IFtdO1xyXG5cdFx0dmFyIG5ld1N0eWxlcyA9IHt9O1xyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIGl0ZW0gPSBsaXN0W2ldO1xyXG5cdFx0XHR2YXIgaWQgPSBpdGVtWzBdO1xyXG5cdFx0XHR2YXIgY3NzID0gaXRlbVsxXTtcclxuXHRcdFx0dmFyIG1lZGlhID0gaXRlbVsyXTtcclxuXHRcdFx0dmFyIHNvdXJjZU1hcCA9IGl0ZW1bM107XHJcblx0XHRcdHZhciBwYXJ0ID0ge2NzczogY3NzLCBtZWRpYTogbWVkaWEsIHNvdXJjZU1hcDogc291cmNlTWFwfTtcclxuXHRcdFx0aWYoIW5ld1N0eWxlc1tpZF0pXHJcblx0XHRcdFx0c3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHtpZDogaWQsIHBhcnRzOiBbcGFydF19KTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBzdHlsZXM7XHJcblx0fVxyXG5cdFxyXG5cdGZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudCgpIHtcclxuXHRcdHZhciBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcblx0XHR2YXIgaGVhZCA9IGdldEhlYWRFbGVtZW50KCk7XHJcblx0XHRzdHlsZUVsZW1lbnQudHlwZSA9IFwidGV4dC9jc3NcIjtcclxuXHRcdGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTtcclxuXHRcdHJldHVybiBzdHlsZUVsZW1lbnQ7XHJcblx0fVxyXG5cdFxyXG5cdGZ1bmN0aW9uIGNyZWF0ZUxpbmtFbGVtZW50KCkge1xyXG5cdFx0dmFyIGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XHJcblx0XHR2YXIgaGVhZCA9IGdldEhlYWRFbGVtZW50KCk7XHJcblx0XHRsaW5rRWxlbWVudC5yZWwgPSBcInN0eWxlc2hlZXRcIjtcclxuXHRcdGhlYWQuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xyXG5cdFx0cmV0dXJuIGxpbmtFbGVtZW50O1xyXG5cdH1cclxuXHRcclxuXHRmdW5jdGlvbiBhZGRTdHlsZShvYmosIG9wdGlvbnMpIHtcclxuXHRcdHZhciBzdHlsZUVsZW1lbnQsIHVwZGF0ZSwgcmVtb3ZlO1xyXG5cdFxyXG5cdFx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XHJcblx0XHRcdHZhciBzdHlsZUluZGV4ID0gc2luZ2xldG9uQ291bnRlcisrO1xyXG5cdFx0XHRzdHlsZUVsZW1lbnQgPSBzaW5nbGV0b25FbGVtZW50IHx8IChzaW5nbGV0b25FbGVtZW50ID0gY3JlYXRlU3R5bGVFbGVtZW50KCkpO1xyXG5cdFx0XHR1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCBmYWxzZSk7XHJcblx0XHRcdHJlbW92ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQsIHN0eWxlSW5kZXgsIHRydWUpO1xyXG5cdFx0fSBlbHNlIGlmKG9iai5zb3VyY2VNYXAgJiZcclxuXHRcdFx0dHlwZW9mIFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHRcdHR5cGVvZiBVUkwuY3JlYXRlT2JqZWN0VVJMID09PSBcImZ1bmN0aW9uXCIgJiZcclxuXHRcdFx0dHlwZW9mIFVSTC5yZXZva2VPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG5cdFx0XHR0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHRcdHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcclxuXHRcdFx0c3R5bGVFbGVtZW50ID0gY3JlYXRlTGlua0VsZW1lbnQoKTtcclxuXHRcdFx0dXBkYXRlID0gdXBkYXRlTGluay5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCk7XHJcblx0XHRcdHJlbW92ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XHJcblx0XHRcdFx0aWYoc3R5bGVFbGVtZW50LmhyZWYpXHJcblx0XHRcdFx0XHRVUkwucmV2b2tlT2JqZWN0VVJMKHN0eWxlRWxlbWVudC5ocmVmKTtcclxuXHRcdFx0fTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHN0eWxlRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudCgpO1xyXG5cdFx0XHR1cGRhdGUgPSBhcHBseVRvVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50KTtcclxuXHRcdFx0cmVtb3ZlID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0c3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHRcclxuXHRcdHVwZGF0ZShvYmopO1xyXG5cdFxyXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVN0eWxlKG5ld09iaikge1xyXG5cdFx0XHRpZihuZXdPYmopIHtcclxuXHRcdFx0XHRpZihuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXApXHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0dXBkYXRlKG9iaiA9IG5ld09iaik7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmVtb3ZlKCk7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fVxyXG5cdFxyXG5cdHZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XHJcblx0XHR2YXIgdGV4dFN0b3JlID0gW107XHJcblx0XHJcblx0XHRyZXR1cm4gZnVuY3Rpb24gKGluZGV4LCByZXBsYWNlbWVudCkge1xyXG5cdFx0XHR0ZXh0U3RvcmVbaW5kZXhdID0gcmVwbGFjZW1lbnQ7XHJcblx0XHRcdHJldHVybiB0ZXh0U3RvcmUuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xyXG5cdFx0fTtcclxuXHR9KSgpO1xyXG5cdFxyXG5cdGZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcoc3R5bGVFbGVtZW50LCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcclxuXHRcdHZhciBjc3MgPSByZW1vdmUgPyBcIlwiIDogb2JqLmNzcztcclxuXHRcclxuXHRcdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xyXG5cdFx0XHRzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gcmVwbGFjZVRleHQoaW5kZXgsIGNzcyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcyk7XHJcblx0XHRcdHZhciBjaGlsZE5vZGVzID0gc3R5bGVFbGVtZW50LmNoaWxkTm9kZXM7XHJcblx0XHRcdGlmIChjaGlsZE5vZGVzW2luZGV4XSkgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTtcclxuXHRcdFx0aWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XHJcblx0XHRcdFx0c3R5bGVFbGVtZW50Lmluc2VydEJlZm9yZShjc3NOb2RlLCBjaGlsZE5vZGVzW2luZGV4XSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGNzc05vZGUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cdGZ1bmN0aW9uIGFwcGx5VG9UYWcoc3R5bGVFbGVtZW50LCBvYmopIHtcclxuXHRcdHZhciBjc3MgPSBvYmouY3NzO1xyXG5cdFx0dmFyIG1lZGlhID0gb2JqLm1lZGlhO1xyXG5cdFx0dmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XHJcblx0XHJcblx0XHRpZihtZWRpYSkge1xyXG5cdFx0XHRzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEpXHJcblx0XHR9XHJcblx0XHJcblx0XHRpZihzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xyXG5cdFx0XHRzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0d2hpbGUoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcclxuXHRcdFx0XHRzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcclxuXHRcdH1cclxuXHR9XHJcblx0XHJcblx0ZnVuY3Rpb24gdXBkYXRlTGluayhsaW5rRWxlbWVudCwgb2JqKSB7XHJcblx0XHR2YXIgY3NzID0gb2JqLmNzcztcclxuXHRcdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcclxuXHRcdHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xyXG5cdFxyXG5cdFx0aWYoc291cmNlTWFwKSB7XHJcblx0XHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI2NjAzODc1XHJcblx0XHRcdGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpICsgXCIgKi9cIjtcclxuXHRcdH1cclxuXHRcclxuXHRcdHZhciBibG9iID0gbmV3IEJsb2IoW2Nzc10sIHsgdHlwZTogXCJ0ZXh0L2Nzc1wiIH0pO1xyXG5cdFxyXG5cdFx0dmFyIG9sZFNyYyA9IGxpbmtFbGVtZW50LmhyZWY7XHJcblx0XHJcblx0XHRsaW5rRWxlbWVudC5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHRcclxuXHRcdGlmKG9sZFNyYylcclxuXHRcdFx0VVJMLnJldm9rZU9iamVjdFVSTChvbGRTcmMpO1xyXG5cdH1cclxuXG5cbi8qKiovIH0sXG4vKiAzMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcyEuLy4uLy4uL25vZGVfbW9kdWxlcy9hdXRvcHJlZml4ZXItbG9hZGVyL2luZGV4LmpzP2Jyb3dzZXJzPWxhc3QgMiB2ZXJzaW9uIS4vLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2luZGV4LmpzIS4vbWFpbi5zY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanMhLi8uLi8uLi9ub2RlX21vZHVsZXMvYXV0b3ByZWZpeGVyLWxvYWRlci9pbmRleC5qcz9icm93c2Vycz1sYXN0IDIgdmVyc2lvbiEuLy4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9pbmRleC5qcyEuL21haW4uc2Nzc1wiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDMzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB2aWV3Qm94PVxcXCIwIDAgMjY4MSA4MTRcXFwiIHZlcnNpb249XFxcIjEuMVxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCIgeG1sbnM6c2tldGNoPVxcXCJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnNcXFwiPjx0aXRsZT5DbGltYiBMb2dvIEJldGE8L3RpdGxlPjxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPjxkZWZzPjwvZGVmcz48ZyBpZD1cXFwiUGFnZS0xXFxcIiBzdHJva2U9XFxcIm5vbmVcXFwiIHN0cm9rZS13aWR0aD1cXFwiMVxcXCIgZmlsbD1cXFwibm9uZVxcXCIgZmlsbC1ydWxlPVxcXCJldmVub2RkXFxcIiBza2V0Y2g6dHlwZT1cXFwiTVNQYWdlXFxcIj48ZyBpZD1cXFwiQ2xpbWItTG9nby1CZXRhXFxcIiBza2V0Y2g6dHlwZT1cXFwiTVNBcnRib2FyZEdyb3VwXFxcIiBmaWxsPVxcXCIjMTkzNzREXFxcIj48ZyBpZD1cXFwiY2xpLS0tLWIuc29jaWFsLSstUGF0aC1Db3B5LSstVHlwZS1zb21ldGhpbmctQ29weS1Db3B5LUNvcHktQ29weS1Db3B5XFxcIiBza2V0Y2g6dHlwZT1cXFwiTVNMYXllckdyb3VwXFxcIiB0cmFuc2Zvcm09XFxcInRyYW5zbGF0ZSgyMDYuMDAwMDAwLCAyNDkuMDAwMDAwKVxcXCI+PGcgaWQ9XFxcImNsaS0tLS1iLnNvY2lhbC0rLVBhdGgtQ29weVxcXCIgc2tldGNoOnR5cGU9XFxcIk1TU2hhcGVHcm91cFxcXCI+PHBhdGggZD1cXFwiTTcyMy4zNzQyMDcsMTg3LjQ0MjIxMSBMNzY3LjAyNzY0MSwzMzcuMzgzNTc1IEM3NjcuNTEwODg5LDM0MS4yNjU1NTIgNzcxLjg2MDEyNCwzNDUuMTQ3NTI5IDc3Ni4yMDkzNTksMzQ1LjE0NzUyOSBMODMzLjIzMjY2NCwzNDUuMTQ3NTI5IEM4MzkuMDMxNjQ0LDM0NS4xNDc1MjkgODQzLjM4MDg3OSwzNDAuNzgwMzA1IDg0Mi40MTQzODMsMzM0LjQ3MjA5MiBMNzM5LjQ4MjQ4NSw4LjM4NjAxOTgyIEM3MzguOTk5MjM3LDQuMDE4Nzk1NjQgNzM0LjY1MDAwMiwwLjYyMjA2NTcyOCA3MzAuNzg0MDE1LDAuNjIyMDY1NzI4IEw3MjMuMDUyMDQxLDAuNjIyMDY1NzI4IEM3MjAuNjM1OCwwLjYyMjA2NTcyOCA3MTYuMjg2NTY1LDIuNTYzMDU0MjUgNzE0LjgzNjgyLDUuNDc0NTM3MDQgTDY0My41MTQzMDIsMjA5LjAxOTA2MiBMNTc2LjQ5NDAwMywxMDUuNDMxNzg4IEM1NzMuNzIxMDU4LDEwMS4xNDU4OTUgNTY3LjM0MjUzOSw5Ny42NzE0OTE5IDU2Mi4yNTU2LDk3LjY3MTQ5MTkgTDU1Mi4xNzkwMzMsOTcuNjcxNDkxOSBDNTQ3LjA4ODMyNiw5Ny42NzE0OTE5IDU0MS41MjkzODQsMTAxLjU1ODc0OSA1MzkuNzcwMDYxLDEwNi4zMzQxODcgTDQ1NC45ODAwNjgsMzM2LjQ4NDgzMyBDNDUzLjIxNzQ5LDM0MS4yNjkxMDggNDU1LjkyNzA4NiwzNDUuMTQ3NTI5IDQ2MS4wMTQxMDIsMzQ1LjE0NzUyOSBMNTIyLjEzODA2NywzNDUuMTQ3NTI5IEM1MjcuMjMzMTUsMzQ1LjE0NzUyOSA1MzIuNzkxMDU0LDM0MS4yNjE3MzMgNTM0LjU1Mjc5NywzMzYuNDY2MTcxIEw1NzEuNDczMTQ0LDIzNS45NjY5MjQgTDY0Mi4xMDg1MjgsMzQ2LjEwNzcxMiBDNjQzLjQ4NzE0MSwzNDguMjU3MzYzIDY0Ni42NjcwOTIsMzUwIDY0OS4yMTIzMDcsMzUwIEw2NTkuOTcxNDEyLDM1MCBDNjYyLjUxNjEwOCwzNTAgNjY1LjI4MjA0NCwzNDguMDQ1MDc4IDY2Ni4xNDE5ODIsMzQ1LjY1MzkxOCBMNjgzLjgyNzI2MSwyOTYuNDc3ODcyIEw3MjMuMzc0MjA3LDE4Ny40NDIyMTEgWlxcXCIgaWQ9XFxcIlBhdGgtQ29weVxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0wLjE0NTIxMzQ0MSwyNDcuMDg1MTAxIEMwLjE0NTIxMzQ0MSwzMDUuMjM0MDQgNDkuMDg3MjM3NywzNDguODQ1NzQ1IDEwNC4zMjg3MywzNDguODQ1NzQ1IEMxMzkuMjE4MDk0LDM0OC44NDU3NDUgMTY0LjQxNTk2OCwzMzUuMjc3NjU5IDE4Mi4zNDUyMjQsMzA4LjE0MTQ4NyBDMTg1LjczNzI0NiwzMDMuMjk1NzQyIDE4My4zMTQzNzMsMjk4LjQ0OTk5NyAxNzguOTUzMjAzLDI5NC41NzM0MDEgTDE0OS44Nzg3MzMsMjY5LjM3NTUyNyBDMTQ2Ljk3MTI4NiwyNjYuOTUyNjU1IDE0Mi42MTAxMTYsMjY3LjkyMTgwNCAxMzkuMjE4MDk0LDI3MS4zMTM4MjUgQzEzMS40NjQ5MDIsMjc5LjA2NzAxNyAxMjMuMjI3MTM2LDI4Ni4zMzU2MzUgMTA2LjI2NzAyOCwyODYuMzM1NjM1IEM4NC45NDU3NTA1LDI4Ni4zMzU2MzUgNjguNDcwMjE3NiwyNjguODkwOTUzIDY4LjQ3MDIxNzYsMjQ3LjA4NTEwMSBDNjguNDcwMjE3NiwyMjUuNzYzODIzIDg1LjkxNDg5OTUsMjA3LjgzNDU2NiAxMDcuMjM2MTc3LDIwNy44MzQ1NjYgQzExOC4zODEzOTEsMjA3LjgzNDU2NiAxMjguNTU3NDU1LDIxMy4xNjQ4ODYgMTM1LjM0MTQ5OCwyMjAuNDMzNTAzIEMxMzcuNzY0MzcxLDIyMi44NTYzNzYgMTQzLjU3OTI2NSwyMjMuODI1NTI1IDE0Ni4wMDIxMzcsMjIxLjQwMjY1MiBMMTc1LjA3NjYwNywxOTMuNzgxOTA2IEMxNzkuNDM3Nzc3LDE4OS45MDUzMSAxODAuODkxNTAxLDE4NC41NzQ5OSAxNzcuNDk5NDgsMTgwLjIxMzgyIEMxNTkuMDg1NjQ5LDE1Ny45MjMzOTMgMTM1LjM0MTQ5OCwxNDUuMzI0NDU2IDEwNC44MTMzMDUsMTQ1LjMyNDQ1NiBDNDkuNTcxODEyMiwxNDUuMzI0NDU2IDAuMTQ1MjEzNDQxLDE4OS45MDUzMSAwLjE0NTIxMzQ0MSwyNDcuMDg1MTAxIEwwLjE0NTIxMzQ0MSwyNDcuMDg1MTAxIFogTTIxOC42ODgzMTIsMzM0Ljc5MzA4NSBDMjE4LjY4ODMxMiwzMzkuNjM4ODMgMjIzLjA0OTQ4MiwzNDQgMjI3Ljg5NTIyNywzNDQgTDI4MS4xOTg0MjIsMzQ0IEMyODYuMDQ0MTY3LDM0NCAyOTAuNDA1MzM3LDMzOS42Mzg4MyAyOTAuNDA1MzM3LDMzNC43OTMwODUgTDI5MC40MDUzMzcsMTQuMDA0NzY3MiBDMjkwLjQwNTMzNyw5LjE1OTAyMjI2IDI4Ni4wNDQxNjcsNC43OTc4NTE3OSAyODEuMTk4NDIyLDQuNzk3ODUxNzkgTDIyNy44OTUyMjcsNC43OTc4NTE3OSBDMjIzLjA0OTQ4Miw0Ljc5Nzg1MTc5IDIxOC42ODgzMTIsOS4xNTkwMjIyNiAyMTguNjg4MzEyLDE0LjAwNDc2NzIgTDIxOC42ODgzMTIsMzM0Ljc5MzA4NSBaIE0zNzguMTEzMzIxLDkxLjUzNjY4NjggQzM5OS40MzQ1OTksOTEuNTM2Njg2OCA0MTYuODc5MjgxLDc0LjU3NjU3OTQgNDE2Ljg3OTI4MSw1My4yNTUzMDE1IEM0MTYuODc5MjgxLDMxLjkzNDAyMzYgMzk5LjQzNDU5OSwxNC40ODkzNDE3IDM3OC4xMTMzMjEsMTQuNDg5MzQxNyBDMzU2Ljc5MjA0NCwxNC40ODkzNDE3IDMzOS44MzE5MzYsMzEuOTM0MDIzNiAzMzkuODMxOTM2LDUzLjI1NTMwMTUgQzMzOS44MzE5MzYsNzQuNTc2NTc5NCAzNTYuNzkyMDQ0LDkxLjUzNjY4NjggMzc4LjExMzMyMSw5MS41MzY2ODY4IEwzNzguMTEzMzIxLDkxLjUzNjY4NjggWiBNMzQyLjczOTM4MywzMzQuNzkzMDg1IEMzNDIuNzM5MzgzLDMzOS42Mzg4MyAzNDcuMTAwNTU0LDM0NCAzNTEuOTQ2Mjk5LDM0NCBMNDA1LjI0OTQ5MywzNDQgQzQxMC4wOTUyMzgsMzQ0IDQxNC40NTY0MDksMzM5LjYzODgzIDQxNC40NTY0MDksMzM0Ljc5MzA4NSBMNDE0LjQ1NjQwOSwxNTkuMzc3MTE2IEM0MTQuNDU2NDA5LDE1NC4wNDY3OTcgNDEwLjA5NTIzOCwxNTAuMTcwMjAxIDQwNS4yNDk0OTMsMTUwLjE3MDIwMSBMMzUxLjk0NjI5OSwxNTAuMTcwMjAxIEMzNDcuMTAwNTU0LDE1MC4xNzAyMDEgMzQyLjczOTM4MywxNTQuMDQ2Nzk3IDM0Mi43MzkzODMsMTU5LjM3NzExNiBMMzQyLjczOTM4MywzMzQuNzkzMDg1IFogTTg4OS4xNTQzMSwzMzQuNzkzMDg1IEM4ODkuMTU0MzEsMzM5LjYzODgzIDg5My41MTU0ODEsMzQ0IDg5OC4zNjEyMjYsMzQ0IEw5MjEuMTM2MjI3LDM0NCBDOTI1Ljk4MTk3MiwzNDQgOTI5LjM3Mzk5NCwzMzkuNjM4ODMgOTMxLjMxMjI5MiwzMzQuMzA4NTEgTDkzNy4xMjcxODUsMzE4LjMxNzU1MiBDOTM3LjEyNzE4NSwzMTguMzE3NTUyIDk1OS40MTc2MTIsMzQ4Ljg0NTc0NSAxMDAyLjA2MDE3LDM0OC44NDU3NDUgQzEwNTYuODE3MDksMzQ4Ljg0NTc0NSAxMDk4LjAwNTkyLDMwMi44MTExNjggMTA5OC4wMDU5MiwyNDcuMDg1MTAxIEMxMDk4LjAwNTkyLDE3OC43NjAwOTYgMTA1My40MjUwNiwxNDUuMzI0NDU2IDEwMDEuNTc1NTksMTQ1LjMyNDQ1NiBDOTg1LjEwMDA2MSwxNDUuMzI0NDU2IDk2Ny4xNzA4MDQsMTUxLjEzOTM1IDk2MS4zNTU5MSwxNTQuNTMxMzcxIEw5NjEuMzU1OTEsMTQuMDA0NzY3MiBDOTYxLjM1NTkxLDkuMTU5MDIyMjYgOTU2Ljk5NDc0LDQuNzk3ODUxNzkgOTUyLjE0ODk5NSw0Ljc5Nzg1MTc5IEw4OTguMzYxMjI2LDQuNzk3ODUxNzkgQzg5My41MTU0ODEsNC43OTc4NTE3OSA4ODkuMTU0MzEsOS4xNTkwMjIyNiA4ODkuMTU0MzEsMTQuMDA0NzY3MiBMODg5LjE1NDMxLDMzNC43OTMwODUgWiBNOTUzLjYwMjcxOCwyNDYuNjAwNTI2IEM5NTMuNjAyNzE4LDIyNC43OTQ2NzQgOTcwLjA3ODI1MSwyMDcuODM0NTY2IDk5Mi4zNjg2NzgsMjA3LjgzNDU2NiBDMTAxNC42NTkxMSwyMDcuODM0NTY2IDEwMzEuNjE5MjEsMjI0Ljc5NDY3NCAxMDMxLjYxOTIxLDI0Ni42MDA1MjYgQzEwMzEuNjE5MjEsMjY4Ljg5MDk1MyAxMDE0LjY1OTExLDI4Ni4zMzU2MzUgOTkyLjM2ODY3OCwyODYuMzM1NjM1IEM5NzAuMDc4MjUxLDI4Ni4zMzU2MzUgOTUzLjYwMjcxOCwyNjguODkwOTUzIDk1My42MDI3MTgsMjQ2LjYwMDUyNiBMOTUzLjYwMjcxOCwyNDYuNjAwNTI2IFogTTExMzQuMjU2NDUsMzIxLjIyNDk5OSBDMTEzNC4yNTY0NSwzMzYuMjQ2ODA4IDExNDYuODU1MzksMzQ4Ljg0NTc0NSAxMTYxLjg3NzIsMzQ4Ljg0NTc0NSBDMTE3Ny4zODM1OCwzNDguODQ1NzQ1IDExODkuNDk3OTUsMzM2LjI0NjgwOCAxMTg5LjQ5Nzk1LDMyMS4yMjQ5OTkgQzExODkuNDk3OTUsMzA1LjcxODYxNSAxMTc3LjM4MzU4LDI5My42MDQyNTIgMTE2MS44NzcyLDI5My42MDQyNTIgQzExNDYuODU1MzksMjkzLjYwNDI1MiAxMTM0LjI1NjQ1LDMwNS43MTg2MTUgMTEzNC4yNTY0NSwzMjEuMjI0OTk5IEwxMTM0LjI1NjQ1LDMyMS4yMjQ5OTkgWiBNMTIzNi4wMTcxLDMzMi44NTQ3ODcgQzEyNDUuNzA4NTksMzQwLjYwNzk3OSAxMjY5LjkzNzMxLDM0OC44NDU3NDUgMTMwMS45MTkyMywzNDguODQ1NzQ1IEMxMzU2LjY3NjE1LDM0OC44NDU3NDUgMTM4My44MTIzMiwzMjEuMjI0OTk5IDEzODMuODEyMzIsMjg3LjMwNDc4NCBDMTM4My44MTIzMiwyNDguNTM4ODI0IDEzNTYuNjc2MTUsMjMzLjAzMjQ0IDEzMTcuNDI1NjEsMjE5LjQ2NDM1NCBDMTMwMC45NTAwOCwyMTMuNjQ5NDYgMTI5NS42MTk3NiwyMDguODAzNzE1IDEyOTUuNjE5NzYsMjAzLjk1Nzk3IEMxMjk1LjYxOTc2LDE5OC42Mjc2NTEgMTI5OS45ODA5MywxOTcuMTczOTI3IDEzMDYuMjgwNCwxOTcuMTczOTI3IEMxMzI1LjE3ODgsMTk3LjE3MzkyNyAxMzQ3LjQ2OTIzLDIwOC4zMTkxNDEgMTM0Ny40NjkyMywyMDguMzE5MTQxIEMxMzUxLjM0NTgzLDIwOS43NzI4NjQgMTM1Ni4xOTE1NywyMDguMzE5MTQxIDEzNTcuNjQ1MywyMDUuNDExNjk0IEwxMzc1LjU3NDU1LDE3Mi40NjA2MjggQzEzNzguNDgyLDE2Ny42MTQ4ODMgMTM3NS4wODk5OCwxNjMuMjUzNzEyIDEzNzAuNzI4ODEsMTYwLjM0NjI2NSBDMTM2MC4wNjgxNywxNTMuNTYyMjIzIDEzMzYuODA4NTksMTQ1LjMyNDQ1NiAxMzA2LjI4MDQsMTQ1LjMyNDQ1NiBDMTI1My45NDYzNSwxNDUuMzI0NDU2IDEyMzAuNjg2NzgsMTcxLjQ5MTQ3OSAxMjMwLjY4Njc4LDIwMy45NTc5NyBDMTIzMC42ODY3OCwyMzQuMDAxNTg5IDEyNDcuMTYyMzEsMjU1LjgwNzQ0MSAxMjg0Ljk1OTEyLDI2OC44OTA5NTMgQzEzMDkuNjcyNDIsMjc3LjYxMzI5NCAxMzEyLjU3OTg3LDI4NC4zOTczMzcgMTMxMi41Nzk4NywyODkuMjQzMDgyIEMxMzEyLjU3OTg3LDI5NS4wNTc5NzYgMTMwOC4yMTg3LDI5Ny45NjU0MjMgMTMwMy4zNzI5NSwyOTcuOTY1NDIzIEMxMjgyLjUzNjI1LDI5Ny45NjU0MjMgMTI1OS43NjEyNSwyODUuMzY2NDg2IDEyNTkuNzYxMjUsMjg1LjM2NjQ4NiBDMTI1NS44ODQ2NSwyODMuNDI4MTg4IDEyNTEuMDM4OTEsMjg2LjMzNTYzNSAxMjQ5LjU4NTE4LDI4OS4yNDMwODIgTDEyMzIuNjI1MDgsMzIyLjY3ODcyMiBDMTIzMC4yMDIyLDMyNy4wMzk4OTMgMTIzMi42MjUwOCwzMjkuOTQ3MzQgMTIzNi4wMTcxLDMzMi44NTQ3ODcgTDEyMzYuMDE3MSwzMzIuODU0Nzg3IFogTTE0MDcuNTU2NDcsMjQ2LjYwMDUyNiBDMTQwNy41NTY0NywzMDIuMzI2NTkzIDE0NTMuMTA2NDcsMzQ4Ljg0NTc0NSAxNTA4LjM0Nzk2LDM0OC44NDU3NDUgQzE1NjMuNTg5NDYsMzQ4Ljg0NTc0NSAxNjA5LjEzOTQ2LDMwMi4zMjY1OTMgMTYwOS4xMzk0NiwyNDYuNjAwNTI2IEMxNjA5LjEzOTQ2LDE5MS44NDM2MDggMTU2My41ODk0NiwxNDUuMzI0NDU2IDE1MDguMzQ3OTYsMTQ1LjMyNDQ1NiBDMTQ1My4xMDY0NywxNDUuMzI0NDU2IDE0MDcuNTU2NDcsMTkxLjg0MzYwOCAxNDA3LjU1NjQ3LDI0Ni42MDA1MjYgTDE0MDcuNTU2NDcsMjQ2LjYwMDUyNiBaIE0xNDcwLjA2NjU4LDI0Ni42MDA1MjYgQzE0NzAuMDY2NTgsMjI1LjI3OTI0OCAxNDg3LjAyNjY5LDIwNy44MzQ1NjYgMTUwOC4zNDc5NiwyMDcuODM0NTY2IEMxNTI5LjY2OTI0LDIwNy44MzQ1NjYgMTU0Ni42MjkzNSwyMjUuMjc5MjQ4IDE1NDYuNjI5MzUsMjQ2LjYwMDUyNiBDMTU0Ni42MjkzNSwyNjguNDA2Mzc4IDE1MjkuNjY5MjQsMjg2LjMzNTYzNSAxNTA4LjM0Nzk2LDI4Ni4zMzU2MzUgQzE0ODcuMDI2NjksMjg2LjMzNTYzNSAxNDcwLjA2NjU4LDI2OC40MDYzNzggMTQ3MC4wNjY1OCwyNDYuNjAwNTI2IEwxNDcwLjA2NjU4LDI0Ni42MDA1MjYgWiBNMTYzMS40Mjk4OSwyNDcuMDg1MTAxIEMxNjMxLjQyOTg5LDMwNS4yMzQwNCAxNjgwLjM3MTkxLDM0OC44NDU3NDUgMTczNS42MTM0LDM0OC44NDU3NDUgQzE3NzAuNTAyNzcsMzQ4Ljg0NTc0NSAxNzk1LjcwMDY0LDMzNS4yNzc2NTkgMTgxMy42Mjk5LDMwOC4xNDE0ODcgQzE4MTcuMDIxOTIsMzAzLjI5NTc0MiAxODE0LjU5OTA1LDI5OC40NDk5OTcgMTgxMC4yMzc4OCwyOTQuNTczNDAxIEwxNzgxLjE2MzQxLDI2OS4zNzU1MjcgQzE3NzguMjU1OTYsMjY2Ljk1MjY1NSAxNzczLjg5NDc5LDI2Ny45MjE4MDQgMTc3MC41MDI3NywyNzEuMzEzODI1IEMxNzYyLjc0OTU4LDI3OS4wNjcwMTcgMTc1NC41MTE4MSwyODYuMzM1NjM1IDE3MzcuNTUxNywyODYuMzM1NjM1IEMxNzE2LjIzMDQyLDI4Ni4zMzU2MzUgMTY5OS43NTQ4OSwyNjguODkwOTUzIDE2OTkuNzU0ODksMjQ3LjA4NTEwMSBDMTY5OS43NTQ4OSwyMjUuNzYzODIzIDE3MTcuMTk5NTcsMjA3LjgzNDU2NiAxNzM4LjUyMDg1LDIwNy44MzQ1NjYgQzE3NDkuNjY2MDYsMjA3LjgzNDU2NiAxNzU5Ljg0MjEzLDIxMy4xNjQ4ODYgMTc2Ni42MjYxNywyMjAuNDMzNTAzIEMxNzY5LjA0OTA0LDIyMi44NTYzNzYgMTc3NC44NjM5NCwyMjMuODI1NTI1IDE3NzcuMjg2ODEsMjIxLjQwMjY1MiBMMTgwNi4zNjEyOCwxOTMuNzgxOTA2IEMxODEwLjcyMjQ1LDE4OS45MDUzMSAxODEyLjE3NjE3LDE4NC41NzQ5OSAxODA4Ljc4NDE1LDE4MC4yMTM4MiBDMTc5MC4zNzAzMiwxNTcuOTIzMzkzIDE3NjYuNjI2MTcsMTQ1LjMyNDQ1NiAxNzM2LjA5Nzk4LDE0NS4zMjQ0NTYgQzE2ODAuODU2NDksMTQ1LjMyNDQ1NiAxNjMxLjQyOTg5LDE4OS45MDUzMSAxNjMxLjQyOTg5LDI0Ny4wODUxMDEgTDE2MzEuNDI5ODksMjQ3LjA4NTEwMSBaIE0xODg1LjM0NjkyLDkxLjUzNjY4NjggQzE5MDYuNjY4Miw5MS41MzY2ODY4IDE5MjQuMTEyODgsNzQuNTc2NTc5NCAxOTI0LjExMjg4LDUzLjI1NTMwMTUgQzE5MjQuMTEyODgsMzEuOTM0MDIzNiAxOTA2LjY2ODIsMTQuNDg5MzQxNyAxODg1LjM0NjkyLDE0LjQ4OTM0MTcgQzE4NjQuMDI1NjUsMTQuNDg5MzQxNyAxODQ3LjA2NTU0LDMxLjkzNDAyMzYgMTg0Ny4wNjU1NCw1My4yNTUzMDE1IEMxODQ3LjA2NTU0LDc0LjU3NjU3OTQgMTg2NC4wMjU2NSw5MS41MzY2ODY4IDE4ODUuMzQ2OTIsOTEuNTM2Njg2OCBMMTg4NS4zNDY5Miw5MS41MzY2ODY4IFogTTE4NDkuOTcyOTksMzM0Ljc5MzA4NSBDMTg0OS45NzI5OSwzMzkuNjM4ODMgMTg1NC4zMzQxNiwzNDQgMTg1OS4xNzk5LDM0NCBMMTkxMi40ODMxLDM0NCBDMTkxNy4zMjg4NCwzNDQgMTkyMS42OTAwMSwzMzkuNjM4ODMgMTkyMS42OTAwMSwzMzQuNzkzMDg1IEwxOTIxLjY5MDAxLDE1OS4zNzcxMTYgQzE5MjEuNjkwMDEsMTU0LjA0Njc5NyAxOTE3LjMyODg0LDE1MC4xNzAyMDEgMTkxMi40ODMxLDE1MC4xNzAyMDEgTDE4NTkuMTc5OSwxNTAuMTcwMjAxIEMxODU0LjMzNDE2LDE1MC4xNzAyMDEgMTg0OS45NzI5OSwxNTQuMDQ2Nzk3IDE4NDkuOTcyOTksMTU5LjM3NzExNiBMMTg0OS45NzI5OSwzMzQuNzkzMDg1IFogTTE5NjAuOTQwNTUsMjg0Ljg4MTkxMSBDMTk2MC45NDA1NSwzMjMuMTYzMjk3IDE5ODkuNTMwNDQsMzQ4Ljg0NTc0NSAyMDI3LjgxMTgzLDM0OC44NDU3NDUgQzIwNTguMzQwMDIsMzQ4Ljg0NTc0NSAyMDc1LjMwMDEzLDMzNC43OTMwODUgMjA4Ni40NDUzNCwzMjQuNjE3MDIgTDIwOTMuMjI5MzgsMzM3LjcwMDUzMiBDMjA5NS42NTIyNiwzNDMuMDMwODUxIDIwOTkuMDQ0MjgsMzQ0IDIxMDEuOTUxNzIsMzQ0IEwyMTIzLjI3MywzNDQgQzIxMjguMTE4NzUsMzQ0IDIxMzIuNDc5OTIsMzM5LjYzODgzIDIxMzIuNDc5OTIsMzM0Ljc5MzA4NSBMMjEzMi40Nzk5MiwyMjcuNzAyMTIxIEMyMTMyLjQ3OTkyLDE3MC41MjIzMyAyMTEwLjY3NDA3LDE0NS4zMjQ0NTYgMjA1MC41ODY4MywxNDUuMzI0NDU2IEMyMDI0LjQxOTgsMTQ1LjMyNDQ1NiAxOTkwLjQ5OTU5LDE1MS4xMzkzNSAxOTg2LjEzODQyLDE1Mi41OTMwNzQgQzE5ODEuNzc3MjUsMTU0LjA0Njc5NyAxOTc3LjQxNjA4LDE1Ny40Mzg4MTggMTk3OC44Njk4LDE2NS42NzY1ODUgTDE5ODMuMjMwOTcsMTk2LjIwNDc3OCBDMTk4NC4yMDAxMiwyMDMuNDczMzk2IDE5ODcuNTkyMTQsMjA4LjgwMzcxNSAxOTk0Ljg2MDc2LDIwNi4zODA4NDMgQzIwMDcuNDU5NywyMDIuNTA0MjQ3IDIwMzAuMjM0NywxOTkuMTEyMjI1IDIwNDMuMzE4MjEsMTk5LjExMjIyNSBDMjA2Ni41Nzc3OSwxOTkuMTEyMjI1IDIwNjkuNDg1MjMsMjA4LjgwMzcxNSAyMDY5LjQ4NTIzLDIyNy43MDIxMjEgQzIwNjkuNDg1MjMsMjI3LjcwMjEyMSAyMDUzLjk3ODg1LDIxOS45NDg5MjkgMjAzMi4xNzMsMjE5Ljk0ODkyOSBDMTk4OC4wNzY3MiwyMTkuOTQ4OTI5IDE5NjAuOTQwNTUsMjQ3LjU2OTY3NSAxOTYwLjk0MDU1LDI4NC44ODE5MTEgTDE5NjAuOTQwNTUsMjg0Ljg4MTkxMSBaIE0yMDIzLjkzNTIzLDI4MC4wMzYxNjYgQzIwMjMuOTM1MjMsMjY4Ljg5MDk1MyAyMDMzLjE0MjE1LDI1OS42ODQwMzcgMjA0NC43NzE5MywyNTkuNjg0MDM3IEMyMDU2LjQwMTcyLDI1OS42ODQwMzcgMjA2NS42MDg2NCwyNjguODkwOTUzIDIwNjYuMDkzMjEsMjgwLjAzNjE2NiBDMjA2Ni4wOTMyMSwyOTEuNjY1OTU0IDIwNTYuNDAxNzIsMzAxLjM1NzQ0NCAyMDQ0Ljc3MTkzLDMwMS4zNTc0NDQgQzIwMzMuMTQyMTUsMzAxLjM1NzQ0NCAyMDIzLjkzNTIzLDI5MS42NjU5NTQgMjAyMy45MzUyMywyODAuMDM2MTY2IEwyMDIzLjkzNTIzLDI4MC4wMzYxNjYgWiBNMjE4MS45MDY1MiwzMzQuNzkzMDg1IEMyMTgxLjkwNjUyLDMzOS42Mzg4MyAyMTg2LjI2NzY5LDM0NCAyMTkxLjExMzQzLDM0NCBMMjI0NC40MTY2MywzNDQgQzIyNDkuMjYyMzcsMzQ0IDIyNTMuNjIzNTQsMzM5LjYzODgzIDIyNTMuNjIzNTQsMzM0Ljc5MzA4NSBMMjI1My42MjM1NCwxNC4wMDQ3NjcyIEMyMjUzLjYyMzU0LDkuMTU5MDIyMjYgMjI0OS4yNjIzNyw0Ljc5Nzg1MTc5IDIyNDQuNDE2NjMsNC43OTc4NTE3OSBMMjE5MS4xMTM0Myw0Ljc5Nzg1MTc5IEMyMTg2LjI2NzY5LDQuNzk3ODUxNzkgMjE4MS45MDY1Miw5LjE1OTAyMjI2IDIxODEuOTA2NTIsMTQuMDA0NzY3MiBMMjE4MS45MDY1MiwzMzQuNzkzMDg1IFpcXFwiIGlkPVxcXCJjbGktLS0tYi5zb2NpYWxcXFwiPjwvcGF0aD48L2c+PC9nPjwvZz48L2c+PC9zdmc+XCJcblxuLyoqKi8gfSxcbi8qIDM0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xyXG5cdFx0aWYoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcclxuXHRcdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRcdG1vZHVsZS5wYXRocyA9IFtdO1xyXG5cdFx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcclxuXHRcdFx0bW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG1vZHVsZTtcclxuXHR9XHJcblxuXG4vKioqLyB9XG4vKioqKioqLyBdKVxufSk7XG47XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogcmVhY3QtY2xpbWItc29jaWFsLm1pbi5qc1xuICoqLyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9cIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svYm9vdHN0cmFwIGNlNzcxMGRjMmY0YWU2MmJlNjJmXG4gKiovIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IFdhbGxDb250YWluZXIgZnJvbSAnLi9jb21wb25lbnRzL1dhbGxDb250YWluZXInO1xuXG5pbXBvcnQgJy4vc3R5bGUvbWFpbi5zY3NzJztcblxuaWYgKHdpbmRvdykge1xuICAgIHdpbmRvdy5DbGltYiA9IHdpbmRvdy5DbGltYiB8fCB7fTtcblxuICAgIGNvbnN0ICR0YXJnZXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNsaW1iLXdhbGwnKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgJHRhcmdldHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgJGl0ZW0gPSAkdGFyZ2V0c1tpXTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbklkID0gJGl0ZW0uZGF0YXNldC5jb2xsZWN0aW9uSWQ7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gJGl0ZW0uZGF0YXNldC5saW1pdDtcblxuICAgICAgICBSZWFjdC5yZW5kZXIoXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFdhbGxDb250YWluZXIsIHtjb2xsZWN0aW9uSWQsIGxpbWl0fSksXG4gICAgICAgICAgICAkaXRlbVxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IHtXYWxsQ29udGFpbmVyfTtcbmV4cG9ydCB7V2FsbH0gZnJvbSAnLi9jb21wb25lbnRzL1dhbGwnO1xuZXhwb3J0IHtUaWxlfSBmcm9tICcuL2NvbXBvbmVudHMvVGlsZSc7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vZXNsaW50LWxvYWRlciEuL3NyYy9pbmRleC5qc1xuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xX187XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiBleHRlcm5hbCB7XCJyb290XCI6XCJSZWFjdFwiLFwiY29tbW9uanMyXCI6XCJyZWFjdFwiLFwiY29tbW9uanNcIjpcInJlYWN0XCIsXCJhbWRcIjpcInJlYWN0XCJ9XG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBJbWFnZSBmcm9tICcuL0ltYWdlJztcbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vTWVzc2FnZSc7XG5pbXBvcnQgQXV0aG9yIGZyb20gJy4vQXV0aG9yJztcblxuXG5jbGFzcyBUaWxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICBjcmVhdGVJbWFnZSgpIHtcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5pbWFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qge3VybDogc3JjLCB3aWR0aCwgaGVpZ2h0fSA9IHRoaXMucHJvcHMuaW1hZ2U7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxJbWFnZSBzcmM9eyBzcmMgfVxuICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD17IHdpZHRoIH1cbiAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXsgaGVpZ2h0IH0vPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjcmVhdGVNZXNzYWdlKCkge1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPE1lc3NhZ2UgYm9keT17IHRoaXMucHJvcHMubWVzc2FnZSB9Lz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY3JlYXRlQ2xhc3NTdHJpbmcoKSB7XG5cbiAgICAgICAgbGV0IGNsYXNzU3RyaW5nID0gYGNsaW1iX190aWxlIGNsaW1iX190aWxlLS0ke3RoaXMucHJvcHMuc291cmNlX3R5cGV9YDtcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5pbWFnZSkge1xuICAgICAgICAgICAgY2xhc3NTdHJpbmcgKz0gJyBjbGltYl9fdGlsZS0taGFzLW1lZGlhIGNsaW1iX190aWxlLS1oYXMtaW1hZ2UnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xhc3NTdHJpbmcgKz0gJyBjbGltYl9fdGlsZS0taGFzLW5vLWltYWdlJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnZpZGVvX3VybCkge1xuICAgICAgICAgICAgY2xhc3NTdHJpbmcgKz0gJyBjbGltYl9fdGlsZS0taGFzLW1lZGlhIGNsaW1iX190aWxlLS1oYXMtdmlkZW8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xhc3NTdHJpbmcgKz0gJyBjbGltYl9fdGlsZS0taGFzLW5vLXZpZGVvJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbGFzc1N0cmluZztcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG5cbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmNyZWF0ZUltYWdlKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmNyZWF0ZU1lc3NhZ2UoKTtcbiAgICAgICAgY29uc3QgY2xhc3NTdHJpbmcgPSB0aGlzLmNyZWF0ZUNsYXNzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHthdXRob3J9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9eyBjbGFzc1N0cmluZyB9XG4gICAgICAgICAgICAgICAgIHN0eWxlPXt0aGlzLnByb3BzLnN0eWxlfT5cblxuICAgICAgICAgICAgICAgIDxhIGhyZWY9eyB0aGlzLnByb3BzLmxpbmsgfT5cbiAgICAgICAgICAgICAgICAgICAgeyBpbWFnZSB9XG4gICAgICAgICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbGltYl9fdGlsZV9fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICB7IG1lc3NhZ2UgfVxuXG4gICAgICAgICAgICAgICAgICAgIDxBdXRob3Igey4uLmF1dGhvcn0gLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5UaWxlLnByb3BUeXBlcyA9IHtcblxuICAgIC8vIFJlcXVpcmVkIGF0dHJzXG4gICAgbGluazogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHNvdXJjZV90eXBlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgdGltZXN0YW1wOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgYXV0aG9yOiBSZWFjdC5Qcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICB1c2VybmFtZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgICAgICBwaWN0dXJlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgICAgIGxpbms6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuICAgIH0pLFxuXG4gICAgLy8gT3B0aW9uYWwgYXR0cnNcbiAgICBtZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIHZpZGVvX3NyYzogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgICBpbWFnZTogUmVhY3QuUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgdXJsOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgICAgIHdpZHRoOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgICAgIGhlaWdodDogUmVhY3QuUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkXG4gICAgfSlcblxufTtcblxuZXhwb3J0IGRlZmF1bHQgVGlsZTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vfi9lc2xpbnQtbG9hZGVyIS4vc3JjL2NvbXBvbmVudHMvVGlsZS5qc3hcbiAqKi8iLCJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIFByb3BUeXBlc30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi9UaWxlJztcbmltcG9ydCB7VHJhbnNpdGlvbk1vdGlvbiwgc3ByaW5nfSBmcm9tICdyZWFjdC1tb3Rpb24nO1xuXG5cbmNsYXNzIFdhbGwgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgaXRlbXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxuICAgIH07XG5cbiAgICBnZXRTdHlsZXMoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ3MgPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5wcm9wcy5pdGVtcykubWFwKGtleSA9PiB7XG4gICAgICAgICAgICBjb25maWdzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogc3ByaW5nKDEpLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBzcHJpbmcoMzc1KSxcbiAgICAgICAgICAgICAgICBtYXJnaW46IHNwcmluZygxMCksXG4gICAgICAgICAgICAgICAgaXRlbTogdGhpcy5wcm9wcy5pdGVtc1trZXldXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZ3M7XG4gICAgfVxuXG4gICAgd2lsbEVudGVyKGtleSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BhY2l0eTogc3ByaW5nKDApLFxuICAgICAgICAgICAgd2lkdGg6IHNwcmluZygwKSxcbiAgICAgICAgICAgIG1hcmdpbjogc3ByaW5nKDApLFxuICAgICAgICAgICAgaXRlbTogdGhpcy5wcm9wcy5pdGVtc1trZXldXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgd2lsbExlYXZlKGtleSwgc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9wYWNpdHk6IHNwcmluZygwKSxcbiAgICAgICAgICAgIHdpZHRoOiBzcHJpbmcoMCksXG4gICAgICAgICAgICBtYXJnaW46IHNwcmluZygwKSxcbiAgICAgICAgICAgIGl0ZW06IHN0eWxlLml0ZW1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZW5kZXJUaWxlKGtleSwgaXRlbVZhbHVlcykge1xuXG4gICAgICAgIGNvbnN0IHtpdGVtLCAuLi5zdHlsZUNvbmZpZ30gPSBpdGVtVmFsdWVzO1xuICAgICAgICBjb25zdCB7Li4uaXRlbVByb3BzfSA9IGl0ZW07XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB7XG4gICAgICAgICAgICBvcGFjaXR5OiBzdHlsZUNvbmZpZy5vcGFjaXR5LFxuICAgICAgICAgICAgd2lkdGg6IGAke3N0eWxlQ29uZmlnLndpZHRofXB4YCxcbiAgICAgICAgICAgIG1hcmdpbkxlZnQ6IHN0eWxlQ29uZmlnLm1hcmdpbixcbiAgICAgICAgICAgIG1hcmdpblJpZ2h0OiBzdHlsZUNvbmZpZy5tYXJnaW5cbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFRpbGUga2V5PXtrZXl9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgICAgey4uLml0ZW1Qcm9wcyB9IC8+XG4gICAgICAgICk7XG5cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8VHJhbnNpdGlvbk1vdGlvblxuICAgICAgICAgICAgICAgIHN0eWxlcz17dGhpcy5nZXRTdHlsZXMuYmluZCh0aGlzKSgpfVxuICAgICAgICAgICAgICAgIHdpbGxFbnRlcj17dGhpcy53aWxsRW50ZXIuYmluZCh0aGlzKX1cbiAgICAgICAgICAgICAgICB3aWxsTGVhdmU9e3RoaXMud2lsbExlYXZlLmJpbmQodGhpcyl9PlxuICAgICAgICAgICAgICAgIHt2YWx1ZXMgPT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbGltYl9fd2FsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge09iamVjdC5rZXlzKHZhbHVlcykubWFwKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVZhbHVlcyA9IHZhbHVlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlclRpbGUoa2V5LCBpdGVtVmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L1RyYW5zaXRpb25Nb3Rpb24+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBXYWxsO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L2VzbGludC1sb2FkZXIhLi9zcmMvY29tcG9uZW50cy9XYWxsLmpzeFxuICoqLyIsIi8vIFtzdGlmZm5lc3MsIGRhbXBpbmddXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0ge1xuICBub1dvYmJsZTogWzE3MCwgMjZdLCAvLyB0aGUgZGVmYXVsdFxuICBnZW50bGU6IFsxMjAsIDE0XSxcbiAgd29iYmx5OiBbMTgwLCAxMl0sXG4gIHN0aWZmOiBbMjEwLCAyMF1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0LW1vdGlvbi9saWIvcHJlc2V0cy5qc1xuICoqIG1vZHVsZSBpZCA9IDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbihmdW5jdGlvbigpIHtcbiAgdmFyIGdldE5hbm9TZWNvbmRzLCBocnRpbWUsIGxvYWRUaW1lO1xuXG4gIGlmICgodHlwZW9mIHBlcmZvcm1hbmNlICE9PSBcInVuZGVmaW5lZFwiICYmIHBlcmZvcm1hbmNlICE9PSBudWxsKSAmJiBwZXJmb3JtYW5jZS5ub3cpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MgIT09IG51bGwpICYmIHByb2Nlc3MuaHJ0aW1lKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAoZ2V0TmFub1NlY29uZHMoKSAtIGxvYWRUaW1lKSAvIDFlNjtcbiAgICB9O1xuICAgIGhydGltZSA9IHByb2Nlc3MuaHJ0aW1lO1xuICAgIGdldE5hbm9TZWNvbmRzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaHI7XG4gICAgICBociA9IGhydGltZSgpO1xuICAgICAgcmV0dXJuIGhyWzBdICogMWU5ICsgaHJbMV07XG4gICAgfTtcbiAgICBsb2FkVGltZSA9IGdldE5hbm9TZWNvbmRzKCk7XG4gIH0gZWxzZSBpZiAoRGF0ZS5ub3cpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBsb2FkVGltZTtcbiAgICB9O1xuICAgIGxvYWRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbG9hZFRpbWU7XG4gICAgfTtcbiAgICBsb2FkVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9XG5cbn0pLmNhbGwodGhpcyk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vfi9wZXJmb3JtYW5jZS1ub3cvbGliL3BlcmZvcm1hbmNlLW5vdy5qc1xuICoqIG1vZHVsZSBpZCA9IDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBzZXRUaW1lb3V0KGRyYWluUXVldWUsIDApO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAod2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L3Byb2Nlc3MvYnJvd3Nlci5qc1xuICoqIG1vZHVsZSBpZCA9IDZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cblxuY2xhc3MgQXV0aG9yIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcblxuICAgIHJlbmRlcigpIHtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGEgY2xhc3NOYW1lPVwiY2xpbWJfX3RpbGVfX2F1dGhvclwiXG4gICAgICAgICAgICAgICBocmVmPXsgdGhpcy5wcm9wcy5saW5rIH0+XG5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz17IHRoaXMucHJvcHMucGljdHVyZX1cbiAgICAgICAgICAgICAgICAgICAgIGFsdD17IGBQcm9maWxlIHBpYyBvZiAke3RoaXMucHJvcHMubmFtZX1gIH0vPlxuXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImNsaW1iX190aWxlX19hdXRob3JfX3VzZXJuYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIHsgdGhpcy5wcm9wcy51c2VybmFtZSB9XG4gICAgICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkF1dGhvci5wcm9wVHlwZXMgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgQXV0aG9yO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L2VzbGludC1sb2FkZXIhLi9zcmMvY29tcG9uZW50cy9BdXRob3IuanN4XG4gKiovIiwiaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5cblxuY2xhc3MgQ2xpbWJCYWRnZSBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgICByZW5kZXIoKSB7XG5cbiAgICAgICAgY29uc3QgbG9nbyA9IHJlcXVpcmUoJy4uL2ltZy9jbGltYl9sb2dvLnN2ZycpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YSBocmVmPVwiaHR0cDovL2NsaW1iLnNvY2lhbC9cIlxuICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY2xpbWItc29jaWFsLWJhZGdlXCJcbiAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBsb2dvfX0+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDbGltYkJhZGdlO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L2VzbGludC1sb2FkZXIhLi9zcmMvY29tcG9uZW50cy9DbGltYkJhZGdlLmpzeFxuICoqLyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cblxuY2xhc3MgSW1hZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJjbGltYl9fdGlsZV9faW1hZ2VcIlxuICAgICAgICAgICAgICAgICBzcmM9eyB0aGlzLnByb3BzLnNyYyB9IGRhdGEtd2lkdGg9eyB0aGlzLnByb3BzLndpZHRoIH0gZGF0YS1oZWlnaHQ9eyB0aGlzLnByb3BzLmhlaWdodCB9Lz5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkltYWdlLnByb3BUeXBlcyA9IHtcbiAgICBzcmM6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB3aWR0aDogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgICBoZWlnaHQ6IFJlYWN0LlByb3BUeXBlcy5udW1iZXJcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEltYWdlO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L2VzbGludC1sb2FkZXIhLi9zcmMvY29tcG9uZW50cy9JbWFnZS5qc3hcbiAqKi8iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5cbmNsYXNzIE1lc3NhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbGltYl9fdGlsZV9fbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiB0aGlzLnByb3BzLmJvZHl9fT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuTWVzc2FnZS5wcm9wVHlwZXMgPSB7XG4gICAgYm9keTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L2VzbGludC1sb2FkZXIhLi9zcmMvY29tcG9uZW50cy9NZXNzYWdlLmpzeFxuICoqLyIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgUHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xpbWIgZnJvbSAnY2xpbWItc29jaWFsJztcbmltcG9ydCBXYWxsIGZyb20gJy4vV2FsbCc7XG5pbXBvcnQgQmFkZ2UgZnJvbSAnLi9DbGltYkJhZGdlJztcblxuXG5jbGFzcyBXYWxsQ29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgICAgaXRlbXM6IHt9XG4gICAgfTtcblxuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIGNvbGxlY3Rpb25JZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgICAgICBsaW1pdDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgICAgICBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICAgICAgUHJvcFR5cGVzLnN0cmluZ1xuICAgICAgICBdKVxuICAgIH07XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBjb2xsZWN0aW9uSWQ6ICc1NjFiYTYzNDQ1Mjg0ZTE3NDBlMDE2ZjcnLFxuICAgICAgICBsaW1pdDogMzBcbiAgICB9O1xuXG4gICAgaW5pdCgpIHtcblxuICAgICAgICBpZiAoIXRoaXMucHJvcHMuY29sbGVjdGlvbklkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjbGltYlxuICAgICAgICAgICAgLmdldFN0cmVhbSh0aGlzLnByb3BzLmNvbGxlY3Rpb25JZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaXRlbXMgPT4ge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlSW50KHRoaXMucHJvcHMubGltaXQsIDApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkSXRlbXMgPSB7fTtcbiAgICAgICAgICAgICAgICBpdGVtcy5zcGxpY2UoMCwgbWF4U2l6ZSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBtYXBwZWRJdGVtc1tpdGVtLmlkXSA9IGl0ZW07XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IG1hcHBlZEl0ZW1zXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGxldCBjYjtcbiAgICAgICAgaWYgKHdpbmRvdy5DbGltYiAmJiB3aW5kb3cuQ2xpbWIub25VcGRhdGUpIHtcbiAgICAgICAgICAgIGNiID0gd2luZG93LkNsaW1iLm9uVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm9vcFxuICAgICAgICAgICAgY2IgPSAoKSA9PiB7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNiKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8V2FsbCBpdGVtcz17dGhpcy5zdGF0ZS5pdGVtc30vPlxuICAgICAgICAgICAgICAgIDxCYWRnZSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBXYWxsQ29udGFpbmVyO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L2VzbGludC1sb2FkZXIhLi9zcmMvY29tcG9uZW50cy9XYWxsQ29udGFpbmVyLmpzeFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3J4TGl0ZSA9IHJlcXVpcmUoJ3J4LWxpdGUnKTtcblxudmFyIF9mZXRjaEpzb25wID0gcmVxdWlyZSgnZmV0Y2gtanNvbnAnKTtcblxudmFyIF9mZXRjaEpzb25wMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZldGNoSnNvbnApO1xuXG52YXIgZ2V0U3RyZWFtID0gZnVuY3Rpb24gZ2V0U3RyZWFtKGNvbGxlY3Rpb25JZCkge1xuXG4gICAgdmFyIHBvbGxSYXRlID0gNSAqIDEwMDA7XG5cbiAgICB2YXIgcmVxdWVzdFN0cmVhbSA9IF9yeExpdGUuT2JzZXJ2YWJsZS5qdXN0KCdodHRwOi8vYXBwLmNsaW1iLnNvY2lhbC9hcGkvdjEvY29sbGVjdGlvbnMvJyArIGNvbGxlY3Rpb25JZCk7XG5cbiAgICB2YXIgdXBkYXRlU3RyZWFtID0gX3J4TGl0ZS5PYnNlcnZhYmxlLmludGVydmFsKHBvbGxSYXRlKS5zdGFydFdpdGgobnVsbCk7XG5cbiAgICB2YXIgcmVzcG9uc2VTdHJlYW0gPSB1cGRhdGVTdHJlYW0uY29tYmluZUxhdGVzdChyZXF1ZXN0U3RyZWFtLCBmdW5jdGlvbiAodGljaywgdXJsKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfSkuZmxhdE1hcChmdW5jdGlvbiAoYmFzZVVybCkge1xuXG4gICAgICAgIHZhciByZXF1ZXN0VXJsID0gJycgKyBiYXNlVXJsO1xuXG4gICAgICAgIHJldHVybiBfcnhMaXRlLk9ic2VydmFibGUuZnJvbVByb21pc2UoKDAsIF9mZXRjaEpzb25wMlsnZGVmYXVsdCddKShyZXF1ZXN0VXJsKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcC5qc29uKCk7XG4gICAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXNwb25zZVN0cmVhbTtcbn07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgICBnZXRTdHJlYW06IGdldFN0cmVhbVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY2xpbWItc29jaWFsL2Rpc3QvaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAxMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQsIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG47KGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcblxuICB2YXIgb2JqZWN0VHlwZXMgPSB7XG4gICAgJ2Z1bmN0aW9uJzogdHJ1ZSxcbiAgICAnb2JqZWN0JzogdHJ1ZVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNoZWNrR2xvYmFsKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZS5PYmplY3QgPT09IE9iamVjdCkgPyB2YWx1ZSA6IG51bGw7XG4gIH1cblxuICB2YXIgZnJlZUV4cG9ydHMgPSAob2JqZWN0VHlwZXNbdHlwZW9mIGV4cG9ydHNdICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUpID8gZXhwb3J0cyA6IG51bGw7XG4gIHZhciBmcmVlTW9kdWxlID0gKG9iamVjdFR5cGVzW3R5cGVvZiBtb2R1bGVdICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlKSA/IG1vZHVsZSA6IG51bGw7XG4gIHZhciBmcmVlR2xvYmFsID0gY2hlY2tHbG9iYWwoZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSAmJiB0eXBlb2YgZ2xvYmFsID09PSAnb2JqZWN0JyAmJiBnbG9iYWwpO1xuICB2YXIgZnJlZVNlbGYgPSBjaGVja0dsb2JhbChvYmplY3RUeXBlc1t0eXBlb2Ygc2VsZl0gJiYgc2VsZik7XG4gIHZhciBmcmVlV2luZG93ID0gY2hlY2tHbG9iYWwob2JqZWN0VHlwZXNbdHlwZW9mIHdpbmRvd10gJiYgd2luZG93KTtcbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSAoZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzKSA/IGZyZWVFeHBvcnRzIDogbnVsbDtcbiAgdmFyIHRoaXNHbG9iYWwgPSBjaGVja0dsb2JhbChvYmplY3RUeXBlc1t0eXBlb2YgdGhpc10gJiYgdGhpcyk7XG4gIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCAoKGZyZWVXaW5kb3cgIT09ICh0aGlzR2xvYmFsICYmIHRoaXNHbG9iYWwud2luZG93KSkgJiYgZnJlZVdpbmRvdykgfHwgZnJlZVNlbGYgfHwgdGhpc0dsb2JhbCB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4gIHZhciBSeCA9IHtcbiAgICBpbnRlcm5hbHM6IHt9LFxuICAgIGNvbmZpZzoge1xuICAgICAgUHJvbWlzZTogcm9vdC5Qcm9taXNlXG4gICAgfSxcbiAgICBoZWxwZXJzOiB7IH1cbiAgfTtcblxuICAvLyBEZWZhdWx0c1xuICB2YXIgbm9vcCA9IFJ4LmhlbHBlcnMubm9vcCA9IGZ1bmN0aW9uICgpIHsgfSxcbiAgICBpZGVudGl0eSA9IFJ4LmhlbHBlcnMuaWRlbnRpdHkgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4geDsgfSxcbiAgICBkZWZhdWx0Tm93ID0gUnguaGVscGVycy5kZWZhdWx0Tm93ID0gRGF0ZS5ub3csXG4gICAgZGVmYXVsdENvbXBhcmVyID0gUnguaGVscGVycy5kZWZhdWx0Q29tcGFyZXIgPSBmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4gaXNFcXVhbCh4LCB5KTsgfSxcbiAgICBkZWZhdWx0U3ViQ29tcGFyZXIgPSBSeC5oZWxwZXJzLmRlZmF1bHRTdWJDb21wYXJlciA9IGZ1bmN0aW9uICh4LCB5KSB7IHJldHVybiB4ID4geSA/IDEgOiAoeCA8IHkgPyAtMSA6IDApOyB9LFxuICAgIGRlZmF1bHRLZXlTZXJpYWxpemVyID0gUnguaGVscGVycy5kZWZhdWx0S2V5U2VyaWFsaXplciA9IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LnRvU3RyaW5nKCk7IH0sXG4gICAgZGVmYXVsdEVycm9yID0gUnguaGVscGVycy5kZWZhdWx0RXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7IHRocm93IGVycjsgfSxcbiAgICBpc1Byb21pc2UgPSBSeC5oZWxwZXJzLmlzUHJvbWlzZSA9IGZ1bmN0aW9uIChwKSB7IHJldHVybiAhIXAgJiYgdHlwZW9mIHAuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwLnRoZW4gPT09ICdmdW5jdGlvbic7IH0sXG4gICAgaXNGdW5jdGlvbiA9IFJ4LmhlbHBlcnMuaXNGdW5jdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgIHZhciBpc0ZuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyB8fCBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zIG9mIENocm9tZSBhbmQgU2FmYXJpXG4gICAgICBpZiAoaXNGbigveC8pKSB7XG4gICAgICAgIGlzRm4gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNGbjtcbiAgICB9KCkpO1xuXG4gICAgZnVuY3Rpb24gY2xvbmVBcnJheShhcnIpIHtcbiAgICAgIHZhciBsZW4gPSBhcnIubGVuZ3RoLCBhID0gbmV3IEFycmF5KGxlbik7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYVtpXSA9IGFycltpXTsgfVxuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gIHZhciBlcnJvck9iaiA9IHtlOiB7fX07XG4gIFxuICBmdW5jdGlvbiB0cnlDYXRjaGVyR2VuKHRyeUNhdGNoVGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHRyeUNhdGNoZXIoKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdHJ5Q2F0Y2hUYXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZXJyb3JPYmouZSA9IGU7XG4gICAgICAgIHJldHVybiBlcnJvck9iajtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIHRyeUNhdGNoID0gUnguaW50ZXJuYWxzLnRyeUNhdGNoID0gZnVuY3Rpb24gdHJ5Q2F0Y2goZm4pIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24oZm4pKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZuIG11c3QgYmUgYSBmdW5jdGlvbicpOyB9XG4gICAgcmV0dXJuIHRyeUNhdGNoZXJHZW4oZm4pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHRocm93ZXIoZSkge1xuICAgIHRocm93IGU7XG4gIH1cblxuICBSeC5jb25maWcubG9uZ1N0YWNrU3VwcG9ydCA9IGZhbHNlO1xuICB2YXIgaGFzU3RhY2tzID0gZmFsc2UsIHN0YWNrcyA9IHRyeUNhdGNoKGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IEVycm9yKCk7IH0pKCk7XG4gIGhhc1N0YWNrcyA9ICEhc3RhY2tzLmUgJiYgISFzdGFja3MuZS5zdGFjaztcblxuICAvLyBBbGwgY29kZSBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgZmlsdGVyZWQgZnJvbSBzdGFjayB0cmFjZXMgcmVwb3J0ZWQgYnkgUnhKU1xuICB2YXIgclN0YXJ0aW5nTGluZSA9IGNhcHR1cmVMaW5lKCksIHJGaWxlTmFtZTtcblxuICB2YXIgU1RBQ0tfSlVNUF9TRVBBUkFUT1IgPSAnRnJvbSBwcmV2aW91cyBldmVudDonO1xuXG4gIGZ1bmN0aW9uIG1ha2VTdGFja1RyYWNlTG9uZyhlcnJvciwgb2JzZXJ2YWJsZSkge1xuICAgIC8vIElmIHBvc3NpYmxlLCB0cmFuc2Zvcm0gdGhlIGVycm9yIHN0YWNrIHRyYWNlIGJ5IHJlbW92aW5nIE5vZGUgYW5kIFJ4SlNcbiAgICAvLyBjcnVmdCwgdGhlbiBjb25jYXRlbmF0aW5nIHdpdGggdGhlIHN0YWNrIHRyYWNlIG9mIGBvYnNlcnZhYmxlYC5cbiAgICBpZiAoaGFzU3RhY2tzICYmXG4gICAgICAgIG9ic2VydmFibGUuc3RhY2sgJiZcbiAgICAgICAgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBlcnJvciAhPT0gbnVsbCAmJlxuICAgICAgICBlcnJvci5zdGFjayAmJlxuICAgICAgICBlcnJvci5zdGFjay5pbmRleE9mKFNUQUNLX0pVTVBfU0VQQVJBVE9SKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIHZhciBzdGFja3MgPSBbXTtcbiAgICAgIGZvciAodmFyIG8gPSBvYnNlcnZhYmxlOyAhIW87IG8gPSBvLnNvdXJjZSkge1xuICAgICAgICBpZiAoby5zdGFjaykge1xuICAgICAgICAgIHN0YWNrcy51bnNoaWZ0KG8uc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja3MudW5zaGlmdChlcnJvci5zdGFjayk7XG5cbiAgICAgIHZhciBjb25jYXRlZFN0YWNrcyA9IHN0YWNrcy5qb2luKCdcXG4nICsgU1RBQ0tfSlVNUF9TRVBBUkFUT1IgKyAnXFxuJyk7XG4gICAgICBlcnJvci5zdGFjayA9IGZpbHRlclN0YWNrU3RyaW5nKGNvbmNhdGVkU3RhY2tzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmaWx0ZXJTdGFja1N0cmluZyhzdGFja1N0cmluZykge1xuICAgIHZhciBsaW5lcyA9IHN0YWNrU3RyaW5nLnNwbGl0KCdcXG4nKSwgZGVzaXJlZExpbmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgbGluZSA9IGxpbmVzW2ldO1xuXG4gICAgICBpZiAoIWlzSW50ZXJuYWxGcmFtZShsaW5lKSAmJiAhaXNOb2RlRnJhbWUobGluZSkgJiYgbGluZSkge1xuICAgICAgICBkZXNpcmVkTGluZXMucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc2lyZWRMaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW50ZXJuYWxGcmFtZShzdGFja0xpbmUpIHtcbiAgICB2YXIgZmlsZU5hbWVBbmRMaW5lTnVtYmVyID0gZ2V0RmlsZU5hbWVBbmRMaW5lTnVtYmVyKHN0YWNrTGluZSk7XG4gICAgaWYgKCFmaWxlTmFtZUFuZExpbmVOdW1iZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzBdLCBsaW5lTnVtYmVyID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzFdO1xuXG4gICAgcmV0dXJuIGZpbGVOYW1lID09PSByRmlsZU5hbWUgJiZcbiAgICAgIGxpbmVOdW1iZXIgPj0gclN0YXJ0aW5nTGluZSAmJlxuICAgICAgbGluZU51bWJlciA8PSByRW5kaW5nTGluZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZUZyYW1lKHN0YWNrTGluZSkge1xuICAgIHJldHVybiBzdGFja0xpbmUuaW5kZXhPZignKG1vZHVsZS5qczonKSAhPT0gLTEgfHxcbiAgICAgIHN0YWNrTGluZS5pbmRleE9mKCcobm9kZS5qczonKSAhPT0gLTE7XG4gIH1cblxuICBmdW5jdGlvbiBjYXB0dXJlTGluZSgpIHtcbiAgICBpZiAoIWhhc1N0YWNrcykgeyByZXR1cm47IH1cblxuICAgIHRyeSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB2YXIgbGluZXMgPSBlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBmaXJzdExpbmUgPSBsaW5lc1swXS5pbmRleE9mKCdAJykgPiAwID8gbGluZXNbMV0gOiBsaW5lc1syXTtcbiAgICAgIHZhciBmaWxlTmFtZUFuZExpbmVOdW1iZXIgPSBnZXRGaWxlTmFtZUFuZExpbmVOdW1iZXIoZmlyc3RMaW5lKTtcbiAgICAgIGlmICghZmlsZU5hbWVBbmRMaW5lTnVtYmVyKSB7IHJldHVybjsgfVxuXG4gICAgICByRmlsZU5hbWUgPSBmaWxlTmFtZUFuZExpbmVOdW1iZXJbMF07XG4gICAgICByZXR1cm4gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzFdO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZpbGVOYW1lQW5kTGluZU51bWJlcihzdGFja0xpbmUpIHtcbiAgICAvLyBOYW1lZCBmdW5jdGlvbnM6ICdhdCBmdW5jdGlvbk5hbWUgKGZpbGVuYW1lOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyKSdcbiAgICB2YXIgYXR0ZW1wdDEgPSAvYXQgLisgXFwoKC4rKTooXFxkKyk6KD86XFxkKylcXCkkLy5leGVjKHN0YWNrTGluZSk7XG4gICAgaWYgKGF0dGVtcHQxKSB7IHJldHVybiBbYXR0ZW1wdDFbMV0sIE51bWJlcihhdHRlbXB0MVsyXSldOyB9XG5cbiAgICAvLyBBbm9ueW1vdXMgZnVuY3Rpb25zOiAnYXQgZmlsZW5hbWU6bGluZU51bWJlcjpjb2x1bW5OdW1iZXInXG4gICAgdmFyIGF0dGVtcHQyID0gL2F0IChbXiBdKyk6KFxcZCspOig/OlxcZCspJC8uZXhlYyhzdGFja0xpbmUpO1xuICAgIGlmIChhdHRlbXB0MikgeyByZXR1cm4gW2F0dGVtcHQyWzFdLCBOdW1iZXIoYXR0ZW1wdDJbMl0pXTsgfVxuXG4gICAgLy8gRmlyZWZveCBzdHlsZTogJ2Z1bmN0aW9uQGZpbGVuYW1lOmxpbmVOdW1iZXIgb3IgQGZpbGVuYW1lOmxpbmVOdW1iZXInXG4gICAgdmFyIGF0dGVtcHQzID0gLy4qQCguKyk6KFxcZCspJC8uZXhlYyhzdGFja0xpbmUpO1xuICAgIGlmIChhdHRlbXB0MykgeyByZXR1cm4gW2F0dGVtcHQzWzFdLCBOdW1iZXIoYXR0ZW1wdDNbMl0pXTsgfVxuICB9XG5cbiAgdmFyIEVtcHR5RXJyb3IgPSBSeC5FbXB0eUVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gJ1NlcXVlbmNlIGNvbnRhaW5zIG5vIGVsZW1lbnRzLic7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgfTtcbiAgRW1wdHlFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gIEVtcHR5RXJyb3IucHJvdG90eXBlLm5hbWUgPSAnRW1wdHlFcnJvcic7XG5cbiAgdmFyIE9iamVjdERpc3Bvc2VkRXJyb3IgPSBSeC5PYmplY3REaXNwb3NlZEVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gJ09iamVjdCBoYXMgYmVlbiBkaXNwb3NlZCc7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgfTtcbiAgT2JqZWN0RGlzcG9zZWRFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gIE9iamVjdERpc3Bvc2VkRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnT2JqZWN0RGlzcG9zZWRFcnJvcic7XG5cbiAgdmFyIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yID0gUnguQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gJ0FyZ3VtZW50IG91dCBvZiByYW5nZSc7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgfTtcbiAgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuICBBcmd1bWVudE91dE9mUmFuZ2VFcnJvci5wcm90b3R5cGUubmFtZSA9ICdBcmd1bWVudE91dE9mUmFuZ2VFcnJvcic7XG5cbiAgdmFyIE5vdFN1cHBvcnRlZEVycm9yID0gUnguTm90U3VwcG9ydGVkRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQnO1xuICAgIEVycm9yLmNhbGwodGhpcyk7XG4gIH07XG4gIE5vdFN1cHBvcnRlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbiAgTm90U3VwcG9ydGVkRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnTm90U3VwcG9ydGVkRXJyb3InO1xuXG4gIHZhciBOb3RJbXBsZW1lbnRlZEVycm9yID0gUnguTm90SW1wbGVtZW50ZWRFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhpcyBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkJztcbiAgICBFcnJvci5jYWxsKHRoaXMpO1xuICB9O1xuICBOb3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbiAgTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUubmFtZSA9ICdOb3RJbXBsZW1lbnRlZEVycm9yJztcblxuICB2YXIgbm90SW1wbGVtZW50ZWQgPSBSeC5oZWxwZXJzLm5vdEltcGxlbWVudGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH07XG5cbiAgdmFyIG5vdFN1cHBvcnRlZCA9IFJ4LmhlbHBlcnMubm90U3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICB9O1xuXG4gIC8vIFNoaW0gaW4gaXRlcmF0b3Igc3VwcG9ydFxuICB2YXIgJGl0ZXJhdG9yJCA9ICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcikgfHxcbiAgICAnX2VzNnNoaW1faXRlcmF0b3JfJztcbiAgLy8gQnVnIGZvciBtb3ppbGxhIHZlcnNpb25cbiAgaWYgKHJvb3QuU2V0ICYmIHR5cGVvZiBuZXcgcm9vdC5TZXQoKVsnQEBpdGVyYXRvciddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgJGl0ZXJhdG9yJCA9ICdAQGl0ZXJhdG9yJztcbiAgfVxuXG4gIHZhciBkb25lRW51bWVyYXRvciA9IFJ4LmRvbmVFbnVtZXJhdG9yID0geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG5cbiAgdmFyIGlzSXRlcmFibGUgPSBSeC5oZWxwZXJzLmlzSXRlcmFibGUgPSBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIG9bJGl0ZXJhdG9yJF0gIT09IHVuZGVmaW5lZDtcbiAgfTtcblxuICB2YXIgaXNBcnJheUxpa2UgPSBSeC5oZWxwZXJzLmlzQXJyYXlMaWtlID0gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBvLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICB9O1xuXG4gIFJ4LmhlbHBlcnMuaXRlcmF0b3IgPSAkaXRlcmF0b3IkO1xuXG4gIHZhciBiaW5kQ2FsbGJhY2sgPSBSeC5pbnRlcm5hbHMuYmluZENhbGxiYWNrID0gZnVuY3Rpb24gKGZ1bmMsIHRoaXNBcmcsIGFyZ0NvdW50KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzQXJnID09PSAndW5kZWZpbmVkJykgeyByZXR1cm4gZnVuYzsgfVxuICAgIHN3aXRjaChhcmdDb3VudCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKVxuICAgICAgICB9O1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmcpO1xuICAgICAgICB9XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCk7XG4gICAgICAgIH07XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIGRldGVybWluZSBpZiB2YWx1ZXMgYXJlIG9mIHRoZSBsYW5ndWFnZSB0eXBlIE9iamVjdCAqL1xuICB2YXIgZG9udEVudW1zID0gWyd0b1N0cmluZycsXG4gICAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgICAndmFsdWVPZicsXG4gICAgJ2hhc093blByb3BlcnR5JyxcbiAgICAnaXNQcm90b3R5cGVPZicsXG4gICAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgICAnY29uc3RydWN0b3InXSxcbiAgZG9udEVudW1zTGVuZ3RoID0gZG9udEVudW1zLmxlbmd0aDtcblxuICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHNob3J0Y3V0cyAqL1xuICB2YXIgYXJnc0NsYXNzID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlDbGFzcyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbENsYXNzID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVDbGFzcyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvckNsYXNzID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jQ2xhc3MgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG51bWJlckNsYXNzID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBDbGFzcyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHN0cmluZ0NsYXNzID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbiAgdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxcbiAgICBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksXG4gICAgc3VwcG9ydHNBcmdzQ2xhc3MgPSB0b1N0cmluZy5jYWxsKGFyZ3VtZW50cykgPT0gYXJnc0NsYXNzLCAvLyBGb3IgbGVzcyA8SUU5ICYmIEZGPDRcbiAgICBzdXBwb3J0Tm9kZUNsYXNzLFxuICAgIGVycm9yUHJvdG8gPSBFcnJvci5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlLFxuICAgIHN0cmluZ1Byb3RvID0gU3RyaW5nLnByb3RvdHlwZSxcbiAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4gIHRyeSB7XG4gICAgc3VwcG9ydE5vZGVDbGFzcyA9ICEodG9TdHJpbmcuY2FsbChkb2N1bWVudCkgPT0gb2JqZWN0Q2xhc3MgJiYgISh7ICd0b1N0cmluZyc6IDAgfSArICcnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzdXBwb3J0Tm9kZUNsYXNzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBub25FbnVtUHJvcHMgPSB7fTtcbiAgbm9uRW51bVByb3BzW2FycmF5Q2xhc3NdID0gbm9uRW51bVByb3BzW2RhdGVDbGFzc10gPSBub25FbnVtUHJvcHNbbnVtYmVyQ2xhc3NdID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9Mb2NhbGVTdHJpbmcnOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlLCAndmFsdWVPZic6IHRydWUgfTtcbiAgbm9uRW51bVByb3BzW2Jvb2xDbGFzc10gPSBub25FbnVtUHJvcHNbc3RyaW5nQ2xhc3NdID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlLCAndmFsdWVPZic6IHRydWUgfTtcbiAgbm9uRW51bVByb3BzW2Vycm9yQ2xhc3NdID0gbm9uRW51bVByb3BzW2Z1bmNDbGFzc10gPSBub25FbnVtUHJvcHNbcmVnZXhwQ2xhc3NdID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlIH07XG4gIG5vbkVudW1Qcm9wc1tvYmplY3RDbGFzc10gPSB7ICdjb25zdHJ1Y3Rvcic6IHRydWUgfTtcblxuICB2YXIgc3VwcG9ydCA9IHt9O1xuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjdG9yID0gZnVuY3Rpb24oKSB7IHRoaXMueCA9IDE7IH0sXG4gICAgICBwcm9wcyA9IFtdO1xuXG4gICAgY3Rvci5wcm90b3R5cGUgPSB7ICd2YWx1ZU9mJzogMSwgJ3knOiAxIH07XG4gICAgZm9yICh2YXIga2V5IGluIG5ldyBjdG9yKSB7IHByb3BzLnB1c2goa2V5KTsgfVxuICAgIGZvciAoa2V5IGluIGFyZ3VtZW50cykgeyB9XG5cbiAgICAvLyBEZXRlY3QgaWYgYG5hbWVgIG9yIGBtZXNzYWdlYCBwcm9wZXJ0aWVzIG9mIGBFcnJvci5wcm90b3R5cGVgIGFyZSBlbnVtZXJhYmxlIGJ5IGRlZmF1bHQuXG4gICAgc3VwcG9ydC5lbnVtRXJyb3JQcm9wcyA9IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZXJyb3JQcm90bywgJ21lc3NhZ2UnKSB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGVycm9yUHJvdG8sICduYW1lJyk7XG5cbiAgICAvLyBEZXRlY3QgaWYgYHByb3RvdHlwZWAgcHJvcGVydGllcyBhcmUgZW51bWVyYWJsZSBieSBkZWZhdWx0LlxuICAgIHN1cHBvcnQuZW51bVByb3RvdHlwZXMgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGN0b3IsICdwcm90b3R5cGUnKTtcblxuICAgIC8vIERldGVjdCBpZiBgYXJndW1lbnRzYCBvYmplY3QgaW5kZXhlcyBhcmUgbm9uLWVudW1lcmFibGVcbiAgICBzdXBwb3J0Lm5vbkVudW1BcmdzID0ga2V5ICE9IDA7XG5cbiAgICAvLyBEZXRlY3QgaWYgcHJvcGVydGllcyBzaGFkb3dpbmcgdGhvc2Ugb24gYE9iamVjdC5wcm90b3R5cGVgIGFyZSBub24tZW51bWVyYWJsZS5cbiAgICBzdXBwb3J0Lm5vbkVudW1TaGFkb3dzID0gIS92YWx1ZU9mLy50ZXN0KHByb3BzKTtcbiAgfSgxKSk7XG5cbiAgdmFyIGlzT2JqZWN0ID0gUnguaW50ZXJuYWxzLmlzT2JqZWN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHR5cGUgPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlID09ICdvYmplY3QnKSB8fCBmYWxzZTtcbiAgfTtcblxuICBmdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQubm9uRW51bUFyZ3MgJiYgb2JqZWN0Lmxlbmd0aCAmJiBpc0FyZ3VtZW50cyhvYmplY3QpKSB7XG4gICAgICBvYmplY3QgPSBzbGljZS5jYWxsKG9iamVjdCk7XG4gICAgfVxuICAgIHZhciBza2lwUHJvdG8gPSBzdXBwb3J0LmVudW1Qcm90b3R5cGVzICYmIHR5cGVvZiBvYmplY3QgPT0gJ2Z1bmN0aW9uJyxcbiAgICAgICAgc2tpcEVycm9yUHJvcHMgPSBzdXBwb3J0LmVudW1FcnJvclByb3BzICYmIChvYmplY3QgPT09IGVycm9yUHJvdG8gfHwgb2JqZWN0IGluc3RhbmNlb2YgRXJyb3IpO1xuXG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAgaWYgKCEoc2tpcFByb3RvICYmIGtleSA9PSAncHJvdG90eXBlJykgJiZcbiAgICAgICAgICAhKHNraXBFcnJvclByb3BzICYmIChrZXkgPT0gJ21lc3NhZ2UnIHx8IGtleSA9PSAnbmFtZScpKSkge1xuICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXBwb3J0Lm5vbkVudW1TaGFkb3dzICYmIG9iamVjdCAhPT0gb2JqZWN0UHJvdG8pIHtcbiAgICAgIHZhciBjdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZG9udEVudW1zTGVuZ3RoO1xuXG4gICAgICBpZiAob2JqZWN0ID09PSAoY3RvciAmJiBjdG9yLnByb3RvdHlwZSkpIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IG9iamVjdCA9PT0gc3RyaW5nUHJvdG8gPyBzdHJpbmdDbGFzcyA6IG9iamVjdCA9PT0gZXJyb3JQcm90byA/IGVycm9yQ2xhc3MgOiB0b1N0cmluZy5jYWxsKG9iamVjdCksXG4gICAgICAgICAgICBub25FbnVtID0gbm9uRW51bVByb3BzW2NsYXNzTmFtZV07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBrZXkgPSBkb250RW51bXNbaW5kZXhdO1xuICAgICAgICBpZiAoIShub25FbnVtICYmIG5vbkVudW1ba2V5XSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBpbnRlcm5hbEZvcihvYmplY3QsIGNhbGxiYWNrLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG4gICAgICBpZiAoY2FsbGJhY2sob2JqZWN0W2tleV0sIGtleSwgb2JqZWN0KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICBmdW5jdGlvbiBpbnRlcm5hbEZvckluKG9iamVjdCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gaW50ZXJuYWxGb3Iob2JqZWN0LCBjYWxsYmFjaywga2V5c0luKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZSh2YWx1ZSkge1xuICAgIC8vIElFIDwgOSBwcmVzZW50cyBET00gbm9kZXMgYXMgYE9iamVjdGAgb2JqZWN0cyBleGNlcHQgdGhleSBoYXZlIGB0b1N0cmluZ2BcbiAgICAvLyBtZXRob2RzIHRoYXQgYXJlIGB0eXBlb2ZgIFwic3RyaW5nXCIgYW5kIHN0aWxsIGNhbiBjb2VyY2Ugbm9kZXMgdG8gc3RyaW5nc1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKHZhbHVlICsgJycpID09ICdzdHJpbmcnO1xuICB9XG5cbiAgdmFyIGlzQXJndW1lbnRzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JykgPyB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcmdzQ2xhc3MgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIGZhbGxiYWNrIGZvciBicm93c2VycyB0aGF0IGNhbid0IGRldGVjdCBgYXJndW1lbnRzYCBvYmplY3RzIGJ5IFtbQ2xhc3NdXVxuICBpZiAoIXN1cHBvcnRzQXJnc0NsYXNzKSB7XG4gICAgaXNBcmd1bWVudHMgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpID8gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpIDogZmFsc2U7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpc0VxdWFsID0gUnguaW50ZXJuYWxzLmlzRXF1YWwgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHJldHVybiBkZWVwRXF1YWxzKHgsIHksIFtdLCBbXSk7XG4gIH07XG5cbiAgLyoqIEBwcml2YXRlXG4gICAqIFVzZWQgZm9yIGRlZXAgY29tcGFyaXNvblxuICAgKiovXG4gIGZ1bmN0aW9uIGRlZXBFcXVhbHMoYSwgYiwgc3RhY2tBLCBzdGFja0IpIHtcbiAgICAvLyBleGl0IGVhcmx5IGZvciBpZGVudGljYWwgdmFsdWVzXG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgIC8vIHRyZWF0IGArMGAgdnMuIGAtMGAgYXMgbm90IGVxdWFsXG4gICAgICByZXR1cm4gYSAhPT0gMCB8fCAoMSAvIGEgPT0gMSAvIGIpO1xuICAgIH1cblxuICAgIHZhciB0eXBlID0gdHlwZW9mIGEsXG4gICAgICAgIG90aGVyVHlwZSA9IHR5cGVvZiBiO1xuXG4gICAgLy8gZXhpdCBlYXJseSBmb3IgdW5saWtlIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICBpZiAoYSA9PT0gYSAmJiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCB8fFxuICAgICAgICAodHlwZSAhPSAnZnVuY3Rpb24nICYmIHR5cGUgIT0gJ29iamVjdCcgJiYgb3RoZXJUeXBlICE9ICdmdW5jdGlvbicgJiYgb3RoZXJUeXBlICE9ICdvYmplY3QnKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIFtbQ2xhc3NdXSBuYW1lc1xuICAgIHZhciBjbGFzc05hbWUgPSB0b1N0cmluZy5jYWxsKGEpLFxuICAgICAgICBvdGhlckNsYXNzID0gdG9TdHJpbmcuY2FsbChiKTtcblxuICAgIGlmIChjbGFzc05hbWUgPT0gYXJnc0NsYXNzKSB7XG4gICAgICBjbGFzc05hbWUgPSBvYmplY3RDbGFzcztcbiAgICB9XG4gICAgaWYgKG90aGVyQ2xhc3MgPT0gYXJnc0NsYXNzKSB7XG4gICAgICBvdGhlckNsYXNzID0gb2JqZWN0Q2xhc3M7XG4gICAgfVxuICAgIGlmIChjbGFzc05hbWUgIT0gb3RoZXJDbGFzcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgY2FzZSBib29sQ2xhc3M6XG4gICAgICBjYXNlIGRhdGVDbGFzczpcbiAgICAgICAgLy8gY29lcmNlIGRhdGVzIGFuZCBib29sZWFucyB0byBudW1iZXJzLCBkYXRlcyB0byBtaWxsaXNlY29uZHMgYW5kIGJvb2xlYW5zXG4gICAgICAgIC8vIHRvIGAxYCBvciBgMGAgdHJlYXRpbmcgaW52YWxpZCBkYXRlcyBjb2VyY2VkIHRvIGBOYU5gIGFzIG5vdCBlcXVhbFxuICAgICAgICByZXR1cm4gK2EgPT0gK2I7XG5cbiAgICAgIGNhc2UgbnVtYmVyQ2xhc3M6XG4gICAgICAgIC8vIHRyZWF0IGBOYU5gIHZzLiBgTmFOYCBhcyBlcXVhbFxuICAgICAgICByZXR1cm4gKGEgIT0gK2EpID9cbiAgICAgICAgICBiICE9ICtiIDpcbiAgICAgICAgICAvLyBidXQgdHJlYXQgYC0wYCB2cy4gYCswYCBhcyBub3QgZXF1YWxcbiAgICAgICAgICAoYSA9PSAwID8gKDEgLyBhID09IDEgLyBiKSA6IGEgPT0gK2IpO1xuXG4gICAgICBjYXNlIHJlZ2V4cENsYXNzOlxuICAgICAgY2FzZSBzdHJpbmdDbGFzczpcbiAgICAgICAgLy8gY29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMC42LjQpXG4gICAgICAgIC8vIHRyZWF0IHN0cmluZyBwcmltaXRpdmVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9iamVjdCBpbnN0YW5jZXMgYXMgZXF1YWxcbiAgICAgICAgcmV0dXJuIGEgPT0gU3RyaW5nKGIpO1xuICAgIH1cbiAgICB2YXIgaXNBcnIgPSBjbGFzc05hbWUgPT0gYXJyYXlDbGFzcztcbiAgICBpZiAoIWlzQXJyKSB7XG5cbiAgICAgIC8vIGV4aXQgZm9yIGZ1bmN0aW9ucyBhbmQgRE9NIG5vZGVzXG4gICAgICBpZiAoY2xhc3NOYW1lICE9IG9iamVjdENsYXNzIHx8ICghc3VwcG9ydC5ub2RlQ2xhc3MgJiYgKGlzTm9kZShhKSB8fCBpc05vZGUoYikpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBpbiBvbGRlciB2ZXJzaW9ucyBvZiBPcGVyYSwgYGFyZ3VtZW50c2Agb2JqZWN0cyBoYXZlIGBBcnJheWAgY29uc3RydWN0b3JzXG4gICAgICB2YXIgY3RvckEgPSAhc3VwcG9ydC5hcmdzT2JqZWN0ICYmIGlzQXJndW1lbnRzKGEpID8gT2JqZWN0IDogYS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBjdG9yQiA9ICFzdXBwb3J0LmFyZ3NPYmplY3QgJiYgaXNBcmd1bWVudHMoYikgPyBPYmplY3QgOiBiLmNvbnN0cnVjdG9yO1xuXG4gICAgICAvLyBub24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbFxuICAgICAgaWYgKGN0b3JBICE9IGN0b3JCICYmXG4gICAgICAgICAgICAhKGhhc093blByb3BlcnR5LmNhbGwoYSwgJ2NvbnN0cnVjdG9yJykgJiYgaGFzT3duUHJvcGVydHkuY2FsbChiLCAnY29uc3RydWN0b3InKSkgJiZcbiAgICAgICAgICAgICEoaXNGdW5jdGlvbihjdG9yQSkgJiYgY3RvckEgaW5zdGFuY2VvZiBjdG9yQSAmJiBpc0Z1bmN0aW9uKGN0b3JCKSAmJiBjdG9yQiBpbnN0YW5jZW9mIGN0b3JCKSAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gYSAmJiAnY29uc3RydWN0b3InIGluIGIpXG4gICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYXNzdW1lIGN5Y2xpYyBzdHJ1Y3R1cmVzIGFyZSBlcXVhbFxuICAgIC8vIHRoZSBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBjeWNsaWMgc3RydWN0dXJlcyBpcyBhZGFwdGVkIGZyb20gRVMgNS4xXG4gICAgLy8gc2VjdGlvbiAxNS4xMi4zLCBhYnN0cmFjdCBvcGVyYXRpb24gYEpPYCAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMi4zKVxuICAgIHZhciBpbml0ZWRTdGFjayA9ICFzdGFja0E7XG4gICAgc3RhY2tBIHx8IChzdGFja0EgPSBbXSk7XG4gICAgc3RhY2tCIHx8IChzdGFja0IgPSBbXSk7XG5cbiAgICB2YXIgbGVuZ3RoID0gc3RhY2tBLmxlbmd0aDtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChzdGFja0FbbGVuZ3RoXSA9PSBhKSB7XG4gICAgICAgIHJldHVybiBzdGFja0JbbGVuZ3RoXSA9PSBiO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IHRydWU7XG5cbiAgICAvLyBhZGQgYGFgIGFuZCBgYmAgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzXG4gICAgc3RhY2tBLnB1c2goYSk7XG4gICAgc3RhY2tCLnB1c2goYik7XG5cbiAgICAvLyByZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpXG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAvLyBjb21wYXJlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIGlmIGEgZGVlcCBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeVxuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBzaXplID0gYi5sZW5ndGg7XG4gICAgICByZXN1bHQgPSBzaXplID09IGxlbmd0aDtcblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvLyBkZWVwIGNvbXBhcmUgdGhlIGNvbnRlbnRzLCBpZ25vcmluZyBub24tbnVtZXJpYyBwcm9wZXJ0aWVzXG4gICAgICAgIHdoaWxlIChzaXplLS0pIHtcbiAgICAgICAgICB2YXIgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICAgIHZhbHVlID0gYltzaXplXTtcblxuICAgICAgICAgIGlmICghKHJlc3VsdCA9IGRlZXBFcXVhbHMoYVtzaXplXSwgdmFsdWUsIHN0YWNrQSwgc3RhY2tCKSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIGRlZXAgY29tcGFyZSBvYmplY3RzIHVzaW5nIGBmb3JJbmAsIGluc3RlYWQgb2YgYGZvck93bmAsIHRvIGF2b2lkIGBPYmplY3Qua2V5c2BcbiAgICAgIC8vIHdoaWNoLCBpbiB0aGlzIGNhc2UsIGlzIG1vcmUgY29zdGx5XG4gICAgICBpbnRlcm5hbEZvckluKGIsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGIpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkge1xuICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcy5cbiAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgLy8gZGVlcCBjb21wYXJlIGVhY2ggcHJvcGVydHkgdmFsdWUuXG4gICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGtleSkgJiYgZGVlcEVxdWFscyhhW2tleV0sIHZhbHVlLCBzdGFja0EsIHN0YWNrQikpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvLyBlbnN1cmUgYm90aCBvYmplY3RzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHByb3BlcnRpZXNcbiAgICAgICAgaW50ZXJuYWxGb3JJbihhLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBhKSB7XG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYSwga2V5KSkge1xuICAgICAgICAgICAgLy8gYHNpemVgIHdpbGwgYmUgYC0xYCBpZiBgYWAgaGFzIG1vcmUgcHJvcGVydGllcyB0aGFuIGBiYFxuICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSAtLXNpemUgPiAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhY2tBLnBvcCgpO1xuICAgIHN0YWNrQi5wb3AoKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICAgICAgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbiAgdmFyIGluaGVyaXRzID0gUnguaW50ZXJuYWxzLmluaGVyaXRzID0gZnVuY3Rpb24gKGNoaWxkLCBwYXJlbnQpIHtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9XG4gICAgX18ucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgX18oKTtcbiAgfTtcblxuICB2YXIgYWRkUHJvcGVydGllcyA9IFJ4LmludGVybmFscy5hZGRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKG9iaikge1xuICAgIGZvcih2YXIgc291cmNlcyA9IFtdLCBpID0gMSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7IHNvdXJjZXMucHVzaChhcmd1bWVudHNbaV0pOyB9XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbG4gPSBzb3VyY2VzLmxlbmd0aDsgaWR4IDwgbG47IGlkeCsrKSB7XG4gICAgICB2YXIgc291cmNlID0gc291cmNlc1tpZHhdO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgb2JqW3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBSeCBVdGlsc1xuICB2YXIgYWRkUmVmID0gUnguaW50ZXJuYWxzLmFkZFJlZiA9IGZ1bmN0aW9uICh4cywgcikge1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShyLmdldERpc3Bvc2FibGUoKSwgeHMuc3Vic2NyaWJlKG9ic2VydmVyKSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gYXJyYXlJbml0aWFsaXplKGNvdW50LCBmYWN0b3J5KSB7XG4gICAgdmFyIGEgPSBuZXcgQXJyYXkoY291bnQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgYVtpXSA9IGZhY3RvcnkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGdyb3VwIG9mIGRpc3Bvc2FibGUgcmVzb3VyY2VzIHRoYXQgYXJlIGRpc3Bvc2VkIHRvZ2V0aGVyLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICovXG4gIHZhciBDb21wb3NpdGVEaXNwb3NhYmxlID0gUnguQ29tcG9zaXRlRGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBpLCBsZW47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgYXJncyA9IGFyZ3VtZW50c1swXTtcbiAgICAgIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIH1cbiAgICB0aGlzLmRpc3Bvc2FibGVzID0gYXJncztcbiAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLmxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBDb21wb3NpdGVEaXNwb3NhYmxlUHJvdG90eXBlID0gQ29tcG9zaXRlRGlzcG9zYWJsZS5wcm90b3R5cGU7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBkaXNwb3NhYmxlIHRvIHRoZSBDb21wb3NpdGVEaXNwb3NhYmxlIG9yIGRpc3Bvc2VzIHRoZSBkaXNwb3NhYmxlIGlmIHRoZSBDb21wb3NpdGVEaXNwb3NhYmxlIGlzIGRpc3Bvc2VkLlxuICAgKiBAcGFyYW0ge01peGVkfSBpdGVtIERpc3Bvc2FibGUgdG8gYWRkLlxuICAgKi9cbiAgQ29tcG9zaXRlRGlzcG9zYWJsZVByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIGl0ZW0uZGlzcG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3Bvc2FibGVzLnB1c2goaXRlbSk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbmQgZGlzcG9zZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBkaXNwb3NhYmxlIGZyb20gdGhlIENvbXBvc2l0ZURpc3Bvc2FibGUuXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGl0ZW0gRGlzcG9zYWJsZSB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGZvdW5kOyBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBDb21wb3NpdGVEaXNwb3NhYmxlUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIHNob3VsZERpc3Bvc2UgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgdmFyIGlkeCA9IHRoaXMuZGlzcG9zYWJsZXMuaW5kZXhPZihpdGVtKTtcbiAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgIHNob3VsZERpc3Bvc2UgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpc3Bvc2FibGVzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB0aGlzLmxlbmd0aC0tO1xuICAgICAgICBpdGVtLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNob3VsZERpc3Bvc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqICBEaXNwb3NlcyBhbGwgZGlzcG9zYWJsZXMgaW4gdGhlIGdyb3VwIGFuZCByZW1vdmVzIHRoZW0gZnJvbSB0aGUgZ3JvdXAuXG4gICAqL1xuICBDb21wb3NpdGVEaXNwb3NhYmxlUHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICB2YXIgbGVuID0gdGhpcy5kaXNwb3NhYmxlcy5sZW5ndGgsIGN1cnJlbnREaXNwb3NhYmxlcyA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGN1cnJlbnREaXNwb3NhYmxlc1tpXSA9IHRoaXMuZGlzcG9zYWJsZXNbaV07IH1cbiAgICAgIHRoaXMuZGlzcG9zYWJsZXMgPSBbXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGN1cnJlbnREaXNwb3NhYmxlc1tpXS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIHNldCBvZiBzdGF0aWMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgRGlzcG9zYWJsZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3Bvc2UgQWN0aW9uIHRvIHJ1biBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgdG8gZGlzcG9zZS4gVGhlIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIHJ1biBhdCBtb3N0IG9uY2UuXG4gICAqL1xuICB2YXIgRGlzcG9zYWJsZSA9IFJ4LkRpc3Bvc2FibGUgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgdGhpcy5hY3Rpb24gPSBhY3Rpb24gfHwgbm9vcDtcbiAgfTtcblxuICAvKiogUGVyZm9ybXMgdGhlIHRhc2sgb2YgY2xlYW5pbmcgdXAgcmVzb3VyY2VzLiAqL1xuICBEaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICB0aGlzLmFjdGlvbigpO1xuICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkaXNwb3NhYmxlIG9iamVjdCB0aGF0IGludm9rZXMgdGhlIHNwZWNpZmllZCBhY3Rpb24gd2hlbiBkaXNwb3NlZC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcG9zZSBBY3Rpb24gdG8gcnVuIGR1cmluZyB0aGUgZmlyc3QgY2FsbCB0byBkaXNwb3NlLiBUaGUgYWN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgcnVuIGF0IG1vc3Qgb25jZS5cbiAgICogQHJldHVybiB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHRoYXQgcnVucyB0aGUgZ2l2ZW4gYWN0aW9uIHVwb24gZGlzcG9zYWwuXG4gICAqL1xuICB2YXIgZGlzcG9zYWJsZUNyZWF0ZSA9IERpc3Bvc2FibGUuY3JlYXRlID0gZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gbmV3IERpc3Bvc2FibGUoYWN0aW9uKTsgfTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgZGlzcG9zYWJsZSB0aGF0IGRvZXMgbm90aGluZyB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgdmFyIGRpc3Bvc2FibGVFbXB0eSA9IERpc3Bvc2FibGUuZW1wdHkgPSB7IGRpc3Bvc2U6IG5vb3AgfTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIGRpc3Bvc2FibGVcbiAgICogQHBhcmFtIHtPYmplY3R9IE9iamVjdCB0byB0ZXN0IHdoZXRoZXIgaXQgaGFzIGEgZGlzcG9zZSBtZXRob2RcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgYSBkaXNwb3NhYmxlIG9iamVjdCwgZWxzZSBmYWxzZS5cbiAgICovXG4gIHZhciBpc0Rpc3Bvc2FibGUgPSBEaXNwb3NhYmxlLmlzRGlzcG9zYWJsZSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgcmV0dXJuIGQgJiYgaXNGdW5jdGlvbihkLmRpc3Bvc2UpO1xuICB9O1xuXG4gIHZhciBjaGVja0Rpc3Bvc2VkID0gRGlzcG9zYWJsZS5jaGVja0Rpc3Bvc2VkID0gZnVuY3Rpb24gKGRpc3Bvc2FibGUpIHtcbiAgICBpZiAoZGlzcG9zYWJsZS5pc0Rpc3Bvc2VkKSB7IHRocm93IG5ldyBPYmplY3REaXNwb3NlZEVycm9yKCk7IH1cbiAgfTtcblxuICB2YXIgZGlzcG9zYWJsZUZpeHVwID0gRGlzcG9zYWJsZS5fZml4dXAgPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgcmV0dXJuIGlzRGlzcG9zYWJsZShyZXN1bHQpID8gcmVzdWx0IDogZGlzcG9zYWJsZUVtcHR5O1xuICB9O1xuXG4gIC8vIFNpbmdsZSBhc3NpZ25tZW50XG4gIHZhciBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSA9IFJ4LlNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIH07XG4gIFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlLnByb3RvdHlwZS5nZXREaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnQ7XG4gIH07XG4gIFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlLnByb3RvdHlwZS5zZXREaXNwb3NhYmxlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudCkgeyB0aHJvdyBuZXcgRXJyb3IoJ0Rpc3Bvc2FibGUgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZCcpOyB9XG4gICAgdmFyIHNob3VsZERpc3Bvc2UgPSB0aGlzLmlzRGlzcG9zZWQ7XG4gICAgIXNob3VsZERpc3Bvc2UgJiYgKHRoaXMuY3VycmVudCA9IHZhbHVlKTtcbiAgICBzaG91bGREaXNwb3NlICYmIHZhbHVlICYmIHZhbHVlLmRpc3Bvc2UoKTtcbiAgfTtcbiAgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICB2YXIgb2xkID0gdGhpcy5jdXJyZW50O1xuICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICAgIG9sZCAmJiBvbGQuZGlzcG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBNdWx0aXBsZSBhc3NpZ25tZW50IGRpc3Bvc2FibGVcbiAgdmFyIFNlcmlhbERpc3Bvc2FibGUgPSBSeC5TZXJpYWxEaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIH07XG4gIFNlcmlhbERpc3Bvc2FibGUucHJvdG90eXBlLmdldERpc3Bvc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudDtcbiAgfTtcbiAgU2VyaWFsRGlzcG9zYWJsZS5wcm90b3R5cGUuc2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBzaG91bGREaXNwb3NlID0gdGhpcy5pc0Rpc3Bvc2VkO1xuICAgIGlmICghc2hvdWxkRGlzcG9zZSkge1xuICAgICAgdmFyIG9sZCA9IHRoaXMuY3VycmVudDtcbiAgICAgIHRoaXMuY3VycmVudCA9IHZhbHVlO1xuICAgIH1cbiAgICBvbGQgJiYgb2xkLmRpc3Bvc2UoKTtcbiAgICBzaG91bGREaXNwb3NlICYmIHZhbHVlICYmIHZhbHVlLmRpc3Bvc2UoKTtcbiAgfTtcbiAgU2VyaWFsRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIHZhciBvbGQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgICBvbGQgJiYgb2xkLmRpc3Bvc2UoKTtcbiAgfTtcblxuICB2YXIgQmluYXJ5RGlzcG9zYWJsZSA9IFJ4LkJpbmFyeURpc3Bvc2FibGUgPSBmdW5jdGlvbiAoZmlyc3QsIHNlY29uZCkge1xuICAgIHRoaXMuX2ZpcnN0ID0gZmlyc3Q7XG4gICAgdGhpcy5fc2Vjb25kID0gc2Vjb25kO1xuICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICB9O1xuXG4gIEJpbmFyeURpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICB2YXIgb2xkMSA9IHRoaXMuX2ZpcnN0O1xuICAgICAgdGhpcy5fZmlyc3QgPSBudWxsO1xuICAgICAgb2xkMSAmJiBvbGQxLmRpc3Bvc2UoKTtcbiAgICAgIHZhciBvbGQyID0gdGhpcy5fc2Vjb25kO1xuICAgICAgdGhpcy5fc2Vjb25kID0gbnVsbDtcbiAgICAgIG9sZDIgJiYgb2xkMi5kaXNwb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBOQXJ5RGlzcG9zYWJsZSA9IFJ4Lk5BcnlEaXNwb3NhYmxlID0gZnVuY3Rpb24gKGRpc3Bvc2FibGVzKSB7XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMgPSBkaXNwb3NhYmxlcztcbiAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgfTtcblxuICBOQXJ5RGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0aGlzLl9kaXNwb3NhYmxlc1tpXS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGRpc3Bvc2FibGUgcmVzb3VyY2UgdGhhdCBvbmx5IGRpc3Bvc2VzIGl0cyB1bmRlcmx5aW5nIGRpc3Bvc2FibGUgcmVzb3VyY2Ugd2hlbiBhbGwgZGVwZW5kZW50IGRpc3Bvc2FibGUgb2JqZWN0cyBoYXZlIGJlZW4gZGlzcG9zZWQuXG4gICAqL1xuICB2YXIgUmVmQ291bnREaXNwb3NhYmxlID0gUnguUmVmQ291bnREaXNwb3NhYmxlID0gKGZ1bmN0aW9uICgpIHtcblxuICAgIGZ1bmN0aW9uIElubmVyRGlzcG9zYWJsZShkaXNwb3NhYmxlKSB7XG4gICAgICB0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NhYmxlO1xuICAgICAgdGhpcy5kaXNwb3NhYmxlLmNvdW50Kys7XG4gICAgICB0aGlzLmlzSW5uZXJEaXNwb3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIElubmVyRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5kaXNwb3NhYmxlLmlzRGlzcG9zZWQgJiYgIXRoaXMuaXNJbm5lckRpc3Bvc2VkKSB7XG4gICAgICAgIHRoaXMuaXNJbm5lckRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXNwb3NhYmxlLmNvdW50LS07XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2FibGUuY291bnQgPT09IDAgJiYgdGhpcy5kaXNwb3NhYmxlLmlzUHJpbWFyeURpc3Bvc2VkKSB7XG4gICAgICAgICAgdGhpcy5kaXNwb3NhYmxlLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZGlzcG9zYWJsZS51bmRlcmx5aW5nRGlzcG9zYWJsZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJlZkNvdW50RGlzcG9zYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgZGlzcG9zYWJsZS5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0Rpc3Bvc2FibGV9IGRpc3Bvc2FibGUgVW5kZXJseWluZyBkaXNwb3NhYmxlLlxuICAgICAgKi9cbiAgICBmdW5jdGlvbiBSZWZDb3VudERpc3Bvc2FibGUoZGlzcG9zYWJsZSkge1xuICAgICAgdGhpcy51bmRlcmx5aW5nRGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7XG4gICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNQcmltYXJ5RGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2VzIHRoZSB1bmRlcmx5aW5nIGRpc3Bvc2FibGUgb25seSB3aGVuIGFsbCBkZXBlbmRlbnQgZGlzcG9zYWJsZXMgaGF2ZSBiZWVuIGRpc3Bvc2VkXG4gICAgICovXG4gICAgUmVmQ291bnREaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQgJiYgIXRoaXMuaXNQcmltYXJ5RGlzcG9zZWQpIHtcbiAgICAgICAgdGhpcy5pc1ByaW1hcnlEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnVuZGVybHlpbmdEaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgZGVwZW5kZW50IGRpc3Bvc2FibGUgdGhhdCB3aGVuIGRpc3Bvc2VkIGRlY3JlYXNlcyB0aGUgcmVmY291bnQgb24gdGhlIHVuZGVybHlpbmcgZGlzcG9zYWJsZS5cbiAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gQSBkZXBlbmRlbnQgZGlzcG9zYWJsZSBjb250cmlidXRpbmcgdG8gdGhlIHJlZmVyZW5jZSBjb3VudCB0aGF0IG1hbmFnZXMgdGhlIHVuZGVybHlpbmcgZGlzcG9zYWJsZSdzIGxpZmV0aW1lLlxuICAgICAqL1xuICAgIFJlZkNvdW50RGlzcG9zYWJsZS5wcm90b3R5cGUuZ2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGlzcG9zZWQgPyBkaXNwb3NhYmxlRW1wdHkgOiBuZXcgSW5uZXJEaXNwb3NhYmxlKHRoaXMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gUmVmQ291bnREaXNwb3NhYmxlO1xuICB9KSgpO1xuXG4gIHZhciBTY2hlZHVsZWRJdGVtID0gUnguaW50ZXJuYWxzLlNjaGVkdWxlZEl0ZW0gPSBmdW5jdGlvbiAoc2NoZWR1bGVyLCBzdGF0ZSwgYWN0aW9uLCBkdWVUaW1lLCBjb21wYXJlcikge1xuICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICB0aGlzLmR1ZVRpbWUgPSBkdWVUaW1lO1xuICAgIHRoaXMuY29tcGFyZXIgPSBjb21wYXJlciB8fCBkZWZhdWx0U3ViQ29tcGFyZXI7XG4gICAgdGhpcy5kaXNwb3NhYmxlID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gIH1cblxuICBTY2hlZHVsZWRJdGVtLnByb3RvdHlwZS5pbnZva2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kaXNwb3NhYmxlLnNldERpc3Bvc2FibGUodGhpcy5pbnZva2VDb3JlKCkpO1xuICB9O1xuXG4gIFNjaGVkdWxlZEl0ZW0ucHJvdG90eXBlLmNvbXBhcmVUbyA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmNvbXBhcmVyKHRoaXMuZHVlVGltZSwgb3RoZXIuZHVlVGltZSk7XG4gIH07XG5cbiAgU2NoZWR1bGVkSXRlbS5wcm90b3R5cGUuaXNDYW5jZWxsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcG9zYWJsZS5pc0Rpc3Bvc2VkO1xuICB9O1xuXG4gIFNjaGVkdWxlZEl0ZW0ucHJvdG90eXBlLmludm9rZUNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3Bvc2FibGVGaXh1cCh0aGlzLmFjdGlvbih0aGlzLnNjaGVkdWxlciwgdGhpcy5zdGF0ZSkpO1xuICB9O1xuXG4gIC8qKiBQcm92aWRlcyBhIHNldCBvZiBzdGF0aWMgcHJvcGVydGllcyB0byBhY2Nlc3MgY29tbW9ubHkgdXNlZCBzY2hlZHVsZXJzLiAqL1xuICB2YXIgU2NoZWR1bGVyID0gUnguU2NoZWR1bGVyID0gKGZ1bmN0aW9uICgpIHtcblxuICAgIGZ1bmN0aW9uIFNjaGVkdWxlcigpIHsgfVxuXG4gICAgLyoqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgc2NoZWR1bGVyICovXG4gICAgU2NoZWR1bGVyLmlzU2NoZWR1bGVyID0gZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBzIGluc3RhbmNlb2YgU2NoZWR1bGVyO1xuICAgIH07XG5cbiAgICB2YXIgc2NoZWR1bGVyUHJvdG8gPSBTY2hlZHVsZXIucHJvdG90eXBlO1xuXG4gICAgLyoqXG4gICAqIFNjaGVkdWxlcyBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG4gICAqIEBwYXJhbSBzdGF0ZSBTdGF0ZSBwYXNzZWQgdG8gdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWN0aW9uIEFjdGlvbiB0byBiZSBleGVjdXRlZC5cbiAgICogQHJldHVybnMge0Rpc3Bvc2FibGV9IFRoZSBkaXNwb3NhYmxlIG9iamVjdCB1c2VkIHRvIGNhbmNlbCB0aGUgc2NoZWR1bGVkIGFjdGlvbiAoYmVzdCBlZmZvcnQpLlxuICAgKi9cbiAgICBzY2hlZHVsZXJQcm90by5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZHVlVGltZS5cbiAgICogQHBhcmFtIHN0YXRlIFN0YXRlIHBhc3NlZCB0byB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhY3Rpb24gQWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gZHVlVGltZSBSZWxhdGl2ZSB0aW1lIGFmdGVyIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIGFjdGlvbi5cbiAgICogQHJldHVybnMge0Rpc3Bvc2FibGV9IFRoZSBkaXNwb3NhYmxlIG9iamVjdCB1c2VkIHRvIGNhbmNlbCB0aGUgc2NoZWR1bGVkIGFjdGlvbiAoYmVzdCBlZmZvcnQpLlxuICAgKi9cbiAgICBzY2hlZHVsZXJQcm90by5zY2hlZHVsZUZ1dHVyZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZHVlVGltZSwgYWN0aW9uKSB7XG4gICAgICB2YXIgZHQgPSBkdWVUaW1lO1xuICAgICAgZHQgaW5zdGFuY2VvZiBEYXRlICYmIChkdCA9IGR0IC0gdGhpcy5ub3coKSk7XG4gICAgICBkdCA9IFNjaGVkdWxlci5ub3JtYWxpemUoZHQpO1xuXG4gICAgICBpZiAoZHQgPT09IDApIHsgcmV0dXJuIHRoaXMuc2NoZWR1bGUoc3RhdGUsIGFjdGlvbik7IH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3NjaGVkdWxlRnV0dXJlKHN0YXRlLCBkdCwgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgc2NoZWR1bGVyUHJvdG8uX3NjaGVkdWxlRnV0dXJlID0gZnVuY3Rpb24gKHN0YXRlLCBkdWVUaW1lLCBhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgfTtcblxuICAgIC8qKiBHZXRzIHRoZSBjdXJyZW50IHRpbWUgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbCBtYWNoaW5lJ3Mgc3lzdGVtIGNsb2NrLiAqL1xuICAgIFNjaGVkdWxlci5ub3cgPSBkZWZhdWx0Tm93O1xuXG4gICAgLyoqIEdldHMgdGhlIGN1cnJlbnQgdGltZSBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsIG1hY2hpbmUncyBzeXN0ZW0gY2xvY2suICovXG4gICAgU2NoZWR1bGVyLnByb3RvdHlwZS5ub3cgPSBkZWZhdWx0Tm93O1xuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyB0aGUgc3BlY2lmaWVkIFRpbWVTcGFuIHZhbHVlIHRvIGEgcG9zaXRpdmUgdmFsdWUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVTcGFuIFRoZSB0aW1lIHNwYW4gdmFsdWUgdG8gbm9ybWFsaXplLlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBzcGVjaWZpZWQgVGltZVNwYW4gdmFsdWUgaWYgaXQgaXMgemVybyBvciBwb3NpdGl2ZTsgb3RoZXJ3aXNlLCAwXG4gICAgICovXG4gICAgU2NoZWR1bGVyLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh0aW1lU3Bhbikge1xuICAgICAgdGltZVNwYW4gPCAwICYmICh0aW1lU3BhbiA9IDApO1xuICAgICAgcmV0dXJuIHRpbWVTcGFuO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2NoZWR1bGVyO1xuICB9KCkpO1xuXG4gIHZhciBub3JtYWxpemVUaW1lID0gU2NoZWR1bGVyLm5vcm1hbGl6ZSwgaXNTY2hlZHVsZXIgPSBTY2hlZHVsZXIuaXNTY2hlZHVsZXI7XG5cbiAgKGZ1bmN0aW9uIChzY2hlZHVsZXJQcm90bykge1xuXG4gICAgZnVuY3Rpb24gaW52b2tlUmVjSW1tZWRpYXRlKHNjaGVkdWxlciwgcGFpcikge1xuICAgICAgdmFyIHN0YXRlID0gcGFpclswXSwgYWN0aW9uID0gcGFpclsxXSwgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlRGlzcG9zYWJsZSgpO1xuICAgICAgYWN0aW9uKHN0YXRlLCBpbm5lckFjdGlvbik7XG4gICAgICByZXR1cm4gZ3JvdXA7XG5cbiAgICAgIGZ1bmN0aW9uIGlubmVyQWN0aW9uKHN0YXRlMikge1xuICAgICAgICB2YXIgaXNBZGRlZCA9IGZhbHNlLCBpc0RvbmUgPSBmYWxzZTtcblxuICAgICAgICB2YXIgZCA9IHNjaGVkdWxlci5zY2hlZHVsZShzdGF0ZTIsIHNjaGVkdWxlV29yayk7XG4gICAgICAgIGlmICghaXNEb25lKSB7XG4gICAgICAgICAgZ3JvdXAuYWRkKGQpO1xuICAgICAgICAgIGlzQWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVXb3JrKF8sIHN0YXRlMykge1xuICAgICAgICAgIGlmIChpc0FkZGVkKSB7XG4gICAgICAgICAgICBncm91cC5yZW1vdmUoZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlzRG9uZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGlvbihzdGF0ZTMsIGlubmVyQWN0aW9uKTtcbiAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52b2tlUmVjRGF0ZShzY2hlZHVsZXIsIHBhaXIpIHtcbiAgICAgIHZhciBzdGF0ZSA9IHBhaXJbMF0sIGFjdGlvbiA9IHBhaXJbMV0sIGdyb3VwID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKTtcbiAgICAgIGFjdGlvbihzdGF0ZSwgaW5uZXJBY3Rpb24pO1xuICAgICAgcmV0dXJuIGdyb3VwO1xuXG4gICAgICBmdW5jdGlvbiBpbm5lckFjdGlvbihzdGF0ZTIsIGR1ZVRpbWUxKSB7XG4gICAgICAgIHZhciBpc0FkZGVkID0gZmFsc2UsIGlzRG9uZSA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBkID0gc2NoZWR1bGVyLnNjaGVkdWxlRnV0dXJlKHN0YXRlMiwgZHVlVGltZTEsIHNjaGVkdWxlV29yayk7XG4gICAgICAgIGlmICghaXNEb25lKSB7XG4gICAgICAgICAgZ3JvdXAuYWRkKGQpO1xuICAgICAgICAgIGlzQWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVXb3JrKF8sIHN0YXRlMykge1xuICAgICAgICAgIGlmIChpc0FkZGVkKSB7XG4gICAgICAgICAgICBncm91cC5yZW1vdmUoZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlzRG9uZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGlvbihzdGF0ZTMsIGlubmVyQWN0aW9uKTtcbiAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2NoZWR1bGVzIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZCByZWN1cnNpdmVseS5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBzdGF0ZSBTdGF0ZSBwYXNzZWQgdG8gdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhY3Rpb24gQWN0aW9uIHRvIGV4ZWN1dGUgcmVjdXJzaXZlbHkuIFRoZSBsYXN0IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGFjdGlvbiBpcyB1c2VkIHRvIHRyaWdnZXIgcmVjdXJzaXZlIHNjaGVkdWxpbmcgb2YgdGhlIGFjdGlvbiwgcGFzc2luZyBpbiByZWN1cnNpdmUgaW52b2NhdGlvbiBzdGF0ZS5cbiAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHVzZWQgdG8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgYWN0aW9uIChiZXN0IGVmZm9ydCkuXG4gICAgICovXG4gICAgc2NoZWR1bGVyUHJvdG8uc2NoZWR1bGVSZWN1cnNpdmUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGUoW3N0YXRlLCBhY3Rpb25dLCBpbnZva2VSZWNJbW1lZGlhdGUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTY2hlZHVsZXMgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkIHJlY3Vyc2l2ZWx5IGFmdGVyIGEgc3BlY2lmaWVkIHJlbGF0aXZlIG9yIGFic29sdXRlIGR1ZSB0aW1lLlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHN0YXRlIFN0YXRlIHBhc3NlZCB0byB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFjdGlvbiBBY3Rpb24gdG8gZXhlY3V0ZSByZWN1cnNpdmVseS4gVGhlIGxhc3QgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgYWN0aW9uIGlzIHVzZWQgdG8gdHJpZ2dlciByZWN1cnNpdmUgc2NoZWR1bGluZyBvZiB0aGUgYWN0aW9uLCBwYXNzaW5nIGluIHRoZSByZWN1cnNpdmUgZHVlIHRpbWUgYW5kIGludm9jYXRpb24gc3RhdGUuXG4gICAgICogQHBhcmFtIHtOdW1iZXIgfCBEYXRlfSBkdWVUaW1lIFJlbGF0aXZlIG9yIGFic29sdXRlIHRpbWUgYWZ0ZXIgd2hpY2ggdG8gZXhlY3V0ZSB0aGUgYWN0aW9uIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHVzZWQgdG8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgYWN0aW9uIChiZXN0IGVmZm9ydCkuXG4gICAgICovXG4gICAgc2NoZWR1bGVyUHJvdG8uc2NoZWR1bGVSZWN1cnNpdmVGdXR1cmUgPSBmdW5jdGlvbiAoc3RhdGUsIGR1ZVRpbWUsIGFjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVGdXR1cmUoW3N0YXRlLCBhY3Rpb25dLCBkdWVUaW1lLCBpbnZva2VSZWNEYXRlKTtcbiAgICB9O1xuXG4gIH0oU2NoZWR1bGVyLnByb3RvdHlwZSkpO1xuXG4gIChmdW5jdGlvbiAoc2NoZWR1bGVyUHJvdG8pIHtcblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlcyBhIHBlcmlvZGljIHBpZWNlIG9mIHdvcmsgYnkgZHluYW1pY2FsbHkgZGlzY292ZXJpbmcgdGhlIHNjaGVkdWxlcidzIGNhcGFiaWxpdGllcy4gVGhlIHBlcmlvZGljIHRhc2sgd2lsbCBiZSBzY2hlZHVsZWQgdXNpbmcgd2luZG93LnNldEludGVydmFsIGZvciB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBzdGF0ZSBJbml0aWFsIHN0YXRlIHBhc3NlZCB0byB0aGUgYWN0aW9uIHVwb24gdGhlIGZpcnN0IGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcGVyaW9kIFBlcmlvZCBmb3IgcnVubmluZyB0aGUgd29yayBwZXJpb2RpY2FsbHkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWN0aW9uIEFjdGlvbiB0byBiZSBleGVjdXRlZCwgcG90ZW50aWFsbHkgdXBkYXRpbmcgdGhlIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIHtEaXNwb3NhYmxlfSBUaGUgZGlzcG9zYWJsZSBvYmplY3QgdXNlZCB0byBjYW5jZWwgdGhlIHNjaGVkdWxlZCByZWN1cnJpbmcgYWN0aW9uIChiZXN0IGVmZm9ydCkuXG4gICAgICovXG4gICAgU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZVBlcmlvZGljID0gZnVuY3Rpb24oc3RhdGUsIHBlcmlvZCwgYWN0aW9uKSB7XG4gICAgICBpZiAodHlwZW9mIHJvb3Quc2V0SW50ZXJ2YWwgPT09ICd1bmRlZmluZWQnKSB7IHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcigpOyB9XG4gICAgICBwZXJpb2QgPSBub3JtYWxpemVUaW1lKHBlcmlvZCk7XG4gICAgICB2YXIgcyA9IHN0YXRlLCBpZCA9IHJvb3Quc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgeyBzID0gYWN0aW9uKHMpOyB9LCBwZXJpb2QpO1xuICAgICAgcmV0dXJuIGRpc3Bvc2FibGVDcmVhdGUoZnVuY3Rpb24gKCkgeyByb290LmNsZWFySW50ZXJ2YWwoaWQpOyB9KTtcbiAgICB9O1xuXG4gIH0oU2NoZWR1bGVyLnByb3RvdHlwZSkpO1xuXG4gIC8qKiBHZXRzIGEgc2NoZWR1bGVyIHRoYXQgc2NoZWR1bGVzIHdvcmsgaW1tZWRpYXRlbHkgb24gdGhlIGN1cnJlbnQgdGhyZWFkLiAqL1xuICAgdmFyIEltbWVkaWF0ZVNjaGVkdWxlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoSW1tZWRpYXRlU2NoZWR1bGVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEltbWVkaWF0ZVNjaGVkdWxlcigpIHtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEltbWVkaWF0ZVNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgcmV0dXJuIGRpc3Bvc2FibGVGaXh1cChhY3Rpb24odGhpcywgc3RhdGUpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEltbWVkaWF0ZVNjaGVkdWxlcjtcbiAgfShTY2hlZHVsZXIpKTtcblxuICB2YXIgaW1tZWRpYXRlU2NoZWR1bGVyID0gU2NoZWR1bGVyLmltbWVkaWF0ZSA9IG5ldyBJbW1lZGlhdGVTY2hlZHVsZXIoKTtcblxuICAvKipcbiAgICogR2V0cyBhIHNjaGVkdWxlciB0aGF0IHNjaGVkdWxlcyB3b3JrIGFzIHNvb24gYXMgcG9zc2libGUgb24gdGhlIGN1cnJlbnQgdGhyZWFkLlxuICAgKi9cbiAgdmFyIEN1cnJlbnRUaHJlYWRTY2hlZHVsZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIHZhciBxdWV1ZTtcblxuICAgIGZ1bmN0aW9uIHJ1blRyYW1wb2xpbmUgKCkge1xuICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5kZXF1ZXVlKCk7XG4gICAgICAgICFpdGVtLmlzQ2FuY2VsbGVkKCkgJiYgaXRlbS5pbnZva2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbmhlcml0cyhDdXJyZW50VGhyZWFkU2NoZWR1bGVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEN1cnJlbnRUaHJlYWRTY2hlZHVsZXIoKSB7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBDdXJyZW50VGhyZWFkU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICB2YXIgc2kgPSBuZXcgU2NoZWR1bGVkSXRlbSh0aGlzLCBzdGF0ZSwgYWN0aW9uLCB0aGlzLm5vdygpKTtcblxuICAgICAgaWYgKCFxdWV1ZSkge1xuICAgICAgICBxdWV1ZSA9IG5ldyBQcmlvcml0eVF1ZXVlKDQpO1xuICAgICAgICBxdWV1ZS5lbnF1ZXVlKHNpKTtcblxuICAgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2gocnVuVHJhbXBvbGluZSkoKTtcbiAgICAgICAgcXVldWUgPSBudWxsO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyB0aHJvd2VyKHJlc3VsdC5lKTsgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWUuZW5xdWV1ZShzaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2kuZGlzcG9zYWJsZTtcbiAgICB9O1xuXG4gICAgQ3VycmVudFRocmVhZFNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGVSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICFxdWV1ZTsgfTtcblxuICAgIHJldHVybiBDdXJyZW50VGhyZWFkU2NoZWR1bGVyO1xuICB9KFNjaGVkdWxlcikpO1xuXG4gIHZhciBjdXJyZW50VGhyZWFkU2NoZWR1bGVyID0gU2NoZWR1bGVyLmN1cnJlbnRUaHJlYWQgPSBuZXcgQ3VycmVudFRocmVhZFNjaGVkdWxlcigpO1xuXG4gIHZhciBTY2hlZHVsZVBlcmlvZGljUmVjdXJzaXZlID0gUnguaW50ZXJuYWxzLlNjaGVkdWxlUGVyaW9kaWNSZWN1cnNpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVRpY2soc2VsZikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRpY2soY29tbWFuZCwgcmVjdXJzZSkge1xuICAgICAgICByZWN1cnNlKDAsIHNlbGYuX3BlcmlvZCk7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRyeUNhdGNoKHNlbGYuX2FjdGlvbikoc2VsZi5fc3RhdGUpO1xuICAgICAgICBpZiAoc3RhdGUgPT09IGVycm9yT2JqKSB7XG4gICAgICAgICAgc2VsZi5fY2FuY2VsLmRpc3Bvc2UoKTtcbiAgICAgICAgICB0aHJvd2VyKHN0YXRlLmUpO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuX3N0YXRlID0gc3RhdGU7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFNjaGVkdWxlUGVyaW9kaWNSZWN1cnNpdmUoc2NoZWR1bGVyLCBzdGF0ZSwgcGVyaW9kLCBhY3Rpb24pIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl9wZXJpb2QgPSBwZXJpb2Q7XG4gICAgICB0aGlzLl9hY3Rpb24gPSBhY3Rpb247XG4gICAgfVxuXG4gICAgU2NoZWR1bGVQZXJpb2RpY1JlY3Vyc2l2ZS5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuICAgICAgdGhpcy5fY2FuY2VsID0gZDtcbiAgICAgIGQuc2V0RGlzcG9zYWJsZSh0aGlzLl9zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmVGdXR1cmUoMCwgdGhpcy5fcGVyaW9kLCBjcmVhdGVUaWNrKHRoaXMpKSk7XG5cbiAgICAgIHJldHVybiBkO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2NoZWR1bGVQZXJpb2RpY1JlY3Vyc2l2ZTtcbiAgfSgpKTtcblxuICB2YXIgc2NoZWR1bGVNZXRob2QsIGNsZWFyTWV0aG9kO1xuXG4gIHZhciBsb2NhbFRpbWVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbG9jYWxTZXRUaW1lb3V0LCBsb2NhbENsZWFyVGltZW91dCA9IG5vb3A7XG4gICAgaWYgKCEhcm9vdC5zZXRUaW1lb3V0KSB7XG4gICAgICBsb2NhbFNldFRpbWVvdXQgPSByb290LnNldFRpbWVvdXQ7XG4gICAgICBsb2NhbENsZWFyVGltZW91dCA9IHJvb3QuY2xlYXJUaW1lb3V0O1xuICAgIH0gZWxzZSBpZiAoISFyb290LldTY3JpcHQpIHtcbiAgICAgIGxvY2FsU2V0VGltZW91dCA9IGZ1bmN0aW9uIChmbiwgdGltZSkge1xuICAgICAgICByb290LldTY3JpcHQuU2xlZXAodGltZSk7XG4gICAgICAgIGZuKCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2V0VGltZW91dDogbG9jYWxTZXRUaW1lb3V0LFxuICAgICAgY2xlYXJUaW1lb3V0OiBsb2NhbENsZWFyVGltZW91dFxuICAgIH07XG4gIH0oKSk7XG4gIHZhciBsb2NhbFNldFRpbWVvdXQgPSBsb2NhbFRpbWVyLnNldFRpbWVvdXQsXG4gICAgbG9jYWxDbGVhclRpbWVvdXQgPSBsb2NhbFRpbWVyLmNsZWFyVGltZW91dDtcblxuICAoZnVuY3Rpb24gKCkge1xuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxLCB0YXNrc0J5SGFuZGxlID0ge30sIGN1cnJlbnRseVJ1bm5pbmcgPSBmYWxzZTtcblxuICAgIGNsZWFyTWV0aG9kID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcnVuVGFzayhoYW5kbGUpIHtcbiAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nKSB7XG4gICAgICAgIGxvY2FsU2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJ1blRhc2soaGFuZGxlKTsgfSwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godGFzaykoKTtcbiAgICAgICAgICBjbGVhck1ldGhvZChoYW5kbGUpO1xuICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyB0aHJvd2VyKHJlc3VsdC5lKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlTmF0aXZlID0gbmV3IFJlZ0V4cCgnXicgK1xuICAgICAgU3RyaW5nKHRvU3RyaW5nKVxuICAgICAgICAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKVxuICAgICAgICAucmVwbGFjZSgvdG9TdHJpbmd8IGZvciBbXlxcXV0rL2csICcuKj8nKSArICckJ1xuICAgICk7XG5cbiAgICB2YXIgc2V0SW1tZWRpYXRlID0gdHlwZW9mIChzZXRJbW1lZGlhdGUgPSBmcmVlR2xvYmFsICYmIG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5zZXRJbW1lZGlhdGUpID09ICdmdW5jdGlvbicgJiZcbiAgICAgICFyZU5hdGl2ZS50ZXN0KHNldEltbWVkaWF0ZSkgJiYgc2V0SW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gcG9zdE1lc3NhZ2VTdXBwb3J0ZWQgKCkge1xuICAgICAgLy8gRW5zdXJlIG5vdCBpbiBhIHdvcmtlclxuICAgICAgaWYgKCFyb290LnBvc3RNZXNzYWdlIHx8IHJvb3QuaW1wb3J0U2NyaXB0cykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIHZhciBpc0FzeW5jID0gZmFsc2UsIG9sZEhhbmRsZXIgPSByb290Lm9ubWVzc2FnZTtcbiAgICAgIC8vIFRlc3QgZm9yIGFzeW5jXG4gICAgICByb290Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgaXNBc3luYyA9IHRydWU7IH07XG4gICAgICByb290LnBvc3RNZXNzYWdlKCcnLCAnKicpO1xuICAgICAgcm9vdC5vbm1lc3NhZ2UgPSBvbGRIYW5kbGVyO1xuXG4gICAgICByZXR1cm4gaXNBc3luYztcbiAgICB9XG5cbiAgICAvLyBVc2UgaW4gb3JkZXIsIHNldEltbWVkaWF0ZSwgbmV4dFRpY2ssIHBvc3RNZXNzYWdlLCBNZXNzYWdlQ2hhbm5lbCwgc2NyaXB0IHJlYWR5c3RhdGVjaGFuZ2VkLCBzZXRUaW1lb3V0XG4gICAgaWYgKGlzRnVuY3Rpb24oc2V0SW1tZWRpYXRlKSkge1xuICAgICAgc2NoZWR1bGVNZXRob2QgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHZhciBpZCA9IG5leHRIYW5kbGUrKztcbiAgICAgICAgdGFza3NCeUhhbmRsZVtpZF0gPSBhY3Rpb247XG4gICAgICAgIHNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7IHJ1blRhc2soaWQpOyB9KTtcblxuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJykge1xuICAgICAgc2NoZWR1bGVNZXRob2QgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHZhciBpZCA9IG5leHRIYW5kbGUrKztcbiAgICAgICAgdGFza3NCeUhhbmRsZVtpZF0gPSBhY3Rpb247XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5UYXNrKGlkKTsgfSk7XG5cbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBvc3RNZXNzYWdlU3VwcG9ydGVkKCkpIHtcbiAgICAgIHZhciBNU0dfUFJFRklYID0gJ21zLnJ4LnNjaGVkdWxlJyArIE1hdGgucmFuZG9tKCk7XG5cbiAgICAgIHZhciBvbkdsb2JhbFBvc3RNZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIE9ubHkgaWYgd2UncmUgYSBtYXRjaCB0byBhdm9pZCBhbnkgb3RoZXIgZ2xvYmFsIGV2ZW50c1xuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgPT09ICdzdHJpbmcnICYmIGV2ZW50LmRhdGEuc3Vic3RyaW5nKDAsIE1TR19QUkVGSVgubGVuZ3RoKSA9PT0gTVNHX1BSRUZJWCkge1xuICAgICAgICAgIHJ1blRhc2soZXZlbnQuZGF0YS5zdWJzdHJpbmcoTVNHX1BSRUZJWC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgb25HbG9iYWxQb3N0TWVzc2FnZSwgZmFsc2UpO1xuXG4gICAgICBzY2hlZHVsZU1ldGhvZCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgdmFyIGlkID0gbmV4dEhhbmRsZSsrO1xuICAgICAgICB0YXNrc0J5SGFuZGxlW2lkXSA9IGFjdGlvbjtcbiAgICAgICAgcm9vdC5wb3N0TWVzc2FnZShNU0dfUFJFRklYICsgY3VycmVudElkLCAnKicpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoISFyb290Lk1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICB2YXIgY2hhbm5lbCA9IG5ldyByb290Lk1lc3NhZ2VDaGFubmVsKCk7XG5cbiAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsgcnVuVGFzayhlLmRhdGEpOyB9O1xuXG4gICAgICBzY2hlZHVsZU1ldGhvZCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgdmFyIGlkID0gbmV4dEhhbmRsZSsrO1xuICAgICAgICB0YXNrc0J5SGFuZGxlW2lkXSA9IGFjdGlvbjtcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShpZCk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICgnZG9jdW1lbnQnIGluIHJvb3QgJiYgJ29ucmVhZHlzdGF0ZWNoYW5nZScgaW4gcm9vdC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuXG4gICAgICBzY2hlZHVsZU1ldGhvZCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgdmFyIHNjcmlwdEVsZW1lbnQgPSByb290LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICB2YXIgaWQgPSBuZXh0SGFuZGxlKys7XG4gICAgICAgIHRhc2tzQnlIYW5kbGVbaWRdID0gYWN0aW9uO1xuXG4gICAgICAgIHNjcmlwdEVsZW1lbnQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJ1blRhc2soaWQpO1xuICAgICAgICAgIHNjcmlwdEVsZW1lbnQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICBzY3JpcHRFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0RWxlbWVudCk7XG4gICAgICAgICAgc2NyaXB0RWxlbWVudCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHJvb3QuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVkdWxlTWV0aG9kID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICB2YXIgaWQgPSBuZXh0SGFuZGxlKys7XG4gICAgICAgIHRhc2tzQnlIYW5kbGVbaWRdID0gYWN0aW9uO1xuICAgICAgICBsb2NhbFNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJ1blRhc2soaWQpO1xuICAgICAgICB9LCAwKTtcblxuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9O1xuICAgIH1cbiAgfSgpKTtcblxuICAvKipcbiAgICogR2V0cyBhIHNjaGVkdWxlciB0aGF0IHNjaGVkdWxlcyB3b3JrIHZpYSBhIHRpbWVkIGNhbGxiYWNrIGJhc2VkIHVwb24gcGxhdGZvcm0uXG4gICAqL1xuICAgdmFyIERlZmF1bHRTY2hlZHVsZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgICBpbmhlcml0cyhEZWZhdWx0U2NoZWR1bGVyLCBfX3N1cGVyX18pO1xuICAgICBmdW5jdGlvbiBEZWZhdWx0U2NoZWR1bGVyKCkge1xuICAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgICB9XG5cbiAgICAgZnVuY3Rpb24gc2NoZWR1bGVBY3Rpb24oZGlzcG9zYWJsZSwgYWN0aW9uLCBzY2hlZHVsZXIsIHN0YXRlKSB7XG4gICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNjaGVkdWxlKCkge1xuICAgICAgICAgIWRpc3Bvc2FibGUuaXNEaXNwb3NlZCAmJiBkaXNwb3NhYmxlLnNldERpc3Bvc2FibGUoRGlzcG9zYWJsZS5fZml4dXAoYWN0aW9uKHNjaGVkdWxlciwgc3RhdGUpKSk7XG4gICAgICAgfTtcbiAgICAgfVxuXG4gICAgIGZ1bmN0aW9uIENsZWFyRGlzcG9zYWJsZShtZXRob2QsIGlkKSB7XG4gICAgICAgdGhpcy5faWQgPSBpZDtcbiAgICAgICB0aGlzLl9tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgIH1cblxuICAgICBDbGVhckRpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgICB0aGlzLl9tZXRob2QuY2FsbChudWxsLCB0aGlzLl9pZCk7XG4gICAgICAgfVxuICAgICB9O1xuXG4gICAgRGVmYXVsdFNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgdmFyIGRpc3Bvc2FibGUgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKSxcbiAgICAgICAgICBpZCA9IHNjaGVkdWxlTWV0aG9kKHNjaGVkdWxlQWN0aW9uKGRpc3Bvc2FibGUsIGFjdGlvbiwgdGhpcywgc3RhdGUpKTtcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShkaXNwb3NhYmxlLCBuZXcgQ2xlYXJEaXNwb3NhYmxlKGNsZWFyTWV0aG9kLCBpZCkpO1xuICAgIH07XG5cbiAgICBEZWZhdWx0U2NoZWR1bGVyLnByb3RvdHlwZS5fc2NoZWR1bGVGdXR1cmUgPSBmdW5jdGlvbiAoc3RhdGUsIGR1ZVRpbWUsIGFjdGlvbikge1xuICAgICAgaWYgKGR1ZVRpbWUgPT09IDApIHsgcmV0dXJuIHRoaXMuc2NoZWR1bGUoc3RhdGUsIGFjdGlvbik7IH1cbiAgICAgIHZhciBkaXNwb3NhYmxlID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksXG4gICAgICAgICAgaWQgPSBsb2NhbFNldFRpbWVvdXQoc2NoZWR1bGVBY3Rpb24oZGlzcG9zYWJsZSwgYWN0aW9uLCB0aGlzLCBzdGF0ZSksIGR1ZVRpbWUpO1xuICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKGRpc3Bvc2FibGUsIG5ldyBDbGVhckRpc3Bvc2FibGUobG9jYWxDbGVhclRpbWVvdXQsIGlkKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBEZWZhdWx0U2NoZWR1bGVyO1xuICB9KFNjaGVkdWxlcikpO1xuXG4gIHZhciBkZWZhdWx0U2NoZWR1bGVyID0gU2NoZWR1bGVyWydkZWZhdWx0J10gPSBTY2hlZHVsZXIuYXN5bmMgPSBuZXcgRGVmYXVsdFNjaGVkdWxlcigpO1xuXG4gIGZ1bmN0aW9uIEluZGV4ZWRJdGVtKGlkLCB2YWx1ZSkge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBJbmRleGVkSXRlbS5wcm90b3R5cGUuY29tcGFyZVRvID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgdmFyIGMgPSB0aGlzLnZhbHVlLmNvbXBhcmVUbyhvdGhlci52YWx1ZSk7XG4gICAgYyA9PT0gMCAmJiAoYyA9IHRoaXMuaWQgLSBvdGhlci5pZCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG5cbiAgdmFyIFByaW9yaXR5UXVldWUgPSBSeC5pbnRlcm5hbHMuUHJpb3JpdHlRdWV1ZSA9IGZ1bmN0aW9uIChjYXBhY2l0eSkge1xuICAgIHRoaXMuaXRlbXMgPSBuZXcgQXJyYXkoY2FwYWNpdHkpO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICB2YXIgcHJpb3JpdHlQcm90byA9IFByaW9yaXR5UXVldWUucHJvdG90eXBlO1xuICBwcmlvcml0eVByb3RvLmlzSGlnaGVyUHJpb3JpdHkgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1tsZWZ0XS5jb21wYXJlVG8odGhpcy5pdGVtc1tyaWdodF0pIDwgMDtcbiAgfTtcblxuICBwcmlvcml0eVByb3RvLnBlcmNvbGF0ZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgIGlmIChpbmRleCA+PSB0aGlzLmxlbmd0aCB8fCBpbmRleCA8IDApIHsgcmV0dXJuOyB9XG4gICAgdmFyIHBhcmVudCA9IGluZGV4IC0gMSA+PiAxO1xuICAgIGlmIChwYXJlbnQgPCAwIHx8IHBhcmVudCA9PT0gaW5kZXgpIHsgcmV0dXJuOyB9XG4gICAgaWYgKHRoaXMuaXNIaWdoZXJQcmlvcml0eShpbmRleCwgcGFyZW50KSkge1xuICAgICAgdmFyIHRlbXAgPSB0aGlzLml0ZW1zW2luZGV4XTtcbiAgICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gdGhpcy5pdGVtc1twYXJlbnRdO1xuICAgICAgdGhpcy5pdGVtc1twYXJlbnRdID0gdGVtcDtcbiAgICAgIHRoaXMucGVyY29sYXRlKHBhcmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHByaW9yaXR5UHJvdG8uaGVhcGlmeSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICtpbmRleCB8fCAoaW5kZXggPSAwKTtcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGggfHwgaW5kZXggPCAwKSB7IHJldHVybjsgfVxuICAgIHZhciBsZWZ0ID0gMiAqIGluZGV4ICsgMSxcbiAgICAgICAgcmlnaHQgPSAyICogaW5kZXggKyAyLFxuICAgICAgICBmaXJzdCA9IGluZGV4O1xuICAgIGlmIChsZWZ0IDwgdGhpcy5sZW5ndGggJiYgdGhpcy5pc0hpZ2hlclByaW9yaXR5KGxlZnQsIGZpcnN0KSkge1xuICAgICAgZmlyc3QgPSBsZWZ0O1xuICAgIH1cbiAgICBpZiAocmlnaHQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmlzSGlnaGVyUHJpb3JpdHkocmlnaHQsIGZpcnN0KSkge1xuICAgICAgZmlyc3QgPSByaWdodDtcbiAgICB9XG4gICAgaWYgKGZpcnN0ICE9PSBpbmRleCkge1xuICAgICAgdmFyIHRlbXAgPSB0aGlzLml0ZW1zW2luZGV4XTtcbiAgICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gdGhpcy5pdGVtc1tmaXJzdF07XG4gICAgICB0aGlzLml0ZW1zW2ZpcnN0XSA9IHRlbXA7XG4gICAgICB0aGlzLmhlYXBpZnkoZmlyc3QpO1xuICAgIH1cbiAgfTtcblxuICBwcmlvcml0eVByb3RvLnBlZWsgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLml0ZW1zWzBdLnZhbHVlOyB9O1xuXG4gIHByaW9yaXR5UHJvdG8ucmVtb3ZlQXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICB0aGlzLml0ZW1zW2luZGV4XSA9IHRoaXMuaXRlbXNbLS10aGlzLmxlbmd0aF07XG4gICAgdGhpcy5pdGVtc1t0aGlzLmxlbmd0aF0gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5oZWFwaWZ5KCk7XG4gIH07XG5cbiAgcHJpb3JpdHlQcm90by5kZXF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBlZWsoKTtcbiAgICB0aGlzLnJlbW92ZUF0KDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcHJpb3JpdHlQcm90by5lbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmxlbmd0aCsrO1xuICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gbmV3IEluZGV4ZWRJdGVtKFByaW9yaXR5UXVldWUuY291bnQrKywgaXRlbSk7XG4gICAgdGhpcy5wZXJjb2xhdGUoaW5kZXgpO1xuICB9O1xuXG4gIHByaW9yaXR5UHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zW2ldLnZhbHVlID09PSBpdGVtKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXQoaSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIFByaW9yaXR5UXVldWUuY291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiAgUmVwcmVzZW50cyBhIG5vdGlmaWNhdGlvbiB0byBhbiBvYnNlcnZlci5cbiAgICovXG4gIHZhciBOb3RpZmljYXRpb24gPSBSeC5Ob3RpZmljYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vdGlmaWNhdGlvbigpIHtcblxuICAgIH1cblxuICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdCA9IGZ1bmN0aW9uIChvbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgIH07XG5cbiAgICBOb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHRPYnNlcnZhYmxlID0gZnVuY3Rpb24gKG9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIGRlbGVnYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vdGlmaWNhdGlvbiBvciB0aGUgb2JzZXJ2ZXIncyBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGUgbm90aWZpY2F0aW9uIGFuZCByZXR1cm5zIHRoZSBwcm9kdWNlZCByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgTm90aWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtBbnl9IG9ic2VydmVyT3JPbk5leHQgRGVsZWdhdGUgdG8gaW52b2tlIGZvciBhbiBPbk5leHQgbm90aWZpY2F0aW9uIG9yIE9ic2VydmVyIHRvIGludm9rZSB0aGUgbm90aWZpY2F0aW9uIG9uLi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIERlbGVnYXRlIHRvIGludm9rZSBmb3IgYW4gT25FcnJvciBub3RpZmljYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25Db21wbGV0ZWQgRGVsZWdhdGUgdG8gaW52b2tlIGZvciBhbiBPbkNvbXBsZXRlZCBub3RpZmljYXRpb24uXG4gICAgICogQHJldHVybnMge0FueX0gUmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBvYnNlcnZhdGlvbi5cbiAgICAgKi9cbiAgICBOb3RpZmljYXRpb24ucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uIChvYnNlcnZlck9yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuIG9ic2VydmVyT3JPbk5leHQgJiYgdHlwZW9mIG9ic2VydmVyT3JPbk5leHQgPT09ICdvYmplY3QnID9cbiAgICAgICAgdGhpcy5fYWNjZXB0T2JzZXJ2YWJsZShvYnNlcnZlck9yT25OZXh0KSA6XG4gICAgICAgIHRoaXMuX2FjY2VwdChvYnNlcnZlck9yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIGEgc2luZ2xlIG5vdGlmaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBOb3RpZmljYXRpb25zXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBzZW5kIG91dCB0aGUgbm90aWZpY2F0aW9uIGNhbGxzIG9uLlxuICAgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHN1cmZhY2VzIHRoZSBiZWhhdmlvciBvZiB0aGUgbm90aWZpY2F0aW9uIHVwb24gc3Vic2NyaXB0aW9uLlxuICAgICAqL1xuICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9PYnNlcnZhYmxlID0gZnVuY3Rpb24gKHNjaGVkdWxlcikge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyKTtcbiAgICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKHNlbGYsIGZ1bmN0aW9uIChfLCBub3RpZmljYXRpb24pIHtcbiAgICAgICAgICBub3RpZmljYXRpb24uX2FjY2VwdE9ic2VydmFibGUobyk7XG4gICAgICAgICAgbm90aWZpY2F0aW9uLmtpbmQgPT09ICdOJyAmJiBvLm9uQ29tcGxldGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBOb3RpZmljYXRpb247XG4gIH0pKCk7XG5cbiAgdmFyIE9uTmV4dE5vdGlmaWNhdGlvbiA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoT25OZXh0Tm90aWZpY2F0aW9uLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIE9uTmV4dE5vdGlmaWNhdGlvbih2YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5raW5kID0gJ04nO1xuICAgIH1cblxuICAgIE9uTmV4dE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdCA9IGZ1bmN0aW9uIChvbk5leHQpIHtcbiAgICAgIHJldHVybiBvbk5leHQodGhpcy52YWx1ZSk7XG4gICAgfTtcblxuICAgIE9uTmV4dE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdE9ic2VydmFibGUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIG8ub25OZXh0KHRoaXMudmFsdWUpO1xuICAgIH07XG5cbiAgICBPbk5leHROb3RpZmljYXRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICdPbk5leHQoJyArIHRoaXMudmFsdWUgKyAnKSc7XG4gICAgfTtcblxuICAgIHJldHVybiBPbk5leHROb3RpZmljYXRpb247XG4gIH0oTm90aWZpY2F0aW9uKSk7XG5cbiAgdmFyIE9uRXJyb3JOb3RpZmljYXRpb24gPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKE9uRXJyb3JOb3RpZmljYXRpb24sIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gT25FcnJvck5vdGlmaWNhdGlvbihlcnJvcikge1xuICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgdGhpcy5raW5kID0gJ0UnO1xuICAgIH1cblxuICAgIE9uRXJyb3JOb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHQgPSBmdW5jdGlvbiAob25OZXh0LCBvbkVycm9yKSB7XG4gICAgICByZXR1cm4gb25FcnJvcih0aGlzLmVycm9yKTtcbiAgICB9O1xuXG4gICAgT25FcnJvck5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdE9ic2VydmFibGUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIG8ub25FcnJvcih0aGlzLmVycm9yKTtcbiAgICB9O1xuXG4gICAgT25FcnJvck5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJ09uRXJyb3IoJyArIHRoaXMuZXJyb3IgKyAnKSc7XG4gICAgfTtcblxuICAgIHJldHVybiBPbkVycm9yTm90aWZpY2F0aW9uO1xuICB9KE5vdGlmaWNhdGlvbikpO1xuXG4gIHZhciBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbiA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoT25Db21wbGV0ZWROb3RpZmljYXRpb24sIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gT25Db21wbGV0ZWROb3RpZmljYXRpb24oKSB7XG4gICAgICB0aGlzLmtpbmQgPSAnQyc7XG4gICAgfVxuXG4gICAgT25Db21wbGV0ZWROb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHQgPSBmdW5jdGlvbiAob25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuIG9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIE9uQ29tcGxldGVkTm90aWZpY2F0aW9uLnByb3RvdHlwZS5fYWNjZXB0T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gby5vbkNvbXBsZXRlZCgpO1xuICAgIH07XG5cbiAgICBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJ09uQ29tcGxldGVkKCknO1xuICAgIH07XG5cbiAgICByZXR1cm4gT25Db21wbGV0ZWROb3RpZmljYXRpb247XG4gIH0oTm90aWZpY2F0aW9uKSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhbiBPbk5leHQgbm90aWZpY2F0aW9uIHRvIGFuIG9ic2VydmVyLlxuICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgVGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgbm90aWZpY2F0aW9uLlxuICAgKiBAcmV0dXJucyB7Tm90aWZpY2F0aW9ufSBUaGUgT25OZXh0IG5vdGlmaWNhdGlvbiBjb250YWluaW5nIHRoZSB2YWx1ZS5cbiAgICovXG4gIHZhciBub3RpZmljYXRpb25DcmVhdGVPbk5leHQgPSBOb3RpZmljYXRpb24uY3JlYXRlT25OZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBPbk5leHROb3RpZmljYXRpb24odmFsdWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYW4gT25FcnJvciBub3RpZmljYXRpb24gdG8gYW4gb2JzZXJ2ZXIuXG4gICAqIEBwYXJhbSB7QW55fSBlcnJvciBUaGUgZXhjZXB0aW9uIGNvbnRhaW5lZCBpbiB0aGUgbm90aWZpY2F0aW9uLlxuICAgKiBAcmV0dXJucyB7Tm90aWZpY2F0aW9ufSBUaGUgT25FcnJvciBub3RpZmljYXRpb24gY29udGFpbmluZyB0aGUgZXhjZXB0aW9uLlxuICAgKi9cbiAgdmFyIG5vdGlmaWNhdGlvbkNyZWF0ZU9uRXJyb3IgPSBOb3RpZmljYXRpb24uY3JlYXRlT25FcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIHJldHVybiBuZXcgT25FcnJvck5vdGlmaWNhdGlvbihlcnJvcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhbiBPbkNvbXBsZXRlZCBub3RpZmljYXRpb24gdG8gYW4gb2JzZXJ2ZXIuXG4gICAqIEByZXR1cm5zIHtOb3RpZmljYXRpb259IFRoZSBPbkNvbXBsZXRlZCBub3RpZmljYXRpb24uXG4gICAqL1xuICB2YXIgbm90aWZpY2F0aW9uQ3JlYXRlT25Db21wbGV0ZWQgPSBOb3RpZmljYXRpb24uY3JlYXRlT25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdXBwb3J0cyBwdXNoLXN0eWxlIGl0ZXJhdGlvbiBvdmVyIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqL1xuICB2YXIgT2JzZXJ2ZXIgPSBSeC5PYnNlcnZlciA9IGZ1bmN0aW9uICgpIHsgfTtcblxuICAvKipcbiAgICogIENyZWF0ZXMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIE9uTmV4dCwgYWxvbmcgd2l0aCBvcHRpb25hbCBPbkVycm9yLCBhbmQgT25Db21wbGV0ZWQgYWN0aW9ucy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uTmV4dF0gT2JzZXJ2ZXIncyBPbk5leHQgYWN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gT2JzZXJ2ZXIncyBPbkVycm9yIGFjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uQ29tcGxldGVkXSBPYnNlcnZlcidzIE9uQ29tcGxldGVkIGFjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMge09ic2VydmVyfSBUaGUgb2JzZXJ2ZXIgb2JqZWN0IGltcGxlbWVudGVkIHVzaW5nIHRoZSBnaXZlbiBhY3Rpb25zLlxuICAgKi9cbiAgdmFyIG9ic2VydmVyQ3JlYXRlID0gT2JzZXJ2ZXIuY3JlYXRlID0gZnVuY3Rpb24gKG9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcbiAgICBvbk5leHQgfHwgKG9uTmV4dCA9IG5vb3ApO1xuICAgIG9uRXJyb3IgfHwgKG9uRXJyb3IgPSBkZWZhdWx0RXJyb3IpO1xuICAgIG9uQ29tcGxldGVkIHx8IChvbkNvbXBsZXRlZCA9IG5vb3ApO1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2ZXIob25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgT2JzZXJ2ZXIgY2xhc3MuXG4gICAqIFRoaXMgYmFzZSBjbGFzcyBlbmZvcmNlcyB0aGUgZ3JhbW1hciBvZiBvYnNlcnZlcnMgd2hlcmUgT25FcnJvciBhbmQgT25Db21wbGV0ZWQgYXJlIHRlcm1pbmFsIG1lc3NhZ2VzLlxuICAgKi9cbiAgdmFyIEFic3RyYWN0T2JzZXJ2ZXIgPSBSeC5pbnRlcm5hbHMuQWJzdHJhY3RPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQWJzdHJhY3RPYnNlcnZlciwgX19zdXBlcl9fKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaW4gYSBub24tc3RvcHBlZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBBYnN0cmFjdE9ic2VydmVyKCkge1xuICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBNdXN0IGJlIGltcGxlbWVudGVkIGJ5IG90aGVyIG9ic2VydmVyc1xuICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBub3RJbXBsZW1lbnRlZDtcbiAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IG5vdEltcGxlbWVudGVkO1xuICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IG5vdEltcGxlbWVudGVkO1xuXG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgdGhlIG9ic2VydmVyIG9mIGEgbmV3IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLlxuICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBOZXh0IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLlxuICAgICAqL1xuICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgIXRoaXMuaXNTdG9wcGVkICYmIHRoaXMubmV4dCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIHRoZSBvYnNlcnZlciB0aGF0IGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuXG4gICAgICogQHBhcmFtIHtBbnl9IGVycm9yIFRoZSBlcnJvciB0aGF0IGhhcyBvY2N1cnJlZC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIHRoZSBvYnNlcnZlciBvZiB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXBsZXRlZCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlcyB0aGUgb2JzZXJ2ZXIsIGNhdXNpbmcgaXQgdG8gdHJhbnNpdGlvbiB0byB0aGUgc3RvcHBlZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH07XG5cbiAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmVycm9yKGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gQWJzdHJhY3RPYnNlcnZlcjtcbiAgfShPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiBDbGFzcyB0byBjcmVhdGUgYW4gT2JzZXJ2ZXIgaW5zdGFuY2UgZnJvbSBkZWxlZ2F0ZS1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG9uKiBtZXRob2RzLlxuICAgKi9cbiAgdmFyIEFub255bW91c09ic2VydmVyID0gUnguQW5vbnltb3VzT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKEFub255bW91c09ic2VydmVyLCBfX3N1cGVyX18pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYnNlcnZlciBmcm9tIHRoZSBzcGVjaWZpZWQgT25OZXh0LCBPbkVycm9yLCBhbmQgT25Db21wbGV0ZWQgYWN0aW9ucy5cbiAgICAgKiBAcGFyYW0ge0FueX0gb25OZXh0IE9ic2VydmVyJ3MgT25OZXh0IGFjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FueX0gb25FcnJvciBPYnNlcnZlcidzIE9uRXJyb3IgYWN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgICAqIEBwYXJhbSB7QW55fSBvbkNvbXBsZXRlZCBPYnNlcnZlcidzIE9uQ29tcGxldGVkIGFjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBBbm9ueW1vdXNPYnNlcnZlcihvbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICAgIHRoaXMuX29uTmV4dCA9IG9uTmV4dDtcbiAgICAgIHRoaXMuX29uRXJyb3IgPSBvbkVycm9yO1xuICAgICAgdGhpcy5fb25Db21wbGV0ZWQgPSBvbkNvbXBsZXRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgb25OZXh0IGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgTmV4dCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cbiAgICAgKi9cbiAgICBBbm9ueW1vdXNPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdGhpcy5fb25OZXh0KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIG9uRXJyb3IgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7QW55fSBlcnJvciBUaGUgZXJyb3IgdGhhdCBoYXMgb2NjdXJyZWQuXG4gICAgICovXG4gICAgQW5vbnltb3VzT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICB0aGlzLl9vbkVycm9yKGVycm9yKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIENhbGxzIHRoZSBvbkNvbXBsZXRlZCBhY3Rpb24uXG4gICAgICovXG4gICAgQW5vbnltb3VzT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX29uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBBbm9ueW1vdXNPYnNlcnZlcjtcbiAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cbiAgdmFyIG9ic2VydmFibGVQcm90bztcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIHB1c2gtc3R5bGUgY29sbGVjdGlvbi5cbiAgICovXG4gIHZhciBPYnNlcnZhYmxlID0gUnguT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoKSB7XG5cbiAgICBmdW5jdGlvbiBtYWtlU3Vic2NyaWJlKHNlbGYsIHN1YnNjcmliZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHZhciBvbGRPbkVycm9yID0gby5vbkVycm9yO1xuICAgICAgICBvLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIG1ha2VTdGFja1RyYWNlTG9uZyhlLCBzZWxmKTtcbiAgICAgICAgICBvbGRPbkVycm9yLmNhbGwobywgZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZS5jYWxsKHNlbGYsIG8pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBPYnNlcnZhYmxlKCkge1xuICAgICAgaWYgKFJ4LmNvbmZpZy5sb25nU3RhY2tTdXBwb3J0ICYmIGhhc1N0YWNrcykge1xuICAgICAgICB2YXIgb2xkU3Vic2NyaWJlID0gdGhpcy5fc3Vic2NyaWJlO1xuICAgICAgICB2YXIgZSA9IHRyeUNhdGNoKHRocm93ZXIpKG5ldyBFcnJvcigpKS5lO1xuICAgICAgICB0aGlzLnN0YWNrID0gZS5zdGFjay5zdWJzdHJpbmcoZS5zdGFjay5pbmRleE9mKCdcXG4nKSArIDEpO1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmUgPSBtYWtlU3Vic2NyaWJlKHRoaXMsIG9sZFN1YnNjcmliZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb2JzZXJ2YWJsZVByb3RvID0gT2JzZXJ2YWJsZS5wcm90b3R5cGU7XG5cbiAgICAvKipcbiAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFuIE9ic2VydmFibGVcbiAgICAqIEBwYXJhbSB7QW55fSBBbiBvYmplY3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgYW4gT2JzZXJ2YWJsZVxuICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgYW4gT2JzZXJ2YWJsZSwgZWxzZSBmYWxzZS5cbiAgICAqL1xuICAgIE9ic2VydmFibGUuaXNPYnNlcnZhYmxlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiBvICYmIGlzRnVuY3Rpb24oby5zdWJzY3JpYmUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAgU3Vic2NyaWJlcyBhbiBvIHRvIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAgICAqICBAcGFyYW0ge01peGVkfSBbb09yT25OZXh0XSBUaGUgb2JqZWN0IHRoYXQgaXMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIG9yIGFuIGFjdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICAgKiAgQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIEFjdGlvbiB0byBpbnZva2UgdXBvbiBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICAgKiAgQHBhcmFtIHtGdW5jdGlvbn0gW29uQ29tcGxldGVkXSBBY3Rpb24gdG8gaW52b2tlIHVwb24gZ3JhY2VmdWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAgICogIEByZXR1cm5zIHtEaXBvc2FibGV9IEEgZGlzcG9zYWJsZSBoYW5kbGluZyB0aGUgc3Vic2NyaXB0aW9ucyBhbmQgdW5zdWJzY3JpcHRpb25zLlxuICAgICAqL1xuICAgIG9ic2VydmFibGVQcm90by5zdWJzY3JpYmUgPSBvYnNlcnZhYmxlUHJvdG8uZm9yRWFjaCA9IGZ1bmN0aW9uIChvT3JPbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKHR5cGVvZiBvT3JPbk5leHQgPT09ICdvYmplY3QnID9cbiAgICAgICAgb09yT25OZXh0IDpcbiAgICAgICAgb2JzZXJ2ZXJDcmVhdGUob09yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZSB3aXRoIGFuIG9wdGlvbmFsIFwidGhpc1wiIGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uTmV4dCBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gQSBkaXNwb3NhYmxlIGhhbmRsaW5nIHRoZSBzdWJzY3JpcHRpb25zIGFuZCB1bnN1YnNjcmlwdGlvbnMuXG4gICAgICovXG4gICAgb2JzZXJ2YWJsZVByb3RvLnN1YnNjcmliZU9uTmV4dCA9IGZ1bmN0aW9uIChvbk5leHQsIHRoaXNBcmcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmUob2JzZXJ2ZXJDcmVhdGUodHlwZW9mIHRoaXNBcmcgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24oeCkgeyBvbk5leHQuY2FsbCh0aGlzQXJnLCB4KTsgfSA6IG9uTmV4dCkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmVzIHRvIGFuIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbiBpbiB0aGUgc2VxdWVuY2Ugd2l0aCBhbiBvcHRpb25hbCBcInRoaXNcIiBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UgdXBvbiBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gQSBkaXNwb3NhYmxlIGhhbmRsaW5nIHRoZSBzdWJzY3JpcHRpb25zIGFuZCB1bnN1YnNjcmlwdGlvbnMuXG4gICAgICovXG4gICAgb2JzZXJ2YWJsZVByb3RvLnN1YnNjcmliZU9uRXJyb3IgPSBmdW5jdGlvbiAob25FcnJvciwgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZShvYnNlcnZlckNyZWF0ZShudWxsLCB0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbihlKSB7IG9uRXJyb3IuY2FsbCh0aGlzQXJnLCBlKTsgfSA6IG9uRXJyb3IpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlcyB0byB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2Ugd2l0aCBhbiBvcHRpb25hbCBcInRoaXNcIiBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNvbXBsZXRlZCBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIHVwb24gZ3JhY2VmdWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAgICogQHBhcmFtIHtBbnl9IFt0aGlzQXJnXSBPYmplY3QgdG8gdXNlIGFzIHRoaXMgd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMge0Rpc3Bvc2FibGV9IEEgZGlzcG9zYWJsZSBoYW5kbGluZyB0aGUgc3Vic2NyaXB0aW9ucyBhbmQgdW5zdWJzY3JpcHRpb25zLlxuICAgICAqL1xuICAgIG9ic2VydmFibGVQcm90by5zdWJzY3JpYmVPbkNvbXBsZXRlZCA9IGZ1bmN0aW9uIChvbkNvbXBsZXRlZCwgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZShvYnNlcnZlckNyZWF0ZShudWxsLCBudWxsLCB0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbigpIHsgb25Db21wbGV0ZWQuY2FsbCh0aGlzQXJnKTsgfSA6IG9uQ29tcGxldGVkKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlO1xuICB9KSgpO1xuXG4gIHZhciBTY2hlZHVsZWRPYnNlcnZlciA9IFJ4LmludGVybmFscy5TY2hlZHVsZWRPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoU2NoZWR1bGVkT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cbiAgICBmdW5jdGlvbiBTY2hlZHVsZWRPYnNlcnZlcihzY2hlZHVsZXIsIG9ic2VydmVyKSB7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgdGhpcy5pc0FjcXVpcmVkID0gZmFsc2U7XG4gICAgICB0aGlzLmhhc0ZhdWx0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgIHRoaXMuZGlzcG9zYWJsZSA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG4gICAgfVxuXG4gICAgU2NoZWR1bGVkT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHRoaXMucXVldWUucHVzaChmdW5jdGlvbiAoKSB7IHNlbGYub2JzZXJ2ZXIub25OZXh0KHZhbHVlKTsgfSk7XG4gICAgfTtcblxuICAgIFNjaGVkdWxlZE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goZnVuY3Rpb24gKCkgeyBzZWxmLm9ic2VydmVyLm9uRXJyb3IoZSk7IH0pO1xuICAgIH07XG5cbiAgICBTY2hlZHVsZWRPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGZ1bmN0aW9uICgpIHsgc2VsZi5vYnNlcnZlci5vbkNvbXBsZXRlZCgpOyB9KTtcbiAgICB9O1xuXG4gICAgU2NoZWR1bGVkT2JzZXJ2ZXIucHJvdG90eXBlLmVuc3VyZUFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpc093bmVyID0gZmFsc2U7XG4gICAgICBpZiAoIXRoaXMuaGFzRmF1bHRlZCAmJiB0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNPd25lciA9ICF0aGlzLmlzQWNxdWlyZWQ7XG4gICAgICAgIHRoaXMuaXNBY3F1aXJlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNPd25lcikge1xuICAgICAgICB0aGlzLmRpc3Bvc2FibGUuc2V0RGlzcG9zYWJsZSh0aGlzLnNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSh0aGlzLCBmdW5jdGlvbiAocGFyZW50LCBzZWxmKSB7XG4gICAgICAgICAgdmFyIHdvcms7XG4gICAgICAgICAgaWYgKHBhcmVudC5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB3b3JrID0gcGFyZW50LnF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5pc0FjcXVpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh3b3JrKSgpO1xuICAgICAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7XG4gICAgICAgICAgICBwYXJlbnQucXVldWUgPSBbXTtcbiAgICAgICAgICAgIHBhcmVudC5oYXNGYXVsdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd2VyKHJlcy5lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZihwYXJlbnQpO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFNjaGVkdWxlZE9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgX19zdXBlcl9fLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmRpc3Bvc2FibGUuZGlzcG9zZSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2NoZWR1bGVkT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIHZhciBPYnNlcnZhYmxlQmFzZSA9IFJ4Lk9ic2VydmFibGVCYXNlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhPYnNlcnZhYmxlQmFzZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIGZpeFN1YnNjcmliZXIoc3Vic2NyaWJlcikge1xuICAgICAgcmV0dXJuIHN1YnNjcmliZXIgJiYgaXNGdW5jdGlvbihzdWJzY3JpYmVyLmRpc3Bvc2UpID8gc3Vic2NyaWJlciA6XG4gICAgICAgIGlzRnVuY3Rpb24oc3Vic2NyaWJlcikgPyBkaXNwb3NhYmxlQ3JlYXRlKHN1YnNjcmliZXIpIDogZGlzcG9zYWJsZUVtcHR5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldERpc3Bvc2FibGUocywgc3RhdGUpIHtcbiAgICAgIHZhciBhZG8gPSBzdGF0ZVswXSwgc2VsZiA9IHN0YXRlWzFdO1xuICAgICAgdmFyIHN1YiA9IHRyeUNhdGNoKHNlbGYuc3Vic2NyaWJlQ29yZSkuY2FsbChzZWxmLCBhZG8pO1xuICAgICAgaWYgKHN1YiA9PT0gZXJyb3JPYmogJiYgIWFkby5mYWlsKGVycm9yT2JqLmUpKSB7IHRocm93ZXIoZXJyb3JPYmouZSk7IH1cbiAgICAgIGFkby5zZXREaXNwb3NhYmxlKGZpeFN1YnNjcmliZXIoc3ViKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZUJhc2UoKSB7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBPYnNlcnZhYmxlQmFzZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgYWRvID0gbmV3IEF1dG9EZXRhY2hPYnNlcnZlcihvKSwgc3RhdGUgPSBbYWRvLCB0aGlzXTtcblxuICAgICAgaWYgKGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGVSZXF1aXJlZCgpKSB7XG4gICAgICAgIGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGUoc3RhdGUsIHNldERpc3Bvc2FibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0RGlzcG9zYWJsZShudWxsLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWRvO1xuICAgIH07XG5cbiAgICBPYnNlcnZhYmxlQmFzZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IG5vdEltcGxlbWVudGVkO1xuXG4gICAgcmV0dXJuIE9ic2VydmFibGVCYXNlO1xuICB9KE9ic2VydmFibGUpKTtcblxudmFyIEZsYXRNYXBPYnNlcnZhYmxlID0gUnguRmxhdE1hcE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cbiAgICBpbmhlcml0cyhGbGF0TWFwT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIEZsYXRNYXBPYnNlcnZhYmxlKHNvdXJjZSwgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKSB7XG4gICAgICB0aGlzLnJlc3VsdFNlbGVjdG9yID0gaXNGdW5jdGlvbihyZXN1bHRTZWxlY3RvcikgPyByZXN1bHRTZWxlY3RvciA6IG51bGw7XG4gICAgICB0aGlzLnNlbGVjdG9yID0gYmluZENhbGxiYWNrKGlzRnVuY3Rpb24oc2VsZWN0b3IpID8gc2VsZWN0b3IgOiBmdW5jdGlvbigpIHsgcmV0dXJuIHNlbGVjdG9yOyB9LCB0aGlzQXJnLCAzKTtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRmxhdE1hcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHRoaXMuc2VsZWN0b3IsIHRoaXMucmVzdWx0U2VsZWN0b3IsIHRoaXMpKTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG4gICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvYnNlcnZlciwgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCBzb3VyY2UpIHtcbiAgICAgIHRoaXMuaSA9IDA7XG4gICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICB0aGlzLnJlc3VsdFNlbGVjdG9yID0gcmVzdWx0U2VsZWN0b3I7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMubyA9IG9ic2VydmVyO1xuICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLl93cmFwUmVzdWx0ID0gZnVuY3Rpb24ocmVzdWx0LCB4LCBpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXN1bHRTZWxlY3RvciA/XG4gICAgICAgIHJlc3VsdC5tYXAoZnVuY3Rpb24oeSwgaTIpIHsgcmV0dXJuIHRoaXMucmVzdWx0U2VsZWN0b3IoeCwgeSwgaSwgaTIpOyB9LCB0aGlzKSA6XG4gICAgICAgIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHZhciBpID0gdGhpcy5pKys7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godGhpcy5zZWxlY3RvcikoeCwgaSwgdGhpcy5zb3VyY2UpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKHJlc3VsdC5lKTsgfVxuXG4gICAgICBpc1Byb21pc2UocmVzdWx0KSAmJiAocmVzdWx0ID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHJlc3VsdCkpO1xuICAgICAgKGlzQXJyYXlMaWtlKHJlc3VsdCkgfHwgaXNJdGVyYWJsZShyZXN1bHQpKSAmJiAocmVzdWx0ID0gT2JzZXJ2YWJsZS5mcm9tKHJlc3VsdCkpO1xuICAgICAgdGhpcy5vLm9uTmV4dCh0aGlzLl93cmFwUmVzdWx0KHJlc3VsdCwgeCwgaSkpO1xuICAgIH07XG5cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGUpIHsgdGhpcy5vLm9uRXJyb3IoZSk7IH07XG5cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uKCkgeyB0aGlzLm8ub25Db21wbGV0ZWQoKTsgfTtcblxuICAgIHJldHVybiBGbGF0TWFwT2JzZXJ2YWJsZTtcblxufShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBFbnVtZXJhYmxlID0gUnguaW50ZXJuYWxzLkVudW1lcmFibGUgPSBmdW5jdGlvbiAoKSB7IH07XG5cbiAgZnVuY3Rpb24gSXNEaXNwb3NlZERpc3Bvc2FibGUoc3RhdGUpIHtcbiAgICB0aGlzLl9zID0gc3RhdGU7XG4gICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG4gIH1cblxuICBJc0Rpc3Bvc2VkRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3MuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIHZhciBDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZShzb3VyY2VzKSB7XG4gICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgQ29uY2F0RW51bWVyYWJsZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIHN0YXRlID0geyBpc0Rpc3Bvc2VkOiBmYWxzZSB9LCBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpO1xuICAgICAgdmFyIGNhbmNlbGFibGUgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKHRoaXMuc291cmNlc1skaXRlcmF0b3IkXSgpLCBmdW5jdGlvbiAoZSwgc2VsZikge1xuICAgICAgICBpZiAoc3RhdGUuaXNEaXNwb3NlZCkgeyByZXR1cm47IH1cbiAgICAgICAgdmFyIGN1cnJlbnRJdGVtID0gdHJ5Q2F0Y2goZS5uZXh0KS5jYWxsKGUpO1xuICAgICAgICBpZiAoY3VycmVudEl0ZW0gPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IoY3VycmVudEl0ZW0uZSk7IH1cblxuICAgICAgICBpZiAoY3VycmVudEl0ZW0uZG9uZSkge1xuICAgICAgICAgIHJldHVybiBvLm9uQ29tcGxldGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBwcm9taXNlXG4gICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBjdXJyZW50SXRlbS52YWx1ZTtcbiAgICAgICAgaXNQcm9taXNlKGN1cnJlbnRWYWx1ZSkgJiYgKGN1cnJlbnRWYWx1ZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShjdXJyZW50VmFsdWUpKTtcblxuICAgICAgICB2YXIgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuICAgICAgICBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShkKTtcbiAgICAgICAgZC5zZXREaXNwb3NhYmxlKGN1cnJlbnRWYWx1ZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobywgc2VsZiwgZSkpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKFtzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUsIG5ldyBJc0Rpc3Bvc2VkRGlzcG9zYWJsZShzdGF0ZSldKTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG4gICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvLCBzLCBlKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3MgPSBzO1xuICAgICAgdGhpcy5fZSA9IGU7XG4gICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uICh4KSB7IHRoaXMuX28ub25OZXh0KHgpOyB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uRXJyb3IoZSk7IH07XG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3ModGhpcy5fZSk7IH07XG5cbiAgICByZXR1cm4gQ29uY2F0RW51bWVyYWJsZU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICBFbnVtZXJhYmxlLnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSh0aGlzKTtcbiAgfTtcblxuICB2YXIgQ2F0Y2hFcnJvck9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQ2F0Y2hFcnJvck9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ2F0Y2hFcnJvck9ic2VydmFibGUoc291cmNlcykge1xuICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIENhdGNoRXJyb3JPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBlID0gdGhpcy5zb3VyY2VzWyRpdGVyYXRvciRdKCk7XG5cbiAgICAgIHZhciBzdGF0ZSA9IHsgaXNEaXNwb3NlZDogZmFsc2UgfSwgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKTtcbiAgICAgIHZhciBjYW5jZWxhYmxlID0gY3VycmVudFRocmVhZFNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZShudWxsLCBmdW5jdGlvbiAobGFzdEV4Y2VwdGlvbiwgc2VsZikge1xuICAgICAgICBpZiAoc3RhdGUuaXNEaXNwb3NlZCkgeyByZXR1cm47IH1cbiAgICAgICAgdmFyIGN1cnJlbnRJdGVtID0gdHJ5Q2F0Y2goZS5uZXh0KS5jYWxsKGUpO1xuICAgICAgICBpZiAoY3VycmVudEl0ZW0gPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IoY3VycmVudEl0ZW0uZSk7IH1cblxuICAgICAgICBpZiAoY3VycmVudEl0ZW0uZG9uZSkge1xuICAgICAgICAgIHJldHVybiBsYXN0RXhjZXB0aW9uICE9PSBudWxsID8gby5vbkVycm9yKGxhc3RFeGNlcHRpb24pIDogby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgcHJvbWlzZVxuICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gY3VycmVudEl0ZW0udmFsdWU7XG4gICAgICAgIGlzUHJvbWlzZShjdXJyZW50VmFsdWUpICYmIChjdXJyZW50VmFsdWUgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoY3VycmVudFZhbHVlKSk7XG5cbiAgICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUoZCk7XG4gICAgICAgIGQuc2V0RGlzcG9zYWJsZShjdXJyZW50VmFsdWUuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHNlbGYpKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgTkFyeURpc3Bvc2FibGUoW3N1YnNjcmlwdGlvbiwgY2FuY2VsYWJsZSwgbmV3IElzRGlzcG9zZWREaXNwb3NhYmxlKHN0YXRlKV0pO1xuICAgIH07XG5cbiAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcbiAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIHJlY3Vyc2UpIHtcbiAgICAgIHRoaXMuX28gPSBvO1xuICAgICAgdGhpcy5fcmVjdXJzZSA9IHJlY3Vyc2U7XG4gICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7IHRoaXMuX28ub25OZXh0KHgpOyB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHsgdGhpcy5fcmVjdXJzZShlKTsgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX28ub25Db21wbGV0ZWQoKTsgfTtcblxuICAgIHJldHVybiBDYXRjaEVycm9yT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIEVudW1lcmFibGUucHJvdG90eXBlLmNhdGNoRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBDYXRjaEVycm9yT2JzZXJ2YWJsZSh0aGlzKTtcbiAgfTtcblxuICBFbnVtZXJhYmxlLnByb3RvdHlwZS5jYXRjaEVycm9yV2hlbiA9IGZ1bmN0aW9uIChub3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgdmFyIHNvdXJjZXMgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGV4Y2VwdGlvbnMgPSBuZXcgU3ViamVjdCgpLFxuICAgICAgICBub3RpZmllciA9IG5ldyBTdWJqZWN0KCksXG4gICAgICAgIGhhbmRsZWQgPSBub3RpZmljYXRpb25IYW5kbGVyKGV4Y2VwdGlvbnMpLFxuICAgICAgICBub3RpZmljYXRpb25EaXNwb3NhYmxlID0gaGFuZGxlZC5zdWJzY3JpYmUobm90aWZpZXIpO1xuXG4gICAgICB2YXIgZSA9IHNvdXJjZXNbJGl0ZXJhdG9yJF0oKTtcblxuICAgICAgdmFyIHN0YXRlID0geyBpc0Rpc3Bvc2VkOiBmYWxzZSB9LFxuICAgICAgICBsYXN0RXhjZXB0aW9uLFxuICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpO1xuICAgICAgdmFyIGNhbmNlbGFibGUgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKG51bGwsIGZ1bmN0aW9uIChfLCBzZWxmKSB7XG4gICAgICAgIGlmIChzdGF0ZS5pc0Rpc3Bvc2VkKSB7IHJldHVybjsgfVxuICAgICAgICB2YXIgY3VycmVudEl0ZW0gPSB0cnlDYXRjaChlLm5leHQpLmNhbGwoZSk7XG4gICAgICAgIGlmIChjdXJyZW50SXRlbSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihjdXJyZW50SXRlbS5lKTsgfVxuXG4gICAgICAgIGlmIChjdXJyZW50SXRlbS5kb25lKSB7XG4gICAgICAgICAgaWYgKGxhc3RFeGNlcHRpb24pIHtcbiAgICAgICAgICAgIG8ub25FcnJvcihsYXN0RXhjZXB0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBwcm9taXNlXG4gICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBjdXJyZW50SXRlbS52YWx1ZTtcbiAgICAgICAgaXNQcm9taXNlKGN1cnJlbnRWYWx1ZSkgJiYgKGN1cnJlbnRWYWx1ZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShjdXJyZW50VmFsdWUpKTtcblxuICAgICAgICB2YXIgb3V0ZXIgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgdmFyIGlubmVyID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG5ldyBCaW5hcnlEaXNwb3NhYmxlKGlubmVyLCBvdXRlcikpO1xuICAgICAgICBvdXRlci5zZXREaXNwb3NhYmxlKGN1cnJlbnRWYWx1ZS5zdWJzY3JpYmUoXG4gICAgICAgICAgZnVuY3Rpb24oeCkgeyBvLm9uTmV4dCh4KTsgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoZXhuKSB7XG4gICAgICAgICAgICBpbm5lci5zZXREaXNwb3NhYmxlKG5vdGlmaWVyLnN1YnNjcmliZShzZWxmLCBmdW5jdGlvbihleCkge1xuICAgICAgICAgICAgICBvLm9uRXJyb3IoZXgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgZXhjZXB0aW9ucy5vbk5leHQoZXhuKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uKCkgeyBvLm9uQ29tcGxldGVkKCk7IH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKFtub3RpZmljYXRpb25EaXNwb3NhYmxlLCBzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUsIG5ldyBJc0Rpc3Bvc2VkRGlzcG9zYWJsZShzdGF0ZSldKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgUmVwZWF0RW51bWVyYWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoUmVwZWF0RW51bWVyYWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIFJlcGVhdEVudW1lcmFibGUodiwgYykge1xuICAgICAgdGhpcy52ID0gdjtcbiAgICAgIHRoaXMuYyA9IGMgPT0gbnVsbCA/IC0xIDogYztcbiAgICB9XG4gICAgUmVwZWF0RW51bWVyYWJsZS5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IFJlcGVhdEVudW1lcmF0b3IodGhpcyk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFJlcGVhdEVudW1lcmF0b3IocCkge1xuICAgICAgdGhpcy52ID0gcC52O1xuICAgICAgdGhpcy5sID0gcC5jO1xuICAgIH1cbiAgICBSZXBlYXRFbnVtZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMubCA9PT0gMCkgeyByZXR1cm4gZG9uZUVudW1lcmF0b3I7IH1cbiAgICAgIGlmICh0aGlzLmwgPiAwKSB7IHRoaXMubC0tOyB9XG4gICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IHRoaXMudiB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gUmVwZWF0RW51bWVyYWJsZTtcbiAgfShFbnVtZXJhYmxlKSk7XG5cbiAgdmFyIGVudW1lcmFibGVSZXBlYXQgPSBFbnVtZXJhYmxlLnJlcGVhdCA9IGZ1bmN0aW9uICh2YWx1ZSwgcmVwZWF0Q291bnQpIHtcbiAgICByZXR1cm4gbmV3IFJlcGVhdEVudW1lcmFibGUodmFsdWUsIHJlcGVhdENvdW50KTtcbiAgfTtcblxuICB2YXIgT2ZFbnVtZXJhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKE9mRW51bWVyYWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBPZkVudW1lcmFibGUocywgZm4sIHRoaXNBcmcpIHtcbiAgICAgIHRoaXMucyA9IHM7XG4gICAgICB0aGlzLmZuID0gZm4gPyBiaW5kQ2FsbGJhY2soZm4sIHRoaXNBcmcsIDMpIDogbnVsbDtcbiAgICB9XG4gICAgT2ZFbnVtZXJhYmxlLnByb3RvdHlwZVskaXRlcmF0b3IkXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgT2ZFbnVtZXJhdG9yKHRoaXMpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBPZkVudW1lcmF0b3IocCkge1xuICAgICAgdGhpcy5pID0gLTE7XG4gICAgICB0aGlzLnMgPSBwLnM7XG4gICAgICB0aGlzLmwgPSB0aGlzLnMubGVuZ3RoO1xuICAgICAgdGhpcy5mbiA9IHAuZm47XG4gICAgfVxuICAgIE9mRW51bWVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgcmV0dXJuICsrdGhpcy5pIDwgdGhpcy5sID9cbiAgICAgICB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogIXRoaXMuZm4gPyB0aGlzLnNbdGhpcy5pXSA6IHRoaXMuZm4odGhpcy5zW3RoaXMuaV0sIHRoaXMuaSwgdGhpcy5zKSB9IDpcbiAgICAgICBkb25lRW51bWVyYXRvcjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE9mRW51bWVyYWJsZTtcbiAgfShFbnVtZXJhYmxlKSk7XG5cbiAgdmFyIGVudW1lcmFibGVPZiA9IEVudW1lcmFibGUub2YgPSBmdW5jdGlvbiAoc291cmNlLCBzZWxlY3RvciwgdGhpc0FyZykge1xuICAgIHJldHVybiBuZXcgT2ZFbnVtZXJhYmxlKHNvdXJjZSwgc2VsZWN0b3IsIHRoaXNBcmcpO1xuICB9O1xuXG4gIHZhciBUb0FycmF5T2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUb0FycmF5T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBUb0FycmF5T2JzZXJ2YWJsZShzb3VyY2UpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgVG9BcnJheU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8pKTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG4gICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvKSB7XG4gICAgICB0aGlzLm8gPSBvO1xuICAgICAgdGhpcy5hID0gW107XG4gICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIFxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkgeyB0aGlzLmEucHVzaCh4KTsgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuby5vbkVycm9yKGUpOyAgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuby5vbk5leHQodGhpcy5hKTsgdGhpcy5vLm9uQ29tcGxldGVkKCk7IH07XG5cbiAgICByZXR1cm4gVG9BcnJheU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgKiBDcmVhdGVzIGFuIGFycmF5IGZyb20gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBhIGxpc3QgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICovXG4gIG9ic2VydmFibGVQcm90by50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgVG9BcnJheU9ic2VydmFibGUodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICBDcmVhdGVzIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgZnJvbSBhIHNwZWNpZmllZCBzdWJzY3JpYmUgbWV0aG9kIGltcGxlbWVudGF0aW9uLlxuICAgKiBAZXhhbXBsZVxuICAgKiAgdmFyIHJlcyA9IFJ4Lk9ic2VydmFibGUuY3JlYXRlKGZ1bmN0aW9uIChvYnNlcnZlcikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB9ICk7XG4gICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5jcmVhdGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7IHJldHVybiBSeC5EaXNwb3NhYmxlLmVtcHR5OyB9ICk7XG4gICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5jcmVhdGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7IH0gKTtcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3Vic2NyaWJlIEltcGxlbWVudGF0aW9uIG9mIHRoZSByZXN1bHRpbmcgb2JzZXJ2YWJsZSBzZXF1ZW5jZSdzIHN1YnNjcmliZSBtZXRob2QsIHJldHVybmluZyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGluIGEgRGlzcG9zYWJsZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFN1YnNjcmliZSBtZXRob2QuXG4gICAqL1xuICBPYnNlcnZhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmUsIHBhcmVudCkge1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShzdWJzY3JpYmUsIHBhcmVudCk7XG4gIH07XG5cbiAgdmFyIERlZmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKERlZmVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIERlZmVyKGZhY3RvcnkpIHtcbiAgICAgIHRoaXMuX2YgPSBmYWN0b3J5O1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRGVmZXIucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMuX2YpKCk7XG4gICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gb2JzZXJ2YWJsZVRocm93KHJlc3VsdC5lKS5zdWJzY3JpYmUobyk7fVxuICAgICAgaXNQcm9taXNlKHJlc3VsdCkgJiYgKHJlc3VsdCA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShyZXN1bHQpKTtcbiAgICAgIHJldHVybiByZXN1bHQuc3Vic2NyaWJlKG8pO1xuICAgIH07XG5cbiAgICByZXR1cm4gRGVmZXI7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGludm9rZXMgdGhlIHNwZWNpZmllZCBmYWN0b3J5IGZ1bmN0aW9uIHdoZW5ldmVyIGEgbmV3IG9ic2VydmVyIHN1YnNjcmliZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5kZWZlcihmdW5jdGlvbiAoKSB7IHJldHVybiBSeC5PYnNlcnZhYmxlLmZyb21BcnJheShbMSwyLDNdKTsgfSk7XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9ic2VydmFibGVGYWN0b3J5IE9ic2VydmFibGUgZmFjdG9yeSBmdW5jdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggb2JzZXJ2ZXIgdGhhdCBzdWJzY3JpYmVzIHRvIHRoZSByZXN1bHRpbmcgc2VxdWVuY2Ugb3IgUHJvbWlzZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hvc2Ugb2JzZXJ2ZXJzIHRyaWdnZXIgYW4gaW52b2NhdGlvbiBvZiB0aGUgZ2l2ZW4gb2JzZXJ2YWJsZSBmYWN0b3J5IGZ1bmN0aW9uLlxuICAgKi9cbiAgdmFyIG9ic2VydmFibGVEZWZlciA9IE9ic2VydmFibGUuZGVmZXIgPSBmdW5jdGlvbiAob2JzZXJ2YWJsZUZhY3RvcnkpIHtcbiAgICByZXR1cm4gbmV3IERlZmVyKG9ic2VydmFibGVGYWN0b3J5KTtcbiAgfTtcblxuICB2YXIgRW1wdHlPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKEVtcHR5T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBFbXB0eU9ic2VydmFibGUoc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEVtcHR5T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIHNpbmsgPSBuZXcgRW1wdHlTaW5rKG9ic2VydmVyLCB0aGlzLnNjaGVkdWxlcik7XG4gICAgICByZXR1cm4gc2luay5ydW4oKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gRW1wdHlTaW5rKG9ic2VydmVyLCBzY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlSXRlbShzLCBzdGF0ZSkge1xuICAgICAgc3RhdGUub25Db21wbGV0ZWQoKTtcbiAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG4gICAgfVxuXG4gICAgRW1wdHlTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhdGUgPSB0aGlzLm9ic2VydmVyO1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyID09PSBpbW1lZGlhdGVTY2hlZHVsZXIgP1xuICAgICAgICBzY2hlZHVsZUl0ZW0obnVsbCwgc3RhdGUpIDpcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUoc3RhdGUsIHNjaGVkdWxlSXRlbSk7XG4gICAgfTtcblxuICAgIHJldHVybiBFbXB0eU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgRU1QVFlfT0JTRVJWQUJMRSA9IG5ldyBFbXB0eU9ic2VydmFibGUoaW1tZWRpYXRlU2NoZWR1bGVyKTtcblxuICAvKipcbiAgICogIFJldHVybnMgYW4gZW1wdHkgb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2hlZHVsZXIgdG8gc2VuZCBvdXQgdGhlIHNpbmdsZSBPbkNvbXBsZXRlZCBtZXNzYWdlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgdmFyIHJlcyA9IFJ4Lk9ic2VydmFibGUuZW1wdHkoKTtcbiAgICogIHZhciByZXMgPSBSeC5PYnNlcnZhYmxlLmVtcHR5KFJ4LlNjaGVkdWxlci50aW1lb3V0KTtcbiAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBzZW5kIHRoZSB0ZXJtaW5hdGlvbiBjYWxsIG9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIG5vIGVsZW1lbnRzLlxuICAgKi9cbiAgdmFyIG9ic2VydmFibGVFbXB0eSA9IE9ic2VydmFibGUuZW1wdHkgPSBmdW5jdGlvbiAoc2NoZWR1bGVyKSB7XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyKTtcbiAgICByZXR1cm4gc2NoZWR1bGVyID09PSBpbW1lZGlhdGVTY2hlZHVsZXIgPyBFTVBUWV9PQlNFUlZBQkxFIDogbmV3IEVtcHR5T2JzZXJ2YWJsZShzY2hlZHVsZXIpO1xuICB9O1xuXG4gIHZhciBGcm9tT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhGcm9tT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBGcm9tT2JzZXJ2YWJsZShpdGVyYWJsZSwgbWFwcGVyLCBzY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTtcbiAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyO1xuICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBGcm9tT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgc2luayA9IG5ldyBGcm9tU2luayhvLCB0aGlzKTtcbiAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gRnJvbU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgRnJvbVNpbmsgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZyb21TaW5rKG8sIHBhcmVudCkge1xuICAgICAgdGhpcy5vID0gbztcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIEZyb21TaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbGlzdCA9IE9iamVjdCh0aGlzLnBhcmVudC5pdGVyYWJsZSksXG4gICAgICAgICAgaXQgPSBnZXRJdGVyYWJsZShsaXN0KSxcbiAgICAgICAgICBvID0gdGhpcy5vLFxuICAgICAgICAgIG1hcHBlciA9IHRoaXMucGFyZW50Lm1hcHBlcjtcblxuICAgICAgZnVuY3Rpb24gbG9vcFJlY3Vyc2l2ZShpLCByZWN1cnNlKSB7XG4gICAgICAgIHZhciBuZXh0ID0gdHJ5Q2F0Y2goaXQubmV4dCkuY2FsbChpdCk7XG4gICAgICAgIGlmIChuZXh0ID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKG5leHQuZSk7IH1cbiAgICAgICAgaWYgKG5leHQuZG9uZSkgeyByZXR1cm4gby5vbkNvbXBsZXRlZCgpOyB9XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IG5leHQudmFsdWU7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24obWFwcGVyKSkge1xuICAgICAgICAgIHJlc3VsdCA9IHRyeUNhdGNoKG1hcHBlcikocmVzdWx0LCBpKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdC5lKTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgby5vbk5leHQocmVzdWx0KTtcbiAgICAgICAgcmVjdXJzZShpICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUoMCwgbG9vcFJlY3Vyc2l2ZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBGcm9tU2luaztcbiAgfSgpKTtcblxuICB2YXIgbWF4U2FmZUludGVnZXIgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuXG4gIGZ1bmN0aW9uIFN0cmluZ0l0ZXJhYmxlKHMpIHtcbiAgICB0aGlzLl9zID0gcztcbiAgfVxuXG4gIFN0cmluZ0l0ZXJhYmxlLnByb3RvdHlwZVskaXRlcmF0b3IkXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFN0cmluZ0l0ZXJhdG9yKHRoaXMuX3MpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFN0cmluZ0l0ZXJhdG9yKHMpIHtcbiAgICB0aGlzLl9zID0gcztcbiAgICB0aGlzLl9sID0gcy5sZW5ndGg7XG4gICAgdGhpcy5faSA9IDA7XG4gIH1cblxuICBTdHJpbmdJdGVyYXRvci5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgU3RyaW5nSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2kgPCB0aGlzLl9sID8geyBkb25lOiBmYWxzZSwgdmFsdWU6IHRoaXMuX3MuY2hhckF0KHRoaXMuX2krKykgfSA6IGRvbmVFbnVtZXJhdG9yO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFycmF5SXRlcmFibGUoYSkge1xuICAgIHRoaXMuX2EgPSBhO1xuICB9XG5cbiAgQXJyYXlJdGVyYWJsZS5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKHRoaXMuX2EpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFycmF5SXRlcmF0b3IoYSkge1xuICAgIHRoaXMuX2EgPSBhO1xuICAgIHRoaXMuX2wgPSB0b0xlbmd0aChhKTtcbiAgICB0aGlzLl9pID0gMDtcbiAgfVxuXG4gIEFycmF5SXRlcmF0b3IucHJvdG90eXBlWyRpdGVyYXRvciRdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFycmF5SXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2kgPCB0aGlzLl9sID8geyBkb25lOiBmYWxzZSwgdmFsdWU6IHRoaXMuX2FbdGhpcy5faSsrXSB9IDogZG9uZUVudW1lcmF0b3I7XG4gIH07XG5cbiAgZnVuY3Rpb24gbnVtYmVySXNGaW5pdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiByb290LmlzRmluaXRlKHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTmFuKG4pIHtcbiAgICByZXR1cm4gbiAhPT0gbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEl0ZXJhYmxlKG8pIHtcbiAgICB2YXIgaSA9IG9bJGl0ZXJhdG9yJF0sIGl0O1xuICAgIGlmICghaSAmJiB0eXBlb2YgbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGl0ID0gbmV3IFN0cmluZ0l0ZXJhYmxlKG8pO1xuICAgICAgcmV0dXJuIGl0WyRpdGVyYXRvciRdKCk7XG4gICAgfVxuICAgIGlmICghaSAmJiBvLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpdCA9IG5ldyBBcnJheUl0ZXJhYmxlKG8pO1xuICAgICAgcmV0dXJuIGl0WyRpdGVyYXRvciRdKCk7XG4gICAgfVxuICAgIGlmICghaSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QgaXMgbm90IGl0ZXJhYmxlJyk7IH1cbiAgICByZXR1cm4gb1skaXRlcmF0b3IkXSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbih2YWx1ZSkge1xuICAgIHZhciBudW1iZXIgPSArdmFsdWU7XG4gICAgaWYgKG51bWJlciA9PT0gMCkgeyByZXR1cm4gbnVtYmVyOyB9XG4gICAgaWYgKGlzTmFOKG51bWJlcikpIHsgcmV0dXJuIG51bWJlcjsgfVxuICAgIHJldHVybiBudW1iZXIgPCAwID8gLTEgOiAxO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9MZW5ndGgobykge1xuICAgIHZhciBsZW4gPSArby5sZW5ndGg7XG4gICAgaWYgKGlzTmFOKGxlbikpIHsgcmV0dXJuIDA7IH1cbiAgICBpZiAobGVuID09PSAwIHx8ICFudW1iZXJJc0Zpbml0ZShsZW4pKSB7IHJldHVybiBsZW47IH1cbiAgICBsZW4gPSBzaWduKGxlbikgKiBNYXRoLmZsb29yKE1hdGguYWJzKGxlbikpO1xuICAgIGlmIChsZW4gPD0gMCkgeyByZXR1cm4gMDsgfVxuICAgIGlmIChsZW4gPiBtYXhTYWZlSW50ZWdlcikgeyByZXR1cm4gbWF4U2FmZUludGVnZXI7IH1cbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgLyoqXG4gICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBPYnNlcnZhYmxlIHNlcXVlbmNlIGZyb20gYW4gYXJyYXktbGlrZSBvciBpdGVyYWJsZSBvYmplY3QuXG4gICogQHBhcmFtIHtBbnl9IGFycmF5TGlrZSBBbiBhcnJheS1saWtlIG9yIGl0ZXJhYmxlIG9iamVjdCB0byBjb252ZXJ0IHRvIGFuIE9ic2VydmFibGUgc2VxdWVuY2UuXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gW21hcEZuXSBNYXAgZnVuY3Rpb24gdG8gY2FsbCBvbiBldmVyeSBlbGVtZW50IG9mIHRoZSBhcnJheS5cbiAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIFRoZSBjb250ZXh0IHRvIHVzZSBjYWxsaW5nIHRoZSBtYXBGbiBpZiBwcm92aWRlZC5cbiAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gT3B0aW9uYWwgc2NoZWR1bGVyIHRvIHVzZSBmb3Igc2NoZWR1bGluZy4gIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gU2NoZWR1bGVyLmN1cnJlbnRUaHJlYWQuXG4gICovXG4gIHZhciBvYnNlcnZhYmxlRnJvbSA9IE9ic2VydmFibGUuZnJvbSA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgbWFwRm4sIHRoaXNBcmcsIHNjaGVkdWxlcikge1xuICAgIGlmIChpdGVyYWJsZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2l0ZXJhYmxlIGNhbm5vdCBiZSBudWxsLicpXG4gICAgfVxuICAgIGlmIChtYXBGbiAmJiAhaXNGdW5jdGlvbihtYXBGbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWFwRm4gd2hlbiBwcm92aWRlZCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKG1hcEZuKSB7XG4gICAgICB2YXIgbWFwcGVyID0gYmluZENhbGxiYWNrKG1hcEZuLCB0aGlzQXJnLCAyKTtcbiAgICB9XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG4gICAgcmV0dXJuIG5ldyBGcm9tT2JzZXJ2YWJsZShpdGVyYWJsZSwgbWFwcGVyLCBzY2hlZHVsZXIpO1xuICB9XG5cbiAgdmFyIEZyb21BcnJheU9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoRnJvbUFycmF5T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBGcm9tQXJyYXlPYnNlcnZhYmxlKGFyZ3MsIHNjaGVkdWxlcikge1xuICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRnJvbUFycmF5T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIHNpbmsgPSBuZXcgRnJvbUFycmF5U2luayhvYnNlcnZlciwgdGhpcyk7XG4gICAgICByZXR1cm4gc2luay5ydW4oKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEZyb21BcnJheU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICBmdW5jdGlvbiBGcm9tQXJyYXlTaW5rKG9ic2VydmVyLCBwYXJlbnQpIHtcbiAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBsb29wUmVjdXJzaXZlKGFyZ3MsIG9ic2VydmVyKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICAgIHJldHVybiBmdW5jdGlvbiBsb29wIChpLCByZWN1cnNlKSB7XG4gICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICBvYnNlcnZlci5vbk5leHQoYXJnc1tpXSk7XG4gICAgICAgIHJlY3Vyc2UoaSArIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgRnJvbUFycmF5U2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUoMCwgbG9vcFJlY3Vyc2l2ZSh0aGlzLnBhcmVudC5hcmdzLCB0aGlzLm9ic2VydmVyKSk7XG4gIH07XG5cbiAgLyoqXG4gICogIENvbnZlcnRzIGFuIGFycmF5IHRvIGFuIG9ic2VydmFibGUgc2VxdWVuY2UsIHVzaW5nIGFuIG9wdGlvbmFsIHNjaGVkdWxlciB0byBlbnVtZXJhdGUgdGhlIGFycmF5LlxuICAqIEBkZXByZWNhdGVkIHVzZSBPYnNlcnZhYmxlLmZyb20gb3IgT2JzZXJ2YWJsZS5vZlxuICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gcnVuIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgaW5wdXQgc2VxdWVuY2Ugb24uXG4gICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdob3NlIGVsZW1lbnRzIGFyZSBwdWxsZWQgZnJvbSB0aGUgZ2l2ZW4gZW51bWVyYWJsZSBzZXF1ZW5jZS5cbiAgKi9cbiAgdmFyIG9ic2VydmFibGVGcm9tQXJyYXkgPSBPYnNlcnZhYmxlLmZyb21BcnJheSA9IGZ1bmN0aW9uIChhcnJheSwgc2NoZWR1bGVyKSB7XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG4gICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFycmF5LCBzY2hlZHVsZXIpXG4gIH07XG5cbiAgdmFyIE5ldmVyT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhOZXZlck9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gTmV2ZXJPYnNlcnZhYmxlKCkge1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgTmV2ZXJPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuICAgIH07XG5cbiAgICByZXR1cm4gTmV2ZXJPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIE5FVkVSX09CU0VSVkFCTEUgPSBuZXcgTmV2ZXJPYnNlcnZhYmxlKCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBub24tdGVybWluYXRpbmcgb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGVub3RlIGFuIGluZmluaXRlIGR1cmF0aW9uIChlLmcuIHdoZW4gdXNpbmcgcmVhY3RpdmUgam9pbnMpLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBvYnNlcnZlcnMgd2lsbCBuZXZlciBnZXQgY2FsbGVkLlxuICAgKi9cbiAgdmFyIG9ic2VydmFibGVOZXZlciA9IE9ic2VydmFibGUubmV2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE5FVkVSX09CU0VSVkFCTEU7XG4gIH07XG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZU9mIChzY2hlZHVsZXIsIGFycmF5KSB7XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG4gICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFycmF5LCBzY2hlZHVsZXIpO1xuICB9XG5cbiAgLyoqXG4gICogIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgT2JzZXJ2YWJsZSBpbnN0YW5jZSB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgcmVnYXJkbGVzcyBvZiBudW1iZXIgb3IgdHlwZSBvZiB0aGUgYXJndW1lbnRzLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgcHVsbGVkIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50cy5cbiAgKi9cbiAgT2JzZXJ2YWJsZS5vZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFyZ3MsIGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIpO1xuICB9O1xuXG4gIC8qKlxuICAqICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IE9ic2VydmFibGUgaW5zdGFuY2Ugd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMsIHJlZ2FyZGxlc3Mgb2YgbnVtYmVyIG9yIHR5cGUgb2YgdGhlIGFyZ3VtZW50cy5cbiAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIEEgc2NoZWR1bGVyIHRvIHVzZSBmb3Igc2NoZWR1bGluZyB0aGUgYXJndW1lbnRzLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgcHVsbGVkIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50cy5cbiAgKi9cbiAgT2JzZXJ2YWJsZS5vZldpdGhTY2hlZHVsZXIgPSBmdW5jdGlvbiAoc2NoZWR1bGVyKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgZm9yKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldOyB9XG4gICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFyZ3MsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgdmFyIFBhaXJzT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhQYWlyc09ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gUGFpcnNPYnNlcnZhYmxlKG9iaiwgc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLm9iaiA9IG9iajtcbiAgICAgIHRoaXMua2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFBhaXJzT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIHNpbmsgPSBuZXcgUGFpcnNTaW5rKG9ic2VydmVyLCB0aGlzKTtcbiAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gUGFpcnNPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgZnVuY3Rpb24gUGFpcnNTaW5rKG9ic2VydmVyLCBwYXJlbnQpIHtcbiAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIH1cblxuICBQYWlyc1NpbmsucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmVyLCBvYmogPSB0aGlzLnBhcmVudC5vYmosIGtleXMgPSB0aGlzLnBhcmVudC5rZXlzLCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBmdW5jdGlvbiBsb29wUmVjdXJzaXZlKGksIHJlY3Vyc2UpIHtcbiAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBvYnNlcnZlci5vbk5leHQoW2tleSwgb2JqW2tleV1dKTtcbiAgICAgICAgcmVjdXJzZShpICsgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYnNlcnZlci5vbkNvbXBsZXRlZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUoMCwgbG9vcFJlY3Vyc2l2ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYW4gb2JqZWN0IGludG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBba2V5LCB2YWx1ZV0gcGFpcnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gU2NoZWR1bGVyIHRvIHJ1biB0aGUgZW51bWVyYXRpb24gb2YgdGhlIGlucHV0IHNlcXVlbmNlIG9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBba2V5LCB2YWx1ZV0gcGFpcnMgZnJvbSB0aGUgb2JqZWN0LlxuICAgKi9cbiAgT2JzZXJ2YWJsZS5wYWlycyA9IGZ1bmN0aW9uIChvYmosIHNjaGVkdWxlcikge1xuICAgIHNjaGVkdWxlciB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG4gICAgcmV0dXJuIG5ldyBQYWlyc09ic2VydmFibGUob2JqLCBzY2hlZHVsZXIpO1xuICB9O1xuXG4gICAgdmFyIFJhbmdlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhSYW5nZU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gUmFuZ2VPYnNlcnZhYmxlKHN0YXJ0LCBjb3VudCwgc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICB0aGlzLnJhbmdlQ291bnQgPSBjb3VudDtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgUmFuZ2VPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2YXIgc2luayA9IG5ldyBSYW5nZVNpbmsob2JzZXJ2ZXIsIHRoaXMpO1xuICAgICAgcmV0dXJuIHNpbmsucnVuKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBSYW5nZU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgUmFuZ2VTaW5rID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSYW5nZVNpbmsob2JzZXJ2ZXIsIHBhcmVudCkge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9vcFJlY3Vyc2l2ZShzdGFydCwgY291bnQsIG9ic2VydmVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gbG9vcCAoaSwgcmVjdXJzZSkge1xuICAgICAgICBpZiAoaSA8IGNvdW50KSB7XG4gICAgICAgICAgb2JzZXJ2ZXIub25OZXh0KHN0YXJ0ICsgaSk7XG4gICAgICAgICAgcmVjdXJzZShpICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBSYW5nZVNpbmsucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUoXG4gICAgICAgIDAsXG4gICAgICAgIGxvb3BSZWN1cnNpdmUodGhpcy5wYXJlbnQuc3RhcnQsIHRoaXMucGFyZW50LnJhbmdlQ291bnQsIHRoaXMub2JzZXJ2ZXIpXG4gICAgICApO1xuICAgIH07XG5cbiAgICByZXR1cm4gUmFuZ2VTaW5rO1xuICB9KCkpO1xuXG4gIC8qKlxuICAqICBHZW5lcmF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBpbnRlZ3JhbCBudW1iZXJzIHdpdGhpbiBhIHNwZWNpZmllZCByYW5nZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2hlZHVsZXIgdG8gc2VuZCBvdXQgb2JzZXJ2ZXIgbWVzc2FnZXMuXG4gICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IFRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW50ZWdlciBpbiB0aGUgc2VxdWVuY2UuXG4gICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2Ygc2VxdWVudGlhbCBpbnRlZ2VycyB0byBnZW5lcmF0ZS5cbiAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gU2NoZWR1bGVyIHRvIHJ1biB0aGUgZ2VuZXJhdG9yIGxvb3Agb24uIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIFNjaGVkdWxlci5jdXJyZW50VGhyZWFkLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgYSByYW5nZSBvZiBzZXF1ZW50aWFsIGludGVncmFsIG51bWJlcnMuXG4gICovXG4gIE9ic2VydmFibGUucmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGNvdW50LCBzY2hlZHVsZXIpIHtcbiAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyKTtcbiAgICByZXR1cm4gbmV3IFJhbmdlT2JzZXJ2YWJsZShzdGFydCwgY291bnQsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgdmFyIFJlcGVhdE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoUmVwZWF0T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBSZXBlYXRPYnNlcnZhYmxlKHZhbHVlLCByZXBlYXRDb3VudCwgc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnJlcGVhdENvdW50ID0gcmVwZWF0Q291bnQgPT0gbnVsbCA/IC0xIDogcmVwZWF0Q291bnQ7XG4gICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFJlcGVhdE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBzaW5rID0gbmV3IFJlcGVhdFNpbmsob2JzZXJ2ZXIsIHRoaXMpO1xuICAgICAgcmV0dXJuIHNpbmsucnVuKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBSZXBlYXRPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgZnVuY3Rpb24gUmVwZWF0U2luayhvYnNlcnZlciwgcGFyZW50KSB7XG4gICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB9XG5cbiAgUmVwZWF0U2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvYnNlcnZlciA9IHRoaXMub2JzZXJ2ZXIsIHZhbHVlID0gdGhpcy5wYXJlbnQudmFsdWU7XG4gICAgZnVuY3Rpb24gbG9vcFJlY3Vyc2l2ZShpLCByZWN1cnNlKSB7XG4gICAgICBpZiAoaSA9PT0gLTEgfHwgaSA+IDApIHtcbiAgICAgICAgb2JzZXJ2ZXIub25OZXh0KHZhbHVlKTtcbiAgICAgICAgaSA+IDAgJiYgaS0tO1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IDApIHsgcmV0dXJuIG9ic2VydmVyLm9uQ29tcGxldGVkKCk7IH1cbiAgICAgIHJlY3Vyc2UoaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyZW50LnNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSh0aGlzLnBhcmVudC5yZXBlYXRDb3VudCwgbG9vcFJlY3Vyc2l2ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICBHZW5lcmF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHJlcGVhdHMgdGhlIGdpdmVuIGVsZW1lbnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMsIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2NoZWR1bGVyIHRvIHNlbmQgb3V0IG9ic2VydmVyIG1lc3NhZ2VzLlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBFbGVtZW50IHRvIHJlcGVhdC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHJlcGVhdENvdW50IFtPcHRpb25hXSBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBlbGVtZW50LiBJZiBub3Qgc3BlY2lmaWVkLCByZXBlYXRzIGluZGVmaW5pdGVseS5cbiAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciBTY2hlZHVsZXIgdG8gcnVuIHRoZSBwcm9kdWNlciBsb29wIG9uLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBTY2hlZHVsZXIuaW1tZWRpYXRlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHJlcGVhdHMgdGhlIGdpdmVuIGVsZW1lbnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMuXG4gICAqL1xuICBPYnNlcnZhYmxlLnJlcGVhdCA9IGZ1bmN0aW9uICh2YWx1ZSwgcmVwZWF0Q291bnQsIHNjaGVkdWxlcikge1xuICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIpO1xuICAgIHJldHVybiBuZXcgUmVwZWF0T2JzZXJ2YWJsZSh2YWx1ZSwgcmVwZWF0Q291bnQsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgdmFyIEp1c3RPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKEp1c3RPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEp1c3RPYnNlcnZhYmxlKHZhbHVlLCBzY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSnVzdE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBzaW5rID0gbmV3IEp1c3RTaW5rKG9ic2VydmVyLCB0aGlzLnZhbHVlLCB0aGlzLnNjaGVkdWxlcik7XG4gICAgICByZXR1cm4gc2luay5ydW4oKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gSnVzdFNpbmsob2JzZXJ2ZXIsIHZhbHVlLCBzY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlSXRlbShzLCBzdGF0ZSkge1xuICAgICAgdmFyIHZhbHVlID0gc3RhdGVbMF0sIG9ic2VydmVyID0gc3RhdGVbMV07XG4gICAgICBvYnNlcnZlci5vbk5leHQodmFsdWUpO1xuICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG4gICAgfVxuXG4gICAgSnVzdFNpbmsucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IFt0aGlzLnZhbHVlLCB0aGlzLm9ic2VydmVyXTtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlciA9PT0gaW1tZWRpYXRlU2NoZWR1bGVyID9cbiAgICAgICAgc2NoZWR1bGVJdGVtKG51bGwsIHN0YXRlKSA6XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKHN0YXRlLCBzY2hlZHVsZUl0ZW0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gSnVzdE9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGVsZW1lbnQsIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2NoZWR1bGVyIHRvIHNlbmQgb3V0IG9ic2VydmVyIG1lc3NhZ2VzLlxuICAgKiAgVGhlcmUgaXMgYW4gYWxpYXMgY2FsbGVkICdqdXN0JyBvciBicm93c2VycyA8SUU5LlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBTaW5nbGUgZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBzY2hlZHVsZXIgU2NoZWR1bGVyIHRvIHNlbmQgdGhlIHNpbmdsZSBlbGVtZW50IG9uLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBTY2hlZHVsZXIuaW1tZWRpYXRlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBzaW5nbGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAqL1xuICB2YXIgb2JzZXJ2YWJsZVJldHVybiA9IE9ic2VydmFibGVbJ3JldHVybiddID0gT2JzZXJ2YWJsZS5qdXN0ID0gZnVuY3Rpb24gKHZhbHVlLCBzY2hlZHVsZXIpIHtcbiAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBpbW1lZGlhdGVTY2hlZHVsZXIpO1xuICAgIHJldHVybiBuZXcgSnVzdE9ic2VydmFibGUodmFsdWUsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgdmFyIFRocm93T2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUaHJvd09ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gVGhyb3dPYnNlcnZhYmxlKGVycm9yLCBzY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgVGhyb3dPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBzaW5rID0gbmV3IFRocm93U2luayhvLCB0aGlzKTtcbiAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBUaHJvd1NpbmsobywgcCkge1xuICAgICAgdGhpcy5vID0gbztcbiAgICAgIHRoaXMucCA9IHA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2NoZWR1bGVJdGVtKHMsIHN0YXRlKSB7XG4gICAgICB2YXIgZSA9IHN0YXRlWzBdLCBvID0gc3RhdGVbMV07XG4gICAgICBvLm9uRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgVGhyb3dTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wLnNjaGVkdWxlci5zY2hlZHVsZShbdGhpcy5wLmVycm9yLCB0aGlzLm9dLCBzY2hlZHVsZUl0ZW0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gVGhyb3dPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgLyoqXG4gICAqICBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCB0ZXJtaW5hdGVzIHdpdGggYW4gZXhjZXB0aW9uLCB1c2luZyB0aGUgc3BlY2lmaWVkIHNjaGVkdWxlciB0byBzZW5kIG91dCB0aGUgc2luZ2xlIG9uRXJyb3IgbWVzc2FnZS5cbiAgICogIFRoZXJlIGlzIGFuIGFsaWFzIHRvIHRoaXMgbWV0aG9kIGNhbGxlZCAndGhyb3dFcnJvcicgZm9yIGJyb3dzZXJzIDxJRTkuXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGVycm9yIEFuIG9iamVjdCB1c2VkIGZvciB0aGUgc2VxdWVuY2UncyB0ZXJtaW5hdGlvbi5cbiAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciBTY2hlZHVsZXIgdG8gc2VuZCB0aGUgZXhjZXB0aW9uYWwgdGVybWluYXRpb24gY2FsbCBvbi4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gU2NoZWR1bGVyLmltbWVkaWF0ZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgdGVybWluYXRlcyBleGNlcHRpb25hbGx5IHdpdGggdGhlIHNwZWNpZmllZCBleGNlcHRpb24gb2JqZWN0LlxuICAgKi9cbiAgdmFyIG9ic2VydmFibGVUaHJvdyA9IE9ic2VydmFibGVbJ3Rocm93J10gPSBmdW5jdGlvbiAoZXJyb3IsIHNjaGVkdWxlcikge1xuICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGltbWVkaWF0ZVNjaGVkdWxlcik7XG4gICAgcmV0dXJuIG5ldyBUaHJvd09ic2VydmFibGUoZXJyb3IsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgdmFyIENhdGNoT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQ2F0Y2hPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIENhdGNoT2JzZXJ2YWJsZShzb3VyY2UsIGZuKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuX2ZuID0gZm47XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBDYXRjaE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGQxID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksIHN1YnNjcmlwdGlvbiA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG4gICAgICBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShkMSk7XG4gICAgICBkMS5zZXREaXNwb3NhYmxlKHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgQ2F0Y2hPYnNlcnZlcihvLCBzdWJzY3JpcHRpb24sIHRoaXMuX2ZuKSkpO1xuICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENhdGNoT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBDYXRjaE9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKENhdGNoT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ2F0Y2hPYnNlcnZlcihvLCBzLCBmbikge1xuICAgICAgdGhpcy5fbyA9IG87XG4gICAgICB0aGlzLl9zID0gcztcbiAgICAgIHRoaXMuX2ZuID0gZm47XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBDYXRjaE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHsgdGhpcy5fby5vbk5leHQoeCk7IH07XG4gICAgQ2F0Y2hPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuICAgIENhdGNoT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnlDYXRjaCh0aGlzLl9mbikoZSk7XG4gICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlc3VsdC5lKTsgfVxuICAgICAgaXNQcm9taXNlKHJlc3VsdCkgJiYgKHJlc3VsdCA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShyZXN1bHQpKTtcblxuICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIHRoaXMuX3Muc2V0RGlzcG9zYWJsZShkKTtcbiAgICAgIGQuc2V0RGlzcG9zYWJsZShyZXN1bHQuc3Vic2NyaWJlKHRoaXMuX28pKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENhdGNoT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiBDb250aW51ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZXhjZXB0aW9uIHdpdGggdGhlIG5leHQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogQHBhcmFtIHtNaXhlZH0gaGFuZGxlck9yU2Vjb25kIEV4Y2VwdGlvbiBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGdpdmVuIHRoZSBlcnJvciB0aGF0IG9jY3VycmVkIGluIHRoZSBmaXJzdCBzZXF1ZW5jZSwgb3IgYSBzZWNvbmQgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB1c2VkIHRvIHByb2R1Y2UgcmVzdWx0cyB3aGVuIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgZmlyc3Qgc2VxdWVuY2UncyBlbGVtZW50cywgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzIG9mIHRoZSBoYW5kbGVyIHNlcXVlbmNlIGluIGNhc2UgYW4gZXhjZXB0aW9uIG9jY3VycmVkLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvWydjYXRjaCddID0gZnVuY3Rpb24gKGhhbmRsZXJPclNlY29uZCkge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKGhhbmRsZXJPclNlY29uZCkgPyBuZXcgQ2F0Y2hPYnNlcnZhYmxlKHRoaXMsIGhhbmRsZXJPclNlY29uZCkgOiBvYnNlcnZhYmxlQ2F0Y2goW3RoaXMsIGhhbmRsZXJPclNlY29uZF0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb250aW51ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZXhjZXB0aW9uIHdpdGggdGhlIG5leHQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogQHBhcmFtIHtBcnJheSB8IEFyZ3VtZW50c30gYXJncyBBcmd1bWVudHMgb3IgYW4gYXJyYXkgdG8gdXNlIGFzIHRoZSBuZXh0IHNlcXVlbmNlIGlmIGFuIGVycm9yIG9jY3Vycy5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyBlbGVtZW50cyBmcm9tIGNvbnNlY3V0aXZlIHNvdXJjZSBzZXF1ZW5jZXMgdW50aWwgYSBzb3VyY2Ugc2VxdWVuY2UgdGVybWluYXRlcyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICB2YXIgb2JzZXJ2YWJsZUNhdGNoID0gT2JzZXJ2YWJsZVsnY2F0Y2gnXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaXRlbXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgaXRlbXMgPSBhcmd1bWVudHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaXRlbXMgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBpdGVtc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIH1cbiAgICByZXR1cm4gZW51bWVyYWJsZU9mKGl0ZW1zKS5jYXRjaEVycm9yKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gb25lIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgdXNpbmcgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHdoZW5ldmVyIGFueSBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgb3IgUHJvbWlzZXMgcHJvZHVjZXMgYW4gZWxlbWVudC5cbiAgICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYW4gYXJndW1lbnQgbGlzdCBvZiBvYnNlcnZhYmxlcyBvciBhbiBhcnJheS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogMSAtIG9icyA9IG9ic2VydmFibGUuY29tYmluZUxhdGVzdChvYnMxLCBvYnMyLCBvYnMzLCBmdW5jdGlvbiAobzEsIG8yLCBvMykgeyByZXR1cm4gbzEgKyBvMiArIG8zOyB9KTtcbiAgICogMiAtIG9icyA9IG9ic2VydmFibGUuY29tYmluZUxhdGVzdChbb2JzMSwgb2JzMiwgb2JzM10sIGZ1bmN0aW9uIChvMSwgbzIsIG8zKSB7IHJldHVybiBvMSArIG8yICsgbzM7IH0pO1xuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY29tYmluaW5nIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2VzIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVzdWx0IHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLmNvbWJpbmVMYXRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XG4gICAgICBhcmdzWzBdLnVuc2hpZnQodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QuYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gZmFsc2VGYWN0b3J5KCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgZnVuY3Rpb24gYXJndW1lbnRzVG9BcnJheSgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgcmV0dXJuIGFyZ3M7XG4gIH1cblxuICB2YXIgQ29tYmluZUxhdGVzdE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQ29tYmluZUxhdGVzdE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ29tYmluZUxhdGVzdE9ic2VydmFibGUocGFyYW1zLCBjYikge1xuICAgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuICAgICAgdGhpcy5fY2IgPSBjYjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIENvbWJpbmVMYXRlc3RPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBsZW4gPSB0aGlzLl9wYXJhbXMubGVuZ3RoLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXkobGVuKTtcblxuICAgICAgdmFyIHN0YXRlID0ge1xuICAgICAgICBoYXNWYWx1ZTogYXJyYXlJbml0aWFsaXplKGxlbiwgZmFsc2VGYWN0b3J5KSxcbiAgICAgICAgaGFzVmFsdWVBbGw6IGZhbHNlLFxuICAgICAgICBpc0RvbmU6IGFycmF5SW5pdGlhbGl6ZShsZW4sIGZhbHNlRmFjdG9yeSksXG4gICAgICAgIHZhbHVlczogbmV3IEFycmF5KGxlbilcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuX3BhcmFtc1tpXSwgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgICAgIHN1YnNjcmlwdGlvbnNbaV0gPSBzYWQ7XG4gICAgICAgIGlzUHJvbWlzZShzb3VyY2UpICYmIChzb3VyY2UgPSBvYnNlcnZhYmxlRnJvbVByb21pc2Uoc291cmNlKSk7XG4gICAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUobmV3IENvbWJpbmVMYXRlc3RPYnNlcnZlcihvYnNlcnZlciwgaSwgdGhpcy5fY2IsIHN0YXRlKSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbnMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gQ29tYmluZUxhdGVzdE9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgQ29tYmluZUxhdGVzdE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhDb21iaW5lTGF0ZXN0T2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ29tYmluZUxhdGVzdE9ic2VydmVyKG8sIGksIGNiLCBzdGF0ZSkge1xuICAgICAgdGhpcy5fbyA9IG87XG4gICAgICB0aGlzLl9pID0gaTtcbiAgICAgIHRoaXMuX2NiID0gY2I7XG4gICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm90VGhlU2FtZShpKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHgsIGopIHtcbiAgICAgICAgcmV0dXJuIGogIT09IGk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIENvbWJpbmVMYXRlc3RPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB0aGlzLl9zdGF0ZS52YWx1ZXNbdGhpcy5faV0gPSB4O1xuICAgICAgdGhpcy5fc3RhdGUuaGFzVmFsdWVbdGhpcy5faV0gPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuX3N0YXRlLmhhc1ZhbHVlQWxsIHx8ICh0aGlzLl9zdGF0ZS5oYXNWYWx1ZUFsbCA9IHRoaXMuX3N0YXRlLmhhc1ZhbHVlLmV2ZXJ5KGlkZW50aXR5KSkpIHtcbiAgICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMuX2NiKS5hcHBseShudWxsLCB0aGlzLl9zdGF0ZS52YWx1ZXMpO1xuICAgICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgICB0aGlzLl9vLm9uTmV4dChyZXMpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9zdGF0ZS5pc0RvbmUuZmlsdGVyKG5vdFRoZVNhbWUodGhpcy5faSkpLmV2ZXJ5KGlkZW50aXR5KSkge1xuICAgICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIENvbWJpbmVMYXRlc3RPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuICAgIH07XG5cbiAgICBDb21iaW5lTGF0ZXN0T2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX3N0YXRlLmlzRG9uZVt0aGlzLl9pXSA9IHRydWU7XG4gICAgICB0aGlzLl9zdGF0ZS5pc0RvbmUuZXZlcnkoaWRlbnRpdHkpICYmIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENvbWJpbmVMYXRlc3RPYnNlcnZlcjtcbiAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cbiAgLyoqXG4gICogTWVyZ2VzIHRoZSBzcGVjaWZpZWQgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBvbmUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSB1c2luZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gd2hlbmV2ZXIgYW55IG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlcyBvciBQcm9taXNlcyBwcm9kdWNlcyBhbiBlbGVtZW50LlxuICAqXG4gICogQGV4YW1wbGVcbiAgKiAxIC0gb2JzID0gUnguT2JzZXJ2YWJsZS5jb21iaW5lTGF0ZXN0KG9iczEsIG9iczIsIG9iczMsIGZ1bmN0aW9uIChvMSwgbzIsIG8zKSB7IHJldHVybiBvMSArIG8yICsgbzM7IH0pO1xuICAqIDIgLSBvYnMgPSBSeC5PYnNlcnZhYmxlLmNvbWJpbmVMYXRlc3QoW29iczEsIG9iczIsIG9iczNdLCBmdW5jdGlvbiAobzEsIG8yLCBvMykgeyByZXR1cm4gbzEgKyBvMiArIG8zOyB9KTtcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY29tYmluaW5nIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2VzIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVzdWx0IHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAqL1xuICB2YXIgY29tYmluZUxhdGVzdCA9IE9ic2VydmFibGUuY29tYmluZUxhdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgdmFyIHJlc3VsdFNlbGVjdG9yID0gaXNGdW5jdGlvbihhcmdzW2xlbiAtIDFdKSA/IGFyZ3MucG9wKCkgOiBhcmd1bWVudHNUb0FycmF5O1xuICAgIEFycmF5LmlzQXJyYXkoYXJnc1swXSkgJiYgKGFyZ3MgPSBhcmdzWzBdKTtcbiAgICByZXR1cm4gbmV3IENvbWJpbmVMYXRlc3RPYnNlcnZhYmxlKGFyZ3MsIHJlc3VsdFNlbGVjdG9yKTtcbiAgfTtcblxuICAvKipcbiAgICogQ29uY2F0ZW5hdGVzIGFsbCB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuICBUaGlzIHRha2VzIGluIGVpdGhlciBhbiBhcnJheSBvciB2YXJpYWJsZSBhcmd1bWVudHMgdG8gY29uY2F0ZW5hdGUuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGVhY2ggZ2l2ZW4gc2VxdWVuY2UsIGluIHNlcXVlbnRpYWwgb3JkZXIuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uY29uY2F0ID0gZnVuY3Rpb24gKCkge1xuICAgIGZvcih2YXIgYXJncyA9IFtdLCBpID0gMCwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOyB9XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiBvYnNlcnZhYmxlQ29uY2F0LmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9O1xuXG4gIHZhciBDb25jYXRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKENvbmNhdE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ29uY2F0T2JzZXJ2YWJsZShzb3VyY2VzKSB7XG4gICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgQ29uY2F0T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uKG8pIHtcbiAgICAgIHZhciBzaW5rID0gbmV3IENvbmNhdFNpbmsodGhpcy5zb3VyY2VzLCBvKTtcbiAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBDb25jYXRTaW5rKHNvdXJjZXMsIG8pIHtcbiAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7XG4gICAgICB0aGlzLm8gPSBvO1xuICAgIH1cbiAgICBDb25jYXRTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaXNEaXNwb3NlZCwgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKSwgc291cmNlcyA9IHRoaXMuc291cmNlcywgbGVuZ3RoID0gc291cmNlcy5sZW5ndGgsIG8gPSB0aGlzLm87XG4gICAgICB2YXIgY2FuY2VsYWJsZSA9IGltbWVkaWF0ZVNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSgwLCBmdW5jdGlvbiAoaSwgc2VsZikge1xuICAgICAgICBpZiAoaXNEaXNwb3NlZCkgeyByZXR1cm47IH1cbiAgICAgICAgaWYgKGkgPT09IGxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBvLm9uQ29tcGxldGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBwcm9taXNlXG4gICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBzb3VyY2VzW2ldO1xuICAgICAgICBpc1Byb21pc2UoY3VycmVudFZhbHVlKSAmJiAoY3VycmVudFZhbHVlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKGN1cnJlbnRWYWx1ZSkpO1xuXG4gICAgICAgIHZhciBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKGQpO1xuICAgICAgICBkLnNldERpc3Bvc2FibGUoY3VycmVudFZhbHVlLnN1YnNjcmliZShcbiAgICAgICAgICBmdW5jdGlvbiAoeCkgeyBvLm9uTmV4dCh4KTsgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sXG4gICAgICAgICAgZnVuY3Rpb24gKCkgeyBzZWxmKGkgKyAxKTsgfVxuICAgICAgICApKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoc3Vic2NyaXB0aW9uLCBjYW5jZWxhYmxlLCBkaXNwb3NhYmxlQ3JlYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICB9KSk7XG4gICAgfTtcblxuXG4gICAgcmV0dXJuIENvbmNhdE9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgICogQ29uY2F0ZW5hdGVzIGFsbCB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuXG4gICAqIEBwYXJhbSB7QXJyYXkgfCBBcmd1bWVudHN9IGFyZ3MgQXJndW1lbnRzIG9yIGFuIGFycmF5IHRvIGNvbmNhdCB0byB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgZWFjaCBnaXZlbiBzZXF1ZW5jZSwgaW4gc2VxdWVudGlhbCBvcmRlci5cbiAgICovXG4gIHZhciBvYnNlcnZhYmxlQ29uY2F0ID0gT2JzZXJ2YWJsZS5jb25jYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3M7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgYXJncyA9IGFyZ3VtZW50c1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ29uY2F0T2JzZXJ2YWJsZShhcmdzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ29uY2F0ZW5hdGVzIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugb2Ygb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGVhY2ggb2JzZXJ2ZWQgaW5uZXIgc2VxdWVuY2UsIGluIHNlcXVlbnRpYWwgb3JkZXIuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uY29uY2F0QWxsID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm1lcmdlKDEpO1xuICB9O1xuXG4gIHZhciBNZXJnZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKE1lcmdlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIE1lcmdlT2JzZXJ2YWJsZShzb3VyY2UsIG1heENvbmN1cnJlbnQpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5tYXhDb25jdXJyZW50ID0gbWF4Q29uY3VycmVudDtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIE1lcmdlT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uKG9ic2VydmVyKSB7XG4gICAgICB2YXIgZyA9IG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKCk7XG4gICAgICBnLmFkZCh0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IE1lcmdlT2JzZXJ2ZXIob2JzZXJ2ZXIsIHRoaXMubWF4Q29uY3VycmVudCwgZykpKTtcbiAgICAgIHJldHVybiBnO1xuICAgIH07XG5cbiAgICByZXR1cm4gTWVyZ2VPYnNlcnZhYmxlO1xuXG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgTWVyZ2VPYnNlcnZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWVyZ2VPYnNlcnZlcihvLCBtYXgsIGcpIHtcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLm1heCA9IG1heDtcbiAgICAgIHRoaXMuZyA9IGc7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMucSA9IFtdO1xuICAgICAgdGhpcy5hY3RpdmVDb3VudCA9IDA7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5oYW5kbGVTdWJzY3JpYmUgPSBmdW5jdGlvbiAoeHMpIHtcbiAgICAgIHZhciBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIHRoaXMuZy5hZGQoc2FkKTtcbiAgICAgIGlzUHJvbWlzZSh4cykgJiYgKHhzID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHhzKSk7XG4gICAgICBzYWQuc2V0RGlzcG9zYWJsZSh4cy5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIodGhpcywgc2FkKSkpO1xuICAgIH07XG4gICAgTWVyZ2VPYnNlcnZlci5wcm90b3R5cGUub25OZXh0ID0gZnVuY3Rpb24gKGlubmVyU291cmNlKSB7XG4gICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmKHRoaXMuYWN0aXZlQ291bnQgPCB0aGlzLm1heCkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ291bnQrKztcbiAgICAgICAgICB0aGlzLmhhbmRsZVN1YnNjcmliZShpbm5lclNvdXJjZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xLnB1c2goaW5uZXJTb3VyY2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgTWVyZ2VPYnNlcnZlci5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ291bnQgPT09IDAgJiYgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcbiAgICAgIE1lcmdlT2JzZXJ2ZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcblxuICAgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihwYXJlbnQsIHNhZCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5zYWQgPSBzYWQ7XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBmdW5jdGlvbiAoeCkgeyBpZighdGhpcy5pc1N0b3BwZWQpIHsgdGhpcy5wYXJlbnQuby5vbk5leHQoeCk7IH0gfTtcbiAgICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgICAgIHBhcmVudC5nLnJlbW92ZSh0aGlzLnNhZCk7XG4gICAgICAgICAgaWYgKHBhcmVudC5xLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBhcmVudC5oYW5kbGVTdWJzY3JpYmUocGFyZW50LnEuc2hpZnQoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5hY3RpdmVDb3VudC0tO1xuICAgICAgICAgICAgcGFyZW50LmRvbmUgJiYgcGFyZW50LmFjdGl2ZUNvdW50ID09PSAwICYmIHBhcmVudC5vLm9uQ29tcGxldGVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH07XG4gICAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnBhcmVudC5vLm9uRXJyb3IoZSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gTWVyZ2VPYnNlcnZlcjtcbiAgfSgpKTtcblxuXG5cblxuXG4gIC8qKlxuICAqIE1lcmdlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9mIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgbGltaXRpbmcgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHN1YnNjcmlwdGlvbnMgdG8gaW5uZXIgc2VxdWVuY2VzLlxuICAqIE9yIG1lcmdlcyB0d28gb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBhIHNpbmdsZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqXG4gICogQGV4YW1wbGVcbiAgKiAxIC0gbWVyZ2VkID0gc291cmNlcy5tZXJnZSgxKTtcbiAgKiAyIC0gbWVyZ2VkID0gc291cmNlLm1lcmdlKG90aGVyU291cmNlKTtcbiAgKiBAcGFyYW0ge01peGVkfSBbbWF4Q29uY3VycmVudE9yT3RoZXJdIE1heGltdW0gbnVtYmVyIG9mIGlubmVyIG9ic2VydmFibGUgc2VxdWVuY2VzIGJlaW5nIHN1YnNjcmliZWQgdG8gY29uY3VycmVudGx5IG9yIHRoZSBzZWNvbmQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBtZXJnZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBpbm5lciBzZXF1ZW5jZXMuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5tZXJnZSA9IGZ1bmN0aW9uIChtYXhDb25jdXJyZW50T3JPdGhlcikge1xuICAgIHJldHVybiB0eXBlb2YgbWF4Q29uY3VycmVudE9yT3RoZXIgIT09ICdudW1iZXInID9cbiAgICAgIG9ic2VydmFibGVNZXJnZSh0aGlzLCBtYXhDb25jdXJyZW50T3JPdGhlcikgOlxuICAgICAgbmV3IE1lcmdlT2JzZXJ2YWJsZSh0aGlzLCBtYXhDb25jdXJyZW50T3JPdGhlcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1lcmdlcyBhbGwgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gYSBzaW5nbGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogVGhlIHNjaGVkdWxlciBpcyBvcHRpb25hbCBhbmQgaWYgbm90IHNwZWNpZmllZCwgdGhlIGltbWVkaWF0ZSBzY2hlZHVsZXIgaXMgdXNlZC5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgbWVyZ2VzIHRoZSBlbGVtZW50cyBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuXG4gICAqL1xuICB2YXIgb2JzZXJ2YWJsZU1lcmdlID0gT2JzZXJ2YWJsZS5tZXJnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2NoZWR1bGVyLCBzb3VyY2VzID0gW10sIGksIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKCFhcmd1bWVudHNbMF0pIHtcbiAgICAgIHNjaGVkdWxlciA9IGltbWVkaWF0ZVNjaGVkdWxlcjtcbiAgICAgIGZvcihpID0gMTsgaSA8IGxlbjsgaSsrKSB7IHNvdXJjZXMucHVzaChhcmd1bWVudHNbaV0pOyB9XG4gICAgfSBlbHNlIGlmIChpc1NjaGVkdWxlcihhcmd1bWVudHNbMF0pKSB7XG4gICAgICBzY2hlZHVsZXIgPSBhcmd1bWVudHNbMF07XG4gICAgICBmb3IoaSA9IDE7IGkgPCBsZW47IGkrKykgeyBzb3VyY2VzLnB1c2goYXJndW1lbnRzW2ldKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZXIgPSBpbW1lZGlhdGVTY2hlZHVsZXI7XG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeyBzb3VyY2VzLnB1c2goYXJndW1lbnRzW2ldKTsgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VzWzBdKSkge1xuICAgICAgc291cmNlcyA9IHNvdXJjZXNbMF07XG4gICAgfVxuICAgIHJldHVybiBvYnNlcnZhYmxlT2Yoc2NoZWR1bGVyLCBzb3VyY2VzKS5tZXJnZUFsbCgpO1xuICB9O1xuXG4gIHZhciBDb21wb3NpdGVFcnJvciA9IFJ4LkNvbXBvc2l0ZUVycm9yID0gZnVuY3Rpb24oZXJyb3JzKSB7XG4gICAgdGhpcy5pbm5lckVycm9ycyA9IGVycm9ycztcbiAgICB0aGlzLm1lc3NhZ2UgPSAnVGhpcyBjb250YWlucyBtdWx0aXBsZSBlcnJvcnMuIENoZWNrIHRoZSBpbm5lckVycm9ycyc7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgfTtcbiAgQ29tcG9zaXRlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuICBDb21wb3NpdGVFcnJvci5wcm90b3R5cGUubmFtZSA9ICdDb21wb3NpdGVFcnJvcic7XG5cbiAgdmFyIE1lcmdlRGVsYXlFcnJvck9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoTWVyZ2VEZWxheUVycm9yT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlKHNvdXJjZSkge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBncm91cCA9IG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKCksXG4gICAgICAgIG0gPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKSxcbiAgICAgICAgc3RhdGUgPSB7IGlzU3RvcHBlZDogZmFsc2UsIGVycm9yczogW10sIG86IG8gfTtcblxuICAgICAgZ3JvdXAuYWRkKG0pO1xuICAgICAgbS5zZXREaXNwb3NhYmxlKHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgTWVyZ2VEZWxheUVycm9yT2JzZXJ2ZXIoZ3JvdXAsIHN0YXRlKSkpO1xuXG4gICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfTtcblxuICAgIHJldHVybiBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIE1lcmdlRGVsYXlFcnJvck9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKE1lcmdlRGVsYXlFcnJvck9ic2VydmVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIE1lcmdlRGVsYXlFcnJvck9ic2VydmVyKGdyb3VwLCBzdGF0ZSkge1xuICAgICAgdGhpcy5fZ3JvdXAgPSBncm91cDtcbiAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRDb21wbGV0aW9uKG8sIGVycm9ycykge1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgfSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIG8ub25FcnJvcihlcnJvcnNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgby5vbkVycm9yKG5ldyBDb21wb3NpdGVFcnJvcihlcnJvcnMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBNZXJnZURlbGF5RXJyb3JPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB2YXIgaW5uZXIgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIHRoaXMuX2dyb3VwLmFkZChpbm5lcik7XG5cbiAgICAgIC8vIENoZWNrIGZvciBwcm9taXNlcyBzdXBwb3J0XG4gICAgICBpc1Byb21pc2UoeCkgJiYgKHggPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoeCkpO1xuICAgICAgaW5uZXIuc2V0RGlzcG9zYWJsZSh4LnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihpbm5lciwgdGhpcy5fZ3JvdXAsIHRoaXMuX3N0YXRlKSkpO1xuICAgIH07XG5cbiAgICBNZXJnZURlbGF5RXJyb3JPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fc3RhdGUuZXJyb3JzLnB1c2goZSk7XG4gICAgICB0aGlzLl9zdGF0ZS5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fZ3JvdXAubGVuZ3RoID09PSAxICYmIHNldENvbXBsZXRpb24odGhpcy5fc3RhdGUubywgdGhpcy5fc3RhdGUuZXJyb3JzKTtcbiAgICB9O1xuXG4gICAgTWVyZ2VEZWxheUVycm9yT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX3N0YXRlLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICB0aGlzLl9ncm91cC5sZW5ndGggPT09IDEgJiYgc2V0Q29tcGxldGlvbih0aGlzLl9zdGF0ZS5vLCB0aGlzLl9zdGF0ZS5lcnJvcnMpO1xuICAgIH07XG5cbiAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIoaW5uZXIsIGdyb3VwLCBzdGF0ZSkge1xuICAgICAgdGhpcy5faW5uZXIgPSBpbm5lcjtcbiAgICAgIHRoaXMuX2dyb3VwID0gZ3JvdXA7XG4gICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7IHRoaXMuX3N0YXRlLm8ub25OZXh0KHgpOyB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX3N0YXRlLmVycm9ycy5wdXNoKGUpO1xuICAgICAgdGhpcy5fZ3JvdXAucmVtb3ZlKHRoaXMuX2lubmVyKTtcbiAgICAgIHRoaXMuX3N0YXRlLmlzU3RvcHBlZCAmJiB0aGlzLl9ncm91cC5sZW5ndGggPT09IDEgJiYgc2V0Q29tcGxldGlvbih0aGlzLl9zdGF0ZS5vLCB0aGlzLl9zdGF0ZS5lcnJvcnMpO1xuICAgIH07XG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZ3JvdXAucmVtb3ZlKHRoaXMuX2lubmVyKTtcbiAgICAgIHRoaXMuX3N0YXRlLmlzU3RvcHBlZCAmJiB0aGlzLl9ncm91cC5sZW5ndGggPT09IDEgJiYgc2V0Q29tcGxldGlvbih0aGlzLl9zdGF0ZS5vLCB0aGlzLl9zdGF0ZS5lcnJvcnMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gTWVyZ2VEZWxheUVycm9yT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAqIEZsYXR0ZW5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBPYnNlcnZhYmxlcyBpbnRvIG9uZSBPYnNlcnZhYmxlLCBpbiBhIHdheSB0aGF0IGFsbG93cyBhbiBPYnNlcnZlciB0b1xuICAqIHJlY2VpdmUgYWxsIHN1Y2Nlc3NmdWxseSBlbWl0dGVkIGl0ZW1zIGZyb20gYWxsIG9mIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZXMgd2l0aG91dCBiZWluZyBpbnRlcnJ1cHRlZCBieVxuICAqIGFuIGVycm9yIG5vdGlmaWNhdGlvbiBmcm9tIG9uZSBvZiB0aGVtLlxuICAqXG4gICogVGhpcyBiZWhhdmVzIGxpa2UgT2JzZXJ2YWJsZS5wcm90b3R5cGUubWVyZ2VBbGwgZXhjZXB0IHRoYXQgaWYgYW55IG9mIHRoZSBtZXJnZWQgT2JzZXJ2YWJsZXMgbm90aWZ5IG9mIGFuXG4gICogZXJyb3IgdmlhIHRoZSBPYnNlcnZlcidzIG9uRXJyb3IsIG1lcmdlRGVsYXlFcnJvciB3aWxsIHJlZnJhaW4gZnJvbSBwcm9wYWdhdGluZyB0aGF0XG4gICogZXJyb3Igbm90aWZpY2F0aW9uIHVudGlsIGFsbCBvZiB0aGUgbWVyZ2VkIE9ic2VydmFibGVzIGhhdmUgZmluaXNoZWQgZW1pdHRpbmcgaXRlbXMuXG4gICogQHBhcmFtIHtBcnJheSB8IEFyZ3VtZW50c30gYXJncyBBcmd1bWVudHMgb3IgYW4gYXJyYXkgdG8gbWVyZ2UuXG4gICogQHJldHVybnMge09ic2VydmFibGV9IGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhbGwgb2YgdGhlIGl0ZW1zIGVtaXR0ZWQgYnkgdGhlIE9ic2VydmFibGVzIGVtaXR0ZWQgYnkgdGhlIE9ic2VydmFibGVcbiAgKi9cbiAgT2JzZXJ2YWJsZS5tZXJnZURlbGF5RXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmd1bWVudHNbMF0pKSB7XG4gICAgICBhcmdzID0gYXJndW1lbnRzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgfVxuICAgIHZhciBzb3VyY2UgPSBvYnNlcnZhYmxlT2YobnVsbCwgYXJncyk7XG4gICAgcmV0dXJuIG5ldyBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlKHNvdXJjZSk7XG4gIH07XG5cbiAgdmFyIE1lcmdlQWxsT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoTWVyZ2VBbGxPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXG4gICAgZnVuY3Rpb24gTWVyZ2VBbGxPYnNlcnZhYmxlKHNvdXJjZSkge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBNZXJnZUFsbE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBnID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKSwgbSA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuICAgICAgZy5hZGQobSk7XG4gICAgICBtLnNldERpc3Bvc2FibGUodGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBNZXJnZUFsbE9ic2VydmVyKG9ic2VydmVyLCBnKSkpO1xuICAgICAgcmV0dXJuIGc7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIE1lcmdlQWxsT2JzZXJ2ZXIobywgZykge1xuICAgICAgdGhpcy5vID0gbztcbiAgICAgIHRoaXMuZyA9IGc7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgfVxuICAgIE1lcmdlQWxsT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uKGlubmVyU291cmNlKSB7XG4gICAgICBpZih0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cbiAgICAgIHZhciBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIHRoaXMuZy5hZGQoc2FkKTtcblxuICAgICAgaXNQcm9taXNlKGlubmVyU291cmNlKSAmJiAoaW5uZXJTb3VyY2UgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoaW5uZXJTb3VyY2UpKTtcblxuICAgICAgc2FkLnNldERpc3Bvc2FibGUoaW5uZXJTb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKHRoaXMsIHNhZCkpKTtcbiAgICB9O1xuICAgIE1lcmdlQWxsT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBNZXJnZUFsbE9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZy5sZW5ndGggPT09IDEgJiYgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBNZXJnZUFsbE9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcbiAgICBNZXJnZUFsbE9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm8ub25FcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihwYXJlbnQsIHNhZCkge1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB0aGlzLnNhZCA9IHNhZDtcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uICh4KSB7IGlmICghdGhpcy5pc1N0b3BwZWQpIHsgdGhpcy5wYXJlbnQuby5vbk5leHQoeCk7IH0gfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICBwYXJlbnQuZy5yZW1vdmUodGhpcy5zYWQpO1xuICAgICAgICBwYXJlbnQuZG9uZSAmJiBwYXJlbnQuZy5sZW5ndGggPT09IDEgJiYgcGFyZW50Lm8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOyB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE1lcmdlQWxsT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIC8qKlxuICAqIE1lcmdlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9mIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBtZXJnZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBpbm5lciBzZXF1ZW5jZXMuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5tZXJnZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IE1lcmdlQWxsT2JzZXJ2YWJsZSh0aGlzKTtcbiAgfTtcblxuICB2YXIgU2tpcFVudGlsT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhTa2lwVW50aWxPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXG4gICAgZnVuY3Rpb24gU2tpcFVudGlsT2JzZXJ2YWJsZShzb3VyY2UsIG90aGVyKSB7XG4gICAgICB0aGlzLl9zID0gc291cmNlO1xuICAgICAgdGhpcy5fbyA9IGlzUHJvbWlzZShvdGhlcikgPyBvYnNlcnZhYmxlRnJvbVByb21pc2Uob3RoZXIpIDogb3RoZXI7XG4gICAgICB0aGlzLl9vcGVuID0gZmFsc2U7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBTa2lwVW50aWxPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24obykge1xuICAgICAgdmFyIGxlZnRTdWJzY3JpcHRpb24gPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIGxlZnRTdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZSh0aGlzLl9zLnN1YnNjcmliZShuZXcgU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIobywgdGhpcykpKTtcblxuICAgICAgaXNQcm9taXNlKHRoaXMuX28pICYmICh0aGlzLl9vID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHRoaXMuX28pKTtcblxuICAgICAgdmFyIHJpZ2h0U3Vic2NyaXB0aW9uID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgICByaWdodFN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKHRoaXMuX28uc3Vic2NyaWJlKG5ldyBTa2lwVW50aWxPdGhlck9ic2VydmVyKG8sIHRoaXMsIHJpZ2h0U3Vic2NyaXB0aW9uKSkpO1xuXG4gICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUobGVmdFN1YnNjcmlwdGlvbiwgcmlnaHRTdWJzY3JpcHRpb24pO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2tpcFVudGlsT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBTa2lwVW50aWxTb3VyY2VPYnNlcnZlciA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhTa2lwVW50aWxTb3VyY2VPYnNlcnZlciwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTa2lwVW50aWxTb3VyY2VPYnNlcnZlcihvLCBwKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3AgPSBwO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgdGhpcy5fcC5fb3BlbiAmJiB0aGlzLl9vLm9uTmV4dCh4KTtcbiAgICB9O1xuXG4gICAgU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGVycik7XG4gICAgfTtcblxuICAgIFNraXBVbnRpbFNvdXJjZU9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX3AuX29wZW4gJiYgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2tpcFVudGlsU291cmNlT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIHZhciBTa2lwVW50aWxPdGhlck9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFNraXBVbnRpbE90aGVyT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gU2tpcFVudGlsT3RoZXJPYnNlcnZlcihvLCBwLCByKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3AgPSBwO1xuICAgICAgdGhpcy5fciA9IHI7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBTa2lwVW50aWxPdGhlck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fcC5fb3BlbiA9IHRydWU7XG4gICAgICB0aGlzLl9yLmRpc3Bvc2UoKTtcbiAgICB9O1xuXG4gICAgU2tpcFVudGlsT3RoZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICB0aGlzLl9vLm9uRXJyb3IoZXJyKTtcbiAgICB9O1xuXG4gICAgU2tpcFVudGlsT3RoZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9yLmRpc3Bvc2UoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFNraXBVbnRpbE90aGVyT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2Ugb25seSBhZnRlciB0aGUgb3RoZXIgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBwcm9kdWNlcyBhIHZhbHVlLlxuICAgKiBAcGFyYW0ge09ic2VydmFibGUgfCBQcm9taXNlfSBvdGhlciBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvciBQcm9taXNlIHRoYXQgdHJpZ2dlcnMgcHJvcGFnYXRpb24gb2YgZWxlbWVudHMgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZSBzdGFydGluZyBmcm9tIHRoZSBwb2ludCB0aGUgb3RoZXIgc2VxdWVuY2UgdHJpZ2dlcmVkIHByb3BhZ2F0aW9uLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnNraXBVbnRpbCA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgIHJldHVybiBuZXcgU2tpcFVudGlsT2JzZXJ2YWJsZSh0aGlzLCBvdGhlcik7XG4gIH07XG5cbiAgdmFyIFN3aXRjaE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoU3dpdGNoT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTd2l0Y2hPYnNlcnZhYmxlKHNvdXJjZSkge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBTd2l0Y2hPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBpbm5lciA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksIHMgPSB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IFN3aXRjaE9ic2VydmVyKG8sIGlubmVyKSk7XG4gICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUocywgaW5uZXIpO1xuICAgIH07XG5cbiAgICBpbmhlcml0cyhTd2l0Y2hPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG4gICAgZnVuY3Rpb24gU3dpdGNoT2JzZXJ2ZXIobywgaW5uZXIpIHtcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgICB0aGlzLnN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMubGF0ZXN0ID0gMDtcbiAgICAgIHRoaXMuaGFzTGF0ZXN0ID0gZmFsc2U7XG4gICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgU3dpdGNoT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoaW5uZXJTb3VyY2UpIHtcbiAgICAgIHZhciBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksIGlkID0gKyt0aGlzLmxhdGVzdDtcbiAgICAgIHRoaXMuaGFzTGF0ZXN0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5uZXIuc2V0RGlzcG9zYWJsZShkKTtcbiAgICAgIGlzUHJvbWlzZShpbm5lclNvdXJjZSkgJiYgKGlubmVyU291cmNlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKGlubmVyU291cmNlKSk7XG4gICAgICBkLnNldERpc3Bvc2FibGUoaW5uZXJTb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKHRoaXMsIGlkKSkpO1xuICAgIH07XG5cbiAgICBTd2l0Y2hPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG4gICAgfTtcblxuICAgIFN3aXRjaE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgIXRoaXMuaGFzTGF0ZXN0ICYmIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuICAgIH07XG5cbiAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcbiAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKHBhcmVudCwgaWQpIHtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuICAgIH1cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHRoaXMucGFyZW50LmxhdGVzdCA9PT0gdGhpcy5pZCAmJiB0aGlzLnBhcmVudC5vLm9uTmV4dCh4KTtcbiAgICB9O1xuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5wYXJlbnQubGF0ZXN0ID09PSB0aGlzLmlkICYmIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcbiAgICB9O1xuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50LmxhdGVzdCA9PT0gdGhpcy5pZCkge1xuICAgICAgICB0aGlzLnBhcmVudC5oYXNMYXRlc3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYXJlbnQuaXNTdG9wcGVkICYmIHRoaXMucGFyZW50Lm8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFN3aXRjaE9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgKiBUcmFuc2Zvcm1zIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugb2Ygb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2luZyB2YWx1ZXMgb25seSBmcm9tIHRoZSBtb3N0IHJlY2VudCBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGF0IGFueSBwb2ludCBpbiB0aW1lIHByb2R1Y2VzIHRoZSBlbGVtZW50cyBvZiB0aGUgbW9zdCByZWNlbnQgaW5uZXIgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGhhcyBiZWVuIHJlY2VpdmVkLlxuICAqL1xuICBvYnNlcnZhYmxlUHJvdG9bJ3N3aXRjaCddID0gb2JzZXJ2YWJsZVByb3RvLnN3aXRjaExhdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFN3aXRjaE9ic2VydmFibGUodGhpcyk7XG4gIH07XG5cbiAgdmFyIFRha2VVbnRpbE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoVGFrZVVudGlsT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIFRha2VVbnRpbE9ic2VydmFibGUoc291cmNlLCBvdGhlcikge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aGlzLm90aGVyID0gaXNQcm9taXNlKG90aGVyKSA/IG9ic2VydmFibGVGcm9tUHJvbWlzZShvdGhlcikgOiBvdGhlcjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFRha2VVbnRpbE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG4gICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoXG4gICAgICAgIHRoaXMuc291cmNlLnN1YnNjcmliZShvKSxcbiAgICAgICAgdGhpcy5vdGhlci5zdWJzY3JpYmUobmV3IFRha2VVbnRpbE9ic2VydmVyKG8pKVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRha2VVbnRpbE9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgVGFrZVVudGlsT2JzZXJ2ZXIgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoVGFrZVVudGlsT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gVGFrZVVudGlsT2JzZXJ2ZXIobykge1xuICAgICAgdGhpcy5fbyA9IG87XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBUYWtlVW50aWxPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcbiAgICB9O1xuXG4gICAgVGFrZVVudGlsT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGVycik7XG4gICAgfTtcblxuICAgIFRha2VVbnRpbE9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IG5vb3A7XG5cbiAgICByZXR1cm4gVGFrZVVudGlsT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2UgdW50aWwgdGhlIG90aGVyIG9ic2VydmFibGUgc2VxdWVuY2UgcHJvZHVjZXMgYSB2YWx1ZS5cbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlIHwgUHJvbWlzZX0gb3RoZXIgT2JzZXJ2YWJsZSBzZXF1ZW5jZSBvciBQcm9taXNlIHRoYXQgdGVybWluYXRlcyBwcm9wYWdhdGlvbiBvZiBlbGVtZW50cyBvZiB0aGUgc291cmNlIHNlcXVlbmNlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgc291cmNlIHNlcXVlbmNlIHVwIHRvIHRoZSBwb2ludCB0aGUgb3RoZXIgc2VxdWVuY2UgaW50ZXJydXB0ZWQgZnVydGhlciBwcm9wYWdhdGlvbi5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by50YWtlVW50aWwgPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICByZXR1cm4gbmV3IFRha2VVbnRpbE9ic2VydmFibGUodGhpcywgb3RoZXIpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGZhbHNlRmFjdG9yeSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGZ1bmN0aW9uIGFyZ3VtZW50c1RvQXJyYXkoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgdmFyIFdpdGhMYXRlc3RGcm9tT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhXaXRoTGF0ZXN0RnJvbU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gV2l0aExhdGVzdEZyb21PYnNlcnZhYmxlKHNvdXJjZSwgc291cmNlcywgcmVzdWx0U2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuX3MgPSBzb3VyY2U7XG4gICAgICB0aGlzLl9zcyA9IHNvdXJjZXM7XG4gICAgICB0aGlzLl9jYiA9IHJlc3VsdFNlbGVjdG9yO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgV2l0aExhdGVzdEZyb21PYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBsZW4gPSB0aGlzLl9zcy5sZW5ndGg7XG4gICAgICB2YXIgc3RhdGUgPSB7XG4gICAgICAgIGhhc1ZhbHVlOiBhcnJheUluaXRpYWxpemUobGVuLCBmYWxzZUZhY3RvcnkpLFxuICAgICAgICBoYXNWYWx1ZUFsbDogZmFsc2UsXG4gICAgICAgIHZhbHVlczogbmV3IEFycmF5KGxlbilcbiAgICAgIH07XG5cbiAgICAgIHZhciBuID0gdGhpcy5fc3MubGVuZ3RoLCBzdWJzY3JpcHRpb25zID0gbmV3IEFycmF5KG4gKyAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBvdGhlciA9IHRoaXMuX3NzW2ldLCBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgaXNQcm9taXNlKG90aGVyKSAmJiAob3RoZXIgPSBvYnNlcnZhYmxlRnJvbVByb21pc2Uob3RoZXIpKTtcbiAgICAgICAgc2FkLnNldERpc3Bvc2FibGUob3RoZXIuc3Vic2NyaWJlKG5ldyBXaXRoTGF0ZXN0RnJvbU90aGVyT2JzZXJ2ZXIobywgaSwgc3RhdGUpKSk7XG4gICAgICAgIHN1YnNjcmlwdGlvbnNbaV0gPSBzYWQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHRoaXMuX3Muc3Vic2NyaWJlKG5ldyBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyKG8sIHRoaXMuX2NiLCBzdGF0ZSkpKTtcbiAgICAgIHN1YnNjcmlwdGlvbnNbbl0gPSBzYWQ7XG5cbiAgICAgIHJldHVybiBuZXcgTkFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9ucyk7XG4gICAgfTtcblxuICAgIHJldHVybiBXaXRoTGF0ZXN0RnJvbU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhXaXRoTGF0ZXN0RnJvbU90aGVyT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyKG8sIGksIHN0YXRlKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX2kgPSBpO1xuICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFdpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB0aGlzLl9zdGF0ZS52YWx1ZXNbdGhpcy5faV0gPSB4O1xuICAgICAgdGhpcy5fc3RhdGUuaGFzVmFsdWVbdGhpcy5faV0gPSB0cnVlO1xuICAgICAgdGhpcy5fc3RhdGUuaGFzVmFsdWVBbGwgPSB0aGlzLl9zdGF0ZS5oYXNWYWx1ZS5ldmVyeShpZGVudGl0eSk7XG4gICAgfTtcblxuICAgIFdpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuICAgIH07XG5cbiAgICBXaXRoTGF0ZXN0RnJvbU90aGVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IG5vb3A7XG5cbiAgICByZXR1cm4gV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICB2YXIgV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlciwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyKG8sIGNiLCBzdGF0ZSkge1xuICAgICAgdGhpcy5fbyA9IG87XG4gICAgICB0aGlzLl9jYiA9IGNiO1xuICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFdpdGhMYXRlc3RGcm9tU291cmNlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgdmFyIGFsbFZhbHVlcyA9IFt4XS5jb25jYXQodGhpcy5fc3RhdGUudmFsdWVzKTtcbiAgICAgIGlmICghdGhpcy5fc3RhdGUuaGFzVmFsdWVBbGwpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2godGhpcy5fY2IpLmFwcGx5KG51bGwsIGFsbFZhbHVlcyk7XG4gICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgdGhpcy5fby5vbk5leHQocmVzKTtcbiAgICB9O1xuXG4gICAgV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuICAgIH07XG5cbiAgICBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogTWVyZ2VzIHRoZSBzcGVjaWZpZWQgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBvbmUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSB1c2luZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gb25seSB3aGVuIHRoZSAoZmlyc3QpIHNvdXJjZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2VzIGFuIGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIHNvdXJjZXMgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8ud2l0aExhdGVzdEZyb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50cycpOyB9XG5cbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgdmFyIHJlc3VsdFNlbGVjdG9yID0gaXNGdW5jdGlvbihhcmdzW2xlbiAtIDFdKSA/IGFyZ3MucG9wKCkgOiBhcmd1bWVudHNUb0FycmF5O1xuICAgIEFycmF5LmlzQXJyYXkoYXJnc1swXSkgJiYgKGFyZ3MgPSBhcmdzWzBdKTtcblxuICAgIHJldHVybiBuZXcgV2l0aExhdGVzdEZyb21PYnNlcnZhYmxlKHRoaXMsIGFyZ3MsIHJlc3VsdFNlbGVjdG9yKTtcbiAgfTtcblxuICBmdW5jdGlvbiBmYWxzZUZhY3RvcnkoKSB7IHJldHVybiBmYWxzZTsgfVxuICBmdW5jdGlvbiBlbXB0eUFycmF5RmFjdG9yeSgpIHsgcmV0dXJuIFtdOyB9XG5cbiAgdmFyIFppcE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoWmlwT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBaaXBPYnNlcnZhYmxlKHNvdXJjZXMsIHJlc3VsdFNlbGVjdG9yKSB7XG4gICAgICB0aGlzLl9zID0gc291cmNlcztcbiAgICAgIHRoaXMuX2NiID0gcmVzdWx0U2VsZWN0b3I7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBaaXBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBuID0gdGhpcy5fcy5sZW5ndGgsXG4gICAgICAgICAgc3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheShuKTtcbiAgICAgICAgICBkb25lID0gYXJyYXlJbml0aWFsaXplKG4sIGZhbHNlRmFjdG9yeSksXG4gICAgICAgICAgcSA9IGFycmF5SW5pdGlhbGl6ZShuLCBlbXB0eUFycmF5RmFjdG9yeSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLl9zW2ldLCBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uc1tpXSA9IHNhZDtcbiAgICAgICAgaXNQcm9taXNlKHNvdXJjZSkgJiYgKHNvdXJjZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShzb3VyY2UpKTtcbiAgICAgICAgc2FkLnNldERpc3Bvc2FibGUoc291cmNlLnN1YnNjcmliZShuZXcgWmlwT2JzZXJ2ZXIob2JzZXJ2ZXIsIGksIHRoaXMsIHEsIGRvbmUpKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgTkFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9ucyk7XG4gICAgfTtcblxuICAgIHJldHVybiBaaXBPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIFppcE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhaaXBPYnNlcnZlciwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBaaXBPYnNlcnZlcihvLCBpLCBwLCBxLCBkKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX2kgPSBpO1xuICAgICAgdGhpcy5fcCA9IHA7XG4gICAgICB0aGlzLl9xID0gcTtcbiAgICAgIHRoaXMuX2QgPSBkO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm90RW1wdHkoeCkgeyByZXR1cm4geC5sZW5ndGggPiAwOyB9XG4gICAgZnVuY3Rpb24gc2hpZnRFYWNoKHgpIHsgcmV0dXJuIHguc2hpZnQoKTsgfVxuICAgIGZ1bmN0aW9uIG5vdFRoZVNhbWUoaSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh4LCBqKSB7XG4gICAgICAgIHJldHVybiBqICE9PSBpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBaaXBPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB0aGlzLl9xW3RoaXMuX2ldLnB1c2goeCk7XG4gICAgICBpZiAodGhpcy5fcS5ldmVyeShub3RFbXB0eSkpIHtcbiAgICAgICAgdmFyIHF1ZXVlZFZhbHVlcyA9IHRoaXMuX3EubWFwKHNoaWZ0RWFjaCk7XG4gICAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh0aGlzLl9wLl9jYikuYXBwbHkobnVsbCwgcXVldWVkVmFsdWVzKTtcbiAgICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuX28ub25FcnJvcihyZXMuZSk7IH1cbiAgICAgICAgdGhpcy5fby5vbk5leHQocmVzKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fZC5maWx0ZXIobm90VGhlU2FtZSh0aGlzLl9pKSkuZXZlcnkoaWRlbnRpdHkpKSB7XG4gICAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWmlwT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcbiAgICB9O1xuXG4gICAgWmlwT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2RbdGhpcy5faV0gPSB0cnVlO1xuICAgICAgdGhpcy5fZC5ldmVyeShpZGVudGl0eSkgJiYgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWmlwT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiBNZXJnZXMgdGhlIHNwZWNpZmllZCBvYnNlcnZhYmxlIHNlcXVlbmNlcyBpbnRvIG9uZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGJ5IHVzaW5nIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aGVuZXZlciBhbGwgb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzIG9yIGFuIGFycmF5IGhhdmUgcHJvZHVjZWQgYW4gZWxlbWVudCBhdCBhIGNvcnJlc3BvbmRpbmcgaW5kZXguXG4gICAqIFRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFyZ3VtZW50cyBtdXN0IGJlIGEgZnVuY3Rpb24gdG8gaW52b2tlIGZvciBlYWNoIHNlcmllcyBvZiBlbGVtZW50cyBhdCBjb3JyZXNwb25kaW5nIGluZGV4ZXMgaW4gdGhlIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIGFyZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uemlwID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7IHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudHMnKTsgfVxuXG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIHZhciByZXN1bHRTZWxlY3RvciA9IGlzRnVuY3Rpb24oYXJnc1tsZW4gLSAxXSkgPyBhcmdzLnBvcCgpIDogYXJndW1lbnRzVG9BcnJheTtcbiAgICBBcnJheS5pc0FycmF5KGFyZ3NbMF0pICYmIChhcmdzID0gYXJnc1swXSk7XG5cbiAgICB2YXIgcGFyZW50ID0gdGhpcztcbiAgICBhcmdzLnVuc2hpZnQocGFyZW50KTtcblxuICAgIHJldHVybiBuZXcgWmlwT2JzZXJ2YWJsZShhcmdzLCByZXN1bHRTZWxlY3Rvcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gb25lIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgdXNpbmcgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHdoZW5ldmVyIGFsbCBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaGF2ZSBwcm9kdWNlZCBhbiBlbGVtZW50IGF0IGEgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICogQHBhcmFtIGFyZ3VtZW50cyBPYnNlcnZhYmxlIHNvdXJjZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc3VsdFNlbGVjdG9yIEZ1bmN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBzZXJpZXMgb2YgZWxlbWVudHMgYXQgY29ycmVzcG9uZGluZyBpbmRleGVzIGluIHRoZSBzb3VyY2VzLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY29tYmluaW5nIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2VzIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVzdWx0IHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKi9cbiAgT2JzZXJ2YWJsZS56aXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XG4gICAgICBhcmdzID0gaXNGdW5jdGlvbihhcmdzWzFdKSA/IGFyZ3NbMF0uY29uY2F0KGFyZ3NbMV0pIDogYXJnc1swXTtcbiAgICB9XG4gICAgdmFyIGZpcnN0ID0gYXJncy5zaGlmdCgpO1xuICAgIHJldHVybiBmaXJzdC56aXAuYXBwbHkoZmlyc3QsIGFyZ3MpO1xuICB9O1xuXG5mdW5jdGlvbiBmYWxzZUZhY3RvcnkoKSB7IHJldHVybiBmYWxzZTsgfVxuZnVuY3Rpb24gZW1wdHlBcnJheUZhY3RvcnkoKSB7IHJldHVybiBbXTsgfVxuZnVuY3Rpb24gYXJndW1lbnRzVG9BcnJheSgpIHtcbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbi8qKlxuICogTWVyZ2VzIHRoZSBzcGVjaWZpZWQgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBvbmUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSB1c2luZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gd2hlbmV2ZXIgYWxsIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlcyBvciBhbiBhcnJheSBoYXZlIHByb2R1Y2VkIGFuIGVsZW1lbnQgYXQgYSBjb3JyZXNwb25kaW5nIGluZGV4LlxuICogVGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJndW1lbnRzIG11c3QgYmUgYSBmdW5jdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggc2VyaWVzIG9mIGVsZW1lbnRzIGF0IGNvcnJlc3BvbmRpbmcgaW5kZXhlcyBpbiB0aGUgYXJncy5cbiAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIGFyZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG4gKi9cbm9ic2VydmFibGVQcm90by56aXBJdGVyYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50cycpOyB9XG5cbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cbiAgdmFyIHJlc3VsdFNlbGVjdG9yID0gaXNGdW5jdGlvbihhcmdzW2xlbiAtIDFdKSA/IGFyZ3MucG9wKCkgOiBhcmd1bWVudHNUb0FycmF5O1xuXG4gIHZhciBwYXJlbnQgPSB0aGlzO1xuICBhcmdzLnVuc2hpZnQocGFyZW50KTtcbiAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG4gICAgdmFyIG4gPSBhcmdzLmxlbmd0aCxcbiAgICAgIHF1ZXVlcyA9IGFycmF5SW5pdGlhbGl6ZShuLCBlbXB0eUFycmF5RmFjdG9yeSksXG4gICAgICBpc0RvbmUgPSBhcnJheUluaXRpYWxpemUobiwgZmFsc2VGYWN0b3J5KTtcblxuICAgIHZhciBzdWJzY3JpcHRpb25zID0gbmV3IEFycmF5KG4pO1xuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IG47IGlkeCsrKSB7XG4gICAgICAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3NbaV0sIHNhZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXG4gICAgICAgIChpc0FycmF5TGlrZShzb3VyY2UpIHx8IGlzSXRlcmFibGUoc291cmNlKSkgJiYgKHNvdXJjZSA9IG9ic2VydmFibGVGcm9tKHNvdXJjZSkpO1xuXG4gICAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICBxdWV1ZXNbaV0ucHVzaCh4KTtcbiAgICAgICAgICBpZiAocXVldWVzLmV2ZXJ5KGZ1bmN0aW9uICh4KSB7IHJldHVybiB4Lmxlbmd0aCA+IDA7IH0pKSB7XG4gICAgICAgICAgICB2YXIgcXVldWVkVmFsdWVzID0gcXVldWVzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5zaGlmdCgpOyB9KSxcbiAgICAgICAgICAgICAgICByZXMgPSB0cnlDYXRjaChyZXN1bHRTZWxlY3RvcikuYXBwbHkocGFyZW50LCBxdWV1ZWRWYWx1ZXMpO1xuICAgICAgICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihyZXMuZSk7IH1cbiAgICAgICAgICAgIG8ub25OZXh0KHJlcyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0RvbmUuZmlsdGVyKGZ1bmN0aW9uICh4LCBqKSB7IHJldHVybiBqICE9PSBpOyB9KS5ldmVyeShpZGVudGl0eSkpIHtcbiAgICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlzRG9uZVtpXSA9IHRydWU7XG4gICAgICAgICAgaXNEb25lLmV2ZXJ5KGlkZW50aXR5KSAmJiBvLm9uQ29tcGxldGVkKCk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uc1tpXSA9IHNhZDtcbiAgICAgIH0pKGlkeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbnMpO1xuICB9LCBwYXJlbnQpO1xufTtcblxuICBmdW5jdGlvbiBhc09ic2VydmFibGUoc291cmNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHN1YnNjcmliZShvKSB7IHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG8pOyB9O1xuICB9XG5cbiAgLyoqXG4gICAqICBIaWRlcyB0aGUgaWRlbnRpdHkgb2YgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBoaWRlcyB0aGUgaWRlbnRpdHkgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5hc09ic2VydmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGFzT2JzZXJ2YWJsZSh0aGlzKSwgdGhpcyk7XG4gIH07XG5cbiAgdmFyIERlbWF0ZXJpYWxpemVPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhEZW1hdGVyaWFsaXplT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBEZW1hdGVyaWFsaXplT2JzZXJ2YWJsZShzb3VyY2UpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRGVtYXRlcmlhbGl6ZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgRGVtYXRlcmlhbGl6ZU9ic2VydmVyKG8pKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERlbWF0ZXJpYWxpemVPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIERlbWF0ZXJpYWxpemVPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoRGVtYXRlcmlhbGl6ZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXG4gICAgZnVuY3Rpb24gRGVtYXRlcmlhbGl6ZU9ic2VydmVyKG8pIHtcbiAgICAgIHRoaXMuX28gPSBvO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRGVtYXRlcmlhbGl6ZU9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHsgeC5hY2NlcHQodGhpcy5fbyk7IH07XG4gICAgRGVtYXRlcmlhbGl6ZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuX28ub25FcnJvcihlKTsgfTtcbiAgICBEZW1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuXG4gICAgcmV0dXJuIERlbWF0ZXJpYWxpemVPYnNlcnZlcjtcbiAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cbiAgLyoqXG4gICAqIERlbWF0ZXJpYWxpemVzIHRoZSBleHBsaWNpdCBub3RpZmljYXRpb24gdmFsdWVzIG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgaW1wbGljaXQgbm90aWZpY2F0aW9ucy5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgZXhoaWJpdGluZyB0aGUgYmVoYXZpb3IgY29ycmVzcG9uZGluZyB0byB0aGUgc291cmNlIHNlcXVlbmNlJ3Mgbm90aWZpY2F0aW9uIHZhbHVlcy5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5kZW1hdGVyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRGVtYXRlcmlhbGl6ZU9ic2VydmFibGUodGhpcyk7XG4gIH07XG5cbiAgdmFyIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZhYmxlKHNvdXJjZSwga2V5Rm4sIGNvbXBhcmVyKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMua2V5Rm4gPSBrZXlGbjtcbiAgICAgIHRoaXMuY29tcGFyZXIgPSBjb21wYXJlcjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyKG8sIHRoaXMua2V5Rm4sIHRoaXMuY29tcGFyZXIpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZlcihvLCBrZXlGbiwgY29tcGFyZXIpIHtcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLmtleUZuID0ga2V5Rm47XG4gICAgICB0aGlzLmNvbXBhcmVyID0gY29tcGFyZXI7XG4gICAgICB0aGlzLmhhc0N1cnJlbnRLZXkgPSBmYWxzZTtcbiAgICAgIHRoaXMuY3VycmVudEtleSA9IG51bGw7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHZhciBrZXkgPSB4LCBjb21wYXJlckVxdWFscztcbiAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMua2V5Rm4pKSB7XG4gICAgICAgIGtleSA9IHRyeUNhdGNoKHRoaXMua2V5Rm4pKHgpO1xuICAgICAgICBpZiAoa2V5ID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5vLm9uRXJyb3Ioa2V5LmUpOyB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oYXNDdXJyZW50S2V5KSB7XG4gICAgICAgIGNvbXBhcmVyRXF1YWxzID0gdHJ5Q2F0Y2godGhpcy5jb21wYXJlcikodGhpcy5jdXJyZW50S2V5LCBrZXkpO1xuICAgICAgICBpZiAoY29tcGFyZXJFcXVhbHMgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLm8ub25FcnJvcihjb21wYXJlckVxdWFscy5lKTsgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmhhc0N1cnJlbnRLZXkgfHwgIWNvbXBhcmVyRXF1YWxzKSB7XG4gICAgICAgIHRoaXMuaGFzQ3VycmVudEtleSA9IHRydWU7XG4gICAgICAgIHRoaXMuY3VycmVudEtleSA9IGtleTtcbiAgICAgICAgdGhpcy5vLm9uTmV4dCh4KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG4gICAgfTtcbiAgICBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLm8ub25Db21wbGV0ZWQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAqICBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyBvbmx5IGRpc3RpbmN0IGNvbnRpZ3VvdXMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBrZXlGbiBhbmQgdGhlIGNvbXBhcmVyLlxuICAqIEBwYXJhbSB7RnVuY3Rpb259IFtrZXlGbl0gQSBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSBjb21wYXJpc29uIGtleSBmb3IgZWFjaCBlbGVtZW50LiBJZiBub3QgcHJvdmlkZWQsIGl0IHByb2plY3RzIHRoZSB2YWx1ZS5cbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyZXJdIEVxdWFsaXR5IGNvbXBhcmVyIGZvciBjb21wdXRlZCBrZXkgdmFsdWVzLiBJZiBub3QgcHJvdmlkZWQsIGRlZmF1bHRzIHRvIGFuIGVxdWFsaXR5IGNvbXBhcmVyIGZ1bmN0aW9uLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9ubHkgY29udGFpbmluZyB0aGUgZGlzdGluY3QgY29udGlndW91cyBlbGVtZW50cywgYmFzZWQgb24gYSBjb21wdXRlZCBrZXkgdmFsdWUsIGZyb20gdGhlIHNvdXJjZSBzZXF1ZW5jZS5cbiAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLmRpc3RpbmN0VW50aWxDaGFuZ2VkID0gZnVuY3Rpb24gKGtleUZuLCBjb21wYXJlcikge1xuICAgIGNvbXBhcmVyIHx8IChjb21wYXJlciA9IGRlZmF1bHRDb21wYXJlcik7XG4gICAgcmV0dXJuIG5ldyBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmFibGUodGhpcywga2V5Rm4sIGNvbXBhcmVyKTtcbiAgfTtcblxuICB2YXIgVGFwT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUYXBPYnNlcnZhYmxlLF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gVGFwT2JzZXJ2YWJsZShzb3VyY2UsIG9ic2VydmVyT3JPbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuX29OID0gb2JzZXJ2ZXJPck9uTmV4dDtcbiAgICAgIHRoaXMuX29FID0gb25FcnJvcjtcbiAgICAgIHRoaXMuX29DID0gb25Db21wbGV0ZWQ7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBUYXBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24obykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzKSk7XG4gICAgfTtcblxuICAgIGluaGVyaXRzKElubmVyT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIobywgcCkge1xuICAgICAgdGhpcy5vID0gbztcbiAgICAgIHRoaXMudCA9ICFwLl9vTiB8fCBpc0Z1bmN0aW9uKHAuX29OKSA/XG4gICAgICAgIG9ic2VydmVyQ3JlYXRlKHAuX29OIHx8IG5vb3AsIHAuX29FIHx8IG5vb3AsIHAuX29DIHx8IG5vb3ApIDpcbiAgICAgICAgcC5fb047XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuICAgIH1cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oeCkge1xuICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMudC5vbk5leHQpLmNhbGwodGhpcy50LCB4KTtcbiAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHRoaXMuby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgdGhpcy5vLm9uTmV4dCh4KTtcbiAgICB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2godGhpcy50Lm9uRXJyb3IpLmNhbGwodGhpcy50LCBlcnIpO1xuICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgdGhpcy5vLm9uRXJyb3IoZXJyKTtcbiAgICB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMudC5vbkNvbXBsZXRlZCkuY2FsbCh0aGlzLnQpO1xuICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBUYXBPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgLyoqXG4gICogIEludm9rZXMgYW4gYWN0aW9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIG9ic2VydmFibGUgc2VxdWVuY2UgYW5kIGludm9rZXMgYW4gYWN0aW9uIHVwb24gZ3JhY2VmdWwgb3IgZXhjZXB0aW9uYWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICogIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcsIGxvZ2dpbmcsIGV0Yy4gb2YgcXVlcnkgYmVoYXZpb3IgYnkgaW50ZXJjZXB0aW5nIHRoZSBtZXNzYWdlIHN0cmVhbSB0byBydW4gYXJiaXRyYXJ5IGFjdGlvbnMgZm9yIG1lc3NhZ2VzIG9uIHRoZSBwaXBlbGluZS5cbiAgKiBAcGFyYW0ge0Z1bmN0aW9uIHwgT2JzZXJ2ZXJ9IG9ic2VydmVyT3JPbk5leHQgQWN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIG9yIGFuIG8uXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdICBBY3Rpb24gdG8gaW52b2tlIHVwb24gZXhjZXB0aW9uYWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuIFVzZWQgaWYgb25seSB0aGUgb2JzZXJ2ZXJPck9uTmV4dCBwYXJhbWV0ZXIgaXMgYWxzbyBhIGZ1bmN0aW9uLlxuICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkNvbXBsZXRlZF0gIEFjdGlvbiB0byBpbnZva2UgdXBvbiBncmFjZWZ1bCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS4gVXNlZCBpZiBvbmx5IHRoZSBvYnNlcnZlck9yT25OZXh0IHBhcmFtZXRlciBpcyBhbHNvIGEgZnVuY3Rpb24uXG4gICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aCB0aGUgc2lkZS1lZmZlY3RpbmcgYmVoYXZpb3IgYXBwbGllZC5cbiAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvWydkbyddID0gb2JzZXJ2YWJsZVByb3RvLnRhcCA9IG9ic2VydmFibGVQcm90by5kb0FjdGlvbiA9IGZ1bmN0aW9uIChvYnNlcnZlck9yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuICAgIHJldHVybiBuZXcgVGFwT2JzZXJ2YWJsZSh0aGlzLCBvYnNlcnZlck9yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCk7XG4gIH07XG5cbiAgLyoqXG4gICogIEludm9rZXMgYW4gYWN0aW9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICogIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcsIGxvZ2dpbmcsIGV0Yy4gb2YgcXVlcnkgYmVoYXZpb3IgYnkgaW50ZXJjZXB0aW5nIHRoZSBtZXNzYWdlIHN0cmVhbSB0byBydW4gYXJiaXRyYXJ5IGFjdGlvbnMgZm9yIG1lc3NhZ2VzIG9uIHRoZSBwaXBlbGluZS5cbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbk5leHQgQWN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gT2JqZWN0IHRvIHVzZSBhcyB0aGlzIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHdpdGggdGhlIHNpZGUtZWZmZWN0aW5nIGJlaGF2aW9yIGFwcGxpZWQuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5kb09uTmV4dCA9IG9ic2VydmFibGVQcm90by50YXBPbk5leHQgPSBmdW5jdGlvbiAob25OZXh0LCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIHRoaXMudGFwKHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uICh4KSB7IG9uTmV4dC5jYWxsKHRoaXNBcmcsIHgpOyB9IDogb25OZXh0KTtcbiAgfTtcblxuICAvKipcbiAgKiAgSW52b2tlcyBhbiBhY3Rpb24gdXBvbiBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgKiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZywgbG9nZ2luZywgZXRjLiBvZiBxdWVyeSBiZWhhdmlvciBieSBpbnRlcmNlcHRpbmcgdGhlIG1lc3NhZ2Ugc3RyZWFtIHRvIHJ1biBhcmJpdHJhcnkgYWN0aW9ucyBmb3IgbWVzc2FnZXMgb24gdGhlIHBpcGVsaW5lLlxuICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3IgQWN0aW9uIHRvIGludm9rZSB1cG9uIGV4Y2VwdGlvbmFsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gT2JqZWN0IHRvIHVzZSBhcyB0aGlzIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHdpdGggdGhlIHNpZGUtZWZmZWN0aW5nIGJlaGF2aW9yIGFwcGxpZWQuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5kb09uRXJyb3IgPSBvYnNlcnZhYmxlUHJvdG8udGFwT25FcnJvciA9IGZ1bmN0aW9uIChvbkVycm9yLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIHRoaXMudGFwKG5vb3AsIHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uIChlKSB7IG9uRXJyb3IuY2FsbCh0aGlzQXJnLCBlKTsgfSA6IG9uRXJyb3IpO1xuICB9O1xuXG4gIC8qKlxuICAqICBJbnZva2VzIGFuIGFjdGlvbiB1cG9uIGdyYWNlZnVsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nLCBsb2dnaW5nLCBldGMuIG9mIHF1ZXJ5IGJlaGF2aW9yIGJ5IGludGVyY2VwdGluZyB0aGUgbWVzc2FnZSBzdHJlYW0gdG8gcnVuIGFyYml0cmFyeSBhY3Rpb25zIGZvciBtZXNzYWdlcyBvbiB0aGUgcGlwZWxpbmUuXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gb25Db21wbGV0ZWQgQWN0aW9uIHRvIGludm9rZSB1cG9uIGdyYWNlZnVsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gT2JqZWN0IHRvIHVzZSBhcyB0aGlzIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHdpdGggdGhlIHNpZGUtZWZmZWN0aW5nIGJlaGF2aW9yIGFwcGxpZWQuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5kb09uQ29tcGxldGVkID0gb2JzZXJ2YWJsZVByb3RvLnRhcE9uQ29tcGxldGVkID0gZnVuY3Rpb24gKG9uQ29tcGxldGVkLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIHRoaXMudGFwKG5vb3AsIG51bGwsIHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uICgpIHsgb25Db21wbGV0ZWQuY2FsbCh0aGlzQXJnKTsgfSA6IG9uQ29tcGxldGVkKTtcbiAgfTtcblxuICAvKipcbiAgICogIEludm9rZXMgYSBzcGVjaWZpZWQgYWN0aW9uIGFmdGVyIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0ZXJtaW5hdGVzIGdyYWNlZnVsbHkgb3IgZXhjZXB0aW9uYWxseS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmluYWxseUFjdGlvbiBBY3Rpb24gdG8gaW52b2tlIGFmdGVyIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0ZXJtaW5hdGVzLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gU291cmNlIHNlcXVlbmNlIHdpdGggdGhlIGFjdGlvbi1pbnZva2luZyB0ZXJtaW5hdGlvbiBiZWhhdmlvciBhcHBsaWVkLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvWydmaW5hbGx5J10gPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRyeUNhdGNoKHNvdXJjZS5zdWJzY3JpYmUpLmNhbGwoc291cmNlLCBvYnNlcnZlcik7XG4gICAgICBpZiAoc3Vic2NyaXB0aW9uID09PSBlcnJvck9iaikge1xuICAgICAgICBhY3Rpb24oKTtcbiAgICAgICAgcmV0dXJuIHRocm93ZXIoc3Vic2NyaXB0aW9uLmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRpc3Bvc2FibGVDcmVhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgciA9IHRyeUNhdGNoKHN1YnNjcmlwdGlvbi5kaXNwb3NlKS5jYWxsKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIGFjdGlvbigpO1xuICAgICAgICByID09PSBlcnJvck9iaiAmJiB0aHJvd2VyKHIuZSk7XG4gICAgICB9KTtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuICB2YXIgSWdub3JlRWxlbWVudHNPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZShzb3VyY2UpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSWdub3JlRWxlbWVudHNPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobykpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8pIHtcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBub29wO1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm8ub25FcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH07XG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOyB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub25FcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIC8qKlxuICAgKiAgSWdub3JlcyBhbGwgZWxlbWVudHMgaW4gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBsZWF2aW5nIG9ubHkgdGhlIHRlcm1pbmF0aW9uIG1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gZW1wdHkgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNpZ25hbHMgdGVybWluYXRpb24sIHN1Y2Nlc3NmdWwgb3IgZXhjZXB0aW9uYWwsIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uaWdub3JlRWxlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBJZ25vcmVFbGVtZW50c09ic2VydmFibGUodGhpcyk7XG4gIH07XG5cbiAgdmFyIE1hdGVyaWFsaXplT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoTWF0ZXJpYWxpemVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIE1hdGVyaWFsaXplT2JzZXJ2YWJsZShzb3VyY2UsIGZuKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIE1hdGVyaWFsaXplT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBNYXRlcmlhbGl6ZU9ic2VydmVyKG8pKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE1hdGVyaWFsaXplT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBNYXRlcmlhbGl6ZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhNYXRlcmlhbGl6ZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXG4gICAgZnVuY3Rpb24gTWF0ZXJpYWxpemVPYnNlcnZlcihvKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIE1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkgeyB0aGlzLl9vLm9uTmV4dChub3RpZmljYXRpb25DcmVhdGVPbk5leHQoeCkpIH07XG4gICAgTWF0ZXJpYWxpemVPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uTmV4dChub3RpZmljYXRpb25DcmVhdGVPbkVycm9yKGUpKTsgdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuICAgIE1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbk5leHQobm90aWZpY2F0aW9uQ3JlYXRlT25Db21wbGV0ZWQoKSk7IHRoaXMuX28ub25Db21wbGV0ZWQoKTsgfTtcblxuICAgIHJldHVybiBNYXRlcmlhbGl6ZU9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogIE1hdGVyaWFsaXplcyB0aGUgaW1wbGljaXQgbm90aWZpY2F0aW9ucyBvZiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGFzIGV4cGxpY2l0IG5vdGlmaWNhdGlvbiB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIG1hdGVyaWFsaXplZCBub3RpZmljYXRpb24gdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBzZXF1ZW5jZS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5tYXRlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IE1hdGVyaWFsaXplT2JzZXJ2YWJsZSh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogIFJlcGVhdHMgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRpbWVzLiBJZiB0aGUgcmVwZWF0IGNvdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzZXF1ZW5jZSByZXBlYXRzIGluZGVmaW5pdGVseS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtyZXBlYXRDb3VudF0gIE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHNlcXVlbmNlLiBJZiBub3QgcHJvdmlkZWQsIHJlcGVhdHMgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2luZyB0aGUgZWxlbWVudHMgb2YgdGhlIGdpdmVuIHNlcXVlbmNlIHJlcGVhdGVkbHkuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8ucmVwZWF0ID0gZnVuY3Rpb24gKHJlcGVhdENvdW50KSB7XG4gICAgcmV0dXJuIGVudW1lcmFibGVSZXBlYXQodGhpcywgcmVwZWF0Q291bnQpLmNvbmNhdCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAgUmVwZWF0cyB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMgb3IgdW50aWwgaXQgc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZXMuIElmIHRoZSByZXRyeSBjb3VudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCByZXRyaWVzIGluZGVmaW5pdGVseS5cbiAgICogIE5vdGUgaWYgeW91IGVuY291bnRlciBhbiBlcnJvciBhbmQgd2FudCBpdCB0byByZXRyeSBvbmNlLCB0aGVuIHlvdSBtdXN0IHVzZSAucmV0cnkoMik7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICB2YXIgcmVzID0gcmV0cmllZCA9IHJldHJ5LnJlcGVhdCgpO1xuICAgKiAgdmFyIHJlcyA9IHJldHJpZWQgPSByZXRyeS5yZXBlYXQoMik7XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcmV0cnlDb3VudF0gIE51bWJlciBvZiB0aW1lcyB0byByZXRyeSB0aGUgc2VxdWVuY2UuIElmIG5vdCBwcm92aWRlZCwgcmV0cnkgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgcHJvZHVjaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UgcmVwZWF0ZWRseSB1bnRpbCBpdCB0ZXJtaW5hdGVzIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5yZXRyeSA9IGZ1bmN0aW9uIChyZXRyeUNvdW50KSB7XG4gICAgcmV0dXJuIGVudW1lcmFibGVSZXBlYXQodGhpcywgcmV0cnlDb3VudCkuY2F0Y2hFcnJvcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAgUmVwZWF0cyB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2UgdXBvbiBlcnJvciBlYWNoIHRpbWUgdGhlIG5vdGlmaWVyIGVtaXRzIG9yIHVudGlsIGl0IHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVzLiBcbiAgICogIGlmIHRoZSBub3RpZmllciBjb21wbGV0ZXMsIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbXBsZXRlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogIHZhciB0aW1lciA9IE9ic2VydmFibGUudGltZXIoNTAwKTtcbiAgICogIHZhciBzb3VyY2UgPSBvYnNlcnZhYmxlLnJldHJ5V2hlbih0aW1lcik7XG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gW25vdGlmaWVyXSBBbiBvYnNlcnZhYmxlIHRoYXQgdHJpZ2dlcnMgdGhlIHJldHJpZXMgb3IgY29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdpdGggb25OZXh0IG9yIG9uQ29tcGxldGVkIHJlc3BlY3RpdmVseS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgcHJvZHVjaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UgcmVwZWF0ZWRseSB1bnRpbCBpdCB0ZXJtaW5hdGVzIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5yZXRyeVdoZW4gPSBmdW5jdGlvbiAobm90aWZpZXIpIHtcbiAgICByZXR1cm4gZW51bWVyYWJsZVJlcGVhdCh0aGlzKS5jYXRjaEVycm9yV2hlbihub3RpZmllcik7XG4gIH07XG4gIHZhciBTY2FuT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhTY2FuT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTY2FuT2JzZXJ2YWJsZShzb3VyY2UsIGFjY3VtdWxhdG9yLCBoYXNTZWVkLCBzZWVkKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuYWNjdW11bGF0b3IgPSBhY2N1bXVsYXRvcjtcbiAgICAgIHRoaXMuaGFzU2VlZCA9IGhhc1NlZWQ7XG4gICAgICB0aGlzLnNlZWQgPSBzZWVkO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgU2Nhbk9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBTY2FuT2JzZXJ2ZXIobyx0aGlzKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBTY2FuT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBTY2FuT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFNjYW5PYnNlcnZlciwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTY2FuT2JzZXJ2ZXIobywgcGFyZW50KSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3AgPSBwYXJlbnQ7XG4gICAgICB0aGlzLl9mbiA9IHBhcmVudC5hY2N1bXVsYXRvcjtcbiAgICAgIHRoaXMuX2hzID0gcGFyZW50Lmhhc1NlZWQ7XG4gICAgICB0aGlzLl9zID0gcGFyZW50LnNlZWQ7XG4gICAgICB0aGlzLl9oYSA9IGZhbHNlO1xuICAgICAgdGhpcy5fYSA9IG51bGw7XG4gICAgICB0aGlzLl9odiA9IGZhbHNlO1xuICAgICAgdGhpcy5faSA9IDA7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBTY2FuT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgIXRoaXMuX2h2ICYmICh0aGlzLl9odiA9IHRydWUpO1xuICAgICAgaWYgKHRoaXMuX2hhKSB7XG4gICAgICAgIHRoaXMuX2EgPSB0cnlDYXRjaCh0aGlzLl9mbikodGhpcy5fYSwgeCwgdGhpcy5faSwgdGhpcy5fcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hID0gdGhpcy5faHMgPyB0cnlDYXRjaCh0aGlzLl9mbikodGhpcy5fcywgeCwgdGhpcy5faSwgdGhpcy5fcCkgOiB4O1xuICAgICAgICB0aGlzLl9oYSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fYSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuX28ub25FcnJvcih0aGlzLl9hLmUpOyB9XG4gICAgICB0aGlzLl9vLm9uTmV4dCh0aGlzLl9hKTtcbiAgICAgIHRoaXMuX2krKztcbiAgICB9O1xuXG4gICAgU2Nhbk9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzLl9vLm9uRXJyb3IoZSk7XG4gICAgfTtcblxuICAgIFNjYW5PYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgIXRoaXMuX2h2ICYmIHRoaXMuX2hzICYmIHRoaXMuX28ub25OZXh0KHRoaXMuX3MpO1xuICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2Nhbk9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgKiAgQXBwbGllcyBhbiBhY2N1bXVsYXRvciBmdW5jdGlvbiBvdmVyIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYW5kIHJldHVybnMgZWFjaCBpbnRlcm1lZGlhdGUgcmVzdWx0LiBUaGUgb3B0aW9uYWwgc2VlZCB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAqICBGb3IgYWdncmVnYXRpb24gYmVoYXZpb3Igd2l0aCBubyBpbnRlcm1lZGlhdGUgcmVzdWx0cywgc2VlIE9ic2VydmFibGUuYWdncmVnYXRlLlxuICAqIEBwYXJhbSB7TWl4ZWR9IFtzZWVkXSBUaGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZS5cbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhY2N1bXVsYXRvciBBbiBhY2N1bXVsYXRvciBmdW5jdGlvbiB0byBiZSBpbnZva2VkIG9uIGVhY2ggZWxlbWVudC5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5zY2FuID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYXNTZWVkID0gZmFsc2UsIHNlZWQsIGFjY3VtdWxhdG9yID0gYXJndW1lbnRzWzBdO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBoYXNTZWVkID0gdHJ1ZTtcbiAgICAgIHNlZWQgPSBhcmd1bWVudHNbMV07XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2Nhbk9ic2VydmFibGUodGhpcywgYWNjdW11bGF0b3IsIGhhc1NlZWQsIHNlZWQpO1xuICB9O1xuXG4gIHZhciBTa2lwTGFzdE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFNraXBMYXN0T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTa2lwTGFzdE9ic2VydmFibGUoc291cmNlLCBjKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuX2MgPSBjO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgU2tpcExhc3RPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IFNraXBMYXN0T2JzZXJ2ZXIobywgdGhpcy5fYykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2tpcExhc3RPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIFNraXBMYXN0T2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFNraXBMYXN0T2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gU2tpcExhc3RPYnNlcnZlcihvLCBjKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX2MgPSBjO1xuICAgICAgdGhpcy5fcSA9IFtdO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgU2tpcExhc3RPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB0aGlzLl9xLnB1c2goeCk7XG4gICAgICB0aGlzLl9xLmxlbmd0aCA+IHRoaXMuX2MgJiYgdGhpcy5fby5vbk5leHQodGhpcy5fcS5zaGlmdCgpKTtcbiAgICB9O1xuXG4gICAgU2tpcExhc3RPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuICAgIH07XG5cbiAgICBTa2lwTGFzdE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBTa2lwTGFzdE9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogIEJ5cGFzc2VzIGEgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cyBhdCB0aGUgZW5kIG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgVGhpcyBvcGVyYXRvciBhY2N1bXVsYXRlcyBhIHF1ZXVlIHdpdGggYSBsZW5ndGggZW5vdWdoIHRvIHN0b3JlIHRoZSBmaXJzdCBgY291bnRgIGVsZW1lbnRzLiBBcyBtb3JlIGVsZW1lbnRzIGFyZVxuICAgKiAgcmVjZWl2ZWQsIGVsZW1lbnRzIGFyZSB0YWtlbiBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgYW5kIHByb2R1Y2VkIG9uIHRoZSByZXN1bHQgc2VxdWVuY2UuIFRoaXMgY2F1c2VzIGVsZW1lbnRzIHRvIGJlIGRlbGF5ZWQuXG4gICAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gYnlwYXNzIGF0IHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgc291cmNlIHNlcXVlbmNlIGVsZW1lbnRzIGV4Y2VwdCBmb3IgdGhlIGJ5cGFzc2VkIG9uZXMgYXQgdGhlIGVuZC5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5za2lwTGFzdCA9IGZ1bmN0aW9uIChjb3VudCkge1xuICAgIGlmIChjb3VudCA8IDApIHsgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yKCk7IH1cbiAgICByZXR1cm4gbmV3IFNraXBMYXN0T2JzZXJ2YWJsZSh0aGlzLCBjb3VudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICBQcmVwZW5kcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB0byBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHdpdGggYW4gb3B0aW9uYWwgc2NoZWR1bGVyIGFuZCBhbiBhcmd1bWVudCBsaXN0IG9mIHZhbHVlcyB0byBwcmVwZW5kLlxuICAgKiAgQGV4YW1wbGVcbiAgICogIHZhciByZXMgPSBzb3VyY2Uuc3RhcnRXaXRoKDEsIDIsIDMpO1xuICAgKiAgdmFyIHJlcyA9IHNvdXJjZS5zdGFydFdpdGgoUnguU2NoZWR1bGVyLnRpbWVvdXQsIDEsIDIsIDMpO1xuICAgKiBAcGFyYW0ge0FyZ3VtZW50c30gYXJncyBUaGUgc3BlY2lmaWVkIHZhbHVlcyB0byBwcmVwZW5kIHRvIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHByZXBlbmRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnN0YXJ0V2l0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWVzLCBzY2hlZHVsZXIsIHN0YXJ0ID0gMDtcbiAgICBpZiAoISFhcmd1bWVudHMubGVuZ3RoICYmIGlzU2NoZWR1bGVyKGFyZ3VtZW50c1swXSkpIHtcbiAgICAgIHNjaGVkdWxlciA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHN0YXJ0ID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyO1xuICAgIH1cbiAgICBmb3IodmFyIGFyZ3MgPSBbXSwgaSA9IHN0YXJ0LCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7IH1cbiAgICByZXR1cm4gZW51bWVyYWJsZU9mKFtvYnNlcnZhYmxlRnJvbUFycmF5KGFyZ3MsIHNjaGVkdWxlciksIHRoaXNdKS5jb25jYXQoKTtcbiAgfTtcblxuICB2YXIgVGFrZUxhc3RPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoVGFrZUxhc3RPYnNlcnZlciwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBUYWtlTGFzdE9ic2VydmVyKG8sIGMpIHtcbiAgICAgIHRoaXMuX28gPSBvO1xuICAgICAgdGhpcy5fYyA9IGM7XG4gICAgICB0aGlzLl9xID0gW107XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBUYWtlTGFzdE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHRoaXMuX3EucHVzaCh4KTtcbiAgICAgIHRoaXMuX3EubGVuZ3RoID4gdGhpcy5fYyAmJiB0aGlzLl9xLnNoaWZ0KCk7XG4gICAgfTtcblxuICAgIFRha2VMYXN0T2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcbiAgICB9O1xuXG4gICAgVGFrZUxhc3RPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2hpbGUgKHRoaXMuX3EubGVuZ3RoID4gMCkgeyB0aGlzLl9vLm9uTmV4dCh0aGlzLl9xLnNoaWZ0KCkpOyB9XG4gICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBUYWtlTGFzdE9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogIFJldHVybnMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZWxlbWVudHMgZnJvbSB0aGUgZW5kIG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgVGhpcyBvcGVyYXRvciBhY2N1bXVsYXRlcyBhIGJ1ZmZlciB3aXRoIGEgbGVuZ3RoIGVub3VnaCB0byBzdG9yZSBlbGVtZW50cyBjb3VudCBlbGVtZW50cy4gVXBvbiBjb21wbGV0aW9uIG9mXG4gICAqICB0aGUgc291cmNlIHNlcXVlbmNlLCB0aGlzIGJ1ZmZlciBpcyBkcmFpbmVkIG9uIHRoZSByZXN1bHQgc2VxdWVuY2UuIFRoaXMgY2F1c2VzIHRoZSBlbGVtZW50cyB0byBiZSBkZWxheWVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UgZnJvbSB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMgZnJvbSB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8udGFrZUxhc3QgPSBmdW5jdGlvbiAoY291bnQpIHtcbiAgICBpZiAoY291bnQgPCAwKSB7IHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcigpOyB9XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgVGFrZUxhc3RPYnNlcnZlcihvLCBjb3VudCkpO1xuICAgIH0sIHNvdXJjZSk7XG4gIH07XG5cbm9ic2VydmFibGVQcm90by5mbGF0TWFwQ29uY2F0ID0gb2JzZXJ2YWJsZVByb3RvLmNvbmNhdE1hcCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykge1xuICAgIHJldHVybiBuZXcgRmxhdE1hcE9ic2VydmFibGUodGhpcywgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKS5tZXJnZSgxKTtcbn07XG4gIHZhciBNYXBPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhNYXBPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXG4gICAgZnVuY3Rpb24gTWFwT2JzZXJ2YWJsZShzb3VyY2UsIHNlbGVjdG9yLCB0aGlzQXJnKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuc2VsZWN0b3IgPSBiaW5kQ2FsbGJhY2soc2VsZWN0b3IsIHRoaXNBcmcsIDMpO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5uZXJNYXAoc2VsZWN0b3IsIHNlbGYpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoeCwgaSwgbykgeyByZXR1cm4gc2VsZWN0b3IuY2FsbCh0aGlzLCBzZWxmLnNlbGVjdG9yKHgsIGksIG8pLCBpLCBvKTsgfVxuICAgIH1cblxuICAgIE1hcE9ic2VydmFibGUucHJvdG90eXBlLmludGVybmFsTWFwID0gZnVuY3Rpb24gKHNlbGVjdG9yLCB0aGlzQXJnKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcE9ic2VydmFibGUodGhpcy5zb3VyY2UsIGlubmVyTWFwKHNlbGVjdG9yLCB0aGlzKSwgdGhpc0FyZyk7XG4gICAgfTtcblxuICAgIE1hcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnNlbGVjdG9yLCB0aGlzKSk7XG4gICAgfTtcblxuICAgIGluaGVyaXRzKElubmVyT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIobywgc2VsZWN0b3IsIHNvdXJjZSkge1xuICAgICAgdGhpcy5vID0gbztcbiAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5pID0gMDtcbiAgICAgIEFic3RyYWN0T2JzZXJ2ZXIuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oeCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMuc2VsZWN0b3IpKHgsIHRoaXMuaSsrLCB0aGlzLnNvdXJjZSk7XG4gICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5vLm9uRXJyb3IocmVzdWx0LmUpOyB9XG4gICAgICB0aGlzLm8ub25OZXh0KHJlc3VsdCk7XG4gICAgfTtcblxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuICAgIH07XG5cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLm8ub25Db21wbGV0ZWQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE1hcE9ic2VydmFibGU7XG5cbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIC8qKlxuICAqIFByb2plY3RzIGVhY2ggZWxlbWVudCBvZiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGludG8gYSBuZXcgZm9ybSBieSBpbmNvcnBvcmF0aW5nIHRoZSBlbGVtZW50J3MgaW5kZXguXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZWN0b3IgQSB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBzb3VyY2UgZWxlbWVudDsgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBzb3VyY2UgZWxlbWVudC5cbiAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uIG9uIGVhY2ggZWxlbWVudCBvZiBzb3VyY2UuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5tYXAgPSBvYnNlcnZhYmxlUHJvdG8uc2VsZWN0ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCB0aGlzQXJnKSB7XG4gICAgdmFyIHNlbGVjdG9yRm4gPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICdmdW5jdGlvbicgPyBzZWxlY3RvciA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlbGVjdG9yOyB9O1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgTWFwT2JzZXJ2YWJsZSA/XG4gICAgICB0aGlzLmludGVybmFsTWFwKHNlbGVjdG9yRm4sIHRoaXNBcmcpIDpcbiAgICAgIG5ldyBNYXBPYnNlcnZhYmxlKHRoaXMsIHNlbGVjdG9yRm4sIHRoaXNBcmcpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHBsdWNrZXIoYXJncywgbGVuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1hcHBlcih4KSB7XG4gICAgICB2YXIgY3VycmVudFByb3AgPSB4O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgcCA9IGN1cnJlbnRQcm9wW2FyZ3NbaV1dO1xuICAgICAgICBpZiAodHlwZW9mIHAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgY3VycmVudFByb3AgPSBwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50UHJvcDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBuZXN0ZWQgcHJvcGVydHkgZnJvbSBhbGwgZWxlbWVudHMgaW5cbiAgICogdGhlIE9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7QXJndW1lbnRzfSBhcmd1bWVudHMgVGhlIG5lc3RlZCBwcm9wZXJ0aWVzIHRvIHBsdWNrLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gUmV0dXJucyBhIG5ldyBPYnNlcnZhYmxlIHNlcXVlbmNlIG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5wbHVjayA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGlmIChsZW4gPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdMaXN0IG9mIHByb3BlcnRpZXMgY2Fubm90IGJlIGVtcHR5LicpOyB9XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cbiAgICByZXR1cm4gdGhpcy5tYXAocGx1Y2tlcihhcmdzLCBsZW4pKTtcbiAgfTtcblxub2JzZXJ2YWJsZVByb3RvLmZsYXRNYXAgPSBvYnNlcnZhYmxlUHJvdG8uc2VsZWN0TWFueSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykge1xuICAgIHJldHVybiBuZXcgRmxhdE1hcE9ic2VydmFibGUodGhpcywgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKS5tZXJnZUFsbCgpO1xufTtcblxuXG4vL1xuLy9SeC5PYnNlcnZhYmxlLnByb3RvdHlwZS5mbGF0TWFwV2l0aE1heENvbmN1cnJlbnQgPSBmdW5jdGlvbihsaW1pdCwgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKSB7XG4vLyAgICByZXR1cm4gbmV3IEZsYXRNYXBPYnNlcnZhYmxlKHRoaXMsIHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykubWVyZ2UobGltaXQpO1xuLy99O1xuLy9cblxuUnguT2JzZXJ2YWJsZS5wcm90b3R5cGUuZmxhdE1hcExhdGVzdCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykge1xuICAgIHJldHVybiBuZXcgRmxhdE1hcE9ic2VydmFibGUodGhpcywgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKS5zd2l0Y2hMYXRlc3QoKTtcbn07XG4gIHZhciBTa2lwT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhTa2lwT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTa2lwT2JzZXJ2YWJsZShzb3VyY2UsIGNvdW50KSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuc2tpcENvdW50ID0gY291bnQ7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG4gICAgXG4gICAgU2tpcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnNraXBDb3VudCkpO1xuICAgIH07XG4gICAgXG4gICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvLCBjKSB7XG4gICAgICB0aGlzLmMgPSBjO1xuICAgICAgdGhpcy5yID0gYztcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuICAgICAgaWYgKHRoaXMuciA8PSAwKSB7IFxuICAgICAgICB0aGlzLm8ub25OZXh0KHgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yLS07XG4gICAgICB9XG4gICAgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IHRoaXMuby5vbkVycm9yKGUpOyB9XG4gICAgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IHRoaXMuby5vbkNvbXBsZXRlZCgpOyB9XG4gICAgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBTa2lwT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpOyAgXG4gIFxuICAvKipcbiAgICogQnlwYXNzZXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYW5kIHRoZW4gcmV0dXJucyB0aGUgcmVtYWluaW5nIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgdGhlIHJlbWFpbmluZyBlbGVtZW50cy5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgdGhhdCBvY2N1ciBhZnRlciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBpbnB1dCBzZXF1ZW5jZS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5za2lwID0gZnVuY3Rpb24gKGNvdW50KSB7XG4gICAgaWYgKGNvdW50IDwgMCkgeyB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IoKTsgfVxuICAgIHJldHVybiBuZXcgU2tpcE9ic2VydmFibGUodGhpcywgY291bnQpO1xuICB9O1xuICB2YXIgU2tpcFdoaWxlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoU2tpcFdoaWxlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTa2lwV2hpbGVPYnNlcnZhYmxlKHNvdXJjZSwgZm4pIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5fZm4gPSBmbjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFNraXBXaGlsZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgU2tpcFdoaWxlT2JzZXJ2ZXIobywgdGhpcykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2tpcFdoaWxlT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBTa2lwV2hpbGVPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoU2tpcFdoaWxlT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cbiAgICBmdW5jdGlvbiBTa2lwV2hpbGVPYnNlcnZlcihvLCBwKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3AgPSBwO1xuICAgICAgdGhpcy5faSA9IDA7XG4gICAgICB0aGlzLl9yID0gZmFsc2U7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBTa2lwV2hpbGVPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICBpZiAoIXRoaXMuX3IpIHtcbiAgICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMuX3AuX2ZuKSh4LCB0aGlzLl9pKyssIHRoaXMuX3ApO1xuICAgICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgICB0aGlzLl9yID0gIXJlcztcbiAgICAgIH1cbiAgICAgIHRoaXMuX3IgJiYgdGhpcy5fby5vbk5leHQoeCk7XG4gICAgfTtcbiAgICBTa2lwV2hpbGVPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uRXJyb3IoZSk7IH07XG4gICAgU2tpcFdoaWxlT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuXG4gICAgcmV0dXJuIFNraXBXaGlsZU9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogIEJ5cGFzc2VzIGVsZW1lbnRzIGluIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgbG9uZyBhcyBhIHNwZWNpZmllZCBjb25kaXRpb24gaXMgdHJ1ZSBhbmQgdGhlbiByZXR1cm5zIHRoZSByZW1haW5pbmcgZWxlbWVudHMuXG4gICAqICBUaGUgZWxlbWVudCdzIGluZGV4IGlzIHVzZWQgaW4gdGhlIGxvZ2ljIG9mIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqICB2YXIgcmVzID0gc291cmNlLnNraXBXaGlsZShmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlIDwgMTA7IH0pO1xuICAgKiAgdmFyIHJlcyA9IHNvdXJjZS5za2lwV2hpbGUoZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkgeyByZXR1cm4gdmFsdWUgPCAxMCB8fCBpbmRleCA8IDEwOyB9KTtcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIEEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQgZm9yIGEgY29uZGl0aW9uOyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgdGhlIHNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgZnJvbSB0aGUgaW5wdXQgc2VxdWVuY2Ugc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGxpbmVhciBzZXJpZXMgdGhhdCBkb2VzIG5vdCBwYXNzIHRoZSB0ZXN0IHNwZWNpZmllZCBieSBwcmVkaWNhdGUuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uc2tpcFdoaWxlID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgIHZhciBmbiA9IGJpbmRDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpO1xuICAgIHJldHVybiBuZXcgU2tpcFdoaWxlT2JzZXJ2YWJsZSh0aGlzLCBmbik7XG4gIH07XG5cbiAgdmFyIFRha2VPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFRha2VPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIFxuICAgIGZ1bmN0aW9uIFRha2VPYnNlcnZhYmxlKHNvdXJjZSwgY291bnQpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy50YWtlQ291bnQgPSBjb3VudDtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cbiAgICBcbiAgICBUYWtlT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHRoaXMudGFrZUNvdW50KSk7XG4gICAgfTtcbiAgICBcbiAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIGMpIHtcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLmMgPSBjO1xuICAgICAgdGhpcy5yID0gYztcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlID0ge1xuICAgICAgb25OZXh0OiBmdW5jdGlvbiAoeCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmICh0aGlzLnItLSA+IDApIHtcbiAgICAgICAgICB0aGlzLm8ub25OZXh0KHgpO1xuICAgICAgICAgIHRoaXMuciA8PSAwICYmIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuby5vbkVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcG9zZTogZnVuY3Rpb24gKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH0sXG4gICAgICBmYWlsOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBUYWtlT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpOyAgXG4gIFxuICAvKipcbiAgICogIFJldHVybnMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZWxlbWVudHMgZnJvbSB0aGUgc3RhcnQgb2YgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2hlZHVsZXIgZm9yIHRoZSBlZGdlIGNhc2Ugb2YgdGFrZSgwKS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gU2NoZWR1bGVyIHVzZWQgdG8gcHJvZHVjZSBhbiBPbkNvbXBsZXRlZCBtZXNzYWdlIGluIGNhc2UgPHBhcmFtcmVmIG5hbWU9XCJjb3VudCBjb3VudDwvcGFyYW1yZWY+IGlzIHNldCB0byAwLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBzZXF1ZW5jZS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by50YWtlID0gZnVuY3Rpb24gKGNvdW50LCBzY2hlZHVsZXIpIHtcbiAgICBpZiAoY291bnQgPCAwKSB7IHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcigpOyB9XG4gICAgaWYgKGNvdW50ID09PSAwKSB7IHJldHVybiBvYnNlcnZhYmxlRW1wdHkoc2NoZWR1bGVyKTsgfVxuICAgIHJldHVybiBuZXcgVGFrZU9ic2VydmFibGUodGhpcywgY291bnQpO1xuICB9O1xuXG4gIHZhciBUYWtlV2hpbGVPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUYWtlV2hpbGVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIFRha2VXaGlsZU9ic2VydmFibGUoc291cmNlLCBmbikge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aGlzLl9mbiA9IGZuO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgVGFrZVdoaWxlT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBUYWtlV2hpbGVPYnNlcnZlcihvLCB0aGlzKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBUYWtlV2hpbGVPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIFRha2VXaGlsZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUYWtlV2hpbGVPYnNlcnZlciwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIFRha2VXaGlsZU9ic2VydmVyKG8sIHApIHtcbiAgICAgIHRoaXMuX28gPSBvO1xuICAgICAgdGhpcy5fcCA9IHA7XG4gICAgICB0aGlzLl9pID0gMDtcbiAgICAgIHRoaXMuX3IgPSB0cnVlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgVGFrZVdoaWxlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgaWYgKHRoaXMuX3IpIHtcbiAgICAgICAgdGhpcy5fciA9IHRyeUNhdGNoKHRoaXMuX3AuX2ZuKSh4LCB0aGlzLl9pKyssIHRoaXMuX3ApO1xuICAgICAgICBpZiAodGhpcy5fciA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuX28ub25FcnJvcih0aGlzLl9yLmUpOyB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fcikge1xuICAgICAgICB0aGlzLl9vLm9uTmV4dCh4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFRha2VXaGlsZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuX28ub25FcnJvcihlKTsgfTtcbiAgICBUYWtlV2hpbGVPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9vLm9uQ29tcGxldGVkKCk7IH07XG5cbiAgICByZXR1cm4gVGFrZVdoaWxlT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiAgUmV0dXJucyBlbGVtZW50cyBmcm9tIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgbG9uZyBhcyBhIHNwZWNpZmllZCBjb25kaXRpb24gaXMgdHJ1ZS5cbiAgICogIFRoZSBlbGVtZW50J3MgaW5kZXggaXMgdXNlZCBpbiB0aGUgbG9naWMgb2YgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIEEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQgZm9yIGEgY29uZGl0aW9uOyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgdGhlIHNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgZnJvbSB0aGUgaW5wdXQgc2VxdWVuY2UgdGhhdCBvY2N1ciBiZWZvcmUgdGhlIGVsZW1lbnQgYXQgd2hpY2ggdGhlIHRlc3Qgbm8gbG9uZ2VyIHBhc3Nlcy5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by50YWtlV2hpbGUgPSBmdW5jdGlvbiAocHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgdmFyIGZuID0gYmluZENhbGxiYWNrKHByZWRpY2F0ZSwgdGhpc0FyZywgMyk7XG4gICAgcmV0dXJuIG5ldyBUYWtlV2hpbGVPYnNlcnZhYmxlKHRoaXMsIGZuKTtcbiAgfTtcblxuICB2YXIgRmlsdGVyT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoRmlsdGVyT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIEZpbHRlck9ic2VydmFibGUoc291cmNlLCBwcmVkaWNhdGUsIHRoaXNBcmcpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5wcmVkaWNhdGUgPSBiaW5kQ2FsbGJhY2socHJlZGljYXRlLCB0aGlzQXJnLCAzKTtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEZpbHRlck9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnByZWRpY2F0ZSwgdGhpcykpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpbm5lclByZWRpY2F0ZShwcmVkaWNhdGUsIHNlbGYpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih4LCBpLCBvKSB7IHJldHVybiBzZWxmLnByZWRpY2F0ZSh4LCBpLCBvKSAmJiBwcmVkaWNhdGUuY2FsbCh0aGlzLCB4LCBpLCBvKTsgfVxuICAgIH1cblxuICAgIEZpbHRlck9ic2VydmFibGUucHJvdG90eXBlLmludGVybmFsRmlsdGVyID0gZnVuY3Rpb24ocHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICByZXR1cm4gbmV3IEZpbHRlck9ic2VydmFibGUodGhpcy5zb3VyY2UsIGlubmVyUHJlZGljYXRlKHByZWRpY2F0ZSwgdGhpcyksIHRoaXNBcmcpO1xuICAgIH07XG5cbiAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcbiAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIHByZWRpY2F0ZSwgc291cmNlKSB7XG4gICAgICB0aGlzLm8gPSBvO1xuICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuaSA9IDA7XG4gICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHZhciBzaG91bGRZaWVsZCA9IHRyeUNhdGNoKHRoaXMucHJlZGljYXRlKSh4LCB0aGlzLmkrKywgdGhpcy5zb3VyY2UpO1xuICAgICAgaWYgKHNob3VsZFlpZWxkID09PSBlcnJvck9iaikge1xuICAgICAgICByZXR1cm4gdGhpcy5vLm9uRXJyb3Ioc2hvdWxkWWllbGQuZSk7XG4gICAgICB9XG4gICAgICBzaG91bGRZaWVsZCAmJiB0aGlzLm8ub25OZXh0KHgpO1xuICAgIH07XG5cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzLm8ub25FcnJvcihlKTtcbiAgICB9O1xuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBGaWx0ZXJPYnNlcnZhYmxlO1xuXG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgKiAgRmlsdGVycyB0aGUgZWxlbWVudHMgb2YgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBiYXNlZCBvbiBhIHByZWRpY2F0ZSBieSBpbmNvcnBvcmF0aW5nIHRoZSBlbGVtZW50J3MgaW5kZXguXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIEEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIHNvdXJjZSBlbGVtZW50IGZvciBhIGNvbmRpdGlvbjsgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBzb3VyY2UgZWxlbWVudC5cbiAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIGVsZW1lbnRzIGZyb20gdGhlIGlucHV0IHNlcXVlbmNlIHRoYXQgc2F0aXNmeSB0aGUgY29uZGl0aW9uLlxuICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uZmlsdGVyID0gb2JzZXJ2YWJsZVByb3RvLndoZXJlID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgRmlsdGVyT2JzZXJ2YWJsZSA/IHRoaXMuaW50ZXJuYWxGaWx0ZXIocHJlZGljYXRlLCB0aGlzQXJnKSA6XG4gICAgICBuZXcgRmlsdGVyT2JzZXJ2YWJsZSh0aGlzLCBwcmVkaWNhdGUsIHRoaXNBcmcpO1xuICB9O1xuXG5mdW5jdGlvbiBjcmVhdGVDYk9ic2VydmFibGUoZm4sIGN0eCwgc2VsZWN0b3IsIGFyZ3MpIHtcbiAgdmFyIG8gPSBuZXcgQXN5bmNTdWJqZWN0KCk7XG5cbiAgYXJncy5wdXNoKGNyZWF0ZUNiSGFuZGxlcihvLCBjdHgsIHNlbGVjdG9yKSk7XG4gIGZuLmFwcGx5KGN0eCwgYXJncyk7XG5cbiAgcmV0dXJuIG8uYXNPYnNlcnZhYmxlKCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNiSGFuZGxlcihvLCBjdHgsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdWx0cyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyByZXN1bHRzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgIHJlc3VsdHMgPSB0cnlDYXRjaChzZWxlY3RvcikuYXBwbHkoY3R4LCByZXN1bHRzKTtcbiAgICAgIGlmIChyZXN1bHRzID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdHMuZSk7IH1cbiAgICAgIG8ub25OZXh0KHJlc3VsdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPD0gMSkge1xuICAgICAgICBvLm9uTmV4dChyZXN1bHRzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG8ub25OZXh0KHJlc3VsdHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gd2l0aCBhIGNhbGxiYWNrIGFzIHRoZSBsYXN0IHBhcmFtZXRlciB0byBjb252ZXJ0IHRvIGFuIE9ic2VydmFibGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0ge01peGVkfSBbY3R4XSBUaGUgY29udGV4dCBmb3IgdGhlIGZ1bmMgcGFyYW1ldGVyIHRvIGJlIGV4ZWN1dGVkLiAgSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdW5kZWZpbmVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3NlbGVjdG9yXSBBIHNlbGVjdG9yIHdoaWNoIHRha2VzIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgY2FsbGJhY2sgdG8gcHJvZHVjZSBhIHNpbmdsZSBpdGVtIHRvIHlpZWxkIG9uIG5leHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24sIHdoZW4gZXhlY3V0ZWQgd2l0aCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBtaW51cyB0aGUgY2FsbGJhY2ssIHByb2R1Y2VzIGFuIE9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCBhIHNpbmdsZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBjYWxsYmFjayBhcyBhbiBhcnJheS5cbiAqL1xuT2JzZXJ2YWJsZS5mcm9tQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZm4sIGN0eCwgc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB0eXBlb2YgY3R4ID09PSAndW5kZWZpbmVkJyAmJiAoY3R4ID0gdGhpcyk7IFxuXG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgcmV0dXJuIGNyZWF0ZUNiT2JzZXJ2YWJsZShmbiwgY3R4LCBzZWxlY3RvciwgYXJncyk7XG4gIH07XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVOb2RlT2JzZXJ2YWJsZShmbiwgY3R4LCBzZWxlY3RvciwgYXJncykge1xuICB2YXIgbyA9IG5ldyBBc3luY1N1YmplY3QoKTtcblxuICBhcmdzLnB1c2goY3JlYXRlTm9kZUhhbmRsZXIobywgY3R4LCBzZWxlY3RvcikpO1xuICBmbi5hcHBseShjdHgsIGFyZ3MpO1xuXG4gIHJldHVybiBvLmFzT2JzZXJ2YWJsZSgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlSGFuZGxlcihvLCBjdHgsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyICgpIHtcbiAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdO1xuICAgIGlmIChlcnIpIHsgcmV0dXJuIG8ub25FcnJvcihlcnIpOyB9XG5cbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdWx0cyA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgeyByZXN1bHRzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTsgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24oc2VsZWN0b3IpKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IHRyeUNhdGNoKHNlbGVjdG9yKS5hcHBseShjdHgsIHJlc3VsdHMpO1xuICAgICAgaWYgKHJlc3VsdHMgPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IocmVzdWx0cy5lKTsgfVxuICAgICAgby5vbk5leHQocmVzdWx0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIG8ub25OZXh0KHJlc3VsdHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgby5vbk5leHQocmVzdWx0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgby5vbkNvbXBsZXRlZCgpO1xuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgTm9kZS5qcyBjYWxsYmFjayBzdHlsZSBmdW5jdGlvbiB0byBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLiAgVGhpcyBtdXN0IGJlIGluIGZ1bmN0aW9uIChlcnIsIC4uLikgZm9ybWF0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGxcbiAqIEBwYXJhbSB7TWl4ZWR9IFtjdHhdIFRoZSBjb250ZXh0IGZvciB0aGUgZnVuYyBwYXJhbWV0ZXIgdG8gYmUgZXhlY3V0ZWQuICBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB1bmRlZmluZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIEEgc2VsZWN0b3Igd2hpY2ggdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsYmFjayBtaW51cyB0aGUgZXJyb3IgdG8gcHJvZHVjZSBhIHNpbmdsZSBpdGVtIHRvIHlpZWxkIG9uIG5leHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoIHdoZW4gYXBwbGllZCwgcmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHdpdGggdGhlIGNhbGxiYWNrIGFyZ3VtZW50cyBhcyBhbiBhcnJheS5cbiAqL1xuT2JzZXJ2YWJsZS5mcm9tTm9kZUNhbGxiYWNrID0gZnVuY3Rpb24gKGZuLCBjdHgsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdHlwZW9mIGN0eCA9PT0gJ3VuZGVmaW5lZCcgJiYgKGN0eCA9IHRoaXMpOyBcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgcmV0dXJuIGNyZWF0ZU5vZGVPYnNlcnZhYmxlKGZuLCBjdHgsIHNlbGVjdG9yLCBhcmdzKTtcbiAgfTtcbn07XG5cbiAgZnVuY3Rpb24gaXNOb2RlTGlzdChlbCkge1xuICAgIGlmIChyb290LlN0YXRpY05vZGVMaXN0KSB7XG4gICAgICAvLyBJRTggU3BlY2lmaWNcbiAgICAgIC8vIGluc3RhbmNlb2YgaXMgc2xvd2VyIHRoYW4gT2JqZWN0I3RvU3RyaW5nLCBidXQgT2JqZWN0I3RvU3RyaW5nIHdpbGwgbm90IHdvcmsgYXMgaW50ZW5kZWQgaW4gSUU4XG4gICAgICByZXR1cm4gZWwgaW5zdGFuY2VvZiByb290LlN0YXRpY05vZGVMaXN0IHx8IGVsIGluc3RhbmNlb2Ygcm9vdC5Ob2RlTGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbCkgPT09ICdbb2JqZWN0IE5vZGVMaXN0XSc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gTGlzdGVuRGlzcG9zYWJsZShlLCBuLCBmbikge1xuICAgIHRoaXMuX2UgPSBlO1xuICAgIHRoaXMuX24gPSBuO1xuICAgIHRoaXMuX2ZuID0gZm47XG4gICAgdGhpcy5fZS5hZGRFdmVudExpc3RlbmVyKHRoaXMuX24sIHRoaXMuX2ZuLCBmYWxzZSk7XG4gICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG4gIH1cbiAgTGlzdGVuRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgdGhpcy5fZS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX24sIHRoaXMuX2ZuLCBmYWxzZSk7XG4gICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVFdmVudExpc3RlbmVyIChlbCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgdmFyIGRpc3Bvc2FibGVzID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKTtcblxuICAgIC8vIEFzdW1lIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uXG4gICAgdmFyIGVsZW1Ub1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbCk7XG4gICAgaWYgKGlzTm9kZUxpc3QoZWwpIHx8IGVsZW1Ub1N0cmluZyA9PT0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGRpc3Bvc2FibGVzLmFkZChjcmVhdGVFdmVudExpc3RlbmVyKGVsLml0ZW0oaSksIGV2ZW50TmFtZSwgaGFuZGxlcikpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZWwpIHtcbiAgICAgIGRpc3Bvc2FibGVzLmFkZChuZXcgTGlzdGVuRGlzcG9zYWJsZShlbCwgZXZlbnROYW1lLCBoYW5kbGVyKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc3Bvc2FibGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSBuYXRpdmUgZXZlbnRzIG9ubHlcbiAgICovXG4gIFJ4LmNvbmZpZy51c2VOYXRpdmVFdmVudHMgPSBmYWxzZTtcblxuICB2YXIgRXZlbnRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKEV2ZW50T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBFdmVudE9ic2VydmFibGUoZWwsIG5hbWUsIGZuKSB7XG4gICAgICB0aGlzLl9lbCA9IGVsO1xuICAgICAgdGhpcy5fbiA9IG5hbWU7XG4gICAgICB0aGlzLl9mbiA9IGZuO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihvLCBmbikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIgKCkge1xuICAgICAgICB2YXIgcmVzdWx0cyA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAgICAgcmVzdWx0cyA9IHRyeUNhdGNoKGZuKS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgIGlmIChyZXN1bHRzID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdHMuZSk7IH1cbiAgICAgICAgfVxuICAgICAgICBvLm9uTmV4dChyZXN1bHRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgRXZlbnRPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiBjcmVhdGVFdmVudExpc3RlbmVyKFxuICAgICAgICB0aGlzLl9lbCxcbiAgICAgICAgdGhpcy5fbixcbiAgICAgICAgY3JlYXRlSGFuZGxlcihvLCB0aGlzLl9mbikpO1xuICAgIH07XG5cbiAgICByZXR1cm4gRXZlbnRPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSBhZGRpbmcgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG1hdGNoaW5nIERPTUVsZW1lbnQgb3IgZWFjaCBpdGVtIGluIHRoZSBOb2RlTGlzdC5cbiAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgVGhlIERPTUVsZW1lbnQgb3IgTm9kZUxpc3QgdG8gYXR0YWNoIGEgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gYXR0YWNoIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIEEgc2VsZWN0b3Igd2hpY2ggdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBldmVudCBoYW5kbGVyIHRvIHByb2R1Y2UgYSBzaW5nbGUgaXRlbSB0byB5aWVsZCBvbiBuZXh0LlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBldmVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAqL1xuICBPYnNlcnZhYmxlLmZyb21FdmVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudE5hbWUsIHNlbGVjdG9yKSB7XG4gICAgLy8gTm9kZS5qcyBzcGVjaWZpY1xuICAgIGlmIChlbGVtZW50LmFkZExpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gZnJvbUV2ZW50UGF0dGVybihcbiAgICAgICAgZnVuY3Rpb24gKGgpIHsgZWxlbWVudC5hZGRMaXN0ZW5lcihldmVudE5hbWUsIGgpOyB9LFxuICAgICAgICBmdW5jdGlvbiAoaCkgeyBlbGVtZW50LnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgaCk7IH0sXG4gICAgICAgIHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugb25seSBpZiBub24tbmF0aXZlIGV2ZW50cyBhcmUgYWxsb3dlZFxuICAgIGlmICghUnguY29uZmlnLnVzZU5hdGl2ZUV2ZW50cykge1xuICAgICAgLy8gSGFuZGxlcyBqcSwgQW5ndWxhci5qcywgWmVwdG8sIE1hcmlvbmV0dGUsIEVtYmVyLmpzXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQub24gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVsZW1lbnQub2ZmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmcm9tRXZlbnRQYXR0ZXJuKFxuICAgICAgICAgIGZ1bmN0aW9uIChoKSB7IGVsZW1lbnQub24oZXZlbnROYW1lLCBoKTsgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoaCkgeyBlbGVtZW50Lm9mZihldmVudE5hbWUsIGgpOyB9LFxuICAgICAgICAgIHNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEV2ZW50T2JzZXJ2YWJsZShlbGVtZW50LCBldmVudE5hbWUsIHNlbGVjdG9yKS5wdWJsaXNoKCkucmVmQ291bnQoKTtcbiAgfTtcblxuICB2YXIgRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhFdmVudFBhdHRlcm5PYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEV2ZW50UGF0dGVybk9ic2VydmFibGUoYWRkLCBkZWwsIGZuKSB7XG4gICAgICB0aGlzLl9hZGQgPSBhZGQ7XG4gICAgICB0aGlzLl9kZWwgPSBkZWw7XG4gICAgICB0aGlzLl9mbiA9IGZuO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihvLCBmbikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIgKCkge1xuICAgICAgICB2YXIgcmVzdWx0cyA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAgICAgcmVzdWx0cyA9IHRyeUNhdGNoKGZuKS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgIGlmIChyZXN1bHRzID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdHMuZSk7IH1cbiAgICAgICAgfVxuICAgICAgICBvLm9uTmV4dChyZXN1bHRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgZm4gPSBjcmVhdGVIYW5kbGVyKG8sIHRoaXMuX2ZuKTtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHRoaXMuX2FkZChmbik7XG4gICAgICByZXR1cm4gbmV3IEV2ZW50UGF0dGVybkRpc3Bvc2FibGUodGhpcy5fZGVsLCBmbiwgcmV0dXJuVmFsdWUpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBFdmVudFBhdHRlcm5EaXNwb3NhYmxlKGRlbCwgZm4sIHJldCkge1xuICAgICAgdGhpcy5fZGVsID0gZGVsO1xuICAgICAgdGhpcy5fZm4gPSBmbjtcbiAgICAgIHRoaXMuX3JldCA9IHJldDtcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIEV2ZW50UGF0dGVybkRpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZighdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgIGlzRnVuY3Rpb24odGhpcy5fZGVsKSAmJiB0aGlzLl9kZWwodGhpcy5fZm4sIHRoaXMuX3JldCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBFdmVudFBhdHRlcm5PYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBmcm9tIGFuIGV2ZW50IGVtaXR0ZXIgdmlhIGFuIGFkZEhhbmRsZXIvcmVtb3ZlSGFuZGxlciBwYWlyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZGRIYW5kbGVyIFRoZSBmdW5jdGlvbiB0byBhZGQgYSBoYW5kbGVyIHRvIHRoZSBlbWl0dGVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVtb3ZlSGFuZGxlcl0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIGhhbmRsZXIgZnJvbSBhbiBlbWl0dGVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIEEgc2VsZWN0b3Igd2hpY2ggdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBldmVudCBoYW5kbGVyIHRvIHByb2R1Y2UgYSBzaW5nbGUgaXRlbSB0byB5aWVsZCBvbiBuZXh0LlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aGljaCB3cmFwcyBhbiBldmVudCBmcm9tIGFuIGV2ZW50IGVtaXR0ZXJcbiAgICovXG4gIHZhciBmcm9tRXZlbnRQYXR0ZXJuID0gT2JzZXJ2YWJsZS5mcm9tRXZlbnRQYXR0ZXJuID0gZnVuY3Rpb24gKGFkZEhhbmRsZXIsIHJlbW92ZUhhbmRsZXIsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIG5ldyBFdmVudFBhdHRlcm5PYnNlcnZhYmxlKGFkZEhhbmRsZXIsIHJlbW92ZUhhbmRsZXIsIHNlbGVjdG9yKS5wdWJsaXNoKCkucmVmQ291bnQoKTtcbiAgfTtcblxuICB2YXIgRnJvbVByb21pc2VPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKEZyb21Qcm9taXNlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBGcm9tUHJvbWlzZU9ic2VydmFibGUocCwgcykge1xuICAgICAgdGhpcy5fcCA9IHA7XG4gICAgICB0aGlzLl9zID0gcztcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlTmV4dChzLCBzdGF0ZSkge1xuICAgICAgdmFyIG8gPSBzdGF0ZVswXSwgZGF0YSA9IHN0YXRlWzFdO1xuICAgICAgby5vbk5leHQoZGF0YSk7XG4gICAgICBvLm9uQ29tcGxldGVkKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2NoZWR1bGVFcnJvcihzLCBzdGF0ZSkge1xuICAgICAgdmFyIG8gPSBzdGF0ZVswXSwgZXJyID0gc3RhdGVbMV07XG4gICAgICBvLm9uRXJyb3IoZXJyKTtcbiAgICB9XG5cbiAgICBGcm9tUHJvbWlzZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG4gICAgICB2YXIgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksIHNlbGYgPSB0aGlzO1xuXG4gICAgICB0aGlzLl9wXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgc2FkLnNldERpc3Bvc2FibGUoc2VsZi5fcy5zY2hlZHVsZShbbywgZGF0YV0sIHNjaGVkdWxlTmV4dCkpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgc2FkLnNldERpc3Bvc2FibGUoc2VsZi5fcy5zY2hlZHVsZShbbywgZXJyXSwgc2NoZWR1bGVFcnJvcikpO1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNhZDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEZyb21Qcm9taXNlT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIC8qKlxuICAqIENvbnZlcnRzIGEgUHJvbWlzZSB0byBhbiBPYnNlcnZhYmxlIHNlcXVlbmNlXG4gICogQHBhcmFtIHtQcm9taXNlfSBBbiBFUzYgQ29tcGxpYW50IHByb21pc2UuXG4gICogQHJldHVybnMge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgc2VxdWVuY2Ugd2hpY2ggd3JhcHMgdGhlIGV4aXN0aW5nIHByb21pc2Ugc3VjY2VzcyBhbmQgZmFpbHVyZS5cbiAgKi9cbiAgdmFyIG9ic2VydmFibGVGcm9tUHJvbWlzZSA9IE9ic2VydmFibGUuZnJvbVByb21pc2UgPSBmdW5jdGlvbiAocHJvbWlzZSwgc2NoZWR1bGVyKSB7XG4gICAgc2NoZWR1bGVyIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcbiAgICByZXR1cm4gbmV3IEZyb21Qcm9taXNlT2JzZXJ2YWJsZShwcm9taXNlLCBzY2hlZHVsZXIpO1xuICB9O1xuXG4gIC8qXG4gICAqIENvbnZlcnRzIGFuIGV4aXN0aW5nIG9ic2VydmFibGUgc2VxdWVuY2UgdG8gYW4gRVM2IENvbXBhdGlibGUgUHJvbWlzZVxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcHJvbWlzZSA9IFJ4Lk9ic2VydmFibGUucmV0dXJuKDQyKS50b1Byb21pc2UoUlNWUC5Qcm9taXNlKTtcbiAgICpcbiAgICogLy8gV2l0aCBjb25maWdcbiAgICogUnguY29uZmlnLlByb21pc2UgPSBSU1ZQLlByb21pc2U7XG4gICAqIHZhciBwcm9taXNlID0gUnguT2JzZXJ2YWJsZS5yZXR1cm4oNDIpLnRvUHJvbWlzZSgpO1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvbWlzZUN0b3JdIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcHJvbWlzZS4gSWYgbm90IHByb3ZpZGVkLCBpdCBsb29rcyBmb3IgaXQgaW4gUnguY29uZmlnLlByb21pc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBbiBFUzYgY29tcGF0aWJsZSBwcm9taXNlIHdpdGggdGhlIGxhc3QgdmFsdWUgZnJvbSB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by50b1Byb21pc2UgPSBmdW5jdGlvbiAocHJvbWlzZUN0b3IpIHtcbiAgICBwcm9taXNlQ3RvciB8fCAocHJvbWlzZUN0b3IgPSBSeC5jb25maWcuUHJvbWlzZSk7XG4gICAgaWYgKCFwcm9taXNlQ3RvcikgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoJ1Byb21pc2UgdHlwZSBub3QgcHJvdmlkZWQgbm9yIGluIFJ4LmNvbmZpZy5Qcm9taXNlJyk7IH1cbiAgICB2YXIgc291cmNlID0gdGhpcztcbiAgICByZXR1cm4gbmV3IHByb21pc2VDdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIC8vIE5vIGNhbmNlbGxhdGlvbiBjYW4gYmUgZG9uZVxuICAgICAgdmFyIHZhbHVlO1xuICAgICAgc291cmNlLnN1YnNjcmliZShmdW5jdGlvbiAodikge1xuICAgICAgICB2YWx1ZSA9IHY7XG4gICAgICB9LCByZWplY3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogSW52b2tlcyB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLCBzdXJmYWNpbmcgdGhlIHJlc3VsdCB0aHJvdWdoIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uQXN5bmMgQXN5bmNocm9ub3VzIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBQcm9taXNlIHRvIHJ1bi5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgZXhwb3NpbmcgdGhlIGZ1bmN0aW9uJ3MgcmVzdWx0IHZhbHVlLCBvciBhbiBleGNlcHRpb24uXG4gICAqL1xuICBPYnNlcnZhYmxlLnN0YXJ0QXN5bmMgPSBmdW5jdGlvbiAoZnVuY3Rpb25Bc3luYykge1xuICAgIHZhciBwcm9taXNlID0gdHJ5Q2F0Y2goZnVuY3Rpb25Bc3luYykoKTtcbiAgICBpZiAocHJvbWlzZSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG9ic2VydmFibGVUaHJvdyhwcm9taXNlLmUpOyB9XG4gICAgcmV0dXJuIG9ic2VydmFibGVGcm9tUHJvbWlzZShwcm9taXNlKTtcbiAgfTtcblxuICB2YXIgTXVsdGljYXN0T2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoTXVsdGljYXN0T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBNdWx0aWNhc3RPYnNlcnZhYmxlKHNvdXJjZSwgZm4xLCBmbjIpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5fZm4xID0gZm4xO1xuICAgICAgdGhpcy5fZm4yID0gZm4yO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgTXVsdGljYXN0T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgY29ubmVjdGFibGUgPSB0aGlzLnNvdXJjZS5tdWx0aWNhc3QodGhpcy5fZm4xKCkpO1xuICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKHRoaXMuX2ZuMihjb25uZWN0YWJsZSkuc3Vic2NyaWJlKG8pLCBjb25uZWN0YWJsZS5jb25uZWN0KCkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gTXVsdGljYXN0T2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIC8qKlxuICAgKiBNdWx0aWNhc3RzIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugbm90aWZpY2F0aW9ucyB0aHJvdWdoIGFuIGluc3RhbnRpYXRlZCBzdWJqZWN0IGludG8gYWxsIHVzZXMgb2YgdGhlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLiBFYWNoXG4gICAqIHN1YnNjcmlwdGlvbiB0byB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlIGNhdXNlcyBhIHNlcGFyYXRlIG11bHRpY2FzdCBpbnZvY2F0aW9uLCBleHBvc2luZyB0aGUgc2VxdWVuY2UgcmVzdWx0aW5nIGZyb20gdGhlIHNlbGVjdG9yIGZ1bmN0aW9uJ3NcbiAgICogaW52b2NhdGlvbi4gRm9yIHNwZWNpYWxpemF0aW9ucyB3aXRoIGZpeGVkIHN1YmplY3QgdHlwZXMsIHNlZSBQdWJsaXNoLCBQdWJsaXNoTGFzdCwgYW5kIFJlcGxheS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogMSAtIHJlcyA9IHNvdXJjZS5tdWx0aWNhc3Qob2JzZXJ2YWJsZSk7XG4gICAqIDIgLSByZXMgPSBzb3VyY2UubXVsdGljYXN0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBTdWJqZWN0KCk7IH0sIGZ1bmN0aW9uICh4KSB7IHJldHVybiB4OyB9KTtcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbnxTdWJqZWN0fSBzdWJqZWN0T3JTdWJqZWN0U2VsZWN0b3JcbiAgICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gaW50ZXJtZWRpYXRlIHN1YmplY3QgdGhyb3VnaCB3aGljaCB0aGUgc291cmNlIHNlcXVlbmNlJ3MgZWxlbWVudHMgd2lsbCBiZSBtdWx0aWNhc3QgdG8gdGhlIHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKiBPcjpcbiAgICogU3ViamVjdCB0byBwdXNoIHNvdXJjZSBlbGVtZW50cyBpbnRvLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIE9wdGlvbmFsIHNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiB1c2UgdGhlIG11bHRpY2FzdGVkIHNvdXJjZSBzZXF1ZW5jZSBzdWJqZWN0IHRvIHRoZSBwb2xpY2llcyBlbmZvcmNlZCBieSB0aGUgY3JlYXRlZCBzdWJqZWN0LiBTcGVjaWZpZWQgb25seSBpZiA8cGFyYW1yZWYgbmFtZT1cInN1YmplY3RPclN1YmplY3RTZWxlY3RvclwiIGlzIGEgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBwcm9kdWNlZCBieSBtdWx0aWNhc3RpbmcgdGhlIHNvdXJjZSBzZXF1ZW5jZSB3aXRoaW4gYSBzZWxlY3RvciBmdW5jdGlvbi5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5tdWx0aWNhc3QgPSBmdW5jdGlvbiAoc3ViamVjdE9yU3ViamVjdFNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKHN1YmplY3RPclN1YmplY3RTZWxlY3RvcikgP1xuICAgICAgbmV3IE11bHRpY2FzdE9ic2VydmFibGUodGhpcywgc3ViamVjdE9yU3ViamVjdFNlbGVjdG9yLCBzZWxlY3RvcikgOlxuICAgICAgbmV3IENvbm5lY3RhYmxlT2JzZXJ2YWJsZSh0aGlzLCBzdWJqZWN0T3JTdWJqZWN0U2VsZWN0b3IpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBzZWxlY3RvciBvbiBhIGNvbm5lY3RhYmxlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBzaGFyZXMgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlLlxuICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgTXVsdGljYXN0IHVzaW5nIGEgcmVndWxhciBTdWJqZWN0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcmVzcmVzID0gc291cmNlLnB1Ymxpc2goKTtcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5wdWJsaXNoKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4OyB9KTtcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NlbGVjdG9yXSBTZWxlY3RvciBmdW5jdGlvbiB3aGljaCBjYW4gdXNlIHRoZSBtdWx0aWNhc3RlZCBzb3VyY2Ugc2VxdWVuY2UgYXMgbWFueSB0aW1lcyBhcyBuZWVkZWQsIHdpdGhvdXQgY2F1c2luZyBtdWx0aXBsZSBzdWJzY3JpcHRpb25zIHRvIHRoZSBzb3VyY2Ugc2VxdWVuY2UuIFN1YnNjcmliZXJzIHRvIHRoZSBnaXZlbiBzb3VyY2Ugd2lsbCByZWNlaXZlIGFsbCBub3RpZmljYXRpb25zIG9mIHRoZSBzb3VyY2UgZnJvbSB0aGUgdGltZSBvZiB0aGUgc3Vic2NyaXB0aW9uIG9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnB1Ymxpc2ggPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gc2VsZWN0b3IgJiYgaXNGdW5jdGlvbihzZWxlY3RvcikgP1xuICAgICAgdGhpcy5tdWx0aWNhc3QoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFN1YmplY3QoKTsgfSwgc2VsZWN0b3IpIDpcbiAgICAgIHRoaXMubXVsdGljYXN0KG5ldyBTdWJqZWN0KCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBzaGFyZXMgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlLlxuICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgcHVibGlzaCB3aGljaCBjcmVhdGVzIGEgc3Vic2NyaXB0aW9uIHdoZW4gdGhlIG51bWJlciBvZiBvYnNlcnZlcnMgZ29lcyBmcm9tIHplcm8gdG8gb25lLCB0aGVuIHNoYXJlcyB0aGF0IHN1YnNjcmlwdGlvbiB3aXRoIGFsbCBzdWJzZXF1ZW50IG9ic2VydmVycyB1bnRpbCB0aGUgbnVtYmVyIG9mIG9ic2VydmVycyByZXR1cm5zIHRvIHplcm8sIGF0IHdoaWNoIHBvaW50IHRoZSBzdWJzY3JpcHRpb24gaXMgZGlzcG9zZWQuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uc2hhcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMucHVibGlzaCgpLnJlZkNvdW50KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIHNlbGVjdG9yIG9uIGEgY29ubmVjdGFibGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNoYXJlcyBhIHNpbmdsZSBzdWJzY3JpcHRpb24gdG8gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UgY29udGFpbmluZyBvbmx5IHRoZSBsYXN0IG5vdGlmaWNhdGlvbi5cbiAgICogVGhpcyBvcGVyYXRvciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIE11bHRpY2FzdCB1c2luZyBhIEFzeW5jU3ViamVjdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5wdWJsaXNoTGFzdCgpO1xuICAgKiB2YXIgcmVzID0gc291cmNlLnB1Ymxpc2hMYXN0KGZ1bmN0aW9uICh4KSB7IHJldHVybiB4OyB9KTtcbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdG9yIFtPcHRpb25hbF0gU2VsZWN0b3IgZnVuY3Rpb24gd2hpY2ggY2FuIHVzZSB0aGUgbXVsdGljYXN0ZWQgc291cmNlIHNlcXVlbmNlIGFzIG1hbnkgdGltZXMgYXMgbmVlZGVkLCB3aXRob3V0IGNhdXNpbmcgbXVsdGlwbGUgc3Vic2NyaXB0aW9ucyB0byB0aGUgc291cmNlIHNlcXVlbmNlLiBTdWJzY3JpYmVycyB0byB0aGUgZ2l2ZW4gc291cmNlIHdpbGwgb25seSByZWNlaXZlIHRoZSBsYXN0IG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnB1Ymxpc2hMYXN0ID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yICYmIGlzRnVuY3Rpb24oc2VsZWN0b3IpID9cbiAgICAgIHRoaXMubXVsdGljYXN0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBBc3luY1N1YmplY3QoKTsgfSwgc2VsZWN0b3IpIDpcbiAgICAgIHRoaXMubXVsdGljYXN0KG5ldyBBc3luY1N1YmplY3QoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIHNlbGVjdG9yIG9uIGEgY29ubmVjdGFibGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNoYXJlcyBhIHNpbmdsZSBzdWJzY3JpcHRpb24gdG8gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UgYW5kIHN0YXJ0cyB3aXRoIGluaXRpYWxWYWx1ZS5cbiAgICogVGhpcyBvcGVyYXRvciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIE11bHRpY2FzdCB1c2luZyBhIEJlaGF2aW9yU3ViamVjdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5wdWJsaXNoVmFsdWUoNDIpO1xuICAgKiB2YXIgcmVzID0gc291cmNlLnB1Ymxpc2hWYWx1ZShmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5zZWxlY3QoZnVuY3Rpb24gKHkpIHsgcmV0dXJuIHkgKiB5OyB9KSB9LCA0Mik7XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtzZWxlY3Rvcl0gT3B0aW9uYWwgc2VsZWN0b3IgZnVuY3Rpb24gd2hpY2ggY2FuIHVzZSB0aGUgbXVsdGljYXN0ZWQgc291cmNlIHNlcXVlbmNlIGFzIG1hbnkgdGltZXMgYXMgbmVlZGVkLCB3aXRob3V0IGNhdXNpbmcgbXVsdGlwbGUgc3Vic2NyaXB0aW9ucyB0byB0aGUgc291cmNlIHNlcXVlbmNlLiBTdWJzY3JpYmVycyB0byB0aGUgZ2l2ZW4gc291cmNlIHdpbGwgcmVjZWl2ZSBpbW1lZGlhdGVseSByZWNlaXZlIHRoZSBpbml0aWFsIHZhbHVlLCBmb2xsb3dlZCBieSBhbGwgbm90aWZpY2F0aW9ucyBvZiB0aGUgc291cmNlIGZyb20gdGhlIHRpbWUgb2YgdGhlIHN1YnNjcmlwdGlvbiBvbi5cbiAgICogQHBhcmFtIHtNaXhlZH0gaW5pdGlhbFZhbHVlIEluaXRpYWwgdmFsdWUgcmVjZWl2ZWQgYnkgb2JzZXJ2ZXJzIHVwb24gc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnB1Ymxpc2hWYWx1ZSA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWVPclNlbGVjdG9yLCBpbml0aWFsVmFsdWUpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMiA/XG4gICAgICB0aGlzLm11bHRpY2FzdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmVoYXZpb3JTdWJqZWN0KGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LCBpbml0aWFsVmFsdWVPclNlbGVjdG9yKSA6XG4gICAgICB0aGlzLm11bHRpY2FzdChuZXcgQmVoYXZpb3JTdWJqZWN0KGluaXRpYWxWYWx1ZU9yU2VsZWN0b3IpKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSBhbmQgc3RhcnRzIHdpdGggYW4gaW5pdGlhbFZhbHVlLlxuICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgcHVibGlzaFZhbHVlIHdoaWNoIGNyZWF0ZXMgYSBzdWJzY3JpcHRpb24gd2hlbiB0aGUgbnVtYmVyIG9mIG9ic2VydmVycyBnb2VzIGZyb20gemVybyB0byBvbmUsIHRoZW4gc2hhcmVzIHRoYXQgc3Vic2NyaXB0aW9uIHdpdGggYWxsIHN1YnNlcXVlbnQgb2JzZXJ2ZXJzIHVudGlsIHRoZSBudW1iZXIgb2Ygb2JzZXJ2ZXJzIHJldHVybnMgdG8gemVybywgYXQgd2hpY2ggcG9pbnQgdGhlIHN1YnNjcmlwdGlvbiBpcyBkaXNwb3NlZC5cbiAgICogQHBhcmFtIHtNaXhlZH0gaW5pdGlhbFZhbHVlIEluaXRpYWwgdmFsdWUgcmVjZWl2ZWQgYnkgb2JzZXJ2ZXJzIHVwb24gc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnNoYXJlVmFsdWUgPSBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMucHVibGlzaFZhbHVlKGluaXRpYWxWYWx1ZSkucmVmQ291bnQoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgc2VsZWN0b3Igb24gYSBjb25uZWN0YWJsZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSByZXBsYXlpbmcgbm90aWZpY2F0aW9ucyBzdWJqZWN0IHRvIGEgbWF4aW11bSB0aW1lIGxlbmd0aCBmb3IgdGhlIHJlcGxheSBidWZmZXIuXG4gICAqIFRoaXMgb3BlcmF0b3IgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiBNdWx0aWNhc3QgdXNpbmcgYSBSZXBsYXlTdWJqZWN0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcmVzID0gc291cmNlLnJlcGxheShudWxsLCAzKTtcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5yZXBsYXkobnVsbCwgMywgNTAwKTtcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5yZXBsYXkobnVsbCwgMywgNTAwLCBzY2hlZHVsZXIpO1xuICAgKiB2YXIgcmVzID0gc291cmNlLnJlcGxheShmdW5jdGlvbiAoeCkgeyByZXR1cm4geC50YWtlKDYpLnJlcGVhdCgpOyB9LCAzLCA1MDAsIHNjaGVkdWxlcik7XG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3RvciBbT3B0aW9uYWxdIFNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiB1c2UgdGhlIG11bHRpY2FzdGVkIHNvdXJjZSBzZXF1ZW5jZSBhcyBtYW55IHRpbWVzIGFzIG5lZWRlZCwgd2l0aG91dCBjYXVzaW5nIG11bHRpcGxlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNvdXJjZSBzZXF1ZW5jZS4gU3Vic2NyaWJlcnMgdG8gdGhlIGdpdmVuIHNvdXJjZSB3aWxsIHJlY2VpdmUgYWxsIHRoZSBub3RpZmljYXRpb25zIG9mIHRoZSBzb3VyY2Ugc3ViamVjdCB0byB0aGUgc3BlY2lmaWVkIHJlcGxheSBidWZmZXIgdHJpbW1pbmcgcG9saWN5LlxuICAgKiBAcGFyYW0gYnVmZmVyU2l6ZSBbT3B0aW9uYWxdIE1heGltdW0gZWxlbWVudCBjb3VudCBvZiB0aGUgcmVwbGF5IGJ1ZmZlci5cbiAgICogQHBhcmFtIHdpbmRvd1NpemUgW09wdGlvbmFsXSBNYXhpbXVtIHRpbWUgbGVuZ3RoIG9mIHRoZSByZXBsYXkgYnVmZmVyLlxuICAgKiBAcGFyYW0gc2NoZWR1bGVyIFtPcHRpb25hbF0gU2NoZWR1bGVyIHdoZXJlIGNvbm5lY3RlZCBvYnNlcnZlcnMgd2l0aGluIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb24uXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aGluIGEgc2VsZWN0b3IgZnVuY3Rpb24uXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8ucmVwbGF5ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBidWZmZXJTaXplLCB3aW5kb3dTaXplLCBzY2hlZHVsZXIpIHtcbiAgICByZXR1cm4gc2VsZWN0b3IgJiYgaXNGdW5jdGlvbihzZWxlY3RvcikgP1xuICAgICAgdGhpcy5tdWx0aWNhc3QoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFJlcGxheVN1YmplY3QoYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKTsgfSwgc2VsZWN0b3IpIDpcbiAgICAgIHRoaXMubXVsdGljYXN0KG5ldyBSZXBsYXlTdWJqZWN0KGJ1ZmZlclNpemUsIHdpbmRvd1NpemUsIHNjaGVkdWxlcikpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBzaGFyZXMgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlIHJlcGxheWluZyBub3RpZmljYXRpb25zIHN1YmplY3QgdG8gYSBtYXhpbXVtIHRpbWUgbGVuZ3RoIGZvciB0aGUgcmVwbGF5IGJ1ZmZlci5cbiAgICogVGhpcyBvcGVyYXRvciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIHJlcGxheSB3aGljaCBjcmVhdGVzIGEgc3Vic2NyaXB0aW9uIHdoZW4gdGhlIG51bWJlciBvZiBvYnNlcnZlcnMgZ29lcyBmcm9tIHplcm8gdG8gb25lLCB0aGVuIHNoYXJlcyB0aGF0IHN1YnNjcmlwdGlvbiB3aXRoIGFsbCBzdWJzZXF1ZW50IG9ic2VydmVycyB1bnRpbCB0aGUgbnVtYmVyIG9mIG9ic2VydmVycyByZXR1cm5zIHRvIHplcm8sIGF0IHdoaWNoIHBvaW50IHRoZSBzdWJzY3JpcHRpb24gaXMgZGlzcG9zZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciByZXMgPSBzb3VyY2Uuc2hhcmVSZXBsYXkoMyk7XG4gICAqIHZhciByZXMgPSBzb3VyY2Uuc2hhcmVSZXBsYXkoMywgNTAwKTtcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5zaGFyZVJlcGxheSgzLCA1MDAsIHNjaGVkdWxlcik7XG4gICAqXG5cbiAgICogQHBhcmFtIGJ1ZmZlclNpemUgW09wdGlvbmFsXSBNYXhpbXVtIGVsZW1lbnQgY291bnQgb2YgdGhlIHJlcGxheSBidWZmZXIuXG4gICAqIEBwYXJhbSB3aW5kb3cgW09wdGlvbmFsXSBNYXhpbXVtIHRpbWUgbGVuZ3RoIG9mIHRoZSByZXBsYXkgYnVmZmVyLlxuICAgKiBAcGFyYW0gc2NoZWR1bGVyIFtPcHRpb25hbF0gU2NoZWR1bGVyIHdoZXJlIGNvbm5lY3RlZCBvYnNlcnZlcnMgd2l0aGluIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb24uXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uc2hhcmVSZXBsYXkgPSBmdW5jdGlvbiAoYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGF5KG51bGwsIGJ1ZmZlclNpemUsIHdpbmRvd1NpemUsIHNjaGVkdWxlcikucmVmQ291bnQoKTtcbiAgfTtcblxuICB2YXIgUmVmQ291bnRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhSZWZDb3VudE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gUmVmQ291bnRPYnNlcnZhYmxlKHNvdXJjZSkge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aGlzLl9jb3VudCA9IDA7XG4gICAgICB0aGlzLl9jb25uZWN0YWJsZVN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBSZWZDb3VudE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIHNob3VsZENvbm5lY3QgPSArK3RoaXMuX2NvdW50ID09PSAxLCBzdWJzY3JpcHRpb24gPSB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobyk7XG4gICAgICBzaG91bGRDb25uZWN0ICYmICh0aGlzLl9jb25uZWN0YWJsZVN1YnNjcmlwdGlvbiA9IHRoaXMuc291cmNlLmNvbm5lY3QoKSk7XG4gICAgICByZXR1cm4gbmV3IFJlZkNvdW50RGlzcG9zYWJsZSh0aGlzLCBzdWJzY3JpcHRpb24pO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBSZWZDb3VudERpc3Bvc2FibGUocCwgcykge1xuICAgICAgdGhpcy5fcCA9IHA7XG4gICAgICB0aGlzLl9zID0gcztcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIFJlZkNvdW50RGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3MuZGlzcG9zZSgpO1xuICAgICAgICAtLXRoaXMuX3AuX2NvdW50ID09PSAwICYmIHRoaXMuX3AuX2Nvbm5lY3RhYmxlU3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFJlZkNvdW50T2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBDb25uZWN0YWJsZU9ic2VydmFibGUgPSBSeC5Db25uZWN0YWJsZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKENvbm5lY3RhYmxlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBDb25uZWN0YWJsZU9ic2VydmFibGUoc291cmNlLCBzdWJqZWN0KSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuX2hhc1N1YnNjcmlwdGlvbiAgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICB0aGlzLl9zb3VyY2VPYnNlcnZhYmxlID0gc291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IHN1YmplY3Q7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDb25uZWN0RGlzcG9zYWJsZShwYXJlbnQpIHtcbiAgICAgIHRoaXMuX3AgPSBwYXJlbnQ7XG4gICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBDb25uZWN0RGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3AuX2hhc1N1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBDb25uZWN0YWJsZU9ic2VydmFibGUucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMuX2hhc1N1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLl9oYXNTdWJzY3JpcHRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSBuZXcgQmluYXJ5RGlzcG9zYWJsZShcbiAgICAgICAgICB0aGlzLl9zb3VyY2VPYnNlcnZhYmxlLnN1YnNjcmliZSh0aGlzLl9zdWJqZWN0KSxcbiAgICAgICAgICBuZXcgQ29ubmVjdERpc3Bvc2FibGUodGhpcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpcHRpb247XG4gICAgfTtcblxuICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3ViamVjdC5zdWJzY3JpYmUobyk7XG4gICAgfTtcblxuICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVmQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IFJlZkNvdW50T2JzZXJ2YWJsZSh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlKSk7XG5cbiAgdmFyIFRpbWVyT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUaW1lck9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gVGltZXJPYnNlcnZhYmxlKGR0LCBzKSB7XG4gICAgICB0aGlzLl9kdCA9IGR0O1xuICAgICAgdGhpcy5fcyA9IHM7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBUaW1lck9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuX3Muc2NoZWR1bGVGdXR1cmUobywgdGhpcy5fZHQsIHNjaGVkdWxlTWV0aG9kKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gc2NoZWR1bGVNZXRob2Qocywgbykge1xuICAgICAgby5vbk5leHQoMCk7XG4gICAgICBvLm9uQ29tcGxldGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFRpbWVyT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIGZ1bmN0aW9uIF9vYnNlcnZhYmxlVGltZXIoZHVlVGltZSwgc2NoZWR1bGVyKSB7XG4gICAgcmV0dXJuIG5ldyBUaW1lck9ic2VydmFibGUoZHVlVGltZSwgc2NoZWR1bGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ic2VydmFibGVUaW1lckRhdGVBbmRQZXJpb2QoZHVlVGltZSwgcGVyaW9kLCBzY2hlZHVsZXIpIHtcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2YXIgZCA9IGR1ZVRpbWUsIHAgPSBub3JtYWxpemVUaW1lKHBlcmlvZCk7XG4gICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlRnV0dXJlKDAsIGQsIGZ1bmN0aW9uIChjb3VudCwgc2VsZikge1xuICAgICAgICBpZiAocCA+IDApIHtcbiAgICAgICAgICB2YXIgbm93ID0gc2NoZWR1bGVyLm5vdygpO1xuICAgICAgICAgIGQgPSBuZXcgRGF0ZShkLmdldFRpbWUoKSArIHApO1xuICAgICAgICAgIGQuZ2V0VGltZSgpIDw9IG5vdyAmJiAoZCA9IG5ldyBEYXRlKG5vdyArIHApKTtcbiAgICAgICAgfVxuICAgICAgICBvYnNlcnZlci5vbk5leHQoY291bnQpO1xuICAgICAgICBzZWxmKGNvdW50ICsgMSwgbmV3IERhdGUoZCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvYnNlcnZhYmxlVGltZXJUaW1lU3BhbkFuZFBlcmlvZChkdWVUaW1lLCBwZXJpb2QsIHNjaGVkdWxlcikge1xuICAgIHJldHVybiBkdWVUaW1lID09PSBwZXJpb2QgP1xuICAgICAgbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGVQZXJpb2RpYygwLCBwZXJpb2QsIGZ1bmN0aW9uIChjb3VudCkge1xuICAgICAgICAgIG9ic2VydmVyLm9uTmV4dChjb3VudCk7XG4gICAgICAgICAgcmV0dXJuIGNvdW50ICsgMTtcbiAgICAgICAgfSk7XG4gICAgICB9KSA6XG4gICAgICBvYnNlcnZhYmxlRGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVRpbWVyRGF0ZUFuZFBlcmlvZChuZXcgRGF0ZShzY2hlZHVsZXIubm93KCkgKyBkdWVUaW1lKSwgcGVyaW9kLCBzY2hlZHVsZXIpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYWZ0ZXIgZWFjaCBwZXJpb2QuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAxIC0gcmVzID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKTtcbiAgICogIDIgLSByZXMgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDAsIFJ4LlNjaGVkdWxlci50aW1lb3V0KTtcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBlcmlvZCBQZXJpb2QgZm9yIHByb2R1Y2luZyB0aGUgdmFsdWVzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UgKHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGRlbm90aW5nIG1pbGxpc2Vjb25kcykuXG4gICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gcnVuIHRoZSB0aW1lciBvbi4gSWYgbm90IHNwZWNpZmllZCwgUnguU2NoZWR1bGVyLnRpbWVvdXQgaXMgdXNlZC5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBwcm9kdWNlcyBhIHZhbHVlIGFmdGVyIGVhY2ggcGVyaW9kLlxuICAgKi9cbiAgdmFyIG9ic2VydmFibGVpbnRlcnZhbCA9IE9ic2VydmFibGUuaW50ZXJ2YWwgPSBmdW5jdGlvbiAocGVyaW9kLCBzY2hlZHVsZXIpIHtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZVRpbWVyVGltZVNwYW5BbmRQZXJpb2QocGVyaW9kLCBwZXJpb2QsIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgPyBzY2hlZHVsZXIgOiBkZWZhdWx0U2NoZWR1bGVyKTtcbiAgfTtcblxuICAvKipcbiAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYWZ0ZXIgZHVlVGltZSBoYXMgZWxhcHNlZCBhbmQgdGhlbiBhZnRlciBlYWNoIHBlcmlvZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGR1ZVRpbWUgQWJzb2x1dGUgKHNwZWNpZmllZCBhcyBhIERhdGUgb2JqZWN0KSBvciByZWxhdGl2ZSB0aW1lIChzcGVjaWZpZWQgYXMgYW4gaW50ZWdlciBkZW5vdGluZyBtaWxsaXNlY29uZHMpIGF0IHdoaWNoIHRvIHByb2R1Y2UgdGhlIGZpcnN0IHZhbHVlLlxuICAgKiBAcGFyYW0ge01peGVkfSBbcGVyaW9kT3JTY2hlZHVsZXJdICBQZXJpb2QgdG8gcHJvZHVjZSBzdWJzZXF1ZW50IHZhbHVlcyAoc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgZGVub3RpbmcgbWlsbGlzZWNvbmRzKSwgb3IgdGhlIHNjaGVkdWxlciB0byBydW4gdGhlIHRpbWVyIG9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgcmVzdWx0aW5nIHRpbWVyIGlzIG5vdCByZWN1cnJpbmcuXG4gICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSAgU2NoZWR1bGVyIHRvIHJ1biB0aGUgdGltZXIgb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0aW1lb3V0IHNjaGVkdWxlciBpcyB1c2VkLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYWZ0ZXIgZHVlIHRpbWUgaGFzIGVsYXBzZWQgYW5kIHRoZW4gZWFjaCBwZXJpb2QuXG4gICAqL1xuICB2YXIgb2JzZXJ2YWJsZVRpbWVyID0gT2JzZXJ2YWJsZS50aW1lciA9IGZ1bmN0aW9uIChkdWVUaW1lLCBwZXJpb2RPclNjaGVkdWxlciwgc2NoZWR1bGVyKSB7XG4gICAgdmFyIHBlcmlvZDtcbiAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcbiAgICBpZiAocGVyaW9kT3JTY2hlZHVsZXIgIT0gbnVsbCAmJiB0eXBlb2YgcGVyaW9kT3JTY2hlZHVsZXIgPT09ICdudW1iZXInKSB7XG4gICAgICBwZXJpb2QgPSBwZXJpb2RPclNjaGVkdWxlcjtcbiAgICB9IGVsc2UgaWYgKGlzU2NoZWR1bGVyKHBlcmlvZE9yU2NoZWR1bGVyKSkge1xuICAgICAgc2NoZWR1bGVyID0gcGVyaW9kT3JTY2hlZHVsZXI7XG4gICAgfVxuICAgIGlmICgoZHVlVGltZSBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIGR1ZVRpbWUgPT09ICdudW1iZXInKSAmJiBwZXJpb2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGltZXIoZHVlVGltZSwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGR1ZVRpbWUgaW5zdGFuY2VvZiBEYXRlICYmIHBlcmlvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZVRpbWVyRGF0ZUFuZFBlcmlvZChkdWVUaW1lLmdldFRpbWUoKSwgcGVyaW9kT3JTY2hlZHVsZXIsIHNjaGVkdWxlcik7XG4gICAgfVxuICAgIHJldHVybiBvYnNlcnZhYmxlVGltZXJUaW1lU3BhbkFuZFBlcmlvZChkdWVUaW1lLCBwZXJpb2QsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZURlbGF5UmVsYXRpdmUoc291cmNlLCBkdWVUaW1lLCBzY2hlZHVsZXIpIHtcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBhY3RpdmUgPSBmYWxzZSxcbiAgICAgICAgY2FuY2VsYWJsZSA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksXG4gICAgICAgIGV4Y2VwdGlvbiA9IG51bGwsXG4gICAgICAgIHEgPSBbXSxcbiAgICAgICAgcnVubmluZyA9IGZhbHNlLFxuICAgICAgICBzdWJzY3JpcHRpb247XG4gICAgICBzdWJzY3JpcHRpb24gPSBzb3VyY2UubWF0ZXJpYWxpemUoKS50aW1lc3RhbXAoc2NoZWR1bGVyKS5zdWJzY3JpYmUoZnVuY3Rpb24gKG5vdGlmaWNhdGlvbikge1xuICAgICAgICB2YXIgZCwgc2hvdWxkUnVuO1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uLnZhbHVlLmtpbmQgPT09ICdFJykge1xuICAgICAgICAgIHEgPSBbXTtcbiAgICAgICAgICBxLnB1c2gobm90aWZpY2F0aW9uKTtcbiAgICAgICAgICBleGNlcHRpb24gPSBub3RpZmljYXRpb24udmFsdWUuZXJyb3I7XG4gICAgICAgICAgc2hvdWxkUnVuID0gIXJ1bm5pbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcS5wdXNoKHsgdmFsdWU6IG5vdGlmaWNhdGlvbi52YWx1ZSwgdGltZXN0YW1wOiBub3RpZmljYXRpb24udGltZXN0YW1wICsgZHVlVGltZSB9KTtcbiAgICAgICAgICBzaG91bGRSdW4gPSAhYWN0aXZlO1xuICAgICAgICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZFJ1bikge1xuICAgICAgICAgIGlmIChleGNlcHRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIG8ub25FcnJvcihleGNlcHRpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgICAgICAgICBjYW5jZWxhYmxlLnNldERpc3Bvc2FibGUoZCk7XG4gICAgICAgICAgICBkLnNldERpc3Bvc2FibGUoc2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlRnV0dXJlKG51bGwsIGR1ZVRpbWUsIGZ1bmN0aW9uIChfLCBzZWxmKSB7XG4gICAgICAgICAgICAgIHZhciBlLCByZWN1cnNlRHVlVGltZSwgcmVzdWx0LCBzaG91bGRSZWN1cnNlO1xuICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocS5sZW5ndGggPiAwICYmIHFbMF0udGltZXN0YW1wIC0gc2NoZWR1bGVyLm5vdygpIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHEuc2hpZnQoKS52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0LmFjY2VwdChvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gd2hpbGUgKHJlc3VsdCAhPT0gbnVsbCk7XG4gICAgICAgICAgICAgIHNob3VsZFJlY3Vyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmVjdXJzZUR1ZVRpbWUgPSAwO1xuICAgICAgICAgICAgICBpZiAocS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc2hvdWxkUmVjdXJzZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVjdXJzZUR1ZVRpbWUgPSBNYXRoLm1heCgwLCBxWzBdLnRpbWVzdGFtcCAtIHNjaGVkdWxlci5ub3coKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZSA9IGV4Y2VwdGlvbjtcbiAgICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAoZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG8ub25FcnJvcihlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSZWN1cnNlKSB7XG4gICAgICAgICAgICAgICAgc2VsZihudWxsLCByZWN1cnNlRHVlVGltZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbiwgY2FuY2VsYWJsZSk7XG4gICAgfSwgc291cmNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ic2VydmFibGVEZWxheUFic29sdXRlKHNvdXJjZSwgZHVlVGltZSwgc2NoZWR1bGVyKSB7XG4gICAgcmV0dXJuIG9ic2VydmFibGVEZWZlcihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZURlbGF5UmVsYXRpdmUoc291cmNlLCBkdWVUaW1lIC0gc2NoZWR1bGVyLm5vdygpLCBzY2hlZHVsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVsYXlXaXRoU2VsZWN0b3Ioc291cmNlLCBzdWJzY3JpcHRpb25EZWxheSwgZGVsYXlEdXJhdGlvblNlbGVjdG9yKSB7XG4gICAgdmFyIHN1YkRlbGF5LCBzZWxlY3RvcjtcbiAgICBpZiAoaXNGdW5jdGlvbihzdWJzY3JpcHRpb25EZWxheSkpIHtcbiAgICAgIHNlbGVjdG9yID0gc3Vic2NyaXB0aW9uRGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1YkRlbGF5ID0gc3Vic2NyaXB0aW9uRGVsYXk7XG4gICAgICBzZWxlY3RvciA9IGRlbGF5RHVyYXRpb25TZWxlY3RvcjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgZGVsYXlzID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKSwgYXRFbmQgPSBmYWxzZSwgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKTtcblxuICAgICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoXG4gICAgICAgICAgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHZhciBkZWxheSA9IHRyeUNhdGNoKHNlbGVjdG9yKSh4KTtcbiAgICAgICAgICAgIGlmIChkZWxheSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihkZWxheS5lKTsgfVxuICAgICAgICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgICAgIGRlbGF5cy5hZGQoZCk7XG4gICAgICAgICAgICBkLnNldERpc3Bvc2FibGUoZGVsYXkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgby5vbk5leHQoeCk7XG4gICAgICAgICAgICAgICAgZGVsYXlzLnJlbW92ZShkKTtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIG8ub25OZXh0KHgpO1xuICAgICAgICAgICAgICAgIGRlbGF5cy5yZW1vdmUoZCk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhdEVuZCA9IHRydWU7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUgKCkge1xuICAgICAgICBhdEVuZCAmJiBkZWxheXMubGVuZ3RoID09PSAwICYmIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdWJEZWxheSkge1xuICAgICAgICBzdGFydCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUoc3ViRGVsYXkuc3Vic2NyaWJlKHN0YXJ0LCBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sIHN0YXJ0KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIGRlbGF5cyk7XG4gICAgfSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogIFRpbWUgc2hpZnRzIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGJ5IGR1ZVRpbWUuXG4gICAqICBUaGUgcmVsYXRpdmUgdGltZSBpbnRlcnZhbHMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBwcmVzZXJ2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkdWVUaW1lIEFic29sdXRlIChzcGVjaWZpZWQgYXMgYSBEYXRlIG9iamVjdCkgb3IgcmVsYXRpdmUgdGltZSAoc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgZGVub3RpbmcgbWlsbGlzZWNvbmRzKSBieSB3aGljaCB0byBzaGlmdCB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBydW4gdGhlIGRlbGF5IHRpbWVycyBvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHRpbWVvdXQgc2NoZWR1bGVyIGlzIHVzZWQuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaW1lLXNoaWZ0ZWQgc2VxdWVuY2UuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uZGVsYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZpcnN0QXJnID0gYXJndW1lbnRzWzBdO1xuICAgIGlmICh0eXBlb2YgZmlyc3RBcmcgPT09ICdudW1iZXInIHx8IGZpcnN0QXJnIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgdmFyIGR1ZVRpbWUgPSBmaXJzdEFyZywgc2NoZWR1bGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gZGVmYXVsdFNjaGVkdWxlcik7XG4gICAgICByZXR1cm4gZHVlVGltZSBpbnN0YW5jZW9mIERhdGUgP1xuICAgICAgICBvYnNlcnZhYmxlRGVsYXlBYnNvbHV0ZSh0aGlzLCBkdWVUaW1lLCBzY2hlZHVsZXIpIDpcbiAgICAgICAgb2JzZXJ2YWJsZURlbGF5UmVsYXRpdmUodGhpcywgZHVlVGltZSwgc2NoZWR1bGVyKTtcbiAgICB9IGVsc2UgaWYgKE9ic2VydmFibGUuaXNPYnNlcnZhYmxlKGZpcnN0QXJnKSB8fCBpc0Z1bmN0aW9uKGZpcnN0QXJnKSkge1xuICAgICAgcmV0dXJuIGRlbGF5V2l0aFNlbGVjdG9yKHRoaXMsIGZpcnN0QXJnLCBhcmd1bWVudHNbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzJyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBEZWJvdW5jZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKERlYm91bmNlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBEZWJvdW5jZU9ic2VydmFibGUoc291cmNlLCBkdCwgcykge1xuICAgICAgaXNTY2hlZHVsZXIocykgfHwgKHMgPSBkZWZhdWx0U2NoZWR1bGVyKTtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5fZHQgPSBkdDtcbiAgICAgIHRoaXMuX3MgPSBzO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRGVib3VuY2VPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBjYW5jZWxhYmxlID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKTtcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShcbiAgICAgICAgdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZWJvdW5jZU9ic2VydmVyKG8sIHRoaXMuc291cmNlLCB0aGlzLl9kdCwgdGhpcy5fcywgY2FuY2VsYWJsZSkpLFxuICAgICAgICBjYW5jZWxhYmxlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERlYm91bmNlT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBEZWJvdW5jZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhEZWJvdW5jZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIERlYm91bmNlT2JzZXJ2ZXIob2JzZXJ2ZXIsIHNvdXJjZSwgZHVlVGltZSwgc2NoZWR1bGVyLCBjYW5jZWxhYmxlKSB7XG4gICAgICB0aGlzLl9vID0gb2JzZXJ2ZXI7XG4gICAgICB0aGlzLl9zID0gc291cmNlO1xuICAgICAgdGhpcy5fZCA9IGR1ZVRpbWU7XG4gICAgICB0aGlzLl9zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICB0aGlzLl9jID0gY2FuY2VsYWJsZTtcbiAgICAgIHRoaXMuX3YgPSBudWxsO1xuICAgICAgdGhpcy5faHYgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lkID0gMDtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIERlYm91bmNlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgdGhpcy5faHYgPSB0cnVlO1xuICAgICAgdGhpcy5fdiA9IHg7XG4gICAgICB2YXIgY3VycmVudElkID0gKyt0aGlzLl9pZCwgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuICAgICAgdGhpcy5fYy5zZXREaXNwb3NhYmxlKGQpO1xuICAgICAgZC5zZXREaXNwb3NhYmxlKHRoaXMuX3NjaGVkdWxlci5zY2hlZHVsZUZ1dHVyZSh0aGlzLCB0aGlzLl9kLCBmdW5jdGlvbiAoXywgc2VsZikge1xuICAgICAgICBzZWxmLl9odiAmJiBzZWxmLl9pZCA9PT0gY3VycmVudElkICYmIHNlbGYuX28ub25OZXh0KHgpO1xuICAgICAgICBzZWxmLl9odiA9IGZhbHNlO1xuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICBEZWJvdW5jZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzLl9jLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcbiAgICAgIHRoaXMuX2h2ID0gZmFsc2U7XG4gICAgICB0aGlzLl9pZCsrO1xuICAgIH07XG5cbiAgICBEZWJvdW5jZU9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9jLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuX2h2ICYmIHRoaXMuX28ub25OZXh0KHRoaXMuX3YpO1xuICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuICAgICAgdGhpcy5faHYgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lkKys7XG4gICAgfTtcblxuICAgIHJldHVybiBEZWJvdW5jZU9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICBmdW5jdGlvbiBkZWJvdW5jZVdpdGhTZWxlY3Rvcihzb3VyY2UsIGR1cmF0aW9uU2VsZWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciB2YWx1ZSwgaGFzVmFsdWUgPSBmYWxzZSwgY2FuY2VsYWJsZSA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksIGlkID0gMDtcbiAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBzb3VyY2Uuc3Vic2NyaWJlKFxuICAgICAgICBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgIHZhciB0aHJvdHRsZSA9IHRyeUNhdGNoKGR1cmF0aW9uU2VsZWN0b3IpKHgpO1xuICAgICAgICAgIGlmICh0aHJvdHRsZSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcih0aHJvdHRsZS5lKTsgfVxuXG4gICAgICAgICAgaXNQcm9taXNlKHRocm90dGxlKSAmJiAodGhyb3R0bGUgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UodGhyb3R0bGUpKTtcblxuICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZSA9IHg7XG4gICAgICAgICAgaWQrKztcbiAgICAgICAgICB2YXIgY3VycmVudGlkID0gaWQsIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgICBjYW5jZWxhYmxlLnNldERpc3Bvc2FibGUoZCk7XG4gICAgICAgICAgZC5zZXREaXNwb3NhYmxlKHRocm90dGxlLnN1YnNjcmliZShcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaGFzVmFsdWUgJiYgaWQgPT09IGN1cnJlbnRpZCAmJiBvLm9uTmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgIGQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaGFzVmFsdWUgJiYgaWQgPT09IGN1cnJlbnRpZCAmJiBvLm9uTmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgIGQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICkpO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNhbmNlbGFibGUuZGlzcG9zZSgpO1xuICAgICAgICAgIG8ub25FcnJvcihlKTtcbiAgICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgIGlkKys7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYW5jZWxhYmxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICBoYXNWYWx1ZSAmJiBvLm9uTmV4dCh2YWx1ZSk7XG4gICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgaWQrKztcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUpO1xuICAgIH0sIHNvdXJjZSk7XG4gIH1cblxuICBvYnNlcnZhYmxlUHJvdG8uZGVib3VuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24gKGFyZ3VtZW50c1swXSkpIHtcbiAgICAgIHJldHVybiBkZWJvdW5jZVdpdGhTZWxlY3Rvcih0aGlzLCBhcmd1bWVudHNbMF0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBuZXcgRGVib3VuY2VPYnNlcnZhYmxlKHRoaXMsIGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cycpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgVGltZXN0YW1wT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoVGltZXN0YW1wT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBUaW1lc3RhbXBPYnNlcnZhYmxlKHNvdXJjZSwgcykge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aGlzLl9zID0gcztcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFRpbWVzdGFtcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgVGltZXN0YW1wT2JzZXJ2ZXIobywgdGhpcy5fcykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gVGltZXN0YW1wT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBUaW1lc3RhbXBPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoVGltZXN0YW1wT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gVGltZXN0YW1wT2JzZXJ2ZXIobywgcykge1xuICAgICAgdGhpcy5fbyA9IG87XG4gICAgICB0aGlzLl9zID0gcztcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFRpbWVzdGFtcE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHRoaXMuX28ub25OZXh0KHsgdmFsdWU6IHgsIHRpbWVzdGFtcDogdGhpcy5fcy5ub3coKSB9KTtcbiAgICB9O1xuXG4gICAgVGltZXN0YW1wT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcbiAgICB9O1xuXG4gICAgVGltZXN0YW1wT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRpbWVzdGFtcE9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogIFJlY29yZHMgdGhlIHRpbWVzdGFtcCBmb3IgZWFjaCB2YWx1ZSBpbiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgMSAtIHJlcyA9IHNvdXJjZS50aW1lc3RhbXAoKTsgLy8gcHJvZHVjZXMgeyB2YWx1ZTogeCwgdGltZXN0YW1wOiB0cyB9XG4gICAqICAyIC0gcmVzID0gc291cmNlLnRpbWVzdGFtcChSeC5TY2hlZHVsZXIuZGVmYXVsdCk7XG4gICAqXG4gICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSAgU2NoZWR1bGVyIHVzZWQgdG8gY29tcHV0ZSB0aW1lc3RhbXBzLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBzY2hlZHVsZXIgaXMgdXNlZC5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCB0aW1lc3RhbXAgaW5mb3JtYXRpb24gb24gdmFsdWVzLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnRpbWVzdGFtcCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIpIHtcbiAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcbiAgICByZXR1cm4gbmV3IFRpbWVzdGFtcE9ic2VydmFibGUodGhpcywgc2NoZWR1bGVyKTtcbiAgfTtcblxuICBmdW5jdGlvbiBzYW1wbGVPYnNlcnZhYmxlKHNvdXJjZSwgc2FtcGxlcikge1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGF0RW5kID0gZmFsc2UsIHZhbHVlLCBoYXNWYWx1ZSA9IGZhbHNlO1xuXG4gICAgICBmdW5jdGlvbiBzYW1wbGVTdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmIChoYXNWYWx1ZSkge1xuICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgby5vbk5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGF0RW5kICYmIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZVN1YnNjcmlwdGlvbiA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuICAgICAgc291cmNlU3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUoc291cmNlLnN1YnNjcmliZShcbiAgICAgICAgZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF0RW5kID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2VTdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICApKTtcblxuICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKFxuICAgICAgICBzb3VyY2VTdWJzY3JpcHRpb24sXG4gICAgICAgIHNhbXBsZXIuc3Vic2NyaWJlKHNhbXBsZVN1YnNjcmliZSwgZnVuY3Rpb24gKGUpIHsgby5vbkVycm9yKGUpOyB9LCBzYW1wbGVTdWJzY3JpYmUpXG4gICAgICApO1xuICAgIH0sIHNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogIFNhbXBsZXMgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UgYXQgZWFjaCBpbnRlcnZhbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogIDEgLSByZXMgPSBzb3VyY2Uuc2FtcGxlKHNhbXBsZU9ic2VydmFibGUpOyAvLyBTYW1wbGVyIHRpY2sgc2VxdWVuY2VcbiAgICogIDIgLSByZXMgPSBzb3VyY2Uuc2FtcGxlKDUwMDApOyAvLyA1IHNlY29uZHNcbiAgICogIDIgLSByZXMgPSBzb3VyY2Uuc2FtcGxlKDUwMDAsIFJ4LlNjaGVkdWxlci50aW1lb3V0KTsgLy8gNSBzZWNvbmRzXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGludGVydmFsT3JTYW1wbGVyIEludGVydmFsIGF0IHdoaWNoIHRvIHNhbXBsZSAoc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgZGVub3RpbmcgbWlsbGlzZWNvbmRzKSBvciBTYW1wbGVyIE9ic2VydmFibGUuXG4gICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSAgU2NoZWR1bGVyIHRvIHJ1biB0aGUgc2FtcGxpbmcgdGltZXIgb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0aW1lb3V0IHNjaGVkdWxlciBpcyB1c2VkLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gU2FtcGxlZCBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnNhbXBsZSA9IG9ic2VydmFibGVQcm90by50aHJvdHRsZUxhdGVzdCA9IGZ1bmN0aW9uIChpbnRlcnZhbE9yU2FtcGxlciwgc2NoZWR1bGVyKSB7XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gZGVmYXVsdFNjaGVkdWxlcik7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnRlcnZhbE9yU2FtcGxlciA9PT0gJ251bWJlcicgP1xuICAgICAgc2FtcGxlT2JzZXJ2YWJsZSh0aGlzLCBvYnNlcnZhYmxlaW50ZXJ2YWwoaW50ZXJ2YWxPclNhbXBsZXIsIHNjaGVkdWxlcikpIDpcbiAgICAgIHNhbXBsZU9ic2VydmFibGUodGhpcywgaW50ZXJ2YWxPclNhbXBsZXIpO1xuICB9O1xuXG4gIHZhciBUaW1lb3V0RXJyb3IgPSBSeC5UaW1lb3V0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGltZW91dCBoYXMgb2NjdXJyZWQnO1xuICAgIHRoaXMubmFtZSA9ICdUaW1lb3V0RXJyb3InO1xuICAgIEVycm9yLmNhbGwodGhpcyk7XG4gIH07XG4gIFRpbWVvdXRFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5cbiAgZnVuY3Rpb24gdGltZW91dFdpdGhTZWxlY3Rvcihzb3VyY2UsIGZpcnN0VGltZW91dCwgdGltZW91dER1cmF0aW9uU2VsZWN0b3IsIG90aGVyKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oZmlyc3RUaW1lb3V0KSkge1xuICAgICAgb3RoZXIgPSB0aW1lb3V0RHVyYXRpb25TZWxlY3RvcjtcbiAgICAgIHRpbWVvdXREdXJhdGlvblNlbGVjdG9yID0gZmlyc3RUaW1lb3V0O1xuICAgICAgZmlyc3RUaW1lb3V0ID0gb2JzZXJ2YWJsZU5ldmVyKCk7XG4gICAgfVxuICAgIG90aGVyIHx8IChvdGhlciA9IG9ic2VydmFibGVUaHJvdyhuZXcgVGltZW91dEVycm9yKCkpKTtcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpLFxuICAgICAgICB0aW1lciA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksXG4gICAgICAgIG9yaWdpbmFsID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cbiAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG9yaWdpbmFsKTtcblxuICAgICAgdmFyIGlkID0gMCwgc3dpdGNoZWQgPSBmYWxzZTtcblxuICAgICAgZnVuY3Rpb24gc2V0VGltZXIodGltZW91dCkge1xuICAgICAgICB2YXIgbXlJZCA9IGlkLCBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cbiAgICAgICAgZnVuY3Rpb24gdGltZXJXaW5zKCkge1xuICAgICAgICAgIHN3aXRjaGVkID0gKG15SWQgPT09IGlkKTtcbiAgICAgICAgICByZXR1cm4gc3dpdGNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lci5zZXREaXNwb3NhYmxlKGQpO1xuICAgICAgICBkLnNldERpc3Bvc2FibGUodGltZW91dC5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRpbWVyV2lucygpICYmIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG90aGVyLnN1YnNjcmliZShvKSk7XG4gICAgICAgICAgZC5kaXNwb3NlKCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdGltZXJXaW5zKCkgJiYgby5vbkVycm9yKGUpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGltZXJXaW5zKCkgJiYgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUob3RoZXIuc3Vic2NyaWJlKG8pKTtcbiAgICAgICAgfSkpO1xuICAgICAgfTtcblxuICAgICAgc2V0VGltZXIoZmlyc3RUaW1lb3V0KTtcblxuICAgICAgZnVuY3Rpb24gb1dpbnMoKSB7XG4gICAgICAgIHZhciByZXMgPSAhc3dpdGNoZWQ7XG4gICAgICAgIGlmIChyZXMpIHsgaWQrKzsgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuXG4gICAgICBvcmlnaW5hbC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgaWYgKG9XaW5zKCkpIHtcbiAgICAgICAgICBvLm9uTmV4dCh4KTtcbiAgICAgICAgICB2YXIgdGltZW91dCA9IHRyeUNhdGNoKHRpbWVvdXREdXJhdGlvblNlbGVjdG9yKSh4KTtcbiAgICAgICAgICBpZiAodGltZW91dCA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcih0aW1lb3V0LmUpOyB9XG4gICAgICAgICAgc2V0VGltZXIoaXNQcm9taXNlKHRpbWVvdXQpID8gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHRpbWVvdXQpIDogdGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIG9XaW5zKCkgJiYgby5vbkVycm9yKGUpO1xuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBvV2lucygpICYmIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIHRpbWVyKTtcbiAgICB9LCBzb3VyY2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZW91dChzb3VyY2UsIGR1ZVRpbWUsIG90aGVyLCBzY2hlZHVsZXIpIHtcbiAgICBpZiAoaXNTY2hlZHVsZXIob3RoZXIpKSB7XG4gICAgICBzY2hlZHVsZXIgPSBvdGhlcjtcbiAgICAgIG90aGVyID0gb2JzZXJ2YWJsZVRocm93KG5ldyBUaW1lb3V0RXJyb3IoKSk7XG4gICAgfVxuICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEVycm9yKSB7IG90aGVyID0gb2JzZXJ2YWJsZVRocm93KG90aGVyKTsgfVxuICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGRlZmF1bHRTY2hlZHVsZXIpO1xuXG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgaWQgPSAwLFxuICAgICAgICBvcmlnaW5hbCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpLFxuICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpLFxuICAgICAgICBzd2l0Y2hlZCA9IGZhbHNlLFxuICAgICAgICB0aW1lciA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG5cbiAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG9yaWdpbmFsKTtcblxuICAgICAgZnVuY3Rpb24gY3JlYXRlVGltZXIoKSB7XG4gICAgICAgIHZhciBteUlkID0gaWQ7XG4gICAgICAgIHRpbWVyLnNldERpc3Bvc2FibGUoc2NoZWR1bGVyLnNjaGVkdWxlRnV0dXJlKG51bGwsIGR1ZVRpbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzd2l0Y2hlZCA9IGlkID09PSBteUlkO1xuICAgICAgICAgIGlmIChzd2l0Y2hlZCkge1xuICAgICAgICAgICAgaXNQcm9taXNlKG90aGVyKSAmJiAob3RoZXIgPSBvYnNlcnZhYmxlRnJvbVByb21pc2Uob3RoZXIpKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG90aGVyLnN1YnNjcmliZShvKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGNyZWF0ZVRpbWVyKCk7XG5cbiAgICAgIG9yaWdpbmFsLnNldERpc3Bvc2FibGUoc291cmNlLnN1YnNjcmliZShmdW5jdGlvbiAoeCkge1xuICAgICAgICBpZiAoIXN3aXRjaGVkKSB7XG4gICAgICAgICAgaWQrKztcbiAgICAgICAgICBvLm9uTmV4dCh4KTtcbiAgICAgICAgICBjcmVhdGVUaW1lcigpO1xuICAgICAgICB9XG4gICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIXN3aXRjaGVkKSB7XG4gICAgICAgICAgaWQrKztcbiAgICAgICAgICBvLm9uRXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFzd2l0Y2hlZCkge1xuICAgICAgICAgIGlkKys7XG4gICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9uLCB0aW1lcik7XG4gICAgfSwgc291cmNlKTtcbiAgfVxuXG4gIG9ic2VydmFibGVQcm90by50aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBmaXJzdEFyZyA9IGFyZ3VtZW50c1swXTtcbiAgICBpZiAoZmlyc3RBcmcgaW5zdGFuY2VvZiBEYXRlIHx8IHR5cGVvZiBmaXJzdEFyZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aW1lb3V0KHRoaXMsIGZpcnN0QXJnLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgfSBlbHNlIGlmIChPYnNlcnZhYmxlLmlzT2JzZXJ2YWJsZShmaXJzdEFyZykgfHwgaXNGdW5jdGlvbihmaXJzdEFyZykpIHtcbiAgICAgIHJldHVybiB0aW1lb3V0V2l0aFNlbGVjdG9yKHRoaXMsIGZpcnN0QXJnLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIG9ubHkgdGhlIGZpcnN0IGl0ZW0gZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgZHVyaW5nIHNlcXVlbnRpYWwgdGltZSB3aW5kb3dzIG9mIGEgc3BlY2lmaWVkIGR1cmF0aW9uLlxuICAgKiBAcGFyYW0ge051bWJlcn0gd2luZG93RHVyYXRpb24gdGltZSB0byB3YWl0IGJlZm9yZSBlbWl0dGluZyBhbm90aGVyIGl0ZW0gYWZ0ZXIgZW1pdHRpbmcgdGhlIGxhc3QgaXRlbVxuICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gdGhlIFNjaGVkdWxlciB0byB1c2UgaW50ZXJuYWxseSB0byBtYW5hZ2UgdGhlIHRpbWVycyB0aGF0IGhhbmRsZSB0aW1lb3V0IGZvciBlYWNoIGl0ZW0uIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gU2NoZWR1bGVyLnRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHRoYXQgcGVyZm9ybXMgdGhlIHRocm90dGxlIG9wZXJhdGlvbi5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by50aHJvdHRsZSA9IGZ1bmN0aW9uICh3aW5kb3dEdXJhdGlvbiwgc2NoZWR1bGVyKSB7XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gZGVmYXVsdFNjaGVkdWxlcik7XG4gICAgdmFyIGR1cmF0aW9uID0gK3dpbmRvd0R1cmF0aW9uIHx8IDA7XG4gICAgaWYgKGR1cmF0aW9uIDw9IDApIHsgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3dpbmRvd0R1cmF0aW9uIGNhbm5vdCBiZSBsZXNzIG9yIGVxdWFsIHplcm8uJyk7IH1cbiAgICB2YXIgc291cmNlID0gdGhpcztcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBsYXN0T25OZXh0ID0gMDtcbiAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKFxuICAgICAgICBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgIHZhciBub3cgPSBzY2hlZHVsZXIubm93KCk7XG4gICAgICAgICAgaWYgKGxhc3RPbk5leHQgPT09IDAgfHwgbm93IC0gbGFzdE9uTmV4dCA+PSBkdXJhdGlvbikge1xuICAgICAgICAgICAgbGFzdE9uTmV4dCA9IG5vdztcbiAgICAgICAgICAgIG8ub25OZXh0KHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sIGZ1bmN0aW9uICgpIHsgby5vbkNvbXBsZXRlZCgpOyB9XG4gICAgICApO1xuICAgIH0sIHNvdXJjZSk7XG4gIH07XG5cbiAgdmFyIFBhdXNhYmxlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoUGF1c2FibGVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIFBhdXNhYmxlT2JzZXJ2YWJsZShzb3VyY2UsIHBhdXNlcikge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgICBpZiAocGF1c2VyICYmIHBhdXNlci5zdWJzY3JpYmUpIHtcbiAgICAgICAgdGhpcy5wYXVzZXIgPSB0aGlzLmNvbnRyb2xsZXIubWVyZ2UocGF1c2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGF1c2VyID0gdGhpcy5jb250cm9sbGVyO1xuICAgICAgfVxuXG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBQYXVzYWJsZU9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGNvbm4gPSB0aGlzLnNvdXJjZS5wdWJsaXNoKCksXG4gICAgICAgIHN1YnNjcmlwdGlvbiA9IGNvbm4uc3Vic2NyaWJlKG8pLFxuICAgICAgICBjb25uZWN0aW9uID0gZGlzcG9zYWJsZUVtcHR5O1xuXG4gICAgICB2YXIgcGF1c2FibGUgPSB0aGlzLnBhdXNlci5kaXN0aW5jdFVudGlsQ2hhbmdlZCgpLnN1YnNjcmliZShmdW5jdGlvbiAoYikge1xuICAgICAgICBpZiAoYikge1xuICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uLmNvbm5lY3QoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25uZWN0aW9uLmRpc3Bvc2UoKTtcbiAgICAgICAgICBjb25uZWN0aW9uID0gZGlzcG9zYWJsZUVtcHR5O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ldyBOQXJ5RGlzcG9zYWJsZShbc3Vic2NyaXB0aW9uLCBjb25uZWN0aW9uLCBwYXVzYWJsZV0pO1xuICAgIH07XG5cbiAgICBQYXVzYWJsZU9ic2VydmFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLm9uTmV4dChmYWxzZSk7XG4gICAgfTtcblxuICAgIFBhdXNhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLm9uTmV4dCh0cnVlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFBhdXNhYmxlT2JzZXJ2YWJsZTtcblxuICB9KE9ic2VydmFibGUpKTtcblxuICAvKipcbiAgICogUGF1c2VzIHRoZSB1bmRlcmx5aW5nIG9ic2VydmFibGUgc2VxdWVuY2UgYmFzZWQgdXBvbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aGljaCB5aWVsZHMgdHJ1ZS9mYWxzZS5cbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHBhdXNlciA9IG5ldyBSeC5TdWJqZWN0KCk7XG4gICAqIHZhciBzb3VyY2UgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMCkucGF1c2FibGUocGF1c2VyKTtcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBwYXVzZXIgVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdXNlZCB0byBwYXVzZSB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIGlzIHBhdXNlZCBiYXNlZCB1cG9uIHRoZSBwYXVzZXIuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8ucGF1c2FibGUgPSBmdW5jdGlvbiAocGF1c2VyKSB7XG4gICAgcmV0dXJuIG5ldyBQYXVzYWJsZU9ic2VydmFibGUodGhpcywgcGF1c2VyKTtcbiAgfTtcblxuICBmdW5jdGlvbiBjb21iaW5lTGF0ZXN0U291cmNlKHNvdXJjZSwgc3ViamVjdCwgcmVzdWx0U2VsZWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBoYXNWYWx1ZSA9IFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICBoYXNWYWx1ZUFsbCA9IGZhbHNlLFxuICAgICAgICBpc0RvbmUgPSBmYWxzZSxcbiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KDIpLFxuICAgICAgICBlcnI7XG5cbiAgICAgIGZ1bmN0aW9uIG5leHQoeCwgaSkge1xuICAgICAgICB2YWx1ZXNbaV0gPSB4O1xuICAgICAgICBoYXNWYWx1ZVtpXSA9IHRydWU7XG4gICAgICAgIGlmIChoYXNWYWx1ZUFsbCB8fCAoaGFzVmFsdWVBbGwgPSBoYXNWYWx1ZS5ldmVyeShpZGVudGl0eSkpKSB7XG4gICAgICAgICAgaWYgKGVycikgeyByZXR1cm4gby5vbkVycm9yKGVycik7IH1cbiAgICAgICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2gocmVzdWx0U2VsZWN0b3IpLmFwcGx5KG51bGwsIHZhbHVlcyk7XG4gICAgICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihyZXMuZSk7IH1cbiAgICAgICAgICBvLm9uTmV4dChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlzRG9uZSAmJiB2YWx1ZXNbMV0gJiYgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoXG4gICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoXG4gICAgICAgICAgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIG5leHQoeCwgMCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlc1sxXSkge1xuICAgICAgICAgICAgICBvLm9uRXJyb3IoZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlcnIgPSBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXNEb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbHVlc1sxXSAmJiBvLm9uQ29tcGxldGVkKCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIHN1YmplY3Quc3Vic2NyaWJlKFxuICAgICAgICAgIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICBuZXh0KHgsIDEpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKGUpIHsgby5vbkVycm9yKGUpOyB9LFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlzRG9uZSA9IHRydWU7XG4gICAgICAgICAgICBuZXh0KHRydWUsIDEpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSwgc291cmNlKTtcbiAgfVxuXG4gIHZhciBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUoc291cmNlLCBwYXVzZXIpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IFN1YmplY3QoKTtcblxuICAgICAgaWYgKHBhdXNlciAmJiBwYXVzZXIuc3Vic2NyaWJlKSB7XG4gICAgICAgIHRoaXMucGF1c2VyID0gdGhpcy5jb250cm9sbGVyLm1lcmdlKHBhdXNlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhdXNlciA9IHRoaXMuY29udHJvbGxlcjtcbiAgICAgIH1cblxuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIHEgPSBbXSwgcHJldmlvdXNTaG91bGRGaXJlO1xuXG4gICAgICBmdW5jdGlvbiBkcmFpblF1ZXVlKCkgeyB3aGlsZSAocS5sZW5ndGggPiAwKSB7IG8ub25OZXh0KHEuc2hpZnQoKSk7IH0gfVxuXG4gICAgICB2YXIgc3Vic2NyaXB0aW9uID1cbiAgICAgICAgY29tYmluZUxhdGVzdFNvdXJjZShcbiAgICAgICAgICB0aGlzLnNvdXJjZSxcbiAgICAgICAgICB0aGlzLnBhdXNlci5zdGFydFdpdGgoZmFsc2UpLmRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHNob3VsZEZpcmUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGRhdGEsIHNob3VsZEZpcmU6IHNob3VsZEZpcmUgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgICAgICAgICBpZiAocHJldmlvdXNTaG91bGRGaXJlICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0cy5zaG91bGRGaXJlICE9PSBwcmV2aW91c1Nob3VsZEZpcmUpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1Nob3VsZEZpcmUgPSByZXN1bHRzLnNob3VsZEZpcmU7XG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIGluIHNob3VsZEZpcmVcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5zaG91bGRGaXJlKSB7IGRyYWluUXVldWUoKTsgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU2hvdWxkRmlyZSA9IHJlc3VsdHMuc2hvdWxkRmlyZTtcbiAgICAgICAgICAgICAgICAvLyBuZXcgZGF0YVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLnNob3VsZEZpcmUpIHtcbiAgICAgICAgICAgICAgICAgIG8ub25OZXh0KHJlc3VsdHMuZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHEucHVzaChyZXN1bHRzLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgICAgICAgICAgICBvLm9uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGRyYWluUXVldWUoKTtcbiAgICAgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOyAgICAgIFxuICAgIH07XG5cbiAgICBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIub25OZXh0KGZhbHNlKTtcbiAgICB9O1xuXG4gICAgUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5vbk5leHQodHJ1ZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZTtcblxuICB9KE9ic2VydmFibGUpKTtcblxuICAvKipcbiAgICogUGF1c2VzIHRoZSB1bmRlcmx5aW5nIG9ic2VydmFibGUgc2VxdWVuY2UgYmFzZWQgdXBvbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aGljaCB5aWVsZHMgdHJ1ZS9mYWxzZSxcbiAgICogYW5kIHlpZWxkcyB0aGUgdmFsdWVzIHRoYXQgd2VyZSBidWZmZXJlZCB3aGlsZSBwYXVzZWQuXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBwYXVzZXIgPSBuZXcgUnguU3ViamVjdCgpO1xuICAgKiB2YXIgc291cmNlID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDApLnBhdXNhYmxlQnVmZmVyZWQocGF1c2VyKTtcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBwYXVzZXIgVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdXNlZCB0byBwYXVzZSB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIGlzIHBhdXNlZCBiYXNlZCB1cG9uIHRoZSBwYXVzZXIuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8ucGF1c2FibGVCdWZmZXJlZCA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgcmV0dXJuIG5ldyBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZSh0aGlzLCBzdWJqZWN0KTtcbiAgfTtcblxuICB2YXIgQ29udHJvbGxlZE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKENvbnRyb2xsZWRPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIENvbnRyb2xsZWRPYnNlcnZhYmxlIChzb3VyY2UsIGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpIHtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgICAgdGhpcy5zdWJqZWN0ID0gbmV3IENvbnRyb2xsZWRTdWJqZWN0KGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpO1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2UubXVsdGljYXN0KHRoaXMuc3ViamVjdCkucmVmQ291bnQoKTtcbiAgICB9XG5cbiAgICBDb250cm9sbGVkT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG8pO1xuICAgIH07XG5cbiAgICBDb250cm9sbGVkT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIChudW1iZXJPZkl0ZW1zKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdWJqZWN0LnJlcXVlc3QobnVtYmVyT2ZJdGVtcyA9PSBudWxsID8gLTEgOiBudW1iZXJPZkl0ZW1zKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENvbnRyb2xsZWRPYnNlcnZhYmxlO1xuXG4gIH0oT2JzZXJ2YWJsZSkpO1xuXG4gIHZhciBDb250cm9sbGVkU3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQ29udHJvbGxlZFN1YmplY3QsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ29udHJvbGxlZFN1YmplY3QoZW5hYmxlUXVldWUsIHNjaGVkdWxlcikge1xuICAgICAgZW5hYmxlUXVldWUgPT0gbnVsbCAmJiAoZW5hYmxlUXVldWUgPSB0cnVlKTtcblxuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLnN1YmplY3QgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgdGhpcy5lbmFibGVRdWV1ZSA9IGVuYWJsZVF1ZXVlO1xuICAgICAgdGhpcy5xdWV1ZSA9IGVuYWJsZVF1ZXVlID8gW10gOiBudWxsO1xuICAgICAgdGhpcy5yZXF1ZXN0ZWRDb3VudCA9IDA7XG4gICAgICB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUgPSBudWxsO1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICB0aGlzLmhhc0ZhaWxlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyIHx8IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXI7XG4gICAgfVxuXG4gICAgYWRkUHJvcGVydGllcyhDb250cm9sbGVkU3ViamVjdC5wcm90b3R5cGUsIE9ic2VydmVyLCB7XG4gICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJqZWN0LnN1YnNjcmliZShvKTtcbiAgICAgIH0sXG4gICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5lbmFibGVRdWV1ZSB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3ViamVjdC5vbkNvbXBsZXRlZCgpO1xuICAgICAgICAgIHRoaXMuZGlzcG9zZUN1cnJlbnRSZXF1ZXN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKE5vdGlmaWNhdGlvbi5jcmVhdGVPbkNvbXBsZXRlZCgpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICB0aGlzLmhhc0ZhaWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZVF1ZXVlIHx8IHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5zdWJqZWN0Lm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRoaXMuZGlzcG9zZUN1cnJlbnRSZXF1ZXN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKE5vdGlmaWNhdGlvbi5jcmVhdGVPbkVycm9yKGVycm9yKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbk5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0ZWRDb3VudCA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5lbmFibGVRdWV1ZSAmJiB0aGlzLnF1ZXVlLnB1c2goTm90aWZpY2F0aW9uLmNyZWF0ZU9uTmV4dCh2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICh0aGlzLnJlcXVlc3RlZENvdW50LS0gPT09IDApICYmIHRoaXMuZGlzcG9zZUN1cnJlbnRSZXF1ZXN0KCk7XG4gICAgICAgICAgdGhpcy5zdWJqZWN0Lm9uTmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfcHJvY2Vzc1JlcXVlc3Q6IGZ1bmN0aW9uIChudW1iZXJPZkl0ZW1zKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVF1ZXVlKSB7XG4gICAgICAgICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCAmJiAobnVtYmVyT2ZJdGVtcyA+IDAgfHwgdGhpcy5xdWV1ZVswXS5raW5kICE9PSAnTicpKSB7XG4gICAgICAgICAgICB2YXIgZmlyc3QgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBmaXJzdC5hY2NlcHQodGhpcy5zdWJqZWN0KTtcbiAgICAgICAgICAgIGlmIChmaXJzdC5raW5kID09PSAnTicpIHtcbiAgICAgICAgICAgICAgbnVtYmVyT2ZJdGVtcy0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ3VycmVudFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudW1iZXJPZkl0ZW1zO1xuICAgICAgfSxcbiAgICAgIHJlcXVlc3Q6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlQ3VycmVudFJlcXVlc3QoKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMucmVxdWVzdGVkRGlzcG9zYWJsZSA9IHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKG51bWJlcixcbiAgICAgICAgZnVuY3Rpb24ocywgaSkge1xuICAgICAgICAgIHZhciByZW1haW5pbmcgPSBzZWxmLl9wcm9jZXNzUmVxdWVzdChpKTtcbiAgICAgICAgICB2YXIgc3RvcHBlZCA9IHNlbGYuaGFzQ29tcGxldGVkIHx8IHNlbGYuaGFzRmFpbGVkO1xuICAgICAgICAgIGlmICghc3RvcHBlZCAmJiByZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICBzZWxmLnJlcXVlc3RlZENvdW50ID0gcmVtYWluaW5nO1xuXG4gICAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUNyZWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHNlbGYucmVxdWVzdGVkQ291bnQgPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIC8vIFNjaGVkdWxlZCBpdGVtIGlzIHN0aWxsIGluIHByb2dyZXNzLiBSZXR1cm4gYSBuZXdcbiAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSB0byBhbGxvdyB0aGUgcmVxdWVzdCB0byBiZSBpbnRlcnJ1cHRlZFxuICAgICAgICAgICAgICAvLyB2aWEgZGlzcG9zZS5cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGU7XG4gICAgICB9LFxuICAgICAgZGlzcG9zZUN1cnJlbnRSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUpIHtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUuZGlzcG9zZSgpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdGVkRGlzcG9zYWJsZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBDb250cm9sbGVkU3ViamVjdDtcbiAgfShPYnNlcnZhYmxlKSk7XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGEgY29udHJvbGxlciB0byB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIHRoZSBhYmlsaXR5IHRvIHF1ZXVlLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgc291cmNlID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDApLmNvbnRyb2xsZWQoKTtcbiAgICogc291cmNlLnJlcXVlc3QoMyk7IC8vIFJlYWRzIDMgdmFsdWVzXG4gICAqIEBwYXJhbSB7Ym9vbH0gZW5hYmxlUXVldWUgdHJ1dGh5IHZhbHVlIHRvIGRldGVybWluZSBpZiB2YWx1ZXMgc2hvdWxkIGJlIHF1ZXVlZCBwZW5kaW5nIHRoZSBuZXh0IHJlcXVlc3RcbiAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciBkZXRlcm1pbmVzIGhvdyB0aGUgcmVxdWVzdHMgd2lsbCBiZSBzY2hlZHVsZWRcbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIG9ubHkgcHJvcGFnYXRlcyB2YWx1ZXMgb24gcmVxdWVzdC5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5jb250cm9sbGVkID0gZnVuY3Rpb24gKGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpIHtcblxuICAgIGlmIChlbmFibGVRdWV1ZSAmJiBpc1NjaGVkdWxlcihlbmFibGVRdWV1ZSkpIHtcbiAgICAgIHNjaGVkdWxlciA9IGVuYWJsZVF1ZXVlO1xuICAgICAgZW5hYmxlUXVldWUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChlbmFibGVRdWV1ZSA9PSBudWxsKSB7ICBlbmFibGVRdWV1ZSA9IHRydWU7IH1cbiAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRPYnNlcnZhYmxlKHRoaXMsIGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQaXBlcyB0aGUgZXhpc3RpbmcgT2JzZXJ2YWJsZSBzZXF1ZW5jZSBpbnRvIGEgTm9kZS5qcyBTdHJlYW0uXG4gICAqIEBwYXJhbSB7U3RyZWFtfSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBOb2RlLmpzIHN0cmVhbS5cbiAgICogQHJldHVybnMge1N0cmVhbX0gVGhlIGRlc3RpbmF0aW9uIHN0cmVhbS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgICB2YXIgc291cmNlID0gdGhpcy5wYXVzYWJsZUJ1ZmZlcmVkKCk7XG5cbiAgICBmdW5jdGlvbiBvbkRyYWluKCkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIGRlc3QuYWRkTGlzdGVuZXIoJ2RyYWluJywgb25EcmFpbik7XG5cbiAgICBzb3VyY2Uuc3Vic2NyaWJlKFxuICAgICAgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgIWRlc3Qud3JpdGUoU3RyaW5nKHgpKSAmJiBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGRlc3QuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gSGFjayBjaGVjayBiZWNhdXNlIFNURElPIGlzIG5vdCBjbG9zYWJsZVxuICAgICAgICAhZGVzdC5faXNTdGRpbyAmJiBkZXN0LmVuZCgpO1xuICAgICAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uRHJhaW4pO1xuICAgICAgfSk7XG5cbiAgICBzb3VyY2UucmVzdW1lKCk7XG5cbiAgICByZXR1cm4gZGVzdDtcbiAgfTtcblxuICB2YXIgVHJhbnNkdWNlT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFRyYW5zZHVjZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIFRyYW5zZHVjZU9ic2VydmVyKG8sIHhmb3JtKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3hmb3JtID0geGZvcm07XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBUcmFuc2R1Y2VPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2godGhpcy5feGZvcm1bJ0BAdHJhbnNkdWNlci9zdGVwJ10pLmNhbGwodGhpcy5feGZvcm0sIHRoaXMuX28sIHgpO1xuICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuICAgIH07XG5cbiAgICBUcmFuc2R1Y2VPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uRXJyb3IoZSk7IH07XG5cbiAgICBUcmFuc2R1Y2VPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5feGZvcm1bJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSh0aGlzLl9vKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRyYW5zZHVjZU9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1Gb3JPYnNlcnZlcihvKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdAQHRyYW5zZHVjZXIvaW5pdCc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbztcbiAgICAgIH0sXG4gICAgICAnQEB0cmFuc2R1Y2VyL3N0ZXAnOiBmdW5jdGlvbihvYnMsIGlucHV0KSB7XG4gICAgICAgIHJldHVybiBvYnMub25OZXh0KGlucHV0KTtcbiAgICAgIH0sXG4gICAgICAnQEB0cmFuc2R1Y2VyL3Jlc3VsdCc6IGZ1bmN0aW9uKG9icykge1xuICAgICAgICByZXR1cm4gb2JzLm9uQ29tcGxldGVkKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIHRyYW5zZHVjZXIgdG8gdHJhbnNmb3JtIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlXG4gICAqIEBwYXJhbSB7VHJhbnNkdWNlcn0gdHJhbnNkdWNlciBBIHRyYW5zZHVjZXIgdG8gZXhlY3V0ZVxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSByZXN1bHRzIGZyb20gdGhlIHRyYW5zZHVjZXIuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8udHJhbnNkdWNlID0gZnVuY3Rpb24odHJhbnNkdWNlcikge1xuICAgIHZhciBzb3VyY2UgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbihvKSB7XG4gICAgICB2YXIgeGZvcm0gPSB0cmFuc2R1Y2VyKHRyYW5zZm9ybUZvck9ic2VydmVyKG8pKTtcbiAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBUcmFuc2R1Y2VPYnNlcnZlcihvLCB4Zm9ybSkpO1xuICAgIH0sIHNvdXJjZSk7XG4gIH07XG5cbiAgdmFyIEFub255bW91c09ic2VydmFibGUgPSBSeC5Bbm9ueW1vdXNPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhBbm9ueW1vdXNPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXG4gICAgLy8gRml4IHN1YnNjcmliZXIgdG8gY2hlY2sgZm9yIHVuZGVmaW5lZCBvciBmdW5jdGlvbiByZXR1cm5lZCB0byBkZWNvcmF0ZSBhcyBEaXNwb3NhYmxlXG4gICAgZnVuY3Rpb24gZml4U3Vic2NyaWJlcihzdWJzY3JpYmVyKSB7XG4gICAgICByZXR1cm4gc3Vic2NyaWJlciAmJiBpc0Z1bmN0aW9uKHN1YnNjcmliZXIuZGlzcG9zZSkgPyBzdWJzY3JpYmVyIDpcbiAgICAgICAgaXNGdW5jdGlvbihzdWJzY3JpYmVyKSA/IGRpc3Bvc2FibGVDcmVhdGUoc3Vic2NyaWJlcikgOiBkaXNwb3NhYmxlRW1wdHk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0RGlzcG9zYWJsZShzLCBzdGF0ZSkge1xuICAgICAgdmFyIGFkbyA9IHN0YXRlWzBdLCBzZWxmID0gc3RhdGVbMV07XG4gICAgICB2YXIgc3ViID0gdHJ5Q2F0Y2goc2VsZi5fX3N1YnNjcmliZSkuY2FsbChzZWxmLCBhZG8pO1xuICAgICAgaWYgKHN1YiA9PT0gZXJyb3JPYmogJiYgIWFkby5mYWlsKGVycm9yT2JqLmUpKSB7IHRocm93ZXIoZXJyb3JPYmouZSk7IH1cbiAgICAgIGFkby5zZXREaXNwb3NhYmxlKGZpeFN1YnNjcmliZXIoc3ViKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQW5vbnltb3VzT2JzZXJ2YWJsZShzdWJzY3JpYmUsIHBhcmVudCkge1xuICAgICAgdGhpcy5zb3VyY2UgPSBwYXJlbnQ7XG4gICAgICB0aGlzLl9fc3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgQW5vbnltb3VzT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgYWRvID0gbmV3IEF1dG9EZXRhY2hPYnNlcnZlcihvKSwgc3RhdGUgPSBbYWRvLCB0aGlzXTtcblxuICAgICAgaWYgKGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGVSZXF1aXJlZCgpKSB7XG4gICAgICAgIGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGUoc3RhdGUsIHNldERpc3Bvc2FibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0RGlzcG9zYWJsZShudWxsLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWRvO1xuICAgIH07XG5cbiAgICByZXR1cm4gQW5vbnltb3VzT2JzZXJ2YWJsZTtcblxuICB9KE9ic2VydmFibGUpKTtcblxuICB2YXIgQXV0b0RldGFjaE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhBdXRvRGV0YWNoT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cbiAgICBmdW5jdGlvbiBBdXRvRGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgdGhpcy5tID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgfVxuXG4gICAgdmFyIEF1dG9EZXRhY2hPYnNlcnZlclByb3RvdHlwZSA9IEF1dG9EZXRhY2hPYnNlcnZlci5wcm90b3R5cGU7XG5cbiAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMub2JzZXJ2ZXIub25OZXh0KS5jYWxsKHRoaXMub2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IGVycm9yT2JqKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICB0aHJvd2VyKHJlc3VsdC5lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgQXV0b0RldGFjaE9ic2VydmVyUHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMub2JzZXJ2ZXIub25FcnJvcikuY2FsbCh0aGlzLm9ic2VydmVyLCBlcnIpO1xuICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgICByZXN1bHQgPT09IGVycm9yT2JqICYmIHRocm93ZXIocmVzdWx0LmUpO1xuICAgIH07XG5cbiAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMub2JzZXJ2ZXIub25Db21wbGV0ZWQpLmNhbGwodGhpcy5vYnNlcnZlcik7XG4gICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgIHJlc3VsdCA9PT0gZXJyb3JPYmogJiYgdGhyb3dlcihyZXN1bHQuZSk7XG4gICAgfTtcblxuICAgIEF1dG9EZXRhY2hPYnNlcnZlclByb3RvdHlwZS5zZXREaXNwb3NhYmxlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHRoaXMubS5zZXREaXNwb3NhYmxlKHZhbHVlKTsgfTtcbiAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUuZ2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubS5nZXREaXNwb3NhYmxlKCk7IH07XG5cbiAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF9fc3VwZXJfXy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICAgICAgdGhpcy5tLmRpc3Bvc2UoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEF1dG9EZXRhY2hPYnNlcnZlcjtcbiAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cbiAgdmFyIElubmVyU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKHMsIG8pIHtcbiAgICB0aGlzLl9zID0gcztcbiAgICB0aGlzLl9vID0gbztcbiAgfTtcblxuICBJbm5lclN1YnNjcmlwdGlvbi5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3MuaXNEaXNwb3NlZCAmJiB0aGlzLl9vICE9PSBudWxsKSB7XG4gICAgICB2YXIgaWR4ID0gdGhpcy5fcy5vYnNlcnZlcnMuaW5kZXhPZih0aGlzLl9vKTtcbiAgICAgIHRoaXMuX3Mub2JzZXJ2ZXJzLnNwbGljZShpZHgsIDEpO1xuICAgICAgdGhpcy5fbyA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiAgUmVwcmVzZW50cyBhbiBvYmplY3QgdGhhdCBpcyBib3RoIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgd2VsbCBhcyBhbiBvYnNlcnZlci5cbiAgICogIEVhY2ggbm90aWZpY2F0aW9uIGlzIGJyb2FkY2FzdGVkIHRvIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycy5cbiAgICovXG4gIHZhciBTdWJqZWN0ID0gUnguU3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoU3ViamVjdCwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTdWJqZWN0KCkge1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFByb3BlcnRpZXMoU3ViamVjdC5wcm90b3R5cGUsIE9ic2VydmVyLnByb3RvdHlwZSwge1xuICAgICAgX3N1YnNjcmliZTogZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gobyk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBJbm5lclN1YnNjcmlwdGlvbih0aGlzLCBvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikge1xuICAgICAgICAgIG8ub25FcnJvcih0aGlzLmVycm9yKTtcbiAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuICAgICAgICB9XG4gICAgICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGVFbXB0eTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdWJqZWN0IGhhcyBvYnNlcnZlcnMgc3Vic2NyaWJlZCB0byBpdC5cbiAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzIHN1YnNjcmliZWQgdG8gaXQuXG4gICAgICAgKi9cbiAgICAgIGhhc09ic2VydmVyczogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5vYnNlcnZlcnMubGVuZ3RoID4gMDsgfSxcbiAgICAgIC8qKlxuICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuICAgICAgICovXG4gICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvcyA9IGNsb25lQXJyYXkodGhpcy5vYnNlcnZlcnMpLCBsZW4gPSBvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgb3NbaV0ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IGVycm9yIFRoZSBleGNlcHRpb24gdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuICAgICAgICovXG4gICAgICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBvc1tpXS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGFycml2YWwgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cbiAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZW5kIHRvIGFsbCBvYnNlcnZlcnMuXG4gICAgICAgKi9cbiAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIG9zW2ldLm9uTmV4dCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBVbnN1YnNjcmliZSBhbGwgb2JzZXJ2ZXJzIGFuZCByZWxlYXNlIHJlc291cmNlcy5cbiAgICAgICAqL1xuICAgICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3ViamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgb2JzZXJ2ZXIgYW5kIG9ic2VydmFibGUuXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgVGhlIG9ic2VydmVyIHVzZWQgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgc3ViamVjdC5cbiAgICAgKiBAcGFyYW0ge09ic2VydmFibGV9IG9ic2VydmFibGUgVGhlIG9ic2VydmFibGUgdXNlZCB0byBzdWJzY3JpYmUgdG8gbWVzc2FnZXMgc2VudCBmcm9tIHRoZSBzdWJqZWN0LlxuICAgICAqIEByZXR1cm5zIHtTdWJqZWN0fSBTdWJqZWN0IGltcGxlbWVudGVkIHVzaW5nIHRoZSBnaXZlbiBvYnNlcnZlciBhbmQgb2JzZXJ2YWJsZS5cbiAgICAgKi9cbiAgICBTdWJqZWN0LmNyZWF0ZSA9IGZ1bmN0aW9uIChvYnNlcnZlciwgb2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTdWJqZWN0KG9ic2VydmVyLCBvYnNlcnZhYmxlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFN1YmplY3Q7XG4gIH0oT2JzZXJ2YWJsZSkpO1xuXG4gIC8qKlxuICAgKiAgUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uXG4gICAqICBUaGUgbGFzdCB2YWx1ZSBiZWZvcmUgdGhlIE9uQ29tcGxldGVkIG5vdGlmaWNhdGlvbiwgb3IgdGhlIGVycm9yIHJlY2VpdmVkIHRocm91Z2ggT25FcnJvciwgaXMgc2VudCB0byBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMuXG4gICAqL1xuICB2YXIgQXN5bmNTdWJqZWN0ID0gUnguQXN5bmNTdWJqZWN0ID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhBc3luY1N1YmplY3QsIF9fc3VwZXJfXyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3ViamVjdCB0aGF0IGNhbiBvbmx5IHJlY2VpdmUgb25lIHZhbHVlIGFuZCB0aGF0IHZhbHVlIGlzIGNhY2hlZCBmb3IgYWxsIGZ1dHVyZSBvYnNlcnZhdGlvbnMuXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgZnVuY3Rpb24gQXN5bmNTdWJqZWN0KCkge1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFByb3BlcnRpZXMoQXN5bmNTdWJqZWN0LnByb3RvdHlwZSwgT2JzZXJ2ZXIucHJvdG90eXBlLCB7XG4gICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICB0aGlzLm9ic2VydmVycy5wdXNoKG8pO1xuICAgICAgICAgIHJldHVybiBuZXcgSW5uZXJTdWJzY3JpcHRpb24odGhpcywgbyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikge1xuICAgICAgICAgIG8ub25FcnJvcih0aGlzLmVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1ZhbHVlKSB7XG4gICAgICAgICAgby5vbk5leHQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzIHN1YnNjcmliZWQgdG8gaXQuXG4gICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuICAgICAgICovXG4gICAgICBoYXNPYnNlcnZlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA+IDA7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIGFsc28gY2F1c2luZyB0aGUgbGFzdCByZWNlaXZlZCB2YWx1ZSB0byBiZSBzZW50IG91dCAoaWYgYW55KS5cbiAgICAgICAqL1xuICAgICAgb25Db21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGksIGxlbjtcbiAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICB2YXIgbyA9IG9zW2ldO1xuICAgICAgICAgICAgICBvLm9uTmV4dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgb3NbaV0ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGVycm9yLlxuICAgICAgICogQHBhcmFtIHtNaXhlZH0gZXJyb3IgVGhlIEVycm9yIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVycy5cbiAgICAgICAqL1xuICAgICAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBvc1tpXS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBTZW5kcyBhIHZhbHVlIHRvIHRoZSBzdWJqZWN0LiBUaGUgbGFzdCB2YWx1ZSByZWNlaXZlZCBiZWZvcmUgc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbiB3aWxsIGJlIHNlbnQgdG8gYWxsIHN1YnNjcmliZWQgYW5kIGZ1dHVyZSBvYnNlcnZlcnMuXG4gICAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIHN1YmplY3QuXG4gICAgICAgKi9cbiAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIFVuc3Vic2NyaWJlIGFsbCBvYnNlcnZlcnMgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLlxuICAgICAgICovXG4gICAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFzeW5jU3ViamVjdDtcbiAgfShPYnNlcnZhYmxlKSk7XG5cbiAgdmFyIEFub255bW91c1N1YmplY3QgPSBSeC5Bbm9ueW1vdXNTdWJqZWN0ID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhBbm9ueW1vdXNTdWJqZWN0LCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEFub255bW91c1N1YmplY3Qob2JzZXJ2ZXIsIG9ic2VydmFibGUpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGU7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBhZGRQcm9wZXJ0aWVzKEFub255bW91c1N1YmplY3QucHJvdG90eXBlLCBPYnNlcnZlci5wcm90b3R5cGUsIHtcbiAgICAgIF9zdWJzY3JpYmU6IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGUuc3Vic2NyaWJlKG8pO1xuICAgICAgfSxcbiAgICAgIG9uQ29tcGxldGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5vbkVycm9yKGVycm9yKTtcbiAgICAgIH0sXG4gICAgICBvbk5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLm9ic2VydmVyLm9uTmV4dCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gQW5vbnltb3VzU3ViamVjdDtcbiAgfShPYnNlcnZhYmxlKSk7XG5cbiAgLyoqXG4gICAqICBSZXByZXNlbnRzIGEgdmFsdWUgdGhhdCBjaGFuZ2VzIG92ZXIgdGltZS5cbiAgICogIE9ic2VydmVycyBjYW4gc3Vic2NyaWJlIHRvIHRoZSBzdWJqZWN0IHRvIHJlY2VpdmUgdGhlIGxhc3QgKG9yIGluaXRpYWwpIHZhbHVlIGFuZCBhbGwgc3Vic2VxdWVudCBub3RpZmljYXRpb25zLlxuICAgKi9cbiAgdmFyIEJlaGF2aW9yU3ViamVjdCA9IFJ4LkJlaGF2aW9yU3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQmVoYXZpb3JTdWJqZWN0LCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEJlaGF2aW9yU3ViamVjdCh2YWx1ZSkge1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFByb3BlcnRpZXMoQmVoYXZpb3JTdWJqZWN0LnByb3RvdHlwZSwgT2JzZXJ2ZXIucHJvdG90eXBlLCB7XG4gICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChvKTtcbiAgICAgICAgICBvLm9uTmV4dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gbmV3IElubmVyU3Vic2NyaXB0aW9uKHRoaXMsIG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhhc0Vycm9yKSB7XG4gICAgICAgICAgby5vbkVycm9yKHRoaXMuZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvciB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAgICogVmFsdWUgaXMgZnJvemVuIGFmdGVyIG9uQ29tcGxldGVkIGlzIGNhbGxlZC5cbiAgICAgICAqIEFmdGVyIG9uRXJyb3IgaXMgY2FsbGVkIGFsd2F5cyB0aHJvd3MgdGhlIHNwZWNpZmllZCBleGNlcHRpb24uXG4gICAgICAgKiBBbiBleGNlcHRpb24gaXMgYWx3YXlzIHRocm93biBhZnRlciBkaXNwb3NlIGlzIGNhbGxlZC5cbiAgICAgICAqIEByZXR1cm5zIHtNaXhlZH0gVGhlIGluaXRpYWwgdmFsdWUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciB1bnRpbCBvbk5leHQgaXMgY2FsbGVkOyBhZnRlciB3aGljaCwgdGhlIGxhc3QgdmFsdWUgcGFzc2VkIHRvIG9uTmV4dC5cbiAgICAgICAqL1xuICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICAgIGlmICh0aGlzLmhhc0Vycm9yKSB7XG4gICAgICAgICAgICAgIHRocm93IHRoaXMuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdWJqZWN0IGhhcyBvYnNlcnZlcnMgc3Vic2NyaWJlZCB0byBpdC5cbiAgICAgICAqL1xuICAgICAgaGFzT2JzZXJ2ZXJzOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm9ic2VydmVycy5sZW5ndGggPiAwOyB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuXG4gICAgICAgKi9cbiAgICAgIG9uQ29tcGxldGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBvc1tpXS5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIE5vdGlmaWVzIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycyBhYm91dCB0aGUgZXhjZXB0aW9uLlxuICAgICAgICogQHBhcmFtIHtNaXhlZH0gZXJyb3IgVGhlIGV4Y2VwdGlvbiB0byBzZW5kIHRvIGFsbCBvYnNlcnZlcnMuXG4gICAgICAgKi9cbiAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBvc1tpXS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGFycml2YWwgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cbiAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZW5kIHRvIGFsbCBvYnNlcnZlcnMuXG4gICAgICAgKi9cbiAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBvc1tpXS5vbk5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBVbnN1YnNjcmliZSBhbGwgb2JzZXJ2ZXJzIGFuZCByZWxlYXNlIHJlc291cmNlcy5cbiAgICAgICAqL1xuICAgICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IG51bGw7XG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBCZWhhdmlvclN1YmplY3Q7XG4gIH0oT2JzZXJ2YWJsZSkpO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGFuIG9iamVjdCB0aGF0IGlzIGJvdGggYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBhcyB3ZWxsIGFzIGFuIG9ic2VydmVyLlxuICAgKiBFYWNoIG5vdGlmaWNhdGlvbiBpcyBicm9hZGNhc3RlZCB0byBhbGwgc3Vic2NyaWJlZCBhbmQgZnV0dXJlIG9ic2VydmVycywgc3ViamVjdCB0byBidWZmZXIgdHJpbW1pbmcgcG9saWNpZXMuXG4gICAqL1xuICB2YXIgUmVwbGF5U3ViamVjdCA9IFJ4LlJlcGxheVN1YmplY3QgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXG4gICAgdmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlbW92YWJsZURpc3Bvc2FibGUoc3ViamVjdCwgb2JzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBkaXNwb3NhYmxlQ3JlYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZGlzcG9zZSgpO1xuICAgICAgICAhc3ViamVjdC5pc0Rpc3Bvc2VkICYmIHN1YmplY3Qub2JzZXJ2ZXJzLnNwbGljZShzdWJqZWN0Lm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKSwgMSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpbmhlcml0cyhSZXBsYXlTdWJqZWN0LCBfX3N1cGVyX18pO1xuXG4gICAgLyoqXG4gICAgICogIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZXBsYXlTdWJqZWN0IGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZSwgd2luZG93IHNpemUgYW5kIHNjaGVkdWxlci5cbiAgICAgKiAgQHBhcmFtIHtOdW1iZXJ9IFtidWZmZXJTaXplXSBNYXhpbXVtIGVsZW1lbnQgY291bnQgb2YgdGhlIHJlcGxheSBidWZmZXIuXG4gICAgICogIEBwYXJhbSB7TnVtYmVyfSBbd2luZG93U2l6ZV0gTWF4aW11bSB0aW1lIGxlbmd0aCBvZiB0aGUgcmVwbGF5IGJ1ZmZlci5cbiAgICAgKiAgQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0aGUgb2JzZXJ2ZXJzIGFyZSBpbnZva2VkIG9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFJlcGxheVN1YmplY3QoYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplID09IG51bGwgPyBtYXhTYWZlSW50ZWdlciA6IGJ1ZmZlclNpemU7XG4gICAgICB0aGlzLndpbmRvd1NpemUgPSB3aW5kb3dTaXplID09IG51bGwgPyBtYXhTYWZlSW50ZWdlciA6IHdpbmRvd1NpemU7XG4gICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlciB8fCBjdXJyZW50VGhyZWFkU2NoZWR1bGVyO1xuICAgICAgdGhpcy5xID0gW107XG4gICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBhZGRQcm9wZXJ0aWVzKFJlcGxheVN1YmplY3QucHJvdG90eXBlLCBPYnNlcnZlci5wcm90b3R5cGUsIHtcbiAgICAgIF9zdWJzY3JpYmU6IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIHZhciBzbyA9IG5ldyBTY2hlZHVsZWRPYnNlcnZlcih0aGlzLnNjaGVkdWxlciwgbyksIHN1YnNjcmlwdGlvbiA9IGNyZWF0ZVJlbW92YWJsZURpc3Bvc2FibGUodGhpcywgc28pO1xuXG4gICAgICAgIHRoaXMuX3RyaW0odGhpcy5zY2hlZHVsZXIubm93KCkpO1xuICAgICAgICB0aGlzLm9ic2VydmVycy5wdXNoKHNvKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5xLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgc28ub25OZXh0KHRoaXMucVtpXS52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikge1xuICAgICAgICAgIHNvLm9uRXJyb3IodGhpcy5lcnJvcik7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICBzby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc28uZW5zdXJlQWN0aXZlKCk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzIHN1YnNjcmliZWQgdG8gaXQuXG4gICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuICAgICAgICovXG4gICAgICBoYXNPYnNlcnZlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA+IDA7XG4gICAgICB9LFxuICAgICAgX3RyaW06IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMucS5sZW5ndGggPiB0aGlzLmJ1ZmZlclNpemUpIHtcbiAgICAgICAgICB0aGlzLnEuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5xLmxlbmd0aCA+IDAgJiYgKG5vdyAtIHRoaXMucVswXS5pbnRlcnZhbCkgPiB0aGlzLndpbmRvd1NpemUpIHtcbiAgICAgICAgICB0aGlzLnEuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBhcnJpdmFsIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UuXG4gICAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuICAgICAgICovXG4gICAgICBvbk5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHZhciBub3cgPSB0aGlzLnNjaGVkdWxlci5ub3coKTtcbiAgICAgICAgdGhpcy5xLnB1c2goeyBpbnRlcnZhbDogbm93LCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgIHRoaXMuX3RyaW0obm93KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBvc1tpXTtcbiAgICAgICAgICBvYnNlcnZlci5vbk5leHQodmFsdWUpO1xuICAgICAgICAgIG9ic2VydmVyLmVuc3VyZUFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IGVycm9yIFRoZSBleGNlcHRpb24gdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuICAgICAgICovXG4gICAgICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIHZhciBub3cgPSB0aGlzLnNjaGVkdWxlci5ub3coKTtcbiAgICAgICAgdGhpcy5fdHJpbShub3cpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBvc1tpXTtcbiAgICAgICAgICBvYnNlcnZlci5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgICBvYnNlcnZlci5lbnN1cmVBY3RpdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuICAgICAgICovXG4gICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIG5vdyA9IHRoaXMuc2NoZWR1bGVyLm5vdygpO1xuICAgICAgICB0aGlzLl90cmltKG5vdyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBvcyA9IGNsb25lQXJyYXkodGhpcy5vYnNlcnZlcnMpLCBsZW4gPSBvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHZhciBvYnNlcnZlciA9IG9zW2ldO1xuICAgICAgICAgIG9ic2VydmVyLm9uQ29tcGxldGVkKCk7XG4gICAgICAgICAgb2JzZXJ2ZXIuZW5zdXJlQWN0aXZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIFVuc3Vic2NyaWJlIGFsbCBvYnNlcnZlcnMgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLlxuICAgICAgICovXG4gICAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBSZXBsYXlTdWJqZWN0O1xuICB9KE9ic2VydmFibGUpKTtcblxuICAvKipcbiAgKiBVc2VkIHRvIHBhdXNlIGFuZCByZXN1bWUgc3RyZWFtcy5cbiAgKi9cbiAgUnguUGF1c2VyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhQYXVzZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gUGF1c2VyKCkge1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlLlxuICAgICAqL1xuICAgIFBhdXNlci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7IHRoaXMub25OZXh0KGZhbHNlKTsgfTtcblxuICAgIC8qKlxuICAgICogUmVzdW1lcyB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cbiAgICAqL1xuICAgIFBhdXNlci5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkgeyB0aGlzLm9uTmV4dCh0cnVlKTsgfTtcblxuICAgIHJldHVybiBQYXVzZXI7XG4gIH0oU3ViamVjdCkpO1xuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIHJvb3QuUnggPSBSeDtcblxuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBSeDtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiBmcmVlTW9kdWxlKSB7XG4gICAgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTXG4gICAgaWYgKG1vZHVsZUV4cG9ydHMpIHtcbiAgICAgIChmcmVlTW9kdWxlLmV4cG9ydHMgPSBSeCkuUnggPSBSeDtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJlZUV4cG9ydHMuUnggPSBSeDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaW4gYSBicm93c2VyIG9yIFJoaW5vXG4gICAgcm9vdC5SeCA9IFJ4O1xuICB9XG5cbiAgLy8gQWxsIGNvZGUgYmVmb3JlIHRoaXMgcG9pbnQgd2lsbCBiZSBmaWx0ZXJlZCBmcm9tIHN0YWNrIHRyYWNlcy5cbiAgdmFyIHJFbmRpbmdMaW5lID0gY2FwdHVyZUxpbmUoKTtcblxufS5jYWxsKHRoaXMpKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NsaW1iLXNvY2lhbC9+L3J4LWxpdGUvcngubGl0ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5jbGltYl9fd2FsbHt3aWR0aDoxMDAlO3BhZGRpbmc6MDttYXJnaW46MDstd2Via2l0LWp1c3RpZnktY29udGVudDpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjstd2Via2l0LWZsZXgtZGlyZWN0aW9uOnJvdzstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvdzstd2Via2l0LWZsZXgtd3JhcDp3cmFwOy1tcy1mbGV4LXdyYXA6d3JhcDtmbGV4LXdyYXA6d3JhcDtmb250LXNpemU6MTAwJX0uY2xpbWJfX3RpbGUsLmNsaW1iX193YWxse2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4fS5jbGltYl9fdGlsZXstd2Via2l0LWZsZXgtc2hyaW5rOjA7LW1zLWZsZXgtbmVnYXRpdmU6MDtmbGV4LXNocmluazowO2hlaWdodDo0MjVweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7LW1zLWZsZXgtcGFjazplbmQ7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kOy13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO291dGxpbmU6MXB4IHNvbGlkIHRyYW5zcGFyZW50O21hcmdpbi1ib3R0b206MjBweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1hbGlnbjpsZWZ0O2JvcmRlci1yYWRpdXM6N3B4O2JhY2tncm91bmQtY29sb3I6I2Y2ZjZmNjstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtcGVyc3BlY3RpdmU6MTAwMHB4O3BlcnNwZWN0aXZlOjEwMDBweH0uY2xpbWJfX3RpbGVfX2NvbnRlbnR7ei1pbmRleDoxO3BhZGRpbmc6MjZweDtiYWNrZ3JvdW5kLWNvbG9yOiNmNmY2ZjZ9LmNsaW1iX190aWxlLS1oYXMtbm8taW1hZ2UgLmNsaW1iX190aWxlX19jb250ZW50e2hlaWdodDoxMDAlO2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uOy13ZWJraXQtanVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47LW1zLWZsZXgtcGFjazpqdXN0aWZ5O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2JveC1zaXppbmc6Ym9yZGVyLWJveH0uY2xpbWJfX3RpbGVfX2ltYWdle21heC13aWR0aDoxMDAlO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6N3B4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjdweH0uY2xpbWJfX3RpbGVfX21lc3NhZ2V7ei1pbmRleDoxO21hcmdpbi1ib3R0b206MjRweH0uY2xpbWJfX3RpbGVfX21lc3NhZ2U+YXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7bWF4LXdpZHRoOjI2MHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0uY2xpbWJfX3RpbGUtLWhhcy1uby1pbWFnZSAuY2xpbWJfX3RpbGVfX21lc3NhZ2V7Zm9udC1zaXplOjE4NSV9LmNsaW1iX190aWxlX19hdXRob3J7ZGlzcGxheTpibG9jazttYXJnaW46LTEwcHh9LmNsaW1iX190aWxlX19hdXRob3IgaW1ne2JvcmRlci1yYWRpdXM6MjVweDt3aWR0aDozNHB4fS5jbGltYl9fdGlsZV9fYXV0aG9yIC5jbGltYl9fdGlsZV9fYXV0aG9yX191c2VybmFtZXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MCAwIDAgMTBweDtsaW5lLWhlaWdodDozNHB4O3ZlcnRpY2FsLWFsaWduOnRvcH0uY2xpbWItc29jaWFsLWJhZGdle3Bvc2l0aW9uOmZpeGVkO2JvdHRvbToyMHB4O3JpZ2h0OjIwcHg7ei1pbmRleDo5O2JhY2tncm91bmQtY29sb3I6I2E5Y2FlMjt3aWR0aDoyMDBweDtoZWlnaHQ6NjZweDtib3JkZXItcmFkaXVzOjVweH0uY2xpbWItc29jaWFsLWJhZGdlPnNwYW57cG9zaXRpb246YWJzb2x1dGUhaW1wb3J0YW50O3RvcDotOTk5OXB4IWltcG9ydGFudDtsZWZ0Oi05OTk5cHghaW1wb3J0YW50fVwiLCBcIlwiXSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2Nzcy1sb2FkZXIhLi9+L2F1dG9wcmVmaXhlci1sb2FkZXI/YnJvd3NlcnM9bGFzdCAyIHZlcnNpb24hLi9+L3Nhc3MtbG9hZGVyIS4vc3JjL3N0eWxlL21haW4uc2Nzc1xuICoqIG1vZHVsZSBpZCA9IDE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvKlxyXG5cdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcblx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxyXG4qL1xyXG4vLyBjc3MgYmFzZSBjb2RlLCBpbmplY3RlZCBieSB0aGUgY3NzLWxvYWRlclxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciBsaXN0ID0gW107XHJcblxyXG5cdC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcclxuXHRsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XHJcblx0XHR2YXIgcmVzdWx0ID0gW107XHJcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgaXRlbSA9IHRoaXNbaV07XHJcblx0XHRcdGlmKGl0ZW1bMl0pIHtcclxuXHRcdFx0XHRyZXN1bHQucHVzaChcIkBtZWRpYSBcIiArIGl0ZW1bMl0gKyBcIntcIiArIGl0ZW1bMV0gKyBcIn1cIik7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmVzdWx0LnB1c2goaXRlbVsxXSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiByZXN1bHQuam9pbihcIlwiKTtcclxuXHR9O1xyXG5cclxuXHQvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxyXG5cdGxpc3QuaSA9IGZ1bmN0aW9uKG1vZHVsZXMsIG1lZGlhUXVlcnkpIHtcclxuXHRcdGlmKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKVxyXG5cdFx0XHRtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCBcIlwiXV07XHJcblx0XHR2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIGlkID0gdGhpc1tpXVswXTtcclxuXHRcdFx0aWYodHlwZW9mIGlkID09PSBcIm51bWJlclwiKVxyXG5cdFx0XHRcdGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGZvcihpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIGl0ZW0gPSBtb2R1bGVzW2ldO1xyXG5cdFx0XHQvLyBza2lwIGFscmVhZHkgaW1wb3J0ZWQgbW9kdWxlXHJcblx0XHRcdC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IDEwMCUgcGVyZmVjdCBmb3Igd2VpcmQgbWVkaWEgcXVlcnkgY29tYmluYXRpb25zXHJcblx0XHRcdC8vICB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IG1lZGlhIHF1ZXJpZXMuXHJcblx0XHRcdC8vICBJIGhvcGUgdGhpcyB3aWxsIG5ldmVyIG9jY3VyIChIZXkgdGhpcyB3YXkgd2UgaGF2ZSBzbWFsbGVyIGJ1bmRsZXMpXHJcblx0XHRcdGlmKHR5cGVvZiBpdGVtWzBdICE9PSBcIm51bWJlclwiIHx8ICFhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XHJcblx0XHRcdFx0aWYobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xyXG5cdFx0XHRcdFx0aXRlbVsyXSA9IG1lZGlhUXVlcnk7XHJcblx0XHRcdFx0fSBlbHNlIGlmKG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0XHRcdGl0ZW1bMl0gPSBcIihcIiArIGl0ZW1bMl0gKyBcIikgYW5kIChcIiArIG1lZGlhUXVlcnkgKyBcIilcIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fTtcclxuXHRyZXR1cm4gbGlzdDtcclxufTtcclxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbJ2V4cG9ydHMnLCAnbW9kdWxlJ10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGZhY3RvcnkoZXhwb3J0cywgbW9kdWxlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbW9kID0ge1xuICAgICAgZXhwb3J0czoge31cbiAgICB9O1xuICAgIGZhY3RvcnkobW9kLmV4cG9ydHMsIG1vZCk7XG4gICAgZ2xvYmFsLmZldGNoSnNvbnAgPSBtb2QuZXhwb3J0cztcbiAgfVxufSkodGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsIG1vZHVsZSkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAganNvbnBDYWxsYmFjazogJ2NhbGxiYWNrJ1xuICB9O1xuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlQ2FsbGJhY2tGdW5jdGlvbigpIHtcbiAgICByZXR1cm4gJ2pzb25wXycgKyBEYXRlLm5vdygpICsgJ18nICsgTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiAxMDAwMDApO1xuICB9XG5cbiAgLy8gS25vd24gaXNzdWU6IFdpbGwgdGhyb3cgJ1VuY2F1Z2h0IFJlZmVyZW5jZUVycm9yOiBjYWxsYmFja18qKiogaXMgbm90IGRlZmluZWQnIGVycm9yIGlmIHJlcXVlc3QgdGltZW91dFxuICBmdW5jdGlvbiBjbGVhckZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSkge1xuICAgIC8vIElFOCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4geW91IHRyeSB0byBkZWxldGUgYSBwcm9wZXJ0eSBvbiB3aW5kb3dcbiAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xODI0MjI4Lzc1MTA4OVxuICAgIHRyeSB7XG4gICAgICBkZWxldGUgd2luZG93W2Z1bmN0aW9uTmFtZV07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgd2luZG93W2Z1bmN0aW9uTmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlU2NyaXB0KHNjcmlwdElkKSB7XG4gICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNjcmlwdElkKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF0ucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgfVxuXG4gIHZhciBmZXRjaEpzb25wID0gZnVuY3Rpb24gZmV0Y2hKc29ucCh1cmwpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzFdO1xuXG4gICAgdmFyIHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgIT0gbnVsbCA/IG9wdGlvbnMudGltZW91dCA6IGRlZmF1bHRPcHRpb25zLnRpbWVvdXQ7XG4gICAgdmFyIGpzb25wQ2FsbGJhY2sgPSBvcHRpb25zLmpzb25wQ2FsbGJhY2sgIT0gbnVsbCA/IG9wdGlvbnMuanNvbnBDYWxsYmFjayA6IGRlZmF1bHRPcHRpb25zLmpzb25wQ2FsbGJhY2s7XG5cbiAgICB2YXIgdGltZW91dElkID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBjYWxsYmFja0Z1bmN0aW9uID0gZ2VuZXJhdGVDYWxsYmFja0Z1bmN0aW9uKCk7XG5cbiAgICAgIHdpbmRvd1tjYWxsYmFja0Z1bmN0aW9uXSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgICAvLyBrZWVwIGNvbnNpc3RlbnQgd2l0aCBmZXRjaCBBUElcbiAgICAgICAgICBqc29uOiBmdW5jdGlvbiBqc29uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGltZW91dElkKSBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICByZW1vdmVTY3JpcHQoanNvbnBDYWxsYmFjayArICdfJyArIGNhbGxiYWNrRnVuY3Rpb24pO1xuXG4gICAgICAgIGNsZWFyRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlvbik7XG4gICAgICB9O1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBzZXQgdGhlaXIgb3duIHBhcmFtcywgYW5kIGlmIG5vdCBhZGQgYSA/IHRvIHN0YXJ0IGEgbGlzdCBvZiBwYXJhbXNcbiAgICAgIHVybCArPSB1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJztcblxuICAgICAgdmFyIGpzb25wU2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBqc29ucFNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdXJsICsganNvbnBDYWxsYmFjayArICc9JyArIGNhbGxiYWNrRnVuY3Rpb24pO1xuICAgICAganNvbnBTY3JpcHQuaWQgPSBqc29ucENhbGxiYWNrICsgJ18nICsgY2FsbGJhY2tGdW5jdGlvbjtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXS5hcHBlbmRDaGlsZChqc29ucFNjcmlwdCk7XG5cbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdKU09OUCByZXF1ZXN0IHRvICcgKyB1cmwgKyAnIHRpbWVkIG91dCcpKTtcblxuICAgICAgICBjbGVhckZ1bmN0aW9uKGNhbGxiYWNrRnVuY3Rpb24pO1xuICAgICAgICByZW1vdmVTY3JpcHQoanNvbnBDYWxsYmFjayArICdfJyArIGNhbGxiYWNrRnVuY3Rpb24pO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gZXhwb3J0IGFzIGdsb2JhbCBmdW5jdGlvblxuICAvKlxuICBsZXQgbG9jYWw7XG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gc2VsZjtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgfVxuICB9XG4gIFxuICBsb2NhbC5mZXRjaEpzb25wID0gZmV0Y2hKc29ucDtcbiAgKi9cblxuICBtb2R1bGUuZXhwb3J0cyA9IGZldGNoSnNvbnA7XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9mZXRjaC1qc29ucC9idWlsZC9mZXRjaC1qc29ucC5qc1xuICoqIG1vZHVsZSBpZCA9IDE2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSBjb25maWdBbmltYXRpb247XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9wZXJmb3JtYW5jZU5vdyA9IHJlcXVpcmUoJ3BlcmZvcm1hbmNlLW5vdycpO1xuXG52YXIgX3BlcmZvcm1hbmNlTm93MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BlcmZvcm1hbmNlTm93KTtcblxudmFyIF9yYWYgPSByZXF1aXJlKCdyYWYnKTtcblxudmFyIF9yYWYyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmFmKTtcblxuZnVuY3Rpb24gY29uZmlnQW5pbWF0aW9uKCkge1xuICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG4gIHZhciBfY29uZmlnJHRpbWVTdGVwID0gY29uZmlnLnRpbWVTdGVwO1xuICB2YXIgdGltZVN0ZXAgPSBfY29uZmlnJHRpbWVTdGVwID09PSB1bmRlZmluZWQgPyAxIC8gNjAgKiAxMDAwIDogX2NvbmZpZyR0aW1lU3RlcDtcbiAgdmFyIF9jb25maWckdGltZVNjYWxlID0gY29uZmlnLnRpbWVTY2FsZTtcbiAgdmFyIHRpbWVTY2FsZSA9IF9jb25maWckdGltZVNjYWxlID09PSB1bmRlZmluZWQgPyAxIDogX2NvbmZpZyR0aW1lU2NhbGU7XG4gIHZhciBfY29uZmlnJG1heFN0ZXBzID0gY29uZmlnLm1heFN0ZXBzO1xuICB2YXIgbWF4U3RlcHMgPSBfY29uZmlnJG1heFN0ZXBzID09PSB1bmRlZmluZWQgPyAxMCA6IF9jb25maWckbWF4U3RlcHM7XG4gIHZhciBfY29uZmlnJHJhZiA9IGNvbmZpZy5yYWY7XG4gIHZhciByYWYgPSBfY29uZmlnJHJhZiA9PT0gdW5kZWZpbmVkID8gX3JhZjJbJ2RlZmF1bHQnXSA6IF9jb25maWckcmFmO1xuICB2YXIgX2NvbmZpZyRub3cgPSBjb25maWcubm93O1xuICB2YXIgbm93ID0gX2NvbmZpZyRub3cgPT09IHVuZGVmaW5lZCA/IF9wZXJmb3JtYW5jZU5vdzJbJ2RlZmF1bHQnXSA6IF9jb25maWckbm93O1xuXG4gIHZhciBhbmltUnVubmluZyA9IFtdO1xuICB2YXIgcnVubmluZyA9IGZhbHNlO1xuICB2YXIgcHJldlRpbWUgPSAwO1xuICB2YXIgYWNjdW11bGF0ZWRUaW1lID0gMDtcblxuICBmdW5jdGlvbiBsb29wKCkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IG5vdygpO1xuICAgIHZhciBmcmFtZVRpbWUgPSBjdXJyZW50VGltZSAtIHByZXZUaW1lOyAvLyBkZWx0YVxuXG4gICAgcHJldlRpbWUgPSBjdXJyZW50VGltZTtcbiAgICBhY2N1bXVsYXRlZFRpbWUgKz0gZnJhbWVUaW1lICogdGltZVNjYWxlO1xuXG4gICAgaWYgKGFjY3VtdWxhdGVkVGltZSA+IHRpbWVTdGVwICogbWF4U3RlcHMpIHtcbiAgICAgIGFjY3VtdWxhdGVkVGltZSA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGZyYW1lTnVtYmVyID0gTWF0aC5jZWlsKGFjY3VtdWxhdGVkVGltZSAvIHRpbWVTdGVwKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuaW1SdW5uaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX2FuaW1SdW5uaW5nJGkgPSBhbmltUnVubmluZ1tpXTtcbiAgICAgIHZhciBhY3RpdmUgPSBfYW5pbVJ1bm5pbmckaS5hY3RpdmU7XG4gICAgICB2YXIgYW5pbWF0aW9uU3RlcCA9IF9hbmltUnVubmluZyRpLmFuaW1hdGlvblN0ZXA7XG4gICAgICB2YXIgcHJldlByZXZTdGF0ZSA9IF9hbmltUnVubmluZyRpLnByZXZTdGF0ZTtcbiAgICAgIHZhciBwcmV2TmV4dFN0YXRlID0gYW5pbVJ1bm5pbmdbaV0ubmV4dFN0YXRlO1xuXG4gICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VlbXMgbGlrZSBiZWNhdXNlIHRoZSBUUyBzZXRzIGRlc3RWYWxzIGFzIGVudGVyVmFscyBmb3IgdGhlIGZpcnN0XG4gICAgICAvLyB0aWNrLCB3ZSBtaWdodCByZW5kZXIgdGhhdCB2YWx1ZSB0d2ljZS4gV2UgcmVuZGVyIGl0IG9uY2UsIGN1cnJWYWx1ZSBpc1xuICAgICAgLy8gZW50ZXJWYWwgYW5kIGRlc3RWYWwgaXMgZW50ZXJWYWwuIFRoZSBuZXh0IHRpY2sgaXMgZmFzdGVyIHRoYW4gMTZtcyxcbiAgICAgIC8vIHNvIGFjY3VtdWxhdGVkVGltZSAod2hpY2ggd291bGQgYmUgYWJvdXQgLTE2bXMgZnJvbSB0aGUgcHJldmlvdXMgdGljaylcbiAgICAgIC8vIGlzIG5lZ2F0aXZlICgtMTZtcyArIGFueSBudW1iZXIgbGVzcyB0aGFuIDE2bXMgPCAwKS4gU28gd2UganVzdCByZW5kZXJcbiAgICAgIC8vIHBhcnQgd2F5cyB0b3dhcmRzIHRoZSBuZXh0U3RhdGUsIGJ1dCB0aGF0J3MgZW50ZXJWYWwgc3RpbGwuIFdlIHJlbmRlclxuICAgICAgLy8gc2F5IDc1JSBiZXR3ZWVuIGN1cnJWYWx1ZSAoPT09IGVudGVyVmFsKSBhbmQgZGVzdFZhbHVlICg9PT0gZW50ZXJWYWwpLlxuICAgICAgLy8gU28gd2UgcmVuZGVyIHRoZSBzYW1lIHZhbHVlIGEgc2Vjb25kIHRpbWUuXG4gICAgICAvLyBUaGUgc29sdXRpb24gYmVsb3cgaXMgdG8gcmVjYWxjdWxhdGUgdGhlIGRlc3RpbmF0aW9uIHN0YXRlIGV2ZW4gd2hlblxuICAgICAgLy8geW91J3JlIG1vdmluZyBwYXJ0aWFsbHkgdG93YXJkcyBpdC5cbiAgICAgIGlmIChhY2N1bXVsYXRlZFRpbWUgPD0gMCkge1xuICAgICAgICBhbmltUnVubmluZ1tpXS5uZXh0U3RhdGUgPSBhbmltYXRpb25TdGVwKHRpbWVTdGVwIC8gMTAwMCwgcHJldlByZXZTdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZyYW1lTnVtYmVyOyBqKyspIHtcbiAgICAgICAgICBhbmltUnVubmluZ1tpXS5uZXh0U3RhdGUgPSBhbmltYXRpb25TdGVwKHRpbWVTdGVwIC8gMTAwMCwgcHJldk5leHRTdGF0ZSk7XG4gICAgICAgICAgdmFyIF9yZWYgPSBbcHJldk5leHRTdGF0ZSwgYW5pbVJ1bm5pbmdbaV0ubmV4dFN0YXRlXTtcbiAgICAgICAgICBhbmltUnVubmluZ1tpXS5wcmV2U3RhdGUgPSBfcmVmWzBdO1xuICAgICAgICAgIHByZXZOZXh0U3RhdGUgPSBfcmVmWzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYWNjdW11bGF0ZWRUaW1lID0gYWNjdW11bGF0ZWRUaW1lIC0gZnJhbWVOdW1iZXIgKiB0aW1lU3RlcDtcblxuICAgIC8vIFJlbmRlciBhbmQgZmlsdGVyIGluIG9uZSBpdGVyYXRpb24uXG4gICAgdmFyIGFscGhhID0gMSArIGFjY3VtdWxhdGVkVGltZSAvIHRpbWVTdGVwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5pbVJ1bm5pbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfYW5pbVJ1bm5pbmckaTIgPSBhbmltUnVubmluZ1tpXTtcbiAgICAgIHZhciBhbmltYXRpb25SZW5kZXIgPSBfYW5pbVJ1bm5pbmckaTIuYW5pbWF0aW9uUmVuZGVyO1xuICAgICAgdmFyIG5leHRTdGF0ZSA9IF9hbmltUnVubmluZyRpMi5uZXh0U3RhdGU7XG4gICAgICB2YXIgcHJldlN0YXRlID0gX2FuaW1SdW5uaW5nJGkyLnByZXZTdGF0ZTtcblxuICAgICAgLy8gTWlnaHQgbXV0YXRlIGFuaW1SdW5uaW5nLi4uLi4uLi5cbiAgICAgIGFuaW1hdGlvblJlbmRlcihhbHBoYSwgbmV4dFN0YXRlLCBwcmV2U3RhdGUpO1xuICAgIH1cblxuICAgIGFuaW1SdW5uaW5nID0gYW5pbVJ1bm5pbmcuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIGFjdGl2ZSA9IF9yZWYyLmFjdGl2ZTtcbiAgICAgIHJldHVybiBhY3RpdmU7XG4gICAgfSk7XG5cbiAgICBpZiAoYW5pbVJ1bm5pbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhZihsb29wKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICBpZiAoIXJ1bm5pbmcpIHtcbiAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgcHJldlRpbWUgPSBub3coKTtcbiAgICAgIGFjY3VtdWxhdGVkVGltZSA9IDA7XG4gICAgICByYWYobG9vcCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW9uKHN0YXRlLCBhbmltYXRpb25TdGVwLCBhbmltYXRpb25SZW5kZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuaW1SdW5uaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsID0gYW5pbVJ1bm5pbmdbaV07XG4gICAgICBpZiAodmFsLmFuaW1hdGlvblN0ZXAgPT09IGFuaW1hdGlvblN0ZXApIHtcbiAgICAgICAgdmFsLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHZhbC5wcmV2U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIHZhbC5zdG9wO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXdBbmltID0ge1xuICAgICAgYW5pbWF0aW9uU3RlcDogYW5pbWF0aW9uU3RlcCxcbiAgICAgIGFuaW1hdGlvblJlbmRlcjogYW5pbWF0aW9uUmVuZGVyLFxuICAgICAgcHJldlN0YXRlOiBzdGF0ZSxcbiAgICAgIG5leHRTdGF0ZTogc3RhdGUsXG4gICAgICBhY3RpdmU6IHRydWVcbiAgICB9O1xuXG4gICAgbmV3QW5pbS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ld0FuaW0uYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgICBhbmltUnVubmluZy5wdXNoKG5ld0FuaW0pO1xuXG4gICAgc3RhcnQoKTtcblxuICAgIHJldHVybiBuZXdBbmltLnN0b3A7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0LW1vdGlvbi9saWIvYW5pbWF0aW9uTG9vcC5qc1xuICoqIG1vZHVsZSBpZCA9IDE3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNvbXBvbmVudHM7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9ub1ZlbG9jaXR5ID0gcmVxdWlyZSgnLi9ub1ZlbG9jaXR5Jyk7XG5cbnZhciBfbm9WZWxvY2l0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ub1ZlbG9jaXR5KTtcblxudmFyIF9oYXNSZWFjaGVkU3R5bGUgPSByZXF1aXJlKCcuL2hhc1JlYWNoZWRTdHlsZScpO1xuXG52YXIgX2hhc1JlYWNoZWRTdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYXNSZWFjaGVkU3R5bGUpO1xuXG52YXIgX21lcmdlRGlmZiA9IHJlcXVpcmUoJy4vbWVyZ2VEaWZmJyk7XG5cbnZhciBfbWVyZ2VEaWZmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX21lcmdlRGlmZik7XG5cbnZhciBfYW5pbWF0aW9uTG9vcCA9IHJlcXVpcmUoJy4vYW5pbWF0aW9uTG9vcCcpO1xuXG52YXIgX2FuaW1hdGlvbkxvb3AyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYW5pbWF0aW9uTG9vcCk7XG5cbnZhciBfemVybyA9IHJlcXVpcmUoJy4vemVybycpO1xuXG52YXIgX3plcm8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfemVybyk7XG5cbnZhciBfdXBkYXRlVHJlZSA9IHJlcXVpcmUoJy4vdXBkYXRlVHJlZScpO1xuXG52YXIgX2RlcHJlY2F0ZWRTcHJpbmdzMiA9IHJlcXVpcmUoJy4vZGVwcmVjYXRlZFNwcmluZ3MnKTtcblxudmFyIF9kZXByZWNhdGVkU3ByaW5nczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZXByZWNhdGVkU3ByaW5nczIpO1xuXG52YXIgX3N0cmlwU3R5bGUgPSByZXF1aXJlKCcuL3N0cmlwU3R5bGUnKTtcblxudmFyIF9zdHJpcFN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0cmlwU3R5bGUpO1xuXG52YXIgc3RhcnRBbmltYXRpb24gPSBfYW5pbWF0aW9uTG9vcDJbJ2RlZmF1bHQnXSgpO1xuXG5mdW5jdGlvbiBtYXBPYmplY3QoZiwgb2JqKSB7XG4gIHZhciByZXQgPSB7fTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXRba2V5XSA9IGYob2JqW2tleV0sIGtleSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZXZlcnlPYmooZiwgb2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFmKG9ialtrZXldLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb21wb25lbnRzKFJlYWN0KSB7XG4gIHZhciBQcm9wVHlwZXMgPSBSZWFjdC5Qcm9wVHlwZXM7XG5cbiAgdmFyIE1vdGlvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICBkaXNwbGF5TmFtZTogJ01vdGlvbicsXG5cbiAgICBwcm9wVHlwZXM6IHtcbiAgICAgIC8vIFRPT0Q6IHdhcm4gYWdhaW5zdCBwdXR0aW5nIGEgY29uZmlnIGluIGhlcmVcbiAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gZGVmYXVsdFZhbHVlKHByb3AsIHByb3BOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1NwcmluZ1xcJ3MgYGRlZmF1bHRWYWx1ZWAgaGFzIGJlZW4gY2hhbmdlZCB0byBgZGVmYXVsdFN0eWxlYC4gJyArICdJdHMgZm9ybWF0IHJlY2VpdmVkIGEgZmV3IChlYXN5IHRvIHVwZGF0ZSEpIGNoYW5nZXMgYXMgd2VsbC4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVuZFZhbHVlOiBmdW5jdGlvbiBlbmRWYWx1ZShwcm9wLCBwcm9wTmFtZSkge1xuICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdTcHJpbmdcXCdzIGBlbmRWYWx1ZWAgaGFzIGJlZW4gY2hhbmdlZCB0byBgc3R5bGVgLiBJdHMgZm9ybWF0ICcgKyAncmVjZWl2ZWQgYSBmZXcgKGVhc3kgdG8gdXBkYXRlISkgY2hhbmdlcyBhcyB3ZWxsLicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVmYXVsdFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG4gICAgfSxcblxuICAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgZGVmYXVsdFN0eWxlID0gX3Byb3BzLmRlZmF1bHRTdHlsZTtcbiAgICAgIHZhciBzdHlsZSA9IF9wcm9wcy5zdHlsZTtcblxuICAgICAgdmFyIGN1cnJlbnRTdHlsZSA9IGRlZmF1bHRTdHlsZSB8fCBzdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRTdHlsZTogY3VycmVudFN0eWxlLFxuICAgICAgICBjdXJyZW50VmVsb2NpdHk6IG1hcE9iamVjdChfemVybzJbJ2RlZmF1bHQnXSwgY3VycmVudFN0eWxlKVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5zdGFydEFuaW1hdGluZygpO1xuICAgIH0sXG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkge1xuICAgICAgdGhpcy5zdGFydEFuaW1hdGluZygpO1xuICAgIH0sXG5cbiAgICBhbmltYXRpb25TdGVwOiBmdW5jdGlvbiBhbmltYXRpb25TdGVwKHRpbWVzdGVwLCBzdGF0ZSkge1xuICAgICAgdmFyIGN1cnJlbnRTdHlsZSA9IHN0YXRlLmN1cnJlbnRTdHlsZTtcbiAgICAgIHZhciBjdXJyZW50VmVsb2NpdHkgPSBzdGF0ZS5jdXJyZW50VmVsb2NpdHk7XG4gICAgICB2YXIgc3R5bGUgPSB0aGlzLnByb3BzLnN0eWxlO1xuXG4gICAgICB2YXIgbmV3Q3VycmVudFN0eWxlID0gX3VwZGF0ZVRyZWUudXBkYXRlQ3VycmVudFN0eWxlKHRpbWVzdGVwLCBjdXJyZW50U3R5bGUsIGN1cnJlbnRWZWxvY2l0eSwgc3R5bGUpO1xuICAgICAgdmFyIG5ld0N1cnJlbnRWZWxvY2l0eSA9IF91cGRhdGVUcmVlLnVwZGF0ZUN1cnJlbnRWZWxvY2l0eSh0aW1lc3RlcCwgY3VycmVudFN0eWxlLCBjdXJyZW50VmVsb2NpdHksIHN0eWxlKTtcblxuICAgICAgLy8gVE9PRDogdGhpcyBpc24ndCBuZWNlc3NhcnkgYW55bW9yZS4gSXQgd2FzIHVzZWQgb25seSBhZ2FpbnN0IGVuZFZhbHVlIGZ1bmNcbiAgICAgIGlmIChfbm9WZWxvY2l0eTJbJ2RlZmF1bHQnXShjdXJyZW50VmVsb2NpdHksIG5ld0N1cnJlbnRTdHlsZSkgJiYgX25vVmVsb2NpdHkyWydkZWZhdWx0J10obmV3Q3VycmVudFZlbG9jaXR5LCBuZXdDdXJyZW50U3R5bGUpKSB7XG4gICAgICAgIC8vIGNoZWNrIGV4cGxhbmF0aW9uIGluIGBNb3Rpb24uYW5pbWF0aW9uUmVuZGVyYFxuICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTsgLy8gTmFzdHkgc2lkZSBlZmZlY3RzLi4uLlxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW50U3R5bGU6IG5ld0N1cnJlbnRTdHlsZSxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5OiBuZXdDdXJyZW50VmVsb2NpdHlcbiAgICAgIH07XG4gICAgfSxcblxuICAgIHN0b3BBbmltYXRpb246IG51bGwsXG5cbiAgICAvLyB1c2VkIGluIGFuaW1hdGlvblJlbmRlclxuICAgIGhhc1VubW91bnRlZDogZmFsc2UsXG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudDogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcbiAgICAgIHRoaXMuaGFzVW5tb3VudGVkID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgc3RhcnRBbmltYXRpbmc6IGZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW5nKCkge1xuICAgICAgLy8gSXMgc21hcnQgZW5vdWdoIHRvIG5vdCBzdGFydCBpdCB0d2ljZVxuICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uID0gc3RhcnRBbmltYXRpb24odGhpcy5zdGF0ZSwgdGhpcy5hbmltYXRpb25TdGVwLCB0aGlzLmFuaW1hdGlvblJlbmRlcik7XG4gICAgfSxcblxuICAgIGFuaW1hdGlvblJlbmRlcjogZnVuY3Rpb24gYW5pbWF0aW9uUmVuZGVyKGFscGhhLCBuZXh0U3RhdGUsIHByZXZTdGF0ZSkge1xuICAgICAgLy8gYHRoaXMuaGFzVW5tb3VudGVkYCBtaWdodCBiZSB0cnVlIGluIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uOlxuICAgICAgLy8gdXNlciBkb2VzIHNvbWUgY2hlY2tzIGluIGBzdHlsZWAgYW5kIGNhbGxzIGFuIG93bmVyIGhhbmRsZXJcbiAgICAgIC8vIG93bmVyIHNldHMgc3RhdGUgaW4gdGhlIGNhbGxiYWNrLCB0cmlnZ2VyaW5nIGEgcmUtcmVuZGVyXG4gICAgICAvLyB1bm1vdW50cyBNb3Rpb25cbiAgICAgIGlmICghdGhpcy5oYXNVbm1vdW50ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgY3VycmVudFN0eWxlOiBfdXBkYXRlVHJlZS5pbnRlcnBvbGF0ZVZhbHVlKGFscGhhLCBuZXh0U3RhdGUuY3VycmVudFN0eWxlLCBwcmV2U3RhdGUuY3VycmVudFN0eWxlKSxcbiAgICAgICAgICBjdXJyZW50VmVsb2NpdHk6IG5leHRTdGF0ZS5jdXJyZW50VmVsb2NpdHlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHN0cmlwcGVkU3R5bGUgPSBfc3RyaXBTdHlsZTJbJ2RlZmF1bHQnXSh0aGlzLnN0YXRlLmN1cnJlbnRTdHlsZSk7XG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW4oc3RyaXBwZWRTdHlsZSk7XG4gICAgICByZXR1cm4gcmVuZGVyZWRDaGlsZHJlbiAmJiBSZWFjdC5DaGlsZHJlbi5vbmx5KHJlbmRlcmVkQ2hpbGRyZW4pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIFN0YWdnZXJlZE1vdGlvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICBkaXNwbGF5TmFtZTogJ1N0YWdnZXJlZE1vdGlvbicsXG5cbiAgICBwcm9wVHlwZXM6IHtcbiAgICAgIGRlZmF1bHRTdHlsZTogZnVuY3Rpb24gZGVmYXVsdFN0eWxlKHByb3AsIHByb3BOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBmb3Jnb3QgdGhlIFwic1wiIGZvciBgU3RhZ2dlcmVkTW90aW9uYFxcJ3MgYGRlZmF1bHRTdHlsZXNgLicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKHByb3AsIHByb3BOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBmb3Jnb3QgdGhlIFwic1wiIGZvciBgU3RhZ2dlcmVkTW90aW9uYFxcJ3MgYHN0eWxlc2AuJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBUT09EOiB3YXJuIGFnYWluc3QgcHV0dGluZyBjb25maWdzIGluIGhlcmVcbiAgICAgIGRlZmF1bHRTdHlsZXM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgc3R5bGVzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgICB9LFxuXG4gICAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgc3R5bGVzID0gX3Byb3BzMi5zdHlsZXM7XG4gICAgICB2YXIgZGVmYXVsdFN0eWxlcyA9IF9wcm9wczIuZGVmYXVsdFN0eWxlcztcblxuICAgICAgdmFyIGN1cnJlbnRTdHlsZXMgPSBkZWZhdWx0U3R5bGVzID8gZGVmYXVsdFN0eWxlcyA6IHN0eWxlcygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudFN0eWxlczogY3VycmVudFN0eWxlcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXRpZXM6IGN1cnJlbnRTdHlsZXMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcE9iamVjdChfemVybzJbJ2RlZmF1bHQnXSwgcyk7XG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG4gICAgfSxcblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKSB7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG4gICAgfSxcblxuICAgIGFuaW1hdGlvblN0ZXA6IGZ1bmN0aW9uIGFuaW1hdGlvblN0ZXAodGltZXN0ZXAsIHN0YXRlKSB7XG4gICAgICB2YXIgY3VycmVudFN0eWxlcyA9IHN0YXRlLmN1cnJlbnRTdHlsZXM7XG4gICAgICB2YXIgY3VycmVudFZlbG9jaXRpZXMgPSBzdGF0ZS5jdXJyZW50VmVsb2NpdGllcztcblxuICAgICAgdmFyIHN0eWxlcyA9IHRoaXMucHJvcHMuc3R5bGVzKGN1cnJlbnRTdHlsZXMubWFwKF9zdHJpcFN0eWxlMlsnZGVmYXVsdCddKSk7XG5cbiAgICAgIHZhciBuZXdDdXJyZW50U3R5bGVzID0gY3VycmVudFN0eWxlcy5tYXAoZnVuY3Rpb24gKGN1cnJlbnRTdHlsZSwgaSkge1xuICAgICAgICByZXR1cm4gX3VwZGF0ZVRyZWUudXBkYXRlQ3VycmVudFN0eWxlKHRpbWVzdGVwLCBjdXJyZW50U3R5bGUsIGN1cnJlbnRWZWxvY2l0aWVzW2ldLCBzdHlsZXNbaV0pO1xuICAgICAgfSk7XG4gICAgICB2YXIgbmV3Q3VycmVudFZlbG9jaXRpZXMgPSBjdXJyZW50U3R5bGVzLm1hcChmdW5jdGlvbiAoY3VycmVudFN0eWxlLCBpKSB7XG4gICAgICAgIHJldHVybiBfdXBkYXRlVHJlZS51cGRhdGVDdXJyZW50VmVsb2NpdHkodGltZXN0ZXAsIGN1cnJlbnRTdHlsZSwgY3VycmVudFZlbG9jaXRpZXNbaV0sIHN0eWxlc1tpXSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVE9ETzogaXMgdGhpcyByaWdodD9cbiAgICAgIGlmIChjdXJyZW50VmVsb2NpdGllcy5ldmVyeShmdW5jdGlvbiAodiwgaykge1xuICAgICAgICByZXR1cm4gX25vVmVsb2NpdHkyWydkZWZhdWx0J10odiwgY3VycmVudFN0eWxlc1trXSk7XG4gICAgICB9KSAmJiBuZXdDdXJyZW50VmVsb2NpdGllcy5ldmVyeShmdW5jdGlvbiAodiwgaykge1xuICAgICAgICByZXR1cm4gX25vVmVsb2NpdHkyWydkZWZhdWx0J10odiwgbmV3Q3VycmVudFN0eWxlc1trXSk7XG4gICAgICB9KSkge1xuICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudFN0eWxlczogbmV3Q3VycmVudFN0eWxlcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXRpZXM6IG5ld0N1cnJlbnRWZWxvY2l0aWVzXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBzdG9wQW5pbWF0aW9uOiBudWxsLFxuXG4gICAgLy8gdXNlZCBpbiBhbmltYXRpb25SZW5kZXJcbiAgICBoYXNVbm1vdW50ZWQ6IGZhbHNlLFxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XG4gICAgICB0aGlzLmhhc1VubW91bnRlZCA9IHRydWU7XG4gICAgfSxcblxuICAgIHN0YXJ0QW5pbWF0aW5nOiBmdW5jdGlvbiBzdGFydEFuaW1hdGluZygpIHtcbiAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbiA9IHN0YXJ0QW5pbWF0aW9uKHRoaXMuc3RhdGUsIHRoaXMuYW5pbWF0aW9uU3RlcCwgdGhpcy5hbmltYXRpb25SZW5kZXIpO1xuICAgIH0sXG5cbiAgICBhbmltYXRpb25SZW5kZXI6IGZ1bmN0aW9uIGFuaW1hdGlvblJlbmRlcihhbHBoYSwgbmV4dFN0YXRlLCBwcmV2U3RhdGUpIHtcbiAgICAgIC8vIFNlZSBjb21tZW50IGluIE1vdGlvbi5cbiAgICAgIGlmICghdGhpcy5oYXNVbm1vdW50ZWQpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTdHlsZXMgPSBuZXh0U3RhdGUuY3VycmVudFN0eWxlcy5tYXAoZnVuY3Rpb24gKHN0eWxlLCBpKSB7XG4gICAgICAgICAgcmV0dXJuIF91cGRhdGVUcmVlLmludGVycG9sYXRlVmFsdWUoYWxwaGEsIHN0eWxlLCBwcmV2U3RhdGUuY3VycmVudFN0eWxlc1tpXSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjdXJyZW50U3R5bGVzOiBjdXJyZW50U3R5bGVzLFxuICAgICAgICAgIGN1cnJlbnRWZWxvY2l0aWVzOiBuZXh0U3RhdGUuY3VycmVudFZlbG9jaXRpZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHN0cmlwcGVkU3R5bGUgPSB0aGlzLnN0YXRlLmN1cnJlbnRTdHlsZXMubWFwKF9zdHJpcFN0eWxlMlsnZGVmYXVsdCddKTtcbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbihzdHJpcHBlZFN0eWxlKTtcbiAgICAgIHJldHVybiByZW5kZXJlZENoaWxkcmVuICYmIFJlYWN0LkNoaWxkcmVuLm9ubHkocmVuZGVyZWRDaGlsZHJlbik7XG4gICAgfVxuICB9KTtcblxuICB2YXIgVHJhbnNpdGlvbk1vdGlvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICBkaXNwbGF5TmFtZTogJ1RyYW5zaXRpb25Nb3Rpb24nLFxuXG4gICAgcHJvcFR5cGVzOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZShwcm9wLCBwcm9wTmFtZSkge1xuICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdUcmFuc2l0aW9uU3ByaW5nXFwncyBgZGVmYXVsdFZhbHVlYCBoYXMgYmVlbiBjaGFuZ2VkIHRvICcgKyAnYGRlZmF1bHRTdHlsZXNgLiBJdHMgZm9ybWF0IHJlY2VpdmVkIGEgZmV3IChlYXN5IHRvIHVwZGF0ZSEpICcgKyAnY2hhbmdlcyBhcyB3ZWxsLicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZW5kVmFsdWU6IGZ1bmN0aW9uIGVuZFZhbHVlKHByb3AsIHByb3BOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1RyYW5zaXRpb25TcHJpbmdcXCdzIGBlbmRWYWx1ZWAgaGFzIGJlZW4gY2hhbmdlZCB0byBgc3R5bGVzYC4gJyArICdJdHMgZm9ybWF0IHJlY2VpdmVkIGEgZmV3IChlYXN5IHRvIHVwZGF0ZSEpIGNoYW5nZXMgYXMgd2VsbC4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRTdHlsZTogZnVuY3Rpb24gZGVmYXVsdFN0eWxlKHByb3AsIHByb3BOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBmb3Jnb3QgdGhlIFwic1wiIGZvciBgVHJhbnNpdGlvbk1vdGlvbmBcXCdzIGBkZWZhdWx0U3R5bGVzYC4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShwcm9wLCBwcm9wTmFtZSkge1xuICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdZb3UgZm9yZ290IHRoZSBcInNcIiBmb3IgYFRyYW5zaXRpb25Nb3Rpb25gXFwncyBgc3R5bGVzYC4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIFRPT0Q6IHdhcm4gYWdhaW5zdCBwdXR0aW5nIGNvbmZpZ3MgaW4gaGVyZVxuICAgICAgZGVmYXVsdFN0eWxlczogUHJvcFR5cGVzLm9iamVjdE9mKFByb3BUeXBlcy5hbnkpLFxuICAgICAgc3R5bGVzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLm9iamVjdE9mKFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCldKS5pc1JlcXVpcmVkLFxuICAgICAgd2lsbExlYXZlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuY10pLFxuICAgICAgLy8gVE9PRDogd2FybiBhZ2FpbnN0IHB1dHRpbmcgY29uZmlncyBpbiBoZXJlXG4gICAgICB3aWxsRW50ZXI6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jXSksXG4gICAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICAgIH0sXG5cbiAgICBnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uIGdldERlZmF1bHRQcm9wcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpbGxFbnRlcjogZnVuY3Rpb24gd2lsbEVudGVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHdpbGxMZWF2ZTogZnVuY3Rpb24gd2lsbExlYXZlKCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgIHZhciBfcHJvcHMzID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBzdHlsZXMgPSBfcHJvcHMzLnN0eWxlcztcbiAgICAgIHZhciBkZWZhdWx0U3R5bGVzID0gX3Byb3BzMy5kZWZhdWx0U3R5bGVzO1xuXG4gICAgICB2YXIgY3VycmVudFN0eWxlcyA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChkZWZhdWx0U3R5bGVzID09IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHlsZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjdXJyZW50U3R5bGVzID0gc3R5bGVzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudFN0eWxlcyA9IHN0eWxlcztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudFN0eWxlcyA9IGRlZmF1bHRTdHlsZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW50U3R5bGVzOiBjdXJyZW50U3R5bGVzLFxuICAgICAgICBjdXJyZW50VmVsb2NpdGllczogbWFwT2JqZWN0KGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcE9iamVjdChfemVybzJbJ2RlZmF1bHQnXSwgcyk7XG4gICAgICAgIH0sIGN1cnJlbnRTdHlsZXMpXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG4gICAgfSxcblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKSB7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG4gICAgfSxcblxuICAgIGFuaW1hdGlvblN0ZXA6IGZ1bmN0aW9uIGFuaW1hdGlvblN0ZXAodGltZXN0ZXAsIHN0YXRlKSB7XG4gICAgICB2YXIgY3VycmVudFN0eWxlcyA9IHN0YXRlLmN1cnJlbnRTdHlsZXM7XG4gICAgICB2YXIgY3VycmVudFZlbG9jaXRpZXMgPSBzdGF0ZS5jdXJyZW50VmVsb2NpdGllcztcbiAgICAgIHZhciBfcHJvcHM0ID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBzdHlsZXMgPSBfcHJvcHM0LnN0eWxlcztcbiAgICAgIHZhciB3aWxsRW50ZXIgPSBfcHJvcHM0LndpbGxFbnRlcjtcbiAgICAgIHZhciB3aWxsTGVhdmUgPSBfcHJvcHM0LndpbGxMZWF2ZTtcblxuICAgICAgaWYgKHR5cGVvZiBzdHlsZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgc3R5bGVzID0gc3R5bGVzKGN1cnJlbnRTdHlsZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBodWg/XG4gICAgICB2YXIgbWVyZ2VkU3R5bGVzID0gc3R5bGVzOyAvLyBzZXQgbWVyZ2VkU3R5bGVzIHRvIHN0eWxlcyBhcyB0aGUgZGVmYXVsdFxuICAgICAgdmFyIGhhc05ld0tleSA9IGZhbHNlO1xuXG4gICAgICBtZXJnZWRTdHlsZXMgPSBfbWVyZ2VEaWZmMlsnZGVmYXVsdCddKGN1cnJlbnRTdHlsZXMsIHN0eWxlcyxcbiAgICAgIC8vIFRPRE86IHN0b3AgYWxsb2NhdGluZyBsaWtlIGNyYXp5IGluIHRoaXMgd2hvbGUgY29kZSBwYXRoXG4gICAgICBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciByZXMgPSB3aWxsTGVhdmUoa2V5LCBjdXJyZW50U3R5bGVzW2tleV0sIHN0eWxlcywgY3VycmVudFN0eWxlcywgY3VycmVudFZlbG9jaXRpZXMpO1xuICAgICAgICBpZiAocmVzID09IG51bGwpIHtcbiAgICAgICAgICAvLyBGb3IgbGVnYWN5IHJlYXNvbi4gV2Ugd29uJ3QgYWxsb3cgcmV0dXJuaW5nIG51bGwgc29vblxuICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSwgYWZ0ZXIgbmV4dCByZWxlYXNlXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX25vVmVsb2NpdHkyWydkZWZhdWx0J10oY3VycmVudFZlbG9jaXRpZXNba2V5XSwgY3VycmVudFN0eWxlc1trZXldKSAmJiBfaGFzUmVhY2hlZFN0eWxlMlsnZGVmYXVsdCddKGN1cnJlbnRTdHlsZXNba2V5XSwgcmVzKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KTtcblxuICAgICAgT2JqZWN0LmtleXMobWVyZ2VkU3R5bGVzKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gIWN1cnJlbnRTdHlsZXMuaGFzT3duUHJvcGVydHkoa2V5KTtcbiAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgX2V4dGVuZHMyLCBfZXh0ZW5kczM7XG5cbiAgICAgICAgaGFzTmV3S2V5ID0gdHJ1ZTtcbiAgICAgICAgdmFyIGVudGVyU3R5bGUgPSB3aWxsRW50ZXIoa2V5LCBtZXJnZWRTdHlsZXNba2V5XSwgc3R5bGVzLCBjdXJyZW50U3R5bGVzLCBjdXJyZW50VmVsb2NpdGllcyk7XG5cbiAgICAgICAgLy8gV2UgY2FuIG11dGF0ZSB0aGlzIGhlcmUgYmVjYXVzZSBtZXJnZURpZmYgcmV0dXJucyBhIG5ldyBPYmpcbiAgICAgICAgbWVyZ2VkU3R5bGVzW2tleV0gPSBlbnRlclN0eWxlO1xuXG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSBfZXh0ZW5kcyh7fSwgY3VycmVudFN0eWxlcywgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJba2V5XSA9IGVudGVyU3R5bGUsIF9leHRlbmRzMikpO1xuICAgICAgICBjdXJyZW50VmVsb2NpdGllcyA9IF9leHRlbmRzKHt9LCBjdXJyZW50VmVsb2NpdGllcywgKF9leHRlbmRzMyA9IHt9LCBfZXh0ZW5kczNba2V5XSA9IG1hcE9iamVjdChfemVybzJbJ2RlZmF1bHQnXSwgZW50ZXJTdHlsZSksIF9leHRlbmRzMykpO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBuZXdDdXJyZW50U3R5bGVzID0gbWFwT2JqZWN0KGZ1bmN0aW9uIChtZXJnZWRTdHlsZSwga2V5KSB7XG4gICAgICAgIHJldHVybiBfdXBkYXRlVHJlZS51cGRhdGVDdXJyZW50U3R5bGUodGltZXN0ZXAsIGN1cnJlbnRTdHlsZXNba2V5XSwgY3VycmVudFZlbG9jaXRpZXNba2V5XSwgbWVyZ2VkU3R5bGUpO1xuICAgICAgfSwgbWVyZ2VkU3R5bGVzKTtcbiAgICAgIHZhciBuZXdDdXJyZW50VmVsb2NpdGllcyA9IG1hcE9iamVjdChmdW5jdGlvbiAobWVyZ2VkU3R5bGUsIGtleSkge1xuICAgICAgICByZXR1cm4gX3VwZGF0ZVRyZWUudXBkYXRlQ3VycmVudFZlbG9jaXR5KHRpbWVzdGVwLCBjdXJyZW50U3R5bGVzW2tleV0sIGN1cnJlbnRWZWxvY2l0aWVzW2tleV0sIG1lcmdlZFN0eWxlKTtcbiAgICAgIH0sIG1lcmdlZFN0eWxlcyk7XG5cbiAgICAgIGlmICghaGFzTmV3S2V5ICYmIGV2ZXJ5T2JqKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIHJldHVybiBfbm9WZWxvY2l0eTJbJ2RlZmF1bHQnXSh2LCBjdXJyZW50U3R5bGVzW2tdKTtcbiAgICAgIH0sIGN1cnJlbnRWZWxvY2l0aWVzKSAmJiBldmVyeU9iaihmdW5jdGlvbiAodiwgaykge1xuICAgICAgICByZXR1cm4gX25vVmVsb2NpdHkyWydkZWZhdWx0J10odiwgbmV3Q3VycmVudFN0eWxlc1trXSk7XG4gICAgICB9LCBuZXdDdXJyZW50VmVsb2NpdGllcykpIHtcbiAgICAgICAgLy8gY2hlY2sgZXhwbGFuYXRpb24gaW4gYE1vdGlvbi5hbmltYXRpb25SZW5kZXJgXG4gICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpOyAvLyBOYXN0eSBzaWRlIGVmZmVjdHMuLi4uXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRTdHlsZXM6IG5ld0N1cnJlbnRTdHlsZXMsXG4gICAgICAgIGN1cnJlbnRWZWxvY2l0aWVzOiBuZXdDdXJyZW50VmVsb2NpdGllc1xuICAgICAgfTtcbiAgICB9LFxuXG4gICAgc3RvcEFuaW1hdGlvbjogbnVsbCxcblxuICAgIC8vIHVzZWQgaW4gYW5pbWF0aW9uUmVuZGVyXG4gICAgaGFzVW5tb3VudGVkOiBmYWxzZSxcblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xuICAgICAgdGhpcy5oYXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBzdGFydEFuaW1hdGluZzogZnVuY3Rpb24gc3RhcnRBbmltYXRpbmcoKSB7XG4gICAgICB0aGlzLnN0b3BBbmltYXRpb24gPSBzdGFydEFuaW1hdGlvbih0aGlzLnN0YXRlLCB0aGlzLmFuaW1hdGlvblN0ZXAsIHRoaXMuYW5pbWF0aW9uUmVuZGVyKTtcbiAgICB9LFxuXG4gICAgYW5pbWF0aW9uUmVuZGVyOiBmdW5jdGlvbiBhbmltYXRpb25SZW5kZXIoYWxwaGEsIG5leHRTdGF0ZSwgcHJldlN0YXRlKSB7XG4gICAgICAvLyBTZWUgY29tbWVudCBpbiBNb3Rpb24uXG4gICAgICBpZiAoIXRoaXMuaGFzVW5tb3VudGVkKSB7XG4gICAgICAgIHZhciBjdXJyZW50U3R5bGVzID0gbWFwT2JqZWN0KGZ1bmN0aW9uIChzdHlsZSwga2V5KSB7XG4gICAgICAgICAgcmV0dXJuIF91cGRhdGVUcmVlLmludGVycG9sYXRlVmFsdWUoYWxwaGEsIHN0eWxlLCBwcmV2U3RhdGUuY3VycmVudFN0eWxlc1trZXldKTtcbiAgICAgICAgfSwgbmV4dFN0YXRlLmN1cnJlbnRTdHlsZXMpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjdXJyZW50U3R5bGVzOiBjdXJyZW50U3R5bGVzLFxuICAgICAgICAgIGN1cnJlbnRWZWxvY2l0aWVzOiBuZXh0U3RhdGUuY3VycmVudFZlbG9jaXRpZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHN0cmlwcGVkU3R5bGUgPSBtYXBPYmplY3QoX3N0cmlwU3R5bGUyWydkZWZhdWx0J10sIHRoaXMuc3RhdGUuY3VycmVudFN0eWxlcyk7XG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW4oc3RyaXBwZWRTdHlsZSk7XG4gICAgICByZXR1cm4gcmVuZGVyZWRDaGlsZHJlbiAmJiBSZWFjdC5DaGlsZHJlbi5vbmx5KHJlbmRlcmVkQ2hpbGRyZW4pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIF9kZXByZWNhdGVkU3ByaW5ncyA9IF9kZXByZWNhdGVkU3ByaW5nczNbJ2RlZmF1bHQnXShSZWFjdCk7XG5cbiAgdmFyIFNwcmluZyA9IF9kZXByZWNhdGVkU3ByaW5ncy5TcHJpbmc7XG4gIHZhciBUcmFuc2l0aW9uU3ByaW5nID0gX2RlcHJlY2F0ZWRTcHJpbmdzLlRyYW5zaXRpb25TcHJpbmc7XG5cbiAgcmV0dXJuIHsgU3ByaW5nOiBTcHJpbmcsIFRyYW5zaXRpb25TcHJpbmc6IFRyYW5zaXRpb25TcHJpbmcsIE1vdGlvbjogTW90aW9uLCBTdGFnZ2VyZWRNb3Rpb246IFN0YWdnZXJlZE1vdGlvbiwgVHJhbnNpdGlvbk1vdGlvbjogVHJhbnNpdGlvbk1vdGlvbiB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL2NvbXBvbmVudHMuanNcbiAqKiBtb2R1bGUgaWQgPSAxOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0gZGVwcmVjYXRlZFNwcmluZ3M7XG52YXIgaGFzV2FybmVkRm9yU3ByaW5nID0ge307XG52YXIgaGFzV2FybmVkRm9yVHJhbnNpdGlvblNwcmluZyA9IHt9O1xuXG5mdW5jdGlvbiBkZXByZWNhdGVkU3ByaW5ncyhSZWFjdCkge1xuICB2YXIgU3ByaW5nID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgIGRpc3BsYXlOYW1lOiAnU3ByaW5nJyxcblxuICAgIGNvbXBvbmVudFdpbGxNb3VudDogZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIHZhciBvd25lck5hbWUgPSB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lciAmJiB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lci5nZXROYW1lKCk7XG4gICAgICAgIGlmICghaGFzV2FybmVkRm9yU3ByaW5nW293bmVyTmFtZV0pIHtcbiAgICAgICAgICBoYXNXYXJuZWRGb3JTcHJpbmdbb3duZXJOYW1lXSA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignU3ByaW5nICh1c2VkIGluICVzcmVuZGVyKSBoYXMgbm93IGJlZW4gcmVuYW1lZCB0byBNb3Rpb24uICcgKyAnUGxlYXNlIHNlZSB0aGUgcmVsZWFzZSBub3RlIGZvciB0aGUgdXBncmFkZSBwYXRoLiBUaGFuayB5b3UhJywgb3duZXJOYW1lID8gb3duZXJOYW1lICsgJ1xcJ3MgJyA6ICdSZWFjdC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIFRyYW5zaXRpb25TcHJpbmcgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAgZGlzcGxheU5hbWU6ICdUcmFuc2l0aW9uU3ByaW5nJyxcblxuICAgIGNvbXBvbmVudFdpbGxNb3VudDogZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIHZhciBvd25lck5hbWUgPSB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lciAmJiB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lci5nZXROYW1lKCk7XG4gICAgICAgIGlmICghaGFzV2FybmVkRm9yVHJhbnNpdGlvblNwcmluZ1tvd25lck5hbWVdKSB7XG4gICAgICAgICAgaGFzV2FybmVkRm9yVHJhbnNpdGlvblNwcmluZ1tvd25lck5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdUcmFuc2l0aW9uU3ByaW5nICh1c2VkIGluICVzcmVuZGVyKSBoYXMgbm93IGJlZW4gcmVuYW1lZCB0byAnICsgJ1RyYW5zaXRpb25Nb3Rpb24uIFBsZWFzZSBzZWUgdGhlIHJlbGVhc2Ugbm90ZSBmb3IgdGhlIHVwZ3JhZGUgJyArICdwYXRoLiBUaGFuayB5b3UhJywgb3duZXJOYW1lID8gb3duZXJOYW1lICsgJ1xcJ3MgJyA6ICdSZWFjdC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHsgU3ByaW5nOiBTcHJpbmcsIFRyYW5zaXRpb25TcHJpbmc6IFRyYW5zaXRpb25TcHJpbmcgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3QtbW90aW9uL2xpYi9kZXByZWNhdGVkU3ByaW5ncy5qc1xuICoqIG1vZHVsZSBpZCA9IDE5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaGFzUmVhY2hlZFN0eWxlO1xuXG5mdW5jdGlvbiBoYXNSZWFjaGVkU3R5bGUoY3VycmVudFN0eWxlLCBzdHlsZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcbiAgICBpZiAoIXN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgY3VycmVudFZhbHVlID0gY3VycmVudFN0eWxlW2tleV07XG4gICAgdmFyIGRlc3RWYWx1ZSA9IHN0eWxlW2tleV07XG4gICAgaWYgKCFkZXN0VmFsdWUuY29uZmlnKSB7XG4gICAgICAvLyBub3QgYSBzcHJpbmcgY29uZmlnXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS5jb25maWcgJiYgY3VycmVudFZhbHVlLnZhbCAhPT0gZGVzdFZhbHVlLnZhbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRWYWx1ZS5jb25maWcgJiYgY3VycmVudFZhbHVlICE9PSBkZXN0VmFsdWUudmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3QtbW90aW9uL2xpYi9oYXNSZWFjaGVkU3R5bGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gdGhpcyBmdW5jdGlvbiBpcyBhbGxvY2F0aW9uLWxlc3MgdGhhbmtzIHRvIGJhYmVsLCB3aGljaCB0cmFuc2Zvcm1zIHRoZSB0YWlsXG4vLyBjYWxscyBpbnRvIGxvb3BzXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbWVyZ2VEaWZmO1xuZnVuY3Rpb24gbWVyZ2VEaWZmQXJyKF94LCBfeDIsIF94MywgX3g0LCBfeDUsIF94NiwgX3g3KSB7XG4gIHZhciBfYWdhaW4gPSB0cnVlO1xuXG4gIF9mdW5jdGlvbjogd2hpbGUgKF9hZ2Fpbikge1xuICAgIHZhciBhcnJBID0gX3gsXG4gICAgICAgIGFyckIgPSBfeDIsXG4gICAgICAgIGNvbGxCID0gX3gzLFxuICAgICAgICBpbmRleEEgPSBfeDQsXG4gICAgICAgIGluZGV4QiA9IF94NSxcbiAgICAgICAgb25SZW1vdmUgPSBfeDYsXG4gICAgICAgIGFjY3VtID0gX3g3O1xuICAgIGVuZEEgPSBlbmRCID0ga2V5QSA9IGtleUIgPSBmaWxsID0gZmlsbCA9IHVuZGVmaW5lZDtcbiAgICBfYWdhaW4gPSBmYWxzZTtcblxuICAgIHZhciBlbmRBID0gaW5kZXhBID09PSBhcnJBLmxlbmd0aDtcbiAgICB2YXIgZW5kQiA9IGluZGV4QiA9PT0gYXJyQi5sZW5ndGg7XG4gICAgdmFyIGtleUEgPSBhcnJBW2luZGV4QV07XG4gICAgdmFyIGtleUIgPSBhcnJCW2luZGV4Ql07XG4gICAgaWYgKGVuZEEgJiYgZW5kQikge1xuICAgICAgLy8gcmV0dXJuaW5nIG51bGwgaGVyZSwgb3RoZXJ3aXNlIGxpbnQgY29tcGxhaW5zIHRoYXQgd2UncmUgbm90IGV4cGVjdGluZ1xuICAgICAgLy8gYSByZXR1cm4gdmFsdWUgaW4gc3Vic2VxdWVudCBjYWxscy4gV2Uga25vdyB3aGF0IHdlJ3JlIGRvaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVuZEEpIHtcbiAgICAgIGFjY3VtW2tleUJdID0gY29sbEJba2V5Ql07XG4gICAgICBfeCA9IGFyckE7XG4gICAgICBfeDIgPSBhcnJCO1xuICAgICAgX3gzID0gY29sbEI7XG4gICAgICBfeDQgPSBpbmRleEE7XG4gICAgICBfeDUgPSBpbmRleEIgKyAxO1xuICAgICAgX3g2ID0gb25SZW1vdmU7XG4gICAgICBfeDcgPSBhY2N1bTtcbiAgICAgIF9hZ2FpbiA9IHRydWU7XG4gICAgICBjb250aW51ZSBfZnVuY3Rpb247XG4gICAgfVxuXG4gICAgaWYgKGVuZEIpIHtcbiAgICAgIHZhciBmaWxsID0gb25SZW1vdmUoa2V5QSk7XG4gICAgICBpZiAoZmlsbCAhPSBudWxsKSB7XG4gICAgICAgIGFjY3VtW2tleUFdID0gZmlsbDtcbiAgICAgIH1cbiAgICAgIF94ID0gYXJyQTtcbiAgICAgIF94MiA9IGFyckI7XG4gICAgICBfeDMgPSBjb2xsQjtcbiAgICAgIF94NCA9IGluZGV4QSArIDE7XG4gICAgICBfeDUgPSBpbmRleEI7XG4gICAgICBfeDYgPSBvblJlbW92ZTtcbiAgICAgIF94NyA9IGFjY3VtO1xuICAgICAgX2FnYWluID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlIF9mdW5jdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoa2V5QSA9PT0ga2V5Qikge1xuICAgICAgYWNjdW1ba2V5QV0gPSBjb2xsQltrZXlBXTtcbiAgICAgIF94ID0gYXJyQTtcbiAgICAgIF94MiA9IGFyckI7XG4gICAgICBfeDMgPSBjb2xsQjtcbiAgICAgIF94NCA9IGluZGV4QSArIDE7XG4gICAgICBfeDUgPSBpbmRleEIgKyAxO1xuICAgICAgX3g2ID0gb25SZW1vdmU7XG4gICAgICBfeDcgPSBhY2N1bTtcbiAgICAgIF9hZ2FpbiA9IHRydWU7XG4gICAgICBjb250aW51ZSBfZnVuY3Rpb247XG4gICAgfVxuXG4gICAgaWYgKCFjb2xsQi5oYXNPd25Qcm9wZXJ0eShrZXlBKSkge1xuICAgICAgdmFyIGZpbGwgPSBvblJlbW92ZShrZXlBKTtcbiAgICAgIGlmIChmaWxsICE9IG51bGwpIHtcbiAgICAgICAgYWNjdW1ba2V5QV0gPSBmaWxsO1xuICAgICAgfVxuICAgICAgX3ggPSBhcnJBO1xuICAgICAgX3gyID0gYXJyQjtcbiAgICAgIF94MyA9IGNvbGxCO1xuICAgICAgX3g0ID0gaW5kZXhBICsgMTtcbiAgICAgIF94NSA9IGluZGV4QjtcbiAgICAgIF94NiA9IG9uUmVtb3ZlO1xuICAgICAgX3g3ID0gYWNjdW07XG4gICAgICBfYWdhaW4gPSB0cnVlO1xuICAgICAgY29udGludWUgX2Z1bmN0aW9uO1xuICAgIH1cblxuICAgIF94ID0gYXJyQTtcbiAgICBfeDIgPSBhcnJCO1xuICAgIF94MyA9IGNvbGxCO1xuICAgIF94NCA9IGluZGV4QSArIDE7XG4gICAgX3g1ID0gaW5kZXhCO1xuICAgIF94NiA9IG9uUmVtb3ZlO1xuICAgIF94NyA9IGFjY3VtO1xuICAgIF9hZ2FpbiA9IHRydWU7XG4gICAgY29udGludWUgX2Z1bmN0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlRGlmZihhLCBiLCBvblJlbW92ZSkge1xuICB2YXIgcmV0ID0ge307XG4gIC8vIGlmIGFueW9uZSBjYW4gbWFrZSB0aGlzIHdvcmsgd2l0aG91dCBhbGxvY2F0aW5nIHRoZSBhcnJheXMgaGVyZSwgd2UnbGxcbiAgLy8gZ2l2ZSB5b3UgYSBtZWRhbFxuICBtZXJnZURpZmZBcnIoT2JqZWN0LmtleXMoYSksIE9iamVjdC5rZXlzKGIpLCBiLCAwLCAwLCBvblJlbW92ZSwgcmV0KTtcbiAgcmV0dXJuIHJldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL21lcmdlRGlmZi5qc1xuICoqIG1vZHVsZSBpZCA9IDIxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBjdXJyZW50U3R5bGUga2VlcHMgdGhlIGluZm8gYWJvdXQgd2hldGhlciBhIHByb3AgaXMgY29uZmlndXJlZCBhcyBhIHNwcmluZ1xuLy8gb3IgaWYgaXQncyBqdXN0IGEgcmFuZG9tIHByb3AgdGhhdCBoYXBwZW5zIHRvIGJlIHByZXNlbnQgb24gdGhlIHN0eWxlXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbm9WZWxvY2l0eTtcblxuZnVuY3Rpb24gbm9WZWxvY2l0eShjdXJyZW50VmVsb2NpdHksIGN1cnJlbnRTdHlsZSkge1xuICBmb3IgKHZhciBrZXkgaW4gY3VycmVudFZlbG9jaXR5KSB7XG4gICAgaWYgKCFjdXJyZW50VmVsb2NpdHkuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50U3R5bGVba2V5XS5jb25maWcgJiYgY3VycmVudFZlbG9jaXR5W2tleV0gIT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3QtbW90aW9uL2xpYi9ub1ZlbG9jaXR5LmpzXG4gKiogbW9kdWxlIGlkID0gMjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfY29tcG9uZW50czIgPSByZXF1aXJlKCcuL2NvbXBvbmVudHMnKTtcblxudmFyIF9jb21wb25lbnRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudHMyKTtcblxudmFyIF9yZW9yZGVyS2V5cyA9IHJlcXVpcmUoJy4vcmVvcmRlcktleXMnKTtcblxudmFyIF9yZW9yZGVyS2V5czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZW9yZGVyS2V5cyk7XG5cbnZhciBfY29tcG9uZW50cyA9IF9jb21wb25lbnRzM1snZGVmYXVsdCddKF9yZWFjdDJbJ2RlZmF1bHQnXSk7XG5cbnZhciBTcHJpbmcgPSBfY29tcG9uZW50cy5TcHJpbmc7XG52YXIgVHJhbnNpdGlvblNwcmluZyA9IF9jb21wb25lbnRzLlRyYW5zaXRpb25TcHJpbmc7XG52YXIgTW90aW9uID0gX2NvbXBvbmVudHMuTW90aW9uO1xudmFyIFN0YWdnZXJlZE1vdGlvbiA9IF9jb21wb25lbnRzLlN0YWdnZXJlZE1vdGlvbjtcbnZhciBUcmFuc2l0aW9uTW90aW9uID0gX2NvbXBvbmVudHMuVHJhbnNpdGlvbk1vdGlvbjtcbmV4cG9ydHMuU3ByaW5nID0gU3ByaW5nO1xuZXhwb3J0cy5UcmFuc2l0aW9uU3ByaW5nID0gVHJhbnNpdGlvblNwcmluZztcbmV4cG9ydHMuTW90aW9uID0gTW90aW9uO1xuZXhwb3J0cy5TdGFnZ2VyZWRNb3Rpb24gPSBTdGFnZ2VyZWRNb3Rpb247XG5leHBvcnRzLlRyYW5zaXRpb25Nb3Rpb24gPSBUcmFuc2l0aW9uTW90aW9uO1xuXG52YXIgX3NwcmluZzIgPSByZXF1aXJlKCcuL3NwcmluZycpO1xuXG52YXIgX3NwcmluZzMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zcHJpbmcyKTtcblxuZXhwb3J0cy5zcHJpbmcgPSBfc3ByaW5nM1snZGVmYXVsdCddO1xuXG52YXIgX3ByZXNldHMyID0gcmVxdWlyZSgnLi9wcmVzZXRzJyk7XG5cbnZhciBfcHJlc2V0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcmVzZXRzMik7XG5cbmV4cG9ydHMucHJlc2V0cyA9IF9wcmVzZXRzM1snZGVmYXVsdCddO1xudmFyIHV0aWxzID0ge1xuICByZW9yZGVyS2V5czogX3Jlb3JkZXJLZXlzMlsnZGVmYXVsdCddXG59O1xuZXhwb3J0cy51dGlscyA9IHV0aWxzO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0LW1vdGlvbi9saWIvcmVhY3QtbW90aW9uLmpzXG4gKiogbW9kdWxlIGlkID0gMjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSByZW9yZGVyS2V5cztcblxuZnVuY3Rpb24gcmVvcmRlcktleXMob2JqLCBmKSB7XG4gIHZhciBuZXdLZXlzID0gZihPYmplY3Qua2V5cyhvYmopKTtcbiAgdmFyIHJldCA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gbmV3S2V5c1tpXTtcbiAgICByZXRba2V5XSA9IG9ialtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL3Jlb3JkZXJLZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHNwcmluZztcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3ByZXNldHMgPSByZXF1aXJlKCcuL3ByZXNldHMnKTtcblxudmFyIF9wcmVzZXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ByZXNldHMpO1xuXG4vLyBpbnN0ZWFkIG9mIGV4cG9zaW5nIHt2YWw6IGJsYSwgY29uZmlnOiBibGF9LCB1c2UgYSBoZWxwZXJcblxuZnVuY3Rpb24gc3ByaW5nKHZhbCkge1xuICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gX3ByZXNldHMyWydkZWZhdWx0J10ubm9Xb2JibGUgOiBhcmd1bWVudHNbMV07XG5cbiAgcmV0dXJuIHsgdmFsOiB2YWwsIGNvbmZpZzogY29uZmlnIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0LW1vdGlvbi9saWIvc3ByaW5nLmpzXG4gKiogbW9kdWxlIGlkID0gMjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBzdGVwcGVyO1xudmFyIGVycm9yTWFyZ2luID0gMC4wMDAxO1xuXG5mdW5jdGlvbiBzdGVwcGVyKGZyYW1lUmF0ZSwgeCwgdiwgZGVzdFgsIGssIGIpIHtcbiAgLy8gU3ByaW5nIHN0aWZmbmVzcywgaW4ga2cgLyBzXjJcblxuICAvLyBmb3IgYW5pbWF0aW9ucywgZGVzdFggaXMgcmVhbGx5IHNwcmluZyBsZW5ndGggKHNwcmluZyBhdCByZXN0KS4gaW5pdGlhbFxuICAvLyBwb3NpdGlvbiBpcyBjb25zaWRlcmVkIGFzIHRoZSBzdHJldGNoZWQvY29tcHJlc3NlZCBwb3NpdGlvbiBvZiBhIHNwcmluZ1xuICB2YXIgRnNwcmluZyA9IC1rICogKHggLSBkZXN0WCk7XG5cbiAgLy8gRGFtcGluZywgaW4ga2cgLyBzXG4gIHZhciBGZGFtcGVyID0gLWIgKiB2O1xuXG4gIC8vIHVzdWFsbHkgd2UgcHV0IG1hc3MgaGVyZSwgYnV0IGZvciBhbmltYXRpb24gcHVycG9zZXMsIHNwZWNpZnlpbmcgbWFzcyBpcyBhXG4gIC8vIGJpdCByZWR1bmRhbnQuIHlvdSBjb3VsZCBzaW1wbHkgYWRqdXN0IGsgYW5kIGIgYWNjb3JkaW5nbHlcbiAgLy8gbGV0IGEgPSAoRnNwcmluZyArIEZkYW1wZXIpIC8gbWFzcztcbiAgdmFyIGEgPSBGc3ByaW5nICsgRmRhbXBlcjtcblxuICB2YXIgbmV3ViA9IHYgKyBhICogZnJhbWVSYXRlO1xuICB2YXIgbmV3WCA9IHggKyBuZXdWICogZnJhbWVSYXRlO1xuXG4gIGlmIChNYXRoLmFicyhuZXdWIC0gdikgPCBlcnJvck1hcmdpbiAmJiBNYXRoLmFicyhuZXdYIC0geCkgPCBlcnJvck1hcmdpbikge1xuICAgIHJldHVybiBbZGVzdFgsIDBdO1xuICB9XG5cbiAgcmV0dXJuIFtuZXdYLCBuZXdWXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL3N0ZXBwZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gdHVybiB7eDoge3ZhbDogMSwgY29uZmlnOiBbMSwgMl19LCB5OiAyfSBpbnRvIHt4OiAxLCB5OiAyfVxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHN0cmlwU3R5bGU7XG5cbmZ1bmN0aW9uIHN0cmlwU3R5bGUoc3R5bGUpIHtcbiAgdmFyIHJldCA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcbiAgICBpZiAoIXN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXRba2V5XSA9IHN0eWxlW2tleV0udmFsID09IG51bGwgPyBzdHlsZVtrZXldIDogc3R5bGVba2V5XS52YWw7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL3N0cmlwU3R5bGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5pbnRlcnBvbGF0ZVZhbHVlID0gaW50ZXJwb2xhdGVWYWx1ZTtcbmV4cG9ydHMudXBkYXRlQ3VycmVudFN0eWxlID0gdXBkYXRlQ3VycmVudFN0eWxlO1xuZXhwb3J0cy51cGRhdGVDdXJyZW50VmVsb2NpdHkgPSB1cGRhdGVDdXJyZW50VmVsb2NpdHk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9zdGVwcGVyID0gcmVxdWlyZSgnLi9zdGVwcGVyJyk7XG5cbnZhciBfc3RlcHBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdGVwcGVyKTtcblxuLy8gVE9ETzogcmVmYWN0b3IgY29tbW9uIGxvZ2ljIHdpdGggdXBkYXRlQ3VyclZhbHVlIGFuZCB1cGRhdGVDdXJyVmVsb2NpdHlcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVWYWx1ZShhbHBoYSwgbmV4dFN0eWxlLCBwcmV2U3R5bGUpIHtcbiAgLy8gbWlnaHQgYmUgdXNlZCBieSBhIFRyYW5zaXRpb25Nb3Rpb24sIHdoZXJlIHByZXZTdHlsZSBtaWdodCBub3QgZXhpc3QgYW55bW9yZVxuICBpZiAoIXByZXZTdHlsZSkge1xuICAgIHJldHVybiBuZXh0U3R5bGU7XG4gIH1cblxuICB2YXIgcmV0ID0ge307XG4gIGZvciAodmFyIGtleSBpbiBuZXh0U3R5bGUpIHtcbiAgICBpZiAoIW5leHRTdHlsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIW5leHRTdHlsZVtrZXldLmNvbmZpZykge1xuICAgICAgcmV0W2tleV0gPSBuZXh0U3R5bGVba2V5XTtcbiAgICAgIC8vIG5vdCBhIHNwcmluZyBjb25maWcsIG5vdCBzb21ldGhpbmcgd2Ugd2FudCB0byBpbnRlcnBvbGF0ZVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBwcmV2VmFsdWUgPSBwcmV2U3R5bGVba2V5XS5jb25maWcgPyBwcmV2U3R5bGVba2V5XS52YWwgOiBwcmV2U3R5bGVba2V5XTtcbiAgICByZXRba2V5XSA9IHtcbiAgICAgIHZhbDogbmV4dFN0eWxlW2tleV0udmFsICogYWxwaGEgKyBwcmV2VmFsdWUgKiAoMSAtIGFscGhhKSxcbiAgICAgIGNvbmZpZzogbmV4dFN0eWxlW2tleV0uY29uZmlnXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbi8vIFRPRE86IHJlZmFjdG9yIGNvbW1vbiBsb2dpYyB3aXRoIHVwZGF0ZUN1cnJlbnRWZWxvY2l0eVxuXG5mdW5jdGlvbiB1cGRhdGVDdXJyZW50U3R5bGUoZnJhbWVSYXRlLCBjdXJyZW50U3R5bGUsIGN1cnJlbnRWZWxvY2l0eSwgc3R5bGUpIHtcbiAgdmFyIHJldCA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcbiAgICBpZiAoIXN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIXN0eWxlW2tleV0uY29uZmlnKSB7XG4gICAgICByZXRba2V5XSA9IHN0eWxlW2tleV07XG4gICAgICAvLyBub3QgYSBzcHJpbmcgY29uZmlnLCBub3Qgc29tZXRoaW5nIHdlIHdhbnQgdG8gaW50ZXJwb2xhdGVcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgX3N0eWxlJGtleSRjb25maWcgPSBzdHlsZVtrZXldLmNvbmZpZztcbiAgICB2YXIgayA9IF9zdHlsZSRrZXkkY29uZmlnWzBdO1xuICAgIHZhciBiID0gX3N0eWxlJGtleSRjb25maWdbMV07XG5cbiAgICB2YXIgdmFsID0gX3N0ZXBwZXIyWydkZWZhdWx0J10oZnJhbWVSYXRlLFxuICAgIC8vIG1pZ2h0IGhhdmUgYmVlbiBhIG5vbi1zcHJpbmdlZCBwcm9wIHRoYXQganVzdCBiZWNhbWUgb25lXG4gICAgY3VycmVudFN0eWxlW2tleV0udmFsID09IG51bGwgPyBjdXJyZW50U3R5bGVba2V5XSA6IGN1cnJlbnRTdHlsZVtrZXldLnZhbCwgY3VycmVudFZlbG9jaXR5W2tleV0sIHN0eWxlW2tleV0udmFsLCBrLCBiKVswXTtcbiAgICByZXRba2V5XSA9IHtcbiAgICAgIHZhbDogdmFsLFxuICAgICAgY29uZmlnOiBzdHlsZVtrZXldLmNvbmZpZ1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ3VycmVudFZlbG9jaXR5KGZyYW1lUmF0ZSwgY3VycmVudFN0eWxlLCBjdXJyZW50VmVsb2NpdHksIHN0eWxlKSB7XG4gIHZhciByZXQgPSB7fTtcbiAgZm9yICh2YXIga2V5IGluIHN0eWxlKSB7XG4gICAgaWYgKCFzdHlsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFzdHlsZVtrZXldLmNvbmZpZykge1xuICAgICAgLy8gbm90IGEgc3ByaW5nIGNvbmZpZywgbm90IHNvbWV0aGluZyB3ZSB3YW50IHRvIGludGVycG9sYXRlXG4gICAgICByZXRba2V5XSA9IDA7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIF9zdHlsZSRrZXkkY29uZmlnMiA9IHN0eWxlW2tleV0uY29uZmlnO1xuICAgIHZhciBrID0gX3N0eWxlJGtleSRjb25maWcyWzBdO1xuICAgIHZhciBiID0gX3N0eWxlJGtleSRjb25maWcyWzFdO1xuXG4gICAgdmFyIHZhbCA9IF9zdGVwcGVyMlsnZGVmYXVsdCddKGZyYW1lUmF0ZSxcbiAgICAvLyBtaWdodCBoYXZlIGJlZW4gYSBub24tc3ByaW5nZWQgcHJvcCB0aGF0IGp1c3QgYmVjYW1lIG9uZVxuICAgIGN1cnJlbnRTdHlsZVtrZXldLnZhbCA9PSBudWxsID8gY3VycmVudFN0eWxlW2tleV0gOiBjdXJyZW50U3R5bGVba2V5XS52YWwsIGN1cnJlbnRWZWxvY2l0eVtrZXldLCBzdHlsZVtrZXldLnZhbCwgaywgYilbMV07XG4gICAgcmV0W2tleV0gPSB2YWw7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL3VwZGF0ZVRyZWUuanNcbiAqKiBtb2R1bGUgaWQgPSAyOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gdXNlZCBieSB0aGUgdHJlZS13YWxraW5nIHVwZGF0ZXMgYW5kIHNwcmluZ3MuIEF2b2lkcyBzb21lIGFsbG9jYXRpb25zXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gemVybztcblxuZnVuY3Rpb24gemVybygpIHtcbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3QtbW90aW9uL2xpYi96ZXJvLmpzXG4gKiogbW9kdWxlIGlkID0gMjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBub3cgPSByZXF1aXJlKCdwZXJmb3JtYW5jZS1ub3cnKVxuICAsIGdsb2JhbCA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8ge30gOiB3aW5kb3dcbiAgLCB2ZW5kb3JzID0gWydtb3onLCAnd2Via2l0J11cbiAgLCBzdWZmaXggPSAnQW5pbWF0aW9uRnJhbWUnXG4gICwgcmFmID0gZ2xvYmFsWydyZXF1ZXN0JyArIHN1ZmZpeF1cbiAgLCBjYWYgPSBnbG9iYWxbJ2NhbmNlbCcgKyBzdWZmaXhdIHx8IGdsb2JhbFsnY2FuY2VsUmVxdWVzdCcgKyBzdWZmaXhdXG5cbmZvcih2YXIgaSA9IDA7IGkgPCB2ZW5kb3JzLmxlbmd0aCAmJiAhcmFmOyBpKyspIHtcbiAgcmFmID0gZ2xvYmFsW3ZlbmRvcnNbaV0gKyAnUmVxdWVzdCcgKyBzdWZmaXhdXG4gIGNhZiA9IGdsb2JhbFt2ZW5kb3JzW2ldICsgJ0NhbmNlbCcgKyBzdWZmaXhdXG4gICAgICB8fCBnbG9iYWxbdmVuZG9yc1tpXSArICdDYW5jZWxSZXF1ZXN0JyArIHN1ZmZpeF1cbn1cblxuLy8gU29tZSB2ZXJzaW9ucyBvZiBGRiBoYXZlIHJBRiBidXQgbm90IGNBRlxuaWYoIXJhZiB8fCAhY2FmKSB7XG4gIHZhciBsYXN0ID0gMFxuICAgICwgaWQgPSAwXG4gICAgLCBxdWV1ZSA9IFtdXG4gICAgLCBmcmFtZUR1cmF0aW9uID0gMTAwMCAvIDYwXG5cbiAgcmFmID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZihxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHZhciBfbm93ID0gbm93KClcbiAgICAgICAgLCBuZXh0ID0gTWF0aC5tYXgoMCwgZnJhbWVEdXJhdGlvbiAtIChfbm93IC0gbGFzdCkpXG4gICAgICBsYXN0ID0gbmV4dCArIF9ub3dcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjcCA9IHF1ZXVlLnNsaWNlKDApXG4gICAgICAgIC8vIENsZWFyIHF1ZXVlIGhlcmUgdG8gcHJldmVudFxuICAgICAgICAvLyBjYWxsYmFja3MgZnJvbSBhcHBlbmRpbmcgbGlzdGVuZXJzXG4gICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGZyYW1lJ3MgcXVldWVcbiAgICAgICAgcXVldWUubGVuZ3RoID0gMFxuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZighY3BbaV0uY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgIGNwW2ldLmNhbGxiYWNrKGxhc3QpXG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgdGhyb3cgZSB9LCAwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgTWF0aC5yb3VuZChuZXh0KSlcbiAgICB9XG4gICAgcXVldWUucHVzaCh7XG4gICAgICBoYW5kbGU6ICsraWQsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICBjYW5jZWxsZWQ6IGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm4gaWRcbiAgfVxuXG4gIGNhZiA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYocXVldWVbaV0uaGFuZGxlID09PSBoYW5kbGUpIHtcbiAgICAgICAgcXVldWVbaV0uY2FuY2VsbGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuKSB7XG4gIC8vIFdyYXAgaW4gYSBuZXcgZnVuY3Rpb24gdG8gcHJldmVudFxuICAvLyBgY2FuY2VsYCBwb3RlbnRpYWxseSBiZWluZyBhc3NpZ25lZFxuICAvLyB0byB0aGUgbmF0aXZlIHJBRiBmdW5jdGlvblxuICByZXR1cm4gcmFmLmNhbGwoZ2xvYmFsLCBmbilcbn1cbm1vZHVsZS5leHBvcnRzLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICBjYWYuYXBwbHkoZ2xvYmFsLCBhcmd1bWVudHMpXG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vfi9yYWYvaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAzMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLypcclxuXHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5cdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcclxuKi9cclxudmFyIHN0eWxlc0luRG9tID0ge30sXHJcblx0bWVtb2l6ZSA9IGZ1bmN0aW9uKGZuKSB7XHJcblx0XHR2YXIgbWVtbztcclxuXHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGlmICh0eXBlb2YgbWVtbyA9PT0gXCJ1bmRlZmluZWRcIikgbWVtbyA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblx0XHRcdHJldHVybiBtZW1vO1xyXG5cdFx0fTtcclxuXHR9LFxyXG5cdGlzT2xkSUUgPSBtZW1vaXplKGZ1bmN0aW9uKCkge1xyXG5cdFx0cmV0dXJuIC9tc2llIFs2LTldXFxiLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpO1xyXG5cdH0pLFxyXG5cdGdldEhlYWRFbGVtZW50ID0gbWVtb2l6ZShmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XHJcblx0fSksXHJcblx0c2luZ2xldG9uRWxlbWVudCA9IG51bGwsXHJcblx0c2luZ2xldG9uQ291bnRlciA9IDA7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGxpc3QsIG9wdGlvbnMpIHtcclxuXHRpZih0eXBlb2YgREVCVUcgIT09IFwidW5kZWZpbmVkXCIgJiYgREVCVUcpIHtcclxuXHRcdGlmKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xyXG5cdH1cclxuXHJcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblx0Ly8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XHJcblx0Ly8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxyXG5cdGlmICh0eXBlb2Ygb3B0aW9ucy5zaW5nbGV0b24gPT09IFwidW5kZWZpbmVkXCIpIG9wdGlvbnMuc2luZ2xldG9uID0gaXNPbGRJRSgpO1xyXG5cclxuXHR2YXIgc3R5bGVzID0gbGlzdFRvU3R5bGVzKGxpc3QpO1xyXG5cdGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucyk7XHJcblxyXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xyXG5cdFx0dmFyIG1heVJlbW92ZSA9IFtdO1xyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcclxuXHRcdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XHJcblx0XHRcdGRvbVN0eWxlLnJlZnMtLTtcclxuXHRcdFx0bWF5UmVtb3ZlLnB1c2goZG9tU3R5bGUpO1xyXG5cdFx0fVxyXG5cdFx0aWYobmV3TGlzdCkge1xyXG5cdFx0XHR2YXIgbmV3U3R5bGVzID0gbGlzdFRvU3R5bGVzKG5ld0xpc3QpO1xyXG5cdFx0XHRhZGRTdHlsZXNUb0RvbShuZXdTdHlsZXMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IG1heVJlbW92ZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBtYXlSZW1vdmVbaV07XHJcblx0XHRcdGlmKGRvbVN0eWxlLnJlZnMgPT09IDApIHtcclxuXHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspXHJcblx0XHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXSgpO1xyXG5cdFx0XHRcdGRlbGV0ZSBzdHlsZXNJbkRvbVtkb21TdHlsZS5pZF07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpIHtcclxuXHRmb3IodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcclxuXHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xyXG5cdFx0aWYoZG9tU3R5bGUpIHtcclxuXHRcdFx0ZG9tU3R5bGUucmVmcysrO1xyXG5cdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXShpdGVtLnBhcnRzW2pdKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IoOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdGRvbVN0eWxlLnBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR2YXIgcGFydHMgPSBbXTtcclxuXHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRwYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRzdHlsZXNJbkRvbVtpdGVtLmlkXSA9IHtpZDogaXRlbS5pZCwgcmVmczogMSwgcGFydHM6IHBhcnRzfTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpc3RUb1N0eWxlcyhsaXN0KSB7XHJcblx0dmFyIHN0eWxlcyA9IFtdO1xyXG5cdHZhciBuZXdTdHlsZXMgPSB7fTtcclxuXHRmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIGl0ZW0gPSBsaXN0W2ldO1xyXG5cdFx0dmFyIGlkID0gaXRlbVswXTtcclxuXHRcdHZhciBjc3MgPSBpdGVtWzFdO1xyXG5cdFx0dmFyIG1lZGlhID0gaXRlbVsyXTtcclxuXHRcdHZhciBzb3VyY2VNYXAgPSBpdGVtWzNdO1xyXG5cdFx0dmFyIHBhcnQgPSB7Y3NzOiBjc3MsIG1lZGlhOiBtZWRpYSwgc291cmNlTWFwOiBzb3VyY2VNYXB9O1xyXG5cdFx0aWYoIW5ld1N0eWxlc1tpZF0pXHJcblx0XHRcdHN0eWxlcy5wdXNoKG5ld1N0eWxlc1tpZF0gPSB7aWQ6IGlkLCBwYXJ0czogW3BhcnRdfSk7XHJcblx0XHRlbHNlXHJcblx0XHRcdG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KTtcclxuXHR9XHJcblx0cmV0dXJuIHN0eWxlcztcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KCkge1xyXG5cdHZhciBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcblx0dmFyIGhlYWQgPSBnZXRIZWFkRWxlbWVudCgpO1xyXG5cdHN0eWxlRWxlbWVudC50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xyXG5cdGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTtcclxuXHRyZXR1cm4gc3R5bGVFbGVtZW50O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVMaW5rRWxlbWVudCgpIHtcclxuXHR2YXIgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcclxuXHR2YXIgaGVhZCA9IGdldEhlYWRFbGVtZW50KCk7XHJcblx0bGlua0VsZW1lbnQucmVsID0gXCJzdHlsZXNoZWV0XCI7XHJcblx0aGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XHJcblx0cmV0dXJuIGxpbmtFbGVtZW50O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRTdHlsZShvYmosIG9wdGlvbnMpIHtcclxuXHR2YXIgc3R5bGVFbGVtZW50LCB1cGRhdGUsIHJlbW92ZTtcclxuXHJcblx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XHJcblx0XHR2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcclxuXHRcdHN0eWxlRWxlbWVudCA9IHNpbmdsZXRvbkVsZW1lbnQgfHwgKHNpbmdsZXRvbkVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQoKSk7XHJcblx0XHR1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCBmYWxzZSk7XHJcblx0XHRyZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCB0cnVlKTtcclxuXHR9IGVsc2UgaWYob2JqLnNvdXJjZU1hcCAmJlxyXG5cdFx0dHlwZW9mIFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHR0eXBlb2YgVVJMLmNyZWF0ZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHR0eXBlb2YgVVJMLnJldm9rZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHR0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHR0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcblx0XHRzdHlsZUVsZW1lbnQgPSBjcmVhdGVMaW5rRWxlbWVudCgpO1xyXG5cdFx0dXBkYXRlID0gdXBkYXRlTGluay5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCk7XHJcblx0XHRyZW1vdmUgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0c3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcclxuXHRcdFx0aWYoc3R5bGVFbGVtZW50LmhyZWYpXHJcblx0XHRcdFx0VVJMLnJldm9rZU9iamVjdFVSTChzdHlsZUVsZW1lbnQuaHJlZik7XHJcblx0XHR9O1xyXG5cdH0gZWxzZSB7XHJcblx0XHRzdHlsZUVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQoKTtcclxuXHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQpO1xyXG5cdFx0cmVtb3ZlID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0dXBkYXRlKG9iaik7XHJcblxyXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGVTdHlsZShuZXdPYmopIHtcclxuXHRcdGlmKG5ld09iaikge1xyXG5cdFx0XHRpZihuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXApXHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR1cGRhdGUob2JqID0gbmV3T2JqKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJlbW92ZSgpO1xyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuXHJcbnZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XHJcblx0dmFyIHRleHRTdG9yZSA9IFtdO1xyXG5cclxuXHRyZXR1cm4gZnVuY3Rpb24gKGluZGV4LCByZXBsYWNlbWVudCkge1xyXG5cdFx0dGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xyXG5cdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XHJcblx0fTtcclxufSkoKTtcclxuXHJcbmZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcoc3R5bGVFbGVtZW50LCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcclxuXHR2YXIgY3NzID0gcmVtb3ZlID8gXCJcIiA6IG9iai5jc3M7XHJcblxyXG5cdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xyXG5cdFx0c3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xyXG5cdH0gZWxzZSB7XHJcblx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcyk7XHJcblx0XHR2YXIgY2hpbGROb2RlcyA9IHN0eWxlRWxlbWVudC5jaGlsZE5vZGVzO1xyXG5cdFx0aWYgKGNoaWxkTm9kZXNbaW5kZXhdKSBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xyXG5cdFx0aWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XHJcblx0XHRcdHN0eWxlRWxlbWVudC5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGNzc05vZGUpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlUb1RhZyhzdHlsZUVsZW1lbnQsIG9iaikge1xyXG5cdHZhciBjc3MgPSBvYmouY3NzO1xyXG5cdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcclxuXHR2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcclxuXHJcblx0aWYobWVkaWEpIHtcclxuXHRcdHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBtZWRpYSlcclxuXHR9XHJcblxyXG5cdGlmKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XHJcblx0XHRzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xyXG5cdH0gZWxzZSB7XHJcblx0XHR3aGlsZShzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xyXG5cdFx0XHRzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xyXG5cdFx0fVxyXG5cdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlTGluayhsaW5rRWxlbWVudCwgb2JqKSB7XHJcblx0dmFyIGNzcyA9IG9iai5jc3M7XHJcblx0dmFyIG1lZGlhID0gb2JqLm1lZGlhO1xyXG5cdHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xyXG5cclxuXHRpZihzb3VyY2VNYXApIHtcclxuXHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI2NjAzODc1XHJcblx0XHRjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSArIFwiICovXCI7XHJcblx0fVxyXG5cclxuXHR2YXIgYmxvYiA9IG5ldyBCbG9iKFtjc3NdLCB7IHR5cGU6IFwidGV4dC9jc3NcIiB9KTtcclxuXHJcblx0dmFyIG9sZFNyYyA9IGxpbmtFbGVtZW50LmhyZWY7XHJcblxyXG5cdGxpbmtFbGVtZW50LmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuXHRpZihvbGRTcmMpXHJcblx0XHRVUkwucmV2b2tlT2JqZWN0VVJMKG9sZFNyYyk7XHJcbn1cclxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vc3R5bGUtbG9hZGVyL2FkZFN0eWxlcy5qc1xuICoqIG1vZHVsZSBpZCA9IDMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcyEuLy4uLy4uL25vZGVfbW9kdWxlcy9hdXRvcHJlZml4ZXItbG9hZGVyL2luZGV4LmpzP2Jyb3dzZXJzPWxhc3QgMiB2ZXJzaW9uIS4vLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2luZGV4LmpzIS4vbWFpbi5zY3NzXCIpO1xuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgdXBkYXRlID0gcmVxdWlyZShcIiEuLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIHt9KTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuaWYobW9kdWxlLmhvdCkge1xuXHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcyEuLy4uLy4uL25vZGVfbW9kdWxlcy9hdXRvcHJlZml4ZXItbG9hZGVyL2luZGV4LmpzP2Jyb3dzZXJzPWxhc3QgMiB2ZXJzaW9uIS4vLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2luZGV4LmpzIS4vbWFpbi5zY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzIS4vLi4vLi4vbm9kZV9tb2R1bGVzL2F1dG9wcmVmaXhlci1sb2FkZXIvaW5kZXguanM/YnJvd3NlcnM9bGFzdCAyIHZlcnNpb24hLi8uLi8uLi9ub2RlX21vZHVsZXMvc2Fzcy1sb2FkZXIvaW5kZXguanMhLi9tYWluLnNjc3NcIik7XG5cdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHR9KTtcblx0fVxuXHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvc3R5bGUvbWFpbi5zY3NzXG4gKiogbW9kdWxlIGlkID0gMzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHZpZXdCb3g9XFxcIjAgMCAyNjgxIDgxNFxcXCIgdmVyc2lvbj1cXFwiMS4xXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIiB4bWxuczpza2V0Y2g9XFxcImh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9uc1xcXCI+PHRpdGxlPkNsaW1iIExvZ28gQmV0YTwvdGl0bGU+PGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+PGRlZnM+PC9kZWZzPjxnIGlkPVxcXCJQYWdlLTFcXFwiIHN0cm9rZT1cXFwibm9uZVxcXCIgc3Ryb2tlLXdpZHRoPVxcXCIxXFxcIiBmaWxsPVxcXCJub25lXFxcIiBmaWxsLXJ1bGU9XFxcImV2ZW5vZGRcXFwiIHNrZXRjaDp0eXBlPVxcXCJNU1BhZ2VcXFwiPjxnIGlkPVxcXCJDbGltYi1Mb2dvLUJldGFcXFwiIHNrZXRjaDp0eXBlPVxcXCJNU0FydGJvYXJkR3JvdXBcXFwiIGZpbGw9XFxcIiMxOTM3NERcXFwiPjxnIGlkPVxcXCJjbGktLS0tYi5zb2NpYWwtKy1QYXRoLUNvcHktKy1UeXBlLXNvbWV0aGluZy1Db3B5LUNvcHktQ29weS1Db3B5LUNvcHlcXFwiIHNrZXRjaDp0eXBlPVxcXCJNU0xheWVyR3JvdXBcXFwiIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKDIwNi4wMDAwMDAsIDI0OS4wMDAwMDApXFxcIj48ZyBpZD1cXFwiY2xpLS0tLWIuc29jaWFsLSstUGF0aC1Db3B5XFxcIiBza2V0Y2g6dHlwZT1cXFwiTVNTaGFwZUdyb3VwXFxcIj48cGF0aCBkPVxcXCJNNzIzLjM3NDIwNywxODcuNDQyMjExIEw3NjcuMDI3NjQxLDMzNy4zODM1NzUgQzc2Ny41MTA4ODksMzQxLjI2NTU1MiA3NzEuODYwMTI0LDM0NS4xNDc1MjkgNzc2LjIwOTM1OSwzNDUuMTQ3NTI5IEw4MzMuMjMyNjY0LDM0NS4xNDc1MjkgQzgzOS4wMzE2NDQsMzQ1LjE0NzUyOSA4NDMuMzgwODc5LDM0MC43ODAzMDUgODQyLjQxNDM4MywzMzQuNDcyMDkyIEw3MzkuNDgyNDg1LDguMzg2MDE5ODIgQzczOC45OTkyMzcsNC4wMTg3OTU2NCA3MzQuNjUwMDAyLDAuNjIyMDY1NzI4IDczMC43ODQwMTUsMC42MjIwNjU3MjggTDcyMy4wNTIwNDEsMC42MjIwNjU3MjggQzcyMC42MzU4LDAuNjIyMDY1NzI4IDcxNi4yODY1NjUsMi41NjMwNTQyNSA3MTQuODM2ODIsNS40NzQ1MzcwNCBMNjQzLjUxNDMwMiwyMDkuMDE5MDYyIEw1NzYuNDk0MDAzLDEwNS40MzE3ODggQzU3My43MjEwNTgsMTAxLjE0NTg5NSA1NjcuMzQyNTM5LDk3LjY3MTQ5MTkgNTYyLjI1NTYsOTcuNjcxNDkxOSBMNTUyLjE3OTAzMyw5Ny42NzE0OTE5IEM1NDcuMDg4MzI2LDk3LjY3MTQ5MTkgNTQxLjUyOTM4NCwxMDEuNTU4NzQ5IDUzOS43NzAwNjEsMTA2LjMzNDE4NyBMNDU0Ljk4MDA2OCwzMzYuNDg0ODMzIEM0NTMuMjE3NDksMzQxLjI2OTEwOCA0NTUuOTI3MDg2LDM0NS4xNDc1MjkgNDYxLjAxNDEwMiwzNDUuMTQ3NTI5IEw1MjIuMTM4MDY3LDM0NS4xNDc1MjkgQzUyNy4yMzMxNSwzNDUuMTQ3NTI5IDUzMi43OTEwNTQsMzQxLjI2MTczMyA1MzQuNTUyNzk3LDMzNi40NjYxNzEgTDU3MS40NzMxNDQsMjM1Ljk2NjkyNCBMNjQyLjEwODUyOCwzNDYuMTA3NzEyIEM2NDMuNDg3MTQxLDM0OC4yNTczNjMgNjQ2LjY2NzA5MiwzNTAgNjQ5LjIxMjMwNywzNTAgTDY1OS45NzE0MTIsMzUwIEM2NjIuNTE2MTA4LDM1MCA2NjUuMjgyMDQ0LDM0OC4wNDUwNzggNjY2LjE0MTk4MiwzNDUuNjUzOTE4IEw2ODMuODI3MjYxLDI5Ni40Nzc4NzIgTDcyMy4zNzQyMDcsMTg3LjQ0MjIxMSBaXFxcIiBpZD1cXFwiUGF0aC1Db3B5XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTAuMTQ1MjEzNDQxLDI0Ny4wODUxMDEgQzAuMTQ1MjEzNDQxLDMwNS4yMzQwNCA0OS4wODcyMzc3LDM0OC44NDU3NDUgMTA0LjMyODczLDM0OC44NDU3NDUgQzEzOS4yMTgwOTQsMzQ4Ljg0NTc0NSAxNjQuNDE1OTY4LDMzNS4yNzc2NTkgMTgyLjM0NTIyNCwzMDguMTQxNDg3IEMxODUuNzM3MjQ2LDMwMy4yOTU3NDIgMTgzLjMxNDM3MywyOTguNDQ5OTk3IDE3OC45NTMyMDMsMjk0LjU3MzQwMSBMMTQ5Ljg3ODczMywyNjkuMzc1NTI3IEMxNDYuOTcxMjg2LDI2Ni45NTI2NTUgMTQyLjYxMDExNiwyNjcuOTIxODA0IDEzOS4yMTgwOTQsMjcxLjMxMzgyNSBDMTMxLjQ2NDkwMiwyNzkuMDY3MDE3IDEyMy4yMjcxMzYsMjg2LjMzNTYzNSAxMDYuMjY3MDI4LDI4Ni4zMzU2MzUgQzg0Ljk0NTc1MDUsMjg2LjMzNTYzNSA2OC40NzAyMTc2LDI2OC44OTA5NTMgNjguNDcwMjE3NiwyNDcuMDg1MTAxIEM2OC40NzAyMTc2LDIyNS43NjM4MjMgODUuOTE0ODk5NSwyMDcuODM0NTY2IDEwNy4yMzYxNzcsMjA3LjgzNDU2NiBDMTE4LjM4MTM5MSwyMDcuODM0NTY2IDEyOC41NTc0NTUsMjEzLjE2NDg4NiAxMzUuMzQxNDk4LDIyMC40MzM1MDMgQzEzNy43NjQzNzEsMjIyLjg1NjM3NiAxNDMuNTc5MjY1LDIyMy44MjU1MjUgMTQ2LjAwMjEzNywyMjEuNDAyNjUyIEwxNzUuMDc2NjA3LDE5My43ODE5MDYgQzE3OS40Mzc3NzcsMTg5LjkwNTMxIDE4MC44OTE1MDEsMTg0LjU3NDk5IDE3Ny40OTk0OCwxODAuMjEzODIgQzE1OS4wODU2NDksMTU3LjkyMzM5MyAxMzUuMzQxNDk4LDE0NS4zMjQ0NTYgMTA0LjgxMzMwNSwxNDUuMzI0NDU2IEM0OS41NzE4MTIyLDE0NS4zMjQ0NTYgMC4xNDUyMTM0NDEsMTg5LjkwNTMxIDAuMTQ1MjEzNDQxLDI0Ny4wODUxMDEgTDAuMTQ1MjEzNDQxLDI0Ny4wODUxMDEgWiBNMjE4LjY4ODMxMiwzMzQuNzkzMDg1IEMyMTguNjg4MzEyLDMzOS42Mzg4MyAyMjMuMDQ5NDgyLDM0NCAyMjcuODk1MjI3LDM0NCBMMjgxLjE5ODQyMiwzNDQgQzI4Ni4wNDQxNjcsMzQ0IDI5MC40MDUzMzcsMzM5LjYzODgzIDI5MC40MDUzMzcsMzM0Ljc5MzA4NSBMMjkwLjQwNTMzNywxNC4wMDQ3NjcyIEMyOTAuNDA1MzM3LDkuMTU5MDIyMjYgMjg2LjA0NDE2Nyw0Ljc5Nzg1MTc5IDI4MS4xOTg0MjIsNC43OTc4NTE3OSBMMjI3Ljg5NTIyNyw0Ljc5Nzg1MTc5IEMyMjMuMDQ5NDgyLDQuNzk3ODUxNzkgMjE4LjY4ODMxMiw5LjE1OTAyMjI2IDIxOC42ODgzMTIsMTQuMDA0NzY3MiBMMjE4LjY4ODMxMiwzMzQuNzkzMDg1IFogTTM3OC4xMTMzMjEsOTEuNTM2Njg2OCBDMzk5LjQzNDU5OSw5MS41MzY2ODY4IDQxNi44NzkyODEsNzQuNTc2NTc5NCA0MTYuODc5MjgxLDUzLjI1NTMwMTUgQzQxNi44NzkyODEsMzEuOTM0MDIzNiAzOTkuNDM0NTk5LDE0LjQ4OTM0MTcgMzc4LjExMzMyMSwxNC40ODkzNDE3IEMzNTYuNzkyMDQ0LDE0LjQ4OTM0MTcgMzM5LjgzMTkzNiwzMS45MzQwMjM2IDMzOS44MzE5MzYsNTMuMjU1MzAxNSBDMzM5LjgzMTkzNiw3NC41NzY1Nzk0IDM1Ni43OTIwNDQsOTEuNTM2Njg2OCAzNzguMTEzMzIxLDkxLjUzNjY4NjggTDM3OC4xMTMzMjEsOTEuNTM2Njg2OCBaIE0zNDIuNzM5MzgzLDMzNC43OTMwODUgQzM0Mi43MzkzODMsMzM5LjYzODgzIDM0Ny4xMDA1NTQsMzQ0IDM1MS45NDYyOTksMzQ0IEw0MDUuMjQ5NDkzLDM0NCBDNDEwLjA5NTIzOCwzNDQgNDE0LjQ1NjQwOSwzMzkuNjM4ODMgNDE0LjQ1NjQwOSwzMzQuNzkzMDg1IEw0MTQuNDU2NDA5LDE1OS4zNzcxMTYgQzQxNC40NTY0MDksMTU0LjA0Njc5NyA0MTAuMDk1MjM4LDE1MC4xNzAyMDEgNDA1LjI0OTQ5MywxNTAuMTcwMjAxIEwzNTEuOTQ2Mjk5LDE1MC4xNzAyMDEgQzM0Ny4xMDA1NTQsMTUwLjE3MDIwMSAzNDIuNzM5MzgzLDE1NC4wNDY3OTcgMzQyLjczOTM4MywxNTkuMzc3MTE2IEwzNDIuNzM5MzgzLDMzNC43OTMwODUgWiBNODg5LjE1NDMxLDMzNC43OTMwODUgQzg4OS4xNTQzMSwzMzkuNjM4ODMgODkzLjUxNTQ4MSwzNDQgODk4LjM2MTIyNiwzNDQgTDkyMS4xMzYyMjcsMzQ0IEM5MjUuOTgxOTcyLDM0NCA5MjkuMzczOTk0LDMzOS42Mzg4MyA5MzEuMzEyMjkyLDMzNC4zMDg1MSBMOTM3LjEyNzE4NSwzMTguMzE3NTUyIEM5MzcuMTI3MTg1LDMxOC4zMTc1NTIgOTU5LjQxNzYxMiwzNDguODQ1NzQ1IDEwMDIuMDYwMTcsMzQ4Ljg0NTc0NSBDMTA1Ni44MTcwOSwzNDguODQ1NzQ1IDEwOTguMDA1OTIsMzAyLjgxMTE2OCAxMDk4LjAwNTkyLDI0Ny4wODUxMDEgQzEwOTguMDA1OTIsMTc4Ljc2MDA5NiAxMDUzLjQyNTA2LDE0NS4zMjQ0NTYgMTAwMS41NzU1OSwxNDUuMzI0NDU2IEM5ODUuMTAwMDYxLDE0NS4zMjQ0NTYgOTY3LjE3MDgwNCwxNTEuMTM5MzUgOTYxLjM1NTkxLDE1NC41MzEzNzEgTDk2MS4zNTU5MSwxNC4wMDQ3NjcyIEM5NjEuMzU1OTEsOS4xNTkwMjIyNiA5NTYuOTk0NzQsNC43OTc4NTE3OSA5NTIuMTQ4OTk1LDQuNzk3ODUxNzkgTDg5OC4zNjEyMjYsNC43OTc4NTE3OSBDODkzLjUxNTQ4MSw0Ljc5Nzg1MTc5IDg4OS4xNTQzMSw5LjE1OTAyMjI2IDg4OS4xNTQzMSwxNC4wMDQ3NjcyIEw4ODkuMTU0MzEsMzM0Ljc5MzA4NSBaIE05NTMuNjAyNzE4LDI0Ni42MDA1MjYgQzk1My42MDI3MTgsMjI0Ljc5NDY3NCA5NzAuMDc4MjUxLDIwNy44MzQ1NjYgOTkyLjM2ODY3OCwyMDcuODM0NTY2IEMxMDE0LjY1OTExLDIwNy44MzQ1NjYgMTAzMS42MTkyMSwyMjQuNzk0Njc0IDEwMzEuNjE5MjEsMjQ2LjYwMDUyNiBDMTAzMS42MTkyMSwyNjguODkwOTUzIDEwMTQuNjU5MTEsMjg2LjMzNTYzNSA5OTIuMzY4Njc4LDI4Ni4zMzU2MzUgQzk3MC4wNzgyNTEsMjg2LjMzNTYzNSA5NTMuNjAyNzE4LDI2OC44OTA5NTMgOTUzLjYwMjcxOCwyNDYuNjAwNTI2IEw5NTMuNjAyNzE4LDI0Ni42MDA1MjYgWiBNMTEzNC4yNTY0NSwzMjEuMjI0OTk5IEMxMTM0LjI1NjQ1LDMzNi4yNDY4MDggMTE0Ni44NTUzOSwzNDguODQ1NzQ1IDExNjEuODc3MiwzNDguODQ1NzQ1IEMxMTc3LjM4MzU4LDM0OC44NDU3NDUgMTE4OS40OTc5NSwzMzYuMjQ2ODA4IDExODkuNDk3OTUsMzIxLjIyNDk5OSBDMTE4OS40OTc5NSwzMDUuNzE4NjE1IDExNzcuMzgzNTgsMjkzLjYwNDI1MiAxMTYxLjg3NzIsMjkzLjYwNDI1MiBDMTE0Ni44NTUzOSwyOTMuNjA0MjUyIDExMzQuMjU2NDUsMzA1LjcxODYxNSAxMTM0LjI1NjQ1LDMyMS4yMjQ5OTkgTDExMzQuMjU2NDUsMzIxLjIyNDk5OSBaIE0xMjM2LjAxNzEsMzMyLjg1NDc4NyBDMTI0NS43MDg1OSwzNDAuNjA3OTc5IDEyNjkuOTM3MzEsMzQ4Ljg0NTc0NSAxMzAxLjkxOTIzLDM0OC44NDU3NDUgQzEzNTYuNjc2MTUsMzQ4Ljg0NTc0NSAxMzgzLjgxMjMyLDMyMS4yMjQ5OTkgMTM4My44MTIzMiwyODcuMzA0Nzg0IEMxMzgzLjgxMjMyLDI0OC41Mzg4MjQgMTM1Ni42NzYxNSwyMzMuMDMyNDQgMTMxNy40MjU2MSwyMTkuNDY0MzU0IEMxMzAwLjk1MDA4LDIxMy42NDk0NiAxMjk1LjYxOTc2LDIwOC44MDM3MTUgMTI5NS42MTk3NiwyMDMuOTU3OTcgQzEyOTUuNjE5NzYsMTk4LjYyNzY1MSAxMjk5Ljk4MDkzLDE5Ny4xNzM5MjcgMTMwNi4yODA0LDE5Ny4xNzM5MjcgQzEzMjUuMTc4OCwxOTcuMTczOTI3IDEzNDcuNDY5MjMsMjA4LjMxOTE0MSAxMzQ3LjQ2OTIzLDIwOC4zMTkxNDEgQzEzNTEuMzQ1ODMsMjA5Ljc3Mjg2NCAxMzU2LjE5MTU3LDIwOC4zMTkxNDEgMTM1Ny42NDUzLDIwNS40MTE2OTQgTDEzNzUuNTc0NTUsMTcyLjQ2MDYyOCBDMTM3OC40ODIsMTY3LjYxNDg4MyAxMzc1LjA4OTk4LDE2My4yNTM3MTIgMTM3MC43Mjg4MSwxNjAuMzQ2MjY1IEMxMzYwLjA2ODE3LDE1My41NjIyMjMgMTMzNi44MDg1OSwxNDUuMzI0NDU2IDEzMDYuMjgwNCwxNDUuMzI0NDU2IEMxMjUzLjk0NjM1LDE0NS4zMjQ0NTYgMTIzMC42ODY3OCwxNzEuNDkxNDc5IDEyMzAuNjg2NzgsMjAzLjk1Nzk3IEMxMjMwLjY4Njc4LDIzNC4wMDE1ODkgMTI0Ny4xNjIzMSwyNTUuODA3NDQxIDEyODQuOTU5MTIsMjY4Ljg5MDk1MyBDMTMwOS42NzI0MiwyNzcuNjEzMjk0IDEzMTIuNTc5ODcsMjg0LjM5NzMzNyAxMzEyLjU3OTg3LDI4OS4yNDMwODIgQzEzMTIuNTc5ODcsMjk1LjA1Nzk3NiAxMzA4LjIxODcsMjk3Ljk2NTQyMyAxMzAzLjM3Mjk1LDI5Ny45NjU0MjMgQzEyODIuNTM2MjUsMjk3Ljk2NTQyMyAxMjU5Ljc2MTI1LDI4NS4zNjY0ODYgMTI1OS43NjEyNSwyODUuMzY2NDg2IEMxMjU1Ljg4NDY1LDI4My40MjgxODggMTI1MS4wMzg5MSwyODYuMzM1NjM1IDEyNDkuNTg1MTgsMjg5LjI0MzA4MiBMMTIzMi42MjUwOCwzMjIuNjc4NzIyIEMxMjMwLjIwMjIsMzI3LjAzOTg5MyAxMjMyLjYyNTA4LDMyOS45NDczNCAxMjM2LjAxNzEsMzMyLjg1NDc4NyBMMTIzNi4wMTcxLDMzMi44NTQ3ODcgWiBNMTQwNy41NTY0NywyNDYuNjAwNTI2IEMxNDA3LjU1NjQ3LDMwMi4zMjY1OTMgMTQ1My4xMDY0NywzNDguODQ1NzQ1IDE1MDguMzQ3OTYsMzQ4Ljg0NTc0NSBDMTU2My41ODk0NiwzNDguODQ1NzQ1IDE2MDkuMTM5NDYsMzAyLjMyNjU5MyAxNjA5LjEzOTQ2LDI0Ni42MDA1MjYgQzE2MDkuMTM5NDYsMTkxLjg0MzYwOCAxNTYzLjU4OTQ2LDE0NS4zMjQ0NTYgMTUwOC4zNDc5NiwxNDUuMzI0NDU2IEMxNDUzLjEwNjQ3LDE0NS4zMjQ0NTYgMTQwNy41NTY0NywxOTEuODQzNjA4IDE0MDcuNTU2NDcsMjQ2LjYwMDUyNiBMMTQwNy41NTY0NywyNDYuNjAwNTI2IFogTTE0NzAuMDY2NTgsMjQ2LjYwMDUyNiBDMTQ3MC4wNjY1OCwyMjUuMjc5MjQ4IDE0ODcuMDI2NjksMjA3LjgzNDU2NiAxNTA4LjM0Nzk2LDIwNy44MzQ1NjYgQzE1MjkuNjY5MjQsMjA3LjgzNDU2NiAxNTQ2LjYyOTM1LDIyNS4yNzkyNDggMTU0Ni42MjkzNSwyNDYuNjAwNTI2IEMxNTQ2LjYyOTM1LDI2OC40MDYzNzggMTUyOS42NjkyNCwyODYuMzM1NjM1IDE1MDguMzQ3OTYsMjg2LjMzNTYzNSBDMTQ4Ny4wMjY2OSwyODYuMzM1NjM1IDE0NzAuMDY2NTgsMjY4LjQwNjM3OCAxNDcwLjA2NjU4LDI0Ni42MDA1MjYgTDE0NzAuMDY2NTgsMjQ2LjYwMDUyNiBaIE0xNjMxLjQyOTg5LDI0Ny4wODUxMDEgQzE2MzEuNDI5ODksMzA1LjIzNDA0IDE2ODAuMzcxOTEsMzQ4Ljg0NTc0NSAxNzM1LjYxMzQsMzQ4Ljg0NTc0NSBDMTc3MC41MDI3NywzNDguODQ1NzQ1IDE3OTUuNzAwNjQsMzM1LjI3NzY1OSAxODEzLjYyOTksMzA4LjE0MTQ4NyBDMTgxNy4wMjE5MiwzMDMuMjk1NzQyIDE4MTQuNTk5MDUsMjk4LjQ0OTk5NyAxODEwLjIzNzg4LDI5NC41NzM0MDEgTDE3ODEuMTYzNDEsMjY5LjM3NTUyNyBDMTc3OC4yNTU5NiwyNjYuOTUyNjU1IDE3NzMuODk0NzksMjY3LjkyMTgwNCAxNzcwLjUwMjc3LDI3MS4zMTM4MjUgQzE3NjIuNzQ5NTgsMjc5LjA2NzAxNyAxNzU0LjUxMTgxLDI4Ni4zMzU2MzUgMTczNy41NTE3LDI4Ni4zMzU2MzUgQzE3MTYuMjMwNDIsMjg2LjMzNTYzNSAxNjk5Ljc1NDg5LDI2OC44OTA5NTMgMTY5OS43NTQ4OSwyNDcuMDg1MTAxIEMxNjk5Ljc1NDg5LDIyNS43NjM4MjMgMTcxNy4xOTk1NywyMDcuODM0NTY2IDE3MzguNTIwODUsMjA3LjgzNDU2NiBDMTc0OS42NjYwNiwyMDcuODM0NTY2IDE3NTkuODQyMTMsMjEzLjE2NDg4NiAxNzY2LjYyNjE3LDIyMC40MzM1MDMgQzE3NjkuMDQ5MDQsMjIyLjg1NjM3NiAxNzc0Ljg2Mzk0LDIyMy44MjU1MjUgMTc3Ny4yODY4MSwyMjEuNDAyNjUyIEwxODA2LjM2MTI4LDE5My43ODE5MDYgQzE4MTAuNzIyNDUsMTg5LjkwNTMxIDE4MTIuMTc2MTcsMTg0LjU3NDk5IDE4MDguNzg0MTUsMTgwLjIxMzgyIEMxNzkwLjM3MDMyLDE1Ny45MjMzOTMgMTc2Ni42MjYxNywxNDUuMzI0NDU2IDE3MzYuMDk3OTgsMTQ1LjMyNDQ1NiBDMTY4MC44NTY0OSwxNDUuMzI0NDU2IDE2MzEuNDI5ODksMTg5LjkwNTMxIDE2MzEuNDI5ODksMjQ3LjA4NTEwMSBMMTYzMS40Mjk4OSwyNDcuMDg1MTAxIFogTTE4ODUuMzQ2OTIsOTEuNTM2Njg2OCBDMTkwNi42NjgyLDkxLjUzNjY4NjggMTkyNC4xMTI4OCw3NC41NzY1Nzk0IDE5MjQuMTEyODgsNTMuMjU1MzAxNSBDMTkyNC4xMTI4OCwzMS45MzQwMjM2IDE5MDYuNjY4MiwxNC40ODkzNDE3IDE4ODUuMzQ2OTIsMTQuNDg5MzQxNyBDMTg2NC4wMjU2NSwxNC40ODkzNDE3IDE4NDcuMDY1NTQsMzEuOTM0MDIzNiAxODQ3LjA2NTU0LDUzLjI1NTMwMTUgQzE4NDcuMDY1NTQsNzQuNTc2NTc5NCAxODY0LjAyNTY1LDkxLjUzNjY4NjggMTg4NS4zNDY5Miw5MS41MzY2ODY4IEwxODg1LjM0NjkyLDkxLjUzNjY4NjggWiBNMTg0OS45NzI5OSwzMzQuNzkzMDg1IEMxODQ5Ljk3Mjk5LDMzOS42Mzg4MyAxODU0LjMzNDE2LDM0NCAxODU5LjE3OTksMzQ0IEwxOTEyLjQ4MzEsMzQ0IEMxOTE3LjMyODg0LDM0NCAxOTIxLjY5MDAxLDMzOS42Mzg4MyAxOTIxLjY5MDAxLDMzNC43OTMwODUgTDE5MjEuNjkwMDEsMTU5LjM3NzExNiBDMTkyMS42OTAwMSwxNTQuMDQ2Nzk3IDE5MTcuMzI4ODQsMTUwLjE3MDIwMSAxOTEyLjQ4MzEsMTUwLjE3MDIwMSBMMTg1OS4xNzk5LDE1MC4xNzAyMDEgQzE4NTQuMzM0MTYsMTUwLjE3MDIwMSAxODQ5Ljk3Mjk5LDE1NC4wNDY3OTcgMTg0OS45NzI5OSwxNTkuMzc3MTE2IEwxODQ5Ljk3Mjk5LDMzNC43OTMwODUgWiBNMTk2MC45NDA1NSwyODQuODgxOTExIEMxOTYwLjk0MDU1LDMyMy4xNjMyOTcgMTk4OS41MzA0NCwzNDguODQ1NzQ1IDIwMjcuODExODMsMzQ4Ljg0NTc0NSBDMjA1OC4zNDAwMiwzNDguODQ1NzQ1IDIwNzUuMzAwMTMsMzM0Ljc5MzA4NSAyMDg2LjQ0NTM0LDMyNC42MTcwMiBMMjA5My4yMjkzOCwzMzcuNzAwNTMyIEMyMDk1LjY1MjI2LDM0My4wMzA4NTEgMjA5OS4wNDQyOCwzNDQgMjEwMS45NTE3MiwzNDQgTDIxMjMuMjczLDM0NCBDMjEyOC4xMTg3NSwzNDQgMjEzMi40Nzk5MiwzMzkuNjM4ODMgMjEzMi40Nzk5MiwzMzQuNzkzMDg1IEwyMTMyLjQ3OTkyLDIyNy43MDIxMjEgQzIxMzIuNDc5OTIsMTcwLjUyMjMzIDIxMTAuNjc0MDcsMTQ1LjMyNDQ1NiAyMDUwLjU4NjgzLDE0NS4zMjQ0NTYgQzIwMjQuNDE5OCwxNDUuMzI0NDU2IDE5OTAuNDk5NTksMTUxLjEzOTM1IDE5ODYuMTM4NDIsMTUyLjU5MzA3NCBDMTk4MS43NzcyNSwxNTQuMDQ2Nzk3IDE5NzcuNDE2MDgsMTU3LjQzODgxOCAxOTc4Ljg2OTgsMTY1LjY3NjU4NSBMMTk4My4yMzA5NywxOTYuMjA0Nzc4IEMxOTg0LjIwMDEyLDIwMy40NzMzOTYgMTk4Ny41OTIxNCwyMDguODAzNzE1IDE5OTQuODYwNzYsMjA2LjM4MDg0MyBDMjAwNy40NTk3LDIwMi41MDQyNDcgMjAzMC4yMzQ3LDE5OS4xMTIyMjUgMjA0My4zMTgyMSwxOTkuMTEyMjI1IEMyMDY2LjU3Nzc5LDE5OS4xMTIyMjUgMjA2OS40ODUyMywyMDguODAzNzE1IDIwNjkuNDg1MjMsMjI3LjcwMjEyMSBDMjA2OS40ODUyMywyMjcuNzAyMTIxIDIwNTMuOTc4ODUsMjE5Ljk0ODkyOSAyMDMyLjE3MywyMTkuOTQ4OTI5IEMxOTg4LjA3NjcyLDIxOS45NDg5MjkgMTk2MC45NDA1NSwyNDcuNTY5Njc1IDE5NjAuOTQwNTUsMjg0Ljg4MTkxMSBMMTk2MC45NDA1NSwyODQuODgxOTExIFogTTIwMjMuOTM1MjMsMjgwLjAzNjE2NiBDMjAyMy45MzUyMywyNjguODkwOTUzIDIwMzMuMTQyMTUsMjU5LjY4NDAzNyAyMDQ0Ljc3MTkzLDI1OS42ODQwMzcgQzIwNTYuNDAxNzIsMjU5LjY4NDAzNyAyMDY1LjYwODY0LDI2OC44OTA5NTMgMjA2Ni4wOTMyMSwyODAuMDM2MTY2IEMyMDY2LjA5MzIxLDI5MS42NjU5NTQgMjA1Ni40MDE3MiwzMDEuMzU3NDQ0IDIwNDQuNzcxOTMsMzAxLjM1NzQ0NCBDMjAzMy4xNDIxNSwzMDEuMzU3NDQ0IDIwMjMuOTM1MjMsMjkxLjY2NTk1NCAyMDIzLjkzNTIzLDI4MC4wMzYxNjYgTDIwMjMuOTM1MjMsMjgwLjAzNjE2NiBaIE0yMTgxLjkwNjUyLDMzNC43OTMwODUgQzIxODEuOTA2NTIsMzM5LjYzODgzIDIxODYuMjY3NjksMzQ0IDIxOTEuMTEzNDMsMzQ0IEwyMjQ0LjQxNjYzLDM0NCBDMjI0OS4yNjIzNywzNDQgMjI1My42MjM1NCwzMzkuNjM4ODMgMjI1My42MjM1NCwzMzQuNzkzMDg1IEwyMjUzLjYyMzU0LDE0LjAwNDc2NzIgQzIyNTMuNjIzNTQsOS4xNTkwMjIyNiAyMjQ5LjI2MjM3LDQuNzk3ODUxNzkgMjI0NC40MTY2Myw0Ljc5Nzg1MTc5IEwyMTkxLjExMzQzLDQuNzk3ODUxNzkgQzIxODYuMjY3NjksNC43OTc4NTE3OSAyMTgxLjkwNjUyLDkuMTU5MDIyMjYgMjE4MS45MDY1MiwxNC4wMDQ3NjcyIEwyMTgxLjkwNjUyLDMzNC43OTMwODUgWlxcXCIgaWQ9XFxcImNsaS0tLS1iLnNvY2lhbFxcXCI+PC9wYXRoPjwvZz48L2c+PC9nPjwvZz48L3N2Zz5cIlxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvaW1nL2NsaW1iX2xvZ28uc3ZnXG4gKiogbW9kdWxlIGlkID0gMzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XHJcblx0aWYoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcclxuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xyXG5cdFx0bW9kdWxlLnBhdGhzID0gW107XHJcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcclxuXHRcdG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XHJcblx0fVxyXG5cdHJldHVybiBtb2R1bGU7XHJcbn1cclxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAod2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanNcbiAqKiBtb2R1bGUgaWQgPSAzNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("react")):"function"==typeof define&&define.amd?define(["react"],e):"object"==typeof exports?exports["react-climb-social"]=e(require("react")):t["react-climb-social"]=e(t.React)}(this,function(t){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return t[r].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="/",e(0)}([function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(1),o=r(i),s=n(11),u=r(s);if(n(32),window){window.Climb=window.Climb||{};for(var c=document.querySelectorAll(".climb-wall"),a=0;a=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var u=Object.assign||function(t){for(var e=1;e1)for(var n=1;nr;r++)n[r]=t[r];return n}function a(t){return function(){try{return t.apply(this,arguments)}catch(e){return Dt.e=e,Dt}}}function l(t){throw t}function p(t,e){if(Nt&&e.stack&&"object"==typeof t&&null!==t&&t.stack&&-1===t.stack.indexOf(Mt)){for(var n=[],r=e;r;r=r.source)r.stack&&n.unshift(r.stack);n.unshift(t.stack);var i=n.join("\n"+Mt+"\n");t.stack=h(i)}}function h(t){for(var e=t.split("\n"),n=[],r=0,i=e.length;i>r;r++){var o=e[r];f(o)||d(o)||!o||n.push(o)}return n.join("\n")}function f(t){var e=b(t);if(!e)return!1;var n=e[0],r=e[1];return n===Pt&&r>=At&&ci>=r}function d(t){return-1!==t.indexOf("(module.js:")||-1!==t.indexOf("(node.js:")}function v(){if(Nt)try{throw new Error}catch(t){var e=t.stack.split("\n"),n=e[0].indexOf("@")>0?e[1]:e[2],r=b(n);if(!r)return;return Pt=r[0],r[1]}}function b(t){var e=/at .+ \((.+):(\d+):(?:\d+)\)$/.exec(t);if(e)return[e[1],Number(e[2])];var n=/at ([^ ]+):(\d+):(?:\d+)$/.exec(t);if(n)return[n[1],Number(n[2])];var r=/.*@(.+):(\d+)$/.exec(t);return r?[r[1],Number(r[2])]:void 0}function y(t){var e=[];if(!de(t))return e;fe.nonEnumArgs&&t.length&&ve(t)&&(t=ye.call(t));var n=fe.enumPrototypes&&"function"==typeof t,r=fe.enumErrorProps&&(t===ue||t instanceof Error);for(var i in t)n&&"prototype"==i||r&&("message"==i||"name"==i)||e.push(i);if(fe.nonEnumShadows&&t!==ce){var o=t.constructor,s=-1,u=Ht;if(t===(o&&o.prototype))var c=t===ae?re:t===ue?Jt:ie.call(t),a=he[c];for(;++s-1:void 0});return n.pop(),r.pop(),f}function C(t,e){for(var n=new Array(t),r=0;t>r;r++)n[r]=e();return n}function x(t,e){this.id=t,this.value=e}function S(t){this._s=t,this.isDisposed=!1}function E(t){this._s=t}function O(t){this._s=t,this._l=t.length,this._i=0}function D(t){this._a=t}function j(t){this._a=t,this._l=A(t),this._i=0}function N(t){return"number"==typeof t&&yt.isFinite(t)}function k(t){var e,n=t[It];if(!n&&"string"==typeof t)return e=new E(t),e[It]();if(!n&&t.length!==s)return e=new D(t),e[It]();if(!n)throw new TypeError("Object is not iterable");return t[It]()}function P(t){var e=+t;return 0===e?e:isNaN(e)?e:0>e?-1:1}function A(t){var e=+t.length;return isNaN(e)?0:0!==e&&N(e)?(e=P(e)*Math.floor(Math.abs(e)),0>=e?0:e>Dn?Dn:e):e}function M(t,e){this.observer=t,this.parent=e}function T(t,e){var n=t.length;return function(r,i){n>r?(e.onNext(t[r]),i(r+1)):e.onCompleted()}}function L(t,e){return Le(t)||(t=Ue),new Nn(e,t)}function R(t,e){this.observer=t,this.parent=e}function V(t,e){this.observer=t,this.parent=e}function F(){return!1}function I(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return e}function F(){return!1}function I(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return e}function F(){return!1}function U(){return[]}function F(){return!1}function U(){return[]}function I(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return e}function z(t){return function(e){return t.subscribe(e)}}function W(t,e){return function(n){for(var r=n,i=0;e>i;i++){var o=r[t[i]];if("undefined"==typeof o)return s;r=o}return r}}function B(t,e,n,r){var i=new ii;return r.push(Z(i,e,n)),t.apply(e,r),i.asObservable()}function Z(t,e,n){return function(){for(var r=arguments.length,i=new Array(r),o=0;r>o;o++)i[o]=arguments[o];if(Ot(n)){if(i=jt(n).apply(e,i),i===Dt)return t.onError(i.e);t.onNext(i)}else i.length<=1?t.onNext(i[0]):t.onNext(i);t.onCompleted()}}function K(t,e,n,r){var i=new ii;return r.push(H(i,e,n)),t.apply(e,r),i.asObservable()}function H(t,e,n){return function(){var r=arguments[0];if(r)return t.onError(r);for(var i=arguments.length,o=[],s=1;i>s;s++)o[s-1]=arguments[s];if(Ot(n)){var o=jt(n).apply(e,o);if(o===Dt)return t.onError(o.e);t.onNext(o)}else o.length<=1?t.onNext(o[0]):t.onNext(o);t.onCompleted()}}function Q(t){return yt.StaticNodeList?t instanceof yt.StaticNodeList||t instanceof yt.NodeList:"[object NodeList]"===Object.prototype.toString.call(t)}function $(t,e,n){this._e=t,this._n=e,this._fn=n,this._e.addEventListener(this._n,this._fn,!1),this.isDisposed=!1}function Y(t,e,n){var r=new ge,i=Object.prototype.toString.call(t);if(Q(t)||"[object HTMLCollection]"===i)for(var o=0,s=t.length;s>o;o++)r.add(Y(t.item(o),e,n));else t&&r.add(new $(t,e,n));return r}function G(t,e){return new zr(t,e)}function J(t,e,n){return new ti(function(r){var i=t,o=Te(e);return n.scheduleRecursiveFuture(0,i,function(t,e){if(o>0){var s=n.now();i=new Date(i.getTime()+o),i.getTime()<=s&&(i=new Date(s+o))}r.onNext(t),e(t+1,new Date(i))})})}function X(t,e,n){return t===e?new ti(function(t){return n.schedulePeriodic(0,e,function(e){return t.onNext(e),e+1})}):wn(function(){return J(new Date(n.now()+t),e,n)})}function tt(t,e,n){return new ti(function(r){var i,o=!1,s=new Ne,u=null,c=[],a=!1;return i=t.materialize().timestamp(n).subscribe(function(t){var i,l;"E"===t.value.kind?(c=[],c.push(t),u=t.value.error,l=!a):(c.push({value:t.value,timestamp:t.timestamp+e}),l=!o,o=!0),l&&(null!==u?r.onError(u):(i=new je,s.setDisposable(i),i.setDisposable(n.scheduleRecursiveFuture(null,e,function(t,e){var i,s,l,p;if(null===u){a=!0;do l=null,c.length>0&&c[0].timestamp-n.now()<=0&&(l=c.shift().value),null!==l&&l.accept(r);while(null!==l);p=!1,s=0,c.length>0?(p=!0,s=Math.max(0,c[0].timestamp-n.now())):o=!1,i=u,a=!1,null!==i?r.onError(i):p&&e(null,s)}}))))}),new ke(i,s)},t)}function et(t,e,n){return wn(function(){return tt(t,e-n.now(),n)})}function nt(t,e,n){var r,i;return Ot(e)?i=e:(r=e,i=n),new ti(function(e){function n(){c.setDisposable(t.subscribe(function(t){var n=jt(i)(t);if(n===Dt)return e.onError(n.e);var r=new je;s.add(r),r.setDisposable(n.subscribe(function(){e.onNext(t),s.remove(r),o()},function(t){e.onError(t)},function(){e.onNext(t),s.remove(r),o()}))},function(t){e.onError(t)},function(){u=!0,c.dispose(),o()}))}function o(){u&&0===s.length&&e.onCompleted()}var s=new ge,u=!1,c=new Ne;return r?c.setDisposable(r.subscribe(n,function(t){e.onError(t)},n)):n(),new ke(c,s)},this)}function rt(t,e){return new ti(function(n){var r,i=!1,o=new Ne,s=0,u=t.subscribe(function(t){var u=jt(e)(t);if(u===Dt)return n.onError(u.e);Et(u)&&(u=Vr(u)),i=!0,r=t,s++;var c=s,a=new je;o.setDisposable(a),a.setDisposable(u.subscribe(function(){i&&s===c&&n.onNext(r),i=!1,a.dispose()},function(t){n.onError(t)},function(){i&&s===c&&n.onNext(r),i=!1,a.dispose()}))},function(t){o.dispose(),n.onError(t),i=!1,s++},function(){o.dispose(),i&&n.onNext(r),n.onCompleted(),i=!1,s++});return new ke(u,o)},t)}function it(t,e){return new ti(function(n){function r(){s&&(s=!1,n.onNext(i)),o&&n.onCompleted()}var i,o=!1,s=!1,u=new je;return u.setDisposable(t.subscribe(function(t){s=!0,i=t},function(t){n.onError(t)},function(){o=!0,u.dispose()})),new ke(u,e.subscribe(r,function(t){n.onError(t)},r))},t)}function ot(t,e,n,r){return Ot(e)&&(r=n,n=e,e=Mn()),r||(r=In(new Qr)),new ti(function(i){function o(t){function e(){return p=n===l}var n=l,o=new je;c.setDisposable(o),o.setDisposable(t.subscribe(function(){e()&&u.setDisposable(r.subscribe(i)),o.dispose()},function(t){e()&&i.onError(t)},function(){e()&&u.setDisposable(r.subscribe(i))}))}function s(){var t=!p;return t&&l++,t}var u=new Ne,c=new Ne,a=new je;u.setDisposable(a);var l=0,p=!1;return o(e),a.setDisposable(t.subscribe(function(t){if(s()){i.onNext(t);var e=jt(n)(t);if(e===Dt)return i.onError(e.e);o(Et(e)?Vr(e):e)}},function(t){s()&&i.onError(t)},function(){s()&&i.onCompleted()})),new ke(u,c)},t)}function st(t,e,n,r){return Le(n)&&(r=n,n=In(new Qr)),n instanceof Error&&(n=In(n)),Le(r)||(r=Ke),new ti(function(i){function o(){var t=s;l.setDisposable(r.scheduleFuture(null,e,function(){a=s===t,a&&(Et(n)&&(n=Vr(n)),c.setDisposable(n.subscribe(i)))}))}var s=0,u=new je,c=new Ne,a=!1,l=new Ne;return c.setDisposable(u),o(),u.setDisposable(t.subscribe(function(t){a||(s++,i.onNext(t),o())},function(t){a||(s++,i.onError(t))},function(){a||(s++,i.onCompleted())})),new ke(c,l)},t)}function ut(t,e,n){return new ti(function(r){function i(t,e){if(a[e]=t,s[e]=!0,u||(u=s.every(gt))){if(o)return r.onError(o);var i=jt(n).apply(null,a);if(i===Dt)return r.onError(i.e);r.onNext(i)}c&&a[1]&&r.onCompleted()}var o,s=[!1,!1],u=!1,c=!1,a=new Array(2);return new ke(t.subscribe(function(t){i(t,0)},function(t){a[1]?r.onError(t):o=t},function(){c=!0,a[1]&&r.onCompleted()}),e.subscribe(function(t){i(t,1)},function(t){r.onError(t)},function(){c=!0,i(!0,1)}))},t)}function ct(t){return{"@@transducer/init":function(){return t},"@@transducer/step":function(t,e){return t.onNext(e)},"@@transducer/result":function(t){return t.onCompleted()}}}var at={"function":!0,object:!0},lt=at[typeof e]&&e&&!e.nodeType?e:null,pt=at[typeof t]&&t&&!t.nodeType?t:null,ht=u(lt&&pt&&"object"==typeof i&&i),ft=u(at[typeof self]&&self),dt=u(at[typeof window]&&window),vt=pt&&pt.exports===lt?lt:null,bt=u(at[typeof this]&&this),yt=ht||dt!==(bt&&bt.window)&&dt||ft||bt||Function("return this")(),mt={internals:{},config:{Promise:yt.Promise},helpers:{}},_t=mt.helpers.noop=function(){},gt=mt.helpers.identity=function(t){return t},wt=mt.helpers.defaultNow=Date.now,Ct=mt.helpers.defaultComparer=function(t,e){return be(t,e)},xt=mt.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0},St=(mt.helpers.defaultKeySerializer=function(t){return t.toString()},mt.helpers.defaultError=function(t){throw t}),Et=mt.helpers.isPromise=function(t){return!!t&&"function"!=typeof t.subscribe&&"function"==typeof t.then},Ot=mt.helpers.isFunction=function(){var t=function(t){return"function"==typeof t||!1};return t(/x/)&&(t=function(t){return"function"==typeof t&&"[object Function]"==ie.call(t)}),t}(),Dt={e:{}},jt=mt.internals.tryCatch=function(t){if(!Ot(t))throw new TypeError("fn must be a function");return a(t)};mt.config.longStackSupport=!1;var Nt=!1,kt=jt(function(){throw new Error})();Nt=!!kt.e&&!!kt.e.stack;var Pt,At=v(),Mt="From previous event:",Tt=mt.EmptyError=function(){this.message="Sequence contains no elements.",Error.call(this)};Tt.prototype=Object.create(Error.prototype),Tt.prototype.name="EmptyError";var Lt=mt.ObjectDisposedError=function(){this.message="Object has been disposed",Error.call(this)};Lt.prototype=Object.create(Error.prototype),Lt.prototype.name="ObjectDisposedError";var qt=mt.ArgumentOutOfRangeError=function(){this.message="Argument out of range",Error.call(this)};qt.prototype=Object.create(Error.prototype),qt.prototype.name="ArgumentOutOfRangeError";var Rt=mt.NotSupportedError=function(t){this.message=t||"This operation is not supported",Error.call(this)};Rt.prototype=Object.create(Error.prototype),Rt.prototype.name="NotSupportedError";var Vt=mt.NotImplementedError=function(t){this.message=t||"This operation is not implemented",Error.call(this)};Vt.prototype=Object.create(Error.prototype),Vt.prototype.name="NotImplementedError";var Ft=mt.helpers.notImplemented=function(){throw new Vt},It=(mt.helpers.notSupported=function(){throw new Rt},"function"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_");yt.Set&&"function"==typeof(new yt.Set)["@@iterator"]&&(It="@@iterator");var Ut=mt.doneEnumerator={done:!0,value:s},zt=mt.helpers.isIterable=function(t){return t&&t[It]!==s},Wt=mt.helpers.isArrayLike=function(t){return t&&t.length!==s};mt.helpers.iterator=It;var Bt,Zt=mt.internals.bindCallback=function(t,e,n){if("undefined"==typeof e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}},Kt=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],Ht=Kt.length,Qt="[object Arguments]",$t="[object Array]",Yt="[object Boolean]",Gt="[object Date]",Jt="[object Error]",Xt="[object Function]",te="[object Number]",ee="[object Object]",ne="[object RegExp]",re="[object String]",ie=Object.prototype.toString,oe=Object.prototype.hasOwnProperty,se=ie.call(arguments)==Qt,ue=Error.prototype,ce=Object.prototype,ae=String.prototype,le=ce.propertyIsEnumerable;try{Bt=!(ie.call(document)==ee&&!({toString:0}+""))}catch(pe){Bt=!0}var he={};he[$t]=he[Gt]=he[te]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},he[Yt]=he[re]={constructor:!0,toString:!0,valueOf:!0},he[Jt]=he[Xt]=he[ne]={constructor:!0,toString:!0},he[ee]={constructor:!0};var fe={};!function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);fe.enumErrorProps=le.call(ue,"message")||le.call(ue,"name"),fe.enumPrototypes=le.call(t,"prototype"),fe.nonEnumArgs=0!=n,fe.nonEnumShadows=!/valueOf/.test(e)}(1);var de=mt.internals.isObject=function(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1},ve=function(t){return t&&"object"==typeof t?ie.call(t)==Qt:!1};se||(ve=function(t){return t&&"object"==typeof t?oe.call(t,"callee"):!1});var be=mt.internals.isEqual=function(t,e){return w(t,e,[],[])},ye=({}.hasOwnProperty,Array.prototype.slice),me=mt.internals.inherits=function(t,e){function n(){this.constructor=t; +}n.prototype=e.prototype,t.prototype=new n},_e=mt.internals.addProperties=function(t){for(var e=[],n=1,r=arguments.length;r>n;n++)e.push(arguments[n]);for(var i=0,o=e.length;o>i;i++){var s=e[i];for(var u in s)t[u]=s[u]}},ge=(mt.internals.addRef=function(t,e){return new ti(function(n){return new ke(e.getDisposable(),t.subscribe(n))})},mt.CompositeDisposable=function(){var t,e,n=[];if(Array.isArray(arguments[0]))n=arguments[0],e=n.length;else for(e=arguments.length,n=new Array(e),t=0;e>t;t++)n[t]=arguments[t];this.disposables=n,this.isDisposed=!1,this.length=n.length}),we=ge.prototype;we.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},we.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},we.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;for(var t=this.disposables.length,e=new Array(t),n=0;t>n;n++)e[n]=this.disposables[n];for(this.disposables=[],this.length=0,n=0;t>n;n++)e[n].dispose()}};var Ce=mt.Disposable=function(t){this.isDisposed=!1,this.action=t||_t};Ce.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var xe=Ce.create=function(t){return new Ce(t)},Se=Ce.empty={dispose:_t},Ee=Ce.isDisposable=function(t){return t&&Ot(t.dispose)},Oe=Ce.checkDisposed=function(t){if(t.isDisposed)throw new Lt},De=Ce._fixup=function(t){return Ee(t)?t:Se},je=mt.SingleAssignmentDisposable=function(){this.isDisposed=!1,this.current=null};je.prototype.getDisposable=function(){return this.current},je.prototype.setDisposable=function(t){if(this.current)throw new Error("Disposable has already been assigned");var e=this.isDisposed;!e&&(this.current=t),e&&t&&t.dispose()},je.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.current;this.current=null,t&&t.dispose()}};var Ne=mt.SerialDisposable=function(){this.isDisposed=!1,this.current=null};Ne.prototype.getDisposable=function(){return this.current},Ne.prototype.setDisposable=function(t){var e=this.isDisposed;if(!e){var n=this.current;this.current=t}n&&n.dispose(),e&&t&&t.dispose()},Ne.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.current;this.current=null}t&&t.dispose()};var ke=mt.BinaryDisposable=function(t,e){this._first=t,this._second=e,this.isDisposed=!1};ke.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this._first;this._first=null,t&&t.dispose();var e=this._second;this._second=null,e&&e.dispose()}};var Pe=mt.NAryDisposable=function(t){this._disposables=t,this.isDisposed=!1};Pe.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;for(var t=0,e=this._disposables.length;e>t;t++)this._disposables[t].dispose();this._disposables.length=0}};var Ae=(mt.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?Se:new t(this)},e}(),mt.internals.ScheduledItem=function(t,e,n,r,i){this.scheduler=t,this.state=e,this.action=n,this.dueTime=r,this.comparer=i||xt,this.disposable=new je});Ae.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},Ae.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},Ae.prototype.isCancelled=function(){return this.disposable.isDisposed},Ae.prototype.invokeCore=function(){return De(this.action(this.scheduler,this.state))};var Me=mt.Scheduler=function(){function t(){}t.isScheduler=function(e){return e instanceof t};var e=t.prototype;return e.schedule=function(t,e){throw new Vt},e.scheduleFuture=function(e,n,r){var i=n;return i instanceof Date&&(i-=this.now()),i=t.normalize(i),0===i?this.schedule(e,r):this._scheduleFuture(e,i,r)},e._scheduleFuture=function(t,e,n){throw new Vt},t.now=wt,t.prototype.now=wt,t.normalize=function(t){return 0>t&&(t=0),t},t}(),Te=Me.normalize,Le=Me.isScheduler;!function(t){function e(t,e){function n(e){function r(t,e){return s?o.remove(c):u=!0,i(e,n),Se}var s=!1,u=!1,c=t.schedule(e,r);u||(o.add(c),s=!0)}var r=e[0],i=e[1],o=new ge;return i(r,n),o}function n(t,e){function n(e,r){function s(t,e){return u?o.remove(a):c=!0,i(e,n),Se}var u=!1,c=!1,a=t.scheduleFuture(e,r,s);c||(o.add(a),u=!0)}var r=e[0],i=e[1],o=new ge;return i(r,n),o}t.scheduleRecursive=function(t,n){return this.schedule([t,n],e)},t.scheduleRecursiveFuture=function(t,e,r){return this.scheduleFuture([t,r],e,n)}}(Me.prototype),function(t){Me.prototype.schedulePeriodic=function(t,e,n){if("undefined"==typeof yt.setInterval)throw new Rt;e=Te(e);var r=t,i=yt.setInterval(function(){r=n(r)},e);return xe(function(){yt.clearInterval(i)})}}(Me.prototype);var qe,Re,Ve=function(t){function e(){t.call(this)}return me(e,t),e.prototype.schedule=function(t,e){return De(e(this,t))},e}(Me),Fe=Me.immediate=new Ve,Ie=function(t){function e(){for(;r.length>0;){var t=r.dequeue();!t.isCancelled()&&t.invoke()}}function n(){t.call(this)}var r;return me(n,t),n.prototype.schedule=function(t,n){var i=new Ae(this,t,n,this.now());if(r)r.enqueue(i);else{r=new He(4),r.enqueue(i);var o=jt(e)();r=null,o===Dt&&l(o.e)}return i.disposable},n.prototype.scheduleRequired=function(){return!r},n}(Me),Ue=Me.currentThread=new Ie,ze=(mt.internals.SchedulePeriodicRecursive=function(){function t(t){return function(e,n){n(0,t._period);var r=jt(t._action)(t._state);r===Dt&&(t._cancel.dispose(),l(r.e)),t._state=r}}function e(t,e,n,r){this._scheduler=t,this._state=e,this._period=n,this._action=r}return e.prototype.start=function(){var e=new je;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveFuture(0,this._period,t(this))),e},e}(),function(){var t,e=_t;if(yt.setTimeout)t=yt.setTimeout,e=yt.clearTimeout;else{if(!yt.WScript)throw new Rt;t=function(t,e){yt.WScript.Sleep(e),t()}}return{setTimeout:t,clearTimeout:e}}()),We=ze.setTimeout,Be=ze.clearTimeout;!function(){function t(e){if(i)We(function(){t(e)},0);else{var n=r[e];if(n){i=!0;var o=jt(n)();Re(e),i=!1,o===Dt&&l(o.e)}}}function e(){if(!yt.postMessage||yt.importScripts)return!1;var t=!1,e=yt.onmessage;return yt.onmessage=function(){t=!0},yt.postMessage("","*"),yt.onmessage=e,t}var n=1,r={},i=!1;Re=function(t){delete r[t]};var s=new RegExp("^"+String(ie).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),u="function"==typeof(u=ht&&vt&&ht.setImmediate)&&!s.test(u)&&u;if(Ot(u))qe=function(e){var i=n++;return r[i]=e,u(function(){t(i)}),i};else if("undefined"!=typeof o&&"[object process]"==={}.toString.call(o))qe=function(e){var i=n++;return r[i]=e,o.nextTick(function(){t(i)}),i};else if(e()){var c="ms.rx.schedule"+Math.random(),a=function(e){"string"==typeof e.data&&e.data.substring(0,c.length)===c&&t(e.data.substring(c.length))};yt.addEventListener("message",a,!1),qe=function(t){var e=n++;return r[e]=t,yt.postMessage(c+currentId,"*"),e}}else if(yt.MessageChannel){var p=new yt.MessageChannel;p.port1.onmessage=function(e){t(e.data)},qe=function(t){var e=n++;return r[e]=t,p.port2.postMessage(e),e}}else qe="document"in yt&&"onreadystatechange"in yt.document.createElement("script")?function(e){var i=yt.document.createElement("script"),o=n++;return r[o]=e,i.onreadystatechange=function(){t(o),i.onreadystatechange=null,i.parentNode.removeChild(i),i=null},yt.document.documentElement.appendChild(i),o}:function(e){var i=n++;return r[i]=e,We(function(){t(i)},0),i}}();var Ze=function(t){function e(){t.call(this)}function n(t,e,n,r){return function(){!t.isDisposed&&t.setDisposable(Ce._fixup(e(n,r)))}}function r(t,e){this._id=e,this._method=t,this.isDisposed=!1}return me(e,t),r.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._method.call(null,this._id))},e.prototype.schedule=function(t,e){var i=new je,o=qe(n(i,e,this,t));return new ke(i,new r(Re,o))},e.prototype._scheduleFuture=function(t,e,i){if(0===e)return this.schedule(t,i);var o=new je,s=We(n(o,i,this,t),e);return new ke(o,new r(Be,s))},e}(Me),Ke=Me["default"]=Me.async=new Ze;x.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var He=mt.internals.PriorityQueue=function(t){this.items=new Array(t),this.length=0},Qe=He.prototype;Qe.isHigherPriority=function(t,e){return this.items[t].compareTo(this.items[e])<0},Qe.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},Qe.heapify=function(t){if(+t||(t=0),!(t>=this.length||0>t)){var e=2*t+1,n=2*t+2,r=t;if(e0&&(t=!this.isAcquired,this.isAcquired=!0),t&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(this,function(t,e){var n;if(!(t.queue.length>0))return void(t.isAcquired=!1);n=t.queue.shift();var r=jt(n)();return r===Dt?(t.queue=[],t.hasFaulted=!0,l(r.e)):void e(t)}))},e.prototype.dispose=function(){t.prototype.dispose.call(this),this.disposable.dispose()},e}(sn),ln=mt.ObservableBase=function(t){function e(t){return t&&Ot(t.dispose)?t:Ot(t)?xe(t):Se}function n(t,n){var r=n[0],i=n[1],o=jt(i.subscribeCore).call(i,r);o!==Dt||r.fail(Dt.e)||l(Dt.e),r.setDisposable(e(o))}function r(){t.call(this)}return me(r,t),r.prototype._subscribe=function(t){var e=new ei(t),r=[e,this];return Ue.scheduleRequired()?Ue.schedule(r,n):n(null,r),e},r.prototype.subscribeCore=Ft,r}(cn),pn=mt.FlatMapObservable=function(t){function e(e,n,r,i){this.resultSelector=Ot(r)?r:null,this.selector=Zt(Ot(n)?n:function(){return n},i,3),this.source=e,t.call(this)}function n(t,e,n,r){this.i=0,this.selector=e,this.resultSelector=n,this.source=r,this.o=t,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.selector,this.resultSelector,this))},me(n,sn),n.prototype._wrapResult=function(t,e,n){return this.resultSelector?t.map(function(t,r){return this.resultSelector(e,t,n,r)},this):t},n.prototype.next=function(t){var e=this.i++,n=jt(this.selector)(t,e,this.source);return n===Dt?this.o.onError(n.e):(Et(n)&&(n=Vr(n)),(Wt(n)||zt(n))&&(n=cn.from(n)),void this.o.onNext(this._wrapResult(n,t,e)))},n.prototype.error=function(t){this.o.onError(t)},n.prototype.onCompleted=function(){this.o.onCompleted()},e}(ln),hn=mt.internals.Enumerable=function(){};S.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._s.isDisposed=!0)};var fn=function(t){function e(e){this.sources=e,t.call(this)}function n(t,e,n){this._o=t,this._s=e,this._e=n,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e={isDisposed:!1},r=new Ne,i=Ue.scheduleRecursive(this.sources[It](),function(i,o){if(!e.isDisposed){var s=jt(i.next).call(i);if(s===Dt)return t.onError(s.e);if(s.done)return t.onCompleted();var u=s.value;Et(u)&&(u=Vr(u));var c=new je;r.setDisposable(c),c.setDisposable(u.subscribe(new n(t,o,i)))}});return new Pe([r,i,new S(e)])},me(n,sn),n.prototype.onNext=function(t){this._o.onNext(t)},n.prototype.onError=function(t){this._o.onError(t)},n.prototype.onCompleted=function(){this._s(this._e)},e}(ln);hn.prototype.concat=function(){return new fn(this)};var dn=function(t){function e(e){this.sources=e,t.call(this)}function n(t,e){this._o=t,this._recurse=e,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=this.sources[It](),r={isDisposed:!1},i=new Ne,o=Ue.scheduleRecursive(null,function(o,s){if(!r.isDisposed){var u=jt(e.next).call(e);if(u===Dt)return t.onError(u.e);if(u.done)return null!==o?t.onError(o):t.onCompleted();var c=u.value;Et(c)&&(c=Vr(c));var a=new je;i.setDisposable(a),a.setDisposable(c.subscribe(new n(t,s)))}});return new Pe([i,o,new S(r)])},me(n,sn),n.prototype.next=function(t){this._o.onNext(t)},n.prototype.error=function(t){this._recurse(t)},n.prototype.completed=function(){this._o.onCompleted()},e}(ln);hn.prototype.catchError=function(){return new dn(this)},hn.prototype.catchErrorWhen=function(t){var e=this;return new ti(function(n){var r,i=new ri,o=new ri,s=t(i),u=s.subscribe(o),c=e[It](),a={isDisposed:!1},l=new Ne,p=Ue.scheduleRecursive(null,function(t,e){if(!a.isDisposed){var s=jt(c.next).call(c);if(s===Dt)return n.onError(s.e);if(s.done)return void(r?n.onError(r):n.onCompleted());var u=s.value;Et(u)&&(u=Vr(u));var p=new je,h=new je;l.setDisposable(new ke(h,p)),p.setDisposable(u.subscribe(function(t){n.onNext(t)},function(t){h.setDisposable(o.subscribe(e,function(t){n.onError(t)},function(){n.onCompleted()})),i.onNext(t)},function(){n.onCompleted()}))}});return new Pe([u,l,p,new S(a)])})};var vn=function(t){function e(t,e){this.v=t,this.c=null==e?-1:e}function n(t){this.v=t.v,this.l=t.c}return me(e,t),e.prototype[It]=function(){return new n(this)},n.prototype.next=function(){return 0===this.l?Ut:(this.l>0&&this.l--,{done:!1,value:this.v})},e}(hn),bn=hn.repeat=function(t,e){return new vn(t,e)},yn=function(t){function e(t,e,n){this.s=t,this.fn=e?Zt(e,n,3):null}function n(t){this.i=-1,this.s=t.s,this.l=this.s.length,this.fn=t.fn}return me(e,t),e.prototype[It]=function(){return new n(this)},n.prototype.next=function(){return++this.in;n++)e[n]=arguments[n];return new Nn(e,Ue)},cn.ofWithScheduler=function(t){for(var e=arguments.length,n=new Array(e-1),r=1;e>r;r++)n[r-1]=arguments[r];return new Nn(n,t)};var Tn=function(t){function e(e,n){this.obj=e,this.keys=Object.keys(e),this.scheduler=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new R(t,this);return e.run()},e}(ln);R.prototype.run=function(){function t(t,o){if(i>t){var s=r[t];e.onNext([s,n[s]]),o(t+1)}else e.onCompleted()}var e=this.observer,n=this.parent.obj,r=this.parent.keys,i=r.length;return this.parent.scheduler.scheduleRecursive(0,t)},cn.pairs=function(t,e){return e||(e=Ue),new Tn(t,e)};var Ln=function(t){function e(e,n,r){this.start=e,this.rangeCount=n,this.scheduler=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new qn(t,this);return e.run()},e}(ln),qn=function(){function t(t,e){this.observer=t,this.parent=e}function e(t,e,n){return function(r,i){e>r?(n.onNext(t+r),i(r+1)):n.onCompleted()}}return t.prototype.run=function(){return this.parent.scheduler.scheduleRecursive(0,e(this.parent.start,this.parent.rangeCount,this.observer))},t}();cn.range=function(t,e,n){return Le(n)||(n=Ue),new Ln(t,e,n)};var Rn=function(t){function e(e,n,r){this.value=e,this.repeatCount=null==n?-1:n,this.scheduler=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new V(t,this);return e.run()},e}(ln);V.prototype.run=function(){function t(t,r){return(-1===t||t>0)&&(e.onNext(n),t>0&&t--),0===t?e.onCompleted():void r(t)}var e=this.observer,n=this.parent.value;return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount,t)},cn.repeat=function(t,e,n){return Le(n)||(n=Ue),new Rn(t,e,n)};var Vn=function(t){function e(e,n){this.value=e,this.scheduler=n,t.call(this)}function n(t,e,n){this.observer=t,this.value=e,this.scheduler=n}function r(t,e){var n=e[0],r=e[1];return r.onNext(n),r.onCompleted(),Se}return me(e,t),e.prototype.subscribeCore=function(t){var e=new n(t,this.value,this.scheduler);return e.run()},n.prototype.run=function(){var t=[this.value,this.observer];return this.scheduler===Fe?r(null,t):this.scheduler.schedule(t,r)},e}(ln),Fn=(cn["return"]=cn.just=function(t,e){return Le(e)||(e=Fe),new Vn(t,e)},function(t){function e(e,n){this.error=e,this.scheduler=n,t.call(this)}function n(t,e){this.o=t,this.p=e}function r(t,e){var n=e[0],r=e[1];r.onError(n)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new n(t,this);return e.run()},n.prototype.run=function(){return this.p.scheduler.schedule([this.p.error,this.o],r)},e}(ln)),In=cn["throw"]=function(t,e){return Le(e)||(e=Fe),new Fn(t,e)},Un=function(t){function e(e,n){this.source=e,this._fn=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new je,n=new Ne;return n.setDisposable(e),e.setDisposable(this.source.subscribe(new zn(t,n,this._fn))),n},e}(ln),zn=function(t){function e(e,n,r){this._o=e,this._s=n,this._fn=r,t.call(this)}return me(e,t),e.prototype.next=function(t){this._o.onNext(t)},e.prototype.completed=function(){return this._o.onCompleted()},e.prototype.error=function(t){var e=jt(this._fn)(t);if(e===Dt)return this._o.onError(e.e);Et(e)&&(e=Vr(e));var n=new je;this._s.setDisposable(n),n.setDisposable(e.subscribe(this._o))},e}(sn);$e["catch"]=function(t){return Ot(t)?new Un(this,t):Wn([this,t])};var Wn=cn["catch"]=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{var e=arguments.length;t=new Array(e);for(var n=0;e>n;n++)t[n]=arguments[n]}return mn(t).catchError()};$e.combineLatest=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return Array.isArray(e[0])?e[0].unshift(this):e.unshift(this),Kn.apply(this,e)};var Bn=function(t){function e(e,n){this._params=e,this._cb=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){for(var e=this._params.length,n=new Array(e),r={hasValue:C(e,F),hasValueAll:!1,isDone:C(e,F),values:new Array(e)},i=0;e>i;i++){var o=this._params[i],s=new je;n[i]=s,Et(o)&&(o=Vr(o)),s.setDisposable(o.subscribe(new Zn(t,i,this._cb,r)))}return new Pe(n)},e}(ln),Zn=function(t){function e(e,n,r,i){this._o=e,this._i=n,this._cb=r,this._state=i,t.call(this)}function n(t){return function(e,n){return n!==t}}return me(e,t),e.prototype.next=function(t){if(this._state.values[this._i]=t,this._state.hasValue[this._i]=!0,this._state.hasValueAll||(this._state.hasValueAll=this._state.hasValue.every(gt))){var e=jt(this._cb).apply(null,this._state.values);if(e===Dt)return this._o.onError(e.e);this._o.onNext(e)}else this._state.isDone.filter(n(this._i)).every(gt)&&this._o.onCompleted()},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._state.isDone[this._i]=!0,this._state.isDone.every(gt)&&this._o.onCompleted()},e}(sn),Kn=cn.combineLatest=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=Ot(e[t-1])?e.pop():I;return Array.isArray(e[0])&&(e=e[0]),new Bn(e,r)};$e.concat=function(){for(var t=[],e=0,n=arguments.length;n>e;e++)t.push(arguments[e]);return t.unshift(this),Qn.apply(null,t)};var Hn=function(t){function e(e){this.sources=e,t.call(this)}function n(t,e){this.sources=t,this.o=e}return me(e,t),e.prototype.subscribeCore=function(t){var e=new n(this.sources,t);return e.run()},n.prototype.run=function(){var t,e=new Ne,n=this.sources,r=n.length,i=this.o,o=Fe.scheduleRecursive(0,function(o,s){if(!t){if(o===r)return i.onCompleted();var u=n[o];Et(u)&&(u=Vr(u));var c=new je;e.setDisposable(c),c.setDisposable(u.subscribe(function(t){i.onNext(t)},function(t){i.onError(t)},function(){s(o+1)}))}});return new ge(e,o,xe(function(){t=!0}))},e}(ln),Qn=cn.concat=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{t=new Array(arguments.length);for(var e=0,n=arguments.length;n>e;e++)t[e]=arguments[e]}return new Hn(t)};$e.concatAll=function(){return this.merge(1)};var $n=function(t){function e(e,n){this.source=e,this.maxConcurrent=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new ge;return e.add(this.source.subscribe(new Yn(t,this.maxConcurrent,e))),e},e}(ln),Yn=function(){function t(t,e,n){this.o=t,this.max=e,this.g=n,this.done=!1,this.q=[],this.activeCount=0,this.isStopped=!1}function e(t,e){this.parent=t,this.sad=e,this.isStopped=!1}return t.prototype.handleSubscribe=function(t){var n=new je;this.g.add(n),Et(t)&&(t=Vr(t)),n.setDisposable(t.subscribe(new e(this,n)))},t.prototype.onNext=function(t){this.isStopped||(this.activeCount0?t.handleSubscribe(t.q.shift()):(t.activeCount--,t.done&&0===t.activeCount&&t.o.onCompleted())}},e.prototype.dispose=function(){this.isStopped=!0},e.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},t}();$e.merge=function(t){return"number"!=typeof t?Gn(this,t):new $n(this,t)};var Gn=cn.merge=function(){var t,e,n=[],r=arguments.length;if(arguments[0])if(Le(arguments[0]))for(t=arguments[0],e=1;r>e;e++)n.push(arguments[e]);else for(t=Fe,e=0;r>e;e++)n.push(arguments[e]);else for(t=Fe,e=1;r>e;e++)n.push(arguments[e]);return Array.isArray(n[0])&&(n=n[0]),L(t,n).mergeAll()},Jn=mt.CompositeError=function(t){this.innerErrors=t,this.message="This contains multiple errors. Check the innerErrors",Error.call(this)};Jn.prototype=Object.create(Error.prototype),Jn.prototype.name="CompositeError";var Xn=function(t){function e(e){this.source=e,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new ge,n=new je,r={isStopped:!1,errors:[],o:t};return e.add(n),n.setDisposable(this.source.subscribe(new tr(e,r))),e},e}(ln),tr=function(t){function e(e,n){this._group=e,this._state=n,t.call(this)}function n(t,e){0===e.length?t.onCompleted():1===e.length?t.onError(e[0]):t.onError(new Jn(e))}function r(e,n,r){this._inner=e,this._group=n,this._state=r,t.call(this)}return me(e,t),e.prototype.next=function(t){var e=new je;this._group.add(e),Et(t)&&(t=Vr(t)),e.setDisposable(t.subscribe(new r(e,this._group,this._state)))},e.prototype.error=function(t){this._state.errors.push(t),this._state.isStopped=!0,1===this._group.length&&n(this._state.o,this._state.errors)},e.prototype.completed=function(){this._state.isStopped=!0,1===this._group.length&&n(this._state.o,this._state.errors)},me(r,t),r.prototype.next=function(t){this._state.o.onNext(t)},r.prototype.error=function(t){this._state.errors.push(t),this._group.remove(this._inner),this._state.isStopped&&1===this._group.length&&n(this._state.o,this._state.errors)},r.prototype.completed=function(){this._group.remove(this._inner),this._state.isStopped&&1===this._group.length&&n(this._state.o,this._state.errors)},e}(sn);cn.mergeDelayError=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{var e=arguments.length;t=new Array(e);for(var n=0;e>n;n++)t[n]=arguments[n]}var r=L(null,t);return new Xn(r)};var er=function(t){function e(e){this.source=e,t.call(this)}function n(t,e){this.o=t,this.g=e,this.isStopped=!1,this.done=!1}function r(t,e){this.parent=t,this.sad=e,this.isStopped=!1}return me(e,t),e.prototype.subscribeCore=function(t){var e=new ge,r=new je;return e.add(r),r.setDisposable(this.source.subscribe(new n(t,e))),e},n.prototype.onNext=function(t){if(!this.isStopped){var e=new je;this.g.add(e),Et(t)&&(t=Vr(t)),e.setDisposable(t.subscribe(new r(this,e)))}},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.done=!0,1===this.g.length&&this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},r.prototype.onNext=function(t){this.isStopped||this.parent.o.onNext(t)},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.parent.o.onError(t))},r.prototype.onCompleted=function(){if(!this.isStopped){var t=this.parent;this.isStopped=!0,t.g.remove(this.sad),t.done&&1===t.g.length&&t.o.onCompleted()}},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},e}(ln);$e.mergeAll=function(){return new er(this)};var nr=function(t){function e(e,n){this._s=e, +this._o=Et(n)?Vr(n):n,this._open=!1,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new je;e.setDisposable(this._s.subscribe(new rr(t,this))),Et(this._o)&&(this._o=Vr(this._o));var n=new je;return n.setDisposable(this._o.subscribe(new ir(t,this,n))),new ke(e,n)},e}(ln),rr=function(t){function e(e,n){this._o=e,this._p=n,t.call(this)}return me(e,t),e.prototype.next=function(t){this._p._open&&this._o.onNext(t)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.onCompleted=function(){this._p._open&&this._o.onCompleted()},e}(sn),ir=function(t){function e(e,n,r){this._o=e,this._p=n,this._r=r,t.call(this)}return me(e,t),e.prototype.next=function(){this._p._open=!0,this._r.dispose()},e.prototype.error=function(t){this._o.onError(t)},e.prototype.onCompleted=function(){this._r.dispose()},e}(sn);$e.skipUntil=function(t){return new nr(this,t)};var or=function(t){function e(e){this.source=e,t.call(this)}function n(t,e){this.o=t,this.inner=e,this.stopped=!1,this.latest=0,this.hasLatest=!1,sn.call(this)}function r(t,e){this.parent=t,this.id=e,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new Ne,r=this.source.subscribe(new n(t,e));return new ke(r,e)},me(n,sn),n.prototype.next=function(t){var e=new je,n=++this.latest;this.hasLatest=!0,this.inner.setDisposable(e),Et(t)&&(t=Vr(t)),e.setDisposable(t.subscribe(new r(this,n)))},n.prototype.error=function(t){this.o.onError(t)},n.prototype.completed=function(){this.stopped=!0,!this.hasLatest&&this.o.onCompleted()},me(r,sn),r.prototype.next=function(t){this.parent.latest===this.id&&this.parent.o.onNext(t)},r.prototype.error=function(t){this.parent.latest===this.id&&this.parent.o.onError(t)},r.prototype.completed=function(){this.parent.latest===this.id&&(this.parent.hasLatest=!1,this.parent.isStopped&&this.parent.o.onCompleted())},e}(ln);$e["switch"]=$e.switchLatest=function(){return new or(this)};var sr=function(t){function e(e,n){this.source=e,this.other=Et(n)?Vr(n):n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return new ke(this.source.subscribe(t),this.other.subscribe(new ur(t)))},e}(ln),ur=function(t){function e(e){this._o=e,t.call(this)}return me(e,t),e.prototype.next=function(){this._o.onCompleted()},e.prototype.error=function(t){this._o.onError(t)},e.prototype.onCompleted=_t,e}(sn);$e.takeUntil=function(t){return new sr(this,t)};var cr=function(t){function e(e,n,r){this._s=e,this._ss=n,this._cb=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){for(var e=this._ss.length,n={hasValue:C(e,F),hasValueAll:!1,values:new Array(e)},r=this._ss.length,i=new Array(r+1),o=0;r>o;o++){var s=this._ss[o],u=new je;Et(s)&&(s=Vr(s)),u.setDisposable(s.subscribe(new ar(t,o,n))),i[o]=u}var u=new je;return u.setDisposable(this._s.subscribe(new lr(t,this._cb,n))),i[r]=u,new Pe(i)},e}(ln),ar=function(t){function e(e,n,r){this._o=e,this._i=n,this._state=r,t.call(this)}return me(e,t),e.prototype.next=function(t){this._state.values[this._i]=t,this._state.hasValue[this._i]=!0,this._state.hasValueAll=this._state.hasValue.every(gt)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=_t,e}(sn),lr=function(t){function e(e,n,r){this._o=e,this._cb=n,this._state=r,t.call(this)}return me(e,t),e.prototype.next=function(t){var e=[t].concat(this._state.values);if(this._state.hasValueAll){var n=jt(this._cb).apply(null,e);return n===Dt?this._o.onError(n.e):void this._o.onNext(n)}},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.withLatestFrom=function(){if(0===arguments.length)throw new Error("invalid arguments");for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=Ot(e[t-1])?e.pop():I;return Array.isArray(e[0])&&(e=e[0]),new cr(this,e,r)};var pr=function(t){function e(e,n){this._s=e,this._cb=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=this._s.length,n=new Array(e);done=C(e,F),q=C(e,U);for(var r=0;e>r;r++){var i=this._s[r],o=new je;n[r]=o,Et(i)&&(i=Vr(i)),o.setDisposable(i.subscribe(new hr(t,r,this,q,done)))}return new Pe(n)},e}(ln),hr=function(t){function e(e,n,r,i,o){this._o=e,this._i=n,this._p=r,this._q=i,this._d=o,t.call(this)}function n(t){return t.length>0}function r(t){return t.shift()}function i(t){return function(e,n){return n!==t}}return me(e,t),e.prototype.next=function(t){if(this._q[this._i].push(t),this._q.every(n)){var e=this._q.map(r),o=jt(this._p._cb).apply(null,e);if(o===Dt)return this._o.onError(o.e);this._o.onNext(o)}else this._d.filter(i(this._i)).every(gt)&&this._o.onCompleted()},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._d[this._i]=!0,this._d.every(gt)&&this._o.onCompleted()},e}(sn);$e.zip=function(){if(0===arguments.length)throw new Error("invalid arguments");for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=Ot(e[t-1])?e.pop():I;Array.isArray(e[0])&&(e=e[0]);var i=this;return e.unshift(i),new pr(e,r)},cn.zip=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];Array.isArray(e[0])&&(e=Ot(e[1])?e[0].concat(e[1]):e[0]);var r=e.shift();return r.zip.apply(r,e)},$e.zipIterable=function(){if(0===arguments.length)throw new Error("invalid arguments");for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=Ot(e[t-1])?e.pop():I,i=this;return e.unshift(i),new ti(function(t){for(var n=e.length,o=C(n,U),s=C(n,F),u=new Array(n),c=0;n>c;c++)!function(n){var c=e[n],a=new je;(Wt(c)||zt(c))&&(c=jn(c)),a.setDisposable(c.subscribe(function(e){if(o[n].push(e),o.every(function(t){return t.length>0})){var u=o.map(function(t){return t.shift()}),c=jt(r).apply(i,u);if(c===Dt)return t.onError(c.e);t.onNext(c)}else s.filter(function(t,e){return e!==n}).every(gt)&&t.onCompleted()},function(e){t.onError(e)},function(){s[n]=!0,s.every(gt)&&t.onCompleted()})),u[n]=a}(c);return new ge(u)},i)},$e.asObservable=function(){return new ti(z(this),this)};var fr=function(t){function e(e){this.source=e,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new dr(t))},e}(ln),dr=function(t){function e(e){this._o=e,t.call(this)}return me(e,t),e.prototype.next=function(t){t.accept(this._o)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.dematerialize=function(){return new fr(this)};var vr=function(t){function e(e,n,r){this.source=e,this.keyFn=n,this.comparer=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new br(t,this.keyFn,this.comparer))},e}(ln),br=function(t){function e(e,n,r){this.o=e,this.keyFn=n,this.comparer=r,this.hasCurrentKey=!1,this.currentKey=null,t.call(this)}return me(e,t),e.prototype.next=function(t){var e,n=t;return Ot(this.keyFn)&&(n=jt(this.keyFn)(t),n===Dt)?this.o.onError(n.e):this.hasCurrentKey&&(e=jt(this.comparer)(this.currentKey,n),e===Dt)?this.o.onError(e.e):void(this.hasCurrentKey&&e||(this.hasCurrentKey=!0,this.currentKey=n,this.o.onNext(t)))},e.prototype.error=function(t){this.o.onError(t)},e.prototype.completed=function(){this.o.onCompleted()},e}(sn);$e.distinctUntilChanged=function(t,e){return e||(e=Ct),new vr(this,t,e)};var yr=function(t){function e(e,n,r,i){this.source=e,this._oN=n,this._oE=r,this._oC=i,t.call(this)}function n(t,e){this.o=t,this.t=!e._oN||Ot(e._oN)?on(e._oN||_t,e._oE||_t,e._oC||_t):e._oN,this.isStopped=!1,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this))},me(n,sn),n.prototype.next=function(t){var e=jt(this.t.onNext).call(this.t,t);e===Dt&&this.o.onError(e.e),this.o.onNext(t)},n.prototype.error=function(t){var e=jt(this.t.onError).call(this.t,t);return e===Dt?this.o.onError(e.e):void this.o.onError(t)},n.prototype.completed=function(){var t=jt(this.t.onCompleted).call(this.t);return t===Dt?this.o.onError(t.e):void this.o.onCompleted()},e}(ln);$e["do"]=$e.tap=$e.doAction=function(t,e,n){return new yr(this,t,e,n)},$e.doOnNext=$e.tapOnNext=function(t,e){return this.tap("undefined"!=typeof e?function(n){t.call(e,n)}:t)},$e.doOnError=$e.tapOnError=function(t,e){return this.tap(_t,"undefined"!=typeof e?function(n){t.call(e,n)}:t)},$e.doOnCompleted=$e.tapOnCompleted=function(t,e){return this.tap(_t,null,"undefined"!=typeof e?function(){t.call(e)}:t)},$e["finally"]=function(t){var e=this;return new ti(function(n){var r=jt(e.subscribe).call(e,n);return r===Dt?(t(),l(r.e)):xe(function(){var e=jt(r.dispose).call(r);t(),e===Dt&&l(e.e)})},this)};var mr=function(t){function e(e){this.source=e,t.call(this)}function n(t){this.o=t,this.isStopped=!1}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t))},n.prototype.onNext=_t,n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.observer.onError(t),!0)},e}(ln);$e.ignoreElements=function(){return new mr(this)};var _r=function(t){function e(e,n){this.source=e,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new gr(t))},e}(ln),gr=function(t){function e(e){this._o=e,t.call(this)}return me(e,t),e.prototype.next=function(t){this._o.onNext(tn(t))},e.prototype.error=function(t){this._o.onNext(en(t)),this._o.onCompleted()},e.prototype.completed=function(){this._o.onNext(nn()),this._o.onCompleted()},e}(sn);$e.materialize=function(){return new _r(this)},$e.repeat=function(t){return bn(this,t).concat()},$e.retry=function(t){return bn(this,t).catchError()},$e.retryWhen=function(t){return bn(this).catchErrorWhen(t)};var wr=function(t){function e(e,n,r,i){this.source=e,this.accumulator=n,this.hasSeed=r,this.seed=i,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new Cr(t,this))},e}(ln),Cr=function(t){function e(e,n){this._o=e,this._p=n,this._fn=n.accumulator,this._hs=n.hasSeed,this._s=n.seed,this._ha=!1,this._a=null,this._hv=!1,this._i=0,t.call(this)}return me(e,t),e.prototype.next=function(t){return!this._hv&&(this._hv=!0),this._ha?this._a=jt(this._fn)(this._a,t,this._i,this._p):(this._a=this._hs?jt(this._fn)(this._s,t,this._i,this._p):t,this._ha=!0),this._a===Dt?this._o.onError(this._a.e):(this._o.onNext(this._a),void this._i++)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){!this._hv&&this._hs&&this._o.onNext(this._s),this._o.onCompleted()},e}(sn);$e.scan=function(){var t,e=!1,n=arguments[0];return 2===arguments.length&&(e=!0,t=arguments[1]),new wr(this,n,e,t)};var xr=function(t){function e(e,n){this.source=e,this._c=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new Sr(t,this._c))},e}(ln),Sr=function(t){function e(e,n){this._o=e,this._c=n,this._q=[],t.call(this)}return me(e,t),e.prototype.next=function(t){this._q.push(t),this._q.length>this._c&&this._o.onNext(this._q.shift())},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.skipLast=function(t){if(0>t)throw new qt;return new xr(this,t)},$e.startWith=function(){var t,e=0;arguments.length&&Le(arguments[0])?(t=arguments[0],e=1):t=Fe;for(var n=[],r=e,i=arguments.length;i>r;r++)n.push(arguments[r]);return mn([kn(n,t),this]).concat()};var Er=function(t){function e(e,n){this._o=e,this._c=n,this._q=[],t.call(this)}return me(e,t),e.prototype.next=function(t){this._q.push(t),this._q.length>this._c&&this._q.shift()},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){for(;this._q.length>0;)this._o.onNext(this._q.shift());this._o.onCompleted()},e}(sn);$e.takeLast=function(t){if(0>t)throw new qt;var e=this;return new ti(function(n){return e.subscribe(new Er(n,t))},e)},$e.flatMapConcat=$e.concatMap=function(t,e,n){return new pn(this,t,e,n).merge(1)};var Or=function(t){function e(e,n,r){this.source=e,this.selector=Zt(n,r,3),t.call(this)}function n(t,e){return function(n,r,i){return t.call(this,e.selector(n,r,i),r,i)}}function r(t,e,n){this.o=t,this.selector=e,this.source=n,this.i=0,sn.call(this)}return me(e,t),e.prototype.internalMap=function(t,r){return new e(this.source,n(t,this),r)},e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.selector,this))},me(r,sn),r.prototype.next=function(t){var e=jt(this.selector)(t,this.i++,this.source);return e===Dt?this.o.onError(e.e):void this.o.onNext(e)},r.prototype.error=function(t){this.o.onError(t)},r.prototype.completed=function(){this.o.onCompleted()},e}(ln);$e.map=$e.select=function(t,e){var n="function"==typeof t?t:function(){return t};return this instanceof Or?this.internalMap(n,e):new Or(this,n,e)},$e.pluck=function(){var t=arguments.length,e=new Array(t);if(0===t)throw new Error("List of properties cannot be empty.");for(var n=0;t>n;n++)e[n]=arguments[n];return this.map(W(e,t))},$e.flatMap=$e.selectMany=function(t,e,n){return new pn(this,t,e,n).mergeAll()},mt.Observable.prototype.flatMapLatest=function(t,e,n){return new pn(this,t,e,n).switchLatest()};var Dr=function(t){function e(e,n){this.source=e,this.skipCount=n,t.call(this)}function n(t,e){this.c=e,this.r=e,this.o=t,this.isStopped=!1}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.skipCount))},n.prototype.onNext=function(t){this.isStopped||(this.r<=0?this.o.onNext(t):this.r--)},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ln);$e.skip=function(t){if(0>t)throw new qt;return new Dr(this,t)};var jr=function(t){function e(e,n){this.source=e,this._fn=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new Nr(t,this))},e}(ln),Nr=function(t){function e(e,n){this._o=e,this._p=n,this._i=0,this._r=!1,t.call(this)}return me(e,t),e.prototype.next=function(t){if(!this._r){var e=jt(this._p._fn)(t,this._i++,this._p);if(e===Dt)return this._o.onError(e.e);this._r=!e}this._r&&this._o.onNext(t)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.skipWhile=function(t,e){var n=Zt(t,e,3);return new jr(this,n)};var kr=function(t){function e(e,n){this.source=e,this.takeCount=n,t.call(this)}function n(t,e){this.o=t,this.c=e,this.r=e,this.isStopped=!1}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.takeCount))},n.prototype={onNext:function(t){this.isStopped||this.r-->0&&(this.o.onNext(t),this.r<=0&&this.o.onCompleted())},onError:function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},onCompleted:function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},dispose:function(){this.isStopped=!0},fail:function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)}},e}(ln);$e.take=function(t,e){if(0>t)throw new qt;return 0===t?Sn(e):new kr(this,t)};var Pr=function(t){function e(e,n){this.source=e,this._fn=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new Ar(t,this))},e}(ln),Ar=function(t){function e(e,n){this._o=e,this._p=n,this._i=0,this._r=!0,t.call(this)}return me(e,t),e.prototype.next=function(t){return this._r&&(this._r=jt(this._p._fn)(t,this._i++,this._p),this._r===Dt)?this._o.onError(this._r.e):void(this._r?this._o.onNext(t):this._o.onCompleted())},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.takeWhile=function(t,e){var n=Zt(t,e,3);return new Pr(this,n)};var Mr=function(t){function e(e,n,r){this.source=e,this.predicate=Zt(n,r,3),t.call(this)}function n(t,e){return function(n,r,i){return e.predicate(n,r,i)&&t.call(this,n,r,i)}}function r(t,e,n){this.o=t,this.predicate=e,this.source=n,this.i=0,sn.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.predicate,this))},e.prototype.internalFilter=function(t,r){return new e(this.source,n(t,this),r)},me(r,sn),r.prototype.next=function(t){var e=jt(this.predicate)(t,this.i++,this.source);return e===Dt?this.o.onError(e.e):void(e&&this.o.onNext(t))},r.prototype.error=function(t){this.o.onError(t)},r.prototype.completed=function(){this.o.onCompleted()},e}(ln);$e.filter=$e.where=function(t,e){return this instanceof Mr?this.internalFilter(t,e):new Mr(this,t,e)},cn.fromCallback=function(t,e,n){return function(){"undefined"==typeof e&&(e=this);for(var r=arguments.length,i=new Array(r),o=0;r>o;o++)i[o]=arguments[o];return B(t,e,n,i)}},cn.fromNodeCallback=function(t,e,n){return function(){"undefined"==typeof e&&(e=this);for(var r=arguments.length,i=new Array(r),o=0;r>o;o++)i[o]=arguments[o];return K(t,e,n,i)}},$.prototype.dispose=function(){this.isDisposed||(this._e.removeEventListener(this._n,this._fn,!1),this.isDisposed=!0)},mt.config.useNativeEvents=!1;var Tr=function(t){function e(e,n,r){this._el=e,this._n=n,this._fn=r,t.call(this)}function n(t,e){return function(){var n=arguments[0];return Ot(e)&&(n=jt(e).apply(null,arguments),n===Dt)?t.onError(n.e):void t.onNext(n)}}return me(e,t),e.prototype.subscribeCore=function(t){return Y(this._el,this._n,n(t,this._fn))},e}(ln);cn.fromEvent=function(t,e,n){return t.addListener?qr(function(n){t.addListener(e,n)},function(n){t.removeListener(e,n)},n):mt.config.useNativeEvents||"function"!=typeof t.on||"function"!=typeof t.off?new Tr(t,e,n).publish().refCount():qr(function(n){t.on(e,n)},function(n){t.off(e,n)},n)};var Lr=function(t){function e(e,n,r){this._add=e,this._del=n,this._fn=r,t.call(this)}function n(t,e){return function(){var n=arguments[0];return Ot(e)&&(n=jt(e).apply(null,arguments),n===Dt)?t.onError(n.e):void t.onNext(n)}}function r(t,e,n){this._del=t,this._fn=e,this._ret=n,this.isDisposed=!1}return me(e,t),e.prototype.subscribeCore=function(t){var e=n(t,this._fn),i=this._add(e);return new r(this._del,e,i)},r.prototype.dispose=function(){this.isDisposed||Ot(this._del)&&this._del(this._fn,this._ret)},e}(ln),qr=cn.fromEventPattern=function(t,e,n){return new Lr(t,e,n).publish().refCount()},Rr=function(t){function e(e,n){this._p=e,this._s=n,t.call(this)}function n(t,e){var n=e[0],r=e[1];n.onNext(r),n.onCompleted()}function r(t,e){var n=e[0],r=e[1];n.onError(r)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new je,i=this;return this._p.then(function(r){e.setDisposable(i._s.schedule([t,r],n))},function(n){e.setDisposable(i._s.schedule([t,n],r))}),e},e}(ln),Vr=cn.fromPromise=function(t,e){return e||(e=Ke),new Rr(t,e)};$e.toPromise=function(t){if(t||(t=mt.config.Promise),!t)throw new Rt("Promise type not provided nor in Rx.config.Promise");var e=this;return new t(function(t,n){var r;e.subscribe(function(t){r=t},n,function(){t(r)})})},cn.startAsync=function(t){var e=jt(t)();return e===Dt?In(e.e):Vr(e)};var Fr=function(t){function e(e,n,r){this.source=e,this._fn1=n,this._fn2=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=this.source.multicast(this._fn1());return new ke(this._fn2(e).subscribe(t),e.connect())},e}(ln);$e.multicast=function(t,e){return Ot(t)?new Fr(this,t,e):new Ur(this,t)},$e.publish=function(t){return t&&Ot(t)?this.multicast(function(){return new ri},t):this.multicast(new ri)},$e.share=function(){return this.publish().refCount()},$e.publishLast=function(t){return t&&Ot(t)?this.multicast(function(){return new ii},t):this.multicast(new ii)},$e.publishValue=function(t,e){return 2===arguments.length?this.multicast(function(){return new si(e)},t):this.multicast(new si(t))},$e.shareValue=function(t){return this.publishValue(t).refCount()},$e.replay=function(t,e,n,r){return t&&Ot(t)?this.multicast(function(){return new ui(e,n,r)},t):this.multicast(new ui(e,n,r))},$e.shareReplay=function(t,e,n){return this.replay(null,t,e,n).refCount()};var Ir=function(t){function e(e){this.source=e,this._count=0,this._connectableSubscription=null,t.call(this)}function n(t,e){this._p=t,this._s=e,this.isDisposed=!1}return me(e,t),e.prototype.subscribeCore=function(t){var e=1===++this._count,r=this.source.subscribe(t);return e&&(this._connectableSubscription=this.source.connect()),new n(this,r)},n.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._s.dispose(),0===--this._p._count&&this._p._connectableSubscription.dispose())},e}(ln),Ur=mt.ConnectableObservable=function(t){function e(e,n){this.source=e,this._hasSubscription=!1,this._subscription=null,this._sourceObservable=e.asObservable(),this._subject=n,t.call(this)}function n(t){this._p=t,this.isDisposed=!1}return me(e,t),n.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._p._hasSubscription=!1)},e.prototype.connect=function(){return this._hasSubscription||(this._hasSubscription=!0,this._subscription=new ke(this._sourceObservable.subscribe(this._subject),new n(this))),this._subscription},e.prototype._subscribe=function(t){return this._subject.subscribe(t)},e.prototype.refCount=function(){return new Ir(this)},e}(cn),zr=function(t){function e(e,n){this._dt=e,this._s=n,t.call(this)}function n(t,e){e.onNext(0),e.onCompleted()}return me(e,t),e.prototype.subscribeCore=function(t){return this._s.scheduleFuture(t,this._dt,n)},e}(ln),Wr=cn.interval=function(t,e){return X(t,t,Le(e)?e:Ke)};cn.timer=function(t,e,n){var r;return Le(n)||(n=Ke),null!=e&&"number"==typeof e?r=e:Le(e)&&(n=e),(t instanceof Date||"number"==typeof t)&&r===s?G(t,n):t instanceof Date&&r!==s?J(t.getTime(),e,n):X(t,r,n)};$e.delay=function(){var t=arguments[0];if("number"==typeof t||t instanceof Date){var e=t,n=arguments[1];return Le(n)||(n=Ke),e instanceof Date?et(this,e,n):tt(this,e,n)}if(cn.isObservable(t)||Ot(t))return nt(this,t,arguments[1]);throw new Error("Invalid arguments")};var Br=function(t){function e(e,n,r){Le(r)||(r=Ke),this.source=e,this._dt=n,this._s=r,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){var e=new Ne;return new ke(this.source.subscribe(new Zr(t,this.source,this._dt,this._s,e)),e)},e}(ln),Zr=function(t){function e(e,n,r,i,o){this._o=e,this._s=n,this._d=r,this._scheduler=i,this._c=o,this._v=null,this._hv=!1,this._id=0,t.call(this)}return me(e,t),e.prototype.next=function(t){this._hv=!0,this._v=t;var e=++this._id,n=new je;this._c.setDisposable(n),n.setDisposable(this._scheduler.scheduleFuture(this,this._d,function(n,r){r._hv&&r._id===e&&r._o.onNext(t),r._hv=!1}))},e.prototype.error=function(t){this._c.dispose(),this._o.onError(t),this._hv=!1,this._id++},e.prototype.completed=function(){this._c.dispose(),this._hv&&this._o.onNext(this._v),this._o.onCompleted(),this._hv=!1,this._id++},e}(sn);$e.debounce=function(){if(Ot(arguments[0]))return rt(this,arguments[0]);if("number"==typeof arguments[0])return new Br(this,arguments[0],arguments[1]);throw new Error("Invalid arguments")};var Kr=function(t){function e(e,n){this.source=e,this._s=n,t.call(this)}return me(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new Hr(t,this._s))},e}(ln),Hr=function(t){function e(e,n){this._o=e,this._s=n,t.call(this)}return me(e,t),e.prototype.next=function(t){this._o.onNext({value:t,timestamp:this._s.now()})},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._o.onCompleted()},e}(sn);$e.timestamp=function(t){return Le(t)||(t=Ke),new Kr(this,t)},$e.sample=$e.throttleLatest=function(t,e){return Le(e)||(e=Ke),"number"==typeof t?it(this,Wr(t,e)):it(this,t)};var Qr=mt.TimeoutError=function(t){this.message=t||"Timeout has occurred",this.name="TimeoutError",Error.call(this)};Qr.prototype=Object.create(Error.prototype),$e.timeout=function(){var t=arguments[0];if(t instanceof Date||"number"==typeof t)return st(this,t,arguments[1],arguments[2]);if(cn.isObservable(t)||Ot(t))return ot(this,t,arguments[1],arguments[2]);throw new Error("Invalid arguments")},$e.throttle=function(t,e){Le(e)||(e=Ke);var n=+t||0;if(0>=n)throw new RangeError("windowDuration cannot be less or equal zero.");var r=this;return new ti(function(t){var i=0;return r.subscribe(function(r){var o=e.now();(0===i||o-i>=n)&&(i=o,t.onNext(r))},function(e){t.onError(e)},function(){t.onCompleted()})},r)};var $r=function(t){function e(e,n){this.source=e,this.controller=new ri,n&&n.subscribe?this.pauser=this.controller.merge(n):this.pauser=this.controller,t.call(this)}return me(e,t),e.prototype._subscribe=function(t){var e=this.source.publish(),n=e.subscribe(t),r=Se,i=this.pauser.distinctUntilChanged().subscribe(function(t){t?r=e.connect():(r.dispose(),r=Se)});return new Pe([n,r,i])},e.prototype.pause=function(){this.controller.onNext(!1)},e.prototype.resume=function(){this.controller.onNext(!0)},e}(cn);$e.pausable=function(t){return new $r(this,t)};var Yr=function(t){function e(e,n){this.source=e,this.controller=new ri,n&&n.subscribe?this.pauser=this.controller.merge(n):this.pauser=this.controller,t.call(this)}return me(e,t),e.prototype._subscribe=function(t){function e(){for(;r.length>0;)t.onNext(r.shift())}var n,r=[],i=ut(this.source,this.pauser.startWith(!1).distinctUntilChanged(),function(t,e){return{data:t,shouldFire:e}}).subscribe(function(i){n!==s&&i.shouldFire!==n?(n=i.shouldFire,i.shouldFire&&e()):(n=i.shouldFire,i.shouldFire?t.onNext(i.data):r.push(i.data))},function(n){e(),t.onError(n)},function(){e(),t.onCompleted()});return i},e.prototype.pause=function(){this.controller.onNext(!1)},e.prototype.resume=function(){this.controller.onNext(!0)},e}(cn);$e.pausableBuffered=function(t){return new Yr(this,t)};var Gr=function(t){function e(e,n,r){t.call(this),this.subject=new Jr(n,r),this.source=e.multicast(this.subject).refCount()}return me(e,t),e.prototype._subscribe=function(t){return this.source.subscribe(t)},e.prototype.request=function(t){return this.subject.request(null==t?-1:t)},e}(cn),Jr=function(t){function e(e,n){null==e&&(e=!0),t.call(this),this.subject=new ri,this.enableQueue=e,this.queue=e?[]:null,this.requestedCount=0,this.requestedDisposable=null,this.error=null,this.hasFailed=!1,this.hasCompleted=!1,this.scheduler=n||Ue}return me(e,t),_e(e.prototype,rn,{_subscribe:function(t){return this.subject.subscribe(t)},onCompleted:function(){this.hasCompleted=!0,this.enableQueue&&0!==this.queue.length?this.queue.push(Ye.createOnCompleted()):(this.subject.onCompleted(),this.disposeCurrentRequest())},onError:function(t){this.hasFailed=!0,this.error=t,this.enableQueue&&0!==this.queue.length?this.queue.push(Ye.createOnError(t)):(this.subject.onError(t),this.disposeCurrentRequest())},onNext:function(t){this.requestedCount<=0?this.enableQueue&&this.queue.push(Ye.createOnNext(t)):(0===this.requestedCount--&&this.disposeCurrentRequest(),this.subject.onNext(t))},_processRequest:function(t){if(this.enableQueue)for(;this.queue.length>0&&(t>0||"N"!==this.queue[0].kind);){var e=this.queue.shift();e.accept(this.subject),"N"===e.kind?t--:(this.disposeCurrentRequest(),this.queue=[])}return t},request:function(t){this.disposeCurrentRequest();var e=this;return this.requestedDisposable=this.scheduler.schedule(t,function(t,n){var r=e._processRequest(n),i=e.hasCompleted||e.hasFailed;return!i&&r>0?(e.requestedCount=r,xe(function(){e.requestedCount=0})):void 0}),this.requestedDisposable},disposeCurrentRequest:function(){this.requestedDisposable&&(this.requestedDisposable.dispose(),this.requestedDisposable=null)}}),e}(cn);$e.controlled=function(t,e){return t&&Le(t)&&(e=t,t=!0),null==t&&(t=!0),new Gr(this,t,e)},$e.pipe=function(t){function e(){n.resume()}var n=this.pausableBuffered();return t.addListener("drain",e),n.subscribe(function(e){!t.write(String(e))&&n.pause()},function(e){t.emit("error",e)},function(){!t._isStdio&&t.end(),t.removeListener("drain",e)}),n.resume(),t};var Xr=function(t){function e(e,n){this._o=e,this._xform=n,t.call(this)}return me(e,t),e.prototype.next=function(t){var e=jt(this._xform["@@transducer/step"]).call(this._xform,this._o,t);e===Dt&&this._o.onError(e.e)},e.prototype.error=function(t){this._o.onError(t)},e.prototype.completed=function(){this._xform["@@transducer/result"](this._o)},e}(sn);$e.transduce=function(t){var e=this;return new ti(function(n){var r=t(ct(n));return e.subscribe(new Xr(n,r))},e)};var ti=mt.AnonymousObservable=function(t){function e(t){return t&&Ot(t.dispose)?t:Ot(t)?xe(t):Se}function n(t,n){var r=n[0],i=n[1],o=jt(i.__subscribe).call(i,r);o!==Dt||r.fail(Dt.e)||l(Dt.e),r.setDisposable(e(o))}function r(e,n){this.source=n,this.__subscribe=e,t.call(this)}return me(r,t),r.prototype._subscribe=function(t){var e=new ei(t),r=[e,this];return Ue.scheduleRequired()?Ue.schedule(r,n):n(null,r),e},r}(cn),ei=function(t){function e(e){t.call(this),this.observer=e,this.m=new je}me(e,t);var n=e.prototype;return n.next=function(t){var e=jt(this.observer.onNext).call(this.observer,t);e===Dt&&(this.dispose(),l(e.e))},n.error=function(t){var e=jt(this.observer.onError).call(this.observer,t);this.dispose(),e===Dt&&l(e.e)},n.completed=function(){var t=jt(this.observer.onCompleted).call(this.observer);this.dispose(),t===Dt&&l(t.e)},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(sn),ni=function(t,e){this._s=t,this._o=e};ni.prototype.dispose=function(){if(!this._s.isDisposed&&null!==this._o){var t=this._s.observers.indexOf(this._o);this._s.observers.splice(t,1),this._o=null}};var ri=mt.Subject=function(t){function e(){t.call(this),this.isDisposed=!1,this.isStopped=!1,this.observers=[],this.hasError=!1}return me(e,t),_e(e.prototype,rn.prototype,{_subscribe:function(t){return Oe(this),this.isStopped?this.hasError?(t.onError(this.error),Se):(t.onCompleted(),Se):(this.observers.push(t),new ni(this,t))},hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(Oe(this),!this.isStopped){this.isStopped=!0;for(var t=0,e=c(this.observers),n=e.length;n>t;t++)e[t].onCompleted();this.observers.length=0}},onError:function(t){if(Oe(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;for(var e=0,n=c(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){if(Oe(this),!this.isStopped)for(var e=0,n=c(this.observers),r=n.length;r>e;e++)n[e].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),e.create=function(t,e){return new oi(t,e)},e}(cn),ii=mt.AsyncSubject=function(t){function e(){t.call(this),this.isDisposed=!1,this.isStopped=!1,this.hasValue=!1,this.observers=[],this.hasError=!1}return me(e,t),_e(e.prototype,rn.prototype,{_subscribe:function(t){return Oe(this),this.isStopped?(this.hasError?t.onError(this.error):this.hasValue?(t.onNext(this.value),t.onCompleted()):t.onCompleted(),Se):(this.observers.push(t),new ni(this,t))},hasObservers:function(){return Oe(this),this.observers.length>0},onCompleted:function(){var t,e;if(Oe(this),!this.isStopped){this.isStopped=!0;var n=c(this.observers),e=n.length;if(this.hasValue)for(t=0;e>t;t++){var r=n[t];r.onNext(this.value),r.onCompleted()}else for(t=0;e>t;t++)n[t].onCompleted();this.observers.length=0}},onError:function(t){if(Oe(this),!this.isStopped){this.isStopped=!0,this.hasError=!0,this.error=t;for(var e=0,n=c(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){Oe(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.error=null,this.value=null}}),e}(cn),oi=mt.AnonymousSubject=function(t){function e(e,n){this.observer=e,this.observable=n,t.call(this)}return me(e,t),_e(e.prototype,rn.prototype,{_subscribe:function(t){return this.observable.subscribe(t); +},onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),e}(cn),si=mt.BehaviorSubject=function(t){function e(e){t.call(this),this.value=e,this.observers=[],this.isDisposed=!1,this.isStopped=!1,this.hasError=!1}return me(e,t),_e(e.prototype,rn.prototype,{_subscribe:function(t){return Oe(this),this.isStopped?(this.hasError?t.onError(this.error):t.onCompleted(),Se):(this.observers.push(t),t.onNext(this.value),new ni(this,t))},getValue:function(){if(Oe(this),this.hasError)throw this.error;return this.value},hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(Oe(this),!this.isStopped){this.isStopped=!0;for(var t=0,e=c(this.observers),n=e.length;n>t;t++)e[t].onCompleted();this.observers.length=0}},onError:function(t){if(Oe(this),!this.isStopped){this.isStopped=!0,this.hasError=!0,this.error=t;for(var e=0,n=c(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){if(Oe(this),!this.isStopped){this.value=t;for(var e=0,n=c(this.observers),r=n.length;r>e;e++)n[e].onNext(t)}},dispose:function(){this.isDisposed=!0,this.observers=null,this.value=null,this.error=null}}),e}(cn),ui=mt.ReplaySubject=function(t){function e(t,e){return xe(function(){e.dispose(),!t.isDisposed&&t.observers.splice(t.observers.indexOf(e),1)})}function n(e,n,i){this.bufferSize=null==e?r:e,this.windowSize=null==n?r:n,this.scheduler=i||Ue,this.q=[],this.observers=[],this.isStopped=!1,this.isDisposed=!1,this.hasError=!1,this.error=null,t.call(this)}var r=Math.pow(2,53)-1;return me(n,t),_e(n.prototype,rn.prototype,{_subscribe:function(t){Oe(this);var n=new an(this.scheduler,t),r=e(this,n);this._trim(this.scheduler.now()),this.observers.push(n);for(var i=0,o=this.q.length;o>i;i++)n.onNext(this.q[i].value);return this.hasError?n.onError(this.error):this.isStopped&&n.onCompleted(),n.ensureActive(),r},hasObservers:function(){return this.observers.length>0},_trim:function(t){for(;this.q.length>this.bufferSize;)this.q.shift();for(;this.q.length>0&&t-this.q[0].interval>this.windowSize;)this.q.shift()},onNext:function(t){if(Oe(this),!this.isStopped){var e=this.scheduler.now();this.q.push({interval:e,value:t}),this._trim(e);for(var n=0,r=c(this.observers),i=r.length;i>n;n++){var o=r[n];o.onNext(t),o.ensureActive()}}},onError:function(t){if(Oe(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;var e=this.scheduler.now();this._trim(e);for(var n=0,r=c(this.observers),i=r.length;i>n;n++){var o=r[n];o.onError(t),o.ensureActive()}this.observers.length=0}},onCompleted:function(){if(Oe(this),!this.isStopped){this.isStopped=!0;var t=this.scheduler.now();this._trim(t);for(var e=0,n=c(this.observers),r=n.length;r>e;e++){var i=n[e];i.onCompleted(),i.ensureActive()}this.observers.length=0}},dispose:function(){this.isDisposed=!0,this.observers=null}}),n}(cn);mt.Pauser=function(t){function e(){t.call(this)}return me(e,t),e.prototype.pause=function(){this.onNext(!1)},e.prototype.resume=function(){this.onNext(!0)},e}(ri),yt.Rx=mt,r=function(){return mt}.call(e,n,e,t),!(r!==s&&(t.exports=r));var ci=v()}).call(this)}).call(e,n(34)(t),function(){return this}(),n(6))},function(t,e,n){e=t.exports=n(15)(),e.push([t.id,".climb__wall{width:100%;padding:0;margin:0;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;font-size:100%}.climb__tile,.climb__wall{display:-webkit-flex;display:-ms-flexbox;display:flex}.climb__tile{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:425px;box-sizing:border-box;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;outline:1px solid transparent;margin-bottom:20px;overflow:hidden;text-align:left;border-radius:7px;background-color:#f6f6f6;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.climb__tile__content{z-index:1;padding:26px;background-color:#f6f6f6}.climb__tile--has-no-image .climb__tile__content{height:100%;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;box-sizing:border-box}.climb__tile__image{max-width:100%;position:absolute;top:0;border-top-left-radius:7px;border-top-right-radius:7px}.climb__tile__message{z-index:1;margin-bottom:24px}.climb__tile__message>a{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:260px;display:inline-block;vertical-align:bottom}.climb__tile--has-no-image .climb__tile__message{font-size:185%}.climb__tile__author{display:block;margin:-10px}.climb__tile__author img{border-radius:25px;width:34px}.climb__tile__author .climb__tile__author__username{display:inline-block;margin:0 0 0 10px;line-height:34px;vertical-align:top}.climb-social-badge{position:fixed;bottom:20px;right:20px;z-index:9;background-color:#a9cae2;width:200px;height:66px;border-radius:5px}.climb-social-badge>span{position:absolute!important;top:-9999px!important;left:-9999px!important}",""])},function(t,e){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;ei*l&&(m=0);for(var r=Math.ceil(m/i),o=0;o=m)v[o].nextState=a(i/1e3,p);else for(var _=0;r>_;_++){v[o].nextState=a(i/1e3,f);var g=[f,v[o].nextState];v[o].prevState=g[0],f=g[1]}}m-=r*i;for(var w=1+m/i,o=0;oClimb Logo BetaCreated with Sketch.'},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}}])}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy9yZWFjdC1jbGltYi1zb2NpYWwubWluLmpzIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAzYjMzNTU0NzQ2ZGQyZGU5MDIwMiIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIlJlYWN0XCIsXCJjb21tb25qczJcIjpcInJlYWN0XCIsXCJjb21tb25qc1wiOlwicmVhY3RcIixcImFtZFwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvVGlsZS5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvV2FsbC5qc3giLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3ByZXNldHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vfi9wZXJmb3JtYW5jZS1ub3cvbGliL3BlcmZvcm1hbmNlLW5vdy5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvQXV0aG9yLmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9DbGltYkJhZGdlLmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9JbWFnZS5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvTWVzc2FnZS5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvV2FsbENvbnRhaW5lci5qc3giLCJ3ZWJwYWNrOi8vLy4vfi9jbGltYi1zb2NpYWwvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NsaW1iLXNvY2lhbC9+L3J4LWxpdGUvcngubGl0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc3R5bGUvbWFpbi5zY3NzIiwid2VicGFjazovLy8uL34vY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mZXRjaC1qc29ucC9idWlsZC9mZXRjaC1qc29ucC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LW1vdGlvbi9saWIvYW5pbWF0aW9uTG9vcC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LW1vdGlvbi9saWIvY29tcG9uZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LW1vdGlvbi9saWIvZGVwcmVjYXRlZFNwcmluZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL2hhc1JlYWNoZWRTdHlsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LW1vdGlvbi9saWIvbWVyZ2VEaWZmLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtbW90aW9uL2xpYi9ub1ZlbG9jaXR5LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtbW90aW9uL2xpYi9yZWFjdC1tb3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3Jlb3JkZXJLZXlzLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QtbW90aW9uL2xpYi9zcHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3N0ZXBwZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3N0cmlwU3R5bGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3VwZGF0ZVRyZWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vbGliL3plcm8uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1tb3Rpb24vfi9yYWYvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9zdHlsZS1sb2FkZXIvYWRkU3R5bGVzLmpzIiwid2VicGFjazovLy8uL3NyYy9zdHlsZS9tYWluLnNjc3M/M2FkYiIsIndlYnBhY2s6Ly8vLi9zcmMvaW1nL2NsaW1iX2xvZ28uc3ZnIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanMiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwicmVxdWlyZSIsImRlZmluZSIsImFtZCIsInRoaXMiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzFfXyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaWQiLCJsb2FkZWQiLCJjYWxsIiwibSIsImMiLCJwIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsIl9yZWFjdCIsIl9yZWFjdDIiLCJfY29tcG9uZW50c1dhbGxDb250YWluZXIiLCJfY29tcG9uZW50c1dhbGxDb250YWluZXIyIiwid2luZG93IiwiQ2xpbWIiLCIkdGFyZ2V0cyIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsImkiLCJsZW5ndGgiLCIkaXRlbSIsImNvbGxlY3Rpb25JZCIsImRhdGFzZXQiLCJsaW1pdCIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJXYWxsQ29udGFpbmVyIiwiX2NvbXBvbmVudHNXYWxsIiwiZW51bWVyYWJsZSIsImdldCIsIldhbGwiLCJfY29tcG9uZW50c1RpbGUiLCJUaWxlIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsInByb3RvdHlwZSIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJ0YXJnZXQiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJrZXkiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJfZ2V0IiwiX3giLCJfeDIiLCJfeDMiLCJfYWdhaW4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInJlY2VpdmVyIiwiZGVzYyIsInBhcmVudCIsImdldHRlciIsInVuZGVmaW5lZCIsIkZ1bmN0aW9uIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ2V0UHJvdG90eXBlT2YiLCJfSW1hZ2UiLCJfSW1hZ2UyIiwiX01lc3NhZ2UiLCJfTWVzc2FnZTIiLCJfQXV0aG9yIiwiX0F1dGhvcjIiLCJfUmVhY3QkQ29tcG9uZW50IiwiaW1hZ2UiLCJfcHJvcHMkaW1hZ2UiLCJzcmMiLCJ1cmwiLCJ3aWR0aCIsImhlaWdodCIsIm1lc3NhZ2UiLCJib2R5IiwiY2xhc3NTdHJpbmciLCJzb3VyY2VfdHlwZSIsInZpZGVvX3VybCIsImNyZWF0ZUltYWdlIiwiY3JlYXRlTWVzc2FnZSIsImNyZWF0ZUNsYXNzU3RyaW5nIiwiYXV0aG9yIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJocmVmIiwibGluayIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImlzUmVxdWlyZWQiLCJ0aW1lc3RhbXAiLCJudW1iZXIiLCJzaGFwZSIsInVzZXJuYW1lIiwicGljdHVyZSIsInZpZGVvX3NyYyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsImtleXMiLCJpbmRleE9mIiwiaGFzT3duUHJvcGVydHkiLCJfZXh0ZW5kcyIsImFzc2lnbiIsImFyZ3VtZW50cyIsInNvdXJjZSIsIl9UaWxlIiwiX1RpbGUyIiwiX3JlYWN0TW90aW9uIiwiX0NvbXBvbmVudCIsImFwcGx5IiwiX3RoaXMiLCJjb25maWdzIiwiaXRlbXMiLCJtYXAiLCJvcGFjaXR5Iiwic3ByaW5nIiwibWFyZ2luIiwiaXRlbSIsIml0ZW1WYWx1ZXMiLCJzdHlsZUNvbmZpZyIsIml0ZW1Qcm9wcyIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsIl90aGlzMiIsIlRyYW5zaXRpb25Nb3Rpb24iLCJzdHlsZXMiLCJnZXRTdHlsZXMiLCJiaW5kIiwid2lsbEVudGVyIiwid2lsbExlYXZlIiwidmFsdWVzIiwicmVuZGVyVGlsZSIsIm5vV29iYmxlIiwiZ2VudGxlIiwid29iYmx5Iiwic3RpZmYiLCJwcm9jZXNzIiwiZ2V0TmFub1NlY29uZHMiLCJocnRpbWUiLCJsb2FkVGltZSIsInBlcmZvcm1hbmNlIiwibm93IiwiaHIiLCJEYXRlIiwiZ2V0VGltZSIsImNsZWFuVXBOZXh0VGljayIsImRyYWluaW5nIiwiY3VycmVudFF1ZXVlIiwicXVldWUiLCJjb25jYXQiLCJxdWV1ZUluZGV4IiwiZHJhaW5RdWV1ZSIsInRpbWVvdXQiLCJzZXRUaW1lb3V0IiwibGVuIiwicnVuIiwiY2xlYXJUaW1lb3V0IiwiSXRlbSIsImZ1biIsImFycmF5Iiwibm9vcCIsIm5leHRUaWNrIiwiYXJncyIsIkFycmF5IiwicHVzaCIsInRpdGxlIiwiYnJvd3NlciIsImVudiIsImFyZ3YiLCJ2ZXJzaW9uIiwidmVyc2lvbnMiLCJvbiIsImFkZExpc3RlbmVyIiwib25jZSIsIm9mZiIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZW1pdCIsImJpbmRpbmciLCJuYW1lIiwiRXJyb3IiLCJjd2QiLCJjaGRpciIsImRpciIsInVtYXNrIiwiQXV0aG9yIiwiYWx0IiwiQ2xpbWJCYWRnZSIsImxvZ28iLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsIl9faHRtbCIsIkltYWdlIiwiZGF0YS13aWR0aCIsImRhdGEtaGVpZ2h0IiwiTWVzc2FnZSIsInJlcGxhY2UiLCJfY2xpbWJTb2NpYWwiLCJfY2xpbWJTb2NpYWwyIiwiX1dhbGwiLCJfV2FsbDIiLCJfQ2xpbWJCYWRnZSIsIl9DbGltYkJhZGdlMiIsInN0YXRlIiwiZ2V0U3RyZWFtIiwic3Vic2NyaWJlIiwibWF4U2l6ZSIsInBhcnNlSW50IiwibWFwcGVkSXRlbXMiLCJzcGxpY2UiLCJzZXRTdGF0ZSIsImluaXQiLCJjYiIsIm9uVXBkYXRlIiwib25lT2ZUeXBlIiwiX3J4TGl0ZSIsIl9mZXRjaEpzb25wIiwiX2ZldGNoSnNvbnAyIiwicG9sbFJhdGUiLCJyZXF1ZXN0U3RyZWFtIiwiT2JzZXJ2YWJsZSIsImp1c3QiLCJ1cGRhdGVTdHJlYW0iLCJpbnRlcnZhbCIsInN0YXJ0V2l0aCIsInJlc3BvbnNlU3RyZWFtIiwiY29tYmluZUxhdGVzdCIsInRpY2siLCJmbGF0TWFwIiwiYmFzZVVybCIsInJlcXVlc3RVcmwiLCJmcm9tUHJvbWlzZSIsInRoZW4iLCJyZXNwIiwianNvbiIsIl9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fIiwiZ2xvYmFsIiwiY2hlY2tHbG9iYWwiLCJjbG9uZUFycmF5IiwiYXJyIiwiYSIsInRyeUNhdGNoZXJHZW4iLCJ0cnlDYXRjaFRhcmdldCIsImUiLCJlcnJvck9iaiIsInRocm93ZXIiLCJtYWtlU3RhY2tUcmFjZUxvbmciLCJlcnJvciIsIm9ic2VydmFibGUiLCJoYXNTdGFja3MiLCJzdGFjayIsIlNUQUNLX0pVTVBfU0VQQVJBVE9SIiwic3RhY2tzIiwibyIsInVuc2hpZnQiLCJjb25jYXRlZFN0YWNrcyIsImpvaW4iLCJmaWx0ZXJTdGFja1N0cmluZyIsInN0YWNrU3RyaW5nIiwibGluZXMiLCJzcGxpdCIsImRlc2lyZWRMaW5lcyIsImxpbmUiLCJpc0ludGVybmFsRnJhbWUiLCJpc05vZGVGcmFtZSIsInN0YWNrTGluZSIsImZpbGVOYW1lQW5kTGluZU51bWJlciIsImdldEZpbGVOYW1lQW5kTGluZU51bWJlciIsImZpbGVOYW1lIiwibGluZU51bWJlciIsInJGaWxlTmFtZSIsInJTdGFydGluZ0xpbmUiLCJyRW5kaW5nTGluZSIsImNhcHR1cmVMaW5lIiwiZmlyc3RMaW5lIiwiYXR0ZW1wdDEiLCJleGVjIiwiTnVtYmVyIiwiYXR0ZW1wdDIiLCJhdHRlbXB0MyIsImtleXNJbiIsInJlc3VsdCIsImlzT2JqZWN0Iiwic3VwcG9ydCIsIm5vbkVudW1BcmdzIiwiaXNBcmd1bWVudHMiLCJzbGljZSIsInNraXBQcm90byIsImVudW1Qcm90b3R5cGVzIiwic2tpcEVycm9yUHJvcHMiLCJlbnVtRXJyb3JQcm9wcyIsImVycm9yUHJvdG8iLCJub25FbnVtU2hhZG93cyIsIm9iamVjdFByb3RvIiwiY3RvciIsImluZGV4IiwiZG9udEVudW1zTGVuZ3RoIiwic3RyaW5nUHJvdG8iLCJzdHJpbmdDbGFzcyIsImVycm9yQ2xhc3MiLCJ0b1N0cmluZyIsIm5vbkVudW0iLCJub25FbnVtUHJvcHMiLCJkb250RW51bXMiLCJpbnRlcm5hbEZvciIsImNhbGxiYWNrIiwia2V5c0Z1bmMiLCJpbnRlcm5hbEZvckluIiwiaXNOb2RlIiwiZGVlcEVxdWFscyIsImIiLCJzdGFja0EiLCJzdGFja0IiLCJ0eXBlIiwib3RoZXJUeXBlIiwib3RoZXJDbGFzcyIsImFyZ3NDbGFzcyIsIm9iamVjdENsYXNzIiwiYm9vbENsYXNzIiwiZGF0ZUNsYXNzIiwibnVtYmVyQ2xhc3MiLCJyZWdleHBDbGFzcyIsIlN0cmluZyIsImlzQXJyIiwiYXJyYXlDbGFzcyIsIm5vZGVDbGFzcyIsImN0b3JBIiwiYXJnc09iamVjdCIsImN0b3JCIiwiaXNGdW5jdGlvbiIsInNpemUiLCJwb3AiLCJhcnJheUluaXRpYWxpemUiLCJjb3VudCIsIkluZGV4ZWRJdGVtIiwiSXNEaXNwb3NlZERpc3Bvc2FibGUiLCJfcyIsImlzRGlzcG9zZWQiLCJTdHJpbmdJdGVyYWJsZSIsInMiLCJTdHJpbmdJdGVyYXRvciIsIl9sIiwiX2kiLCJBcnJheUl0ZXJhYmxlIiwiX2EiLCJBcnJheUl0ZXJhdG9yIiwidG9MZW5ndGgiLCJudW1iZXJJc0Zpbml0ZSIsImlzRmluaXRlIiwiZ2V0SXRlcmFibGUiLCJpdCIsIiRpdGVyYXRvciQiLCJzaWduIiwiaXNOYU4iLCJNYXRoIiwiZmxvb3IiLCJhYnMiLCJtYXhTYWZlSW50ZWdlciIsIkZyb21BcnJheVNpbmsiLCJvYnNlcnZlciIsImxvb3BSZWN1cnNpdmUiLCJyZWN1cnNlIiwib25OZXh0Iiwib25Db21wbGV0ZWQiLCJvYnNlcnZhYmxlT2YiLCJzY2hlZHVsZXIiLCJpc1NjaGVkdWxlciIsImN1cnJlbnRUaHJlYWRTY2hlZHVsZXIiLCJGcm9tQXJyYXlPYnNlcnZhYmxlIiwiUGFpcnNTaW5rIiwiUmVwZWF0U2luayIsImZhbHNlRmFjdG9yeSIsImFyZ3VtZW50c1RvQXJyYXkiLCJlbXB0eUFycmF5RmFjdG9yeSIsImFzT2JzZXJ2YWJsZSIsInBsdWNrZXIiLCJ4IiwiY3VycmVudFByb3AiLCJjcmVhdGVDYk9ic2VydmFibGUiLCJmbiIsImN0eCIsInNlbGVjdG9yIiwiQXN5bmNTdWJqZWN0IiwiY3JlYXRlQ2JIYW5kbGVyIiwicmVzdWx0cyIsInRyeUNhdGNoIiwib25FcnJvciIsImNyZWF0ZU5vZGVPYnNlcnZhYmxlIiwiY3JlYXRlTm9kZUhhbmRsZXIiLCJlcnIiLCJpc05vZGVMaXN0IiwiZWwiLCJTdGF0aWNOb2RlTGlzdCIsIk5vZGVMaXN0IiwiTGlzdGVuRGlzcG9zYWJsZSIsIm4iLCJfZSIsIl9uIiwiX2ZuIiwiYWRkRXZlbnRMaXN0ZW5lciIsImNyZWF0ZUV2ZW50TGlzdGVuZXIiLCJldmVudE5hbWUiLCJoYW5kbGVyIiwiZGlzcG9zYWJsZXMiLCJDb21wb3NpdGVEaXNwb3NhYmxlIiwiZWxlbVRvU3RyaW5nIiwiYWRkIiwiX29ic2VydmFibGVUaW1lciIsImR1ZVRpbWUiLCJUaW1lck9ic2VydmFibGUiLCJvYnNlcnZhYmxlVGltZXJEYXRlQW5kUGVyaW9kIiwicGVyaW9kIiwiQW5vbnltb3VzT2JzZXJ2YWJsZSIsImQiLCJub3JtYWxpemVUaW1lIiwic2NoZWR1bGVSZWN1cnNpdmVGdXR1cmUiLCJzZWxmIiwib2JzZXJ2YWJsZVRpbWVyVGltZVNwYW5BbmRQZXJpb2QiLCJzY2hlZHVsZVBlcmlvZGljIiwib2JzZXJ2YWJsZURlZmVyIiwib2JzZXJ2YWJsZURlbGF5UmVsYXRpdmUiLCJzdWJzY3JpcHRpb24iLCJhY3RpdmUiLCJjYW5jZWxhYmxlIiwiU2VyaWFsRGlzcG9zYWJsZSIsImV4Y2VwdGlvbiIsInEiLCJydW5uaW5nIiwibWF0ZXJpYWxpemUiLCJub3RpZmljYXRpb24iLCJzaG91bGRSdW4iLCJraW5kIiwiU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUiLCJzZXREaXNwb3NhYmxlIiwiXyIsInJlY3Vyc2VEdWVUaW1lIiwic2hvdWxkUmVjdXJzZSIsInNoaWZ0IiwiYWNjZXB0IiwibWF4IiwiQmluYXJ5RGlzcG9zYWJsZSIsIm9ic2VydmFibGVEZWxheUFic29sdXRlIiwiZGVsYXlXaXRoU2VsZWN0b3IiLCJzdWJzY3JpcHRpb25EZWxheSIsImRlbGF5RHVyYXRpb25TZWxlY3RvciIsInN1YkRlbGF5Iiwic3RhcnQiLCJkZWxheSIsImRlbGF5cyIsInJlbW92ZSIsImRvbmUiLCJhdEVuZCIsImRpc3Bvc2UiLCJkZWJvdW5jZVdpdGhTZWxlY3RvciIsImR1cmF0aW9uU2VsZWN0b3IiLCJoYXNWYWx1ZSIsInRocm90dGxlIiwiaXNQcm9taXNlIiwib2JzZXJ2YWJsZUZyb21Qcm9taXNlIiwiY3VycmVudGlkIiwic2FtcGxlT2JzZXJ2YWJsZSIsInNhbXBsZXIiLCJzYW1wbGVTdWJzY3JpYmUiLCJzb3VyY2VTdWJzY3JpcHRpb24iLCJuZXdWYWx1ZSIsInRpbWVvdXRXaXRoU2VsZWN0b3IiLCJmaXJzdFRpbWVvdXQiLCJ0aW1lb3V0RHVyYXRpb25TZWxlY3RvciIsIm90aGVyIiwib2JzZXJ2YWJsZU5ldmVyIiwib2JzZXJ2YWJsZVRocm93IiwiVGltZW91dEVycm9yIiwic2V0VGltZXIiLCJ0aW1lcldpbnMiLCJzd2l0Y2hlZCIsIm15SWQiLCJ0aW1lciIsIm9XaW5zIiwicmVzIiwib3JpZ2luYWwiLCJkZWZhdWx0U2NoZWR1bGVyIiwiY3JlYXRlVGltZXIiLCJzY2hlZHVsZUZ1dHVyZSIsImNvbWJpbmVMYXRlc3RTb3VyY2UiLCJzdWJqZWN0IiwicmVzdWx0U2VsZWN0b3IiLCJuZXh0IiwiaGFzVmFsdWVBbGwiLCJldmVyeSIsImlkZW50aXR5IiwiaXNEb25lIiwidHJhbnNmb3JtRm9yT2JzZXJ2ZXIiLCJAQHRyYW5zZHVjZXIvaW5pdCIsIkBAdHJhbnNkdWNlci9zdGVwIiwib2JzIiwiaW5wdXQiLCJAQHRyYW5zZHVjZXIvcmVzdWx0Iiwib2JqZWN0VHlwZXMiLCJmdW5jdGlvbiIsImZyZWVFeHBvcnRzIiwibm9kZVR5cGUiLCJmcmVlTW9kdWxlIiwiZnJlZUdsb2JhbCIsImZyZWVTZWxmIiwiZnJlZVdpbmRvdyIsIm1vZHVsZUV4cG9ydHMiLCJ0aGlzR2xvYmFsIiwiUngiLCJpbnRlcm5hbHMiLCJjb25maWciLCJQcm9taXNlIiwiaGVscGVycyIsImRlZmF1bHROb3ciLCJkZWZhdWx0Q29tcGFyZXIiLCJ5IiwiaXNFcXVhbCIsImRlZmF1bHRTdWJDb21wYXJlciIsImRlZmF1bHRFcnJvciIsImRlZmF1bHRLZXlTZXJpYWxpemVyIiwiaXNGbiIsImxvbmdTdGFja1N1cHBvcnQiLCJFbXB0eUVycm9yIiwiT2JqZWN0RGlzcG9zZWRFcnJvciIsIkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yIiwiTm90U3VwcG9ydGVkRXJyb3IiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwibm90SW1wbGVtZW50ZWQiLCJub3RTdXBwb3J0ZWQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIlNldCIsImRvbmVFbnVtZXJhdG9yIiwiaXNJdGVyYWJsZSIsImlzQXJyYXlMaWtlIiwic3VwcG9ydE5vZGVDbGFzcyIsImJpbmRDYWxsYmFjayIsImZ1bmMiLCJ0aGlzQXJnIiwiYXJnQ291bnQiLCJhcmciLCJjb2xsZWN0aW9uIiwiZnVuY0NsYXNzIiwic3VwcG9ydHNBcmdzQ2xhc3MiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidmFsdWVPZiIsInRlc3QiLCJpbmhlcml0cyIsImNoaWxkIiwiX18iLCJhZGRQcm9wZXJ0aWVzIiwic291cmNlcyIsImlkeCIsImxuIiwicHJvcCIsImFkZFJlZiIsInhzIiwiciIsImdldERpc3Bvc2FibGUiLCJpc0FycmF5IiwiQ29tcG9zaXRlRGlzcG9zYWJsZVByb3RvdHlwZSIsInNob3VsZERpc3Bvc2UiLCJjdXJyZW50RGlzcG9zYWJsZXMiLCJEaXNwb3NhYmxlIiwiYWN0aW9uIiwiZGlzcG9zYWJsZUNyZWF0ZSIsImRpc3Bvc2FibGVFbXB0eSIsImVtcHR5IiwiaXNEaXNwb3NhYmxlIiwiY2hlY2tEaXNwb3NlZCIsImRpc3Bvc2FibGUiLCJkaXNwb3NhYmxlRml4dXAiLCJfZml4dXAiLCJjdXJyZW50Iiwib2xkIiwiZmlyc3QiLCJzZWNvbmQiLCJfZmlyc3QiLCJfc2Vjb25kIiwib2xkMSIsIm9sZDIiLCJOQXJ5RGlzcG9zYWJsZSIsIl9kaXNwb3NhYmxlcyIsIlNjaGVkdWxlZEl0ZW0iLCJSZWZDb3VudERpc3Bvc2FibGUiLCJJbm5lckRpc3Bvc2FibGUiLCJpc0lubmVyRGlzcG9zZWQiLCJ1bmRlcmx5aW5nRGlzcG9zYWJsZSIsImlzUHJpbWFyeURpc3Bvc2VkIiwiY29tcGFyZXIiLCJpbnZva2UiLCJpbnZva2VDb3JlIiwiY29tcGFyZVRvIiwiaXNDYW5jZWxsZWQiLCJTY2hlZHVsZXIiLCJzY2hlZHVsZXJQcm90byIsInNjaGVkdWxlIiwiZHQiLCJub3JtYWxpemUiLCJfc2NoZWR1bGVGdXR1cmUiLCJ0aW1lU3BhbiIsImludm9rZVJlY0ltbWVkaWF0ZSIsInBhaXIiLCJpbm5lckFjdGlvbiIsInN0YXRlMiIsInNjaGVkdWxlV29yayIsInN0YXRlMyIsImlzQWRkZWQiLCJncm91cCIsImludm9rZVJlY0RhdGUiLCJkdWVUaW1lMSIsInNjaGVkdWxlUmVjdXJzaXZlIiwic2V0SW50ZXJ2YWwiLCJjbGVhckludGVydmFsIiwic2NoZWR1bGVNZXRob2QiLCJjbGVhck1ldGhvZCIsIkltbWVkaWF0ZVNjaGVkdWxlciIsIl9fc3VwZXJfXyIsImltbWVkaWF0ZVNjaGVkdWxlciIsImltbWVkaWF0ZSIsIkN1cnJlbnRUaHJlYWRTY2hlZHVsZXIiLCJydW5UcmFtcG9saW5lIiwiZGVxdWV1ZSIsInNpIiwiZW5xdWV1ZSIsIlByaW9yaXR5UXVldWUiLCJzY2hlZHVsZVJlcXVpcmVkIiwiY3VycmVudFRocmVhZCIsImxvY2FsVGltZXIiLCJTY2hlZHVsZVBlcmlvZGljUmVjdXJzaXZlIiwiY3JlYXRlVGljayIsImNvbW1hbmQiLCJfcGVyaW9kIiwiX2FjdGlvbiIsIl9zdGF0ZSIsIl9jYW5jZWwiLCJfc2NoZWR1bGVyIiwibG9jYWxTZXRUaW1lb3V0IiwibG9jYWxDbGVhclRpbWVvdXQiLCJXU2NyaXB0IiwidGltZSIsIlNsZWVwIiwicnVuVGFzayIsImhhbmRsZSIsImN1cnJlbnRseVJ1bm5pbmciLCJ0YXNrIiwidGFza3NCeUhhbmRsZSIsInBvc3RNZXNzYWdlU3VwcG9ydGVkIiwicG9zdE1lc3NhZ2UiLCJpbXBvcnRTY3JpcHRzIiwiaXNBc3luYyIsIm9sZEhhbmRsZXIiLCJvbm1lc3NhZ2UiLCJuZXh0SGFuZGxlIiwicmVOYXRpdmUiLCJSZWdFeHAiLCJzZXRJbW1lZGlhdGUiLCJNU0dfUFJFRklYIiwicmFuZG9tIiwib25HbG9iYWxQb3N0TWVzc2FnZSIsImV2ZW50IiwiZGF0YSIsInN1YnN0cmluZyIsImN1cnJlbnRJZCIsIk1lc3NhZ2VDaGFubmVsIiwiY2hhbm5lbCIsInBvcnQxIiwicG9ydDIiLCJzY3JpcHRFbGVtZW50Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwiZG9jdW1lbnRFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJEZWZhdWx0U2NoZWR1bGVyIiwic2NoZWR1bGVBY3Rpb24iLCJDbGVhckRpc3Bvc2FibGUiLCJtZXRob2QiLCJfaWQiLCJfbWV0aG9kIiwiYXN5bmMiLCJjYXBhY2l0eSIsInByaW9yaXR5UHJvdG8iLCJpc0hpZ2hlclByaW9yaXR5IiwibGVmdCIsInJpZ2h0IiwicGVyY29sYXRlIiwidGVtcCIsImhlYXBpZnkiLCJwZWVrIiwicmVtb3ZlQXQiLCJvYnNlcnZhYmxlUHJvdG8iLCJOb3RpZmljYXRpb24iLCJfYWNjZXB0IiwiX2FjY2VwdE9ic2VydmFibGUiLCJvYnNlcnZlck9yT25OZXh0IiwidG9PYnNlcnZhYmxlIiwiT25OZXh0Tm90aWZpY2F0aW9uIiwiT25FcnJvck5vdGlmaWNhdGlvbiIsIk9uQ29tcGxldGVkTm90aWZpY2F0aW9uIiwibm90aWZpY2F0aW9uQ3JlYXRlT25OZXh0IiwiY3JlYXRlT25OZXh0Iiwibm90aWZpY2F0aW9uQ3JlYXRlT25FcnJvciIsImNyZWF0ZU9uRXJyb3IiLCJub3RpZmljYXRpb25DcmVhdGVPbkNvbXBsZXRlZCIsImNyZWF0ZU9uQ29tcGxldGVkIiwiT2JzZXJ2ZXIiLCJvYnNlcnZlckNyZWF0ZSIsIkFub255bW91c09ic2VydmVyIiwiQWJzdHJhY3RPYnNlcnZlciIsImlzU3RvcHBlZCIsImNvbXBsZXRlZCIsImZhaWwiLCJfb25OZXh0IiwiX29uRXJyb3IiLCJfb25Db21wbGV0ZWQiLCJtYWtlU3Vic2NyaWJlIiwib2xkT25FcnJvciIsIm9sZFN1YnNjcmliZSIsIl9zdWJzY3JpYmUiLCJpc09ic2VydmFibGUiLCJmb3JFYWNoIiwib09yT25OZXh0Iiwic3Vic2NyaWJlT25OZXh0Iiwic3Vic2NyaWJlT25FcnJvciIsInN1YnNjcmliZU9uQ29tcGxldGVkIiwiU2NoZWR1bGVkT2JzZXJ2ZXIiLCJpc0FjcXVpcmVkIiwiaGFzRmF1bHRlZCIsImVuc3VyZUFjdGl2ZSIsImlzT3duZXIiLCJ3b3JrIiwiT2JzZXJ2YWJsZUJhc2UiLCJmaXhTdWJzY3JpYmVyIiwic3Vic2NyaWJlciIsImFkbyIsInN1YiIsInN1YnNjcmliZUNvcmUiLCJBdXRvRGV0YWNoT2JzZXJ2ZXIiLCJGbGF0TWFwT2JzZXJ2YWJsZSIsIklubmVyT2JzZXJ2ZXIiLCJfd3JhcFJlc3VsdCIsImkyIiwiZnJvbSIsIkVudW1lcmFibGUiLCJDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSIsIl9vIiwiY3VycmVudEl0ZW0iLCJjdXJyZW50VmFsdWUiLCJDYXRjaEVycm9yT2JzZXJ2YWJsZSIsIl9yZWN1cnNlIiwibGFzdEV4Y2VwdGlvbiIsImNhdGNoRXJyb3IiLCJjYXRjaEVycm9yV2hlbiIsIm5vdGlmaWNhdGlvbkhhbmRsZXIiLCJleGNlcHRpb25zIiwiU3ViamVjdCIsIm5vdGlmaWVyIiwiaGFuZGxlZCIsIm5vdGlmaWNhdGlvbkRpc3Bvc2FibGUiLCJvdXRlciIsImlubmVyIiwiZXhuIiwiZXgiLCJSZXBlYXRFbnVtZXJhYmxlIiwidiIsIlJlcGVhdEVudW1lcmF0b3IiLCJsIiwiZW51bWVyYWJsZVJlcGVhdCIsInJlcGVhdCIsInJlcGVhdENvdW50IiwiT2ZFbnVtZXJhYmxlIiwiT2ZFbnVtZXJhdG9yIiwiZW51bWVyYWJsZU9mIiwib2YiLCJUb0FycmF5T2JzZXJ2YWJsZSIsInRvQXJyYXkiLCJEZWZlciIsIl9mIiwiZGVmZXIiLCJvYnNlcnZhYmxlRmFjdG9yeSIsIkVtcHR5T2JzZXJ2YWJsZSIsIkVtcHR5U2luayIsInNjaGVkdWxlSXRlbSIsInNpbmsiLCJFTVBUWV9PQlNFUlZBQkxFIiwib2JzZXJ2YWJsZUVtcHR5IiwiRnJvbU9ic2VydmFibGUiLCJpdGVyYWJsZSIsIm1hcHBlciIsIkZyb21TaW5rIiwibGlzdCIsInBvdyIsImNoYXJBdCIsIm9ic2VydmFibGVGcm9tIiwibWFwRm4iLCJvYnNlcnZhYmxlRnJvbUFycmF5IiwiZnJvbUFycmF5IiwiTmV2ZXJPYnNlcnZhYmxlIiwiTkVWRVJfT0JTRVJWQUJMRSIsIm5ldmVyIiwib2ZXaXRoU2NoZWR1bGVyIiwiUGFpcnNPYnNlcnZhYmxlIiwicGFpcnMiLCJSYW5nZU9ic2VydmFibGUiLCJyYW5nZUNvdW50IiwiUmFuZ2VTaW5rIiwicmFuZ2UiLCJSZXBlYXRPYnNlcnZhYmxlIiwiSnVzdE9ic2VydmFibGUiLCJKdXN0U2luayIsIlRocm93T2JzZXJ2YWJsZSIsIlRocm93U2luayIsIkNhdGNoT2JzZXJ2YWJsZSIsImQxIiwiQ2F0Y2hPYnNlcnZlciIsImhhbmRsZXJPclNlY29uZCIsIm9ic2VydmFibGVDYXRjaCIsIkNvbWJpbmVMYXRlc3RPYnNlcnZhYmxlIiwicGFyYW1zIiwiX3BhcmFtcyIsIl9jYiIsInN1YnNjcmlwdGlvbnMiLCJzYWQiLCJDb21iaW5lTGF0ZXN0T2JzZXJ2ZXIiLCJub3RUaGVTYW1lIiwiaiIsImZpbHRlciIsIm9ic2VydmFibGVDb25jYXQiLCJDb25jYXRPYnNlcnZhYmxlIiwiQ29uY2F0U2luayIsImNvbmNhdEFsbCIsIm1lcmdlIiwiTWVyZ2VPYnNlcnZhYmxlIiwibWF4Q29uY3VycmVudCIsImciLCJNZXJnZU9ic2VydmVyIiwiYWN0aXZlQ291bnQiLCJoYW5kbGVTdWJzY3JpYmUiLCJpbm5lclNvdXJjZSIsIm1heENvbmN1cnJlbnRPck90aGVyIiwib2JzZXJ2YWJsZU1lcmdlIiwibWVyZ2VBbGwiLCJDb21wb3NpdGVFcnJvciIsImVycm9ycyIsImlubmVyRXJyb3JzIiwiTWVyZ2VEZWxheUVycm9yT2JzZXJ2YWJsZSIsIk1lcmdlRGVsYXlFcnJvck9ic2VydmVyIiwiX2dyb3VwIiwic2V0Q29tcGxldGlvbiIsIl9pbm5lciIsIm1lcmdlRGVsYXlFcnJvciIsIk1lcmdlQWxsT2JzZXJ2YWJsZSIsIk1lcmdlQWxsT2JzZXJ2ZXIiLCJTa2lwVW50aWxPYnNlcnZhYmxlIiwiX29wZW4iLCJsZWZ0U3Vic2NyaXB0aW9uIiwiU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIiLCJyaWdodFN1YnNjcmlwdGlvbiIsIlNraXBVbnRpbE90aGVyT2JzZXJ2ZXIiLCJfcCIsIl9yIiwic2tpcFVudGlsIiwiU3dpdGNoT2JzZXJ2YWJsZSIsIlN3aXRjaE9ic2VydmVyIiwic3RvcHBlZCIsImxhdGVzdCIsImhhc0xhdGVzdCIsInN3aXRjaExhdGVzdCIsIlRha2VVbnRpbE9ic2VydmFibGUiLCJUYWtlVW50aWxPYnNlcnZlciIsInRha2VVbnRpbCIsIldpdGhMYXRlc3RGcm9tT2JzZXJ2YWJsZSIsIl9zcyIsIldpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlciIsIldpdGhMYXRlc3RGcm9tU291cmNlT2JzZXJ2ZXIiLCJhbGxWYWx1ZXMiLCJ3aXRoTGF0ZXN0RnJvbSIsIlppcE9ic2VydmFibGUiLCJaaXBPYnNlcnZlciIsIl9xIiwiX2QiLCJub3RFbXB0eSIsInNoaWZ0RWFjaCIsInF1ZXVlZFZhbHVlcyIsInppcCIsInppcEl0ZXJhYmxlIiwicXVldWVzIiwiRGVtYXRlcmlhbGl6ZU9ic2VydmFibGUiLCJEZW1hdGVyaWFsaXplT2JzZXJ2ZXIiLCJkZW1hdGVyaWFsaXplIiwiRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZhYmxlIiwia2V5Rm4iLCJEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyIiwiaGFzQ3VycmVudEtleSIsImN1cnJlbnRLZXkiLCJjb21wYXJlckVxdWFscyIsImRpc3RpbmN0VW50aWxDaGFuZ2VkIiwiVGFwT2JzZXJ2YWJsZSIsIl9vTiIsIl9vRSIsIl9vQyIsInQiLCJ0YXAiLCJkb0FjdGlvbiIsImRvT25OZXh0IiwidGFwT25OZXh0IiwiZG9PbkVycm9yIiwidGFwT25FcnJvciIsImRvT25Db21wbGV0ZWQiLCJ0YXBPbkNvbXBsZXRlZCIsIklnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZSIsImlnbm9yZUVsZW1lbnRzIiwiTWF0ZXJpYWxpemVPYnNlcnZhYmxlIiwiTWF0ZXJpYWxpemVPYnNlcnZlciIsInJldHJ5IiwicmV0cnlDb3VudCIsInJldHJ5V2hlbiIsIlNjYW5PYnNlcnZhYmxlIiwiYWNjdW11bGF0b3IiLCJoYXNTZWVkIiwic2VlZCIsIlNjYW5PYnNlcnZlciIsIl9ocyIsIl9oYSIsIl9odiIsInNjYW4iLCJTa2lwTGFzdE9ic2VydmFibGUiLCJfYyIsIlNraXBMYXN0T2JzZXJ2ZXIiLCJza2lwTGFzdCIsIlRha2VMYXN0T2JzZXJ2ZXIiLCJ0YWtlTGFzdCIsImZsYXRNYXBDb25jYXQiLCJjb25jYXRNYXAiLCJNYXBPYnNlcnZhYmxlIiwiaW5uZXJNYXAiLCJpbnRlcm5hbE1hcCIsInNlbGVjdCIsInNlbGVjdG9yRm4iLCJwbHVjayIsInNlbGVjdE1hbnkiLCJmbGF0TWFwTGF0ZXN0IiwiU2tpcE9ic2VydmFibGUiLCJza2lwQ291bnQiLCJza2lwIiwiU2tpcFdoaWxlT2JzZXJ2YWJsZSIsIlNraXBXaGlsZU9ic2VydmVyIiwic2tpcFdoaWxlIiwicHJlZGljYXRlIiwiVGFrZU9ic2VydmFibGUiLCJ0YWtlQ291bnQiLCJ0YWtlIiwiVGFrZVdoaWxlT2JzZXJ2YWJsZSIsIlRha2VXaGlsZU9ic2VydmVyIiwidGFrZVdoaWxlIiwiRmlsdGVyT2JzZXJ2YWJsZSIsImlubmVyUHJlZGljYXRlIiwiaW50ZXJuYWxGaWx0ZXIiLCJzaG91bGRZaWVsZCIsIndoZXJlIiwiZnJvbUNhbGxiYWNrIiwiZnJvbU5vZGVDYWxsYmFjayIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ1c2VOYXRpdmVFdmVudHMiLCJFdmVudE9ic2VydmFibGUiLCJfZWwiLCJjcmVhdGVIYW5kbGVyIiwiZnJvbUV2ZW50IiwiZWxlbWVudCIsImZyb21FdmVudFBhdHRlcm4iLCJoIiwicHVibGlzaCIsInJlZkNvdW50IiwiRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZSIsImRlbCIsIl9hZGQiLCJfZGVsIiwiRXZlbnRQYXR0ZXJuRGlzcG9zYWJsZSIsInJldCIsIl9yZXQiLCJyZXR1cm5WYWx1ZSIsImFkZEhhbmRsZXIiLCJyZW1vdmVIYW5kbGVyIiwiRnJvbVByb21pc2VPYnNlcnZhYmxlIiwic2NoZWR1bGVOZXh0Iiwic2NoZWR1bGVFcnJvciIsInByb21pc2UiLCJ0b1Byb21pc2UiLCJwcm9taXNlQ3RvciIsInJlc29sdmUiLCJyZWplY3QiLCJzdGFydEFzeW5jIiwiZnVuY3Rpb25Bc3luYyIsIk11bHRpY2FzdE9ic2VydmFibGUiLCJmbjEiLCJmbjIiLCJfZm4xIiwiX2ZuMiIsImNvbm5lY3RhYmxlIiwibXVsdGljYXN0IiwiY29ubmVjdCIsInN1YmplY3RPclN1YmplY3RTZWxlY3RvciIsIkNvbm5lY3RhYmxlT2JzZXJ2YWJsZSIsInNoYXJlIiwicHVibGlzaExhc3QiLCJwdWJsaXNoVmFsdWUiLCJpbml0aWFsVmFsdWVPclNlbGVjdG9yIiwiaW5pdGlhbFZhbHVlIiwiQmVoYXZpb3JTdWJqZWN0Iiwic2hhcmVWYWx1ZSIsInJlcGxheSIsImJ1ZmZlclNpemUiLCJ3aW5kb3dTaXplIiwiUmVwbGF5U3ViamVjdCIsInNoYXJlUmVwbGF5IiwiUmVmQ291bnRPYnNlcnZhYmxlIiwiX2NvdW50IiwiX2Nvbm5lY3RhYmxlU3Vic2NyaXB0aW9uIiwic2hvdWxkQ29ubmVjdCIsIl9oYXNTdWJzY3JpcHRpb24iLCJfc3Vic2NyaXB0aW9uIiwiX3NvdXJjZU9ic2VydmFibGUiLCJfc3ViamVjdCIsIkNvbm5lY3REaXNwb3NhYmxlIiwiX2R0Iiwib2JzZXJ2YWJsZWludGVydmFsIiwicGVyaW9kT3JTY2hlZHVsZXIiLCJmaXJzdEFyZyIsIkRlYm91bmNlT2JzZXJ2YWJsZSIsIkRlYm91bmNlT2JzZXJ2ZXIiLCJfdiIsImRlYm91bmNlIiwiVGltZXN0YW1wT2JzZXJ2YWJsZSIsIlRpbWVzdGFtcE9ic2VydmVyIiwic2FtcGxlIiwidGhyb3R0bGVMYXRlc3QiLCJpbnRlcnZhbE9yU2FtcGxlciIsIndpbmRvd0R1cmF0aW9uIiwiZHVyYXRpb24iLCJSYW5nZUVycm9yIiwibGFzdE9uTmV4dCIsIlBhdXNhYmxlT2JzZXJ2YWJsZSIsInBhdXNlciIsImNvbnRyb2xsZXIiLCJjb25uIiwiY29ubmVjdGlvbiIsInBhdXNhYmxlIiwicGF1c2UiLCJyZXN1bWUiLCJQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZSIsInByZXZpb3VzU2hvdWxkRmlyZSIsInNob3VsZEZpcmUiLCJwYXVzYWJsZUJ1ZmZlcmVkIiwiQ29udHJvbGxlZE9ic2VydmFibGUiLCJlbmFibGVRdWV1ZSIsIkNvbnRyb2xsZWRTdWJqZWN0IiwicmVxdWVzdCIsIm51bWJlck9mSXRlbXMiLCJyZXF1ZXN0ZWRDb3VudCIsInJlcXVlc3RlZERpc3Bvc2FibGUiLCJoYXNGYWlsZWQiLCJoYXNDb21wbGV0ZWQiLCJkaXNwb3NlQ3VycmVudFJlcXVlc3QiLCJfcHJvY2Vzc1JlcXVlc3QiLCJyZW1haW5pbmciLCJjb250cm9sbGVkIiwicGlwZSIsImRlc3QiLCJvbkRyYWluIiwid3JpdGUiLCJfaXNTdGRpbyIsImVuZCIsIlRyYW5zZHVjZU9ic2VydmVyIiwieGZvcm0iLCJfeGZvcm0iLCJ0cmFuc2R1Y2UiLCJ0cmFuc2R1Y2VyIiwiX19zdWJzY3JpYmUiLCJBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUiLCJJbm5lclN1YnNjcmlwdGlvbiIsIm9ic2VydmVycyIsImhhc0Vycm9yIiwiaGFzT2JzZXJ2ZXJzIiwib3MiLCJBbm9ueW1vdXNTdWJqZWN0IiwiZ2V0VmFsdWUiLCJjcmVhdGVSZW1vdmFibGVEaXNwb3NhYmxlIiwic28iLCJfdHJpbSIsIlBhdXNlciIsIm1lZGlhUXVlcnkiLCJhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzIiwiX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fIiwiX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXyIsImdlbmVyYXRlQ2FsbGJhY2tGdW5jdGlvbiIsImNlaWwiLCJjbGVhckZ1bmN0aW9uIiwiZnVuY3Rpb25OYW1lIiwicmVtb3ZlU2NyaXB0Iiwic2NyaXB0SWQiLCJzY3JpcHQiLCJnZXRFbGVtZW50QnlJZCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZGVmYXVsdE9wdGlvbnMiLCJqc29ucENhbGxiYWNrIiwiZmV0Y2hKc29ucCIsIm9wdGlvbnMiLCJ0aW1lb3V0SWQiLCJjYWxsYmFja0Z1bmN0aW9uIiwicmVzcG9uc2UiLCJvayIsImpzb25wU2NyaXB0Iiwic2V0QXR0cmlidXRlIiwiY29uZmlnQW5pbWF0aW9uIiwibG9vcCIsImN1cnJlbnRUaW1lIiwiZnJhbWVUaW1lIiwicHJldlRpbWUiLCJhY2N1bXVsYXRlZFRpbWUiLCJ0aW1lU2NhbGUiLCJ0aW1lU3RlcCIsIm1heFN0ZXBzIiwiZnJhbWVOdW1iZXIiLCJhbmltUnVubmluZyIsIl9hbmltUnVubmluZyRpIiwiYW5pbWF0aW9uU3RlcCIsInByZXZQcmV2U3RhdGUiLCJwcmV2U3RhdGUiLCJwcmV2TmV4dFN0YXRlIiwibmV4dFN0YXRlIiwiX3JlZiIsImFscGhhIiwiX2FuaW1SdW5uaW5nJGkyIiwiYW5pbWF0aW9uUmVuZGVyIiwiX3JlZjIiLCJyYWYiLCJfY29uZmlnJHRpbWVTdGVwIiwiX2NvbmZpZyR0aW1lU2NhbGUiLCJfY29uZmlnJG1heFN0ZXBzIiwiX2NvbmZpZyRyYWYiLCJfcmFmMiIsIl9jb25maWckbm93IiwiX3BlcmZvcm1hbmNlTm93MiIsInZhbCIsInN0b3AiLCJuZXdBbmltIiwiX3BlcmZvcm1hbmNlTm93IiwiX3JhZiIsIm1hcE9iamVjdCIsImYiLCJldmVyeU9iaiIsImNvbXBvbmVudHMiLCJSZWFjdCIsIk1vdGlvbiIsImNyZWF0ZUNsYXNzIiwiZGlzcGxheU5hbWUiLCJkZWZhdWx0VmFsdWUiLCJwcm9wTmFtZSIsImVuZFZhbHVlIiwiZGVmYXVsdFN0eWxlIiwiY2hpbGRyZW4iLCJnZXRJbml0aWFsU3RhdGUiLCJfcHJvcHMiLCJjdXJyZW50U3R5bGUiLCJjdXJyZW50VmVsb2NpdHkiLCJfemVybzIiLCJjb21wb25lbnREaWRNb3VudCIsInN0YXJ0QW5pbWF0aW5nIiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsInRpbWVzdGVwIiwibmV3Q3VycmVudFN0eWxlIiwiX3VwZGF0ZVRyZWUiLCJ1cGRhdGVDdXJyZW50U3R5bGUiLCJuZXdDdXJyZW50VmVsb2NpdHkiLCJ1cGRhdGVDdXJyZW50VmVsb2NpdHkiLCJfbm9WZWxvY2l0eTIiLCJzdG9wQW5pbWF0aW9uIiwiaGFzVW5tb3VudGVkIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJzdGFydEFuaW1hdGlvbiIsImludGVycG9sYXRlVmFsdWUiLCJzdHJpcHBlZFN0eWxlIiwiX3N0cmlwU3R5bGUyIiwicmVuZGVyZWRDaGlsZHJlbiIsIkNoaWxkcmVuIiwib25seSIsIlN0YWdnZXJlZE1vdGlvbiIsImRlZmF1bHRTdHlsZXMiLCJhcnJheU9mIiwiX3Byb3BzMiIsImN1cnJlbnRTdHlsZXMiLCJjdXJyZW50VmVsb2NpdGllcyIsIm5ld0N1cnJlbnRTdHlsZXMiLCJuZXdDdXJyZW50VmVsb2NpdGllcyIsImsiLCJvYmplY3RPZiIsImFueSIsImdldERlZmF1bHRQcm9wcyIsIl9wcm9wczMiLCJfcHJvcHM0IiwibWVyZ2VkU3R5bGVzIiwiaGFzTmV3S2V5IiwiX21lcmdlRGlmZjIiLCJfaGFzUmVhY2hlZFN0eWxlMiIsIl9leHRlbmRzMiIsIl9leHRlbmRzMyIsImVudGVyU3R5bGUiLCJtZXJnZWRTdHlsZSIsIl9kZXByZWNhdGVkU3ByaW5ncyIsIl9kZXByZWNhdGVkU3ByaW5nczMiLCJTcHJpbmciLCJUcmFuc2l0aW9uU3ByaW5nIiwiX25vVmVsb2NpdHkiLCJfaGFzUmVhY2hlZFN0eWxlIiwiX21lcmdlRGlmZiIsIl9hbmltYXRpb25Mb29wIiwiX2FuaW1hdGlvbkxvb3AyIiwiX3plcm8iLCJfZGVwcmVjYXRlZFNwcmluZ3MyIiwiX3N0cmlwU3R5bGUiLCJkZXByZWNhdGVkU3ByaW5ncyIsImNvbXBvbmVudFdpbGxNb3VudCIsImhhc1JlYWNoZWRTdHlsZSIsImRlc3RWYWx1ZSIsIm1lcmdlRGlmZkFyciIsIl94NCIsIl94NSIsIl94NiIsIl94NyIsImFyckEiLCJhcnJCIiwiY29sbEIiLCJpbmRleEEiLCJpbmRleEIiLCJvblJlbW92ZSIsImFjY3VtIiwiZW5kQSIsImVuZEIiLCJrZXlBIiwia2V5QiIsImZpbGwiLCJtZXJnZURpZmYiLCJub1ZlbG9jaXR5IiwiX2NvbXBvbmVudHMyIiwiX2NvbXBvbmVudHMzIiwiX3Jlb3JkZXJLZXlzIiwiX3Jlb3JkZXJLZXlzMiIsIl9jb21wb25lbnRzIiwiX3NwcmluZzIiLCJfc3ByaW5nMyIsIl9wcmVzZXRzMiIsIl9wcmVzZXRzMyIsInByZXNldHMiLCJ1dGlscyIsInJlb3JkZXJLZXlzIiwibmV3S2V5cyIsIl9wcmVzZXRzIiwic3RlcHBlciIsImZyYW1lUmF0ZSIsImRlc3RYIiwiRnNwcmluZyIsIkZkYW1wZXIiLCJuZXdWIiwibmV3WCIsImVycm9yTWFyZ2luIiwic3RyaXBTdHlsZSIsIm5leHRTdHlsZSIsInByZXZTdHlsZSIsInByZXZWYWx1ZSIsIl9zdHlsZSRrZXkkY29uZmlnIiwiX3N0ZXBwZXIyIiwiX3N0eWxlJGtleSRjb25maWcyIiwiX3N0ZXBwZXIiLCJ6ZXJvIiwidmVuZG9ycyIsInN1ZmZpeCIsImNhZiIsImxhc3QiLCJmcmFtZUR1cmF0aW9uIiwiX25vdyIsImNwIiwiY2FuY2VsbGVkIiwicm91bmQiLCJjYW5jZWwiLCJhZGRTdHlsZXNUb0RvbSIsImRvbVN0eWxlIiwic3R5bGVzSW5Eb20iLCJyZWZzIiwicGFydHMiLCJhZGRTdHlsZSIsImxpc3RUb1N0eWxlcyIsIm5ld1N0eWxlcyIsImNzcyIsIm1lZGlhIiwic291cmNlTWFwIiwicGFydCIsImNyZWF0ZVN0eWxlRWxlbWVudCIsInN0eWxlRWxlbWVudCIsImhlYWQiLCJnZXRIZWFkRWxlbWVudCIsImNyZWF0ZUxpbmtFbGVtZW50IiwibGlua0VsZW1lbnQiLCJyZWwiLCJ1cGRhdGUiLCJzaW5nbGV0b24iLCJzdHlsZUluZGV4Iiwic2luZ2xldG9uQ291bnRlciIsInNpbmdsZXRvbkVsZW1lbnQiLCJhcHBseVRvU2luZ2xldG9uVGFnIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwicmV2b2tlT2JqZWN0VVJMIiwiQmxvYiIsImJ0b2EiLCJ1cGRhdGVMaW5rIiwiYXBwbHlUb1RhZyIsIm5ld09iaiIsInN0eWxlU2hlZXQiLCJjc3NUZXh0IiwicmVwbGFjZVRleHQiLCJjc3NOb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJjaGlsZE5vZGVzIiwiaW5zZXJ0QmVmb3JlIiwiZmlyc3RDaGlsZCIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsImJsb2IiLCJvbGRTcmMiLCJtZW1vaXplIiwibWVtbyIsImlzT2xkSUUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ0b0xvd2VyQ2FzZSIsIm5ld0xpc3QiLCJtYXlSZW1vdmUiLCJ0ZXh0U3RvcmUiLCJyZXBsYWNlbWVudCIsIkJvb2xlYW4iLCJjb250ZW50IiwibG9jYWxzIiwid2VicGFja1BvbHlmaWxsIiwiZGVwcmVjYXRlIiwicGF0aHMiXSwibWFwcGluZ3MiOiJDQUFBLFNBQUFBLEVBQUFD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QSxJQUFBKzBDLEtBQ0FBLEdBQUFDLFNBQUF2MUMsRUFBQUQsUUFBQXUxQyxFQUFBQyxTbEMweFNNLFNBQVN2MUMsRUFBUUQsR21DanlTdkJDLEVBQUFELFFBQUEsc2xUbkN1eVNNLFNBQVNDLEVBQVFELEdvQ3Z5U3ZCQyxFQUFBRCxRQUFBLFNBQUFDLEdBUUEsTUFQQUEsR0FBQXcxQyxrQkFDQXgxQyxFQUFBeTFDLFVBQUEsYUFDQXoxQyxFQUFBMDFDLFNBRUExMUMsRUFBQWdxQyxZQUNBaHFDLEVBQUF3MUMsZ0JBQUEsR0FFQXgxQyIsImZpbGUiOiJyZWFjdC1jbGltYi1zb2NpYWwubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wicmVhY3RcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wicmVhY3QtY2xpbWItc29jaWFsXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInJlYWN0LWNsaW1iLXNvY2lhbFwiXSA9IGZhY3Rvcnkocm9vdFtcIlJlYWN0XCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMV9fKSB7XG5yZXR1cm4gXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uXG4gKiovIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wicmVhY3RcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wicmVhY3QtY2xpbWItc29jaWFsXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInJlYWN0LWNsaW1iLXNvY2lhbFwiXSA9IGZhY3Rvcnkocm9vdFtcIlJlYWN0XCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMV9fKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge30sXG4vKioqKioqLyBcdFx0XHRpZDogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL1wiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHQgICAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cdFxuXHR2YXIgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXHRcblx0dmFyIF9jb21wb25lbnRzV2FsbENvbnRhaW5lciA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHRcblx0dmFyIF9jb21wb25lbnRzV2FsbENvbnRhaW5lcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb21wb25lbnRzV2FsbENvbnRhaW5lcik7XG5cdFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDMyKTtcblx0XG5cdGlmICh3aW5kb3cpIHtcblx0ICAgIHdpbmRvdy5DbGltYiA9IHdpbmRvdy5DbGltYiB8fCB7fTtcblx0XG5cdCAgICB2YXIgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2xpbWItd2FsbCcpO1xuXHRcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgJHRhcmdldHMubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICB2YXIgJGl0ZW0gPSAkdGFyZ2V0c1tpXTtcblx0ICAgICAgICB2YXIgY29sbGVjdGlvbklkID0gJGl0ZW0uZGF0YXNldC5jb2xsZWN0aW9uSWQ7XG5cdCAgICAgICAgdmFyIGxpbWl0ID0gJGl0ZW0uZGF0YXNldC5saW1pdDtcblx0XG5cdCAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLnJlbmRlcihfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfY29tcG9uZW50c1dhbGxDb250YWluZXIyWydkZWZhdWx0J10sIHsgY29sbGVjdGlvbklkOiBjb2xsZWN0aW9uSWQsIGxpbWl0OiBsaW1pdCB9KSwgJGl0ZW0pO1xuXHQgICAgfVxuXHR9XG5cdFxuXHRleHBvcnRzLldhbGxDb250YWluZXIgPSBfY29tcG9uZW50c1dhbGxDb250YWluZXIyWydkZWZhdWx0J107XG5cdFxuXHR2YXIgX2NvbXBvbmVudHNXYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnV2FsbCcsIHtcblx0ICAgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgICAgICByZXR1cm4gX2NvbXBvbmVudHNXYWxsLldhbGw7XG5cdCAgICB9XG5cdH0pO1xuXHRcblx0dmFyIF9jb21wb25lbnRzVGlsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ1RpbGUnLCB7XG5cdCAgICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICAgICAgcmV0dXJuIF9jb21wb25lbnRzVGlsZS5UaWxlO1xuXHQgICAgfVxuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xX187XG5cbi8qKiovIH0sXG4vKiAyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdCAgICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgZGVzYyA9IHBhcmVudCA9IGdldHRlciA9IHVuZGVmaW5lZDsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cdFxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblx0XG5cdGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cdFxuXHR2YXIgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXHRcblx0dmFyIF9JbWFnZSA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdFxuXHR2YXIgX0ltYWdlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0ltYWdlKTtcblx0XG5cdHZhciBfTWVzc2FnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXHRcblx0dmFyIF9NZXNzYWdlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lc3NhZ2UpO1xuXHRcblx0dmFyIF9BdXRob3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXHRcblx0dmFyIF9BdXRob3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQXV0aG9yKTtcblx0XG5cdHZhciBUaWxlID0gKGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG5cdCAgICBfaW5oZXJpdHMoVGlsZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cdFxuXHQgICAgZnVuY3Rpb24gVGlsZShwcm9wcykge1xuXHQgICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUaWxlKTtcblx0XG5cdCAgICAgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoVGlsZS5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5jYWxsKHRoaXMsIHByb3BzKTtcblx0ICAgIH1cblx0XG5cdCAgICBfY3JlYXRlQ2xhc3MoVGlsZSwgW3tcblx0ICAgICAgICBrZXk6ICdjcmVhdGVJbWFnZScsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUltYWdlKCkge1xuXHRcblx0ICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuaW1hZ2UgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBfcHJvcHMkaW1hZ2UgPSB0aGlzLnByb3BzLmltYWdlO1xuXHQgICAgICAgICAgICAgICAgdmFyIHNyYyA9IF9wcm9wcyRpbWFnZS51cmw7XG5cdCAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBfcHJvcHMkaW1hZ2Uud2lkdGg7XG5cdCAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gX3Byb3BzJGltYWdlLmhlaWdodDtcblx0XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX0ltYWdlMlsnZGVmYXVsdCddLCB7IHNyYzogc3JjLFxuXHQgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcblx0ICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICB9LCB7XG5cdCAgICAgICAga2V5OiAnY3JlYXRlTWVzc2FnZScsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2UoKSB7XG5cdFxuXHQgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5tZXNzYWdlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX01lc3NhZ2UyWydkZWZhdWx0J10sIHsgYm9keTogdGhpcy5wcm9wcy5tZXNzYWdlIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgIH0sIHtcblx0ICAgICAgICBrZXk6ICdjcmVhdGVDbGFzc1N0cmluZycsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUNsYXNzU3RyaW5nKCkge1xuXHRcblx0ICAgICAgICAgICAgdmFyIGNsYXNzU3RyaW5nID0gJ2NsaW1iX190aWxlIGNsaW1iX190aWxlLS0nICsgdGhpcy5wcm9wcy5zb3VyY2VfdHlwZTtcblx0XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmltYWdlKSB7XG5cdCAgICAgICAgICAgICAgICBjbGFzc1N0cmluZyArPSAnIGNsaW1iX190aWxlLS1oYXMtbWVkaWEgY2xpbWJfX3RpbGUtLWhhcy1pbWFnZSc7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBjbGFzc1N0cmluZyArPSAnIGNsaW1iX190aWxlLS1oYXMtbm8taW1hZ2UnO1xuXHQgICAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy52aWRlb191cmwpIHtcblx0ICAgICAgICAgICAgICAgIGNsYXNzU3RyaW5nICs9ICcgY2xpbWJfX3RpbGUtLWhhcy1tZWRpYSBjbGltYl9fdGlsZS0taGFzLXZpZGVvJztcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGNsYXNzU3RyaW5nICs9ICcgY2xpbWJfX3RpbGUtLWhhcy1uby12aWRlbyc7XG5cdCAgICAgICAgICAgIH1cblx0XG5cdCAgICAgICAgICAgIHJldHVybiBjbGFzc1N0cmluZztcblx0ICAgICAgICB9XG5cdCAgICB9LCB7XG5cdCAgICAgICAga2V5OiAncmVuZGVyJyxcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHRcblx0ICAgICAgICAgICAgdmFyIGltYWdlID0gdGhpcy5jcmVhdGVJbWFnZSgpO1xuXHQgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMuY3JlYXRlTWVzc2FnZSgpO1xuXHQgICAgICAgICAgICB2YXIgY2xhc3NTdHJpbmcgPSB0aGlzLmNyZWF0ZUNsYXNzU3RyaW5nKCk7XG5cdCAgICAgICAgICAgIHZhciBhdXRob3IgPSB0aGlzLnByb3BzLmF1dGhvcjtcblx0XG5cdCAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAgICAgICAgICdkaXYnLFxuXHQgICAgICAgICAgICAgICAgeyBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuXHQgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB0aGlzLnByb3BzLnN0eWxlIH0sXG5cdCAgICAgICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAgICAgICAgICAgICAnYScsXG5cdCAgICAgICAgICAgICAgICAgICAgeyBocmVmOiB0aGlzLnByb3BzLmxpbmsgfSxcblx0ICAgICAgICAgICAgICAgICAgICBpbWFnZVxuXHQgICAgICAgICAgICAgICAgKSxcblx0ICAgICAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAgICAgICAgICdkaXYnLFxuXHQgICAgICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAnY2xpbWJfX3RpbGVfX2NvbnRlbnQnIH0sXG5cdCAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcblx0ICAgICAgICAgICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfQXV0aG9yMlsnZGVmYXVsdCddLCBhdXRob3IpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgICk7XG5cdCAgICAgICAgfVxuXHQgICAgfV0pO1xuXHRcblx0ICAgIHJldHVybiBUaWxlO1xuXHR9KShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblx0XG5cdFRpbGUucHJvcFR5cGVzID0ge1xuXHRcblx0ICAgIC8vIFJlcXVpcmVkIGF0dHJzXG5cdCAgICBsaW5rOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXHQgICAgc291cmNlX3R5cGU6IF9yZWFjdDJbJ2RlZmF1bHQnXS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG5cdCAgICB0aW1lc3RhbXA6IF9yZWFjdDJbJ2RlZmF1bHQnXS5Qcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG5cdCAgICBhdXRob3I6IF9yZWFjdDJbJ2RlZmF1bHQnXS5Qcm9wVHlwZXMuc2hhcGUoe1xuXHQgICAgICAgIHVzZXJuYW1lOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXHQgICAgICAgIHBpY3R1cmU6IF9yZWFjdDJbJ2RlZmF1bHQnXS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG5cdCAgICAgICAgbGluazogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuXHQgICAgfSksXG5cdFxuXHQgICAgLy8gT3B0aW9uYWwgYXR0cnNcblx0ICAgIG1lc3NhZ2U6IF9yZWFjdDJbJ2RlZmF1bHQnXS5Qcm9wVHlwZXMuc3RyaW5nLFxuXHQgICAgdmlkZW9fc3JjOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLnN0cmluZyxcblx0ICAgIGltYWdlOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLnNoYXBlKHtcblx0ICAgICAgICB1cmw6IF9yZWFjdDJbJ2RlZmF1bHQnXS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG5cdCAgICAgICAgd2lkdGg6IF9yZWFjdDJbJ2RlZmF1bHQnXS5Qcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG5cdCAgICAgICAgaGVpZ2h0OiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkXG5cdCAgICB9KVxuXHRcblx0fTtcblx0XG5cdGV4cG9ydHNbJ2RlZmF1bHQnXSA9IFRpbGU7XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9LFxuLyogMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHQgICAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBkZXNjID0gcGFyZW50ID0gZ2V0dGVyID0gdW5kZWZpbmVkOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblx0XG5cdGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblx0XG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXHRcblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblx0XG5cdHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cdFxuXHR2YXIgX1RpbGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHRcblx0dmFyIF9UaWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RpbGUpO1xuXHRcblx0dmFyIF9yZWFjdE1vdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xuXHRcblx0dmFyIFdhbGwgPSAoZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcblx0ICAgIF9pbmhlcml0cyhXYWxsLCBfQ29tcG9uZW50KTtcblx0XG5cdCAgICBmdW5jdGlvbiBXYWxsKCkge1xuXHQgICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXYWxsKTtcblx0XG5cdCAgICAgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoV2FsbC5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgfVxuXHRcblx0ICAgIF9jcmVhdGVDbGFzcyhXYWxsLCBbe1xuXHQgICAgICAgIGtleTogJ2dldFN0eWxlcycsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFN0eWxlcygpIHtcblx0ICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgICAgIHZhciBjb25maWdzID0ge307XG5cdCAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMucHJvcHMuaXRlbXMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdCAgICAgICAgICAgICAgICBjb25maWdzW2tleV0gPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogKDAsIF9yZWFjdE1vdGlvbi5zcHJpbmcpKDEpLFxuXHQgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAoMCwgX3JlYWN0TW90aW9uLnNwcmluZykoMzc1KSxcblx0ICAgICAgICAgICAgICAgICAgICBtYXJnaW46ICgwLCBfcmVhY3RNb3Rpb24uc3ByaW5nKSgxMCksXG5cdCAgICAgICAgICAgICAgICAgICAgaXRlbTogX3RoaXMucHJvcHMuaXRlbXNba2V5XVxuXHQgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHJldHVybiBjb25maWdzO1xuXHQgICAgICAgIH1cblx0ICAgIH0sIHtcblx0ICAgICAgICBrZXk6ICd3aWxsRW50ZXInLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiB3aWxsRW50ZXIoa2V5KSB7XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICBvcGFjaXR5OiAoMCwgX3JlYWN0TW90aW9uLnNwcmluZykoMCksXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogKDAsIF9yZWFjdE1vdGlvbi5zcHJpbmcpKDApLFxuXHQgICAgICAgICAgICAgICAgbWFyZ2luOiAoMCwgX3JlYWN0TW90aW9uLnNwcmluZykoMCksXG5cdCAgICAgICAgICAgICAgICBpdGVtOiB0aGlzLnByb3BzLml0ZW1zW2tleV1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9LCB7XG5cdCAgICAgICAga2V5OiAnd2lsbExlYXZlJyxcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gd2lsbExlYXZlKGtleSwgc3R5bGUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgIG9wYWNpdHk6ICgwLCBfcmVhY3RNb3Rpb24uc3ByaW5nKSgwKSxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAoMCwgX3JlYWN0TW90aW9uLnNwcmluZykoMCksXG5cdCAgICAgICAgICAgICAgICBtYXJnaW46ICgwLCBfcmVhY3RNb3Rpb24uc3ByaW5nKSgwKSxcblx0ICAgICAgICAgICAgICAgIGl0ZW06IHN0eWxlLml0ZW1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9LCB7XG5cdCAgICAgICAga2V5OiAncmVuZGVyVGlsZScsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclRpbGUoa2V5LCBpdGVtVmFsdWVzKSB7XG5cdCAgICAgICAgICAgIHZhciBpdGVtID0gaXRlbVZhbHVlcy5pdGVtO1xuXHRcblx0ICAgICAgICAgICAgdmFyIHN0eWxlQ29uZmlnID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKGl0ZW1WYWx1ZXMsIFsnaXRlbSddKTtcblx0XG5cdCAgICAgICAgICAgIHZhciBpdGVtUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoaXRlbSwgW10pO1xuXHRcblx0ICAgICAgICAgICAgdmFyIHN0eWxlID0ge1xuXHQgICAgICAgICAgICAgICAgb3BhY2l0eTogc3R5bGVDb25maWcub3BhY2l0eSxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiBzdHlsZUNvbmZpZy53aWR0aCArICdweCcsXG5cdCAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiBzdHlsZUNvbmZpZy5tYXJnaW4sXG5cdCAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogc3R5bGVDb25maWcubWFyZ2luXG5cdCAgICAgICAgICAgIH07XG5cdFxuXHQgICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX1RpbGUyWydkZWZhdWx0J10sIF9leHRlbmRzKHsga2V5OiBrZXksXG5cdCAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGVcblx0ICAgICAgICAgICAgfSwgaXRlbVByb3BzKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSwge1xuXHQgICAgICAgIGtleTogJ3JlbmRlcicsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0ICAgICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAgICAgICBfcmVhY3RNb3Rpb24uVHJhbnNpdGlvbk1vdGlvbixcblx0ICAgICAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IHRoaXMuZ2V0U3R5bGVzLmJpbmQodGhpcykoKSxcblx0ICAgICAgICAgICAgICAgICAgICB3aWxsRW50ZXI6IHRoaXMud2lsbEVudGVyLmJpbmQodGhpcyksXG5cdCAgICAgICAgICAgICAgICAgICAgd2lsbExlYXZlOiB0aGlzLndpbGxMZWF2ZS5iaW5kKHRoaXMpIH0sXG5cdCAgICAgICAgICAgICAgICBmdW5jdGlvbiAodmFsdWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgeyBjbGFzc05hbWU6ICdjbGltYl9fd2FsbCcgfSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModmFsdWVzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1WYWx1ZXMgPSB2YWx1ZXNba2V5XTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIucmVuZGVyVGlsZShrZXksIGl0ZW1WYWx1ZXMpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgICAgICk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICk7XG5cdCAgICAgICAgfVxuXHQgICAgfV0sIFt7XG5cdCAgICAgICAga2V5OiAncHJvcFR5cGVzJyxcblx0ICAgICAgICB2YWx1ZToge1xuXHQgICAgICAgICAgICBpdGVtczogX3JlYWN0LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuXHQgICAgfV0pO1xuXHRcblx0ICAgIHJldHVybiBXYWxsO1xuXHR9KShfcmVhY3QuQ29tcG9uZW50KTtcblx0XG5cdGV4cG9ydHNbJ2RlZmF1bHQnXSA9IFdhbGw7XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9LFxuLyogNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gW3N0aWZmbmVzcywgZGFtcGluZ11cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IHtcblx0ICBub1dvYmJsZTogWzE3MCwgMjZdLCAvLyB0aGUgZGVmYXVsdFxuXHQgIGdlbnRsZTogWzEyMCwgMTRdLFxuXHQgIHdvYmJseTogWzE4MCwgMTJdLFxuXHQgIHN0aWZmOiBbMjEwLCAyMF1cblx0fTtcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSxcbi8qIDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLyhmdW5jdGlvbihwcm9jZXNzKSB7Ly8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuXHQoZnVuY3Rpb24oKSB7XG5cdCAgdmFyIGdldE5hbm9TZWNvbmRzLCBocnRpbWUsIGxvYWRUaW1lO1xuXHRcblx0ICBpZiAoKHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwZXJmb3JtYW5jZSAhPT0gbnVsbCkgJiYgcGVyZm9ybWFuY2Uubm93KSB7XG5cdCAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7XG5cdCAgICB9O1xuXHQgIH0gZWxzZSBpZiAoKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MgIT09IG51bGwpICYmIHByb2Nlc3MuaHJ0aW1lKSB7XG5cdCAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICByZXR1cm4gKGdldE5hbm9TZWNvbmRzKCkgLSBsb2FkVGltZSkgLyAxZTY7XG5cdCAgICB9O1xuXHQgICAgaHJ0aW1lID0gcHJvY2Vzcy5ocnRpbWU7XG5cdCAgICBnZXROYW5vU2Vjb25kcyA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICB2YXIgaHI7XG5cdCAgICAgIGhyID0gaHJ0aW1lKCk7XG5cdCAgICAgIHJldHVybiBoclswXSAqIDFlOSArIGhyWzFdO1xuXHQgICAgfTtcblx0ICAgIGxvYWRUaW1lID0gZ2V0TmFub1NlY29uZHMoKTtcblx0ICB9IGVsc2UgaWYgKERhdGUubm93KSB7XG5cdCAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIGxvYWRUaW1lO1xuXHQgICAgfTtcblx0ICAgIGxvYWRUaW1lID0gRGF0ZS5ub3coKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbG9hZFRpbWU7XG5cdCAgICB9O1xuXHQgICAgbG9hZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblx0ICB9XG5cdFxuXHR9KS5jYWxsKHRoaXMpO1xuXHRcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oNikpKVxuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cdFxuXHR2YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cdHZhciBxdWV1ZSA9IFtdO1xuXHR2YXIgZHJhaW5pbmcgPSBmYWxzZTtcblx0dmFyIGN1cnJlbnRRdWV1ZTtcblx0dmFyIHF1ZXVlSW5kZXggPSAtMTtcblx0XG5cdGZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcblx0ICAgIGRyYWluaW5nID0gZmFsc2U7XG5cdCAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuXHQgICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcblx0ICAgIH1cblx0ICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcblx0ICAgICAgICBkcmFpblF1ZXVlKCk7XG5cdCAgICB9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG5cdCAgICBpZiAoZHJhaW5pbmcpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcblx0ICAgIGRyYWluaW5nID0gdHJ1ZTtcblx0XG5cdCAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuXHQgICAgd2hpbGUobGVuKSB7XG5cdCAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG5cdCAgICAgICAgcXVldWUgPSBbXTtcblx0ICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG5cdCAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcblx0ICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG5cdCAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuXHQgICAgfVxuXHQgICAgY3VycmVudFF1ZXVlID0gbnVsbDtcblx0ICAgIGRyYWluaW5nID0gZmFsc2U7XG5cdCAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cdH1cblx0XG5cdHByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG5cdCAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG5cdCAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuXHQgICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcblx0ICAgICAgICBzZXRUaW1lb3V0KGRyYWluUXVldWUsIDApO1xuXHQgICAgfVxuXHR9O1xuXHRcblx0Ly8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuXHRmdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcblx0ICAgIHRoaXMuZnVuID0gZnVuO1xuXHQgICAgdGhpcy5hcnJheSA9IGFycmF5O1xuXHR9XG5cdEl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xuXHR9O1xuXHRwcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xuXHRwcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xuXHRwcm9jZXNzLmVudiA9IHt9O1xuXHRwcm9jZXNzLmFyZ3YgPSBbXTtcblx0cHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5cdHByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblx0XG5cdGZ1bmN0aW9uIG5vb3AoKSB7fVxuXHRcblx0cHJvY2Vzcy5vbiA9IG5vb3A7XG5cdHByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xuXHRwcm9jZXNzLm9uY2UgPSBub29wO1xuXHRwcm9jZXNzLm9mZiA9IG5vb3A7XG5cdHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xuXHRwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5cdHByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cdFxuXHRwcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xuXHR9O1xuXHRcblx0cHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcblx0cHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG5cdH07XG5cdHByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuLyoqKi8gfSxcbi8qIDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBkZXNjID0gcGFyZW50ID0gZ2V0dGVyID0gdW5kZWZpbmVkOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cdFxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXHRcblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cdFxuXHR2YXIgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXHRcblx0dmFyIEF1dGhvciA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuXHQgICAgX2luaGVyaXRzKEF1dGhvciwgX1JlYWN0JENvbXBvbmVudCk7XG5cdFxuXHQgICAgZnVuY3Rpb24gQXV0aG9yKCkge1xuXHQgICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdXRob3IpO1xuXHRcblx0ICAgICAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihBdXRob3IucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgfVxuXHRcblx0ICAgIF9jcmVhdGVDbGFzcyhBdXRob3IsIFt7XG5cdCAgICAgICAga2V5OiBcInJlbmRlclwiLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdFxuXHQgICAgICAgICAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAgICAgICAgIFwiYVwiLFxuXHQgICAgICAgICAgICAgICAgeyBjbGFzc05hbWU6IFwiY2xpbWJfX3RpbGVfX2F1dGhvclwiLFxuXHQgICAgICAgICAgICAgICAgICAgIGhyZWY6IHRoaXMucHJvcHMubGluayB9LFxuXHQgICAgICAgICAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImltZ1wiLCB7IHNyYzogdGhpcy5wcm9wcy5waWN0dXJlLFxuXHQgICAgICAgICAgICAgICAgICAgIGFsdDogXCJQcm9maWxlIHBpYyBvZiBcIiArIHRoaXMucHJvcHMubmFtZSB9KSxcblx0ICAgICAgICAgICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAgICAgICAgICAgXCJoNFwiLFxuXHQgICAgICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcImNsaW1iX190aWxlX19hdXRob3JfX3VzZXJuYW1lXCIgfSxcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnVzZXJuYW1lXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgICk7XG5cdCAgICAgICAgfVxuXHQgICAgfV0pO1xuXHRcblx0ICAgIHJldHVybiBBdXRob3I7XG5cdH0pKF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNvbXBvbmVudCk7XG5cdFxuXHRBdXRob3IucHJvcFR5cGVzID0ge307XG5cdFxuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IEF1dGhvcjtcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSxcbi8qIDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0ICAgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBkZXNjID0gcGFyZW50ID0gZ2V0dGVyID0gdW5kZWZpbmVkOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblx0XG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXHRcblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblx0XG5cdHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cdFxuXHR2YXIgQ2xpbWJCYWRnZSA9IChmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuXHQgICAgX2luaGVyaXRzKENsaW1iQmFkZ2UsIF9Db21wb25lbnQpO1xuXHRcblx0ICAgIGZ1bmN0aW9uIENsaW1iQmFkZ2UoKSB7XG5cdCAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsaW1iQmFkZ2UpO1xuXHRcblx0ICAgICAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihDbGltYkJhZGdlLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICB9XG5cdFxuXHQgICAgX2NyZWF0ZUNsYXNzKENsaW1iQmFkZ2UsIFt7XG5cdCAgICAgICAga2V5OiAncmVuZGVyJyxcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHRcblx0ICAgICAgICAgICAgdmFyIGxvZ28gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzKTtcblx0XG5cdCAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnYScsIHsgaHJlZjogJ2h0dHA6Ly9jbGltYi5zb2NpYWwvJyxcblx0ICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2NsaW1iLXNvY2lhbC1iYWRnZScsXG5cdCAgICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IGxvZ28gfSB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9XSk7XG5cdFxuXHQgICAgcmV0dXJuIENsaW1iQmFkZ2U7XG5cdH0pKF9yZWFjdC5Db21wb25lbnQpO1xuXHRcblx0ZXhwb3J0c1snZGVmYXVsdCddID0gQ2xpbWJCYWRnZTtcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0sXG4vKiA5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgICAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgZGVzYyA9IHBhcmVudCA9IGdldHRlciA9IHVuZGVmaW5lZDsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXHRcblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblx0XG5cdGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXHRcblx0dmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblx0XG5cdHZhciBJbWFnZSA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuXHQgICAgX2luaGVyaXRzKEltYWdlLCBfUmVhY3QkQ29tcG9uZW50KTtcblx0XG5cdCAgICBmdW5jdGlvbiBJbWFnZSgpIHtcblx0ICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW1hZ2UpO1xuXHRcblx0ICAgICAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihJbWFnZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICB9XG5cdFxuXHQgICAgX2NyZWF0ZUNsYXNzKEltYWdlLCBbe1xuXHQgICAgICAgIGtleTogXCJyZW5kZXJcIixcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImltZ1wiLCB7IGNsYXNzTmFtZTogXCJjbGltYl9fdGlsZV9faW1hZ2VcIixcblx0ICAgICAgICAgICAgICAgIHNyYzogdGhpcy5wcm9wcy5zcmMsIFwiZGF0YS13aWR0aFwiOiB0aGlzLnByb3BzLndpZHRoLCBcImRhdGEtaGVpZ2h0XCI6IHRoaXMucHJvcHMuaGVpZ2h0IH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH1dKTtcblx0XG5cdCAgICByZXR1cm4gSW1hZ2U7XG5cdH0pKF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNvbXBvbmVudCk7XG5cdFxuXHRJbWFnZS5wcm9wVHlwZXMgPSB7XG5cdCAgICBzcmM6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcblx0ICAgIHdpZHRoOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMubnVtYmVyLFxuXHQgICAgaGVpZ2h0OiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMubnVtYmVyXG5cdH07XG5cdFxuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IEltYWdlO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9LFxuLyogMTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0ICAgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBkZXNjID0gcGFyZW50ID0gZ2V0dGVyID0gdW5kZWZpbmVkOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblx0XG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXHRcblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblx0XG5cdHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cdFxuXHR2YXIgTWVzc2FnZSA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuXHQgICAgX2luaGVyaXRzKE1lc3NhZ2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXHRcblx0ICAgIGZ1bmN0aW9uIE1lc3NhZ2UoKSB7XG5cdCAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1lc3NhZ2UpO1xuXHRcblx0ICAgICAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihNZXNzYWdlLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICB9XG5cdFxuXHQgICAgX2NyZWF0ZUNsYXNzKE1lc3NhZ2UsIFt7XG5cdCAgICAgICAga2V5OiAncmVuZGVyJyxcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHRcblx0ICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSB0aGlzLnByb3BzLmJvZHkucmVwbGFjZSgvPGEgaHJlZj1cImh0dHA6XFwvXFwvcGljLnR3aXR0ZXIuY29tXFwvW14+XSo+KFtePF0rKTxcXC9hPi9nLCAnJyk7XG5cdFxuXHQgICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAnY2xpbWJfX3RpbGVfX21lc3NhZ2UnLFxuXHQgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiBtZXNzYWdlIH0gfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfV0pO1xuXHRcblx0ICAgIHJldHVybiBNZXNzYWdlO1xuXHR9KShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblx0XG5cdE1lc3NhZ2UucHJvcFR5cGVzID0ge1xuXHQgICAgYm9keTogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuXHR9O1xuXHRcblx0ZXhwb3J0c1snZGVmYXVsdCddID0gTWVzc2FnZTtcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0sXG4vKiAxMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHQgICAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IGRlc2MgPSBwYXJlbnQgPSBnZXR0ZXIgPSB1bmRlZmluZWQ7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXHRcblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cdFxuXHRmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXHRcblx0dmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblx0XG5cdHZhciBfY2xpbWJTb2NpYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblx0XG5cdHZhciBfY2xpbWJTb2NpYWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xpbWJTb2NpYWwpO1xuXHRcblx0dmFyIF9XYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblx0XG5cdHZhciBfV2FsbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9XYWxsKTtcblx0XG5cdHZhciBfQ2xpbWJCYWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG5cdFxuXHR2YXIgX0NsaW1iQmFkZ2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpbWJCYWRnZSk7XG5cdFxuXHR2YXIgV2FsbENvbnRhaW5lciA9IChmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuXHQgICAgX2luaGVyaXRzKFdhbGxDb250YWluZXIsIF9Db21wb25lbnQpO1xuXHRcblx0ICAgIGZ1bmN0aW9uIFdhbGxDb250YWluZXIocHJvcHMpIHtcblx0ICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2FsbENvbnRhaW5lcik7XG5cdFxuXHQgICAgICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFdhbGxDb250YWluZXIucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuY2FsbCh0aGlzLCBwcm9wcyk7XG5cdCAgICAgICAgdGhpcy5zdGF0ZSA9IHtcblx0ICAgICAgICAgICAgaXRlbXM6IHt9XG5cdCAgICAgICAgfTtcblx0ICAgIH1cblx0XG5cdCAgICBfY3JlYXRlQ2xhc3MoV2FsbENvbnRhaW5lciwgW3tcblx0ICAgICAgICBrZXk6ICdpbml0Jyxcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdCgpIHtcblx0ICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5wcm9wcy5jb2xsZWN0aW9uSWQpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXHRcblx0ICAgICAgICAgICAgX2NsaW1iU29jaWFsMlsnZGVmYXVsdCddLmdldFN0cmVhbSh0aGlzLnByb3BzLmNvbGxlY3Rpb25JZCkuc3Vic2NyaWJlKGZ1bmN0aW9uIChpdGVtcykge1xuXHRcblx0ICAgICAgICAgICAgICAgIHZhciBtYXhTaXplID0gcGFyc2VJbnQoX3RoaXMucHJvcHMubGltaXQsIDApO1xuXHRcblx0ICAgICAgICAgICAgICAgIHZhciBtYXBwZWRJdGVtcyA9IHt9O1xuXHQgICAgICAgICAgICAgICAgaXRlbXMuc3BsaWNlKDAsIG1heFNpemUpLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgICAgICAgICAgICAgIG1hcHBlZEl0ZW1zW2l0ZW0uaWRdID0gaXRlbTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHRcblx0ICAgICAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHtcblx0ICAgICAgICAgICAgICAgICAgICBpdGVtczogbWFwcGVkSXRlbXNcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9LCB7XG5cdCAgICAgICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcblx0ICAgICAgICAgICAgdGhpcy5pbml0KCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSwge1xuXHQgICAgICAgIGtleTogJ2NvbXBvbmVudERpZFVwZGF0ZScsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcblx0ICAgICAgICAgICAgdmFyIGNiID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICBpZiAod2luZG93LkNsaW1iICYmIHdpbmRvdy5DbGltYi5vblVwZGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgY2IgPSB3aW5kb3cuQ2xpbWIub25VcGRhdGU7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyBub29wXG5cdCAgICAgICAgICAgICAgICBjYiA9IGZ1bmN0aW9uICgpIHt9O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNiKCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSwge1xuXHQgICAgICAgIGtleTogJ3JlbmRlcicsXG5cdCAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAgICAgJ2RpdicsXG5cdCAgICAgICAgICAgICAgICBudWxsLFxuXHQgICAgICAgICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX1dhbGwyWydkZWZhdWx0J10sIHsgaXRlbXM6IHRoaXMuc3RhdGUuaXRlbXMgfSksXG5cdCAgICAgICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfQ2xpbWJCYWRnZTJbJ2RlZmF1bHQnXSwgbnVsbClcblx0ICAgICAgICAgICAgKTtcblx0ICAgICAgICB9XG5cdCAgICB9XSwgW3tcblx0ICAgICAgICBrZXk6ICdwcm9wVHlwZXMnLFxuXHQgICAgICAgIHZhbHVlOiB7XG5cdCAgICAgICAgICAgIGNvbGxlY3Rpb25JZDogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcblx0ICAgICAgICAgICAgbGltaXQ6IF9yZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtfcmVhY3QuUHJvcFR5cGVzLm51bWJlciwgX3JlYWN0LlByb3BUeXBlcy5zdHJpbmddKVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuXHQgICAgfSwge1xuXHQgICAgICAgIGtleTogJ2RlZmF1bHRQcm9wcycsXG5cdCAgICAgICAgdmFsdWU6IHtcblx0ICAgICAgICAgICAgY29sbGVjdGlvbklkOiAnNTYxYmE2MzQ0NTI4NGUxNzQwZTAxNmY3Jyxcblx0ICAgICAgICAgICAgbGltaXQ6IDMwXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG5cdCAgICB9XSk7XG5cdFxuXHQgICAgcmV0dXJuIFdhbGxDb250YWluZXI7XG5cdH0pKF9yZWFjdC5Db21wb25lbnQpO1xuXHRcblx0ZXhwb3J0c1snZGVmYXVsdCddID0gV2FsbENvbnRhaW5lcjtcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0sXG4vKiAxMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHQgICAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cdFxuXHR2YXIgX3J4TGl0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHRcblx0dmFyIF9mZXRjaEpzb25wID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7XG5cdFxuXHR2YXIgX2ZldGNoSnNvbnAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmV0Y2hKc29ucCk7XG5cdFxuXHR2YXIgZ2V0U3RyZWFtID0gZnVuY3Rpb24gZ2V0U3RyZWFtKGNvbGxlY3Rpb25JZCkge1xuXHRcblx0ICAgIHZhciBwb2xsUmF0ZSA9IDUgKiAxMDAwO1xuXHRcblx0ICAgIHZhciByZXF1ZXN0U3RyZWFtID0gX3J4TGl0ZS5PYnNlcnZhYmxlLmp1c3QoJ2h0dHA6Ly9hcHAuY2xpbWIuc29jaWFsL2FwaS92MS9jb2xsZWN0aW9ucy8nICsgY29sbGVjdGlvbklkKTtcblx0XG5cdCAgICB2YXIgdXBkYXRlU3RyZWFtID0gX3J4TGl0ZS5PYnNlcnZhYmxlLmludGVydmFsKHBvbGxSYXRlKS5zdGFydFdpdGgobnVsbCk7XG5cdFxuXHQgICAgdmFyIHJlc3BvbnNlU3RyZWFtID0gdXBkYXRlU3RyZWFtLmNvbWJpbmVMYXRlc3QocmVxdWVzdFN0cmVhbSwgZnVuY3Rpb24gKHRpY2ssIHVybCkge1xuXHQgICAgICAgIHJldHVybiB1cmw7XG5cdCAgICB9KS5mbGF0TWFwKGZ1bmN0aW9uIChiYXNlVXJsKSB7XG5cdFxuXHQgICAgICAgIHZhciByZXF1ZXN0VXJsID0gJycgKyBiYXNlVXJsO1xuXHRcblx0ICAgICAgICByZXR1cm4gX3J4TGl0ZS5PYnNlcnZhYmxlLmZyb21Qcm9taXNlKCgwLCBfZmV0Y2hKc29ucDJbJ2RlZmF1bHQnXSkocmVxdWVzdFVybCkudGhlbihmdW5jdGlvbiAocmVzcCkge1xuXHQgICAgICAgICAgICByZXR1cm4gcmVzcC5qc29uKCk7XG5cdCAgICAgICAgfSkpO1xuXHQgICAgfSk7XG5cdFxuXHQgICAgcmV0dXJuIHJlc3BvbnNlU3RyZWFtO1xuXHR9O1xuXHRcblx0ZXhwb3J0c1snZGVmYXVsdCddID0ge1xuXHQgICAgZ2V0U3RyZWFtOiBnZXRTdHJlYW1cblx0fTtcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLyoqKi8gfSxcbi8qIDEzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX187LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKG1vZHVsZSwgZ2xvYmFsLCBwcm9jZXNzKSB7Ly8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQsIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXHRcblx0OyhmdW5jdGlvbiAodW5kZWZpbmVkKSB7XG5cdFxuXHQgIHZhciBvYmplY3RUeXBlcyA9IHtcblx0ICAgICdmdW5jdGlvbic6IHRydWUsXG5cdCAgICAnb2JqZWN0JzogdHJ1ZVxuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIGNoZWNrR2xvYmFsKHZhbHVlKSB7XG5cdCAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLk9iamVjdCA9PT0gT2JqZWN0KSA/IHZhbHVlIDogbnVsbDtcblx0ICB9XG5cdFxuXHQgIHZhciBmcmVlRXhwb3J0cyA9IChvYmplY3RUeXBlc1t0eXBlb2YgZXhwb3J0c10gJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSkgPyBleHBvcnRzIDogbnVsbDtcblx0ICB2YXIgZnJlZU1vZHVsZSA9IChvYmplY3RUeXBlc1t0eXBlb2YgbW9kdWxlXSAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSkgPyBtb2R1bGUgOiBudWxsO1xuXHQgIHZhciBmcmVlR2xvYmFsID0gY2hlY2tHbG9iYWwoZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSAmJiB0eXBlb2YgZ2xvYmFsID09PSAnb2JqZWN0JyAmJiBnbG9iYWwpO1xuXHQgIHZhciBmcmVlU2VsZiA9IGNoZWNrR2xvYmFsKG9iamVjdFR5cGVzW3R5cGVvZiBzZWxmXSAmJiBzZWxmKTtcblx0ICB2YXIgZnJlZVdpbmRvdyA9IGNoZWNrR2xvYmFsKG9iamVjdFR5cGVzW3R5cGVvZiB3aW5kb3ddICYmIHdpbmRvdyk7XG5cdCAgdmFyIG1vZHVsZUV4cG9ydHMgPSAoZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzKSA/IGZyZWVFeHBvcnRzIDogbnVsbDtcblx0ICB2YXIgdGhpc0dsb2JhbCA9IGNoZWNrR2xvYmFsKG9iamVjdFR5cGVzW3R5cGVvZiB0aGlzXSAmJiB0aGlzKTtcblx0ICB2YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgKChmcmVlV2luZG93ICE9PSAodGhpc0dsb2JhbCAmJiB0aGlzR2xvYmFsLndpbmRvdykpICYmIGZyZWVXaW5kb3cpIHx8IGZyZWVTZWxmIHx8IHRoaXNHbG9iYWwgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0XG5cdCAgdmFyIFJ4ID0ge1xuXHQgICAgaW50ZXJuYWxzOiB7fSxcblx0ICAgIGNvbmZpZzoge1xuXHQgICAgICBQcm9taXNlOiByb290LlByb21pc2Vcblx0ICAgIH0sXG5cdCAgICBoZWxwZXJzOiB7IH1cblx0ICB9O1xuXHRcblx0ICAvLyBEZWZhdWx0c1xuXHQgIHZhciBub29wID0gUnguaGVscGVycy5ub29wID0gZnVuY3Rpb24gKCkgeyB9LFxuXHQgICAgaWRlbnRpdHkgPSBSeC5oZWxwZXJzLmlkZW50aXR5ID0gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHg7IH0sXG5cdCAgICBkZWZhdWx0Tm93ID0gUnguaGVscGVycy5kZWZhdWx0Tm93ID0gRGF0ZS5ub3csXG5cdCAgICBkZWZhdWx0Q29tcGFyZXIgPSBSeC5oZWxwZXJzLmRlZmF1bHRDb21wYXJlciA9IGZ1bmN0aW9uICh4LCB5KSB7IHJldHVybiBpc0VxdWFsKHgsIHkpOyB9LFxuXHQgICAgZGVmYXVsdFN1YkNvbXBhcmVyID0gUnguaGVscGVycy5kZWZhdWx0U3ViQ29tcGFyZXIgPSBmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4geCA+IHkgPyAxIDogKHggPCB5ID8gLTEgOiAwKTsgfSxcblx0ICAgIGRlZmF1bHRLZXlTZXJpYWxpemVyID0gUnguaGVscGVycy5kZWZhdWx0S2V5U2VyaWFsaXplciA9IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LnRvU3RyaW5nKCk7IH0sXG5cdCAgICBkZWZhdWx0RXJyb3IgPSBSeC5oZWxwZXJzLmRlZmF1bHRFcnJvciA9IGZ1bmN0aW9uIChlcnIpIHsgdGhyb3cgZXJyOyB9LFxuXHQgICAgaXNQcm9taXNlID0gUnguaGVscGVycy5pc1Byb21pc2UgPSBmdW5jdGlvbiAocCkgeyByZXR1cm4gISFwICYmIHR5cGVvZiBwLnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcC50aGVuID09PSAnZnVuY3Rpb24nOyB9LFxuXHQgICAgaXNGdW5jdGlvbiA9IFJ4LmhlbHBlcnMuaXNGdW5jdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cdFxuXHQgICAgICB2YXIgaXNGbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyB8fCBmYWxzZTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgLy8gZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zIG9mIENocm9tZSBhbmQgU2FmYXJpXG5cdCAgICAgIGlmIChpc0ZuKC94LykpIHtcblx0ICAgICAgICBpc0ZuID0gZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHJldHVybiBpc0ZuO1xuXHQgICAgfSgpKTtcblx0XG5cdCAgICBmdW5jdGlvbiBjbG9uZUFycmF5KGFycikge1xuXHQgICAgICB2YXIgbGVuID0gYXJyLmxlbmd0aCwgYSA9IG5ldyBBcnJheShsZW4pO1xuXHQgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYVtpXSA9IGFycltpXTsgfVxuXHQgICAgICByZXR1cm4gYTtcblx0ICAgIH1cblx0XG5cdCAgdmFyIGVycm9yT2JqID0ge2U6IHt9fTtcblx0ICBcblx0ICBmdW5jdGlvbiB0cnlDYXRjaGVyR2VuKHRyeUNhdGNoVGFyZ2V0KSB7XG5cdCAgICByZXR1cm4gZnVuY3Rpb24gdHJ5Q2F0Y2hlcigpIHtcblx0ICAgICAgdHJ5IHtcblx0ICAgICAgICByZXR1cm4gdHJ5Q2F0Y2hUYXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGVycm9yT2JqLmUgPSBlO1xuXHQgICAgICAgIHJldHVybiBlcnJvck9iajtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICB9XG5cdFxuXHQgIHZhciB0cnlDYXRjaCA9IFJ4LmludGVybmFscy50cnlDYXRjaCA9IGZ1bmN0aW9uIHRyeUNhdGNoKGZuKSB7XG5cdCAgICBpZiAoIWlzRnVuY3Rpb24oZm4pKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZuIG11c3QgYmUgYSBmdW5jdGlvbicpOyB9XG5cdCAgICByZXR1cm4gdHJ5Q2F0Y2hlckdlbihmbik7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24gdGhyb3dlcihlKSB7XG5cdCAgICB0aHJvdyBlO1xuXHQgIH1cblx0XG5cdCAgUnguY29uZmlnLmxvbmdTdGFja1N1cHBvcnQgPSBmYWxzZTtcblx0ICB2YXIgaGFzU3RhY2tzID0gZmFsc2UsIHN0YWNrcyA9IHRyeUNhdGNoKGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IEVycm9yKCk7IH0pKCk7XG5cdCAgaGFzU3RhY2tzID0gISFzdGFja3MuZSAmJiAhIXN0YWNrcy5lLnN0YWNrO1xuXHRcblx0ICAvLyBBbGwgY29kZSBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgZmlsdGVyZWQgZnJvbSBzdGFjayB0cmFjZXMgcmVwb3J0ZWQgYnkgUnhKU1xuXHQgIHZhciByU3RhcnRpbmdMaW5lID0gY2FwdHVyZUxpbmUoKSwgckZpbGVOYW1lO1xuXHRcblx0ICB2YXIgU1RBQ0tfSlVNUF9TRVBBUkFUT1IgPSAnRnJvbSBwcmV2aW91cyBldmVudDonO1xuXHRcblx0ICBmdW5jdGlvbiBtYWtlU3RhY2tUcmFjZUxvbmcoZXJyb3IsIG9ic2VydmFibGUpIHtcblx0ICAgIC8vIElmIHBvc3NpYmxlLCB0cmFuc2Zvcm0gdGhlIGVycm9yIHN0YWNrIHRyYWNlIGJ5IHJlbW92aW5nIE5vZGUgYW5kIFJ4SlNcblx0ICAgIC8vIGNydWZ0LCB0aGVuIGNvbmNhdGVuYXRpbmcgd2l0aCB0aGUgc3RhY2sgdHJhY2Ugb2YgYG9ic2VydmFibGVgLlxuXHQgICAgaWYgKGhhc1N0YWNrcyAmJlxuXHQgICAgICAgIG9ic2VydmFibGUuc3RhY2sgJiZcblx0ICAgICAgICB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmXG5cdCAgICAgICAgZXJyb3IgIT09IG51bGwgJiZcblx0ICAgICAgICBlcnJvci5zdGFjayAmJlxuXHQgICAgICAgIGVycm9yLnN0YWNrLmluZGV4T2YoU1RBQ0tfSlVNUF9TRVBBUkFUT1IpID09PSAtMVxuXHQgICAgKSB7XG5cdCAgICAgIHZhciBzdGFja3MgPSBbXTtcblx0ICAgICAgZm9yICh2YXIgbyA9IG9ic2VydmFibGU7ICEhbzsgbyA9IG8uc291cmNlKSB7XG5cdCAgICAgICAgaWYgKG8uc3RhY2spIHtcblx0ICAgICAgICAgIHN0YWNrcy51bnNoaWZ0KG8uc3RhY2spO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBzdGFja3MudW5zaGlmdChlcnJvci5zdGFjayk7XG5cdFxuXHQgICAgICB2YXIgY29uY2F0ZWRTdGFja3MgPSBzdGFja3Muam9pbignXFxuJyArIFNUQUNLX0pVTVBfU0VQQVJBVE9SICsgJ1xcbicpO1xuXHQgICAgICBlcnJvci5zdGFjayA9IGZpbHRlclN0YWNrU3RyaW5nKGNvbmNhdGVkU3RhY2tzKTtcblx0ICAgIH1cblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIGZpbHRlclN0YWNrU3RyaW5nKHN0YWNrU3RyaW5nKSB7XG5cdCAgICB2YXIgbGluZXMgPSBzdGFja1N0cmluZy5zcGxpdCgnXFxuJyksIGRlc2lyZWRMaW5lcyA9IFtdO1xuXHQgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgIHZhciBsaW5lID0gbGluZXNbaV07XG5cdFxuXHQgICAgICBpZiAoIWlzSW50ZXJuYWxGcmFtZShsaW5lKSAmJiAhaXNOb2RlRnJhbWUobGluZSkgJiYgbGluZSkge1xuXHQgICAgICAgIGRlc2lyZWRMaW5lcy5wdXNoKGxpbmUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gZGVzaXJlZExpbmVzLmpvaW4oJ1xcbicpO1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gaXNJbnRlcm5hbEZyYW1lKHN0YWNrTGluZSkge1xuXHQgICAgdmFyIGZpbGVOYW1lQW5kTGluZU51bWJlciA9IGdldEZpbGVOYW1lQW5kTGluZU51bWJlcihzdGFja0xpbmUpO1xuXHQgICAgaWYgKCFmaWxlTmFtZUFuZExpbmVOdW1iZXIpIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgICAgdmFyIGZpbGVOYW1lID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzBdLCBsaW5lTnVtYmVyID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzFdO1xuXHRcblx0ICAgIHJldHVybiBmaWxlTmFtZSA9PT0gckZpbGVOYW1lICYmXG5cdCAgICAgIGxpbmVOdW1iZXIgPj0gclN0YXJ0aW5nTGluZSAmJlxuXHQgICAgICBsaW5lTnVtYmVyIDw9IHJFbmRpbmdMaW5lO1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gaXNOb2RlRnJhbWUoc3RhY2tMaW5lKSB7XG5cdCAgICByZXR1cm4gc3RhY2tMaW5lLmluZGV4T2YoJyhtb2R1bGUuanM6JykgIT09IC0xIHx8XG5cdCAgICAgIHN0YWNrTGluZS5pbmRleE9mKCcobm9kZS5qczonKSAhPT0gLTE7XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiBjYXB0dXJlTGluZSgpIHtcblx0ICAgIGlmICghaGFzU3RhY2tzKSB7IHJldHVybjsgfVxuXHRcblx0ICAgIHRyeSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICB2YXIgbGluZXMgPSBlLnN0YWNrLnNwbGl0KCdcXG4nKTtcblx0ICAgICAgdmFyIGZpcnN0TGluZSA9IGxpbmVzWzBdLmluZGV4T2YoJ0AnKSA+IDAgPyBsaW5lc1sxXSA6IGxpbmVzWzJdO1xuXHQgICAgICB2YXIgZmlsZU5hbWVBbmRMaW5lTnVtYmVyID0gZ2V0RmlsZU5hbWVBbmRMaW5lTnVtYmVyKGZpcnN0TGluZSk7XG5cdCAgICAgIGlmICghZmlsZU5hbWVBbmRMaW5lTnVtYmVyKSB7IHJldHVybjsgfVxuXHRcblx0ICAgICAgckZpbGVOYW1lID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzBdO1xuXHQgICAgICByZXR1cm4gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzFdO1xuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gZ2V0RmlsZU5hbWVBbmRMaW5lTnVtYmVyKHN0YWNrTGluZSkge1xuXHQgICAgLy8gTmFtZWQgZnVuY3Rpb25zOiAnYXQgZnVuY3Rpb25OYW1lIChmaWxlbmFtZTpsaW5lTnVtYmVyOmNvbHVtbk51bWJlciknXG5cdCAgICB2YXIgYXR0ZW1wdDEgPSAvYXQgLisgXFwoKC4rKTooXFxkKyk6KD86XFxkKylcXCkkLy5leGVjKHN0YWNrTGluZSk7XG5cdCAgICBpZiAoYXR0ZW1wdDEpIHsgcmV0dXJuIFthdHRlbXB0MVsxXSwgTnVtYmVyKGF0dGVtcHQxWzJdKV07IH1cblx0XG5cdCAgICAvLyBBbm9ueW1vdXMgZnVuY3Rpb25zOiAnYXQgZmlsZW5hbWU6bGluZU51bWJlcjpjb2x1bW5OdW1iZXInXG5cdCAgICB2YXIgYXR0ZW1wdDIgPSAvYXQgKFteIF0rKTooXFxkKyk6KD86XFxkKykkLy5leGVjKHN0YWNrTGluZSk7XG5cdCAgICBpZiAoYXR0ZW1wdDIpIHsgcmV0dXJuIFthdHRlbXB0MlsxXSwgTnVtYmVyKGF0dGVtcHQyWzJdKV07IH1cblx0XG5cdCAgICAvLyBGaXJlZm94IHN0eWxlOiAnZnVuY3Rpb25AZmlsZW5hbWU6bGluZU51bWJlciBvciBAZmlsZW5hbWU6bGluZU51bWJlcidcblx0ICAgIHZhciBhdHRlbXB0MyA9IC8uKkAoLispOihcXGQrKSQvLmV4ZWMoc3RhY2tMaW5lKTtcblx0ICAgIGlmIChhdHRlbXB0MykgeyByZXR1cm4gW2F0dGVtcHQzWzFdLCBOdW1iZXIoYXR0ZW1wdDNbMl0pXTsgfVxuXHQgIH1cblx0XG5cdCAgdmFyIEVtcHR5RXJyb3IgPSBSeC5FbXB0eUVycm9yID0gZnVuY3Rpb24oKSB7XG5cdCAgICB0aGlzLm1lc3NhZ2UgPSAnU2VxdWVuY2UgY29udGFpbnMgbm8gZWxlbWVudHMuJztcblx0ICAgIEVycm9yLmNhbGwodGhpcyk7XG5cdCAgfTtcblx0ICBFbXB0eUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcblx0ICBFbXB0eUVycm9yLnByb3RvdHlwZS5uYW1lID0gJ0VtcHR5RXJyb3InO1xuXHRcblx0ICB2YXIgT2JqZWN0RGlzcG9zZWRFcnJvciA9IFJ4Lk9iamVjdERpc3Bvc2VkRXJyb3IgPSBmdW5jdGlvbigpIHtcblx0ICAgIHRoaXMubWVzc2FnZSA9ICdPYmplY3QgaGFzIGJlZW4gZGlzcG9zZWQnO1xuXHQgICAgRXJyb3IuY2FsbCh0aGlzKTtcblx0ICB9O1xuXHQgIE9iamVjdERpc3Bvc2VkRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuXHQgIE9iamVjdERpc3Bvc2VkRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnT2JqZWN0RGlzcG9zZWRFcnJvcic7XG5cdFxuXHQgIHZhciBBcmd1bWVudE91dE9mUmFuZ2VFcnJvciA9IFJ4LkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdGhpcy5tZXNzYWdlID0gJ0FyZ3VtZW50IG91dCBvZiByYW5nZSc7XG5cdCAgICBFcnJvci5jYWxsKHRoaXMpO1xuXHQgIH07XG5cdCAgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuXHQgIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yLnByb3RvdHlwZS5uYW1lID0gJ0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yJztcblx0XG5cdCAgdmFyIE5vdFN1cHBvcnRlZEVycm9yID0gUnguTm90U3VwcG9ydGVkRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuXHQgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCc7XG5cdCAgICBFcnJvci5jYWxsKHRoaXMpO1xuXHQgIH07XG5cdCAgTm90U3VwcG9ydGVkRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuXHQgIE5vdFN1cHBvcnRlZEVycm9yLnByb3RvdHlwZS5uYW1lID0gJ05vdFN1cHBvcnRlZEVycm9yJztcblx0XG5cdCAgdmFyIE5vdEltcGxlbWVudGVkRXJyb3IgPSBSeC5Ob3RJbXBsZW1lbnRlZEVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcblx0ICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCc7XG5cdCAgICBFcnJvci5jYWxsKHRoaXMpO1xuXHQgIH07XG5cdCAgTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5cdCAgTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUubmFtZSA9ICdOb3RJbXBsZW1lbnRlZEVycm9yJztcblx0XG5cdCAgdmFyIG5vdEltcGxlbWVudGVkID0gUnguaGVscGVycy5ub3RJbXBsZW1lbnRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIG5vdFN1cHBvcnRlZCA9IFJ4LmhlbHBlcnMubm90U3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEVycm9yKCk7XG5cdCAgfTtcblx0XG5cdCAgLy8gU2hpbSBpbiBpdGVyYXRvciBzdXBwb3J0XG5cdCAgdmFyICRpdGVyYXRvciQgPSAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3IpIHx8XG5cdCAgICAnX2VzNnNoaW1faXRlcmF0b3JfJztcblx0ICAvLyBCdWcgZm9yIG1vemlsbGEgdmVyc2lvblxuXHQgIGlmIChyb290LlNldCAmJiB0eXBlb2YgbmV3IHJvb3QuU2V0KClbJ0BAaXRlcmF0b3InXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgJGl0ZXJhdG9yJCA9ICdAQGl0ZXJhdG9yJztcblx0ICB9XG5cdFxuXHQgIHZhciBkb25lRW51bWVyYXRvciA9IFJ4LmRvbmVFbnVtZXJhdG9yID0geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG5cdFxuXHQgIHZhciBpc0l0ZXJhYmxlID0gUnguaGVscGVycy5pc0l0ZXJhYmxlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgIHJldHVybiBvICYmIG9bJGl0ZXJhdG9yJF0gIT09IHVuZGVmaW5lZDtcblx0ICB9O1xuXHRcblx0ICB2YXIgaXNBcnJheUxpa2UgPSBSeC5oZWxwZXJzLmlzQXJyYXlMaWtlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgIHJldHVybiBvICYmIG8ubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG5cdCAgfTtcblx0XG5cdCAgUnguaGVscGVycy5pdGVyYXRvciA9ICRpdGVyYXRvciQ7XG5cdFxuXHQgIHZhciBiaW5kQ2FsbGJhY2sgPSBSeC5pbnRlcm5hbHMuYmluZENhbGxiYWNrID0gZnVuY3Rpb24gKGZ1bmMsIHRoaXNBcmcsIGFyZ0NvdW50KSB7XG5cdCAgICBpZiAodHlwZW9mIHRoaXNBcmcgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmdW5jOyB9XG5cdCAgICBzd2l0Y2goYXJnQ291bnQpIHtcblx0ICAgICAgY2FzZSAwOlxuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZylcblx0ICAgICAgICB9O1xuXHQgICAgICBjYXNlIDE6XG5cdCAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuXHQgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmcpO1xuXHQgICAgICAgIH1cblx0ICAgICAgY2FzZSAyOlxuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcblx0ICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgdmFsdWUsIGluZGV4KTtcblx0ICAgICAgICB9O1xuXHQgICAgICBjYXNlIDM6XG5cdCAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuXHQgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuXHQgICAgICAgIH07XG5cdCAgICB9XG5cdFxuXHQgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuXHQgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmd1bWVudHMpO1xuXHQgICAgfTtcblx0ICB9O1xuXHRcblx0ICAvKiogVXNlZCB0byBkZXRlcm1pbmUgaWYgdmFsdWVzIGFyZSBvZiB0aGUgbGFuZ3VhZ2UgdHlwZSBPYmplY3QgKi9cblx0ICB2YXIgZG9udEVudW1zID0gWyd0b1N0cmluZycsXG5cdCAgICAndG9Mb2NhbGVTdHJpbmcnLFxuXHQgICAgJ3ZhbHVlT2YnLFxuXHQgICAgJ2hhc093blByb3BlcnR5Jyxcblx0ICAgICdpc1Byb3RvdHlwZU9mJyxcblx0ICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG5cdCAgICAnY29uc3RydWN0b3InXSxcblx0ICBkb250RW51bXNMZW5ndGggPSBkb250RW51bXMubGVuZ3RoO1xuXHRcblx0ICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHNob3J0Y3V0cyAqL1xuXHQgIHZhciBhcmdzQ2xhc3MgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcblx0ICAgIGFycmF5Q2xhc3MgPSAnW29iamVjdCBBcnJheV0nLFxuXHQgICAgYm9vbENsYXNzID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuXHQgICAgZGF0ZUNsYXNzID0gJ1tvYmplY3QgRGF0ZV0nLFxuXHQgICAgZXJyb3JDbGFzcyA9ICdbb2JqZWN0IEVycm9yXScsXG5cdCAgICBmdW5jQ2xhc3MgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuXHQgICAgbnVtYmVyQ2xhc3MgPSAnW29iamVjdCBOdW1iZXJdJyxcblx0ICAgIG9iamVjdENsYXNzID0gJ1tvYmplY3QgT2JqZWN0XScsXG5cdCAgICByZWdleHBDbGFzcyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuXHQgICAgc3RyaW5nQ2xhc3MgPSAnW29iamVjdCBTdHJpbmddJztcblx0XG5cdCAgdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxcblx0ICAgIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcblx0ICAgIHN1cHBvcnRzQXJnc0NsYXNzID0gdG9TdHJpbmcuY2FsbChhcmd1bWVudHMpID09IGFyZ3NDbGFzcywgLy8gRm9yIGxlc3MgPElFOSAmJiBGRjw0XG5cdCAgICBzdXBwb3J0Tm9kZUNsYXNzLFxuXHQgICAgZXJyb3JQcm90byA9IEVycm9yLnByb3RvdHlwZSxcblx0ICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZSxcblx0ICAgIHN0cmluZ1Byb3RvID0gU3RyaW5nLnByb3RvdHlwZSxcblx0ICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cdFxuXHQgIHRyeSB7XG5cdCAgICBzdXBwb3J0Tm9kZUNsYXNzID0gISh0b1N0cmluZy5jYWxsKGRvY3VtZW50KSA9PSBvYmplY3RDbGFzcyAmJiAhKHsgJ3RvU3RyaW5nJzogMCB9ICsgJycpKTtcblx0ICB9IGNhdGNoIChlKSB7XG5cdCAgICBzdXBwb3J0Tm9kZUNsYXNzID0gdHJ1ZTtcblx0ICB9XG5cdFxuXHQgIHZhciBub25FbnVtUHJvcHMgPSB7fTtcblx0ICBub25FbnVtUHJvcHNbYXJyYXlDbGFzc10gPSBub25FbnVtUHJvcHNbZGF0ZUNsYXNzXSA9IG5vbkVudW1Qcm9wc1tudW1iZXJDbGFzc10gPSB7ICdjb25zdHJ1Y3Rvcic6IHRydWUsICd0b0xvY2FsZVN0cmluZyc6IHRydWUsICd0b1N0cmluZyc6IHRydWUsICd2YWx1ZU9mJzogdHJ1ZSB9O1xuXHQgIG5vbkVudW1Qcm9wc1tib29sQ2xhc3NdID0gbm9uRW51bVByb3BzW3N0cmluZ0NsYXNzXSA9IHsgJ2NvbnN0cnVjdG9yJzogdHJ1ZSwgJ3RvU3RyaW5nJzogdHJ1ZSwgJ3ZhbHVlT2YnOiB0cnVlIH07XG5cdCAgbm9uRW51bVByb3BzW2Vycm9yQ2xhc3NdID0gbm9uRW51bVByb3BzW2Z1bmNDbGFzc10gPSBub25FbnVtUHJvcHNbcmVnZXhwQ2xhc3NdID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlIH07XG5cdCAgbm9uRW51bVByb3BzW29iamVjdENsYXNzXSA9IHsgJ2NvbnN0cnVjdG9yJzogdHJ1ZSB9O1xuXHRcblx0ICB2YXIgc3VwcG9ydCA9IHt9O1xuXHQgIChmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgY3RvciA9IGZ1bmN0aW9uKCkgeyB0aGlzLnggPSAxOyB9LFxuXHQgICAgICBwcm9wcyA9IFtdO1xuXHRcblx0ICAgIGN0b3IucHJvdG90eXBlID0geyAndmFsdWVPZic6IDEsICd5JzogMSB9O1xuXHQgICAgZm9yICh2YXIga2V5IGluIG5ldyBjdG9yKSB7IHByb3BzLnB1c2goa2V5KTsgfVxuXHQgICAgZm9yIChrZXkgaW4gYXJndW1lbnRzKSB7IH1cblx0XG5cdCAgICAvLyBEZXRlY3QgaWYgYG5hbWVgIG9yIGBtZXNzYWdlYCBwcm9wZXJ0aWVzIG9mIGBFcnJvci5wcm90b3R5cGVgIGFyZSBlbnVtZXJhYmxlIGJ5IGRlZmF1bHQuXG5cdCAgICBzdXBwb3J0LmVudW1FcnJvclByb3BzID0gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlcnJvclByb3RvLCAnbWVzc2FnZScpIHx8IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZXJyb3JQcm90bywgJ25hbWUnKTtcblx0XG5cdCAgICAvLyBEZXRlY3QgaWYgYHByb3RvdHlwZWAgcHJvcGVydGllcyBhcmUgZW51bWVyYWJsZSBieSBkZWZhdWx0LlxuXHQgICAgc3VwcG9ydC5lbnVtUHJvdG90eXBlcyA9IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoY3RvciwgJ3Byb3RvdHlwZScpO1xuXHRcblx0ICAgIC8vIERldGVjdCBpZiBgYXJndW1lbnRzYCBvYmplY3QgaW5kZXhlcyBhcmUgbm9uLWVudW1lcmFibGVcblx0ICAgIHN1cHBvcnQubm9uRW51bUFyZ3MgPSBrZXkgIT0gMDtcblx0XG5cdCAgICAvLyBEZXRlY3QgaWYgcHJvcGVydGllcyBzaGFkb3dpbmcgdGhvc2Ugb24gYE9iamVjdC5wcm90b3R5cGVgIGFyZSBub24tZW51bWVyYWJsZS5cblx0ICAgIHN1cHBvcnQubm9uRW51bVNoYWRvd3MgPSAhL3ZhbHVlT2YvLnRlc3QocHJvcHMpO1xuXHQgIH0oMSkpO1xuXHRcblx0ICB2YXIgaXNPYmplY3QgPSBSeC5pbnRlcm5hbHMuaXNPYmplY3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cdCAgICByZXR1cm4gdmFsdWUgJiYgKHR5cGUgPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlID09ICdvYmplY3QnKSB8fCBmYWxzZTtcblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG5cdCAgICB2YXIgcmVzdWx0ID0gW107XG5cdCAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcblx0ICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgIH1cblx0ICAgIGlmIChzdXBwb3J0Lm5vbkVudW1BcmdzICYmIG9iamVjdC5sZW5ndGggJiYgaXNBcmd1bWVudHMob2JqZWN0KSkge1xuXHQgICAgICBvYmplY3QgPSBzbGljZS5jYWxsKG9iamVjdCk7XG5cdCAgICB9XG5cdCAgICB2YXIgc2tpcFByb3RvID0gc3VwcG9ydC5lbnVtUHJvdG90eXBlcyAmJiB0eXBlb2Ygb2JqZWN0ID09ICdmdW5jdGlvbicsXG5cdCAgICAgICAgc2tpcEVycm9yUHJvcHMgPSBzdXBwb3J0LmVudW1FcnJvclByb3BzICYmIChvYmplY3QgPT09IGVycm9yUHJvdG8gfHwgb2JqZWN0IGluc3RhbmNlb2YgRXJyb3IpO1xuXHRcblx0ICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcblx0ICAgICAgaWYgKCEoc2tpcFByb3RvICYmIGtleSA9PSAncHJvdG90eXBlJykgJiZcblx0ICAgICAgICAgICEoc2tpcEVycm9yUHJvcHMgJiYgKGtleSA9PSAnbWVzc2FnZScgfHwga2V5ID09ICduYW1lJykpKSB7XG5cdCAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIGlmIChzdXBwb3J0Lm5vbkVudW1TaGFkb3dzICYmIG9iamVjdCAhPT0gb2JqZWN0UHJvdG8pIHtcblx0ICAgICAgdmFyIGN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG5cdCAgICAgICAgICBpbmRleCA9IC0xLFxuXHQgICAgICAgICAgbGVuZ3RoID0gZG9udEVudW1zTGVuZ3RoO1xuXHRcblx0ICAgICAgaWYgKG9iamVjdCA9PT0gKGN0b3IgJiYgY3Rvci5wcm90b3R5cGUpKSB7XG5cdCAgICAgICAgdmFyIGNsYXNzTmFtZSA9IG9iamVjdCA9PT0gc3RyaW5nUHJvdG8gPyBzdHJpbmdDbGFzcyA6IG9iamVjdCA9PT0gZXJyb3JQcm90byA/IGVycm9yQ2xhc3MgOiB0b1N0cmluZy5jYWxsKG9iamVjdCksXG5cdCAgICAgICAgICAgIG5vbkVudW0gPSBub25FbnVtUHJvcHNbY2xhc3NOYW1lXTtcblx0ICAgICAgfVxuXHQgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuXHQgICAgICAgIGtleSA9IGRvbnRFbnVtc1tpbmRleF07XG5cdCAgICAgICAgaWYgKCEobm9uRW51bSAmJiBub25FbnVtW2tleV0pICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG5cdCAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJlc3VsdDtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIGludGVybmFsRm9yKG9iamVjdCwgY2FsbGJhY2ssIGtleXNGdW5jKSB7XG5cdCAgICB2YXIgaW5kZXggPSAtMSxcblx0ICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLFxuXHQgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cdFxuXHQgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0ICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblx0ICAgICAgaWYgKGNhbGxiYWNrKG9iamVjdFtrZXldLCBrZXksIG9iamVjdCkgPT09IGZhbHNlKSB7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBvYmplY3Q7XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiBpbnRlcm5hbEZvckluKG9iamVjdCwgY2FsbGJhY2spIHtcblx0ICAgIHJldHVybiBpbnRlcm5hbEZvcihvYmplY3QsIGNhbGxiYWNrLCBrZXlzSW4pO1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gaXNOb2RlKHZhbHVlKSB7XG5cdCAgICAvLyBJRSA8IDkgcHJlc2VudHMgRE9NIG5vZGVzIGFzIGBPYmplY3RgIG9iamVjdHMgZXhjZXB0IHRoZXkgaGF2ZSBgdG9TdHJpbmdgXG5cdCAgICAvLyBtZXRob2RzIHRoYXQgYXJlIGB0eXBlb2ZgIFwic3RyaW5nXCIgYW5kIHN0aWxsIGNhbiBjb2VyY2Ugbm9kZXMgdG8gc3RyaW5nc1xuXHQgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nICYmIHR5cGVvZiAodmFsdWUgKyAnJykgPT0gJ3N0cmluZyc7XG5cdCAgfVxuXHRcblx0ICB2YXIgaXNBcmd1bWVudHMgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYXJnc0NsYXNzIDogZmFsc2U7XG5cdCAgfVxuXHRcblx0ICAvLyBmYWxsYmFjayBmb3IgYnJvd3NlcnMgdGhhdCBjYW4ndCBkZXRlY3QgYGFyZ3VtZW50c2Agb2JqZWN0cyBieSBbW0NsYXNzXV1cblx0ICBpZiAoIXN1cHBvcnRzQXJnc0NsYXNzKSB7XG5cdCAgICBpc0FyZ3VtZW50cyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgIHJldHVybiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSA/IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSA6IGZhbHNlO1xuXHQgICAgfTtcblx0ICB9XG5cdFxuXHQgIHZhciBpc0VxdWFsID0gUnguaW50ZXJuYWxzLmlzRXF1YWwgPSBmdW5jdGlvbiAoeCwgeSkge1xuXHQgICAgcmV0dXJuIGRlZXBFcXVhbHMoeCwgeSwgW10sIFtdKTtcblx0ICB9O1xuXHRcblx0ICAvKiogQHByaXZhdGVcblx0ICAgKiBVc2VkIGZvciBkZWVwIGNvbXBhcmlzb25cblx0ICAgKiovXG5cdCAgZnVuY3Rpb24gZGVlcEVxdWFscyhhLCBiLCBzdGFja0EsIHN0YWNrQikge1xuXHQgICAgLy8gZXhpdCBlYXJseSBmb3IgaWRlbnRpY2FsIHZhbHVlc1xuXHQgICAgaWYgKGEgPT09IGIpIHtcblx0ICAgICAgLy8gdHJlYXQgYCswYCB2cy4gYC0wYCBhcyBub3QgZXF1YWxcblx0ICAgICAgcmV0dXJuIGEgIT09IDAgfHwgKDEgLyBhID09IDEgLyBiKTtcblx0ICAgIH1cblx0XG5cdCAgICB2YXIgdHlwZSA9IHR5cGVvZiBhLFxuXHQgICAgICAgIG90aGVyVHlwZSA9IHR5cGVvZiBiO1xuXHRcblx0ICAgIC8vIGV4aXQgZWFybHkgZm9yIHVubGlrZSBwcmltaXRpdmUgdmFsdWVzXG5cdCAgICBpZiAoYSA9PT0gYSAmJiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCB8fFxuXHQgICAgICAgICh0eXBlICE9ICdmdW5jdGlvbicgJiYgdHlwZSAhPSAnb2JqZWN0JyAmJiBvdGhlclR5cGUgIT0gJ2Z1bmN0aW9uJyAmJiBvdGhlclR5cGUgIT0gJ29iamVjdCcpKSkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdFxuXHQgICAgLy8gY29tcGFyZSBbW0NsYXNzXV0gbmFtZXNcblx0ICAgIHZhciBjbGFzc05hbWUgPSB0b1N0cmluZy5jYWxsKGEpLFxuXHQgICAgICAgIG90aGVyQ2xhc3MgPSB0b1N0cmluZy5jYWxsKGIpO1xuXHRcblx0ICAgIGlmIChjbGFzc05hbWUgPT0gYXJnc0NsYXNzKSB7XG5cdCAgICAgIGNsYXNzTmFtZSA9IG9iamVjdENsYXNzO1xuXHQgICAgfVxuXHQgICAgaWYgKG90aGVyQ2xhc3MgPT0gYXJnc0NsYXNzKSB7XG5cdCAgICAgIG90aGVyQ2xhc3MgPSBvYmplY3RDbGFzcztcblx0ICAgIH1cblx0ICAgIGlmIChjbGFzc05hbWUgIT0gb3RoZXJDbGFzcykge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuXHQgICAgICBjYXNlIGJvb2xDbGFzczpcblx0ICAgICAgY2FzZSBkYXRlQ2xhc3M6XG5cdCAgICAgICAgLy8gY29lcmNlIGRhdGVzIGFuZCBib29sZWFucyB0byBudW1iZXJzLCBkYXRlcyB0byBtaWxsaXNlY29uZHMgYW5kIGJvb2xlYW5zXG5cdCAgICAgICAgLy8gdG8gYDFgIG9yIGAwYCB0cmVhdGluZyBpbnZhbGlkIGRhdGVzIGNvZXJjZWQgdG8gYE5hTmAgYXMgbm90IGVxdWFsXG5cdCAgICAgICAgcmV0dXJuICthID09ICtiO1xuXHRcblx0ICAgICAgY2FzZSBudW1iZXJDbGFzczpcblx0ICAgICAgICAvLyB0cmVhdCBgTmFOYCB2cy4gYE5hTmAgYXMgZXF1YWxcblx0ICAgICAgICByZXR1cm4gKGEgIT0gK2EpID9cblx0ICAgICAgICAgIGIgIT0gK2IgOlxuXHQgICAgICAgICAgLy8gYnV0IHRyZWF0IGAtMGAgdnMuIGArMGAgYXMgbm90IGVxdWFsXG5cdCAgICAgICAgICAoYSA9PSAwID8gKDEgLyBhID09IDEgLyBiKSA6IGEgPT0gK2IpO1xuXHRcblx0ICAgICAgY2FzZSByZWdleHBDbGFzczpcblx0ICAgICAgY2FzZSBzdHJpbmdDbGFzczpcblx0ICAgICAgICAvLyBjb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIChodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEwLjYuNClcblx0ICAgICAgICAvLyB0cmVhdCBzdHJpbmcgcHJpbWl0aXZlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBvYmplY3QgaW5zdGFuY2VzIGFzIGVxdWFsXG5cdCAgICAgICAgcmV0dXJuIGEgPT0gU3RyaW5nKGIpO1xuXHQgICAgfVxuXHQgICAgdmFyIGlzQXJyID0gY2xhc3NOYW1lID09IGFycmF5Q2xhc3M7XG5cdCAgICBpZiAoIWlzQXJyKSB7XG5cdFxuXHQgICAgICAvLyBleGl0IGZvciBmdW5jdGlvbnMgYW5kIERPTSBub2Rlc1xuXHQgICAgICBpZiAoY2xhc3NOYW1lICE9IG9iamVjdENsYXNzIHx8ICghc3VwcG9ydC5ub2RlQ2xhc3MgJiYgKGlzTm9kZShhKSB8fCBpc05vZGUoYikpKSkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICAvLyBpbiBvbGRlciB2ZXJzaW9ucyBvZiBPcGVyYSwgYGFyZ3VtZW50c2Agb2JqZWN0cyBoYXZlIGBBcnJheWAgY29uc3RydWN0b3JzXG5cdCAgICAgIHZhciBjdG9yQSA9ICFzdXBwb3J0LmFyZ3NPYmplY3QgJiYgaXNBcmd1bWVudHMoYSkgPyBPYmplY3QgOiBhLmNvbnN0cnVjdG9yLFxuXHQgICAgICAgICAgY3RvckIgPSAhc3VwcG9ydC5hcmdzT2JqZWN0ICYmIGlzQXJndW1lbnRzKGIpID8gT2JqZWN0IDogYi5jb25zdHJ1Y3Rvcjtcblx0XG5cdCAgICAgIC8vIG5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsXG5cdCAgICAgIGlmIChjdG9yQSAhPSBjdG9yQiAmJlxuXHQgICAgICAgICAgICAhKGhhc093blByb3BlcnR5LmNhbGwoYSwgJ2NvbnN0cnVjdG9yJykgJiYgaGFzT3duUHJvcGVydHkuY2FsbChiLCAnY29uc3RydWN0b3InKSkgJiZcblx0ICAgICAgICAgICAgIShpc0Z1bmN0aW9uKGN0b3JBKSAmJiBjdG9yQSBpbnN0YW5jZW9mIGN0b3JBICYmIGlzRnVuY3Rpb24oY3RvckIpICYmIGN0b3JCIGluc3RhbmNlb2YgY3RvckIpICYmXG5cdCAgICAgICAgICAgICgnY29uc3RydWN0b3InIGluIGEgJiYgJ2NvbnN0cnVjdG9yJyBpbiBiKVxuXHQgICAgICAgICAgKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLyBhc3N1bWUgY3ljbGljIHN0cnVjdHVyZXMgYXJlIGVxdWFsXG5cdCAgICAvLyB0aGUgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgY3ljbGljIHN0cnVjdHVyZXMgaXMgYWRhcHRlZCBmcm9tIEVTIDUuMVxuXHQgICAgLy8gc2VjdGlvbiAxNS4xMi4zLCBhYnN0cmFjdCBvcGVyYXRpb24gYEpPYCAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMi4zKVxuXHQgICAgdmFyIGluaXRlZFN0YWNrID0gIXN0YWNrQTtcblx0ICAgIHN0YWNrQSB8fCAoc3RhY2tBID0gW10pO1xuXHQgICAgc3RhY2tCIHx8IChzdGFja0IgPSBbXSk7XG5cdFxuXHQgICAgdmFyIGxlbmd0aCA9IHN0YWNrQS5sZW5ndGg7XG5cdCAgICB3aGlsZSAobGVuZ3RoLS0pIHtcblx0ICAgICAgaWYgKHN0YWNrQVtsZW5ndGhdID09IGEpIHtcblx0ICAgICAgICByZXR1cm4gc3RhY2tCW2xlbmd0aF0gPT0gYjtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgdmFyIHNpemUgPSAwO1xuXHQgICAgdmFyIHJlc3VsdCA9IHRydWU7XG5cdFxuXHQgICAgLy8gYWRkIGBhYCBhbmQgYGJgIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0c1xuXHQgICAgc3RhY2tBLnB1c2goYSk7XG5cdCAgICBzdGFja0IucHVzaChiKTtcblx0XG5cdCAgICAvLyByZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpXG5cdCAgICBpZiAoaXNBcnIpIHtcblx0ICAgICAgLy8gY29tcGFyZSBsZW5ndGhzIHRvIGRldGVybWluZSBpZiBhIGRlZXAgY29tcGFyaXNvbiBpcyBuZWNlc3Nhcnlcblx0ICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG5cdCAgICAgIHNpemUgPSBiLmxlbmd0aDtcblx0ICAgICAgcmVzdWx0ID0gc2l6ZSA9PSBsZW5ndGg7XG5cdFxuXHQgICAgICBpZiAocmVzdWx0KSB7XG5cdCAgICAgICAgLy8gZGVlcCBjb21wYXJlIHRoZSBjb250ZW50cywgaWdub3Jpbmcgbm9uLW51bWVyaWMgcHJvcGVydGllc1xuXHQgICAgICAgIHdoaWxlIChzaXplLS0pIHtcblx0ICAgICAgICAgIHZhciBpbmRleCA9IGxlbmd0aCxcblx0ICAgICAgICAgICAgICB2YWx1ZSA9IGJbc2l6ZV07XG5cdFxuXHQgICAgICAgICAgaWYgKCEocmVzdWx0ID0gZGVlcEVxdWFscyhhW3NpemVdLCB2YWx1ZSwgc3RhY2tBLCBzdGFja0IpKSkge1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGVsc2Uge1xuXHQgICAgICAvLyBkZWVwIGNvbXBhcmUgb2JqZWN0cyB1c2luZyBgZm9ySW5gLCBpbnN0ZWFkIG9mIGBmb3JPd25gLCB0byBhdm9pZCBgT2JqZWN0LmtleXNgXG5cdCAgICAgIC8vIHdoaWNoLCBpbiB0aGlzIGNhc2UsIGlzIG1vcmUgY29zdGx5XG5cdCAgICAgIGludGVybmFsRm9ySW4oYiwgZnVuY3Rpb24odmFsdWUsIGtleSwgYikge1xuXHQgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleSkpIHtcblx0ICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcy5cblx0ICAgICAgICAgIHNpemUrKztcblx0ICAgICAgICAgIC8vIGRlZXAgY29tcGFyZSBlYWNoIHByb3BlcnR5IHZhbHVlLlxuXHQgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGtleSkgJiYgZGVlcEVxdWFscyhhW2tleV0sIHZhbHVlLCBzdGFja0EsIHN0YWNrQikpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdFxuXHQgICAgICBpZiAocmVzdWx0KSB7XG5cdCAgICAgICAgLy8gZW5zdXJlIGJvdGggb2JqZWN0cyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzXG5cdCAgICAgICAgaW50ZXJuYWxGb3JJbihhLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBhKSB7XG5cdCAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChhLCBrZXkpKSB7XG5cdCAgICAgICAgICAgIC8vIGBzaXplYCB3aWxsIGJlIGAtMWAgaWYgYGFgIGhhcyBtb3JlIHByb3BlcnRpZXMgdGhhbiBgYmBcblx0ICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSAtLXNpemUgPiAtMSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHN0YWNrQS5wb3AoKTtcblx0ICAgIHN0YWNrQi5wb3AoKTtcblx0XG5cdCAgICByZXR1cm4gcmVzdWx0O1xuXHQgIH1cblx0XG5cdCAgdmFyIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSxcblx0ICAgICAgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cdFxuXHQgIHZhciBpbmhlcml0cyA9IFJ4LmludGVybmFscy5pbmhlcml0cyA9IGZ1bmN0aW9uIChjaGlsZCwgcGFyZW50KSB7XG5cdCAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9XG5cdCAgICBfXy5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuXHQgICAgY2hpbGQucHJvdG90eXBlID0gbmV3IF9fKCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIGFkZFByb3BlcnRpZXMgPSBSeC5pbnRlcm5hbHMuYWRkUHJvcGVydGllcyA9IGZ1bmN0aW9uIChvYmopIHtcblx0ICAgIGZvcih2YXIgc291cmNlcyA9IFtdLCBpID0gMSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7IHNvdXJjZXMucHVzaChhcmd1bWVudHNbaV0pOyB9XG5cdCAgICBmb3IgKHZhciBpZHggPSAwLCBsbiA9IHNvdXJjZXMubGVuZ3RoOyBpZHggPCBsbjsgaWR4KyspIHtcblx0ICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaWR4XTtcblx0ICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcblx0ICAgICAgICBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICAvLyBSeCBVdGlsc1xuXHQgIHZhciBhZGRSZWYgPSBSeC5pbnRlcm5hbHMuYWRkUmVmID0gZnVuY3Rpb24gKHhzLCByKSB7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShyLmdldERpc3Bvc2FibGUoKSwgeHMuc3Vic2NyaWJlKG9ic2VydmVyKSk7XG5cdCAgICB9KTtcblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBhcnJheUluaXRpYWxpemUoY291bnQsIGZhY3RvcnkpIHtcblx0ICAgIHZhciBhID0gbmV3IEFycmF5KGNvdW50KTtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuXHQgICAgICBhW2ldID0gZmFjdG9yeSgpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGE7XG5cdCAgfVxuXHRcblx0ICAvKipcblx0ICAgKiBSZXByZXNlbnRzIGEgZ3JvdXAgb2YgZGlzcG9zYWJsZSByZXNvdXJjZXMgdGhhdCBhcmUgZGlzcG9zZWQgdG9nZXRoZXIuXG5cdCAgICogQGNvbnN0cnVjdG9yXG5cdCAgICovXG5cdCAgdmFyIENvbXBvc2l0ZURpc3Bvc2FibGUgPSBSeC5Db21wb3NpdGVEaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGFyZ3MgPSBbXSwgaSwgbGVuO1xuXHQgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuXHQgICAgICBhcmdzID0gYXJndW1lbnRzWzBdO1xuXHQgICAgICBsZW4gPSBhcmdzLmxlbmd0aDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdCAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgICAgfVxuXHQgICAgdGhpcy5kaXNwb3NhYmxlcyA9IGFyZ3M7XG5cdCAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcblx0ICAgIHRoaXMubGVuZ3RoID0gYXJncy5sZW5ndGg7XG5cdCAgfTtcblx0XG5cdCAgdmFyIENvbXBvc2l0ZURpc3Bvc2FibGVQcm90b3R5cGUgPSBDb21wb3NpdGVEaXNwb3NhYmxlLnByb3RvdHlwZTtcblx0XG5cdCAgLyoqXG5cdCAgICogQWRkcyBhIGRpc3Bvc2FibGUgdG8gdGhlIENvbXBvc2l0ZURpc3Bvc2FibGUgb3IgZGlzcG9zZXMgdGhlIGRpc3Bvc2FibGUgaWYgdGhlIENvbXBvc2l0ZURpc3Bvc2FibGUgaXMgZGlzcG9zZWQuXG5cdCAgICogQHBhcmFtIHtNaXhlZH0gaXRlbSBEaXNwb3NhYmxlIHRvIGFkZC5cblx0ICAgKi9cblx0ICBDb21wb3NpdGVEaXNwb3NhYmxlUHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICBpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdCAgICAgIGl0ZW0uZGlzcG9zZSgpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wdXNoKGl0ZW0pO1xuXHQgICAgICB0aGlzLmxlbmd0aCsrO1xuXHQgICAgfVxuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIFJlbW92ZXMgYW5kIGRpc3Bvc2VzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgZGlzcG9zYWJsZSBmcm9tIHRoZSBDb21wb3NpdGVEaXNwb3NhYmxlLlxuXHQgICAqIEBwYXJhbSB7TWl4ZWR9IGl0ZW0gRGlzcG9zYWJsZSB0byByZW1vdmUuXG5cdCAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgZm91bmQ7IGZhbHNlIG90aGVyd2lzZS5cblx0ICAgKi9cblx0ICBDb21wb3NpdGVEaXNwb3NhYmxlUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICB2YXIgc2hvdWxkRGlzcG9zZSA9IGZhbHNlO1xuXHQgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcblx0ICAgICAgdmFyIGlkeCA9IHRoaXMuZGlzcG9zYWJsZXMuaW5kZXhPZihpdGVtKTtcblx0ICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcblx0ICAgICAgICBzaG91bGREaXNwb3NlID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmRpc3Bvc2FibGVzLnNwbGljZShpZHgsIDEpO1xuXHQgICAgICAgIHRoaXMubGVuZ3RoLS07XG5cdCAgICAgICAgaXRlbS5kaXNwb3NlKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBzaG91bGREaXNwb3NlO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqICBEaXNwb3NlcyBhbGwgZGlzcG9zYWJsZXMgaW4gdGhlIGdyb3VwIGFuZCByZW1vdmVzIHRoZW0gZnJvbSB0aGUgZ3JvdXAuXG5cdCAgICovXG5cdCAgQ29tcG9zaXRlRGlzcG9zYWJsZVByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgICAgdmFyIGxlbiA9IHRoaXMuZGlzcG9zYWJsZXMubGVuZ3RoLCBjdXJyZW50RGlzcG9zYWJsZXMgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGN1cnJlbnREaXNwb3NhYmxlc1tpXSA9IHRoaXMuZGlzcG9zYWJsZXNbaV07IH1cblx0ICAgICAgdGhpcy5kaXNwb3NhYmxlcyA9IFtdO1xuXHQgICAgICB0aGlzLmxlbmd0aCA9IDA7XG5cdFxuXHQgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICBjdXJyZW50RGlzcG9zYWJsZXNbaV0uZGlzcG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogUHJvdmlkZXMgYSBzZXQgb2Ygc3RhdGljIG1ldGhvZHMgZm9yIGNyZWF0aW5nIERpc3Bvc2FibGVzLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3Bvc2UgQWN0aW9uIHRvIHJ1biBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgdG8gZGlzcG9zZS4gVGhlIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIHJ1biBhdCBtb3N0IG9uY2UuXG5cdCAgICovXG5cdCAgdmFyIERpc3Bvc2FibGUgPSBSeC5EaXNwb3NhYmxlID0gZnVuY3Rpb24gKGFjdGlvbikge1xuXHQgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbiB8fCBub29wO1xuXHQgIH07XG5cdFxuXHQgIC8qKiBQZXJmb3JtcyB0aGUgdGFzayBvZiBjbGVhbmluZyB1cCByZXNvdXJjZXMuICovXG5cdCAgRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdCAgICAgIHRoaXMuYWN0aW9uKCk7XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICB9XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgb2JqZWN0IHRoYXQgaW52b2tlcyB0aGUgc3BlY2lmaWVkIGFjdGlvbiB3aGVuIGRpc3Bvc2VkLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3Bvc2UgQWN0aW9uIHRvIHJ1biBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgdG8gZGlzcG9zZS4gVGhlIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIHJ1biBhdCBtb3N0IG9uY2UuXG5cdCAgICogQHJldHVybiB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHRoYXQgcnVucyB0aGUgZ2l2ZW4gYWN0aW9uIHVwb24gZGlzcG9zYWwuXG5cdCAgICovXG5cdCAgdmFyIGRpc3Bvc2FibGVDcmVhdGUgPSBEaXNwb3NhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChhY3Rpb24pIHsgcmV0dXJuIG5ldyBEaXNwb3NhYmxlKGFjdGlvbik7IH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIEdldHMgdGhlIGRpc3Bvc2FibGUgdGhhdCBkb2VzIG5vdGhpbmcgd2hlbiBkaXNwb3NlZC5cblx0ICAgKi9cblx0ICB2YXIgZGlzcG9zYWJsZUVtcHR5ID0gRGlzcG9zYWJsZS5lbXB0eSA9IHsgZGlzcG9zZTogbm9vcCB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgZGlzcG9zYWJsZVxuXHQgICAqIEBwYXJhbSB7T2JqZWN0fSBPYmplY3QgdG8gdGVzdCB3aGV0aGVyIGl0IGhhcyBhIGRpc3Bvc2UgbWV0aG9kXG5cdCAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgYSBkaXNwb3NhYmxlIG9iamVjdCwgZWxzZSBmYWxzZS5cblx0ICAgKi9cblx0ICB2YXIgaXNEaXNwb3NhYmxlID0gRGlzcG9zYWJsZS5pc0Rpc3Bvc2FibGUgPSBmdW5jdGlvbiAoZCkge1xuXHQgICAgcmV0dXJuIGQgJiYgaXNGdW5jdGlvbihkLmRpc3Bvc2UpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBjaGVja0Rpc3Bvc2VkID0gRGlzcG9zYWJsZS5jaGVja0Rpc3Bvc2VkID0gZnVuY3Rpb24gKGRpc3Bvc2FibGUpIHtcblx0ICAgIGlmIChkaXNwb3NhYmxlLmlzRGlzcG9zZWQpIHsgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXJyb3IoKTsgfVxuXHQgIH07XG5cdFxuXHQgIHZhciBkaXNwb3NhYmxlRml4dXAgPSBEaXNwb3NhYmxlLl9maXh1cCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcblx0ICAgIHJldHVybiBpc0Rpc3Bvc2FibGUocmVzdWx0KSA/IHJlc3VsdCA6IGRpc3Bvc2FibGVFbXB0eTtcblx0ICB9O1xuXHRcblx0ICAvLyBTaW5nbGUgYXNzaWdubWVudFxuXHQgIHZhciBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSA9IFJ4LlNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuXHQgIH07XG5cdCAgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUucHJvdG90eXBlLmdldERpc3Bvc2FibGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5jdXJyZW50O1xuXHQgIH07XG5cdCAgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUucHJvdG90eXBlLnNldERpc3Bvc2FibGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgIGlmICh0aGlzLmN1cnJlbnQpIHsgdGhyb3cgbmV3IEVycm9yKCdEaXNwb3NhYmxlIGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQnKTsgfVxuXHQgICAgdmFyIHNob3VsZERpc3Bvc2UgPSB0aGlzLmlzRGlzcG9zZWQ7XG5cdCAgICAhc2hvdWxkRGlzcG9zZSAmJiAodGhpcy5jdXJyZW50ID0gdmFsdWUpO1xuXHQgICAgc2hvdWxkRGlzcG9zZSAmJiB2YWx1ZSAmJiB2YWx1ZS5kaXNwb3NlKCk7XG5cdCAgfTtcblx0ICBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgIHZhciBvbGQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG5cdCAgICAgIG9sZCAmJiBvbGQuZGlzcG9zZSgpO1xuXHQgICAgfVxuXHQgIH07XG5cdFxuXHQgIC8vIE11bHRpcGxlIGFzc2lnbm1lbnQgZGlzcG9zYWJsZVxuXHQgIHZhciBTZXJpYWxEaXNwb3NhYmxlID0gUnguU2VyaWFsRGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcblx0ICB9O1xuXHQgIFNlcmlhbERpc3Bvc2FibGUucHJvdG90eXBlLmdldERpc3Bvc2FibGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5jdXJyZW50O1xuXHQgIH07XG5cdCAgU2VyaWFsRGlzcG9zYWJsZS5wcm90b3R5cGUuc2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgdmFyIHNob3VsZERpc3Bvc2UgPSB0aGlzLmlzRGlzcG9zZWQ7XG5cdCAgICBpZiAoIXNob3VsZERpc3Bvc2UpIHtcblx0ICAgICAgdmFyIG9sZCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgdGhpcy5jdXJyZW50ID0gdmFsdWU7XG5cdCAgICB9XG5cdCAgICBvbGQgJiYgb2xkLmRpc3Bvc2UoKTtcblx0ICAgIHNob3VsZERpc3Bvc2UgJiYgdmFsdWUgJiYgdmFsdWUuZGlzcG9zZSgpO1xuXHQgIH07XG5cdCAgU2VyaWFsRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgIHZhciBvbGQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBvbGQgJiYgb2xkLmRpc3Bvc2UoKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgQmluYXJ5RGlzcG9zYWJsZSA9IFJ4LkJpbmFyeURpc3Bvc2FibGUgPSBmdW5jdGlvbiAoZmlyc3QsIHNlY29uZCkge1xuXHQgICAgdGhpcy5fZmlyc3QgPSBmaXJzdDtcblx0ICAgIHRoaXMuX3NlY29uZCA9IHNlY29uZDtcblx0ICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgIH07XG5cdFxuXHQgIEJpbmFyeURpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICB2YXIgb2xkMSA9IHRoaXMuX2ZpcnN0O1xuXHQgICAgICB0aGlzLl9maXJzdCA9IG51bGw7XG5cdCAgICAgIG9sZDEgJiYgb2xkMS5kaXNwb3NlKCk7XG5cdCAgICAgIHZhciBvbGQyID0gdGhpcy5fc2Vjb25kO1xuXHQgICAgICB0aGlzLl9zZWNvbmQgPSBudWxsO1xuXHQgICAgICBvbGQyICYmIG9sZDIuZGlzcG9zZSgpO1xuXHQgICAgfVxuXHQgIH07XG5cdFxuXHQgIHZhciBOQXJ5RGlzcG9zYWJsZSA9IFJ4Lk5BcnlEaXNwb3NhYmxlID0gZnVuY3Rpb24gKGRpc3Bvc2FibGVzKSB7XG5cdCAgICB0aGlzLl9kaXNwb3NhYmxlcyA9IGRpc3Bvc2FibGVzO1xuXHQgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgfTtcblx0XG5cdCAgTkFyeURpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICB0aGlzLl9kaXNwb3NhYmxlc1tpXS5kaXNwb3NlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBSZXByZXNlbnRzIGEgZGlzcG9zYWJsZSByZXNvdXJjZSB0aGF0IG9ubHkgZGlzcG9zZXMgaXRzIHVuZGVybHlpbmcgZGlzcG9zYWJsZSByZXNvdXJjZSB3aGVuIGFsbCBkZXBlbmRlbnQgZGlzcG9zYWJsZSBvYmplY3RzIGhhdmUgYmVlbiBkaXNwb3NlZC5cblx0ICAgKi9cblx0ICB2YXIgUmVmQ291bnREaXNwb3NhYmxlID0gUnguUmVmQ291bnREaXNwb3NhYmxlID0gKGZ1bmN0aW9uICgpIHtcblx0XG5cdCAgICBmdW5jdGlvbiBJbm5lckRpc3Bvc2FibGUoZGlzcG9zYWJsZSkge1xuXHQgICAgICB0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NhYmxlO1xuXHQgICAgICB0aGlzLmRpc3Bvc2FibGUuY291bnQrKztcblx0ICAgICAgdGhpcy5pc0lubmVyRGlzcG9zZWQgPSBmYWxzZTtcblx0ICAgIH1cblx0XG5cdCAgICBJbm5lckRpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGlmICghdGhpcy5kaXNwb3NhYmxlLmlzRGlzcG9zZWQgJiYgIXRoaXMuaXNJbm5lckRpc3Bvc2VkKSB7XG5cdCAgICAgICAgdGhpcy5pc0lubmVyRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuZGlzcG9zYWJsZS5jb3VudC0tO1xuXHQgICAgICAgIGlmICh0aGlzLmRpc3Bvc2FibGUuY291bnQgPT09IDAgJiYgdGhpcy5kaXNwb3NhYmxlLmlzUHJpbWFyeURpc3Bvc2VkKSB7XG5cdCAgICAgICAgICB0aGlzLmRpc3Bvc2FibGUuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLmRpc3Bvc2FibGUudW5kZXJseWluZ0Rpc3Bvc2FibGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZWZDb3VudERpc3Bvc2FibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGRpc3Bvc2FibGUuXG5cdCAgICAgKiBAY29uc3RydWN0b3Jcblx0ICAgICAqIEBwYXJhbSB7RGlzcG9zYWJsZX0gZGlzcG9zYWJsZSBVbmRlcmx5aW5nIGRpc3Bvc2FibGUuXG5cdCAgICAgICovXG5cdCAgICBmdW5jdGlvbiBSZWZDb3VudERpc3Bvc2FibGUoZGlzcG9zYWJsZSkge1xuXHQgICAgICB0aGlzLnVuZGVybHlpbmdEaXNwb3NhYmxlID0gZGlzcG9zYWJsZTtcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuaXNQcmltYXJ5RGlzcG9zZWQgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5jb3VudCA9IDA7XG5cdCAgICB9XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBEaXNwb3NlcyB0aGUgdW5kZXJseWluZyBkaXNwb3NhYmxlIG9ubHkgd2hlbiBhbGwgZGVwZW5kZW50IGRpc3Bvc2FibGVzIGhhdmUgYmVlbiBkaXNwb3NlZFxuXHQgICAgICovXG5cdCAgICBSZWZDb3VudERpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkICYmICF0aGlzLmlzUHJpbWFyeURpc3Bvc2VkKSB7XG5cdCAgICAgICAgdGhpcy5pc1ByaW1hcnlEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgICAgaWYgKHRoaXMuY291bnQgPT09IDApIHtcblx0ICAgICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLnVuZGVybHlpbmdEaXNwb3NhYmxlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBSZXR1cm5zIGEgZGVwZW5kZW50IGRpc3Bvc2FibGUgdGhhdCB3aGVuIGRpc3Bvc2VkIGRlY3JlYXNlcyB0aGUgcmVmY291bnQgb24gdGhlIHVuZGVybHlpbmcgZGlzcG9zYWJsZS5cblx0ICAgICAqIEByZXR1cm5zIHtEaXNwb3NhYmxlfSBBIGRlcGVuZGVudCBkaXNwb3NhYmxlIGNvbnRyaWJ1dGluZyB0byB0aGUgcmVmZXJlbmNlIGNvdW50IHRoYXQgbWFuYWdlcyB0aGUgdW5kZXJseWluZyBkaXNwb3NhYmxlJ3MgbGlmZXRpbWUuXG5cdCAgICAgKi9cblx0ICAgIFJlZkNvdW50RGlzcG9zYWJsZS5wcm90b3R5cGUuZ2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuaXNEaXNwb3NlZCA/IGRpc3Bvc2FibGVFbXB0eSA6IG5ldyBJbm5lckRpc3Bvc2FibGUodGhpcyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBSZWZDb3VudERpc3Bvc2FibGU7XG5cdCAgfSkoKTtcblx0XG5cdCAgdmFyIFNjaGVkdWxlZEl0ZW0gPSBSeC5pbnRlcm5hbHMuU2NoZWR1bGVkSXRlbSA9IGZ1bmN0aW9uIChzY2hlZHVsZXIsIHN0YXRlLCBhY3Rpb24sIGR1ZVRpbWUsIGNvbXBhcmVyKSB7XG5cdCAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0ICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcblx0ICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uO1xuXHQgICAgdGhpcy5kdWVUaW1lID0gZHVlVGltZTtcblx0ICAgIHRoaXMuY29tcGFyZXIgPSBjb21wYXJlciB8fCBkZWZhdWx0U3ViQ29tcGFyZXI7XG5cdCAgICB0aGlzLmRpc3Bvc2FibGUgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICB9XG5cdFxuXHQgIFNjaGVkdWxlZEl0ZW0ucHJvdG90eXBlLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHRoaXMuZGlzcG9zYWJsZS5zZXREaXNwb3NhYmxlKHRoaXMuaW52b2tlQ29yZSgpKTtcblx0ICB9O1xuXHRcblx0ICBTY2hlZHVsZWRJdGVtLnByb3RvdHlwZS5jb21wYXJlVG8gPSBmdW5jdGlvbiAob3RoZXIpIHtcblx0ICAgIHJldHVybiB0aGlzLmNvbXBhcmVyKHRoaXMuZHVlVGltZSwgb3RoZXIuZHVlVGltZSk7XG5cdCAgfTtcblx0XG5cdCAgU2NoZWR1bGVkSXRlbS5wcm90b3R5cGUuaXNDYW5jZWxsZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5kaXNwb3NhYmxlLmlzRGlzcG9zZWQ7XG5cdCAgfTtcblx0XG5cdCAgU2NoZWR1bGVkSXRlbS5wcm90b3R5cGUuaW52b2tlQ29yZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBkaXNwb3NhYmxlRml4dXAodGhpcy5hY3Rpb24odGhpcy5zY2hlZHVsZXIsIHRoaXMuc3RhdGUpKTtcblx0ICB9O1xuXHRcblx0ICAvKiogUHJvdmlkZXMgYSBzZXQgb2Ygc3RhdGljIHByb3BlcnRpZXMgdG8gYWNjZXNzIGNvbW1vbmx5IHVzZWQgc2NoZWR1bGVycy4gKi9cblx0ICB2YXIgU2NoZWR1bGVyID0gUnguU2NoZWR1bGVyID0gKGZ1bmN0aW9uICgpIHtcblx0XG5cdCAgICBmdW5jdGlvbiBTY2hlZHVsZXIoKSB7IH1cblx0XG5cdCAgICAvKiogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBzY2hlZHVsZXIgKi9cblx0ICAgIFNjaGVkdWxlci5pc1NjaGVkdWxlciA9IGZ1bmN0aW9uIChzKSB7XG5cdCAgICAgIHJldHVybiBzIGluc3RhbmNlb2YgU2NoZWR1bGVyO1xuXHQgICAgfTtcblx0XG5cdCAgICB2YXIgc2NoZWR1bGVyUHJvdG8gPSBTY2hlZHVsZXIucHJvdG90eXBlO1xuXHRcblx0ICAgIC8qKlxuXHQgICAqIFNjaGVkdWxlcyBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAgICogQHBhcmFtIHN0YXRlIFN0YXRlIHBhc3NlZCB0byB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFjdGlvbiBBY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAgICogQHJldHVybnMge0Rpc3Bvc2FibGV9IFRoZSBkaXNwb3NhYmxlIG9iamVjdCB1c2VkIHRvIGNhbmNlbCB0aGUgc2NoZWR1bGVkIGFjdGlvbiAoYmVzdCBlZmZvcnQpLlxuXHQgICAqL1xuXHQgICAgc2NoZWR1bGVyUHJvdG8uc2NoZWR1bGUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuXHQgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuXHQgICAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogU2NoZWR1bGVzIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciBkdWVUaW1lLlxuXHQgICAqIEBwYXJhbSBzdGF0ZSBTdGF0ZSBwYXNzZWQgdG8gdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhY3Rpb24gQWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgICAqIEBwYXJhbSB7TnVtYmVyfSBkdWVUaW1lIFJlbGF0aXZlIHRpbWUgYWZ0ZXIgd2hpY2ggdG8gZXhlY3V0ZSB0aGUgYWN0aW9uLlxuXHQgICAqIEByZXR1cm5zIHtEaXNwb3NhYmxlfSBUaGUgZGlzcG9zYWJsZSBvYmplY3QgdXNlZCB0byBjYW5jZWwgdGhlIHNjaGVkdWxlZCBhY3Rpb24gKGJlc3QgZWZmb3J0KS5cblx0ICAgKi9cblx0ICAgIHNjaGVkdWxlclByb3RvLnNjaGVkdWxlRnV0dXJlID0gZnVuY3Rpb24gKHN0YXRlLCBkdWVUaW1lLCBhY3Rpb24pIHtcblx0ICAgICAgdmFyIGR0ID0gZHVlVGltZTtcblx0ICAgICAgZHQgaW5zdGFuY2VvZiBEYXRlICYmIChkdCA9IGR0IC0gdGhpcy5ub3coKSk7XG5cdCAgICAgIGR0ID0gU2NoZWR1bGVyLm5vcm1hbGl6ZShkdCk7XG5cdFxuXHQgICAgICBpZiAoZHQgPT09IDApIHsgcmV0dXJuIHRoaXMuc2NoZWR1bGUoc3RhdGUsIGFjdGlvbik7IH1cblx0XG5cdCAgICAgIHJldHVybiB0aGlzLl9zY2hlZHVsZUZ1dHVyZShzdGF0ZSwgZHQsIGFjdGlvbik7XG5cdCAgICB9O1xuXHRcblx0ICAgIHNjaGVkdWxlclByb3RvLl9zY2hlZHVsZUZ1dHVyZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZHVlVGltZSwgYWN0aW9uKSB7XG5cdCAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIC8qKiBHZXRzIHRoZSBjdXJyZW50IHRpbWUgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbCBtYWNoaW5lJ3Mgc3lzdGVtIGNsb2NrLiAqL1xuXHQgICAgU2NoZWR1bGVyLm5vdyA9IGRlZmF1bHROb3c7XG5cdFxuXHQgICAgLyoqIEdldHMgdGhlIGN1cnJlbnQgdGltZSBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsIG1hY2hpbmUncyBzeXN0ZW0gY2xvY2suICovXG5cdCAgICBTY2hlZHVsZXIucHJvdG90eXBlLm5vdyA9IGRlZmF1bHROb3c7XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBOb3JtYWxpemVzIHRoZSBzcGVjaWZpZWQgVGltZVNwYW4gdmFsdWUgdG8gYSBwb3NpdGl2ZSB2YWx1ZS5cblx0ICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0aW1lU3BhbiBUaGUgdGltZSBzcGFuIHZhbHVlIHRvIG5vcm1hbGl6ZS5cblx0ICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBzcGVjaWZpZWQgVGltZVNwYW4gdmFsdWUgaWYgaXQgaXMgemVybyBvciBwb3NpdGl2ZTsgb3RoZXJ3aXNlLCAwXG5cdCAgICAgKi9cblx0ICAgIFNjaGVkdWxlci5ub3JtYWxpemUgPSBmdW5jdGlvbiAodGltZVNwYW4pIHtcblx0ICAgICAgdGltZVNwYW4gPCAwICYmICh0aW1lU3BhbiA9IDApO1xuXHQgICAgICByZXR1cm4gdGltZVNwYW47XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTY2hlZHVsZXI7XG5cdCAgfSgpKTtcblx0XG5cdCAgdmFyIG5vcm1hbGl6ZVRpbWUgPSBTY2hlZHVsZXIubm9ybWFsaXplLCBpc1NjaGVkdWxlciA9IFNjaGVkdWxlci5pc1NjaGVkdWxlcjtcblx0XG5cdCAgKGZ1bmN0aW9uIChzY2hlZHVsZXJQcm90bykge1xuXHRcblx0ICAgIGZ1bmN0aW9uIGludm9rZVJlY0ltbWVkaWF0ZShzY2hlZHVsZXIsIHBhaXIpIHtcblx0ICAgICAgdmFyIHN0YXRlID0gcGFpclswXSwgYWN0aW9uID0gcGFpclsxXSwgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlRGlzcG9zYWJsZSgpO1xuXHQgICAgICBhY3Rpb24oc3RhdGUsIGlubmVyQWN0aW9uKTtcblx0ICAgICAgcmV0dXJuIGdyb3VwO1xuXHRcblx0ICAgICAgZnVuY3Rpb24gaW5uZXJBY3Rpb24oc3RhdGUyKSB7XG5cdCAgICAgICAgdmFyIGlzQWRkZWQgPSBmYWxzZSwgaXNEb25lID0gZmFsc2U7XG5cdFxuXHQgICAgICAgIHZhciBkID0gc2NoZWR1bGVyLnNjaGVkdWxlKHN0YXRlMiwgc2NoZWR1bGVXb3JrKTtcblx0ICAgICAgICBpZiAoIWlzRG9uZSkge1xuXHQgICAgICAgICAgZ3JvdXAuYWRkKGQpO1xuXHQgICAgICAgICAgaXNBZGRlZCA9IHRydWU7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBmdW5jdGlvbiBzY2hlZHVsZVdvcmsoXywgc3RhdGUzKSB7XG5cdCAgICAgICAgICBpZiAoaXNBZGRlZCkge1xuXHQgICAgICAgICAgICBncm91cC5yZW1vdmUoZCk7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBpc0RvbmUgPSB0cnVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgYWN0aW9uKHN0YXRlMywgaW5uZXJBY3Rpb24pO1xuXHQgICAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGVFbXB0eTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBpbnZva2VSZWNEYXRlKHNjaGVkdWxlciwgcGFpcikge1xuXHQgICAgICB2YXIgc3RhdGUgPSBwYWlyWzBdLCBhY3Rpb24gPSBwYWlyWzFdLCBncm91cCA9IG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKCk7XG5cdCAgICAgIGFjdGlvbihzdGF0ZSwgaW5uZXJBY3Rpb24pO1xuXHQgICAgICByZXR1cm4gZ3JvdXA7XG5cdFxuXHQgICAgICBmdW5jdGlvbiBpbm5lckFjdGlvbihzdGF0ZTIsIGR1ZVRpbWUxKSB7XG5cdCAgICAgICAgdmFyIGlzQWRkZWQgPSBmYWxzZSwgaXNEb25lID0gZmFsc2U7XG5cdFxuXHQgICAgICAgIHZhciBkID0gc2NoZWR1bGVyLnNjaGVkdWxlRnV0dXJlKHN0YXRlMiwgZHVlVGltZTEsIHNjaGVkdWxlV29yayk7XG5cdCAgICAgICAgaWYgKCFpc0RvbmUpIHtcblx0ICAgICAgICAgIGdyb3VwLmFkZChkKTtcblx0ICAgICAgICAgIGlzQWRkZWQgPSB0cnVlO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVXb3JrKF8sIHN0YXRlMykge1xuXHQgICAgICAgICAgaWYgKGlzQWRkZWQpIHtcblx0ICAgICAgICAgICAgZ3JvdXAucmVtb3ZlKGQpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgaXNEb25lID0gdHJ1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGFjdGlvbihzdGF0ZTMsIGlubmVyQWN0aW9uKTtcblx0ICAgICAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBTY2hlZHVsZXMgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkIHJlY3Vyc2l2ZWx5LlxuXHQgICAgICogQHBhcmFtIHtNaXhlZH0gc3RhdGUgU3RhdGUgcGFzc2VkIHRvIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhY3Rpb24gQWN0aW9uIHRvIGV4ZWN1dGUgcmVjdXJzaXZlbHkuIFRoZSBsYXN0IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGFjdGlvbiBpcyB1c2VkIHRvIHRyaWdnZXIgcmVjdXJzaXZlIHNjaGVkdWxpbmcgb2YgdGhlIGFjdGlvbiwgcGFzc2luZyBpbiByZWN1cnNpdmUgaW52b2NhdGlvbiBzdGF0ZS5cblx0ICAgICAqIEByZXR1cm5zIHtEaXNwb3NhYmxlfSBUaGUgZGlzcG9zYWJsZSBvYmplY3QgdXNlZCB0byBjYW5jZWwgdGhlIHNjaGVkdWxlZCBhY3Rpb24gKGJlc3QgZWZmb3J0KS5cblx0ICAgICAqL1xuXHQgICAgc2NoZWR1bGVyUHJvdG8uc2NoZWR1bGVSZWN1cnNpdmUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuXHQgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZShbc3RhdGUsIGFjdGlvbl0sIGludm9rZVJlY0ltbWVkaWF0ZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogU2NoZWR1bGVzIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZCByZWN1cnNpdmVseSBhZnRlciBhIHNwZWNpZmllZCByZWxhdGl2ZSBvciBhYnNvbHV0ZSBkdWUgdGltZS5cblx0ICAgICAqIEBwYXJhbSB7TWl4ZWR9IHN0YXRlIFN0YXRlIHBhc3NlZCB0byB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWN0aW9uIEFjdGlvbiB0byBleGVjdXRlIHJlY3Vyc2l2ZWx5LiBUaGUgbGFzdCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBhY3Rpb24gaXMgdXNlZCB0byB0cmlnZ2VyIHJlY3Vyc2l2ZSBzY2hlZHVsaW5nIG9mIHRoZSBhY3Rpb24sIHBhc3NpbmcgaW4gdGhlIHJlY3Vyc2l2ZSBkdWUgdGltZSBhbmQgaW52b2NhdGlvbiBzdGF0ZS5cblx0ICAgICAqIEBwYXJhbSB7TnVtYmVyIHwgRGF0ZX0gZHVlVGltZSBSZWxhdGl2ZSBvciBhYnNvbHV0ZSB0aW1lIGFmdGVyIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIGFjdGlvbiBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdCAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHVzZWQgdG8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgYWN0aW9uIChiZXN0IGVmZm9ydCkuXG5cdCAgICAgKi9cblx0ICAgIHNjaGVkdWxlclByb3RvLnNjaGVkdWxlUmVjdXJzaXZlRnV0dXJlID0gZnVuY3Rpb24gKHN0YXRlLCBkdWVUaW1lLCBhY3Rpb24pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVGdXR1cmUoW3N0YXRlLCBhY3Rpb25dLCBkdWVUaW1lLCBpbnZva2VSZWNEYXRlKTtcblx0ICAgIH07XG5cdFxuXHQgIH0oU2NoZWR1bGVyLnByb3RvdHlwZSkpO1xuXHRcblx0ICAoZnVuY3Rpb24gKHNjaGVkdWxlclByb3RvKSB7XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBTY2hlZHVsZXMgYSBwZXJpb2RpYyBwaWVjZSBvZiB3b3JrIGJ5IGR5bmFtaWNhbGx5IGRpc2NvdmVyaW5nIHRoZSBzY2hlZHVsZXIncyBjYXBhYmlsaXRpZXMuIFRoZSBwZXJpb2RpYyB0YXNrIHdpbGwgYmUgc2NoZWR1bGVkIHVzaW5nIHdpbmRvdy5zZXRJbnRlcnZhbCBmb3IgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24uXG5cdCAgICAgKiBAcGFyYW0ge01peGVkfSBzdGF0ZSBJbml0aWFsIHN0YXRlIHBhc3NlZCB0byB0aGUgYWN0aW9uIHVwb24gdGhlIGZpcnN0IGl0ZXJhdGlvbi5cblx0ICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwZXJpb2QgUGVyaW9kIGZvciBydW5uaW5nIHRoZSB3b3JrIHBlcmlvZGljYWxseS5cblx0ICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFjdGlvbiBBY3Rpb24gdG8gYmUgZXhlY3V0ZWQsIHBvdGVudGlhbGx5IHVwZGF0aW5nIHRoZSBzdGF0ZS5cblx0ICAgICAqIEByZXR1cm5zIHtEaXNwb3NhYmxlfSBUaGUgZGlzcG9zYWJsZSBvYmplY3QgdXNlZCB0byBjYW5jZWwgdGhlIHNjaGVkdWxlZCByZWN1cnJpbmcgYWN0aW9uIChiZXN0IGVmZm9ydCkuXG5cdCAgICAgKi9cblx0ICAgIFNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGVQZXJpb2RpYyA9IGZ1bmN0aW9uKHN0YXRlLCBwZXJpb2QsIGFjdGlvbikge1xuXHQgICAgICBpZiAodHlwZW9mIHJvb3Quc2V0SW50ZXJ2YWwgPT09ICd1bmRlZmluZWQnKSB7IHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcigpOyB9XG5cdCAgICAgIHBlcmlvZCA9IG5vcm1hbGl6ZVRpbWUocGVyaW9kKTtcblx0ICAgICAgdmFyIHMgPSBzdGF0ZSwgaWQgPSByb290LnNldEludGVydmFsKGZ1bmN0aW9uICgpIHsgcyA9IGFjdGlvbihzKTsgfSwgcGVyaW9kKTtcblx0ICAgICAgcmV0dXJuIGRpc3Bvc2FibGVDcmVhdGUoZnVuY3Rpb24gKCkgeyByb290LmNsZWFySW50ZXJ2YWwoaWQpOyB9KTtcblx0ICAgIH07XG5cdFxuXHQgIH0oU2NoZWR1bGVyLnByb3RvdHlwZSkpO1xuXHRcblx0ICAvKiogR2V0cyBhIHNjaGVkdWxlciB0aGF0IHNjaGVkdWxlcyB3b3JrIGltbWVkaWF0ZWx5IG9uIHRoZSBjdXJyZW50IHRocmVhZC4gKi9cblx0ICAgdmFyIEltbWVkaWF0ZVNjaGVkdWxlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhJbW1lZGlhdGVTY2hlZHVsZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBJbW1lZGlhdGVTY2hlZHVsZXIoKSB7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIEltbWVkaWF0ZVNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuXHQgICAgICByZXR1cm4gZGlzcG9zYWJsZUZpeHVwKGFjdGlvbih0aGlzLCBzdGF0ZSkpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gSW1tZWRpYXRlU2NoZWR1bGVyO1xuXHQgIH0oU2NoZWR1bGVyKSk7XG5cdFxuXHQgIHZhciBpbW1lZGlhdGVTY2hlZHVsZXIgPSBTY2hlZHVsZXIuaW1tZWRpYXRlID0gbmV3IEltbWVkaWF0ZVNjaGVkdWxlcigpO1xuXHRcblx0ICAvKipcblx0ICAgKiBHZXRzIGEgc2NoZWR1bGVyIHRoYXQgc2NoZWR1bGVzIHdvcmsgYXMgc29vbiBhcyBwb3NzaWJsZSBvbiB0aGUgY3VycmVudCB0aHJlYWQuXG5cdCAgICovXG5cdCAgdmFyIEN1cnJlbnRUaHJlYWRTY2hlZHVsZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgdmFyIHF1ZXVlO1xuXHRcblx0ICAgIGZ1bmN0aW9uIHJ1blRyYW1wb2xpbmUgKCkge1xuXHQgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuXHQgICAgICAgIHZhciBpdGVtID0gcXVldWUuZGVxdWV1ZSgpO1xuXHQgICAgICAgICFpdGVtLmlzQ2FuY2VsbGVkKCkgJiYgaXRlbS5pbnZva2UoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIGluaGVyaXRzKEN1cnJlbnRUaHJlYWRTY2hlZHVsZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBDdXJyZW50VGhyZWFkU2NoZWR1bGVyKCkge1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBDdXJyZW50VGhyZWFkU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG5cdCAgICAgIHZhciBzaSA9IG5ldyBTY2hlZHVsZWRJdGVtKHRoaXMsIHN0YXRlLCBhY3Rpb24sIHRoaXMubm93KCkpO1xuXHRcblx0ICAgICAgaWYgKCFxdWV1ZSkge1xuXHQgICAgICAgIHF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWUoNCk7XG5cdCAgICAgICAgcXVldWUuZW5xdWV1ZShzaSk7XG5cdFxuXHQgICAgICAgIHZhciByZXN1bHQgPSB0cnlDYXRjaChydW5UcmFtcG9saW5lKSgpO1xuXHQgICAgICAgIHF1ZXVlID0gbnVsbDtcblx0ICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyB0aHJvd2VyKHJlc3VsdC5lKTsgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHF1ZXVlLmVucXVldWUoc2kpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBzaS5kaXNwb3NhYmxlO1xuXHQgICAgfTtcblx0XG5cdCAgICBDdXJyZW50VGhyZWFkU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZVJlcXVpcmVkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gIXF1ZXVlOyB9O1xuXHRcblx0ICAgIHJldHVybiBDdXJyZW50VGhyZWFkU2NoZWR1bGVyO1xuXHQgIH0oU2NoZWR1bGVyKSk7XG5cdFxuXHQgIHZhciBjdXJyZW50VGhyZWFkU2NoZWR1bGVyID0gU2NoZWR1bGVyLmN1cnJlbnRUaHJlYWQgPSBuZXcgQ3VycmVudFRocmVhZFNjaGVkdWxlcigpO1xuXHRcblx0ICB2YXIgU2NoZWR1bGVQZXJpb2RpY1JlY3Vyc2l2ZSA9IFJ4LmludGVybmFscy5TY2hlZHVsZVBlcmlvZGljUmVjdXJzaXZlID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIGNyZWF0ZVRpY2soc2VsZikge1xuXHQgICAgICByZXR1cm4gZnVuY3Rpb24gdGljayhjb21tYW5kLCByZWN1cnNlKSB7XG5cdCAgICAgICAgcmVjdXJzZSgwLCBzZWxmLl9wZXJpb2QpO1xuXHQgICAgICAgIHZhciBzdGF0ZSA9IHRyeUNhdGNoKHNlbGYuX2FjdGlvbikoc2VsZi5fc3RhdGUpO1xuXHQgICAgICAgIGlmIChzdGF0ZSA9PT0gZXJyb3JPYmopIHtcblx0ICAgICAgICAgIHNlbGYuX2NhbmNlbC5kaXNwb3NlKCk7XG5cdCAgICAgICAgICB0aHJvd2VyKHN0YXRlLmUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzZWxmLl9zdGF0ZSA9IHN0YXRlO1xuXHQgICAgICB9O1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIFNjaGVkdWxlUGVyaW9kaWNSZWN1cnNpdmUoc2NoZWR1bGVyLCBzdGF0ZSwgcGVyaW9kLCBhY3Rpb24pIHtcblx0ICAgICAgdGhpcy5fc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuXHQgICAgICB0aGlzLl9wZXJpb2QgPSBwZXJpb2Q7XG5cdCAgICAgIHRoaXMuX2FjdGlvbiA9IGFjdGlvbjtcblx0ICAgIH1cblx0XG5cdCAgICBTY2hlZHVsZVBlcmlvZGljUmVjdXJzaXZlLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgdGhpcy5fY2FuY2VsID0gZDtcblx0ICAgICAgZC5zZXREaXNwb3NhYmxlKHRoaXMuX3NjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZUZ1dHVyZSgwLCB0aGlzLl9wZXJpb2QsIGNyZWF0ZVRpY2sodGhpcykpKTtcblx0XG5cdCAgICAgIHJldHVybiBkO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU2NoZWR1bGVQZXJpb2RpY1JlY3Vyc2l2ZTtcblx0ICB9KCkpO1xuXHRcblx0ICB2YXIgc2NoZWR1bGVNZXRob2QsIGNsZWFyTWV0aG9kO1xuXHRcblx0ICB2YXIgbG9jYWxUaW1lciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgbG9jYWxTZXRUaW1lb3V0LCBsb2NhbENsZWFyVGltZW91dCA9IG5vb3A7XG5cdCAgICBpZiAoISFyb290LnNldFRpbWVvdXQpIHtcblx0ICAgICAgbG9jYWxTZXRUaW1lb3V0ID0gcm9vdC5zZXRUaW1lb3V0O1xuXHQgICAgICBsb2NhbENsZWFyVGltZW91dCA9IHJvb3QuY2xlYXJUaW1lb3V0O1xuXHQgICAgfSBlbHNlIGlmICghIXJvb3QuV1NjcmlwdCkge1xuXHQgICAgICBsb2NhbFNldFRpbWVvdXQgPSBmdW5jdGlvbiAoZm4sIHRpbWUpIHtcblx0ICAgICAgICByb290LldTY3JpcHQuU2xlZXAodGltZSk7XG5cdCAgICAgICAgZm4oKTtcblx0ICAgICAgfTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcigpO1xuXHQgICAgfVxuXHRcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHNldFRpbWVvdXQ6IGxvY2FsU2V0VGltZW91dCxcblx0ICAgICAgY2xlYXJUaW1lb3V0OiBsb2NhbENsZWFyVGltZW91dFxuXHQgICAgfTtcblx0ICB9KCkpO1xuXHQgIHZhciBsb2NhbFNldFRpbWVvdXQgPSBsb2NhbFRpbWVyLnNldFRpbWVvdXQsXG5cdCAgICBsb2NhbENsZWFyVGltZW91dCA9IGxvY2FsVGltZXIuY2xlYXJUaW1lb3V0O1xuXHRcblx0ICAoZnVuY3Rpb24gKCkge1xuXHRcblx0ICAgIHZhciBuZXh0SGFuZGxlID0gMSwgdGFza3NCeUhhbmRsZSA9IHt9LCBjdXJyZW50bHlSdW5uaW5nID0gZmFsc2U7XG5cdFxuXHQgICAgY2xlYXJNZXRob2QgPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG5cdCAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG5cdCAgICB9O1xuXHRcblx0ICAgIGZ1bmN0aW9uIHJ1blRhc2soaGFuZGxlKSB7XG5cdCAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nKSB7XG5cdCAgICAgICAgbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcnVuVGFzayhoYW5kbGUpOyB9LCAwKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcblx0ICAgICAgICBpZiAodGFzaykge1xuXHQgICAgICAgICAgY3VycmVudGx5UnVubmluZyA9IHRydWU7XG5cdCAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godGFzaykoKTtcblx0ICAgICAgICAgIGNsZWFyTWV0aG9kKGhhbmRsZSk7XG5cdCAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nID0gZmFsc2U7XG5cdCAgICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyB0aHJvd2VyKHJlc3VsdC5lKTsgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIHZhciByZU5hdGl2ZSA9IG5ldyBSZWdFeHAoJ14nICtcblx0ICAgICAgU3RyaW5nKHRvU3RyaW5nKVxuXHQgICAgICAgIC5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpXG5cdCAgICAgICAgLnJlcGxhY2UoL3RvU3RyaW5nfCBmb3IgW15cXF1dKy9nLCAnLio/JykgKyAnJCdcblx0ICAgICk7XG5cdFxuXHQgICAgdmFyIHNldEltbWVkaWF0ZSA9IHR5cGVvZiAoc2V0SW1tZWRpYXRlID0gZnJlZUdsb2JhbCAmJiBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwuc2V0SW1tZWRpYXRlKSA9PSAnZnVuY3Rpb24nICYmXG5cdCAgICAgICFyZU5hdGl2ZS50ZXN0KHNldEltbWVkaWF0ZSkgJiYgc2V0SW1tZWRpYXRlO1xuXHRcblx0ICAgIGZ1bmN0aW9uIHBvc3RNZXNzYWdlU3VwcG9ydGVkICgpIHtcblx0ICAgICAgLy8gRW5zdXJlIG5vdCBpbiBhIHdvcmtlclxuXHQgICAgICBpZiAoIXJvb3QucG9zdE1lc3NhZ2UgfHwgcm9vdC5pbXBvcnRTY3JpcHRzKSB7IHJldHVybiBmYWxzZTsgfVxuXHQgICAgICB2YXIgaXNBc3luYyA9IGZhbHNlLCBvbGRIYW5kbGVyID0gcm9vdC5vbm1lc3NhZ2U7XG5cdCAgICAgIC8vIFRlc3QgZm9yIGFzeW5jXG5cdCAgICAgIHJvb3Qub25tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyBpc0FzeW5jID0gdHJ1ZTsgfTtcblx0ICAgICAgcm9vdC5wb3N0TWVzc2FnZSgnJywgJyonKTtcblx0ICAgICAgcm9vdC5vbm1lc3NhZ2UgPSBvbGRIYW5kbGVyO1xuXHRcblx0ICAgICAgcmV0dXJuIGlzQXN5bmM7XG5cdCAgICB9XG5cdFxuXHQgICAgLy8gVXNlIGluIG9yZGVyLCBzZXRJbW1lZGlhdGUsIG5leHRUaWNrLCBwb3N0TWVzc2FnZSwgTWVzc2FnZUNoYW5uZWwsIHNjcmlwdCByZWFkeXN0YXRlY2hhbmdlZCwgc2V0VGltZW91dFxuXHQgICAgaWYgKGlzRnVuY3Rpb24oc2V0SW1tZWRpYXRlKSkge1xuXHQgICAgICBzY2hlZHVsZU1ldGhvZCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcblx0ICAgICAgICB2YXIgaWQgPSBuZXh0SGFuZGxlKys7XG5cdCAgICAgICAgdGFza3NCeUhhbmRsZVtpZF0gPSBhY3Rpb247XG5cdCAgICAgICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsgcnVuVGFzayhpZCk7IH0pO1xuXHRcblx0ICAgICAgICByZXR1cm4gaWQ7XG5cdCAgICAgIH07XG5cdCAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB7fS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScpIHtcblx0ICAgICAgc2NoZWR1bGVNZXRob2QgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG5cdCAgICAgICAgdmFyIGlkID0gbmV4dEhhbmRsZSsrO1xuXHQgICAgICAgIHRhc2tzQnlIYW5kbGVbaWRdID0gYWN0aW9uO1xuXHQgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5UYXNrKGlkKTsgfSk7XG5cdFxuXHQgICAgICAgIHJldHVybiBpZDtcblx0ICAgICAgfTtcblx0ICAgIH0gZWxzZSBpZiAocG9zdE1lc3NhZ2VTdXBwb3J0ZWQoKSkge1xuXHQgICAgICB2YXIgTVNHX1BSRUZJWCA9ICdtcy5yeC5zY2hlZHVsZScgKyBNYXRoLnJhbmRvbSgpO1xuXHRcblx0ICAgICAgdmFyIG9uR2xvYmFsUG9zdE1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAvLyBPbmx5IGlmIHdlJ3JlIGEgbWF0Y2ggdG8gYXZvaWQgYW55IG90aGVyIGdsb2JhbCBldmVudHNcblx0ICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgPT09ICdzdHJpbmcnICYmIGV2ZW50LmRhdGEuc3Vic3RyaW5nKDAsIE1TR19QUkVGSVgubGVuZ3RoKSA9PT0gTVNHX1BSRUZJWCkge1xuXHQgICAgICAgICAgcnVuVGFzayhldmVudC5kYXRhLnN1YnN0cmluZyhNU0dfUFJFRklYLmxlbmd0aCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0XG5cdCAgICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uR2xvYmFsUG9zdE1lc3NhZ2UsIGZhbHNlKTtcblx0XG5cdCAgICAgIHNjaGVkdWxlTWV0aG9kID0gZnVuY3Rpb24gKGFjdGlvbikge1xuXHQgICAgICAgIHZhciBpZCA9IG5leHRIYW5kbGUrKztcblx0ICAgICAgICB0YXNrc0J5SGFuZGxlW2lkXSA9IGFjdGlvbjtcblx0ICAgICAgICByb290LnBvc3RNZXNzYWdlKE1TR19QUkVGSVggKyBjdXJyZW50SWQsICcqJyk7XG5cdCAgICAgICAgcmV0dXJuIGlkO1xuXHQgICAgICB9O1xuXHQgICAgfSBlbHNlIGlmICghIXJvb3QuTWVzc2FnZUNoYW5uZWwpIHtcblx0ICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgcm9vdC5NZXNzYWdlQ2hhbm5lbCgpO1xuXHRcblx0ICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgeyBydW5UYXNrKGUuZGF0YSk7IH07XG5cdFxuXHQgICAgICBzY2hlZHVsZU1ldGhvZCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcblx0ICAgICAgICB2YXIgaWQgPSBuZXh0SGFuZGxlKys7XG5cdCAgICAgICAgdGFza3NCeUhhbmRsZVtpZF0gPSBhY3Rpb247XG5cdCAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShpZCk7XG5cdCAgICAgICAgcmV0dXJuIGlkO1xuXHQgICAgICB9O1xuXHQgICAgfSBlbHNlIGlmICgnZG9jdW1lbnQnIGluIHJvb3QgJiYgJ29ucmVhZHlzdGF0ZWNoYW5nZScgaW4gcm9vdC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuXHRcblx0ICAgICAgc2NoZWR1bGVNZXRob2QgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG5cdCAgICAgICAgdmFyIHNjcmlwdEVsZW1lbnQgPSByb290LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXHQgICAgICAgIHZhciBpZCA9IG5leHRIYW5kbGUrKztcblx0ICAgICAgICB0YXNrc0J5SGFuZGxlW2lkXSA9IGFjdGlvbjtcblx0XG5cdCAgICAgICAgc2NyaXB0RWxlbWVudC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICBydW5UYXNrKGlkKTtcblx0ICAgICAgICAgIHNjcmlwdEVsZW1lbnQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblx0ICAgICAgICAgIHNjcmlwdEVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbGVtZW50KTtcblx0ICAgICAgICAgIHNjcmlwdEVsZW1lbnQgPSBudWxsO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgcm9vdC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2NyaXB0RWxlbWVudCk7XG5cdCAgICAgICAgcmV0dXJuIGlkO1xuXHQgICAgICB9O1xuXHRcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHNjaGVkdWxlTWV0aG9kID0gZnVuY3Rpb24gKGFjdGlvbikge1xuXHQgICAgICAgIHZhciBpZCA9IG5leHRIYW5kbGUrKztcblx0ICAgICAgICB0YXNrc0J5SGFuZGxlW2lkXSA9IGFjdGlvbjtcblx0ICAgICAgICBsb2NhbFNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgcnVuVGFzayhpZCk7XG5cdCAgICAgICAgfSwgMCk7XG5cdFxuXHQgICAgICAgIHJldHVybiBpZDtcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICB9KCkpO1xuXHRcblx0ICAvKipcblx0ICAgKiBHZXRzIGEgc2NoZWR1bGVyIHRoYXQgc2NoZWR1bGVzIHdvcmsgdmlhIGEgdGltZWQgY2FsbGJhY2sgYmFzZWQgdXBvbiBwbGF0Zm9ybS5cblx0ICAgKi9cblx0ICAgdmFyIERlZmF1bHRTY2hlZHVsZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgIGluaGVyaXRzKERlZmF1bHRTY2hlZHVsZXIsIF9fc3VwZXJfXyk7XG5cdCAgICAgZnVuY3Rpb24gRGVmYXVsdFNjaGVkdWxlcigpIHtcblx0ICAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgIH1cblx0XG5cdCAgICAgZnVuY3Rpb24gc2NoZWR1bGVBY3Rpb24oZGlzcG9zYWJsZSwgYWN0aW9uLCBzY2hlZHVsZXIsIHN0YXRlKSB7XG5cdCAgICAgICByZXR1cm4gZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdCAgICAgICAgICFkaXNwb3NhYmxlLmlzRGlzcG9zZWQgJiYgZGlzcG9zYWJsZS5zZXREaXNwb3NhYmxlKERpc3Bvc2FibGUuX2ZpeHVwKGFjdGlvbihzY2hlZHVsZXIsIHN0YXRlKSkpO1xuXHQgICAgICAgfTtcblx0ICAgICB9XG5cdFxuXHQgICAgIGZ1bmN0aW9uIENsZWFyRGlzcG9zYWJsZShtZXRob2QsIGlkKSB7XG5cdCAgICAgICB0aGlzLl9pZCA9IGlkO1xuXHQgICAgICAgdGhpcy5fbWV0aG9kID0gbWV0aG9kO1xuXHQgICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICAgfVxuXHRcblx0ICAgICBDbGVhckRpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICAgICB0aGlzLl9tZXRob2QuY2FsbChudWxsLCB0aGlzLl9pZCk7XG5cdCAgICAgICB9XG5cdCAgICAgfTtcblx0XG5cdCAgICBEZWZhdWx0U2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG5cdCAgICAgIHZhciBkaXNwb3NhYmxlID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksXG5cdCAgICAgICAgICBpZCA9IHNjaGVkdWxlTWV0aG9kKHNjaGVkdWxlQWN0aW9uKGRpc3Bvc2FibGUsIGFjdGlvbiwgdGhpcywgc3RhdGUpKTtcblx0ICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKGRpc3Bvc2FibGUsIG5ldyBDbGVhckRpc3Bvc2FibGUoY2xlYXJNZXRob2QsIGlkKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIERlZmF1bHRTY2hlZHVsZXIucHJvdG90eXBlLl9zY2hlZHVsZUZ1dHVyZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZHVlVGltZSwgYWN0aW9uKSB7XG5cdCAgICAgIGlmIChkdWVUaW1lID09PSAwKSB7IHJldHVybiB0aGlzLnNjaGVkdWxlKHN0YXRlLCBhY3Rpb24pOyB9XG5cdCAgICAgIHZhciBkaXNwb3NhYmxlID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksXG5cdCAgICAgICAgICBpZCA9IGxvY2FsU2V0VGltZW91dChzY2hlZHVsZUFjdGlvbihkaXNwb3NhYmxlLCBhY3Rpb24sIHRoaXMsIHN0YXRlKSwgZHVlVGltZSk7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShkaXNwb3NhYmxlLCBuZXcgQ2xlYXJEaXNwb3NhYmxlKGxvY2FsQ2xlYXJUaW1lb3V0LCBpZCkpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gRGVmYXVsdFNjaGVkdWxlcjtcblx0ICB9KFNjaGVkdWxlcikpO1xuXHRcblx0ICB2YXIgZGVmYXVsdFNjaGVkdWxlciA9IFNjaGVkdWxlclsnZGVmYXVsdCddID0gU2NoZWR1bGVyLmFzeW5jID0gbmV3IERlZmF1bHRTY2hlZHVsZXIoKTtcblx0XG5cdCAgZnVuY3Rpb24gSW5kZXhlZEl0ZW0oaWQsIHZhbHVlKSB7XG5cdCAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgfVxuXHRcblx0ICBJbmRleGVkSXRlbS5wcm90b3R5cGUuY29tcGFyZVRvID0gZnVuY3Rpb24gKG90aGVyKSB7XG5cdCAgICB2YXIgYyA9IHRoaXMudmFsdWUuY29tcGFyZVRvKG90aGVyLnZhbHVlKTtcblx0ICAgIGMgPT09IDAgJiYgKGMgPSB0aGlzLmlkIC0gb3RoZXIuaWQpO1xuXHQgICAgcmV0dXJuIGM7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFByaW9yaXR5UXVldWUgPSBSeC5pbnRlcm5hbHMuUHJpb3JpdHlRdWV1ZSA9IGZ1bmN0aW9uIChjYXBhY2l0eSkge1xuXHQgICAgdGhpcy5pdGVtcyA9IG5ldyBBcnJheShjYXBhY2l0eSk7XG5cdCAgICB0aGlzLmxlbmd0aCA9IDA7XG5cdCAgfTtcblx0XG5cdCAgdmFyIHByaW9yaXR5UHJvdG8gPSBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZTtcblx0ICBwcmlvcml0eVByb3RvLmlzSGlnaGVyUHJpb3JpdHkgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcblx0ICAgIHJldHVybiB0aGlzLml0ZW1zW2xlZnRdLmNvbXBhcmVUbyh0aGlzLml0ZW1zW3JpZ2h0XSkgPCAwO1xuXHQgIH07XG5cdFxuXHQgIHByaW9yaXR5UHJvdG8ucGVyY29sYXRlID0gZnVuY3Rpb24gKGluZGV4KSB7XG5cdCAgICBpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGggfHwgaW5kZXggPCAwKSB7IHJldHVybjsgfVxuXHQgICAgdmFyIHBhcmVudCA9IGluZGV4IC0gMSA+PiAxO1xuXHQgICAgaWYgKHBhcmVudCA8IDAgfHwgcGFyZW50ID09PSBpbmRleCkgeyByZXR1cm47IH1cblx0ICAgIGlmICh0aGlzLmlzSGlnaGVyUHJpb3JpdHkoaW5kZXgsIHBhcmVudCkpIHtcblx0ICAgICAgdmFyIHRlbXAgPSB0aGlzLml0ZW1zW2luZGV4XTtcblx0ICAgICAgdGhpcy5pdGVtc1tpbmRleF0gPSB0aGlzLml0ZW1zW3BhcmVudF07XG5cdCAgICAgIHRoaXMuaXRlbXNbcGFyZW50XSA9IHRlbXA7XG5cdCAgICAgIHRoaXMucGVyY29sYXRlKHBhcmVudCk7XG5cdCAgICB9XG5cdCAgfTtcblx0XG5cdCAgcHJpb3JpdHlQcm90by5oZWFwaWZ5ID0gZnVuY3Rpb24gKGluZGV4KSB7XG5cdCAgICAraW5kZXggfHwgKGluZGV4ID0gMCk7XG5cdCAgICBpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGggfHwgaW5kZXggPCAwKSB7IHJldHVybjsgfVxuXHQgICAgdmFyIGxlZnQgPSAyICogaW5kZXggKyAxLFxuXHQgICAgICAgIHJpZ2h0ID0gMiAqIGluZGV4ICsgMixcblx0ICAgICAgICBmaXJzdCA9IGluZGV4O1xuXHQgICAgaWYgKGxlZnQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmlzSGlnaGVyUHJpb3JpdHkobGVmdCwgZmlyc3QpKSB7XG5cdCAgICAgIGZpcnN0ID0gbGVmdDtcblx0ICAgIH1cblx0ICAgIGlmIChyaWdodCA8IHRoaXMubGVuZ3RoICYmIHRoaXMuaXNIaWdoZXJQcmlvcml0eShyaWdodCwgZmlyc3QpKSB7XG5cdCAgICAgIGZpcnN0ID0gcmlnaHQ7XG5cdCAgICB9XG5cdCAgICBpZiAoZmlyc3QgIT09IGluZGV4KSB7XG5cdCAgICAgIHZhciB0ZW1wID0gdGhpcy5pdGVtc1tpbmRleF07XG5cdCAgICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gdGhpcy5pdGVtc1tmaXJzdF07XG5cdCAgICAgIHRoaXMuaXRlbXNbZmlyc3RdID0gdGVtcDtcblx0ICAgICAgdGhpcy5oZWFwaWZ5KGZpcnN0KTtcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICBwcmlvcml0eVByb3RvLnBlZWsgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLml0ZW1zWzBdLnZhbHVlOyB9O1xuXHRcblx0ICBwcmlvcml0eVByb3RvLnJlbW92ZUF0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG5cdCAgICB0aGlzLml0ZW1zW2luZGV4XSA9IHRoaXMuaXRlbXNbLS10aGlzLmxlbmd0aF07XG5cdCAgICB0aGlzLml0ZW1zW3RoaXMubGVuZ3RoXSA9IHVuZGVmaW5lZDtcblx0ICAgIHRoaXMuaGVhcGlmeSgpO1xuXHQgIH07XG5cdFxuXHQgIHByaW9yaXR5UHJvdG8uZGVxdWV1ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciByZXN1bHQgPSB0aGlzLnBlZWsoKTtcblx0ICAgIHRoaXMucmVtb3ZlQXQoMCk7XG5cdCAgICByZXR1cm4gcmVzdWx0O1xuXHQgIH07XG5cdFxuXHQgIHByaW9yaXR5UHJvdG8uZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICB2YXIgaW5kZXggPSB0aGlzLmxlbmd0aCsrO1xuXHQgICAgdGhpcy5pdGVtc1tpbmRleF0gPSBuZXcgSW5kZXhlZEl0ZW0oUHJpb3JpdHlRdWV1ZS5jb3VudCsrLCBpdGVtKTtcblx0ICAgIHRoaXMucGVyY29sYXRlKGluZGV4KTtcblx0ICB9O1xuXHRcblx0ICBwcmlvcml0eVByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgaWYgKHRoaXMuaXRlbXNbaV0udmFsdWUgPT09IGl0ZW0pIHtcblx0ICAgICAgICB0aGlzLnJlbW92ZUF0KGkpO1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfTtcblx0ICBQcmlvcml0eVF1ZXVlLmNvdW50ID0gMDtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJlcHJlc2VudHMgYSBub3RpZmljYXRpb24gdG8gYW4gb2JzZXJ2ZXIuXG5cdCAgICovXG5cdCAgdmFyIE5vdGlmaWNhdGlvbiA9IFJ4Lk5vdGlmaWNhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBOb3RpZmljYXRpb24oKSB7XG5cdFxuXHQgICAgfVxuXHRcblx0ICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdCA9IGZ1bmN0aW9uIChvbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG5cdCAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdE9ic2VydmFibGUgPSBmdW5jdGlvbiAob25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuXHQgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIEludm9rZXMgdGhlIGRlbGVnYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vdGlmaWNhdGlvbiBvciB0aGUgb2JzZXJ2ZXIncyBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGUgbm90aWZpY2F0aW9uIGFuZCByZXR1cm5zIHRoZSBwcm9kdWNlZCByZXN1bHQuXG5cdCAgICAgKlxuXHQgICAgICogQG1lbWJlck9mIE5vdGlmaWNhdGlvblxuXHQgICAgICogQHBhcmFtIHtBbnl9IG9ic2VydmVyT3JPbk5leHQgRGVsZWdhdGUgdG8gaW52b2tlIGZvciBhbiBPbk5leHQgbm90aWZpY2F0aW9uIG9yIE9ic2VydmVyIHRvIGludm9rZSB0aGUgbm90aWZpY2F0aW9uIG9uLi5cblx0ICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3IgRGVsZWdhdGUgdG8gaW52b2tlIGZvciBhbiBPbkVycm9yIG5vdGlmaWNhdGlvbi5cblx0ICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQ29tcGxldGVkIERlbGVnYXRlIHRvIGludm9rZSBmb3IgYW4gT25Db21wbGV0ZWQgbm90aWZpY2F0aW9uLlxuXHQgICAgICogQHJldHVybnMge0FueX0gUmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBvYnNlcnZhdGlvbi5cblx0ICAgICAqL1xuXHQgICAgTm90aWZpY2F0aW9uLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbiAob2JzZXJ2ZXJPck9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcblx0ICAgICAgcmV0dXJuIG9ic2VydmVyT3JPbk5leHQgJiYgdHlwZW9mIG9ic2VydmVyT3JPbk5leHQgPT09ICdvYmplY3QnID9cblx0ICAgICAgICB0aGlzLl9hY2NlcHRPYnNlcnZhYmxlKG9ic2VydmVyT3JPbk5leHQpIDpcblx0ICAgICAgICB0aGlzLl9hY2NlcHQob2JzZXJ2ZXJPck9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpO1xuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIGEgc2luZ2xlIG5vdGlmaWNhdGlvbi5cblx0ICAgICAqXG5cdCAgICAgKiBAbWVtYmVyT2YgTm90aWZpY2F0aW9uc1xuXHQgICAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBzZW5kIG91dCB0aGUgbm90aWZpY2F0aW9uIGNhbGxzIG9uLlxuXHQgICAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc3VyZmFjZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBub3RpZmljYXRpb24gdXBvbiBzdWJzY3JpcHRpb24uXG5cdCAgICAgKi9cblx0ICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9PYnNlcnZhYmxlID0gZnVuY3Rpb24gKHNjaGVkdWxlcikge1xuXHQgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGltbWVkaWF0ZVNjaGVkdWxlcik7XG5cdCAgICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuXHQgICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoc2VsZiwgZnVuY3Rpb24gKF8sIG5vdGlmaWNhdGlvbikge1xuXHQgICAgICAgICAgbm90aWZpY2F0aW9uLl9hY2NlcHRPYnNlcnZhYmxlKG8pO1xuXHQgICAgICAgICAgbm90aWZpY2F0aW9uLmtpbmQgPT09ICdOJyAmJiBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gTm90aWZpY2F0aW9uO1xuXHQgIH0pKCk7XG5cdFxuXHQgIHZhciBPbk5leHROb3RpZmljYXRpb24gPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoT25OZXh0Tm90aWZpY2F0aW9uLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gT25OZXh0Tm90aWZpY2F0aW9uKHZhbHVlKSB7XG5cdCAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgdGhpcy5raW5kID0gJ04nO1xuXHQgICAgfVxuXHRcblx0ICAgIE9uTmV4dE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdCA9IGZ1bmN0aW9uIChvbk5leHQpIHtcblx0ICAgICAgcmV0dXJuIG9uTmV4dCh0aGlzLnZhbHVlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgT25OZXh0Tm90aWZpY2F0aW9uLnByb3RvdHlwZS5fYWNjZXB0T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiBvLm9uTmV4dCh0aGlzLnZhbHVlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgT25OZXh0Tm90aWZpY2F0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuICdPbk5leHQoJyArIHRoaXMudmFsdWUgKyAnKSc7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBPbk5leHROb3RpZmljYXRpb247XG5cdCAgfShOb3RpZmljYXRpb24pKTtcblx0XG5cdCAgdmFyIE9uRXJyb3JOb3RpZmljYXRpb24gPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoT25FcnJvck5vdGlmaWNhdGlvbiwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIE9uRXJyb3JOb3RpZmljYXRpb24oZXJyb3IpIHtcblx0ICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuXHQgICAgICB0aGlzLmtpbmQgPSAnRSc7XG5cdCAgICB9XG5cdFxuXHQgICAgT25FcnJvck5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdCA9IGZ1bmN0aW9uIChvbk5leHQsIG9uRXJyb3IpIHtcblx0ICAgICAgcmV0dXJuIG9uRXJyb3IodGhpcy5lcnJvcik7XG5cdCAgICB9O1xuXHRcblx0ICAgIE9uRXJyb3JOb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHRPYnNlcnZhYmxlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIG8ub25FcnJvcih0aGlzLmVycm9yKTtcblx0ICAgIH07XG5cdFxuXHQgICAgT25FcnJvck5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiAnT25FcnJvcignICsgdGhpcy5lcnJvciArICcpJztcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIE9uRXJyb3JOb3RpZmljYXRpb247XG5cdCAgfShOb3RpZmljYXRpb24pKTtcblx0XG5cdCAgdmFyIE9uQ29tcGxldGVkTm90aWZpY2F0aW9uID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE9uQ29tcGxldGVkTm90aWZpY2F0aW9uLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gT25Db21wbGV0ZWROb3RpZmljYXRpb24oKSB7XG5cdCAgICAgIHRoaXMua2luZCA9ICdDJztcblx0ICAgIH1cblx0XG5cdCAgICBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdCA9IGZ1bmN0aW9uIChvbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG5cdCAgICAgIHJldHVybiBvbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdE9ic2VydmFibGUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiAnT25Db21wbGV0ZWQoKSc7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbjtcblx0ICB9KE5vdGlmaWNhdGlvbikpO1xuXHRcblx0ICAvKipcblx0ICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYW4gT25OZXh0IG5vdGlmaWNhdGlvbiB0byBhbiBvYnNlcnZlci5cblx0ICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgVGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgbm90aWZpY2F0aW9uLlxuXHQgICAqIEByZXR1cm5zIHtOb3RpZmljYXRpb259IFRoZSBPbk5leHQgbm90aWZpY2F0aW9uIGNvbnRhaW5pbmcgdGhlIHZhbHVlLlxuXHQgICAqL1xuXHQgIHZhciBub3RpZmljYXRpb25DcmVhdGVPbk5leHQgPSBOb3RpZmljYXRpb24uY3JlYXRlT25OZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICByZXR1cm4gbmV3IE9uTmV4dE5vdGlmaWNhdGlvbih2YWx1ZSk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGFuIE9uRXJyb3Igbm90aWZpY2F0aW9uIHRvIGFuIG9ic2VydmVyLlxuXHQgICAqIEBwYXJhbSB7QW55fSBlcnJvciBUaGUgZXhjZXB0aW9uIGNvbnRhaW5lZCBpbiB0aGUgbm90aWZpY2F0aW9uLlxuXHQgICAqIEByZXR1cm5zIHtOb3RpZmljYXRpb259IFRoZSBPbkVycm9yIG5vdGlmaWNhdGlvbiBjb250YWluaW5nIHRoZSBleGNlcHRpb24uXG5cdCAgICovXG5cdCAgdmFyIG5vdGlmaWNhdGlvbkNyZWF0ZU9uRXJyb3IgPSBOb3RpZmljYXRpb24uY3JlYXRlT25FcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgcmV0dXJuIG5ldyBPbkVycm9yTm90aWZpY2F0aW9uKGVycm9yKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYW4gT25Db21wbGV0ZWQgbm90aWZpY2F0aW9uIHRvIGFuIG9ic2VydmVyLlxuXHQgICAqIEByZXR1cm5zIHtOb3RpZmljYXRpb259IFRoZSBPbkNvbXBsZXRlZCBub3RpZmljYXRpb24uXG5cdCAgICovXG5cdCAgdmFyIG5vdGlmaWNhdGlvbkNyZWF0ZU9uQ29tcGxldGVkID0gTm90aWZpY2F0aW9uLmNyZWF0ZU9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIG5ldyBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbigpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIFN1cHBvcnRzIHB1c2gtc3R5bGUgaXRlcmF0aW9uIG92ZXIgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICB2YXIgT2JzZXJ2ZXIgPSBSeC5PYnNlcnZlciA9IGZ1bmN0aW9uICgpIHsgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogIENyZWF0ZXMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIE9uTmV4dCwgYWxvbmcgd2l0aCBvcHRpb25hbCBPbkVycm9yLCBhbmQgT25Db21wbGV0ZWQgYWN0aW9ucy5cblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25OZXh0XSBPYnNlcnZlcidzIE9uTmV4dCBhY3Rpb24gaW1wbGVtZW50YXRpb24uXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIE9ic2VydmVyJ3MgT25FcnJvciBhY3Rpb24gaW1wbGVtZW50YXRpb24uXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uQ29tcGxldGVkXSBPYnNlcnZlcidzIE9uQ29tcGxldGVkIGFjdGlvbiBpbXBsZW1lbnRhdGlvbi5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2ZXJ9IFRoZSBvYnNlcnZlciBvYmplY3QgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIGdpdmVuIGFjdGlvbnMuXG5cdCAgICovXG5cdCAgdmFyIG9ic2VydmVyQ3JlYXRlID0gT2JzZXJ2ZXIuY3JlYXRlID0gZnVuY3Rpb24gKG9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcblx0ICAgIG9uTmV4dCB8fCAob25OZXh0ID0gbm9vcCk7XG5cdCAgICBvbkVycm9yIHx8IChvbkVycm9yID0gZGVmYXVsdEVycm9yKTtcblx0ICAgIG9uQ29tcGxldGVkIHx8IChvbkNvbXBsZXRlZCA9IG5vb3ApO1xuXHQgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZlcihvbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIE9ic2VydmVyIGNsYXNzLlxuXHQgICAqIFRoaXMgYmFzZSBjbGFzcyBlbmZvcmNlcyB0aGUgZ3JhbW1hciBvZiBvYnNlcnZlcnMgd2hlcmUgT25FcnJvciBhbmQgT25Db21wbGV0ZWQgYXJlIHRlcm1pbmFsIG1lc3NhZ2VzLlxuXHQgICAqL1xuXHQgIHZhciBBYnN0cmFjdE9ic2VydmVyID0gUnguaW50ZXJuYWxzLkFic3RyYWN0T2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQWJzdHJhY3RPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaW4gYSBub24tc3RvcHBlZCBzdGF0ZS5cblx0ICAgICAqL1xuXHQgICAgZnVuY3Rpb24gQWJzdHJhY3RPYnNlcnZlcigpIHtcblx0ICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgIH1cblx0XG5cdCAgICAvLyBNdXN0IGJlIGltcGxlbWVudGVkIGJ5IG90aGVyIG9ic2VydmVyc1xuXHQgICAgQWJzdHJhY3RPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IG5vdEltcGxlbWVudGVkO1xuXHQgICAgQWJzdHJhY3RPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBub3RJbXBsZW1lbnRlZDtcblx0ICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IG5vdEltcGxlbWVudGVkO1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogTm90aWZpZXMgdGhlIG9ic2VydmVyIG9mIGEgbmV3IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLlxuXHQgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIE5leHQgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UuXG5cdCAgICAgKi9cblx0ICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAhdGhpcy5pc1N0b3BwZWQgJiYgdGhpcy5uZXh0KHZhbHVlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBOb3RpZmllcyB0aGUgb2JzZXJ2ZXIgdGhhdCBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkLlxuXHQgICAgICogQHBhcmFtIHtBbnl9IGVycm9yIFRoZSBlcnJvciB0aGF0IGhhcyBvY2N1cnJlZC5cblx0ICAgICAqL1xuXHQgICAgQWJzdHJhY3RPYnNlcnZlci5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuZXJyb3IoZXJyb3IpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogTm90aWZpZXMgdGhlIG9ic2VydmVyIG9mIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuXHQgICAgICovXG5cdCAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogRGlzcG9zZXMgdGhlIG9ic2VydmVyLCBjYXVzaW5nIGl0IHRvIHRyYW5zaXRpb24gdG8gdGhlIHN0b3BwZWQgc3RhdGUuXG5cdCAgICAgKi9cblx0ICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcblx0XG5cdCAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmVycm9yKGUpO1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBBYnN0cmFjdE9ic2VydmVyO1xuXHQgIH0oT2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogQ2xhc3MgdG8gY3JlYXRlIGFuIE9ic2VydmVyIGluc3RhbmNlIGZyb20gZGVsZWdhdGUtYmFzZWQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBvbiogbWV0aG9kcy5cblx0ICAgKi9cblx0ICB2YXIgQW5vbnltb3VzT2JzZXJ2ZXIgPSBSeC5Bbm9ueW1vdXNPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhBbm9ueW1vdXNPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIENyZWF0ZXMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIE9uTmV4dCwgT25FcnJvciwgYW5kIE9uQ29tcGxldGVkIGFjdGlvbnMuXG5cdCAgICAgKiBAcGFyYW0ge0FueX0gb25OZXh0IE9ic2VydmVyJ3MgT25OZXh0IGFjdGlvbiBpbXBsZW1lbnRhdGlvbi5cblx0ICAgICAqIEBwYXJhbSB7QW55fSBvbkVycm9yIE9ic2VydmVyJ3MgT25FcnJvciBhY3Rpb24gaW1wbGVtZW50YXRpb24uXG5cdCAgICAgKiBAcGFyYW0ge0FueX0gb25Db21wbGV0ZWQgT2JzZXJ2ZXIncyBPbkNvbXBsZXRlZCBhY3Rpb24gaW1wbGVtZW50YXRpb24uXG5cdCAgICAgKi9cblx0ICAgIGZ1bmN0aW9uIEFub255bW91c09ic2VydmVyKG9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICAgIHRoaXMuX29uTmV4dCA9IG9uTmV4dDtcblx0ICAgICAgdGhpcy5fb25FcnJvciA9IG9uRXJyb3I7XG5cdCAgICAgIHRoaXMuX29uQ29tcGxldGVkID0gb25Db21wbGV0ZWQ7XG5cdCAgICB9XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBDYWxscyB0aGUgb25OZXh0IGFjdGlvbi5cblx0ICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBOZXh0IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLlxuXHQgICAgICovXG5cdCAgICBBbm9ueW1vdXNPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICB0aGlzLl9vbk5leHQodmFsdWUpO1xuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIENhbGxzIHRoZSBvbkVycm9yIGFjdGlvbi5cblx0ICAgICAqIEBwYXJhbSB7QW55fSBlcnJvciBUaGUgZXJyb3IgdGhhdCBoYXMgb2NjdXJyZWQuXG5cdCAgICAgKi9cblx0ICAgIEFub255bW91c09ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICB0aGlzLl9vbkVycm9yKGVycm9yKTtcblx0ICAgIH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiAgQ2FsbHMgdGhlIG9uQ29tcGxldGVkIGFjdGlvbi5cblx0ICAgICAqL1xuXHQgICAgQW5vbnltb3VzT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fb25Db21wbGV0ZWQoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIEFub255bW91c09ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICB2YXIgb2JzZXJ2YWJsZVByb3RvO1xuXHRcblx0ICAvKipcblx0ICAgKiBSZXByZXNlbnRzIGEgcHVzaC1zdHlsZSBjb2xsZWN0aW9uLlxuXHQgICAqL1xuXHQgIHZhciBPYnNlcnZhYmxlID0gUnguT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoKSB7XG5cdFxuXHQgICAgZnVuY3Rpb24gbWFrZVN1YnNjcmliZShzZWxmLCBzdWJzY3JpYmUpIHtcblx0ICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgICAgdmFyIG9sZE9uRXJyb3IgPSBvLm9uRXJyb3I7XG5cdCAgICAgICAgby5vbkVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIG1ha2VTdGFja1RyYWNlTG9uZyhlLCBzZWxmKTtcblx0ICAgICAgICAgIG9sZE9uRXJyb3IuY2FsbChvLCBlKTtcblx0ICAgICAgICB9O1xuXHRcblx0ICAgICAgICByZXR1cm4gc3Vic2NyaWJlLmNhbGwoc2VsZiwgbyk7XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gT2JzZXJ2YWJsZSgpIHtcblx0ICAgICAgaWYgKFJ4LmNvbmZpZy5sb25nU3RhY2tTdXBwb3J0ICYmIGhhc1N0YWNrcykge1xuXHQgICAgICAgIHZhciBvbGRTdWJzY3JpYmUgPSB0aGlzLl9zdWJzY3JpYmU7XG5cdCAgICAgICAgdmFyIGUgPSB0cnlDYXRjaCh0aHJvd2VyKShuZXcgRXJyb3IoKSkuZTtcblx0ICAgICAgICB0aGlzLnN0YWNrID0gZS5zdGFjay5zdWJzdHJpbmcoZS5zdGFjay5pbmRleE9mKCdcXG4nKSArIDEpO1xuXHQgICAgICAgIHRoaXMuX3N1YnNjcmliZSA9IG1ha2VTdWJzY3JpYmUodGhpcywgb2xkU3Vic2NyaWJlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIG9ic2VydmFibGVQcm90byA9IE9ic2VydmFibGUucHJvdG90eXBlO1xuXHRcblx0ICAgIC8qKlxuXHQgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhbiBPYnNlcnZhYmxlXG5cdCAgICAqIEBwYXJhbSB7QW55fSBBbiBvYmplY3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgYW4gT2JzZXJ2YWJsZVxuXHQgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbiBPYnNlcnZhYmxlLCBlbHNlIGZhbHNlLlxuXHQgICAgKi9cblx0ICAgIE9ic2VydmFibGUuaXNPYnNlcnZhYmxlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIG8gJiYgaXNGdW5jdGlvbihvLnN1YnNjcmliZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIC8qKlxuXHQgICAgICogIFN1YnNjcmliZXMgYW4gbyB0byB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgICAqICBAcGFyYW0ge01peGVkfSBbb09yT25OZXh0XSBUaGUgb2JqZWN0IHRoYXQgaXMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIG9yIGFuIGFjdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgICAqICBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gQWN0aW9uIHRvIGludm9rZSB1cG9uIGV4Y2VwdGlvbmFsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAgICogIEBwYXJhbSB7RnVuY3Rpb259IFtvbkNvbXBsZXRlZF0gQWN0aW9uIHRvIGludm9rZSB1cG9uIGdyYWNlZnVsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAgICogIEByZXR1cm5zIHtEaXBvc2FibGV9IEEgZGlzcG9zYWJsZSBoYW5kbGluZyB0aGUgc3Vic2NyaXB0aW9ucyBhbmQgdW5zdWJzY3JpcHRpb25zLlxuXHQgICAgICovXG5cdCAgICBvYnNlcnZhYmxlUHJvdG8uc3Vic2NyaWJlID0gb2JzZXJ2YWJsZVByb3RvLmZvckVhY2ggPSBmdW5jdGlvbiAob09yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKHR5cGVvZiBvT3JPbk5leHQgPT09ICdvYmplY3QnID9cblx0ICAgICAgICBvT3JPbk5leHQgOlxuXHQgICAgICAgIG9ic2VydmVyQ3JlYXRlKG9Pck9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZSB3aXRoIGFuIG9wdGlvbmFsIFwidGhpc1wiIGFyZ3VtZW50LlxuXHQgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25OZXh0IFRoZSBmdW5jdGlvbiB0byBpbnZva2Ugb24gZWFjaCBlbGVtZW50IGluIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAgICogQHBhcmFtIHtBbnl9IFt0aGlzQXJnXSBPYmplY3QgdG8gdXNlIGFzIHRoaXMgd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXG5cdCAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gQSBkaXNwb3NhYmxlIGhhbmRsaW5nIHRoZSBzdWJzY3JpcHRpb25zIGFuZCB1bnN1YnNjcmlwdGlvbnMuXG5cdCAgICAgKi9cblx0ICAgIG9ic2VydmFibGVQcm90by5zdWJzY3JpYmVPbk5leHQgPSBmdW5jdGlvbiAob25OZXh0LCB0aGlzQXJnKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmUob2JzZXJ2ZXJDcmVhdGUodHlwZW9mIHRoaXNBcmcgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24oeCkgeyBvbk5leHQuY2FsbCh0aGlzQXJnLCB4KTsgfSA6IG9uTmV4dCkpO1xuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIFN1YnNjcmliZXMgdG8gYW4gZXhjZXB0aW9uYWwgY29uZGl0aW9uIGluIHRoZSBzZXF1ZW5jZSB3aXRoIGFuIG9wdGlvbmFsIFwidGhpc1wiIGFyZ3VtZW50LlxuXHQgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIHVwb24gZXhjZXB0aW9uYWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cblx0ICAgICAqIEByZXR1cm5zIHtEaXNwb3NhYmxlfSBBIGRpc3Bvc2FibGUgaGFuZGxpbmcgdGhlIHN1YnNjcmlwdGlvbnMgYW5kIHVuc3Vic2NyaXB0aW9ucy5cblx0ICAgICAqL1xuXHQgICAgb2JzZXJ2YWJsZVByb3RvLnN1YnNjcmliZU9uRXJyb3IgPSBmdW5jdGlvbiAob25FcnJvciwgdGhpc0FyZykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKG9ic2VydmVyQ3JlYXRlKG51bGwsIHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uKGUpIHsgb25FcnJvci5jYWxsKHRoaXNBcmcsIGUpOyB9IDogb25FcnJvcikpO1xuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIFN1YnNjcmliZXMgdG8gdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlIHdpdGggYW4gb3B0aW9uYWwgXCJ0aGlzXCIgYXJndW1lbnQuXG5cdCAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNvbXBsZXRlZCBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIHVwb24gZ3JhY2VmdWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cblx0ICAgICAqIEByZXR1cm5zIHtEaXNwb3NhYmxlfSBBIGRpc3Bvc2FibGUgaGFuZGxpbmcgdGhlIHN1YnNjcmlwdGlvbnMgYW5kIHVuc3Vic2NyaXB0aW9ucy5cblx0ICAgICAqL1xuXHQgICAgb2JzZXJ2YWJsZVByb3RvLnN1YnNjcmliZU9uQ29tcGxldGVkID0gZnVuY3Rpb24gKG9uQ29tcGxldGVkLCB0aGlzQXJnKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmUob2JzZXJ2ZXJDcmVhdGUobnVsbCwgbnVsbCwgdHlwZW9mIHRoaXNBcmcgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24oKSB7IG9uQ29tcGxldGVkLmNhbGwodGhpc0FyZyk7IH0gOiBvbkNvbXBsZXRlZCkpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gT2JzZXJ2YWJsZTtcblx0ICB9KSgpO1xuXHRcblx0ICB2YXIgU2NoZWR1bGVkT2JzZXJ2ZXIgPSBSeC5pbnRlcm5hbHMuU2NoZWR1bGVkT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoU2NoZWR1bGVkT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gU2NoZWR1bGVkT2JzZXJ2ZXIoc2NoZWR1bGVyLCBvYnNlcnZlcikge1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcblx0ICAgICAgdGhpcy5pc0FjcXVpcmVkID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuaGFzRmF1bHRlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLnF1ZXVlID0gW107XG5cdCAgICAgIHRoaXMuZGlzcG9zYWJsZSA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG5cdCAgICB9XG5cdFxuXHQgICAgU2NoZWR1bGVkT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXHQgICAgICB0aGlzLnF1ZXVlLnB1c2goZnVuY3Rpb24gKCkgeyBzZWxmLm9ic2VydmVyLm9uTmV4dCh2YWx1ZSk7IH0pO1xuXHQgICAgfTtcblx0XG5cdCAgICBTY2hlZHVsZWRPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgIHRoaXMucXVldWUucHVzaChmdW5jdGlvbiAoKSB7IHNlbGYub2JzZXJ2ZXIub25FcnJvcihlKTsgfSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFNjaGVkdWxlZE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBzZWxmID0gdGhpcztcblx0ICAgICAgdGhpcy5xdWV1ZS5wdXNoKGZ1bmN0aW9uICgpIHsgc2VsZi5vYnNlcnZlci5vbkNvbXBsZXRlZCgpOyB9KTtcblx0ICAgIH07XG5cdFxuXHQgICAgU2NoZWR1bGVkT2JzZXJ2ZXIucHJvdG90eXBlLmVuc3VyZUFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIGlzT3duZXIgPSBmYWxzZTtcblx0ICAgICAgaWYgKCF0aGlzLmhhc0ZhdWx0ZWQgJiYgdGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgaXNPd25lciA9ICF0aGlzLmlzQWNxdWlyZWQ7XG5cdCAgICAgICAgdGhpcy5pc0FjcXVpcmVkID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoaXNPd25lcikge1xuXHQgICAgICAgIHRoaXMuZGlzcG9zYWJsZS5zZXREaXNwb3NhYmxlKHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKHRoaXMsIGZ1bmN0aW9uIChwYXJlbnQsIHNlbGYpIHtcblx0ICAgICAgICAgIHZhciB3b3JrO1xuXHQgICAgICAgICAgaWYgKHBhcmVudC5xdWV1ZS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIHdvcmsgPSBwYXJlbnQucXVldWUuc2hpZnQoKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHBhcmVudC5pc0FjcXVpcmVkID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh3b3JrKSgpO1xuXHQgICAgICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHtcblx0ICAgICAgICAgICAgcGFyZW50LnF1ZXVlID0gW107XG5cdCAgICAgICAgICAgIHBhcmVudC5oYXNGYXVsdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRocm93ZXIocmVzLmUpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgc2VsZihwYXJlbnQpO1xuXHQgICAgICAgIH0pKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0XG5cdCAgICBTY2hlZHVsZWRPYnNlcnZlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgX19zdXBlcl9fLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgIHRoaXMuZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTY2hlZHVsZWRPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgdmFyIE9ic2VydmFibGVCYXNlID0gUnguT2JzZXJ2YWJsZUJhc2UgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoT2JzZXJ2YWJsZUJhc2UsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gZml4U3Vic2NyaWJlcihzdWJzY3JpYmVyKSB7XG5cdCAgICAgIHJldHVybiBzdWJzY3JpYmVyICYmIGlzRnVuY3Rpb24oc3Vic2NyaWJlci5kaXNwb3NlKSA/IHN1YnNjcmliZXIgOlxuXHQgICAgICAgIGlzRnVuY3Rpb24oc3Vic2NyaWJlcikgPyBkaXNwb3NhYmxlQ3JlYXRlKHN1YnNjcmliZXIpIDogZGlzcG9zYWJsZUVtcHR5O1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIHNldERpc3Bvc2FibGUocywgc3RhdGUpIHtcblx0ICAgICAgdmFyIGFkbyA9IHN0YXRlWzBdLCBzZWxmID0gc3RhdGVbMV07XG5cdCAgICAgIHZhciBzdWIgPSB0cnlDYXRjaChzZWxmLnN1YnNjcmliZUNvcmUpLmNhbGwoc2VsZiwgYWRvKTtcblx0ICAgICAgaWYgKHN1YiA9PT0gZXJyb3JPYmogJiYgIWFkby5mYWlsKGVycm9yT2JqLmUpKSB7IHRocm93ZXIoZXJyb3JPYmouZSk7IH1cblx0ICAgICAgYWRvLnNldERpc3Bvc2FibGUoZml4U3Vic2NyaWJlcihzdWIpKTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBPYnNlcnZhYmxlQmFzZSgpIHtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgT2JzZXJ2YWJsZUJhc2UucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgYWRvID0gbmV3IEF1dG9EZXRhY2hPYnNlcnZlcihvKSwgc3RhdGUgPSBbYWRvLCB0aGlzXTtcblx0XG5cdCAgICAgIGlmIChjdXJyZW50VGhyZWFkU2NoZWR1bGVyLnNjaGVkdWxlUmVxdWlyZWQoKSkge1xuXHQgICAgICAgIGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGUoc3RhdGUsIHNldERpc3Bvc2FibGUpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHNldERpc3Bvc2FibGUobnVsbCwgc3RhdGUpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBhZG87XG5cdCAgICB9O1xuXHRcblx0ICAgIE9ic2VydmFibGVCYXNlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gbm90SW1wbGVtZW50ZWQ7XG5cdFxuXHQgICAgcmV0dXJuIE9ic2VydmFibGVCYXNlO1xuXHQgIH0oT2JzZXJ2YWJsZSkpO1xuXHRcblx0dmFyIEZsYXRNYXBPYnNlcnZhYmxlID0gUnguRmxhdE1hcE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdFxuXHQgICAgaW5oZXJpdHMoRmxhdE1hcE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gRmxhdE1hcE9ic2VydmFibGUoc291cmNlLCBzZWxlY3RvciwgcmVzdWx0U2VsZWN0b3IsIHRoaXNBcmcpIHtcblx0ICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IGlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpID8gcmVzdWx0U2VsZWN0b3IgOiBudWxsO1xuXHQgICAgICB0aGlzLnNlbGVjdG9yID0gYmluZENhbGxiYWNrKGlzRnVuY3Rpb24oc2VsZWN0b3IpID8gc2VsZWN0b3IgOiBmdW5jdGlvbigpIHsgcmV0dXJuIHNlbGVjdG9yOyB9LCB0aGlzQXJnLCAzKTtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIEZsYXRNYXBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24obykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHRoaXMuc2VsZWN0b3IsIHRoaXMucmVzdWx0U2VsZWN0b3IsIHRoaXMpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG5cdCAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG9ic2VydmVyLCBzZWxlY3RvciwgcmVzdWx0U2VsZWN0b3IsIHNvdXJjZSkge1xuXHQgICAgICB0aGlzLmkgPSAwO1xuXHQgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdCAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3Rvcjtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMubyA9IG9ic2VydmVyO1xuXHQgICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuX3dyYXBSZXN1bHQgPSBmdW5jdGlvbihyZXN1bHQsIHgsIGkpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMucmVzdWx0U2VsZWN0b3IgP1xuXHQgICAgICAgIHJlc3VsdC5tYXAoZnVuY3Rpb24oeSwgaTIpIHsgcmV0dXJuIHRoaXMucmVzdWx0U2VsZWN0b3IoeCwgeSwgaSwgaTIpOyB9LCB0aGlzKSA6XG5cdCAgICAgICAgcmVzdWx0O1xuXHQgICAgfTtcblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oeCkge1xuXHQgICAgICB2YXIgaSA9IHRoaXMuaSsrO1xuXHQgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godGhpcy5zZWxlY3RvcikoeCwgaSwgdGhpcy5zb3VyY2UpO1xuXHQgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5vLm9uRXJyb3IocmVzdWx0LmUpOyB9XG5cdFxuXHQgICAgICBpc1Byb21pc2UocmVzdWx0KSAmJiAocmVzdWx0ID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHJlc3VsdCkpO1xuXHQgICAgICAoaXNBcnJheUxpa2UocmVzdWx0KSB8fCBpc0l0ZXJhYmxlKHJlc3VsdCkpICYmIChyZXN1bHQgPSBPYnNlcnZhYmxlLmZyb20ocmVzdWx0KSk7XG5cdCAgICAgIHRoaXMuby5vbk5leHQodGhpcy5fd3JhcFJlc3VsdChyZXN1bHQsIHgsIGkpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlKSB7IHRoaXMuby5vbkVycm9yKGUpOyB9O1xuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24oKSB7IHRoaXMuby5vbkNvbXBsZXRlZCgpOyB9O1xuXHRcblx0ICAgIHJldHVybiBGbGF0TWFwT2JzZXJ2YWJsZTtcblx0XG5cdH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIEVudW1lcmFibGUgPSBSeC5pbnRlcm5hbHMuRW51bWVyYWJsZSA9IGZ1bmN0aW9uICgpIHsgfTtcblx0XG5cdCAgZnVuY3Rpb24gSXNEaXNwb3NlZERpc3Bvc2FibGUoc3RhdGUpIHtcblx0ICAgIHRoaXMuX3MgPSBzdGF0ZTtcblx0ICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgIH1cblx0XG5cdCAgSXNEaXNwb3NlZERpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICB0aGlzLl9zLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgfVxuXHQgIH07XG5cdFxuXHQgIHZhciBDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKENvbmNhdEVudW1lcmFibGVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gQ29uY2F0RW51bWVyYWJsZU9ic2VydmFibGUoc291cmNlcykge1xuXHQgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBzdGF0ZSA9IHsgaXNEaXNwb3NlZDogZmFsc2UgfSwgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKTtcblx0ICAgICAgdmFyIGNhbmNlbGFibGUgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKHRoaXMuc291cmNlc1skaXRlcmF0b3IkXSgpLCBmdW5jdGlvbiAoZSwgc2VsZikge1xuXHQgICAgICAgIGlmIChzdGF0ZS5pc0Rpc3Bvc2VkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIHZhciBjdXJyZW50SXRlbSA9IHRyeUNhdGNoKGUubmV4dCkuY2FsbChlKTtcblx0ICAgICAgICBpZiAoY3VycmVudEl0ZW0gPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IoY3VycmVudEl0ZW0uZSk7IH1cblx0XG5cdCAgICAgICAgaWYgKGN1cnJlbnRJdGVtLmRvbmUpIHtcblx0ICAgICAgICAgIHJldHVybiBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICAvLyBDaGVjayBpZiBwcm9taXNlXG5cdCAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRJdGVtLnZhbHVlO1xuXHQgICAgICAgIGlzUHJvbWlzZShjdXJyZW50VmFsdWUpICYmIChjdXJyZW50VmFsdWUgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoY3VycmVudFZhbHVlKSk7XG5cdFxuXHQgICAgICAgIHZhciBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgICAgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUoZCk7XG5cdCAgICAgICAgZC5zZXREaXNwb3NhYmxlKGN1cnJlbnRWYWx1ZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobywgc2VsZiwgZSkpKTtcblx0ICAgICAgfSk7XG5cdFxuXHQgICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKFtzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUsIG5ldyBJc0Rpc3Bvc2VkRGlzcG9zYWJsZShzdGF0ZSldKTtcblx0ICAgIH07XG5cdFxuXHQgICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG5cdCAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIHMsIGUpIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX3MgPSBzO1xuXHQgICAgICB0aGlzLl9lID0gZTtcblx0ICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25OZXh0ID0gZnVuY3Rpb24gKHgpIHsgdGhpcy5fby5vbk5leHQoeCk7IH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGUpIHsgdGhpcy5fby5vbkVycm9yKGUpOyB9O1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3ModGhpcy5fZSk7IH07XG5cdFxuXHQgICAgcmV0dXJuIENvbmNhdEVudW1lcmFibGVPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgRW51bWVyYWJsZS5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIG5ldyBDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSh0aGlzKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgQ2F0Y2hFcnJvck9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhDYXRjaEVycm9yT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIENhdGNoRXJyb3JPYnNlcnZhYmxlKHNvdXJjZXMpIHtcblx0ICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgQ2F0Y2hFcnJvck9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgZSA9IHRoaXMuc291cmNlc1skaXRlcmF0b3IkXSgpO1xuXHRcblx0ICAgICAgdmFyIHN0YXRlID0geyBpc0Rpc3Bvc2VkOiBmYWxzZSB9LCBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpO1xuXHQgICAgICB2YXIgY2FuY2VsYWJsZSA9IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUobnVsbCwgZnVuY3Rpb24gKGxhc3RFeGNlcHRpb24sIHNlbGYpIHtcblx0ICAgICAgICBpZiAoc3RhdGUuaXNEaXNwb3NlZCkgeyByZXR1cm47IH1cblx0ICAgICAgICB2YXIgY3VycmVudEl0ZW0gPSB0cnlDYXRjaChlLm5leHQpLmNhbGwoZSk7XG5cdCAgICAgICAgaWYgKGN1cnJlbnRJdGVtID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKGN1cnJlbnRJdGVtLmUpOyB9XG5cdFxuXHQgICAgICAgIGlmIChjdXJyZW50SXRlbS5kb25lKSB7XG5cdCAgICAgICAgICByZXR1cm4gbGFzdEV4Y2VwdGlvbiAhPT0gbnVsbCA/IG8ub25FcnJvcihsYXN0RXhjZXB0aW9uKSA6IG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIC8vIENoZWNrIGlmIHByb21pc2Vcblx0ICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gY3VycmVudEl0ZW0udmFsdWU7XG5cdCAgICAgICAgaXNQcm9taXNlKGN1cnJlbnRWYWx1ZSkgJiYgKGN1cnJlbnRWYWx1ZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShjdXJyZW50VmFsdWUpKTtcblx0XG5cdCAgICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgICBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShkKTtcblx0ICAgICAgICBkLnNldERpc3Bvc2FibGUoY3VycmVudFZhbHVlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCBzZWxmKSkpO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIG5ldyBOQXJ5RGlzcG9zYWJsZShbc3Vic2NyaXB0aW9uLCBjYW5jZWxhYmxlLCBuZXcgSXNEaXNwb3NlZERpc3Bvc2FibGUoc3RhdGUpXSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGluaGVyaXRzKElubmVyT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvLCByZWN1cnNlKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9yZWN1cnNlID0gcmVjdXJzZTtcblx0ICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkgeyB0aGlzLl9vLm9uTmV4dCh4KTsgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHsgdGhpcy5fcmVjdXJzZShlKTsgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuXHRcblx0ICAgIHJldHVybiBDYXRjaEVycm9yT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIEVudW1lcmFibGUucHJvdG90eXBlLmNhdGNoRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gbmV3IENhdGNoRXJyb3JPYnNlcnZhYmxlKHRoaXMpO1xuXHQgIH07XG5cdFxuXHQgIEVudW1lcmFibGUucHJvdG90eXBlLmNhdGNoRXJyb3JXaGVuID0gZnVuY3Rpb24gKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcblx0ICAgIHZhciBzb3VyY2VzID0gdGhpcztcblx0ICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgZXhjZXB0aW9ucyA9IG5ldyBTdWJqZWN0KCksXG5cdCAgICAgICAgbm90aWZpZXIgPSBuZXcgU3ViamVjdCgpLFxuXHQgICAgICAgIGhhbmRsZWQgPSBub3RpZmljYXRpb25IYW5kbGVyKGV4Y2VwdGlvbnMpLFxuXHQgICAgICAgIG5vdGlmaWNhdGlvbkRpc3Bvc2FibGUgPSBoYW5kbGVkLnN1YnNjcmliZShub3RpZmllcik7XG5cdFxuXHQgICAgICB2YXIgZSA9IHNvdXJjZXNbJGl0ZXJhdG9yJF0oKTtcblx0XG5cdCAgICAgIHZhciBzdGF0ZSA9IHsgaXNEaXNwb3NlZDogZmFsc2UgfSxcblx0ICAgICAgICBsYXN0RXhjZXB0aW9uLFxuXHQgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG5cdCAgICAgIHZhciBjYW5jZWxhYmxlID0gY3VycmVudFRocmVhZFNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZShudWxsLCBmdW5jdGlvbiAoXywgc2VsZikge1xuXHQgICAgICAgIGlmIChzdGF0ZS5pc0Rpc3Bvc2VkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIHZhciBjdXJyZW50SXRlbSA9IHRyeUNhdGNoKGUubmV4dCkuY2FsbChlKTtcblx0ICAgICAgICBpZiAoY3VycmVudEl0ZW0gPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IoY3VycmVudEl0ZW0uZSk7IH1cblx0XG5cdCAgICAgICAgaWYgKGN1cnJlbnRJdGVtLmRvbmUpIHtcblx0ICAgICAgICAgIGlmIChsYXN0RXhjZXB0aW9uKSB7XG5cdCAgICAgICAgICAgIG8ub25FcnJvcihsYXN0RXhjZXB0aW9uKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIC8vIENoZWNrIGlmIHByb21pc2Vcblx0ICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gY3VycmVudEl0ZW0udmFsdWU7XG5cdCAgICAgICAgaXNQcm9taXNlKGN1cnJlbnRWYWx1ZSkgJiYgKGN1cnJlbnRWYWx1ZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShjdXJyZW50VmFsdWUpKTtcblx0XG5cdCAgICAgICAgdmFyIG91dGVyID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgICAgdmFyIGlubmVyID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgICAgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUobmV3IEJpbmFyeURpc3Bvc2FibGUoaW5uZXIsIG91dGVyKSk7XG5cdCAgICAgICAgb3V0ZXIuc2V0RGlzcG9zYWJsZShjdXJyZW50VmFsdWUuc3Vic2NyaWJlKFxuXHQgICAgICAgICAgZnVuY3Rpb24oeCkgeyBvLm9uTmV4dCh4KTsgfSxcblx0ICAgICAgICAgIGZ1bmN0aW9uIChleG4pIHtcblx0ICAgICAgICAgICAgaW5uZXIuc2V0RGlzcG9zYWJsZShub3RpZmllci5zdWJzY3JpYmUoc2VsZiwgZnVuY3Rpb24oZXgpIHtcblx0ICAgICAgICAgICAgICBvLm9uRXJyb3IoZXgpO1xuXHQgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgICAgIH0pKTtcblx0XG5cdCAgICAgICAgICAgIGV4Y2VwdGlvbnMub25OZXh0KGV4bik7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgZnVuY3Rpb24oKSB7IG8ub25Db21wbGV0ZWQoKTsgfSkpO1xuXHQgICAgICB9KTtcblx0XG5cdCAgICAgIHJldHVybiBuZXcgTkFyeURpc3Bvc2FibGUoW25vdGlmaWNhdGlvbkRpc3Bvc2FibGUsIHN1YnNjcmlwdGlvbiwgY2FuY2VsYWJsZSwgbmV3IElzRGlzcG9zZWREaXNwb3NhYmxlKHN0YXRlKV0pO1xuXHQgICAgfSk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFJlcGVhdEVudW1lcmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoUmVwZWF0RW51bWVyYWJsZSwgX19zdXBlcl9fKTtcblx0XG5cdCAgICBmdW5jdGlvbiBSZXBlYXRFbnVtZXJhYmxlKHYsIGMpIHtcblx0ICAgICAgdGhpcy52ID0gdjtcblx0ICAgICAgdGhpcy5jID0gYyA9PSBudWxsID8gLTEgOiBjO1xuXHQgICAgfVxuXHQgICAgUmVwZWF0RW51bWVyYWJsZS5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiBuZXcgUmVwZWF0RW51bWVyYXRvcih0aGlzKTtcblx0ICAgIH07XG5cdFxuXHQgICAgZnVuY3Rpb24gUmVwZWF0RW51bWVyYXRvcihwKSB7XG5cdCAgICAgIHRoaXMudiA9IHAudjtcblx0ICAgICAgdGhpcy5sID0gcC5jO1xuXHQgICAgfVxuXHQgICAgUmVwZWF0RW51bWVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgaWYgKHRoaXMubCA9PT0gMCkgeyByZXR1cm4gZG9uZUVudW1lcmF0b3I7IH1cblx0ICAgICAgaWYgKHRoaXMubCA+IDApIHsgdGhpcy5sLS07IH1cblx0ICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiB0aGlzLnYgfTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFJlcGVhdEVudW1lcmFibGU7XG5cdCAgfShFbnVtZXJhYmxlKSk7XG5cdFxuXHQgIHZhciBlbnVtZXJhYmxlUmVwZWF0ID0gRW51bWVyYWJsZS5yZXBlYXQgPSBmdW5jdGlvbiAodmFsdWUsIHJlcGVhdENvdW50KSB7XG5cdCAgICByZXR1cm4gbmV3IFJlcGVhdEVudW1lcmFibGUodmFsdWUsIHJlcGVhdENvdW50KTtcblx0ICB9O1xuXHRcblx0ICB2YXIgT2ZFbnVtZXJhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoT2ZFbnVtZXJhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gT2ZFbnVtZXJhYmxlKHMsIGZuLCB0aGlzQXJnKSB7XG5cdCAgICAgIHRoaXMucyA9IHM7XG5cdCAgICAgIHRoaXMuZm4gPSBmbiA/IGJpbmRDYWxsYmFjayhmbiwgdGhpc0FyZywgMykgOiBudWxsO1xuXHQgICAgfVxuXHQgICAgT2ZFbnVtZXJhYmxlLnByb3RvdHlwZVskaXRlcmF0b3IkXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBPZkVudW1lcmF0b3IodGhpcyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGZ1bmN0aW9uIE9mRW51bWVyYXRvcihwKSB7XG5cdCAgICAgIHRoaXMuaSA9IC0xO1xuXHQgICAgICB0aGlzLnMgPSBwLnM7XG5cdCAgICAgIHRoaXMubCA9IHRoaXMucy5sZW5ndGg7XG5cdCAgICAgIHRoaXMuZm4gPSBwLmZuO1xuXHQgICAgfVxuXHQgICAgT2ZFbnVtZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgIHJldHVybiArK3RoaXMuaSA8IHRoaXMubCA/XG5cdCAgICAgICB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogIXRoaXMuZm4gPyB0aGlzLnNbdGhpcy5pXSA6IHRoaXMuZm4odGhpcy5zW3RoaXMuaV0sIHRoaXMuaSwgdGhpcy5zKSB9IDpcblx0ICAgICAgIGRvbmVFbnVtZXJhdG9yO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gT2ZFbnVtZXJhYmxlO1xuXHQgIH0oRW51bWVyYWJsZSkpO1xuXHRcblx0ICB2YXIgZW51bWVyYWJsZU9mID0gRW51bWVyYWJsZS5vZiA9IGZ1bmN0aW9uIChzb3VyY2UsIHNlbGVjdG9yLCB0aGlzQXJnKSB7XG5cdCAgICByZXR1cm4gbmV3IE9mRW51bWVyYWJsZShzb3VyY2UsIHNlbGVjdG9yLCB0aGlzQXJnKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgVG9BcnJheU9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhUb0FycmF5T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFRvQXJyYXlPYnNlcnZhYmxlKHNvdXJjZSkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgVG9BcnJheU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobykpO1xuXHQgICAgfTtcblx0XG5cdCAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcblx0ICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIobykge1xuXHQgICAgICB0aGlzLm8gPSBvO1xuXHQgICAgICB0aGlzLmEgPSBbXTtcblx0ICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHQgICAgXG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHsgdGhpcy5hLnB1c2goeCk7IH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuby5vbkVycm9yKGUpOyAgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5vLm9uTmV4dCh0aGlzLmEpOyB0aGlzLm8ub25Db21wbGV0ZWQoKTsgfTtcblx0XG5cdCAgICByZXR1cm4gVG9BcnJheU9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICAvKipcblx0ICAqIENyZWF0ZXMgYW4gYXJyYXkgZnJvbSBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyBhIHNpbmdsZSBlbGVtZW50IHdpdGggYSBsaXN0IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gbmV3IFRvQXJyYXlPYnNlcnZhYmxlKHRoaXMpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqICBDcmVhdGVzIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgZnJvbSBhIHNwZWNpZmllZCBzdWJzY3JpYmUgbWV0aG9kIGltcGxlbWVudGF0aW9uLlxuXHQgICAqIEBleGFtcGxlXG5cdCAgICogIHZhciByZXMgPSBSeC5PYnNlcnZhYmxlLmNyZWF0ZShmdW5jdGlvbiAob2JzZXJ2ZXIpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgfSApO1xuXHQgICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5jcmVhdGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7IHJldHVybiBSeC5EaXNwb3NhYmxlLmVtcHR5OyB9ICk7XG5cdCAgICogIHZhciByZXMgPSBSeC5PYnNlcnZhYmxlLmNyZWF0ZShmdW5jdGlvbiAob2JzZXJ2ZXIpIHsgfSApO1xuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN1YnNjcmliZSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIG9ic2VydmFibGUgc2VxdWVuY2UncyBzdWJzY3JpYmUgbWV0aG9kLCByZXR1cm5pbmcgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgd3JhcHBlZCBpbiBhIERpc3Bvc2FibGUuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFN1YnNjcmliZSBtZXRob2QuXG5cdCAgICovXG5cdCAgT2JzZXJ2YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlLCBwYXJlbnQpIHtcblx0ICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShzdWJzY3JpYmUsIHBhcmVudCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIERlZmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRGVmZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBEZWZlcihmYWN0b3J5KSB7XG5cdCAgICAgIHRoaXMuX2YgPSBmYWN0b3J5O1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBEZWZlci5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciByZXN1bHQgPSB0cnlDYXRjaCh0aGlzLl9mKSgpO1xuXHQgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gb2JzZXJ2YWJsZVRocm93KHJlc3VsdC5lKS5zdWJzY3JpYmUobyk7fVxuXHQgICAgICBpc1Byb21pc2UocmVzdWx0KSAmJiAocmVzdWx0ID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHJlc3VsdCkpO1xuXHQgICAgICByZXR1cm4gcmVzdWx0LnN1YnNjcmliZShvKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIERlZmVyO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGludm9rZXMgdGhlIHNwZWNpZmllZCBmYWN0b3J5IGZ1bmN0aW9uIHdoZW5ldmVyIGEgbmV3IG9ic2VydmVyIHN1YnNjcmliZXMuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5kZWZlcihmdW5jdGlvbiAoKSB7IHJldHVybiBSeC5PYnNlcnZhYmxlLmZyb21BcnJheShbMSwyLDNdKTsgfSk7XG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gb2JzZXJ2YWJsZUZhY3RvcnkgT2JzZXJ2YWJsZSBmYWN0b3J5IGZ1bmN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBvYnNlcnZlciB0aGF0IHN1YnNjcmliZXMgdG8gdGhlIHJlc3VsdGluZyBzZXF1ZW5jZSBvciBQcm9taXNlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHdob3NlIG9ic2VydmVycyB0cmlnZ2VyIGFuIGludm9jYXRpb24gb2YgdGhlIGdpdmVuIG9ic2VydmFibGUgZmFjdG9yeSBmdW5jdGlvbi5cblx0ICAgKi9cblx0ICB2YXIgb2JzZXJ2YWJsZURlZmVyID0gT2JzZXJ2YWJsZS5kZWZlciA9IGZ1bmN0aW9uIChvYnNlcnZhYmxlRmFjdG9yeSkge1xuXHQgICAgcmV0dXJuIG5ldyBEZWZlcihvYnNlcnZhYmxlRmFjdG9yeSk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIEVtcHR5T2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKEVtcHR5T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIEVtcHR5T2JzZXJ2YWJsZShzY2hlZHVsZXIpIHtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIEVtcHR5T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuXHQgICAgICB2YXIgc2luayA9IG5ldyBFbXB0eVNpbmsob2JzZXJ2ZXIsIHRoaXMuc2NoZWR1bGVyKTtcblx0ICAgICAgcmV0dXJuIHNpbmsucnVuKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGZ1bmN0aW9uIEVtcHR5U2luayhvYnNlcnZlciwgc2NoZWR1bGVyKSB7XG5cdCAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gc2NoZWR1bGVJdGVtKHMsIHN0YXRlKSB7XG5cdCAgICAgIHN0YXRlLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG5cdCAgICB9XG5cdFxuXHQgICAgRW1wdHlTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBzdGF0ZSA9IHRoaXMub2JzZXJ2ZXI7XG5cdCAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlciA9PT0gaW1tZWRpYXRlU2NoZWR1bGVyID9cblx0ICAgICAgICBzY2hlZHVsZUl0ZW0obnVsbCwgc3RhdGUpIDpcblx0ICAgICAgICB0aGlzLnNjaGVkdWxlci5zY2hlZHVsZShzdGF0ZSwgc2NoZWR1bGVJdGVtKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIEVtcHR5T2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBFTVBUWV9PQlNFUlZBQkxFID0gbmV3IEVtcHR5T2JzZXJ2YWJsZShpbW1lZGlhdGVTY2hlZHVsZXIpO1xuXHRcblx0ICAvKipcblx0ICAgKiAgUmV0dXJucyBhbiBlbXB0eSBvYnNlcnZhYmxlIHNlcXVlbmNlLCB1c2luZyB0aGUgc3BlY2lmaWVkIHNjaGVkdWxlciB0byBzZW5kIG91dCB0aGUgc2luZ2xlIE9uQ29tcGxldGVkIG1lc3NhZ2UuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5lbXB0eSgpO1xuXHQgICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5lbXB0eShSeC5TY2hlZHVsZXIudGltZW91dCk7XG5cdCAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBzZW5kIHRoZSB0ZXJtaW5hdGlvbiBjYWxsIG9uLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHdpdGggbm8gZWxlbWVudHMuXG5cdCAgICovXG5cdCAgdmFyIG9ic2VydmFibGVFbXB0eSA9IE9ic2VydmFibGUuZW1wdHkgPSBmdW5jdGlvbiAoc2NoZWR1bGVyKSB7XG5cdCAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBpbW1lZGlhdGVTY2hlZHVsZXIpO1xuXHQgICAgcmV0dXJuIHNjaGVkdWxlciA9PT0gaW1tZWRpYXRlU2NoZWR1bGVyID8gRU1QVFlfT0JTRVJWQUJMRSA6IG5ldyBFbXB0eU9ic2VydmFibGUoc2NoZWR1bGVyKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgRnJvbU9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhGcm9tT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIEZyb21PYnNlcnZhYmxlKGl0ZXJhYmxlLCBtYXBwZXIsIHNjaGVkdWxlcikge1xuXHQgICAgICB0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7XG5cdCAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyO1xuXHQgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgRnJvbU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgc2luayA9IG5ldyBGcm9tU2luayhvLCB0aGlzKTtcblx0ICAgICAgcmV0dXJuIHNpbmsucnVuKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBGcm9tT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBGcm9tU2luayA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGcm9tU2luayhvLCBwYXJlbnQpIHtcblx0ICAgICAgdGhpcy5vID0gbztcblx0ICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICB9XG5cdFxuXHQgICAgRnJvbVNpbmsucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIGxpc3QgPSBPYmplY3QodGhpcy5wYXJlbnQuaXRlcmFibGUpLFxuXHQgICAgICAgICAgaXQgPSBnZXRJdGVyYWJsZShsaXN0KSxcblx0ICAgICAgICAgIG8gPSB0aGlzLm8sXG5cdCAgICAgICAgICBtYXBwZXIgPSB0aGlzLnBhcmVudC5tYXBwZXI7XG5cdFxuXHQgICAgICBmdW5jdGlvbiBsb29wUmVjdXJzaXZlKGksIHJlY3Vyc2UpIHtcblx0ICAgICAgICB2YXIgbmV4dCA9IHRyeUNhdGNoKGl0Lm5leHQpLmNhbGwoaXQpO1xuXHQgICAgICAgIGlmIChuZXh0ID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKG5leHQuZSk7IH1cblx0ICAgICAgICBpZiAobmV4dC5kb25lKSB7IHJldHVybiBvLm9uQ29tcGxldGVkKCk7IH1cblx0XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IG5leHQudmFsdWU7XG5cdFxuXHQgICAgICAgIGlmIChpc0Z1bmN0aW9uKG1hcHBlcikpIHtcblx0ICAgICAgICAgIHJlc3VsdCA9IHRyeUNhdGNoKG1hcHBlcikocmVzdWx0LCBpKTtcblx0ICAgICAgICAgIGlmIChyZXN1bHQgPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IocmVzdWx0LmUpOyB9XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBvLm9uTmV4dChyZXN1bHQpO1xuXHQgICAgICAgIHJlY3Vyc2UoaSArIDEpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuc2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKDAsIGxvb3BSZWN1cnNpdmUpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gRnJvbVNpbms7XG5cdCAgfSgpKTtcblx0XG5cdCAgdmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcblx0XG5cdCAgZnVuY3Rpb24gU3RyaW5nSXRlcmFibGUocykge1xuXHQgICAgdGhpcy5fcyA9IHM7XG5cdCAgfVxuXHRcblx0ICBTdHJpbmdJdGVyYWJsZS5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gbmV3IFN0cmluZ0l0ZXJhdG9yKHRoaXMuX3MpO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIFN0cmluZ0l0ZXJhdG9yKHMpIHtcblx0ICAgIHRoaXMuX3MgPSBzO1xuXHQgICAgdGhpcy5fbCA9IHMubGVuZ3RoO1xuXHQgICAgdGhpcy5faSA9IDA7XG5cdCAgfVxuXHRcblx0ICBTdHJpbmdJdGVyYXRvci5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gdGhpcztcblx0ICB9O1xuXHRcblx0ICBTdHJpbmdJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9pIDwgdGhpcy5fbCA/IHsgZG9uZTogZmFsc2UsIHZhbHVlOiB0aGlzLl9zLmNoYXJBdCh0aGlzLl9pKyspIH0gOiBkb25lRW51bWVyYXRvcjtcblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBBcnJheUl0ZXJhYmxlKGEpIHtcblx0ICAgIHRoaXMuX2EgPSBhO1xuXHQgIH1cblx0XG5cdCAgQXJyYXlJdGVyYWJsZS5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gbmV3IEFycmF5SXRlcmF0b3IodGhpcy5fYSk7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24gQXJyYXlJdGVyYXRvcihhKSB7XG5cdCAgICB0aGlzLl9hID0gYTtcblx0ICAgIHRoaXMuX2wgPSB0b0xlbmd0aChhKTtcblx0ICAgIHRoaXMuX2kgPSAwO1xuXHQgIH1cblx0XG5cdCAgQXJyYXlJdGVyYXRvci5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gdGhpcztcblx0ICB9O1xuXHRcblx0ICBBcnJheUl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2kgPCB0aGlzLl9sID8geyBkb25lOiBmYWxzZSwgdmFsdWU6IHRoaXMuX2FbdGhpcy5faSsrXSB9IDogZG9uZUVudW1lcmF0b3I7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24gbnVtYmVySXNGaW5pdGUodmFsdWUpIHtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHJvb3QuaXNGaW5pdGUodmFsdWUpO1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gaXNOYW4obikge1xuXHQgICAgcmV0dXJuIG4gIT09IG47XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiBnZXRJdGVyYWJsZShvKSB7XG5cdCAgICB2YXIgaSA9IG9bJGl0ZXJhdG9yJF0sIGl0O1xuXHQgICAgaWYgKCFpICYmIHR5cGVvZiBvID09PSAnc3RyaW5nJykge1xuXHQgICAgICBpdCA9IG5ldyBTdHJpbmdJdGVyYWJsZShvKTtcblx0ICAgICAgcmV0dXJuIGl0WyRpdGVyYXRvciRdKCk7XG5cdCAgICB9XG5cdCAgICBpZiAoIWkgJiYgby5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICBpdCA9IG5ldyBBcnJheUl0ZXJhYmxlKG8pO1xuXHQgICAgICByZXR1cm4gaXRbJGl0ZXJhdG9yJF0oKTtcblx0ICAgIH1cblx0ICAgIGlmICghaSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QgaXMgbm90IGl0ZXJhYmxlJyk7IH1cblx0ICAgIHJldHVybiBvWyRpdGVyYXRvciRdKCk7XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiBzaWduKHZhbHVlKSB7XG5cdCAgICB2YXIgbnVtYmVyID0gK3ZhbHVlO1xuXHQgICAgaWYgKG51bWJlciA9PT0gMCkgeyByZXR1cm4gbnVtYmVyOyB9XG5cdCAgICBpZiAoaXNOYU4obnVtYmVyKSkgeyByZXR1cm4gbnVtYmVyOyB9XG5cdCAgICByZXR1cm4gbnVtYmVyIDwgMCA/IC0xIDogMTtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIHRvTGVuZ3RoKG8pIHtcblx0ICAgIHZhciBsZW4gPSArby5sZW5ndGg7XG5cdCAgICBpZiAoaXNOYU4obGVuKSkgeyByZXR1cm4gMDsgfVxuXHQgICAgaWYgKGxlbiA9PT0gMCB8fCAhbnVtYmVySXNGaW5pdGUobGVuKSkgeyByZXR1cm4gbGVuOyB9XG5cdCAgICBsZW4gPSBzaWduKGxlbikgKiBNYXRoLmZsb29yKE1hdGguYWJzKGxlbikpO1xuXHQgICAgaWYgKGxlbiA8PSAwKSB7IHJldHVybiAwOyB9XG5cdCAgICBpZiAobGVuID4gbWF4U2FmZUludGVnZXIpIHsgcmV0dXJuIG1heFNhZmVJbnRlZ2VyOyB9XG5cdCAgICByZXR1cm4gbGVuO1xuXHQgIH1cblx0XG5cdCAgLyoqXG5cdCAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IE9ic2VydmFibGUgc2VxdWVuY2UgZnJvbSBhbiBhcnJheS1saWtlIG9yIGl0ZXJhYmxlIG9iamVjdC5cblx0ICAqIEBwYXJhbSB7QW55fSBhcnJheUxpa2UgQW4gYXJyYXktbGlrZSBvciBpdGVyYWJsZSBvYmplY3QgdG8gY29udmVydCB0byBhbiBPYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICogQHBhcmFtIHtGdW5jdGlvbn0gW21hcEZuXSBNYXAgZnVuY3Rpb24gdG8gY2FsbCBvbiBldmVyeSBlbGVtZW50IG9mIHRoZSBhcnJheS5cblx0ICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gVGhlIGNvbnRleHQgdG8gdXNlIGNhbGxpbmcgdGhlIG1hcEZuIGlmIHByb3ZpZGVkLlxuXHQgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIE9wdGlvbmFsIHNjaGVkdWxlciB0byB1c2UgZm9yIHNjaGVkdWxpbmcuICBJZiBub3QgcHJvdmlkZWQsIGRlZmF1bHRzIHRvIFNjaGVkdWxlci5jdXJyZW50VGhyZWFkLlxuXHQgICovXG5cdCAgdmFyIG9ic2VydmFibGVGcm9tID0gT2JzZXJ2YWJsZS5mcm9tID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBtYXBGbiwgdGhpc0FyZywgc2NoZWR1bGVyKSB7XG5cdCAgICBpZiAoaXRlcmFibGUgPT0gbnVsbCkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2l0ZXJhYmxlIGNhbm5vdCBiZSBudWxsLicpXG5cdCAgICB9XG5cdCAgICBpZiAobWFwRm4gJiYgIWlzRnVuY3Rpb24obWFwRm4pKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignbWFwRm4gd2hlbiBwcm92aWRlZCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0ICAgIH1cblx0ICAgIGlmIChtYXBGbikge1xuXHQgICAgICB2YXIgbWFwcGVyID0gYmluZENhbGxiYWNrKG1hcEZuLCB0aGlzQXJnLCAyKTtcblx0ICAgIH1cblx0ICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIpO1xuXHQgICAgcmV0dXJuIG5ldyBGcm9tT2JzZXJ2YWJsZShpdGVyYWJsZSwgbWFwcGVyLCBzY2hlZHVsZXIpO1xuXHQgIH1cblx0XG5cdCAgdmFyIEZyb21BcnJheU9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhGcm9tQXJyYXlPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gRnJvbUFycmF5T2JzZXJ2YWJsZShhcmdzLCBzY2hlZHVsZXIpIHtcblx0ICAgICAgdGhpcy5hcmdzID0gYXJncztcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIEZyb21BcnJheU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcblx0ICAgICAgdmFyIHNpbmsgPSBuZXcgRnJvbUFycmF5U2luayhvYnNlcnZlciwgdGhpcyk7XG5cdCAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gRnJvbUFycmF5T2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIGZ1bmN0aW9uIEZyb21BcnJheVNpbmsob2JzZXJ2ZXIsIHBhcmVudCkge1xuXHQgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuXHQgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgfVxuXHRcblx0ICBmdW5jdGlvbiBsb29wUmVjdXJzaXZlKGFyZ3MsIG9ic2VydmVyKSB7XG5cdCAgICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG5cdCAgICByZXR1cm4gZnVuY3Rpb24gbG9vcCAoaSwgcmVjdXJzZSkge1xuXHQgICAgICBpZiAoaSA8IGxlbikge1xuXHQgICAgICAgIG9ic2VydmVyLm9uTmV4dChhcmdzW2ldKTtcblx0ICAgICAgICByZWN1cnNlKGkgKyAxKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBvYnNlcnZlci5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgIH1cblx0XG5cdCAgRnJvbUFycmF5U2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIHRoaXMucGFyZW50LnNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSgwLCBsb29wUmVjdXJzaXZlKHRoaXMucGFyZW50LmFyZ3MsIHRoaXMub2JzZXJ2ZXIpKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAqICBDb252ZXJ0cyBhbiBhcnJheSB0byBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLCB1c2luZyBhbiBvcHRpb25hbCBzY2hlZHVsZXIgdG8gZW51bWVyYXRlIHRoZSBhcnJheS5cblx0ICAqIEBkZXByZWNhdGVkIHVzZSBPYnNlcnZhYmxlLmZyb20gb3IgT2JzZXJ2YWJsZS5vZlxuXHQgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBydW4gdGhlIGVudW1lcmF0aW9uIG9mIHRoZSBpbnB1dCBzZXF1ZW5jZSBvbi5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgcHVsbGVkIGZyb20gdGhlIGdpdmVuIGVudW1lcmFibGUgc2VxdWVuY2UuXG5cdCAgKi9cblx0ICB2YXIgb2JzZXJ2YWJsZUZyb21BcnJheSA9IE9ic2VydmFibGUuZnJvbUFycmF5ID0gZnVuY3Rpb24gKGFycmF5LCBzY2hlZHVsZXIpIHtcblx0ICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIpO1xuXHQgICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFycmF5LCBzY2hlZHVsZXIpXG5cdCAgfTtcblx0XG5cdCAgdmFyIE5ldmVyT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE5ldmVyT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIE5ldmVyT2JzZXJ2YWJsZSgpIHtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgTmV2ZXJPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG5cdCAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBOZXZlck9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgTkVWRVJfT0JTRVJWQUJMRSA9IG5ldyBOZXZlck9ic2VydmFibGUoKTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyBhIG5vbi10ZXJtaW5hdGluZyBvYnNlcnZhYmxlIHNlcXVlbmNlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBkZW5vdGUgYW4gaW5maW5pdGUgZHVyYXRpb24gKGUuZy4gd2hlbiB1c2luZyByZWFjdGl2ZSBqb2lucykuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hvc2Ugb2JzZXJ2ZXJzIHdpbGwgbmV2ZXIgZ2V0IGNhbGxlZC5cblx0ICAgKi9cblx0ICB2YXIgb2JzZXJ2YWJsZU5ldmVyID0gT2JzZXJ2YWJsZS5uZXZlciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBORVZFUl9PQlNFUlZBQkxFO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIG9ic2VydmFibGVPZiAoc2NoZWR1bGVyLCBhcnJheSkge1xuXHQgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG5cdCAgICByZXR1cm4gbmV3IEZyb21BcnJheU9ic2VydmFibGUoYXJyYXksIHNjaGVkdWxlcik7XG5cdCAgfVxuXHRcblx0ICAvKipcblx0ICAqICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IE9ic2VydmFibGUgaW5zdGFuY2Ugd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMsIHJlZ2FyZGxlc3Mgb2YgbnVtYmVyIG9yIHR5cGUgb2YgdGhlIGFyZ3VtZW50cy5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgcHVsbGVkIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50cy5cblx0ICAqL1xuXHQgIE9ic2VydmFibGUub2YgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuXHQgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIHJldHVybiBuZXcgRnJvbUFycmF5T2JzZXJ2YWJsZShhcmdzLCBjdXJyZW50VGhyZWFkU2NoZWR1bGVyKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAqICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IE9ic2VydmFibGUgaW5zdGFuY2Ugd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMsIHJlZ2FyZGxlc3Mgb2YgbnVtYmVyIG9yIHR5cGUgb2YgdGhlIGFyZ3VtZW50cy5cblx0ICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBzY2hlZHVsZXIgQSBzY2hlZHVsZXIgdG8gdXNlIGZvciBzY2hlZHVsaW5nIHRoZSBhcmd1bWVudHMuXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hvc2UgZWxlbWVudHMgYXJlIHB1bGxlZCBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudHMuXG5cdCAgKi9cblx0ICBPYnNlcnZhYmxlLm9mV2l0aFNjaGVkdWxlciA9IGZ1bmN0aW9uIChzY2hlZHVsZXIpIHtcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuXHQgICAgZm9yKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgICByZXR1cm4gbmV3IEZyb21BcnJheU9ic2VydmFibGUoYXJncywgc2NoZWR1bGVyKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgUGFpcnNPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoUGFpcnNPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gUGFpcnNPYnNlcnZhYmxlKG9iaiwgc2NoZWR1bGVyKSB7XG5cdCAgICAgIHRoaXMub2JqID0gb2JqO1xuXHQgICAgICB0aGlzLmtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuXHQgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgUGFpcnNPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG5cdCAgICAgIHZhciBzaW5rID0gbmV3IFBhaXJzU2luayhvYnNlcnZlciwgdGhpcyk7XG5cdCAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gUGFpcnNPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgZnVuY3Rpb24gUGFpcnNTaW5rKG9ic2VydmVyLCBwYXJlbnQpIHtcblx0ICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcblx0ICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXHQgIH1cblx0XG5cdCAgUGFpcnNTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmVyLCBvYmogPSB0aGlzLnBhcmVudC5vYmosIGtleXMgPSB0aGlzLnBhcmVudC5rZXlzLCBsZW4gPSBrZXlzLmxlbmd0aDtcblx0ICAgIGZ1bmN0aW9uIGxvb3BSZWN1cnNpdmUoaSwgcmVjdXJzZSkge1xuXHQgICAgICBpZiAoaSA8IGxlbikge1xuXHQgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXHQgICAgICAgIG9ic2VydmVyLm9uTmV4dChba2V5LCBvYmpba2V5XV0pO1xuXHQgICAgICAgIHJlY3Vyc2UoaSArIDEpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIG9ic2VydmVyLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0XG5cdCAgICByZXR1cm4gdGhpcy5wYXJlbnQuc2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKDAsIGxvb3BSZWN1cnNpdmUpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIENvbnZlcnQgYW4gb2JqZWN0IGludG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBba2V5LCB2YWx1ZV0gcGFpcnMuXG5cdCAgICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG5cdCAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBydW4gdGhlIGVudW1lcmF0aW9uIG9mIHRoZSBpbnB1dCBzZXF1ZW5jZSBvbi5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBba2V5LCB2YWx1ZV0gcGFpcnMgZnJvbSB0aGUgb2JqZWN0LlxuXHQgICAqL1xuXHQgIE9ic2VydmFibGUucGFpcnMgPSBmdW5jdGlvbiAob2JqLCBzY2hlZHVsZXIpIHtcblx0ICAgIHNjaGVkdWxlciB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG5cdCAgICByZXR1cm4gbmV3IFBhaXJzT2JzZXJ2YWJsZShvYmosIHNjaGVkdWxlcik7XG5cdCAgfTtcblx0XG5cdCAgICB2YXIgUmFuZ2VPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoUmFuZ2VPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gUmFuZ2VPYnNlcnZhYmxlKHN0YXJ0LCBjb3VudCwgc2NoZWR1bGVyKSB7XG5cdCAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcblx0ICAgICAgdGhpcy5yYW5nZUNvdW50ID0gY291bnQ7XG5cdCAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBSYW5nZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcblx0ICAgICAgdmFyIHNpbmsgPSBuZXcgUmFuZ2VTaW5rKG9ic2VydmVyLCB0aGlzKTtcblx0ICAgICAgcmV0dXJuIHNpbmsucnVuKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBSYW5nZU9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgUmFuZ2VTaW5rID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFJhbmdlU2luayhvYnNlcnZlciwgcGFyZW50KSB7XG5cdCAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcblx0ICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gbG9vcFJlY3Vyc2l2ZShzdGFydCwgY291bnQsIG9ic2VydmVyKSB7XG5cdCAgICAgIHJldHVybiBmdW5jdGlvbiBsb29wIChpLCByZWN1cnNlKSB7XG5cdCAgICAgICAgaWYgKGkgPCBjb3VudCkge1xuXHQgICAgICAgICAgb2JzZXJ2ZXIub25OZXh0KHN0YXJ0ICsgaSk7XG5cdCAgICAgICAgICByZWN1cnNlKGkgKyAxKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdFxuXHQgICAgUmFuZ2VTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUoXG5cdCAgICAgICAgMCxcblx0ICAgICAgICBsb29wUmVjdXJzaXZlKHRoaXMucGFyZW50LnN0YXJ0LCB0aGlzLnBhcmVudC5yYW5nZUNvdW50LCB0aGlzLm9ic2VydmVyKVxuXHQgICAgICApO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gUmFuZ2VTaW5rO1xuXHQgIH0oKSk7XG5cdFxuXHQgIC8qKlxuXHQgICogIEdlbmVyYXRlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9mIGludGVncmFsIG51bWJlcnMgd2l0aGluIGEgc3BlY2lmaWVkIHJhbmdlLCB1c2luZyB0aGUgc3BlY2lmaWVkIHNjaGVkdWxlciB0byBzZW5kIG91dCBvYnNlcnZlciBtZXNzYWdlcy5cblx0ICAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydCBUaGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludGVnZXIgaW4gdGhlIHNlcXVlbmNlLlxuXHQgICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2Ygc2VxdWVudGlhbCBpbnRlZ2VycyB0byBnZW5lcmF0ZS5cblx0ICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gcnVuIHRoZSBnZW5lcmF0b3IgbG9vcCBvbi4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gU2NoZWR1bGVyLmN1cnJlbnRUaHJlYWQuXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIGEgcmFuZ2Ugb2Ygc2VxdWVudGlhbCBpbnRlZ3JhbCBudW1iZXJzLlxuXHQgICovXG5cdCAgT2JzZXJ2YWJsZS5yYW5nZSA9IGZ1bmN0aW9uIChzdGFydCwgY291bnQsIHNjaGVkdWxlcikge1xuXHQgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG5cdCAgICByZXR1cm4gbmV3IFJhbmdlT2JzZXJ2YWJsZShzdGFydCwgY291bnQsIHNjaGVkdWxlcik7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFJlcGVhdE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhSZXBlYXRPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gUmVwZWF0T2JzZXJ2YWJsZSh2YWx1ZSwgcmVwZWF0Q291bnQsIHNjaGVkdWxlcikge1xuXHQgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgIHRoaXMucmVwZWF0Q291bnQgPSByZXBlYXRDb3VudCA9PSBudWxsID8gLTEgOiByZXBlYXRDb3VudDtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFJlcGVhdE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcblx0ICAgICAgdmFyIHNpbmsgPSBuZXcgUmVwZWF0U2luayhvYnNlcnZlciwgdGhpcyk7XG5cdCAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gUmVwZWF0T2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIGZ1bmN0aW9uIFJlcGVhdFNpbmsob2JzZXJ2ZXIsIHBhcmVudCkge1xuXHQgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuXHQgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgfVxuXHRcblx0ICBSZXBlYXRTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmVyLCB2YWx1ZSA9IHRoaXMucGFyZW50LnZhbHVlO1xuXHQgICAgZnVuY3Rpb24gbG9vcFJlY3Vyc2l2ZShpLCByZWN1cnNlKSB7XG5cdCAgICAgIGlmIChpID09PSAtMSB8fCBpID4gMCkge1xuXHQgICAgICAgIG9ic2VydmVyLm9uTmV4dCh2YWx1ZSk7XG5cdCAgICAgICAgaSA+IDAgJiYgaS0tO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChpID09PSAwKSB7IHJldHVybiBvYnNlcnZlci5vbkNvbXBsZXRlZCgpOyB9XG5cdCAgICAgIHJlY3Vyc2UoaSk7XG5cdCAgICB9XG5cdFxuXHQgICAgcmV0dXJuIHRoaXMucGFyZW50LnNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSh0aGlzLnBhcmVudC5yZXBlYXRDb3VudCwgbG9vcFJlY3Vyc2l2ZSk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogIEdlbmVyYXRlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgcmVwZWF0cyB0aGUgZ2l2ZW4gZWxlbWVudCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcywgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2hlZHVsZXIgdG8gc2VuZCBvdXQgb2JzZXJ2ZXIgbWVzc2FnZXMuXG5cdCAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgRWxlbWVudCB0byByZXBlYXQuXG5cdCAgICogQHBhcmFtIHtOdW1iZXJ9IHJlcGVhdENvdW50IFtPcHRpb25hXSBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBlbGVtZW50LiBJZiBub3Qgc3BlY2lmaWVkLCByZXBlYXRzIGluZGVmaW5pdGVseS5cblx0ICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIFNjaGVkdWxlciB0byBydW4gdGhlIHByb2R1Y2VyIGxvb3Agb24uIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIFNjaGVkdWxlci5pbW1lZGlhdGUuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCByZXBlYXRzIHRoZSBnaXZlbiBlbGVtZW50IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRpbWVzLlxuXHQgICAqL1xuXHQgIE9ic2VydmFibGUucmVwZWF0ID0gZnVuY3Rpb24gKHZhbHVlLCByZXBlYXRDb3VudCwgc2NoZWR1bGVyKSB7XG5cdCAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyKTtcblx0ICAgIHJldHVybiBuZXcgUmVwZWF0T2JzZXJ2YWJsZSh2YWx1ZSwgcmVwZWF0Q291bnQsIHNjaGVkdWxlcik7XG5cdCAgfTtcblx0XG5cdCAgdmFyIEp1c3RPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoSnVzdE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBKdXN0T2JzZXJ2YWJsZSh2YWx1ZSwgc2NoZWR1bGVyKSB7XG5cdCAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIEp1c3RPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG5cdCAgICAgIHZhciBzaW5rID0gbmV3IEp1c3RTaW5rKG9ic2VydmVyLCB0aGlzLnZhbHVlLCB0aGlzLnNjaGVkdWxlcik7XG5cdCAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBKdXN0U2luayhvYnNlcnZlciwgdmFsdWUsIHNjaGVkdWxlcikge1xuXHQgICAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG5cdCAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gc2NoZWR1bGVJdGVtKHMsIHN0YXRlKSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IHN0YXRlWzBdLCBvYnNlcnZlciA9IHN0YXRlWzFdO1xuXHQgICAgICBvYnNlcnZlci5vbk5leHQodmFsdWUpO1xuXHQgICAgICBvYnNlcnZlci5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuXHQgICAgfVxuXHRcblx0ICAgIEp1c3RTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBzdGF0ZSA9IFt0aGlzLnZhbHVlLCB0aGlzLm9ic2VydmVyXTtcblx0ICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyID09PSBpbW1lZGlhdGVTY2hlZHVsZXIgP1xuXHQgICAgICAgIHNjaGVkdWxlSXRlbShudWxsLCBzdGF0ZSkgOlxuXHQgICAgICAgIHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKHN0YXRlLCBzY2hlZHVsZUl0ZW0pO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gSnVzdE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICAvKipcblx0ICAgKiAgUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgZWxlbWVudCwgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2hlZHVsZXIgdG8gc2VuZCBvdXQgb2JzZXJ2ZXIgbWVzc2FnZXMuXG5cdCAgICogIFRoZXJlIGlzIGFuIGFsaWFzIGNhbGxlZCAnanVzdCcgb3IgYnJvd3NlcnMgPElFOS5cblx0ICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBTaW5nbGUgZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciBTY2hlZHVsZXIgdG8gc2VuZCB0aGUgc2luZ2xlIGVsZW1lbnQgb24uIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIFNjaGVkdWxlci5pbW1lZGlhdGUuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgc2luZ2xlIHNwZWNpZmllZCBlbGVtZW50LlxuXHQgICAqL1xuXHQgIHZhciBvYnNlcnZhYmxlUmV0dXJuID0gT2JzZXJ2YWJsZVsncmV0dXJuJ10gPSBPYnNlcnZhYmxlLmp1c3QgPSBmdW5jdGlvbiAodmFsdWUsIHNjaGVkdWxlcikge1xuXHQgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyKTtcblx0ICAgIHJldHVybiBuZXcgSnVzdE9ic2VydmFibGUodmFsdWUsIHNjaGVkdWxlcik7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFRocm93T2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFRocm93T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFRocm93T2JzZXJ2YWJsZShlcnJvciwgc2NoZWR1bGVyKSB7XG5cdCAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcblx0ICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFRocm93T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBzaW5rID0gbmV3IFRocm93U2luayhvLCB0aGlzKTtcblx0ICAgICAgcmV0dXJuIHNpbmsucnVuKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGZ1bmN0aW9uIFRocm93U2luayhvLCBwKSB7XG5cdCAgICAgIHRoaXMubyA9IG87XG5cdCAgICAgIHRoaXMucCA9IHA7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gc2NoZWR1bGVJdGVtKHMsIHN0YXRlKSB7XG5cdCAgICAgIHZhciBlID0gc3RhdGVbMF0sIG8gPSBzdGF0ZVsxXTtcblx0ICAgICAgby5vbkVycm9yKGUpO1xuXHQgICAgfVxuXHRcblx0ICAgIFRocm93U2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5wLnNjaGVkdWxlci5zY2hlZHVsZShbdGhpcy5wLmVycm9yLCB0aGlzLm9dLCBzY2hlZHVsZUl0ZW0pO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gVGhyb3dPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHRlcm1pbmF0ZXMgd2l0aCBhbiBleGNlcHRpb24sIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2NoZWR1bGVyIHRvIHNlbmQgb3V0IHRoZSBzaW5nbGUgb25FcnJvciBtZXNzYWdlLlxuXHQgICAqICBUaGVyZSBpcyBhbiBhbGlhcyB0byB0aGlzIG1ldGhvZCBjYWxsZWQgJ3Rocm93RXJyb3InIGZvciBicm93c2VycyA8SUU5LlxuXHQgICAqIEBwYXJhbSB7TWl4ZWR9IGVycm9yIEFuIG9iamVjdCB1c2VkIGZvciB0aGUgc2VxdWVuY2UncyB0ZXJtaW5hdGlvbi5cblx0ICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIFNjaGVkdWxlciB0byBzZW5kIHRoZSBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBjYWxsIG9uLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBTY2hlZHVsZXIuaW1tZWRpYXRlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHRlcm1pbmF0ZXMgZXhjZXB0aW9uYWxseSB3aXRoIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9iamVjdC5cblx0ICAgKi9cblx0ICB2YXIgb2JzZXJ2YWJsZVRocm93ID0gT2JzZXJ2YWJsZVsndGhyb3cnXSA9IGZ1bmN0aW9uIChlcnJvciwgc2NoZWR1bGVyKSB7XG5cdCAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBpbW1lZGlhdGVTY2hlZHVsZXIpO1xuXHQgICAgcmV0dXJuIG5ldyBUaHJvd09ic2VydmFibGUoZXJyb3IsIHNjaGVkdWxlcik7XG5cdCAgfTtcblx0XG5cdCAgdmFyIENhdGNoT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhDYXRjaE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBDYXRjaE9ic2VydmFibGUoc291cmNlLCBmbikge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5fZm4gPSBmbjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgQ2F0Y2hPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGQxID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksIHN1YnNjcmlwdGlvbiA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG5cdCAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKGQxKTtcblx0ICAgICAgZDEuc2V0RGlzcG9zYWJsZSh0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IENhdGNoT2JzZXJ2ZXIobywgc3Vic2NyaXB0aW9uLCB0aGlzLl9mbikpKTtcblx0ICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIENhdGNoT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBDYXRjaE9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQ2F0Y2hPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIENhdGNoT2JzZXJ2ZXIobywgcywgZm4pIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX3MgPSBzO1xuXHQgICAgICB0aGlzLl9mbiA9IGZuO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBDYXRjaE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHsgdGhpcy5fby5vbk5leHQoeCk7IH07XG5cdCAgICBDYXRjaE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9vLm9uQ29tcGxldGVkKCk7IH07XG5cdCAgICBDYXRjaE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHZhciByZXN1bHQgPSB0cnlDYXRjaCh0aGlzLl9mbikoZSk7XG5cdCAgICAgIGlmIChyZXN1bHQgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLl9vLm9uRXJyb3IocmVzdWx0LmUpOyB9XG5cdCAgICAgIGlzUHJvbWlzZShyZXN1bHQpICYmIChyZXN1bHQgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UocmVzdWx0KSk7XG5cdFxuXHQgICAgICB2YXIgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICB0aGlzLl9zLnNldERpc3Bvc2FibGUoZCk7XG5cdCAgICAgIGQuc2V0RGlzcG9zYWJsZShyZXN1bHQuc3Vic2NyaWJlKHRoaXMuX28pKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIENhdGNoT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIENvbnRpbnVlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgaXMgdGVybWluYXRlZCBieSBhbiBleGNlcHRpb24gd2l0aCB0aGUgbmV4dCBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqIEBwYXJhbSB7TWl4ZWR9IGhhbmRsZXJPclNlY29uZCBFeGNlcHRpb24gaGFuZGxlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBnaXZlbiB0aGUgZXJyb3IgdGhhdCBvY2N1cnJlZCBpbiB0aGUgZmlyc3Qgc2VxdWVuY2UsIG9yIGEgc2Vjb25kIG9ic2VydmFibGUgc2VxdWVuY2UgdXNlZCB0byBwcm9kdWNlIHJlc3VsdHMgd2hlbiBhbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlyc3Qgc2VxdWVuY2UuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgZmlyc3Qgc2VxdWVuY2UncyBlbGVtZW50cywgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzIG9mIHRoZSBoYW5kbGVyIHNlcXVlbmNlIGluIGNhc2UgYW4gZXhjZXB0aW9uIG9jY3VycmVkLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90b1snY2F0Y2gnXSA9IGZ1bmN0aW9uIChoYW5kbGVyT3JTZWNvbmQpIHtcblx0ICAgIHJldHVybiBpc0Z1bmN0aW9uKGhhbmRsZXJPclNlY29uZCkgPyBuZXcgQ2F0Y2hPYnNlcnZhYmxlKHRoaXMsIGhhbmRsZXJPclNlY29uZCkgOiBvYnNlcnZhYmxlQ2F0Y2goW3RoaXMsIGhhbmRsZXJPclNlY29uZF0pO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIENvbnRpbnVlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgaXMgdGVybWluYXRlZCBieSBhbiBleGNlcHRpb24gd2l0aCB0aGUgbmV4dCBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqIEBwYXJhbSB7QXJyYXkgfCBBcmd1bWVudHN9IGFyZ3MgQXJndW1lbnRzIG9yIGFuIGFycmF5IHRvIHVzZSBhcyB0aGUgbmV4dCBzZXF1ZW5jZSBpZiBhbiBlcnJvciBvY2N1cnMuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyBlbGVtZW50cyBmcm9tIGNvbnNlY3V0aXZlIHNvdXJjZSBzZXF1ZW5jZXMgdW50aWwgYSBzb3VyY2Ugc2VxdWVuY2UgdGVybWluYXRlcyBzdWNjZXNzZnVsbHkuXG5cdCAgICovXG5cdCAgdmFyIG9ic2VydmFibGVDYXRjaCA9IE9ic2VydmFibGVbJ2NhdGNoJ10gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgaXRlbXM7XG5cdCAgICBpZiAoQXJyYXkuaXNBcnJheShhcmd1bWVudHNbMF0pKSB7XG5cdCAgICAgIGl0ZW1zID0gYXJndW1lbnRzWzBdO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdCAgICAgIGl0ZW1zID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBpdGVtc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIGVudW1lcmFibGVPZihpdGVtcykuY2F0Y2hFcnJvcigpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gb25lIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgdXNpbmcgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHdoZW5ldmVyIGFueSBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgb3IgUHJvbWlzZXMgcHJvZHVjZXMgYW4gZWxlbWVudC5cblx0ICAgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhbiBhcmd1bWVudCBsaXN0IG9mIG9ic2VydmFibGVzIG9yIGFuIGFycmF5LlxuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiAxIC0gb2JzID0gb2JzZXJ2YWJsZS5jb21iaW5lTGF0ZXN0KG9iczEsIG9iczIsIG9iczMsIGZ1bmN0aW9uIChvMSwgbzIsIG8zKSB7IHJldHVybiBvMSArIG8yICsgbzM7IH0pO1xuXHQgICAqIDIgLSBvYnMgPSBvYnNlcnZhYmxlLmNvbWJpbmVMYXRlc3QoW29iczEsIG9iczIsIG9iczNdLCBmdW5jdGlvbiAobzEsIG8yLCBvMykgeyByZXR1cm4gbzEgKyBvMiArIG8zOyB9KTtcblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY29tYmluaW5nIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2VzIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVzdWx0IHNlbGVjdG9yIGZ1bmN0aW9uLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5jb21iaW5lTGF0ZXN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuXHQgICAgICBhcmdzWzBdLnVuc2hpZnQodGhpcyk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBhcmdzLnVuc2hpZnQodGhpcyk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gY29tYmluZUxhdGVzdC5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICB9O1xuXHRcblx0ICBmdW5jdGlvbiBmYWxzZUZhY3RvcnkoKSB7IHJldHVybiBmYWxzZTsgfVxuXHQgIGZ1bmN0aW9uIGFyZ3VtZW50c1RvQXJyYXkoKSB7XG5cdCAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuXHQgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIHJldHVybiBhcmdzO1xuXHQgIH1cblx0XG5cdCAgdmFyIENvbWJpbmVMYXRlc3RPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQ29tYmluZUxhdGVzdE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBDb21iaW5lTGF0ZXN0T2JzZXJ2YWJsZShwYXJhbXMsIGNiKSB7XG5cdCAgICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcblx0ICAgICAgdGhpcy5fY2IgPSBjYjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgQ29tYmluZUxhdGVzdE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvYnNlcnZlcikge1xuXHQgICAgICB2YXIgbGVuID0gdGhpcy5fcGFyYW1zLmxlbmd0aCxcblx0ICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXkobGVuKTtcblx0XG5cdCAgICAgIHZhciBzdGF0ZSA9IHtcblx0ICAgICAgICBoYXNWYWx1ZTogYXJyYXlJbml0aWFsaXplKGxlbiwgZmFsc2VGYWN0b3J5KSxcblx0ICAgICAgICBoYXNWYWx1ZUFsbDogZmFsc2UsXG5cdCAgICAgICAgaXNEb25lOiBhcnJheUluaXRpYWxpemUobGVuLCBmYWxzZUZhY3RvcnkpLFxuXHQgICAgICAgIHZhbHVlczogbmV3IEFycmF5KGxlbilcblx0ICAgICAgfTtcblx0XG5cdCAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICB2YXIgc291cmNlID0gdGhpcy5fcGFyYW1zW2ldLCBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgICBzdWJzY3JpcHRpb25zW2ldID0gc2FkO1xuXHQgICAgICAgIGlzUHJvbWlzZShzb3VyY2UpICYmIChzb3VyY2UgPSBvYnNlcnZhYmxlRnJvbVByb21pc2Uoc291cmNlKSk7XG5cdCAgICAgICAgc2FkLnNldERpc3Bvc2FibGUoc291cmNlLnN1YnNjcmliZShuZXcgQ29tYmluZUxhdGVzdE9ic2VydmVyKG9ic2VydmVyLCBpLCB0aGlzLl9jYiwgc3RhdGUpKSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHJldHVybiBuZXcgTkFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9ucyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBDb21iaW5lTGF0ZXN0T2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBDb21iaW5lTGF0ZXN0T2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQ29tYmluZUxhdGVzdE9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gQ29tYmluZUxhdGVzdE9ic2VydmVyKG8sIGksIGNiLCBzdGF0ZSkge1xuXHQgICAgICB0aGlzLl9vID0gbztcblx0ICAgICAgdGhpcy5faSA9IGk7XG5cdCAgICAgIHRoaXMuX2NiID0gY2I7XG5cdCAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIG5vdFRoZVNhbWUoaSkge1xuXHQgICAgICByZXR1cm4gZnVuY3Rpb24gKHgsIGopIHtcblx0ICAgICAgICByZXR1cm4gaiAhPT0gaTtcblx0ICAgICAgfTtcblx0ICAgIH1cblx0XG5cdCAgICBDb21iaW5lTGF0ZXN0T2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICB0aGlzLl9zdGF0ZS52YWx1ZXNbdGhpcy5faV0gPSB4O1xuXHQgICAgICB0aGlzLl9zdGF0ZS5oYXNWYWx1ZVt0aGlzLl9pXSA9IHRydWU7XG5cdCAgICAgIGlmICh0aGlzLl9zdGF0ZS5oYXNWYWx1ZUFsbCB8fCAodGhpcy5fc3RhdGUuaGFzVmFsdWVBbGwgPSB0aGlzLl9zdGF0ZS5oYXNWYWx1ZS5ldmVyeShpZGVudGl0eSkpKSB7XG5cdCAgICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMuX2NiKS5hcHBseShudWxsLCB0aGlzLl9zdGF0ZS52YWx1ZXMpO1xuXHQgICAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLl9vLm9uRXJyb3IocmVzLmUpOyB9XG5cdCAgICAgICAgdGhpcy5fby5vbk5leHQocmVzKTtcblx0ICAgICAgfSBlbHNlIGlmICh0aGlzLl9zdGF0ZS5pc0RvbmUuZmlsdGVyKG5vdFRoZVNhbWUodGhpcy5faSkpLmV2ZXJ5KGlkZW50aXR5KSkge1xuXHQgICAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0XG5cdCAgICBDb21iaW5lTGF0ZXN0T2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBDb21iaW5lTGF0ZXN0T2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fc3RhdGUuaXNEb25lW3RoaXMuX2ldID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fc3RhdGUuaXNEb25lLmV2ZXJ5KGlkZW50aXR5KSAmJiB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBDb21iaW5lTGF0ZXN0T2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICogTWVyZ2VzIHRoZSBzcGVjaWZpZWQgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBvbmUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSB1c2luZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gd2hlbmV2ZXIgYW55IG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlcyBvciBQcm9taXNlcyBwcm9kdWNlcyBhbiBlbGVtZW50LlxuXHQgICpcblx0ICAqIEBleGFtcGxlXG5cdCAgKiAxIC0gb2JzID0gUnguT2JzZXJ2YWJsZS5jb21iaW5lTGF0ZXN0KG9iczEsIG9iczIsIG9iczMsIGZ1bmN0aW9uIChvMSwgbzIsIG8zKSB7IHJldHVybiBvMSArIG8yICsgbzM7IH0pO1xuXHQgICogMiAtIG9icyA9IFJ4Lk9ic2VydmFibGUuY29tYmluZUxhdGVzdChbb2JzMSwgb2JzMiwgb2JzM10sIGZ1bmN0aW9uIChvMSwgbzIsIG8zKSB7IHJldHVybiBvMSArIG8yICsgbzM7IH0pO1xuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGNvbWJpbmluZyBlbGVtZW50cyBvZiB0aGUgc291cmNlcyB1c2luZyB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZWxlY3RvciBmdW5jdGlvbi5cblx0ICAqL1xuXHQgIHZhciBjb21iaW5lTGF0ZXN0ID0gT2JzZXJ2YWJsZS5jb21iaW5lTGF0ZXN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBpc0Z1bmN0aW9uKGFyZ3NbbGVuIC0gMV0pID8gYXJncy5wb3AoKSA6IGFyZ3VtZW50c1RvQXJyYXk7XG5cdCAgICBBcnJheS5pc0FycmF5KGFyZ3NbMF0pICYmIChhcmdzID0gYXJnc1swXSk7XG5cdCAgICByZXR1cm4gbmV3IENvbWJpbmVMYXRlc3RPYnNlcnZhYmxlKGFyZ3MsIHJlc3VsdFNlbGVjdG9yKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBDb25jYXRlbmF0ZXMgYWxsIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlcy4gIFRoaXMgdGFrZXMgaW4gZWl0aGVyIGFuIGFycmF5IG9yIHZhcmlhYmxlIGFyZ3VtZW50cyB0byBjb25jYXRlbmF0ZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBlYWNoIGdpdmVuIHNlcXVlbmNlLCBpbiBzZXF1ZW50aWFsIG9yZGVyLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5jb25jYXQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBmb3IodmFyIGFyZ3MgPSBbXSwgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeyBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsgfVxuXHQgICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuXHQgICAgcmV0dXJuIG9ic2VydmFibGVDb25jYXQuYXBwbHkobnVsbCwgYXJncyk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIENvbmNhdE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhDb25jYXRPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gQ29uY2F0T2JzZXJ2YWJsZShzb3VyY2VzKSB7XG5cdCAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIENvbmNhdE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG5cdCAgICAgIHZhciBzaW5rID0gbmV3IENvbmNhdFNpbmsodGhpcy5zb3VyY2VzLCBvKTtcblx0ICAgICAgcmV0dXJuIHNpbmsucnVuKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGZ1bmN0aW9uIENvbmNhdFNpbmsoc291cmNlcywgbykge1xuXHQgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xuXHQgICAgICB0aGlzLm8gPSBvO1xuXHQgICAgfVxuXHQgICAgQ29uY2F0U2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB2YXIgaXNEaXNwb3NlZCwgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKSwgc291cmNlcyA9IHRoaXMuc291cmNlcywgbGVuZ3RoID0gc291cmNlcy5sZW5ndGgsIG8gPSB0aGlzLm87XG5cdCAgICAgIHZhciBjYW5jZWxhYmxlID0gaW1tZWRpYXRlU2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKDAsIGZ1bmN0aW9uIChpLCBzZWxmKSB7XG5cdCAgICAgICAgaWYgKGlzRGlzcG9zZWQpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgaWYgKGkgPT09IGxlbmd0aCkge1xuXHQgICAgICAgICAgcmV0dXJuIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIC8vIENoZWNrIGlmIHByb21pc2Vcblx0ICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc291cmNlc1tpXTtcblx0ICAgICAgICBpc1Byb21pc2UoY3VycmVudFZhbHVlKSAmJiAoY3VycmVudFZhbHVlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKGN1cnJlbnRWYWx1ZSkpO1xuXHRcblx0ICAgICAgICB2YXIgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKGQpO1xuXHQgICAgICAgIGQuc2V0RGlzcG9zYWJsZShjdXJyZW50VmFsdWUuc3Vic2NyaWJlKFxuXHQgICAgICAgICAgZnVuY3Rpb24gKHgpIHsgby5vbk5leHQoeCk7IH0sXG5cdCAgICAgICAgICBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sXG5cdCAgICAgICAgICBmdW5jdGlvbiAoKSB7IHNlbGYoaSArIDEpOyB9XG5cdCAgICAgICAgKSk7XG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbiwgY2FuY2VsYWJsZSwgZGlzcG9zYWJsZUNyZWF0ZShmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgIH0pKTtcblx0ICAgIH07XG5cdFxuXHRcblx0ICAgIHJldHVybiBDb25jYXRPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogQ29uY2F0ZW5hdGVzIGFsbCB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuXG5cdCAgICogQHBhcmFtIHtBcnJheSB8IEFyZ3VtZW50c30gYXJncyBBcmd1bWVudHMgb3IgYW4gYXJyYXkgdG8gY29uY2F0IHRvIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGVhY2ggZ2l2ZW4gc2VxdWVuY2UsIGluIHNlcXVlbnRpYWwgb3JkZXIuXG5cdCAgICovXG5cdCAgdmFyIG9ic2VydmFibGVDb25jYXQgPSBPYnNlcnZhYmxlLmNvbmNhdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBhcmdzO1xuXHQgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuXHQgICAgICBhcmdzID0gYXJndW1lbnRzWzBdO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcblx0ICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBuZXcgQ29uY2F0T2JzZXJ2YWJsZShhcmdzKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBDb25jYXRlbmF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBvYnNlcnZhYmxlIHNlcXVlbmNlcy5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBlYWNoIG9ic2VydmVkIGlubmVyIHNlcXVlbmNlLCBpbiBzZXF1ZW50aWFsIG9yZGVyLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5jb25jYXRBbGwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXJnZSgxKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgTWVyZ2VPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE1lcmdlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0XG5cdCAgICBmdW5jdGlvbiBNZXJnZU9ic2VydmFibGUoc291cmNlLCBtYXhDb25jdXJyZW50KSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLm1heENvbmN1cnJlbnQgPSBtYXhDb25jdXJyZW50O1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBNZXJnZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvYnNlcnZlcikge1xuXHQgICAgICB2YXIgZyA9IG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKCk7XG5cdCAgICAgIGcuYWRkKHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgTWVyZ2VPYnNlcnZlcihvYnNlcnZlciwgdGhpcy5tYXhDb25jdXJyZW50LCBnKSkpO1xuXHQgICAgICByZXR1cm4gZztcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIE1lcmdlT2JzZXJ2YWJsZTtcblx0XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgTWVyZ2VPYnNlcnZlciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBNZXJnZU9ic2VydmVyKG8sIG1heCwgZykge1xuXHQgICAgICB0aGlzLm8gPSBvO1xuXHQgICAgICB0aGlzLm1heCA9IG1heDtcblx0ICAgICAgdGhpcy5nID0gZztcblx0ICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG5cdCAgICAgIHRoaXMucSA9IFtdO1xuXHQgICAgICB0aGlzLmFjdGl2ZUNvdW50ID0gMDtcblx0ICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIE1lcmdlT2JzZXJ2ZXIucHJvdG90eXBlLmhhbmRsZVN1YnNjcmliZSA9IGZ1bmN0aW9uICh4cykge1xuXHQgICAgICB2YXIgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgIHRoaXMuZy5hZGQoc2FkKTtcblx0ICAgICAgaXNQcm9taXNlKHhzKSAmJiAoeHMgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoeHMpKTtcblx0ICAgICAgc2FkLnNldERpc3Bvc2FibGUoeHMuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKHRoaXMsIHNhZCkpKTtcblx0ICAgIH07XG5cdCAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBmdW5jdGlvbiAoaW5uZXJTb3VyY2UpIHtcblx0ICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIGlmKHRoaXMuYWN0aXZlQ291bnQgPCB0aGlzLm1heCkge1xuXHQgICAgICAgICAgdGhpcy5hY3RpdmVDb3VudCsrO1xuXHQgICAgICAgICAgdGhpcy5oYW5kbGVTdWJzY3JpYmUoaW5uZXJTb3VyY2UpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLnEucHVzaChpbm5lclNvdXJjZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLm8ub25FcnJvcihlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIE1lcmdlT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLmFjdGl2ZUNvdW50ID09PSAwICYmIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgTWVyZ2VPYnNlcnZlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH07XG5cdCAgICAgIE1lcmdlT2JzZXJ2ZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuXHQgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH07XG5cdFxuXHQgICAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKHBhcmVudCwgc2FkKSB7XG5cdCAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICAgICAgdGhpcy5zYWQgPSBzYWQ7XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBmdW5jdGlvbiAoeCkgeyBpZighdGhpcy5pc1N0b3BwZWQpIHsgdGhpcy5wYXJlbnQuby5vbk5leHQoeCk7IH0gfTtcblx0ICAgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgICAgdGhpcy5wYXJlbnQuby5vbkVycm9yKGUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cdCAgICAgICAgICBwYXJlbnQuZy5yZW1vdmUodGhpcy5zYWQpO1xuXHQgICAgICAgICAgaWYgKHBhcmVudC5xLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgcGFyZW50LmhhbmRsZVN1YnNjcmliZShwYXJlbnQucS5zaGlmdCgpKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHBhcmVudC5hY3RpdmVDb3VudC0tO1xuXHQgICAgICAgICAgICBwYXJlbnQuZG9uZSAmJiBwYXJlbnQuYWN0aXZlQ291bnQgPT09IDAgJiYgcGFyZW50Lm8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOyB9O1xuXHQgICAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLnBhcmVudC5vLm9uRXJyb3IoZSk7XG5cdCAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfTtcblx0XG5cdCAgICAgIHJldHVybiBNZXJnZU9ic2VydmVyO1xuXHQgIH0oKSk7XG5cdFxuXHRcblx0XG5cdFxuXHRcblx0ICAvKipcblx0ICAqIE1lcmdlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9mIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgbGltaXRpbmcgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHN1YnNjcmlwdGlvbnMgdG8gaW5uZXIgc2VxdWVuY2VzLlxuXHQgICogT3IgbWVyZ2VzIHR3byBvYnNlcnZhYmxlIHNlcXVlbmNlcyBpbnRvIGEgc2luZ2xlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgKlxuXHQgICogQGV4YW1wbGVcblx0ICAqIDEgLSBtZXJnZWQgPSBzb3VyY2VzLm1lcmdlKDEpO1xuXHQgICogMiAtIG1lcmdlZCA9IHNvdXJjZS5tZXJnZShvdGhlclNvdXJjZSk7XG5cdCAgKiBAcGFyYW0ge01peGVkfSBbbWF4Q29uY3VycmVudE9yT3RoZXJdIE1heGltdW0gbnVtYmVyIG9mIGlubmVyIG9ic2VydmFibGUgc2VxdWVuY2VzIGJlaW5nIHN1YnNjcmliZWQgdG8gY29uY3VycmVudGx5IG9yIHRoZSBzZWNvbmQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IG1lcmdlcyB0aGUgZWxlbWVudHMgb2YgdGhlIGlubmVyIHNlcXVlbmNlcy5cblx0ICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5tZXJnZSA9IGZ1bmN0aW9uIChtYXhDb25jdXJyZW50T3JPdGhlcikge1xuXHQgICAgcmV0dXJuIHR5cGVvZiBtYXhDb25jdXJyZW50T3JPdGhlciAhPT0gJ251bWJlcicgP1xuXHQgICAgICBvYnNlcnZhYmxlTWVyZ2UodGhpcywgbWF4Q29uY3VycmVudE9yT3RoZXIpIDpcblx0ICAgICAgbmV3IE1lcmdlT2JzZXJ2YWJsZSh0aGlzLCBtYXhDb25jdXJyZW50T3JPdGhlcik7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogTWVyZ2VzIGFsbCB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBhIHNpbmdsZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqIFRoZSBzY2hlZHVsZXIgaXMgb3B0aW9uYWwgYW5kIGlmIG5vdCBzcGVjaWZpZWQsIHRoZSBpbW1lZGlhdGUgc2NoZWR1bGVyIGlzIHVzZWQuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgbWVyZ2VzIHRoZSBlbGVtZW50cyBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuXG5cdCAgICovXG5cdCAgdmFyIG9ic2VydmFibGVNZXJnZSA9IE9ic2VydmFibGUubWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgc2NoZWR1bGVyLCBzb3VyY2VzID0gW10sIGksIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdCAgICBpZiAoIWFyZ3VtZW50c1swXSkge1xuXHQgICAgICBzY2hlZHVsZXIgPSBpbW1lZGlhdGVTY2hlZHVsZXI7XG5cdCAgICAgIGZvcihpID0gMTsgaSA8IGxlbjsgaSsrKSB7IHNvdXJjZXMucHVzaChhcmd1bWVudHNbaV0pOyB9XG5cdCAgICB9IGVsc2UgaWYgKGlzU2NoZWR1bGVyKGFyZ3VtZW50c1swXSkpIHtcblx0ICAgICAgc2NoZWR1bGVyID0gYXJndW1lbnRzWzBdO1xuXHQgICAgICBmb3IoaSA9IDE7IGkgPCBsZW47IGkrKykgeyBzb3VyY2VzLnB1c2goYXJndW1lbnRzW2ldKTsgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyO1xuXHQgICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeyBzb3VyY2VzLnB1c2goYXJndW1lbnRzW2ldKTsgfVxuXHQgICAgfVxuXHQgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlc1swXSkpIHtcblx0ICAgICAgc291cmNlcyA9IHNvdXJjZXNbMF07XG5cdCAgICB9XG5cdCAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHNjaGVkdWxlciwgc291cmNlcykubWVyZ2VBbGwoKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgQ29tcG9zaXRlRXJyb3IgPSBSeC5Db21wb3NpdGVFcnJvciA9IGZ1bmN0aW9uKGVycm9ycykge1xuXHQgICAgdGhpcy5pbm5lckVycm9ycyA9IGVycm9ycztcblx0ICAgIHRoaXMubWVzc2FnZSA9ICdUaGlzIGNvbnRhaW5zIG11bHRpcGxlIGVycm9ycy4gQ2hlY2sgdGhlIGlubmVyRXJyb3JzJztcblx0ICAgIEVycm9yLmNhbGwodGhpcyk7XG5cdCAgfTtcblx0ICBDb21wb3NpdGVFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5cdCAgQ29tcG9zaXRlRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnQ29tcG9zaXRlRXJyb3InO1xuXHRcblx0ICB2YXIgTWVyZ2VEZWxheUVycm9yT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE1lcmdlRGVsYXlFcnJvck9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlKHNvdXJjZSkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgTWVyZ2VEZWxheUVycm9yT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBncm91cCA9IG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKCksXG5cdCAgICAgICAgbSA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpLFxuXHQgICAgICAgIHN0YXRlID0geyBpc1N0b3BwZWQ6IGZhbHNlLCBlcnJvcnM6IFtdLCBvOiBvIH07XG5cdFxuXHQgICAgICBncm91cC5hZGQobSk7XG5cdCAgICAgIG0uc2V0RGlzcG9zYWJsZSh0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IE1lcmdlRGVsYXlFcnJvck9ic2VydmVyKGdyb3VwLCBzdGF0ZSkpKTtcblx0XG5cdCAgICAgIHJldHVybiBncm91cDtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIE1lcmdlRGVsYXlFcnJvck9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgTWVyZ2VEZWxheUVycm9yT2JzZXJ2ZXIgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhNZXJnZURlbGF5RXJyb3JPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIE1lcmdlRGVsYXlFcnJvck9ic2VydmVyKGdyb3VwLCBzdGF0ZSkge1xuXHQgICAgICB0aGlzLl9ncm91cCA9IGdyb3VwO1xuXHQgICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBzZXRDb21wbGV0aW9uKG8sIGVycm9ycykge1xuXHQgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgfSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgICAgby5vbkVycm9yKGVycm9yc1swXSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgby5vbkVycm9yKG5ldyBDb21wb3NpdGVFcnJvcihlcnJvcnMpKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIE1lcmdlRGVsYXlFcnJvck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgdmFyIGlubmVyID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgIHRoaXMuX2dyb3VwLmFkZChpbm5lcik7XG5cdFxuXHQgICAgICAvLyBDaGVjayBmb3IgcHJvbWlzZXMgc3VwcG9ydFxuXHQgICAgICBpc1Byb21pc2UoeCkgJiYgKHggPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoeCkpO1xuXHQgICAgICBpbm5lci5zZXREaXNwb3NhYmxlKHguc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKGlubmVyLCB0aGlzLl9ncm91cCwgdGhpcy5fc3RhdGUpKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIE1lcmdlRGVsYXlFcnJvck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuX3N0YXRlLmVycm9ycy5wdXNoKGUpO1xuXHQgICAgICB0aGlzLl9zdGF0ZS5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICB0aGlzLl9ncm91cC5sZW5ndGggPT09IDEgJiYgc2V0Q29tcGxldGlvbih0aGlzLl9zdGF0ZS5vLCB0aGlzLl9zdGF0ZS5lcnJvcnMpO1xuXHQgICAgfTtcblx0XG5cdCAgICBNZXJnZURlbGF5RXJyb3JPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLl9zdGF0ZS5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICB0aGlzLl9ncm91cC5sZW5ndGggPT09IDEgJiYgc2V0Q29tcGxldGlvbih0aGlzLl9zdGF0ZS5vLCB0aGlzLl9zdGF0ZS5lcnJvcnMpO1xuXHQgICAgfTtcblx0XG5cdCAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihpbm5lciwgZ3JvdXAsIHN0YXRlKSB7XG5cdCAgICAgIHRoaXMuX2lubmVyID0gaW5uZXI7XG5cdCAgICAgIHRoaXMuX2dyb3VwID0gZ3JvdXA7XG5cdCAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkgeyB0aGlzLl9zdGF0ZS5vLm9uTmV4dCh4KTsgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdGhpcy5fc3RhdGUuZXJyb3JzLnB1c2goZSk7XG5cdCAgICAgIHRoaXMuX2dyb3VwLnJlbW92ZSh0aGlzLl9pbm5lcik7XG5cdCAgICAgIHRoaXMuX3N0YXRlLmlzU3RvcHBlZCAmJiB0aGlzLl9ncm91cC5sZW5ndGggPT09IDEgJiYgc2V0Q29tcGxldGlvbih0aGlzLl9zdGF0ZS5vLCB0aGlzLl9zdGF0ZS5lcnJvcnMpO1xuXHQgICAgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fZ3JvdXAucmVtb3ZlKHRoaXMuX2lubmVyKTtcblx0ICAgICAgdGhpcy5fc3RhdGUuaXNTdG9wcGVkICYmIHRoaXMuX2dyb3VwLmxlbmd0aCA9PT0gMSAmJiBzZXRDb21wbGV0aW9uKHRoaXMuX3N0YXRlLm8sIHRoaXMuX3N0YXRlLmVycm9ycyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBNZXJnZURlbGF5RXJyb3JPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgKiBGbGF0dGVucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgT2JzZXJ2YWJsZXMgaW50byBvbmUgT2JzZXJ2YWJsZSwgaW4gYSB3YXkgdGhhdCBhbGxvd3MgYW4gT2JzZXJ2ZXIgdG9cblx0ICAqIHJlY2VpdmUgYWxsIHN1Y2Nlc3NmdWxseSBlbWl0dGVkIGl0ZW1zIGZyb20gYWxsIG9mIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZXMgd2l0aG91dCBiZWluZyBpbnRlcnJ1cHRlZCBieVxuXHQgICogYW4gZXJyb3Igbm90aWZpY2F0aW9uIGZyb20gb25lIG9mIHRoZW0uXG5cdCAgKlxuXHQgICogVGhpcyBiZWhhdmVzIGxpa2UgT2JzZXJ2YWJsZS5wcm90b3R5cGUubWVyZ2VBbGwgZXhjZXB0IHRoYXQgaWYgYW55IG9mIHRoZSBtZXJnZWQgT2JzZXJ2YWJsZXMgbm90aWZ5IG9mIGFuXG5cdCAgKiBlcnJvciB2aWEgdGhlIE9ic2VydmVyJ3Mgb25FcnJvciwgbWVyZ2VEZWxheUVycm9yIHdpbGwgcmVmcmFpbiBmcm9tIHByb3BhZ2F0aW5nIHRoYXRcblx0ICAqIGVycm9yIG5vdGlmaWNhdGlvbiB1bnRpbCBhbGwgb2YgdGhlIG1lcmdlZCBPYnNlcnZhYmxlcyBoYXZlIGZpbmlzaGVkIGVtaXR0aW5nIGl0ZW1zLlxuXHQgICogQHBhcmFtIHtBcnJheSB8IEFyZ3VtZW50c30gYXJncyBBcmd1bWVudHMgb3IgYW4gYXJyYXkgdG8gbWVyZ2UuXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFsbCBvZiB0aGUgaXRlbXMgZW1pdHRlZCBieSB0aGUgT2JzZXJ2YWJsZXMgZW1pdHRlZCBieSB0aGUgT2JzZXJ2YWJsZVxuXHQgICovXG5cdCAgT2JzZXJ2YWJsZS5tZXJnZURlbGF5RXJyb3IgPSBmdW5jdGlvbigpIHtcblx0ICAgIHZhciBhcmdzO1xuXHQgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuXHQgICAgICBhcmdzID0gYXJndW1lbnRzWzBdO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdCAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIH1cblx0ICAgIHZhciBzb3VyY2UgPSBvYnNlcnZhYmxlT2YobnVsbCwgYXJncyk7XG5cdCAgICByZXR1cm4gbmV3IE1lcmdlRGVsYXlFcnJvck9ic2VydmFibGUoc291cmNlKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgTWVyZ2VBbGxPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE1lcmdlQWxsT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0XG5cdCAgICBmdW5jdGlvbiBNZXJnZUFsbE9ic2VydmFibGUoc291cmNlKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBNZXJnZUFsbE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcblx0ICAgICAgdmFyIGcgPSBuZXcgQ29tcG9zaXRlRGlzcG9zYWJsZSgpLCBtID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgIGcuYWRkKG0pO1xuXHQgICAgICBtLnNldERpc3Bvc2FibGUodGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBNZXJnZUFsbE9ic2VydmVyKG9ic2VydmVyLCBnKSkpO1xuXHQgICAgICByZXR1cm4gZztcblx0ICAgIH07XG5cdFxuXHQgICAgZnVuY3Rpb24gTWVyZ2VBbGxPYnNlcnZlcihvLCBnKSB7XG5cdCAgICAgIHRoaXMubyA9IG87XG5cdCAgICAgIHRoaXMuZyA9IGc7XG5cdCAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuXHQgICAgfVxuXHQgICAgTWVyZ2VBbGxPYnNlcnZlci5wcm90b3R5cGUub25OZXh0ID0gZnVuY3Rpb24oaW5uZXJTb3VyY2UpIHtcblx0ICAgICAgaWYodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG5cdCAgICAgIHZhciBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgdGhpcy5nLmFkZChzYWQpO1xuXHRcblx0ICAgICAgaXNQcm9taXNlKGlubmVyU291cmNlKSAmJiAoaW5uZXJTb3VyY2UgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoaW5uZXJTb3VyY2UpKTtcblx0XG5cdCAgICAgIHNhZC5zZXREaXNwb3NhYmxlKGlubmVyU291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcih0aGlzLCBzYWQpKSk7XG5cdCAgICB9O1xuXHQgICAgTWVyZ2VBbGxPYnNlcnZlci5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIGlmKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLm8ub25FcnJvcihlKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICAgIE1lcmdlQWxsT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmcubGVuZ3RoID09PSAxICYmIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgICAgTWVyZ2VBbGxPYnNlcnZlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH07XG5cdCAgICBNZXJnZUFsbE9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLm8ub25FcnJvcihlKTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKHBhcmVudCwgc2FkKSB7XG5cdCAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXHQgICAgICB0aGlzLnNhZCA9IHNhZDtcblx0ICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uICh4KSB7IGlmICghdGhpcy5pc1N0b3BwZWQpIHsgdGhpcy5wYXJlbnQuby5vbk5leHQoeCk7IH0gfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5wYXJlbnQuby5vbkVycm9yKGUpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGlmKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgcGFyZW50LmcucmVtb3ZlKHRoaXMuc2FkKTtcblx0ICAgICAgICBwYXJlbnQuZG9uZSAmJiBwYXJlbnQuZy5sZW5ndGggPT09IDEgJiYgcGFyZW50Lm8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOyB9O1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZmFpbCA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5wYXJlbnQuby5vbkVycm9yKGUpO1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBNZXJnZUFsbE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICAvKipcblx0ICAqIE1lcmdlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9mIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IG1lcmdlcyB0aGUgZWxlbWVudHMgb2YgdGhlIGlubmVyIHNlcXVlbmNlcy5cblx0ICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5tZXJnZUFsbCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBuZXcgTWVyZ2VBbGxPYnNlcnZhYmxlKHRoaXMpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBTa2lwVW50aWxPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoU2tpcFVudGlsT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0XG5cdCAgICBmdW5jdGlvbiBTa2lwVW50aWxPYnNlcnZhYmxlKHNvdXJjZSwgb3RoZXIpIHtcblx0ICAgICAgdGhpcy5fcyA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5fbyA9IGlzUHJvbWlzZShvdGhlcikgPyBvYnNlcnZhYmxlRnJvbVByb21pc2Uob3RoZXIpIDogb3RoZXI7XG5cdCAgICAgIHRoaXMuX29wZW4gPSBmYWxzZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgU2tpcFVudGlsT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uKG8pIHtcblx0ICAgICAgdmFyIGxlZnRTdWJzY3JpcHRpb24gPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgbGVmdFN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKHRoaXMuX3Muc3Vic2NyaWJlKG5ldyBTa2lwVW50aWxTb3VyY2VPYnNlcnZlcihvLCB0aGlzKSkpO1xuXHRcblx0ICAgICAgaXNQcm9taXNlKHRoaXMuX28pICYmICh0aGlzLl9vID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHRoaXMuX28pKTtcblx0XG5cdCAgICAgIHZhciByaWdodFN1YnNjcmlwdGlvbiA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICByaWdodFN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKHRoaXMuX28uc3Vic2NyaWJlKG5ldyBTa2lwVW50aWxPdGhlck9ic2VydmVyKG8sIHRoaXMsIHJpZ2h0U3Vic2NyaXB0aW9uKSkpO1xuXHRcblx0ICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKGxlZnRTdWJzY3JpcHRpb24sIHJpZ2h0U3Vic2NyaXB0aW9uKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFNraXBVbnRpbE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhTa2lwVW50aWxTb3VyY2VPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFNraXBVbnRpbFNvdXJjZU9ic2VydmVyKG8sIHApIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX3AgPSBwO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBTa2lwVW50aWxTb3VyY2VPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHRoaXMuX3AuX29wZW4gJiYgdGhpcy5fby5vbk5leHQoeCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFNraXBVbnRpbFNvdXJjZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcblx0ICAgICAgdGhpcy5fby5vbkVycm9yKGVycik7XG5cdCAgICB9O1xuXHRcblx0ICAgIFNraXBVbnRpbFNvdXJjZU9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fcC5fb3BlbiAmJiB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTa2lwVW50aWxTb3VyY2VPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgdmFyIFNraXBVbnRpbE90aGVyT2JzZXJ2ZXIgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhTa2lwVW50aWxPdGhlck9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gU2tpcFVudGlsT3RoZXJPYnNlcnZlcihvLCBwLCByKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9wID0gcDtcblx0ICAgICAgdGhpcy5fciA9IHI7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFNraXBVbnRpbE90aGVyT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX3AuX29wZW4gPSB0cnVlO1xuXHQgICAgICB0aGlzLl9yLmRpc3Bvc2UoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgU2tpcFVudGlsT3RoZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgIHRoaXMuX28ub25FcnJvcihlcnIpO1xuXHQgICAgfTtcblx0XG5cdCAgICBTa2lwVW50aWxPdGhlck9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fci5kaXNwb3NlKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTa2lwVW50aWxPdGhlck9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICAvKipcblx0ICAgKiBSZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2Ugb25seSBhZnRlciB0aGUgb3RoZXIgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBwcm9kdWNlcyBhIHZhbHVlLlxuXHQgICAqIEBwYXJhbSB7T2JzZXJ2YWJsZSB8IFByb21pc2V9IG90aGVyIFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIG9yIFByb21pc2UgdGhhdCB0cmlnZ2VycyBwcm9wYWdhdGlvbiBvZiBlbGVtZW50cyBvZiB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugc3RhcnRpbmcgZnJvbSB0aGUgcG9pbnQgdGhlIG90aGVyIHNlcXVlbmNlIHRyaWdnZXJlZCBwcm9wYWdhdGlvbi5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uc2tpcFVudGlsID0gZnVuY3Rpb24gKG90aGVyKSB7XG5cdCAgICByZXR1cm4gbmV3IFNraXBVbnRpbE9ic2VydmFibGUodGhpcywgb3RoZXIpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBTd2l0Y2hPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoU3dpdGNoT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFN3aXRjaE9ic2VydmFibGUoc291cmNlKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBTd2l0Y2hPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGlubmVyID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKSwgcyA9IHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgU3dpdGNoT2JzZXJ2ZXIobywgaW5uZXIpKTtcblx0ICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKHMsIGlubmVyKTtcblx0ICAgIH07XG5cdFxuXHQgICAgaW5oZXJpdHMoU3dpdGNoT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuXHQgICAgZnVuY3Rpb24gU3dpdGNoT2JzZXJ2ZXIobywgaW5uZXIpIHtcblx0ICAgICAgdGhpcy5vID0gbztcblx0ICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuXHQgICAgICB0aGlzLnN0b3BwZWQgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5sYXRlc3QgPSAwO1xuXHQgICAgICB0aGlzLmhhc0xhdGVzdCA9IGZhbHNlO1xuXHQgICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgU3dpdGNoT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoaW5uZXJTb3VyY2UpIHtcblx0ICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKSwgaWQgPSArK3RoaXMubGF0ZXN0O1xuXHQgICAgICB0aGlzLmhhc0xhdGVzdCA9IHRydWU7XG5cdCAgICAgIHRoaXMuaW5uZXIuc2V0RGlzcG9zYWJsZShkKTtcblx0ICAgICAgaXNQcm9taXNlKGlubmVyU291cmNlKSAmJiAoaW5uZXJTb3VyY2UgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoaW5uZXJTb3VyY2UpKTtcblx0ICAgICAgZC5zZXREaXNwb3NhYmxlKGlubmVyU291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcih0aGlzLCBpZCkpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgU3dpdGNoT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFN3aXRjaE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICF0aGlzLmhhc0xhdGVzdCAmJiB0aGlzLm8ub25Db21wbGV0ZWQoKTtcblx0ICAgIH07XG5cdFxuXHQgICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG5cdCAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKHBhcmVudCwgaWQpIHtcblx0ICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICAgIHRoaXMuaWQgPSBpZDtcblx0ICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHRoaXMucGFyZW50LmxhdGVzdCA9PT0gdGhpcy5pZCAmJiB0aGlzLnBhcmVudC5vLm9uTmV4dCh4KTtcblx0ICAgIH07XG5cdFxuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICB0aGlzLnBhcmVudC5sYXRlc3QgPT09IHRoaXMuaWQgJiYgdGhpcy5wYXJlbnQuby5vbkVycm9yKGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGlmICh0aGlzLnBhcmVudC5sYXRlc3QgPT09IHRoaXMuaWQpIHtcblx0ICAgICAgICB0aGlzLnBhcmVudC5oYXNMYXRlc3QgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLnBhcmVudC5pc1N0b3BwZWQgJiYgdGhpcy5wYXJlbnQuby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTd2l0Y2hPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgKiBUcmFuc2Zvcm1zIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugb2Ygb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2luZyB2YWx1ZXMgb25seSBmcm9tIHRoZSBtb3N0IHJlY2VudCBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgYXQgYW55IHBvaW50IGluIHRpbWUgcHJvZHVjZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBtb3N0IHJlY2VudCBpbm5lciBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgaGFzIGJlZW4gcmVjZWl2ZWQuXG5cdCAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG9bJ3N3aXRjaCddID0gb2JzZXJ2YWJsZVByb3RvLnN3aXRjaExhdGVzdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBuZXcgU3dpdGNoT2JzZXJ2YWJsZSh0aGlzKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgVGFrZVVudGlsT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFRha2VVbnRpbE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gVGFrZVVudGlsT2JzZXJ2YWJsZShzb3VyY2UsIG90aGVyKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLm90aGVyID0gaXNQcm9taXNlKG90aGVyKSA/IG9ic2VydmFibGVGcm9tUHJvbWlzZShvdGhlcikgOiBvdGhlcjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgVGFrZVVudGlsT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uKG8pIHtcblx0ICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKFxuXHQgICAgICAgIHRoaXMuc291cmNlLnN1YnNjcmliZShvKSxcblx0ICAgICAgICB0aGlzLm90aGVyLnN1YnNjcmliZShuZXcgVGFrZVVudGlsT2JzZXJ2ZXIobykpXG5cdCAgICAgICk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBUYWtlVW50aWxPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIFRha2VVbnRpbE9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoVGFrZVVudGlsT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBUYWtlVW50aWxPYnNlcnZlcihvKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBUYWtlVW50aWxPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICBUYWtlVW50aWxPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgIHRoaXMuX28ub25FcnJvcihlcnIpO1xuXHQgICAgfTtcblx0XG5cdCAgICBUYWtlVW50aWxPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBub29wO1xuXHRcblx0ICAgIHJldHVybiBUYWtlVW50aWxPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyB0aGUgdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHVudGlsIHRoZSBvdGhlciBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2VzIGEgdmFsdWUuXG5cdCAgICogQHBhcmFtIHtPYnNlcnZhYmxlIHwgUHJvbWlzZX0gb3RoZXIgT2JzZXJ2YWJsZSBzZXF1ZW5jZSBvciBQcm9taXNlIHRoYXQgdGVybWluYXRlcyBwcm9wYWdhdGlvbiBvZiBlbGVtZW50cyBvZiB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UgdXAgdG8gdGhlIHBvaW50IHRoZSBvdGhlciBzZXF1ZW5jZSBpbnRlcnJ1cHRlZCBmdXJ0aGVyIHByb3BhZ2F0aW9uLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by50YWtlVW50aWwgPSBmdW5jdGlvbiAob3RoZXIpIHtcblx0ICAgIHJldHVybiBuZXcgVGFrZVVudGlsT2JzZXJ2YWJsZSh0aGlzLCBvdGhlcik7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24gZmFsc2VGYWN0b3J5KCkgeyByZXR1cm4gZmFsc2U7IH1cblx0ICBmdW5jdGlvbiBhcmd1bWVudHNUb0FycmF5KCkge1xuXHQgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdCAgICByZXR1cm4gYXJncztcblx0ICB9XG5cdFxuXHQgIHZhciBXaXRoTGF0ZXN0RnJvbU9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhXaXRoTGF0ZXN0RnJvbU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBXaXRoTGF0ZXN0RnJvbU9ic2VydmFibGUoc291cmNlLCBzb3VyY2VzLCByZXN1bHRTZWxlY3Rvcikge1xuXHQgICAgICB0aGlzLl9zID0gc291cmNlO1xuXHQgICAgICB0aGlzLl9zcyA9IHNvdXJjZXM7XG5cdCAgICAgIHRoaXMuX2NiID0gcmVzdWx0U2VsZWN0b3I7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFdpdGhMYXRlc3RGcm9tT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBsZW4gPSB0aGlzLl9zcy5sZW5ndGg7XG5cdCAgICAgIHZhciBzdGF0ZSA9IHtcblx0ICAgICAgICBoYXNWYWx1ZTogYXJyYXlJbml0aWFsaXplKGxlbiwgZmFsc2VGYWN0b3J5KSxcblx0ICAgICAgICBoYXNWYWx1ZUFsbDogZmFsc2UsXG5cdCAgICAgICAgdmFsdWVzOiBuZXcgQXJyYXkobGVuKVxuXHQgICAgICB9O1xuXHRcblx0ICAgICAgdmFyIG4gPSB0aGlzLl9zcy5sZW5ndGgsIHN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXkobiArIDEpO1xuXHQgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuXHQgICAgICAgIHZhciBvdGhlciA9IHRoaXMuX3NzW2ldLCBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgICBpc1Byb21pc2Uob3RoZXIpICYmIChvdGhlciA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShvdGhlcikpO1xuXHQgICAgICAgIHNhZC5zZXREaXNwb3NhYmxlKG90aGVyLnN1YnNjcmliZShuZXcgV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyKG8sIGksIHN0YXRlKSkpO1xuXHQgICAgICAgIHN1YnNjcmlwdGlvbnNbaV0gPSBzYWQ7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHZhciBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgc2FkLnNldERpc3Bvc2FibGUodGhpcy5fcy5zdWJzY3JpYmUobmV3IFdpdGhMYXRlc3RGcm9tU291cmNlT2JzZXJ2ZXIobywgdGhpcy5fY2IsIHN0YXRlKSkpO1xuXHQgICAgICBzdWJzY3JpcHRpb25zW25dID0gc2FkO1xuXHRcblx0ICAgICAgcmV0dXJuIG5ldyBOQXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb25zKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFdpdGhMYXRlc3RGcm9tT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBXaXRoTGF0ZXN0RnJvbU90aGVyT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyKG8sIGksIHN0YXRlKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9pID0gaTtcblx0ICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgdGhpcy5fc3RhdGUudmFsdWVzW3RoaXMuX2ldID0geDtcblx0ICAgICAgdGhpcy5fc3RhdGUuaGFzVmFsdWVbdGhpcy5faV0gPSB0cnVlO1xuXHQgICAgICB0aGlzLl9zdGF0ZS5oYXNWYWx1ZUFsbCA9IHRoaXMuX3N0YXRlLmhhc1ZhbHVlLmV2ZXJ5KGlkZW50aXR5KTtcblx0ICAgIH07XG5cdFxuXHQgICAgV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBub29wO1xuXHRcblx0ICAgIHJldHVybiBXaXRoTGF0ZXN0RnJvbU90aGVyT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIHZhciBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFdpdGhMYXRlc3RGcm9tU291cmNlT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyKG8sIGNiLCBzdGF0ZSkge1xuXHQgICAgICB0aGlzLl9vID0gbztcblx0ICAgICAgdGhpcy5fY2IgPSBjYjtcblx0ICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHZhciBhbGxWYWx1ZXMgPSBbeF0uY29uY2F0KHRoaXMuX3N0YXRlLnZhbHVlcyk7XG5cdCAgICAgIGlmICghdGhpcy5fc3RhdGUuaGFzVmFsdWVBbGwpIHsgcmV0dXJuOyB9XG5cdCAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh0aGlzLl9jYikuYXBwbHkobnVsbCwgYWxsVmFsdWVzKTtcblx0ICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuX28ub25FcnJvcihyZXMuZSk7IH1cblx0ICAgICAgdGhpcy5fby5vbk5leHQocmVzKTtcblx0ICAgIH07XG5cdFxuXHQgICAgV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICB0aGlzLl9vLm9uRXJyb3IoZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFdpdGhMYXRlc3RGcm9tU291cmNlT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogTWVyZ2VzIHRoZSBzcGVjaWZpZWQgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBvbmUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSB1c2luZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gb25seSB3aGVuIHRoZSAoZmlyc3QpIHNvdXJjZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2VzIGFuIGVsZW1lbnQuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGNvbWJpbmluZyBlbGVtZW50cyBvZiB0aGUgc291cmNlcyB1c2luZyB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZWxlY3RvciBmdW5jdGlvbi5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ud2l0aExhdGVzdEZyb20gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnRzJyk7IH1cblx0XG5cdCAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuXHQgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIHZhciByZXN1bHRTZWxlY3RvciA9IGlzRnVuY3Rpb24oYXJnc1tsZW4gLSAxXSkgPyBhcmdzLnBvcCgpIDogYXJndW1lbnRzVG9BcnJheTtcblx0ICAgIEFycmF5LmlzQXJyYXkoYXJnc1swXSkgJiYgKGFyZ3MgPSBhcmdzWzBdKTtcblx0XG5cdCAgICByZXR1cm4gbmV3IFdpdGhMYXRlc3RGcm9tT2JzZXJ2YWJsZSh0aGlzLCBhcmdzLCByZXN1bHRTZWxlY3Rvcik7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24gZmFsc2VGYWN0b3J5KCkgeyByZXR1cm4gZmFsc2U7IH1cblx0ICBmdW5jdGlvbiBlbXB0eUFycmF5RmFjdG9yeSgpIHsgcmV0dXJuIFtdOyB9XG5cdFxuXHQgIHZhciBaaXBPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoWmlwT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFppcE9ic2VydmFibGUoc291cmNlcywgcmVzdWx0U2VsZWN0b3IpIHtcblx0ICAgICAgdGhpcy5fcyA9IHNvdXJjZXM7XG5cdCAgICAgIHRoaXMuX2NiID0gcmVzdWx0U2VsZWN0b3I7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFppcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvYnNlcnZlcikge1xuXHQgICAgICB2YXIgbiA9IHRoaXMuX3MubGVuZ3RoLFxuXHQgICAgICAgICAgc3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheShuKTtcblx0ICAgICAgICAgIGRvbmUgPSBhcnJheUluaXRpYWxpemUobiwgZmFsc2VGYWN0b3J5KSxcblx0ICAgICAgICAgIHEgPSBhcnJheUluaXRpYWxpemUobiwgZW1wdHlBcnJheUZhY3RvcnkpO1xuXHRcblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcblx0ICAgICAgICB2YXIgc291cmNlID0gdGhpcy5fc1tpXSwgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgICAgc3Vic2NyaXB0aW9uc1tpXSA9IHNhZDtcblx0ICAgICAgICBpc1Byb21pc2Uoc291cmNlKSAmJiAoc291cmNlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHNvdXJjZSkpO1xuXHQgICAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUobmV3IFppcE9ic2VydmVyKG9ic2VydmVyLCBpLCB0aGlzLCBxLCBkb25lKSkpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbnMpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gWmlwT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBaaXBPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhaaXBPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFppcE9ic2VydmVyKG8sIGksIHAsIHEsIGQpIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX2kgPSBpO1xuXHQgICAgICB0aGlzLl9wID0gcDtcblx0ICAgICAgdGhpcy5fcSA9IHE7XG5cdCAgICAgIHRoaXMuX2QgPSBkO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBub3RFbXB0eSh4KSB7IHJldHVybiB4Lmxlbmd0aCA+IDA7IH1cblx0ICAgIGZ1bmN0aW9uIHNoaWZ0RWFjaCh4KSB7IHJldHVybiB4LnNoaWZ0KCk7IH1cblx0ICAgIGZ1bmN0aW9uIG5vdFRoZVNhbWUoaSkge1xuXHQgICAgICByZXR1cm4gZnVuY3Rpb24gKHgsIGopIHtcblx0ICAgICAgICByZXR1cm4gaiAhPT0gaTtcblx0ICAgICAgfTtcblx0ICAgIH1cblx0XG5cdCAgICBaaXBPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHRoaXMuX3FbdGhpcy5faV0ucHVzaCh4KTtcblx0ICAgICAgaWYgKHRoaXMuX3EuZXZlcnkobm90RW1wdHkpKSB7XG5cdCAgICAgICAgdmFyIHF1ZXVlZFZhbHVlcyA9IHRoaXMuX3EubWFwKHNoaWZ0RWFjaCk7XG5cdCAgICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMuX3AuX2NiKS5hcHBseShudWxsLCBxdWV1ZWRWYWx1ZXMpO1xuXHQgICAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLl9vLm9uRXJyb3IocmVzLmUpOyB9XG5cdCAgICAgICAgdGhpcy5fby5vbk5leHQocmVzKTtcblx0ICAgICAgfSBlbHNlIGlmICh0aGlzLl9kLmZpbHRlcihub3RUaGVTYW1lKHRoaXMuX2kpKS5ldmVyeShpZGVudGl0eSkpIHtcblx0ICAgICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdFxuXHQgICAgWmlwT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBaaXBPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLl9kW3RoaXMuX2ldID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fZC5ldmVyeShpZGVudGl0eSkgJiYgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gWmlwT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gb25lIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgdXNpbmcgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHdoZW5ldmVyIGFsbCBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgb3IgYW4gYXJyYXkgaGF2ZSBwcm9kdWNlZCBhbiBlbGVtZW50IGF0IGEgY29ycmVzcG9uZGluZyBpbmRleC5cblx0ICAgKiBUaGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcmd1bWVudHMgbXVzdCBiZSBhIGZ1bmN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBzZXJpZXMgb2YgZWxlbWVudHMgYXQgY29ycmVzcG9uZGluZyBpbmRleGVzIGluIHRoZSBhcmdzLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIGFyZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnppcCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7IHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudHMnKTsgfVxuXHRcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgICAgdmFyIHJlc3VsdFNlbGVjdG9yID0gaXNGdW5jdGlvbihhcmdzW2xlbiAtIDFdKSA/IGFyZ3MucG9wKCkgOiBhcmd1bWVudHNUb0FycmF5O1xuXHQgICAgQXJyYXkuaXNBcnJheShhcmdzWzBdKSAmJiAoYXJncyA9IGFyZ3NbMF0pO1xuXHRcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzO1xuXHQgICAgYXJncy51bnNoaWZ0KHBhcmVudCk7XG5cdFxuXHQgICAgcmV0dXJuIG5ldyBaaXBPYnNlcnZhYmxlKGFyZ3MsIHJlc3VsdFNlbGVjdG9yKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBNZXJnZXMgdGhlIHNwZWNpZmllZCBvYnNlcnZhYmxlIHNlcXVlbmNlcyBpbnRvIG9uZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGJ5IHVzaW5nIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aGVuZXZlciBhbGwgb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzIGhhdmUgcHJvZHVjZWQgYW4gZWxlbWVudCBhdCBhIGNvcnJlc3BvbmRpbmcgaW5kZXguXG5cdCAgICogQHBhcmFtIGFyZ3VtZW50cyBPYnNlcnZhYmxlIHNvdXJjZXMuXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzdWx0U2VsZWN0b3IgRnVuY3Rpb24gdG8gaW52b2tlIGZvciBlYWNoIHNlcmllcyBvZiBlbGVtZW50cyBhdCBjb3JyZXNwb25kaW5nIGluZGV4ZXMgaW4gdGhlIHNvdXJjZXMuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGNvbWJpbmluZyBlbGVtZW50cyBvZiB0aGUgc291cmNlcyB1c2luZyB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZWxlY3RvciBmdW5jdGlvbi5cblx0ICAgKi9cblx0ICBPYnNlcnZhYmxlLnppcCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcblx0ICAgICAgYXJncyA9IGlzRnVuY3Rpb24oYXJnc1sxXSkgPyBhcmdzWzBdLmNvbmNhdChhcmdzWzFdKSA6IGFyZ3NbMF07XG5cdCAgICB9XG5cdCAgICB2YXIgZmlyc3QgPSBhcmdzLnNoaWZ0KCk7XG5cdCAgICByZXR1cm4gZmlyc3QuemlwLmFwcGx5KGZpcnN0LCBhcmdzKTtcblx0ICB9O1xuXHRcblx0ZnVuY3Rpb24gZmFsc2VGYWN0b3J5KCkgeyByZXR1cm4gZmFsc2U7IH1cblx0ZnVuY3Rpb24gZW1wdHlBcnJheUZhY3RvcnkoKSB7IHJldHVybiBbXTsgfVxuXHRmdW5jdGlvbiBhcmd1bWVudHNUb0FycmF5KCkge1xuXHQgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICByZXR1cm4gYXJncztcblx0fVxuXHRcblx0LyoqXG5cdCAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gb25lIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgdXNpbmcgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHdoZW5ldmVyIGFsbCBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgb3IgYW4gYXJyYXkgaGF2ZSBwcm9kdWNlZCBhbiBlbGVtZW50IGF0IGEgY29ycmVzcG9uZGluZyBpbmRleC5cblx0ICogVGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJndW1lbnRzIG11c3QgYmUgYSBmdW5jdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggc2VyaWVzIG9mIGVsZW1lbnRzIGF0IGNvcnJlc3BvbmRpbmcgaW5kZXhlcyBpbiB0aGUgYXJncy5cblx0ICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGNvbWJpbmluZyBlbGVtZW50cyBvZiB0aGUgYXJncyB1c2luZyB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZWxlY3RvciBmdW5jdGlvbi5cblx0ICovXG5cdG9ic2VydmFibGVQcm90by56aXBJdGVyYWJsZSA9IGZ1bmN0aW9uICgpIHtcblx0ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnRzJyk7IH1cblx0XG5cdCAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcblx0ICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgIHZhciByZXN1bHRTZWxlY3RvciA9IGlzRnVuY3Rpb24oYXJnc1tsZW4gLSAxXSkgPyBhcmdzLnBvcCgpIDogYXJndW1lbnRzVG9BcnJheTtcblx0XG5cdCAgdmFyIHBhcmVudCA9IHRoaXM7XG5cdCAgYXJncy51bnNoaWZ0KHBhcmVudCk7XG5cdCAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG5cdCAgICB2YXIgbiA9IGFyZ3MubGVuZ3RoLFxuXHQgICAgICBxdWV1ZXMgPSBhcnJheUluaXRpYWxpemUobiwgZW1wdHlBcnJheUZhY3RvcnkpLFxuXHQgICAgICBpc0RvbmUgPSBhcnJheUluaXRpYWxpemUobiwgZmFsc2VGYWN0b3J5KTtcblx0XG5cdCAgICB2YXIgc3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheShuKTtcblx0ICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IG47IGlkeCsrKSB7XG5cdCAgICAgIChmdW5jdGlvbiAoaSkge1xuXHQgICAgICAgIHZhciBzb3VyY2UgPSBhcmdzW2ldLCBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0XG5cdCAgICAgICAgKGlzQXJyYXlMaWtlKHNvdXJjZSkgfHwgaXNJdGVyYWJsZShzb3VyY2UpKSAmJiAoc291cmNlID0gb2JzZXJ2YWJsZUZyb20oc291cmNlKSk7XG5cdFxuXHQgICAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgICAgIHF1ZXVlc1tpXS5wdXNoKHgpO1xuXHQgICAgICAgICAgaWYgKHF1ZXVlcy5ldmVyeShmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5sZW5ndGggPiAwOyB9KSkge1xuXHQgICAgICAgICAgICB2YXIgcXVldWVkVmFsdWVzID0gcXVldWVzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5zaGlmdCgpOyB9KSxcblx0ICAgICAgICAgICAgICAgIHJlcyA9IHRyeUNhdGNoKHJlc3VsdFNlbGVjdG9yKS5hcHBseShwYXJlbnQsIHF1ZXVlZFZhbHVlcyk7XG5cdCAgICAgICAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IocmVzLmUpOyB9XG5cdCAgICAgICAgICAgIG8ub25OZXh0KHJlcyk7XG5cdCAgICAgICAgICB9IGVsc2UgaWYgKGlzRG9uZS5maWx0ZXIoZnVuY3Rpb24gKHgsIGopIHsgcmV0dXJuIGogIT09IGk7IH0pLmV2ZXJ5KGlkZW50aXR5KSkge1xuXHQgICAgICAgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsgby5vbkVycm9yKGUpOyB9LCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICBpc0RvbmVbaV0gPSB0cnVlO1xuXHQgICAgICAgICAgaXNEb25lLmV2ZXJ5KGlkZW50aXR5KSAmJiBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfSkpO1xuXHQgICAgICAgIHN1YnNjcmlwdGlvbnNbaV0gPSBzYWQ7XG5cdCAgICAgIH0pKGlkeCk7XG5cdCAgICB9XG5cdFxuXHQgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbnMpO1xuXHQgIH0sIHBhcmVudCk7XG5cdH07XG5cdFxuXHQgIGZ1bmN0aW9uIGFzT2JzZXJ2YWJsZShzb3VyY2UpIHtcblx0ICAgIHJldHVybiBmdW5jdGlvbiBzdWJzY3JpYmUobykgeyByZXR1cm4gc291cmNlLnN1YnNjcmliZShvKTsgfTtcblx0ICB9XG5cdFxuXHQgIC8qKlxuXHQgICAqICBIaWRlcyB0aGUgaWRlbnRpdHkgb2YgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGhpZGVzIHRoZSBpZGVudGl0eSBvZiB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5hc09ic2VydmFibGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoYXNPYnNlcnZhYmxlKHRoaXMpLCB0aGlzKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgRGVtYXRlcmlhbGl6ZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRGVtYXRlcmlhbGl6ZU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBEZW1hdGVyaWFsaXplT2JzZXJ2YWJsZShzb3VyY2UpIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIERlbWF0ZXJpYWxpemVPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgRGVtYXRlcmlhbGl6ZU9ic2VydmVyKG8pKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIERlbWF0ZXJpYWxpemVPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIERlbWF0ZXJpYWxpemVPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhEZW1hdGVyaWFsaXplT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gRGVtYXRlcmlhbGl6ZU9ic2VydmVyKG8pIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIERlbWF0ZXJpYWxpemVPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7IHguYWNjZXB0KHRoaXMuX28pOyB9O1xuXHQgICAgRGVtYXRlcmlhbGl6ZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuX28ub25FcnJvcihlKTsgfTtcblx0ICAgIERlbWF0ZXJpYWxpemVPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9vLm9uQ29tcGxldGVkKCk7IH07XG5cdFxuXHQgICAgcmV0dXJuIERlbWF0ZXJpYWxpemVPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogRGVtYXRlcmlhbGl6ZXMgdGhlIGV4cGxpY2l0IG5vdGlmaWNhdGlvbiB2YWx1ZXMgb2YgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBhcyBpbXBsaWNpdCBub3RpZmljYXRpb25zLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGV4aGliaXRpbmcgdGhlIGJlaGF2aW9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNvdXJjZSBzZXF1ZW5jZSdzIG5vdGlmaWNhdGlvbiB2YWx1ZXMuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLmRlbWF0ZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gbmV3IERlbWF0ZXJpYWxpemVPYnNlcnZhYmxlKHRoaXMpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmFibGUoc291cmNlLCBrZXlGbiwgY29tcGFyZXIpIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMua2V5Rm4gPSBrZXlGbjtcblx0ICAgICAgdGhpcy5jb21wYXJlciA9IGNvbXBhcmVyO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyKG8sIHRoaXMua2V5Rm4sIHRoaXMuY29tcGFyZXIpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXIobywga2V5Rm4sIGNvbXBhcmVyKSB7XG5cdCAgICAgIHRoaXMubyA9IG87XG5cdCAgICAgIHRoaXMua2V5Rm4gPSBrZXlGbjtcblx0ICAgICAgdGhpcy5jb21wYXJlciA9IGNvbXBhcmVyO1xuXHQgICAgICB0aGlzLmhhc0N1cnJlbnRLZXkgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5jdXJyZW50S2V5ID0gbnVsbDtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHZhciBrZXkgPSB4LCBjb21wYXJlckVxdWFscztcblx0ICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5rZXlGbikpIHtcblx0ICAgICAgICBrZXkgPSB0cnlDYXRjaCh0aGlzLmtleUZuKSh4KTtcblx0ICAgICAgICBpZiAoa2V5ID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5vLm9uRXJyb3Ioa2V5LmUpOyB9XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuaGFzQ3VycmVudEtleSkge1xuXHQgICAgICAgIGNvbXBhcmVyRXF1YWxzID0gdHJ5Q2F0Y2godGhpcy5jb21wYXJlcikodGhpcy5jdXJyZW50S2V5LCBrZXkpO1xuXHQgICAgICAgIGlmIChjb21wYXJlckVxdWFscyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKGNvbXBhcmVyRXF1YWxzLmUpOyB9XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCF0aGlzLmhhc0N1cnJlbnRLZXkgfHwgIWNvbXBhcmVyRXF1YWxzKSB7XG5cdCAgICAgICAgdGhpcy5oYXNDdXJyZW50S2V5ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmN1cnJlbnRLZXkgPSBrZXk7XG5cdCAgICAgICAgdGhpcy5vLm9uTmV4dCh4KTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICAgIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZSkge1xuXHQgICAgICB0aGlzLm8ub25FcnJvcihlKTtcblx0ICAgIH07XG5cdCAgICBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgKiAgUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgb25seSBkaXN0aW5jdCBjb250aWd1b3VzIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUga2V5Rm4gYW5kIHRoZSBjb21wYXJlci5cblx0ICAqIEBwYXJhbSB7RnVuY3Rpb259IFtrZXlGbl0gQSBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSBjb21wYXJpc29uIGtleSBmb3IgZWFjaCBlbGVtZW50LiBJZiBub3QgcHJvdmlkZWQsIGl0IHByb2plY3RzIHRoZSB2YWx1ZS5cblx0ICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJlcl0gRXF1YWxpdHkgY29tcGFyZXIgZm9yIGNvbXB1dGVkIGtleSB2YWx1ZXMuIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gYW4gZXF1YWxpdHkgY29tcGFyZXIgZnVuY3Rpb24uXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvbmx5IGNvbnRhaW5pbmcgdGhlIGRpc3RpbmN0IGNvbnRpZ3VvdXMgZWxlbWVudHMsIGJhc2VkIG9uIGEgY29tcHV0ZWQga2V5IHZhbHVlLCBmcm9tIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG5cdCAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uZGlzdGluY3RVbnRpbENoYW5nZWQgPSBmdW5jdGlvbiAoa2V5Rm4sIGNvbXBhcmVyKSB7XG5cdCAgICBjb21wYXJlciB8fCAoY29tcGFyZXIgPSBkZWZhdWx0Q29tcGFyZXIpO1xuXHQgICAgcmV0dXJuIG5ldyBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmFibGUodGhpcywga2V5Rm4sIGNvbXBhcmVyKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgVGFwT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFRhcE9ic2VydmFibGUsX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFRhcE9ic2VydmFibGUoc291cmNlLCBvYnNlcnZlck9yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5fb04gPSBvYnNlcnZlck9yT25OZXh0O1xuXHQgICAgICB0aGlzLl9vRSA9IG9uRXJyb3I7XG5cdCAgICAgIHRoaXMuX29DID0gb25Db21wbGV0ZWQ7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFRhcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobywgdGhpcykpO1xuXHQgICAgfTtcblx0XG5cdCAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcblx0ICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIobywgcCkge1xuXHQgICAgICB0aGlzLm8gPSBvO1xuXHQgICAgICB0aGlzLnQgPSAhcC5fb04gfHwgaXNGdW5jdGlvbihwLl9vTikgP1xuXHQgICAgICAgIG9ic2VydmVyQ3JlYXRlKHAuX29OIHx8IG5vb3AsIHAuX29FIHx8IG5vb3AsIHAuX29DIHx8IG5vb3ApIDpcblx0ICAgICAgICBwLl9vTjtcblx0ICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHgpIHtcblx0ICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMudC5vbk5leHQpLmNhbGwodGhpcy50LCB4KTtcblx0ICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgdGhpcy5vLm9uRXJyb3IocmVzLmUpOyB9XG5cdCAgICAgIHRoaXMuby5vbk5leHQoeCk7XG5cdCAgICB9O1xuXHQgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlcnIpIHtcblx0ICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMudC5vbkVycm9yKS5jYWxsKHRoaXMudCwgZXJyKTtcblx0ICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKHJlcy5lKTsgfVxuXHQgICAgICB0aGlzLm8ub25FcnJvcihlcnIpO1xuXHQgICAgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2godGhpcy50Lm9uQ29tcGxldGVkKS5jYWxsKHRoaXMudCk7XG5cdCAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLm8ub25FcnJvcihyZXMuZSk7IH1cblx0ICAgICAgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBUYXBPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgKiAgSW52b2tlcyBhbiBhY3Rpb24gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBhbmQgaW52b2tlcyBhbiBhY3Rpb24gdXBvbiBncmFjZWZ1bCBvciBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nLCBsb2dnaW5nLCBldGMuIG9mIHF1ZXJ5IGJlaGF2aW9yIGJ5IGludGVyY2VwdGluZyB0aGUgbWVzc2FnZSBzdHJlYW0gdG8gcnVuIGFyYml0cmFyeSBhY3Rpb25zIGZvciBtZXNzYWdlcyBvbiB0aGUgcGlwZWxpbmUuXG5cdCAgKiBAcGFyYW0ge0Z1bmN0aW9uIHwgT2JzZXJ2ZXJ9IG9ic2VydmVyT3JPbk5leHQgQWN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIG9yIGFuIG8uXG5cdCAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gIEFjdGlvbiB0byBpbnZva2UgdXBvbiBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS4gVXNlZCBpZiBvbmx5IHRoZSBvYnNlcnZlck9yT25OZXh0IHBhcmFtZXRlciBpcyBhbHNvIGEgZnVuY3Rpb24uXG5cdCAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Db21wbGV0ZWRdICBBY3Rpb24gdG8gaW52b2tlIHVwb24gZ3JhY2VmdWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuIFVzZWQgaWYgb25seSB0aGUgb2JzZXJ2ZXJPck9uTmV4dCBwYXJhbWV0ZXIgaXMgYWxzbyBhIGZ1bmN0aW9uLlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aCB0aGUgc2lkZS1lZmZlY3RpbmcgYmVoYXZpb3IgYXBwbGllZC5cblx0ICAqL1xuXHQgIG9ic2VydmFibGVQcm90b1snZG8nXSA9IG9ic2VydmFibGVQcm90by50YXAgPSBvYnNlcnZhYmxlUHJvdG8uZG9BY3Rpb24gPSBmdW5jdGlvbiAob2JzZXJ2ZXJPck9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcblx0ICAgIHJldHVybiBuZXcgVGFwT2JzZXJ2YWJsZSh0aGlzLCBvYnNlcnZlck9yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgKiAgSW52b2tlcyBhbiBhY3Rpb24gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nLCBsb2dnaW5nLCBldGMuIG9mIHF1ZXJ5IGJlaGF2aW9yIGJ5IGludGVyY2VwdGluZyB0aGUgbWVzc2FnZSBzdHJlYW0gdG8gcnVuIGFyYml0cmFyeSBhY3Rpb25zIGZvciBtZXNzYWdlcyBvbiB0aGUgcGlwZWxpbmUuXG5cdCAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbk5leHQgQWN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICogQHBhcmFtIHtBbnl9IFt0aGlzQXJnXSBPYmplY3QgdG8gdXNlIGFzIHRoaXMgd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIHNvdXJjZSBzZXF1ZW5jZSB3aXRoIHRoZSBzaWRlLWVmZmVjdGluZyBiZWhhdmlvciBhcHBsaWVkLlxuXHQgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLmRvT25OZXh0ID0gb2JzZXJ2YWJsZVByb3RvLnRhcE9uTmV4dCA9IGZ1bmN0aW9uIChvbk5leHQsIHRoaXNBcmcpIHtcblx0ICAgIHJldHVybiB0aGlzLnRhcCh0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoeCkgeyBvbk5leHQuY2FsbCh0aGlzQXJnLCB4KTsgfSA6IG9uTmV4dCk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgKiAgSW52b2tlcyBhbiBhY3Rpb24gdXBvbiBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nLCBsb2dnaW5nLCBldGMuIG9mIHF1ZXJ5IGJlaGF2aW9yIGJ5IGludGVyY2VwdGluZyB0aGUgbWVzc2FnZSBzdHJlYW0gdG8gcnVuIGFyYml0cmFyeSBhY3Rpb25zIGZvciBtZXNzYWdlcyBvbiB0aGUgcGlwZWxpbmUuXG5cdCAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIEFjdGlvbiB0byBpbnZva2UgdXBvbiBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gT2JqZWN0IHRvIHVzZSBhcyB0aGlzIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aCB0aGUgc2lkZS1lZmZlY3RpbmcgYmVoYXZpb3IgYXBwbGllZC5cblx0ICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5kb09uRXJyb3IgPSBvYnNlcnZhYmxlUHJvdG8udGFwT25FcnJvciA9IGZ1bmN0aW9uIChvbkVycm9yLCB0aGlzQXJnKSB7XG5cdCAgICByZXR1cm4gdGhpcy50YXAobm9vcCwgdHlwZW9mIHRoaXNBcmcgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24gKGUpIHsgb25FcnJvci5jYWxsKHRoaXNBcmcsIGUpOyB9IDogb25FcnJvcik7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgKiAgSW52b2tlcyBhbiBhY3Rpb24gdXBvbiBncmFjZWZ1bCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAqICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nLCBsb2dnaW5nLCBldGMuIG9mIHF1ZXJ5IGJlaGF2aW9yIGJ5IGludGVyY2VwdGluZyB0aGUgbWVzc2FnZSBzdHJlYW0gdG8gcnVuIGFyYml0cmFyeSBhY3Rpb25zIGZvciBtZXNzYWdlcyBvbiB0aGUgcGlwZWxpbmUuXG5cdCAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNvbXBsZXRlZCBBY3Rpb24gdG8gaW52b2tlIHVwb24gZ3JhY2VmdWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHdpdGggdGhlIHNpZGUtZWZmZWN0aW5nIGJlaGF2aW9yIGFwcGxpZWQuXG5cdCAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uZG9PbkNvbXBsZXRlZCA9IG9ic2VydmFibGVQcm90by50YXBPbkNvbXBsZXRlZCA9IGZ1bmN0aW9uIChvbkNvbXBsZXRlZCwgdGhpc0FyZykge1xuXHQgICAgcmV0dXJuIHRoaXMudGFwKG5vb3AsIG51bGwsIHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uICgpIHsgb25Db21wbGV0ZWQuY2FsbCh0aGlzQXJnKTsgfSA6IG9uQ29tcGxldGVkKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiAgSW52b2tlcyBhIHNwZWNpZmllZCBhY3Rpb24gYWZ0ZXIgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRlcm1pbmF0ZXMgZ3JhY2VmdWxseSBvciBleGNlcHRpb25hbGx5LlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmFsbHlBY3Rpb24gQWN0aW9uIHRvIGludm9rZSBhZnRlciB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2UgdGVybWluYXRlcy5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gU291cmNlIHNlcXVlbmNlIHdpdGggdGhlIGFjdGlvbi1pbnZva2luZyB0ZXJtaW5hdGlvbiBiZWhhdmlvciBhcHBsaWVkLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90b1snZmluYWxseSddID0gZnVuY3Rpb24gKGFjdGlvbikge1xuXHQgICAgdmFyIHNvdXJjZSA9IHRoaXM7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG5cdCAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0cnlDYXRjaChzb3VyY2Uuc3Vic2NyaWJlKS5jYWxsKHNvdXJjZSwgb2JzZXJ2ZXIpO1xuXHQgICAgICBpZiAoc3Vic2NyaXB0aW9uID09PSBlcnJvck9iaikge1xuXHQgICAgICAgIGFjdGlvbigpO1xuXHQgICAgICAgIHJldHVybiB0aHJvd2VyKHN1YnNjcmlwdGlvbi5lKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZGlzcG9zYWJsZUNyZWF0ZShmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHIgPSB0cnlDYXRjaChzdWJzY3JpcHRpb24uZGlzcG9zZSkuY2FsbChzdWJzY3JpcHRpb24pO1xuXHQgICAgICAgIGFjdGlvbigpO1xuXHQgICAgICAgIHIgPT09IGVycm9yT2JqICYmIHRocm93ZXIoci5lKTtcblx0ICAgICAgfSk7XG5cdCAgICB9LCB0aGlzKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgSWdub3JlRWxlbWVudHNPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoSWdub3JlRWxlbWVudHNPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZShzb3VyY2UpIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobykpO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8pIHtcblx0ICAgICAgdGhpcy5vID0gbztcblx0ICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IG5vb3A7XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGVycikge1xuXHQgICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5vLm9uRXJyb3IoZXJyKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMub2JzZXJ2ZXIub25FcnJvcihlKTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gSWdub3JlRWxlbWVudHNPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIElnbm9yZXMgYWxsIGVsZW1lbnRzIGluIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgbGVhdmluZyBvbmx5IHRoZSB0ZXJtaW5hdGlvbiBtZXNzYWdlcy5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gZW1wdHkgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNpZ25hbHMgdGVybWluYXRpb24sIHN1Y2Nlc3NmdWwgb3IgZXhjZXB0aW9uYWwsIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLmlnbm9yZUVsZW1lbnRzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIG5ldyBJZ25vcmVFbGVtZW50c09ic2VydmFibGUodGhpcyk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIE1hdGVyaWFsaXplT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhNYXRlcmlhbGl6ZU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBNYXRlcmlhbGl6ZU9ic2VydmFibGUoc291cmNlLCBmbikge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgTWF0ZXJpYWxpemVPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgTWF0ZXJpYWxpemVPYnNlcnZlcihvKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBNYXRlcmlhbGl6ZU9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgTWF0ZXJpYWxpemVPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhNYXRlcmlhbGl6ZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIE1hdGVyaWFsaXplT2JzZXJ2ZXIobykge1xuXHQgICAgICB0aGlzLl9vID0gbztcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgTWF0ZXJpYWxpemVPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7IHRoaXMuX28ub25OZXh0KG5vdGlmaWNhdGlvbkNyZWF0ZU9uTmV4dCh4KSkgfTtcblx0ICAgIE1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHsgdGhpcy5fby5vbk5leHQobm90aWZpY2F0aW9uQ3JlYXRlT25FcnJvcihlKSk7IHRoaXMuX28ub25Db21wbGV0ZWQoKTsgfTtcblx0ICAgIE1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbk5leHQobm90aWZpY2F0aW9uQ3JlYXRlT25Db21wbGV0ZWQoKSk7IHRoaXMuX28ub25Db21wbGV0ZWQoKTsgfTtcblx0XG5cdCAgICByZXR1cm4gTWF0ZXJpYWxpemVPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIE1hdGVyaWFsaXplcyB0aGUgaW1wbGljaXQgbm90aWZpY2F0aW9ucyBvZiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGFzIGV4cGxpY2l0IG5vdGlmaWNhdGlvbiB2YWx1ZXMuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgbWF0ZXJpYWxpemVkIG5vdGlmaWNhdGlvbiB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5tYXRlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBuZXcgTWF0ZXJpYWxpemVPYnNlcnZhYmxlKHRoaXMpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZXBlYXRzIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGEgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcy4gSWYgdGhlIHJlcGVhdCBjb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc2VxdWVuY2UgcmVwZWF0cyBpbmRlZmluaXRlbHkuXG5cdCAgICogQHBhcmFtIHtOdW1iZXJ9IFtyZXBlYXRDb3VudF0gIE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHNlcXVlbmNlLiBJZiBub3QgcHJvdmlkZWQsIHJlcGVhdHMgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgcHJvZHVjaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UgcmVwZWF0ZWRseS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ucmVwZWF0ID0gZnVuY3Rpb24gKHJlcGVhdENvdW50KSB7XG5cdCAgICByZXR1cm4gZW51bWVyYWJsZVJlcGVhdCh0aGlzLCByZXBlYXRDb3VudCkuY29uY2F0KCk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJlcGVhdHMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRpbWVzIG9yIHVudGlsIGl0IHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVzLiBJZiB0aGUgcmV0cnkgY291bnQgaXMgbm90IHNwZWNpZmllZCwgaXQgcmV0cmllcyBpbmRlZmluaXRlbHkuXG5cdCAgICogIE5vdGUgaWYgeW91IGVuY291bnRlciBhbiBlcnJvciBhbmQgd2FudCBpdCB0byByZXRyeSBvbmNlLCB0aGVuIHlvdSBtdXN0IHVzZSAucmV0cnkoMik7XG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqICB2YXIgcmVzID0gcmV0cmllZCA9IHJldHJ5LnJlcGVhdCgpO1xuXHQgICAqICB2YXIgcmVzID0gcmV0cmllZCA9IHJldHJ5LnJlcGVhdCgyKTtcblx0ICAgKiBAcGFyYW0ge051bWJlcn0gW3JldHJ5Q291bnRdICBOdW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgdGhlIHNlcXVlbmNlLiBJZiBub3QgcHJvdmlkZWQsIHJldHJ5IHRoZSBzZXF1ZW5jZSBpbmRlZmluaXRlbHkuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgcHJvZHVjaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UgcmVwZWF0ZWRseSB1bnRpbCBpdCB0ZXJtaW5hdGVzIHN1Y2Nlc3NmdWxseS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ucmV0cnkgPSBmdW5jdGlvbiAocmV0cnlDb3VudCkge1xuXHQgICAgcmV0dXJuIGVudW1lcmFibGVSZXBlYXQodGhpcywgcmV0cnlDb3VudCkuY2F0Y2hFcnJvcigpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqICBSZXBlYXRzIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBzZXF1ZW5jZSB1cG9uIGVycm9yIGVhY2ggdGltZSB0aGUgbm90aWZpZXIgZW1pdHMgb3IgdW50aWwgaXQgc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZXMuIFxuXHQgICAqICBpZiB0aGUgbm90aWZpZXIgY29tcGxldGVzLCB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb21wbGV0ZXMuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqICB2YXIgdGltZXIgPSBPYnNlcnZhYmxlLnRpbWVyKDUwMCk7XG5cdCAgICogIHZhciBzb3VyY2UgPSBvYnNlcnZhYmxlLnJldHJ5V2hlbih0aW1lcik7XG5cdCAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBbbm90aWZpZXJdIEFuIG9ic2VydmFibGUgdGhhdCB0cmlnZ2VycyB0aGUgcmV0cmllcyBvciBjb21wbGV0ZXMgdGhlIG9ic2VydmFibGUgd2l0aCBvbk5leHQgb3Igb25Db21wbGV0ZWQgcmVzcGVjdGl2ZWx5LlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2luZyB0aGUgZWxlbWVudHMgb2YgdGhlIGdpdmVuIHNlcXVlbmNlIHJlcGVhdGVkbHkgdW50aWwgaXQgdGVybWluYXRlcyBzdWNjZXNzZnVsbHkuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnJldHJ5V2hlbiA9IGZ1bmN0aW9uIChub3RpZmllcikge1xuXHQgICAgcmV0dXJuIGVudW1lcmFibGVSZXBlYXQodGhpcykuY2F0Y2hFcnJvcldoZW4obm90aWZpZXIpO1xuXHQgIH07XG5cdCAgdmFyIFNjYW5PYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoU2Nhbk9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBTY2FuT2JzZXJ2YWJsZShzb3VyY2UsIGFjY3VtdWxhdG9yLCBoYXNTZWVkLCBzZWVkKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLmFjY3VtdWxhdG9yID0gYWNjdW11bGF0b3I7XG5cdCAgICAgIHRoaXMuaGFzU2VlZCA9IGhhc1NlZWQ7XG5cdCAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFNjYW5PYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24obykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBTY2FuT2JzZXJ2ZXIobyx0aGlzKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTY2FuT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBTY2FuT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoU2Nhbk9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gU2Nhbk9ic2VydmVyKG8sIHBhcmVudCkge1xuXHQgICAgICB0aGlzLl9vID0gbztcblx0ICAgICAgdGhpcy5fcCA9IHBhcmVudDtcblx0ICAgICAgdGhpcy5fZm4gPSBwYXJlbnQuYWNjdW11bGF0b3I7XG5cdCAgICAgIHRoaXMuX2hzID0gcGFyZW50Lmhhc1NlZWQ7XG5cdCAgICAgIHRoaXMuX3MgPSBwYXJlbnQuc2VlZDtcblx0ICAgICAgdGhpcy5faGEgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5fYSA9IG51bGw7XG5cdCAgICAgIHRoaXMuX2h2ID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuX2kgPSAwO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBTY2FuT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICAhdGhpcy5faHYgJiYgKHRoaXMuX2h2ID0gdHJ1ZSk7XG5cdCAgICAgIGlmICh0aGlzLl9oYSkge1xuXHQgICAgICAgIHRoaXMuX2EgPSB0cnlDYXRjaCh0aGlzLl9mbikodGhpcy5fYSwgeCwgdGhpcy5faSwgdGhpcy5fcCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5fYSA9IHRoaXMuX2hzID8gdHJ5Q2F0Y2godGhpcy5fZm4pKHRoaXMuX3MsIHgsIHRoaXMuX2ksIHRoaXMuX3ApIDogeDtcblx0ICAgICAgICB0aGlzLl9oYSA9IHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuX2EgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLl9vLm9uRXJyb3IodGhpcy5fYS5lKTsgfVxuXHQgICAgICB0aGlzLl9vLm9uTmV4dCh0aGlzLl9hKTtcblx0ICAgICAgdGhpcy5faSsrO1xuXHQgICAgfTtcblx0XG5cdCAgICBTY2FuT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBTY2FuT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgIXRoaXMuX2h2ICYmIHRoaXMuX2hzICYmIHRoaXMuX28ub25OZXh0KHRoaXMuX3MpO1xuXHQgICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTY2FuT2JzZXJ2ZXI7XG5cdCAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cdFxuXHQgIC8qKlxuXHQgICogIEFwcGxpZXMgYW4gYWNjdW11bGF0b3IgZnVuY3Rpb24gb3ZlciBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGFuZCByZXR1cm5zIGVhY2ggaW50ZXJtZWRpYXRlIHJlc3VsdC4gVGhlIG9wdGlvbmFsIHNlZWQgdmFsdWUgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZS5cblx0ICAqICBGb3IgYWdncmVnYXRpb24gYmVoYXZpb3Igd2l0aCBubyBpbnRlcm1lZGlhdGUgcmVzdWx0cywgc2VlIE9ic2VydmFibGUuYWdncmVnYXRlLlxuXHQgICogQHBhcmFtIHtNaXhlZH0gW3NlZWRdIFRoZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlLlxuXHQgICogQHBhcmFtIHtGdW5jdGlvbn0gYWNjdW11bGF0b3IgQW4gYWNjdW11bGF0b3IgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCBvbiBlYWNoIGVsZW1lbnQuXG5cdCAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMuXG5cdCAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uc2NhbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBoYXNTZWVkID0gZmFsc2UsIHNlZWQsIGFjY3VtdWxhdG9yID0gYXJndW1lbnRzWzBdO1xuXHQgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcblx0ICAgICAgaGFzU2VlZCA9IHRydWU7XG5cdCAgICAgIHNlZWQgPSBhcmd1bWVudHNbMV07XG5cdCAgICB9XG5cdCAgICByZXR1cm4gbmV3IFNjYW5PYnNlcnZhYmxlKHRoaXMsIGFjY3VtdWxhdG9yLCBoYXNTZWVkLCBzZWVkKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgU2tpcExhc3RPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFNraXBMYXN0T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFNraXBMYXN0T2JzZXJ2YWJsZShzb3VyY2UsIGMpIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuX2MgPSBjO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBTa2lwTGFzdE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBTa2lwTGFzdE9ic2VydmVyKG8sIHRoaXMuX2MpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFNraXBMYXN0T2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBTa2lwTGFzdE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFNraXBMYXN0T2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBTa2lwTGFzdE9ic2VydmVyKG8sIGMpIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX2MgPSBjO1xuXHQgICAgICB0aGlzLl9xID0gW107XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFNraXBMYXN0T2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICB0aGlzLl9xLnB1c2goeCk7XG5cdCAgICAgIHRoaXMuX3EubGVuZ3RoID4gdGhpcy5fYyAmJiB0aGlzLl9vLm9uTmV4dCh0aGlzLl9xLnNoaWZ0KCkpO1xuXHQgICAgfTtcblx0XG5cdCAgICBTa2lwTGFzdE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgU2tpcExhc3RPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTa2lwTGFzdE9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICAvKipcblx0ICAgKiAgQnlwYXNzZXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzIGF0IHRoZSBlbmQgb2YgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgKiBAZGVzY3JpcHRpb25cblx0ICAgKiAgVGhpcyBvcGVyYXRvciBhY2N1bXVsYXRlcyBhIHF1ZXVlIHdpdGggYSBsZW5ndGggZW5vdWdoIHRvIHN0b3JlIHRoZSBmaXJzdCBgY291bnRgIGVsZW1lbnRzLiBBcyBtb3JlIGVsZW1lbnRzIGFyZVxuXHQgICAqICByZWNlaXZlZCwgZWxlbWVudHMgYXJlIHRha2VuIGZyb20gdGhlIGZyb250IG9mIHRoZSBxdWV1ZSBhbmQgcHJvZHVjZWQgb24gdGhlIHJlc3VsdCBzZXF1ZW5jZS4gVGhpcyBjYXVzZXMgZWxlbWVudHMgdG8gYmUgZGVsYXllZC5cblx0ICAgKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJ5cGFzcyBhdCB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgc291cmNlIHNlcXVlbmNlIGVsZW1lbnRzIGV4Y2VwdCBmb3IgdGhlIGJ5cGFzc2VkIG9uZXMgYXQgdGhlIGVuZC5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uc2tpcExhc3QgPSBmdW5jdGlvbiAoY291bnQpIHtcblx0ICAgIGlmIChjb3VudCA8IDApIHsgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yKCk7IH1cblx0ICAgIHJldHVybiBuZXcgU2tpcExhc3RPYnNlcnZhYmxlKHRoaXMsIGNvdW50KTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiAgUHJlcGVuZHMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgdG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIGFuIG9wdGlvbmFsIHNjaGVkdWxlciBhbmQgYW4gYXJndW1lbnQgbGlzdCBvZiB2YWx1ZXMgdG8gcHJlcGVuZC5cblx0ICAgKiAgQGV4YW1wbGVcblx0ICAgKiAgdmFyIHJlcyA9IHNvdXJjZS5zdGFydFdpdGgoMSwgMiwgMyk7XG5cdCAgICogIHZhciByZXMgPSBzb3VyY2Uuc3RhcnRXaXRoKFJ4LlNjaGVkdWxlci50aW1lb3V0LCAxLCAyLCAzKTtcblx0ICAgKiBAcGFyYW0ge0FyZ3VtZW50c30gYXJncyBUaGUgc3BlY2lmaWVkIHZhbHVlcyB0byBwcmVwZW5kIHRvIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBzb3VyY2Ugc2VxdWVuY2UgcHJlcGVuZGVkIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnN0YXJ0V2l0aCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciB2YWx1ZXMsIHNjaGVkdWxlciwgc3RhcnQgPSAwO1xuXHQgICAgaWYgKCEhYXJndW1lbnRzLmxlbmd0aCAmJiBpc1NjaGVkdWxlcihhcmd1bWVudHNbMF0pKSB7XG5cdCAgICAgIHNjaGVkdWxlciA9IGFyZ3VtZW50c1swXTtcblx0ICAgICAgc3RhcnQgPSAxO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyO1xuXHQgICAgfVxuXHQgICAgZm9yKHZhciBhcmdzID0gW10sIGkgPSBzdGFydCwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOyB9XG5cdCAgICByZXR1cm4gZW51bWVyYWJsZU9mKFtvYnNlcnZhYmxlRnJvbUFycmF5KGFyZ3MsIHNjaGVkdWxlciksIHRoaXNdKS5jb25jYXQoKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgVGFrZUxhc3RPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhUYWtlTGFzdE9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gVGFrZUxhc3RPYnNlcnZlcihvLCBjKSB7XG5cdCAgICAgIHRoaXMuX28gPSBvO1xuXHQgICAgICB0aGlzLl9jID0gYztcblx0ICAgICAgdGhpcy5fcSA9IFtdO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBUYWtlTGFzdE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgdGhpcy5fcS5wdXNoKHgpO1xuXHQgICAgICB0aGlzLl9xLmxlbmd0aCA+IHRoaXMuX2MgJiYgdGhpcy5fcS5zaGlmdCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICBUYWtlTGFzdE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgVGFrZUxhc3RPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB3aGlsZSAodGhpcy5fcS5sZW5ndGggPiAwKSB7IHRoaXMuX28ub25OZXh0KHRoaXMuX3Euc2hpZnQoKSk7IH1cblx0ICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gVGFrZUxhc3RPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJldHVybnMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZWxlbWVudHMgZnJvbSB0aGUgZW5kIG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICogQGRlc2NyaXB0aW9uXG5cdCAgICogIFRoaXMgb3BlcmF0b3IgYWNjdW11bGF0ZXMgYSBidWZmZXIgd2l0aCBhIGxlbmd0aCBlbm91Z2ggdG8gc3RvcmUgZWxlbWVudHMgY291bnQgZWxlbWVudHMuIFVwb24gY29tcGxldGlvbiBvZlxuXHQgICAqICB0aGUgc291cmNlIHNlcXVlbmNlLCB0aGlzIGJ1ZmZlciBpcyBkcmFpbmVkIG9uIHRoZSByZXN1bHQgc2VxdWVuY2UuIFRoaXMgY2F1c2VzIHRoZSBlbGVtZW50cyB0byBiZSBkZWxheWVkLlxuXHQgICAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZSBmcm9tIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZyb20gdGhlIGVuZCBvZiB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by50YWtlTGFzdCA9IGZ1bmN0aW9uIChjb3VudCkge1xuXHQgICAgaWYgKGNvdW50IDwgMCkgeyB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IoKTsgfVxuXHQgICAgdmFyIHNvdXJjZSA9IHRoaXM7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRha2VMYXN0T2JzZXJ2ZXIobywgY291bnQpKTtcblx0ICAgIH0sIHNvdXJjZSk7XG5cdCAgfTtcblx0XG5cdG9ic2VydmFibGVQcm90by5mbGF0TWFwQ29uY2F0ID0gb2JzZXJ2YWJsZVByb3RvLmNvbmNhdE1hcCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykge1xuXHQgICAgcmV0dXJuIG5ldyBGbGF0TWFwT2JzZXJ2YWJsZSh0aGlzLCBzZWxlY3RvciwgcmVzdWx0U2VsZWN0b3IsIHRoaXNBcmcpLm1lcmdlKDEpO1xuXHR9O1xuXHQgIHZhciBNYXBPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE1hcE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gTWFwT2JzZXJ2YWJsZShzb3VyY2UsIHNlbGVjdG9yLCB0aGlzQXJnKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLnNlbGVjdG9yID0gYmluZENhbGxiYWNrKHNlbGVjdG9yLCB0aGlzQXJnLCAzKTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gaW5uZXJNYXAoc2VsZWN0b3IsIHNlbGYpIHtcblx0ICAgICAgcmV0dXJuIGZ1bmN0aW9uICh4LCBpLCBvKSB7IHJldHVybiBzZWxlY3Rvci5jYWxsKHRoaXMsIHNlbGYuc2VsZWN0b3IoeCwgaSwgbyksIGksIG8pOyB9XG5cdCAgICB9XG5cdFxuXHQgICAgTWFwT2JzZXJ2YWJsZS5wcm90b3R5cGUuaW50ZXJuYWxNYXAgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIHRoaXNBcmcpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBNYXBPYnNlcnZhYmxlKHRoaXMuc291cmNlLCBpbm5lck1hcChzZWxlY3RvciwgdGhpcyksIHRoaXNBcmcpO1xuXHQgICAgfTtcblx0XG5cdCAgICBNYXBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnNlbGVjdG9yLCB0aGlzKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIGluaGVyaXRzKElubmVyT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuXHQgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvLCBzZWxlY3Rvciwgc291cmNlKSB7XG5cdCAgICAgIHRoaXMubyA9IG87XG5cdCAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuaSA9IDA7XG5cdCAgICAgIEFic3RyYWN0T2JzZXJ2ZXIuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oeCkge1xuXHQgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godGhpcy5zZWxlY3RvcikoeCwgdGhpcy5pKyssIHRoaXMuc291cmNlKTtcblx0ICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKHJlc3VsdC5lKTsgfVxuXHQgICAgICB0aGlzLm8ub25OZXh0KHJlc3VsdCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBNYXBPYnNlcnZhYmxlO1xuXHRcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICogUHJvamVjdHMgZWFjaCBlbGVtZW50IG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgaW50byBhIG5ldyBmb3JtIGJ5IGluY29ycG9yYXRpbmcgdGhlIGVsZW1lbnQncyBpbmRleC5cblx0ICAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGVjdG9yIEEgdHJhbnNmb3JtIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggc291cmNlIGVsZW1lbnQ7IHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiByZXByZXNlbnRzIHRoZSBpbmRleCBvZiB0aGUgc291cmNlIGVsZW1lbnQuXG5cdCAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHdob3NlIGVsZW1lbnRzIGFyZSB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50IG9mIHNvdXJjZS5cblx0ICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5tYXAgPSBvYnNlcnZhYmxlUHJvdG8uc2VsZWN0ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCB0aGlzQXJnKSB7XG5cdCAgICB2YXIgc2VsZWN0b3JGbiA9IHR5cGVvZiBzZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHNlbGVjdG9yIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2VsZWN0b3I7IH07XG5cdCAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIE1hcE9ic2VydmFibGUgP1xuXHQgICAgICB0aGlzLmludGVybmFsTWFwKHNlbGVjdG9yRm4sIHRoaXNBcmcpIDpcblx0ICAgICAgbmV3IE1hcE9ic2VydmFibGUodGhpcywgc2VsZWN0b3JGbiwgdGhpc0FyZyk7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24gcGx1Y2tlcihhcmdzLCBsZW4pIHtcblx0ICAgIHJldHVybiBmdW5jdGlvbiBtYXBwZXIoeCkge1xuXHQgICAgICB2YXIgY3VycmVudFByb3AgPSB4O1xuXHQgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgdmFyIHAgPSBjdXJyZW50UHJvcFthcmdzW2ldXTtcblx0ICAgICAgICBpZiAodHlwZW9mIHAgIT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgICBjdXJyZW50UHJvcCA9IHA7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBjdXJyZW50UHJvcDtcblx0ICAgIH1cblx0ICB9XG5cdFxuXHQgIC8qKlxuXHQgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgbmVzdGVkIHByb3BlcnR5IGZyb20gYWxsIGVsZW1lbnRzIGluXG5cdCAgICogdGhlIE9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICogQHBhcmFtIHtBcmd1bWVudHN9IGFyZ3VtZW50cyBUaGUgbmVzdGVkIHByb3BlcnRpZXMgdG8gcGx1Y2suXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IFJldHVybnMgYSBuZXcgT2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnBsdWNrID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgIGlmIChsZW4gPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdMaXN0IG9mIHByb3BlcnRpZXMgY2Fubm90IGJlIGVtcHR5LicpOyB9XG5cdCAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgICAgcmV0dXJuIHRoaXMubWFwKHBsdWNrZXIoYXJncywgbGVuKSk7XG5cdCAgfTtcblx0XG5cdG9ic2VydmFibGVQcm90by5mbGF0TWFwID0gb2JzZXJ2YWJsZVByb3RvLnNlbGVjdE1hbnkgPSBmdW5jdGlvbihzZWxlY3RvciwgcmVzdWx0U2VsZWN0b3IsIHRoaXNBcmcpIHtcblx0ICAgIHJldHVybiBuZXcgRmxhdE1hcE9ic2VydmFibGUodGhpcywgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKS5tZXJnZUFsbCgpO1xuXHR9O1xuXHRcblx0XG5cdC8vXG5cdC8vUnguT2JzZXJ2YWJsZS5wcm90b3R5cGUuZmxhdE1hcFdpdGhNYXhDb25jdXJyZW50ID0gZnVuY3Rpb24obGltaXQsIHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykge1xuXHQvLyAgICByZXR1cm4gbmV3IEZsYXRNYXBPYnNlcnZhYmxlKHRoaXMsIHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykubWVyZ2UobGltaXQpO1xuXHQvL307XG5cdC8vXG5cdFxuXHRSeC5PYnNlcnZhYmxlLnByb3RvdHlwZS5mbGF0TWFwTGF0ZXN0ID0gZnVuY3Rpb24oc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKSB7XG5cdCAgICByZXR1cm4gbmV3IEZsYXRNYXBPYnNlcnZhYmxlKHRoaXMsIHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykuc3dpdGNoTGF0ZXN0KCk7XG5cdH07XG5cdCAgdmFyIFNraXBPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoU2tpcE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBTa2lwT2JzZXJ2YWJsZShzb3VyY2UsIGNvdW50KSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLnNraXBDb3VudCA9IGNvdW50O1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0ICAgIFxuXHQgICAgU2tpcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHRoaXMuc2tpcENvdW50KSk7XG5cdCAgICB9O1xuXHQgICAgXG5cdCAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIGMpIHtcblx0ICAgICAgdGhpcy5jID0gYztcblx0ICAgICAgdGhpcy5yID0gYztcblx0ICAgICAgdGhpcy5vID0gbztcblx0ICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cblx0ICAgICAgaWYgKHRoaXMuciA8PSAwKSB7IFxuXHQgICAgICAgIHRoaXMuby5vbk5leHQoeCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5yLS07XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24oZSkge1xuXHQgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgdGhpcy5vLm9uRXJyb3IoZSk7IH1cblx0ICAgIH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgdGhpcy5vLm9uQ29tcGxldGVkKCk7IH1cblx0ICAgIH07XG5cdCAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbihlKSB7XG5cdCAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfTtcblx0ICAgIFxuXHQgICAgcmV0dXJuIFNraXBPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTsgIFxuXHQgIFxuXHQgIC8qKlxuXHQgICAqIEJ5cGFzc2VzIGEgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGFuZCB0aGVuIHJldHVybnMgdGhlIHJlbWFpbmluZyBlbGVtZW50cy5cblx0ICAgKiBAcGFyYW0ge051bWJlcn0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgdGhlIHJlbWFpbmluZyBlbGVtZW50cy5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyB0aGF0IG9jY3VyIGFmdGVyIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIGlucHV0IHNlcXVlbmNlLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5za2lwID0gZnVuY3Rpb24gKGNvdW50KSB7XG5cdCAgICBpZiAoY291bnQgPCAwKSB7IHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcigpOyB9XG5cdCAgICByZXR1cm4gbmV3IFNraXBPYnNlcnZhYmxlKHRoaXMsIGNvdW50KTtcblx0ICB9O1xuXHQgIHZhciBTa2lwV2hpbGVPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFNraXBXaGlsZU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBTa2lwV2hpbGVPYnNlcnZhYmxlKHNvdXJjZSwgZm4pIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuX2ZuID0gZm47XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFNraXBXaGlsZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBTa2lwV2hpbGVPYnNlcnZlcihvLCB0aGlzKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBTa2lwV2hpbGVPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIFNraXBXaGlsZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFNraXBXaGlsZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIFNraXBXaGlsZU9ic2VydmVyKG8sIHApIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX3AgPSBwO1xuXHQgICAgICB0aGlzLl9pID0gMDtcblx0ICAgICAgdGhpcy5fciA9IGZhbHNlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBTa2lwV2hpbGVPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIGlmICghdGhpcy5fcikge1xuXHQgICAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh0aGlzLl9wLl9mbikoeCwgdGhpcy5faSsrLCB0aGlzLl9wKTtcblx0ICAgICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuXHQgICAgICAgIHRoaXMuX3IgPSAhcmVzO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX3IgJiYgdGhpcy5fby5vbk5leHQoeCk7XG5cdCAgICB9O1xuXHQgICAgU2tpcFdoaWxlT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHsgdGhpcy5fby5vbkVycm9yKGUpOyB9O1xuXHQgICAgU2tpcFdoaWxlT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuXHRcblx0ICAgIHJldHVybiBTa2lwV2hpbGVPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIEJ5cGFzc2VzIGVsZW1lbnRzIGluIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgbG9uZyBhcyBhIHNwZWNpZmllZCBjb25kaXRpb24gaXMgdHJ1ZSBhbmQgdGhlbiByZXR1cm5zIHRoZSByZW1haW5pbmcgZWxlbWVudHMuXG5cdCAgICogIFRoZSBlbGVtZW50J3MgaW5kZXggaXMgdXNlZCBpbiB0aGUgbG9naWMgb2YgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cblx0ICAgKlxuXHQgICAqICB2YXIgcmVzID0gc291cmNlLnNraXBXaGlsZShmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlIDwgMTA7IH0pO1xuXHQgICAqICB2YXIgcmVzID0gc291cmNlLnNraXBXaGlsZShmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7IHJldHVybiB2YWx1ZSA8IDEwIHx8IGluZGV4IDwgMTA7IH0pO1xuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBBIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50IGZvciBhIGNvbmRpdGlvbjsgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBzb3VyY2UgZWxlbWVudC5cblx0ICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBpbnB1dCBzZXF1ZW5jZSBzdGFydGluZyBhdCB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGluZWFyIHNlcmllcyB0aGF0IGRvZXMgbm90IHBhc3MgdGhlIHRlc3Qgc3BlY2lmaWVkIGJ5IHByZWRpY2F0ZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uc2tpcFdoaWxlID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgdGhpc0FyZykge1xuXHQgICAgdmFyIGZuID0gYmluZENhbGxiYWNrKHByZWRpY2F0ZSwgdGhpc0FyZywgMyk7XG5cdCAgICByZXR1cm4gbmV3IFNraXBXaGlsZU9ic2VydmFibGUodGhpcywgZm4pO1xuXHQgIH07XG5cdFxuXHQgIHZhciBUYWtlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFRha2VPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgXG5cdCAgICBmdW5jdGlvbiBUYWtlT2JzZXJ2YWJsZShzb3VyY2UsIGNvdW50KSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLnRha2VDb3VudCA9IGNvdW50O1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0ICAgIFxuXHQgICAgVGFrZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHRoaXMudGFrZUNvdW50KSk7XG5cdCAgICB9O1xuXHQgICAgXG5cdCAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIGMpIHtcblx0ICAgICAgdGhpcy5vID0gbztcblx0ICAgICAgdGhpcy5jID0gYztcblx0ICAgICAgdGhpcy5yID0gYztcblx0ICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlID0ge1xuXHQgICAgICBvbk5leHQ6IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIGlmICh0aGlzLnItLSA+IDApIHtcblx0ICAgICAgICAgIHRoaXMuby5vbk5leHQoeCk7XG5cdCAgICAgICAgICB0aGlzLnIgPD0gMCAmJiB0aGlzLm8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnIpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLm8ub25FcnJvcihlcnIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgb25Db21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLm8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHsgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOyB9LFxuXHQgICAgICBmYWlsOiBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuXHQgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFxuXHQgICAgcmV0dXJuIFRha2VPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTsgIFxuXHQgIFxuXHQgIC8qKlxuXHQgICAqICBSZXR1cm5zIGEgc3BlY2lmaWVkIG51bWJlciBvZiBjb250aWd1b3VzIGVsZW1lbnRzIGZyb20gdGhlIHN0YXJ0IG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UsIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2NoZWR1bGVyIGZvciB0aGUgZWRnZSBjYXNlIG9mIHRha2UoMCkuXG5cdCAgICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmV0dXJuLlxuXHQgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdXNlZCB0byBwcm9kdWNlIGFuIE9uQ29tcGxldGVkIG1lc3NhZ2UgaW4gY2FzZSA8cGFyYW1yZWYgbmFtZT1cImNvdW50IGNvdW50PC9wYXJhbXJlZj4gaXMgc2V0IHRvIDAuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgc2VxdWVuY2UuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnRha2UgPSBmdW5jdGlvbiAoY291bnQsIHNjaGVkdWxlcikge1xuXHQgICAgaWYgKGNvdW50IDwgMCkgeyB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IoKTsgfVxuXHQgICAgaWYgKGNvdW50ID09PSAwKSB7IHJldHVybiBvYnNlcnZhYmxlRW1wdHkoc2NoZWR1bGVyKTsgfVxuXHQgICAgcmV0dXJuIG5ldyBUYWtlT2JzZXJ2YWJsZSh0aGlzLCBjb3VudCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFRha2VXaGlsZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoVGFrZVdoaWxlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFRha2VXaGlsZU9ic2VydmFibGUoc291cmNlLCBmbikge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5fZm4gPSBmbjtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgVGFrZVdoaWxlT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IFRha2VXaGlsZU9ic2VydmVyKG8sIHRoaXMpKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFRha2VXaGlsZU9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgVGFrZVdoaWxlT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoVGFrZVdoaWxlT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgZnVuY3Rpb24gVGFrZVdoaWxlT2JzZXJ2ZXIobywgcCkge1xuXHQgICAgICB0aGlzLl9vID0gbztcblx0ICAgICAgdGhpcy5fcCA9IHA7XG5cdCAgICAgIHRoaXMuX2kgPSAwO1xuXHQgICAgICB0aGlzLl9yID0gdHJ1ZTtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgVGFrZVdoaWxlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuXHQgICAgICBpZiAodGhpcy5fcikge1xuXHQgICAgICAgIHRoaXMuX3IgPSB0cnlDYXRjaCh0aGlzLl9wLl9mbikoeCwgdGhpcy5faSsrLCB0aGlzLl9wKTtcblx0ICAgICAgICBpZiAodGhpcy5fciA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuX28ub25FcnJvcih0aGlzLl9yLmUpOyB9XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuX3IpIHtcblx0ICAgICAgICB0aGlzLl9vLm9uTmV4dCh4KTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICBUYWtlV2hpbGVPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uRXJyb3IoZSk7IH07XG5cdCAgICBUYWtlV2hpbGVPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9vLm9uQ29tcGxldGVkKCk7IH07XG5cdFxuXHQgICAgcmV0dXJuIFRha2VXaGlsZU9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICAvKipcblx0ICAgKiAgUmV0dXJucyBlbGVtZW50cyBmcm9tIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgbG9uZyBhcyBhIHNwZWNpZmllZCBjb25kaXRpb24gaXMgdHJ1ZS5cblx0ICAgKiAgVGhlIGVsZW1lbnQncyBpbmRleCBpcyB1c2VkIGluIHRoZSBsb2dpYyBvZiB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBBIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50IGZvciBhIGNvbmRpdGlvbjsgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBzb3VyY2UgZWxlbWVudC5cblx0ICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBpbnB1dCBzZXF1ZW5jZSB0aGF0IG9jY3VyIGJlZm9yZSB0aGUgZWxlbWVudCBhdCB3aGljaCB0aGUgdGVzdCBubyBsb25nZXIgcGFzc2VzLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by50YWtlV2hpbGUgPSBmdW5jdGlvbiAocHJlZGljYXRlLCB0aGlzQXJnKSB7XG5cdCAgICB2YXIgZm4gPSBiaW5kQ2FsbGJhY2socHJlZGljYXRlLCB0aGlzQXJnLCAzKTtcblx0ICAgIHJldHVybiBuZXcgVGFrZVdoaWxlT2JzZXJ2YWJsZSh0aGlzLCBmbik7XG5cdCAgfTtcblx0XG5cdCAgdmFyIEZpbHRlck9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRmlsdGVyT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0XG5cdCAgICBmdW5jdGlvbiBGaWx0ZXJPYnNlcnZhYmxlKHNvdXJjZSwgcHJlZGljYXRlLCB0aGlzQXJnKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLnByZWRpY2F0ZSA9IGJpbmRDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBGaWx0ZXJPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnByZWRpY2F0ZSwgdGhpcykpO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBpbm5lclByZWRpY2F0ZShwcmVkaWNhdGUsIHNlbGYpIHtcblx0ICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgsIGksIG8pIHsgcmV0dXJuIHNlbGYucHJlZGljYXRlKHgsIGksIG8pICYmIHByZWRpY2F0ZS5jYWxsKHRoaXMsIHgsIGksIG8pOyB9XG5cdCAgICB9XG5cdFxuXHQgICAgRmlsdGVyT2JzZXJ2YWJsZS5wcm90b3R5cGUuaW50ZXJuYWxGaWx0ZXIgPSBmdW5jdGlvbihwcmVkaWNhdGUsIHRoaXNBcmcpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJPYnNlcnZhYmxlKHRoaXMuc291cmNlLCBpbm5lclByZWRpY2F0ZShwcmVkaWNhdGUsIHRoaXMpLCB0aGlzQXJnKTtcblx0ICAgIH07XG5cdFxuXHQgICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG5cdCAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIHByZWRpY2F0ZSwgc291cmNlKSB7XG5cdCAgICAgIHRoaXMubyA9IG87XG5cdCAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5pID0gMDtcblx0ICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih4KSB7XG5cdCAgICAgIHZhciBzaG91bGRZaWVsZCA9IHRyeUNhdGNoKHRoaXMucHJlZGljYXRlKSh4LCB0aGlzLmkrKywgdGhpcy5zb3VyY2UpO1xuXHQgICAgICBpZiAoc2hvdWxkWWllbGQgPT09IGVycm9yT2JqKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuby5vbkVycm9yKHNob3VsZFlpZWxkLmUpO1xuXHQgICAgICB9XG5cdCAgICAgIHNob3VsZFlpZWxkICYmIHRoaXMuby5vbk5leHQoeCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBGaWx0ZXJPYnNlcnZhYmxlO1xuXHRcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICogIEZpbHRlcnMgdGhlIGVsZW1lbnRzIG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYmFzZWQgb24gYSBwcmVkaWNhdGUgYnkgaW5jb3Jwb3JhdGluZyB0aGUgZWxlbWVudCdzIGluZGV4LlxuXHQgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIEEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIHNvdXJjZSBlbGVtZW50IGZvciBhIGNvbmRpdGlvbjsgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBzb3VyY2UgZWxlbWVudC5cblx0ICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gT2JqZWN0IHRvIHVzZSBhcyB0aGlzIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxuXHQgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyBlbGVtZW50cyBmcm9tIHRoZSBpbnB1dCBzZXF1ZW5jZSB0aGF0IHNhdGlzZnkgdGhlIGNvbmRpdGlvbi5cblx0ICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5maWx0ZXIgPSBvYnNlcnZhYmxlUHJvdG8ud2hlcmUgPSBmdW5jdGlvbiAocHJlZGljYXRlLCB0aGlzQXJnKSB7XG5cdCAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIEZpbHRlck9ic2VydmFibGUgPyB0aGlzLmludGVybmFsRmlsdGVyKHByZWRpY2F0ZSwgdGhpc0FyZykgOlxuXHQgICAgICBuZXcgRmlsdGVyT2JzZXJ2YWJsZSh0aGlzLCBwcmVkaWNhdGUsIHRoaXNBcmcpO1xuXHQgIH07XG5cdFxuXHRmdW5jdGlvbiBjcmVhdGVDYk9ic2VydmFibGUoZm4sIGN0eCwgc2VsZWN0b3IsIGFyZ3MpIHtcblx0ICB2YXIgbyA9IG5ldyBBc3luY1N1YmplY3QoKTtcblx0XG5cdCAgYXJncy5wdXNoKGNyZWF0ZUNiSGFuZGxlcihvLCBjdHgsIHNlbGVjdG9yKSk7XG5cdCAgZm4uYXBwbHkoY3R4LCBhcmdzKTtcblx0XG5cdCAgcmV0dXJuIG8uYXNPYnNlcnZhYmxlKCk7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGNyZWF0ZUNiSGFuZGxlcihvLCBjdHgsIHNlbGVjdG9yKSB7XG5cdCAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIgKCkge1xuXHQgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3VsdHMgPSBuZXcgQXJyYXkobGVuKTtcblx0ICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyByZXN1bHRzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cdFxuXHQgICAgaWYgKGlzRnVuY3Rpb24oc2VsZWN0b3IpKSB7XG5cdCAgICAgIHJlc3VsdHMgPSB0cnlDYXRjaChzZWxlY3RvcikuYXBwbHkoY3R4LCByZXN1bHRzKTtcblx0ICAgICAgaWYgKHJlc3VsdHMgPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IocmVzdWx0cy5lKTsgfVxuXHQgICAgICBvLm9uTmV4dChyZXN1bHRzKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8PSAxKSB7XG5cdCAgICAgICAgby5vbk5leHQocmVzdWx0c1swXSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgby5vbk5leHQocmVzdWx0cyk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0XG5cdCAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgfTtcblx0fVxuXHRcblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gd2l0aCBhIGNhbGxiYWNrIGFzIHRoZSBsYXN0IHBhcmFtZXRlciB0byBjb252ZXJ0IHRvIGFuIE9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAqIEBwYXJhbSB7TWl4ZWR9IFtjdHhdIFRoZSBjb250ZXh0IGZvciB0aGUgZnVuYyBwYXJhbWV0ZXIgdG8gYmUgZXhlY3V0ZWQuICBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB1bmRlZmluZWQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtzZWxlY3Rvcl0gQSBzZWxlY3RvciB3aGljaCB0YWtlcyB0aGUgYXJndW1lbnRzIGZyb20gdGhlIGNhbGxiYWNrIHRvIHByb2R1Y2UgYSBzaW5nbGUgaXRlbSB0byB5aWVsZCBvbiBuZXh0LlxuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24sIHdoZW4gZXhlY3V0ZWQgd2l0aCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBtaW51cyB0aGUgY2FsbGJhY2ssIHByb2R1Y2VzIGFuIE9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCBhIHNpbmdsZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBjYWxsYmFjayBhcyBhbiBhcnJheS5cblx0ICovXG5cdE9ic2VydmFibGUuZnJvbUNhbGxiYWNrID0gZnVuY3Rpb24gKGZuLCBjdHgsIHNlbGVjdG9yKSB7XG5cdCAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgIHR5cGVvZiBjdHggPT09ICd1bmRlZmluZWQnICYmIChjdHggPSB0aGlzKTsgXG5cdFxuXHQgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKVxuXHQgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cblx0ICAgIHJldHVybiBjcmVhdGVDYk9ic2VydmFibGUoZm4sIGN0eCwgc2VsZWN0b3IsIGFyZ3MpO1xuXHQgIH07XG5cdH07XG5cdFxuXHRmdW5jdGlvbiBjcmVhdGVOb2RlT2JzZXJ2YWJsZShmbiwgY3R4LCBzZWxlY3RvciwgYXJncykge1xuXHQgIHZhciBvID0gbmV3IEFzeW5jU3ViamVjdCgpO1xuXHRcblx0ICBhcmdzLnB1c2goY3JlYXRlTm9kZUhhbmRsZXIobywgY3R4LCBzZWxlY3RvcikpO1xuXHQgIGZuLmFwcGx5KGN0eCwgYXJncyk7XG5cdFxuXHQgIHJldHVybiBvLmFzT2JzZXJ2YWJsZSgpO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBjcmVhdGVOb2RlSGFuZGxlcihvLCBjdHgsIHNlbGVjdG9yKSB7XG5cdCAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIgKCkge1xuXHQgICAgdmFyIGVyciA9IGFyZ3VtZW50c1swXTtcblx0ICAgIGlmIChlcnIpIHsgcmV0dXJuIG8ub25FcnJvcihlcnIpOyB9XG5cdFxuXHQgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3VsdHMgPSBbXTtcblx0ICAgIGZvcih2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgeyByZXN1bHRzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHRcblx0ICAgIGlmIChpc0Z1bmN0aW9uKHNlbGVjdG9yKSkge1xuXHQgICAgICB2YXIgcmVzdWx0cyA9IHRyeUNhdGNoKHNlbGVjdG9yKS5hcHBseShjdHgsIHJlc3VsdHMpO1xuXHQgICAgICBpZiAocmVzdWx0cyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihyZXN1bHRzLmUpOyB9XG5cdCAgICAgIG8ub25OZXh0KHJlc3VsdHMpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoIDw9IDEpIHtcblx0ICAgICAgICBvLm9uTmV4dChyZXN1bHRzWzBdKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBvLm9uTmV4dChyZXN1bHRzKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIG8ub25Db21wbGV0ZWQoKTtcblx0ICB9O1xuXHR9XG5cdFxuXHQvKipcblx0ICogQ29udmVydHMgYSBOb2RlLmpzIGNhbGxiYWNrIHN0eWxlIGZ1bmN0aW9uIHRvIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuICBUaGlzIG11c3QgYmUgaW4gZnVuY3Rpb24gKGVyciwgLi4uKSBmb3JtYXQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsXG5cdCAqIEBwYXJhbSB7TWl4ZWR9IFtjdHhdIFRoZSBjb250ZXh0IGZvciB0aGUgZnVuYyBwYXJhbWV0ZXIgdG8gYmUgZXhlY3V0ZWQuICBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB1bmRlZmluZWQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtzZWxlY3Rvcl0gQSBzZWxlY3RvciB3aGljaCB0YWtlcyB0aGUgYXJndW1lbnRzIGZyb20gdGhlIGNhbGxiYWNrIG1pbnVzIHRoZSBlcnJvciB0byBwcm9kdWNlIGEgc2luZ2xlIGl0ZW0gdG8geWllbGQgb24gbmV4dC5cblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBBbiBhc3luYyBmdW5jdGlvbiB3aGljaCB3aGVuIGFwcGxpZWQsIHJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIHRoZSBjYWxsYmFjayBhcmd1bWVudHMgYXMgYW4gYXJyYXkuXG5cdCAqL1xuXHRPYnNlcnZhYmxlLmZyb21Ob2RlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZm4sIGN0eCwgc2VsZWN0b3IpIHtcblx0ICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXHQgICAgdHlwZW9mIGN0eCA9PT0gJ3VuZGVmaW5lZCcgJiYgKGN0eCA9IHRoaXMpOyBcblx0ICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KGxlbik7XG5cdCAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuXHQgICAgcmV0dXJuIGNyZWF0ZU5vZGVPYnNlcnZhYmxlKGZuLCBjdHgsIHNlbGVjdG9yLCBhcmdzKTtcblx0ICB9O1xuXHR9O1xuXHRcblx0ICBmdW5jdGlvbiBpc05vZGVMaXN0KGVsKSB7XG5cdCAgICBpZiAocm9vdC5TdGF0aWNOb2RlTGlzdCkge1xuXHQgICAgICAvLyBJRTggU3BlY2lmaWNcblx0ICAgICAgLy8gaW5zdGFuY2VvZiBpcyBzbG93ZXIgdGhhbiBPYmplY3QjdG9TdHJpbmcsIGJ1dCBPYmplY3QjdG9TdHJpbmcgd2lsbCBub3Qgd29yayBhcyBpbnRlbmRlZCBpbiBJRThcblx0ICAgICAgcmV0dXJuIGVsIGluc3RhbmNlb2Ygcm9vdC5TdGF0aWNOb2RlTGlzdCB8fCBlbCBpbnN0YW5jZW9mIHJvb3QuTm9kZUxpc3Q7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVsKSA9PT0gJ1tvYmplY3QgTm9kZUxpc3RdJztcblx0ICAgIH1cblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIExpc3RlbkRpc3Bvc2FibGUoZSwgbiwgZm4pIHtcblx0ICAgIHRoaXMuX2UgPSBlO1xuXHQgICAgdGhpcy5fbiA9IG47XG5cdCAgICB0aGlzLl9mbiA9IGZuO1xuXHQgICAgdGhpcy5fZS5hZGRFdmVudExpc3RlbmVyKHRoaXMuX24sIHRoaXMuX2ZuLCBmYWxzZSk7XG5cdCAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcblx0ICB9XG5cdCAgTGlzdGVuRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdCAgICAgIHRoaXMuX2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLl9uLCB0aGlzLl9mbiwgZmFsc2UpO1xuXHQgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgfVxuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXIgKGVsLCBldmVudE5hbWUsIGhhbmRsZXIpIHtcblx0ICAgIHZhciBkaXNwb3NhYmxlcyA9IG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKCk7XG5cdFxuXHQgICAgLy8gQXN1bWUgTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb25cblx0ICAgIHZhciBlbGVtVG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZWwpO1xuXHQgICAgaWYgKGlzTm9kZUxpc3QoZWwpIHx8IGVsZW1Ub1N0cmluZyA9PT0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJykge1xuXHQgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWwubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICBkaXNwb3NhYmxlcy5hZGQoY3JlYXRlRXZlbnRMaXN0ZW5lcihlbC5pdGVtKGkpLCBldmVudE5hbWUsIGhhbmRsZXIpKTtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIGlmIChlbCkge1xuXHQgICAgICBkaXNwb3NhYmxlcy5hZGQobmV3IExpc3RlbkRpc3Bvc2FibGUoZWwsIGV2ZW50TmFtZSwgaGFuZGxlcikpO1xuXHQgICAgfVxuXHRcblx0ICAgIHJldHVybiBkaXNwb3NhYmxlcztcblx0ICB9XG5cdFxuXHQgIC8qKlxuXHQgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSBuYXRpdmUgZXZlbnRzIG9ubHlcblx0ICAgKi9cblx0ICBSeC5jb25maWcudXNlTmF0aXZlRXZlbnRzID0gZmFsc2U7XG5cdFxuXHQgIHZhciBFdmVudE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhFdmVudE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBFdmVudE9ic2VydmFibGUoZWwsIG5hbWUsIGZuKSB7XG5cdCAgICAgIHRoaXMuX2VsID0gZWw7XG5cdCAgICAgIHRoaXMuX24gPSBuYW1lO1xuXHQgICAgICB0aGlzLl9mbiA9IGZuO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBjcmVhdGVIYW5kbGVyKG8sIGZuKSB7XG5cdCAgICAgIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyICgpIHtcblx0ICAgICAgICB2YXIgcmVzdWx0cyA9IGFyZ3VtZW50c1swXTtcblx0ICAgICAgICBpZiAoaXNGdW5jdGlvbihmbikpIHtcblx0ICAgICAgICAgIHJlc3VsdHMgPSB0cnlDYXRjaChmbikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblx0ICAgICAgICAgIGlmIChyZXN1bHRzID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdHMuZSk7IH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgby5vbk5leHQocmVzdWx0cyk7XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdFxuXHQgICAgRXZlbnRPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIGNyZWF0ZUV2ZW50TGlzdGVuZXIoXG5cdCAgICAgICAgdGhpcy5fZWwsXG5cdCAgICAgICAgdGhpcy5fbixcblx0ICAgICAgICBjcmVhdGVIYW5kbGVyKG8sIHRoaXMuX2ZuKSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBFdmVudE9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICAvKipcblx0ICAgKiBDcmVhdGVzIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgYWRkaW5nIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBtYXRjaGluZyBET01FbGVtZW50IG9yIGVhY2ggaXRlbSBpbiB0aGUgTm9kZUxpc3QuXG5cdCAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgVGhlIERPTUVsZW1lbnQgb3IgTm9kZUxpc3QgdG8gYXR0YWNoIGEgbGlzdGVuZXIuXG5cdCAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBhdHRhY2ggdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NlbGVjdG9yXSBBIHNlbGVjdG9yIHdoaWNoIHRha2VzIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgZXZlbnQgaGFuZGxlciB0byBwcm9kdWNlIGEgc2luZ2xlIGl0ZW0gdG8geWllbGQgb24gbmV4dC5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBldmVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG5cdCAgICovXG5cdCAgT2JzZXJ2YWJsZS5mcm9tRXZlbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnROYW1lLCBzZWxlY3Rvcikge1xuXHQgICAgLy8gTm9kZS5qcyBzcGVjaWZpY1xuXHQgICAgaWYgKGVsZW1lbnQuYWRkTGlzdGVuZXIpIHtcblx0ICAgICAgcmV0dXJuIGZyb21FdmVudFBhdHRlcm4oXG5cdCAgICAgICAgZnVuY3Rpb24gKGgpIHsgZWxlbWVudC5hZGRMaXN0ZW5lcihldmVudE5hbWUsIGgpOyB9LFxuXHQgICAgICAgIGZ1bmN0aW9uIChoKSB7IGVsZW1lbnQucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBoKTsgfSxcblx0ICAgICAgICBzZWxlY3Rvcik7XG5cdCAgICB9XG5cdFxuXHQgICAgLy8gVXNlIG9ubHkgaWYgbm9uLW5hdGl2ZSBldmVudHMgYXJlIGFsbG93ZWRcblx0ICAgIGlmICghUnguY29uZmlnLnVzZU5hdGl2ZUV2ZW50cykge1xuXHQgICAgICAvLyBIYW5kbGVzIGpxLCBBbmd1bGFyLmpzLCBaZXB0bywgTWFyaW9uZXR0ZSwgRW1iZXIuanNcblx0ICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm9uID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbGVtZW50Lm9mZiA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgIHJldHVybiBmcm9tRXZlbnRQYXR0ZXJuKFxuXHQgICAgICAgICAgZnVuY3Rpb24gKGgpIHsgZWxlbWVudC5vbihldmVudE5hbWUsIGgpOyB9LFxuXHQgICAgICAgICAgZnVuY3Rpb24gKGgpIHsgZWxlbWVudC5vZmYoZXZlbnROYW1lLCBoKTsgfSxcblx0ICAgICAgICAgIHNlbGVjdG9yKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIHJldHVybiBuZXcgRXZlbnRPYnNlcnZhYmxlKGVsZW1lbnQsIGV2ZW50TmFtZSwgc2VsZWN0b3IpLnB1Ymxpc2goKS5yZWZDb3VudCgpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBFdmVudFBhdHRlcm5PYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIEV2ZW50UGF0dGVybk9ic2VydmFibGUoYWRkLCBkZWwsIGZuKSB7XG5cdCAgICAgIHRoaXMuX2FkZCA9IGFkZDtcblx0ICAgICAgdGhpcy5fZGVsID0gZGVsO1xuXHQgICAgICB0aGlzLl9mbiA9IGZuO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBjcmVhdGVIYW5kbGVyKG8sIGZuKSB7XG5cdCAgICAgIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyICgpIHtcblx0ICAgICAgICB2YXIgcmVzdWx0cyA9IGFyZ3VtZW50c1swXTtcblx0ICAgICAgICBpZiAoaXNGdW5jdGlvbihmbikpIHtcblx0ICAgICAgICAgIHJlc3VsdHMgPSB0cnlDYXRjaChmbikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblx0ICAgICAgICAgIGlmIChyZXN1bHRzID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdHMuZSk7IH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgby5vbk5leHQocmVzdWx0cyk7XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdFxuXHQgICAgRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBmbiA9IGNyZWF0ZUhhbmRsZXIobywgdGhpcy5fZm4pO1xuXHQgICAgICB2YXIgcmV0dXJuVmFsdWUgPSB0aGlzLl9hZGQoZm4pO1xuXHQgICAgICByZXR1cm4gbmV3IEV2ZW50UGF0dGVybkRpc3Bvc2FibGUodGhpcy5fZGVsLCBmbiwgcmV0dXJuVmFsdWUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBFdmVudFBhdHRlcm5EaXNwb3NhYmxlKGRlbCwgZm4sIHJldCkge1xuXHQgICAgICB0aGlzLl9kZWwgPSBkZWw7XG5cdCAgICAgIHRoaXMuX2ZuID0gZm47XG5cdCAgICAgIHRoaXMuX3JldCA9IHJldDtcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICB9XG5cdFxuXHQgICAgRXZlbnRQYXR0ZXJuRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgaWYoIXRoaXMuaXNEaXNwb3NlZCkge1xuXHQgICAgICAgIGlzRnVuY3Rpb24odGhpcy5fZGVsKSAmJiB0aGlzLl9kZWwodGhpcy5fZm4sIHRoaXMuX3JldCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIEV2ZW50UGF0dGVybk9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICAvKipcblx0ICAgKiBDcmVhdGVzIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgZnJvbSBhbiBldmVudCBlbWl0dGVyIHZpYSBhbiBhZGRIYW5kbGVyL3JlbW92ZUhhbmRsZXIgcGFpci5cblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZGRIYW5kbGVyIFRoZSBmdW5jdGlvbiB0byBhZGQgYSBoYW5kbGVyIHRvIHRoZSBlbWl0dGVyLlxuXHQgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZW1vdmVIYW5kbGVyXSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gdG8gcmVtb3ZlIGEgaGFuZGxlciBmcm9tIGFuIGVtaXR0ZXIuXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NlbGVjdG9yXSBBIHNlbGVjdG9yIHdoaWNoIHRha2VzIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgZXZlbnQgaGFuZGxlciB0byBwcm9kdWNlIGEgc2luZ2xlIGl0ZW0gdG8geWllbGQgb24gbmV4dC5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aGljaCB3cmFwcyBhbiBldmVudCBmcm9tIGFuIGV2ZW50IGVtaXR0ZXJcblx0ICAgKi9cblx0ICB2YXIgZnJvbUV2ZW50UGF0dGVybiA9IE9ic2VydmFibGUuZnJvbUV2ZW50UGF0dGVybiA9IGZ1bmN0aW9uIChhZGRIYW5kbGVyLCByZW1vdmVIYW5kbGVyLCBzZWxlY3Rvcikge1xuXHQgICAgcmV0dXJuIG5ldyBFdmVudFBhdHRlcm5PYnNlcnZhYmxlKGFkZEhhbmRsZXIsIHJlbW92ZUhhbmRsZXIsIHNlbGVjdG9yKS5wdWJsaXNoKCkucmVmQ291bnQoKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgRnJvbVByb21pc2VPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRnJvbVByb21pc2VPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gRnJvbVByb21pc2VPYnNlcnZhYmxlKHAsIHMpIHtcblx0ICAgICAgdGhpcy5fcCA9IHA7XG5cdCAgICAgIHRoaXMuX3MgPSBzO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBzY2hlZHVsZU5leHQocywgc3RhdGUpIHtcblx0ICAgICAgdmFyIG8gPSBzdGF0ZVswXSwgZGF0YSA9IHN0YXRlWzFdO1xuXHQgICAgICBvLm9uTmV4dChkYXRhKTtcblx0ICAgICAgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgfVxuXHRcblx0ICAgIGZ1bmN0aW9uIHNjaGVkdWxlRXJyb3Iocywgc3RhdGUpIHtcblx0ICAgICAgdmFyIG8gPSBzdGF0ZVswXSwgZXJyID0gc3RhdGVbMV07XG5cdCAgICAgIG8ub25FcnJvcihlcnIpO1xuXHQgICAgfVxuXHRcblx0ICAgIEZyb21Qcm9taXNlT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uKG8pIHtcblx0ICAgICAgdmFyIHNhZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpLCBzZWxmID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMuX3Bcblx0ICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuXHQgICAgICAgICAgc2FkLnNldERpc3Bvc2FibGUoc2VsZi5fcy5zY2hlZHVsZShbbywgZGF0YV0sIHNjaGVkdWxlTmV4dCkpO1xuXHQgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcblx0ICAgICAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHNlbGYuX3Muc2NoZWR1bGUoW28sIGVycl0sIHNjaGVkdWxlRXJyb3IpKTtcblx0ICAgICAgICB9KTtcblx0XG5cdCAgICAgIHJldHVybiBzYWQ7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBGcm9tUHJvbWlzZU9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICAvKipcblx0ICAqIENvbnZlcnRzIGEgUHJvbWlzZSB0byBhbiBPYnNlcnZhYmxlIHNlcXVlbmNlXG5cdCAgKiBAcGFyYW0ge1Byb21pc2V9IEFuIEVTNiBDb21wbGlhbnQgcHJvbWlzZS5cblx0ICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIHdyYXBzIHRoZSBleGlzdGluZyBwcm9taXNlIHN1Y2Nlc3MgYW5kIGZhaWx1cmUuXG5cdCAgKi9cblx0ICB2YXIgb2JzZXJ2YWJsZUZyb21Qcm9taXNlID0gT2JzZXJ2YWJsZS5mcm9tUHJvbWlzZSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzY2hlZHVsZXIpIHtcblx0ICAgIHNjaGVkdWxlciB8fCAoc2NoZWR1bGVyID0gZGVmYXVsdFNjaGVkdWxlcik7XG5cdCAgICByZXR1cm4gbmV3IEZyb21Qcm9taXNlT2JzZXJ2YWJsZShwcm9taXNlLCBzY2hlZHVsZXIpO1xuXHQgIH07XG5cdFxuXHQgIC8qXG5cdCAgICogQ29udmVydHMgYW4gZXhpc3Rpbmcgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0byBhbiBFUzYgQ29tcGF0aWJsZSBQcm9taXNlXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiB2YXIgcHJvbWlzZSA9IFJ4Lk9ic2VydmFibGUucmV0dXJuKDQyKS50b1Byb21pc2UoUlNWUC5Qcm9taXNlKTtcblx0ICAgKlxuXHQgICAqIC8vIFdpdGggY29uZmlnXG5cdCAgICogUnguY29uZmlnLlByb21pc2UgPSBSU1ZQLlByb21pc2U7XG5cdCAgICogdmFyIHByb21pc2UgPSBSeC5PYnNlcnZhYmxlLnJldHVybig0MikudG9Qcm9taXNlKCk7XG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Byb21pc2VDdG9yXSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHByb21pc2UuIElmIG5vdCBwcm92aWRlZCwgaXQgbG9va3MgZm9yIGl0IGluIFJ4LmNvbmZpZy5Qcm9taXNlLlxuXHQgICAqIEByZXR1cm5zIHtQcm9taXNlfSBBbiBFUzYgY29tcGF0aWJsZSBwcm9taXNlIHdpdGggdGhlIGxhc3QgdmFsdWUgZnJvbSB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8udG9Qcm9taXNlID0gZnVuY3Rpb24gKHByb21pc2VDdG9yKSB7XG5cdCAgICBwcm9taXNlQ3RvciB8fCAocHJvbWlzZUN0b3IgPSBSeC5jb25maWcuUHJvbWlzZSk7XG5cdCAgICBpZiAoIXByb21pc2VDdG9yKSB7IHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcignUHJvbWlzZSB0eXBlIG5vdCBwcm92aWRlZCBub3IgaW4gUnguY29uZmlnLlByb21pc2UnKTsgfVxuXHQgICAgdmFyIHNvdXJjZSA9IHRoaXM7XG5cdCAgICByZXR1cm4gbmV3IHByb21pc2VDdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0ICAgICAgLy8gTm8gY2FuY2VsbGF0aW9uIGNhbiBiZSBkb25lXG5cdCAgICAgIHZhciB2YWx1ZTtcblx0ICAgICAgc291cmNlLnN1YnNjcmliZShmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHZhbHVlID0gdjtcblx0ICAgICAgfSwgcmVqZWN0LCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfSk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogSW52b2tlcyB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLCBzdXJmYWNpbmcgdGhlIHJlc3VsdCB0aHJvdWdoIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3Rpb25Bc3luYyBBc3luY2hyb25vdXMgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIFByb21pc2UgdG8gcnVuLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGV4cG9zaW5nIHRoZSBmdW5jdGlvbidzIHJlc3VsdCB2YWx1ZSwgb3IgYW4gZXhjZXB0aW9uLlxuXHQgICAqL1xuXHQgIE9ic2VydmFibGUuc3RhcnRBc3luYyA9IGZ1bmN0aW9uIChmdW5jdGlvbkFzeW5jKSB7XG5cdCAgICB2YXIgcHJvbWlzZSA9IHRyeUNhdGNoKGZ1bmN0aW9uQXN5bmMpKCk7XG5cdCAgICBpZiAocHJvbWlzZSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG9ic2VydmFibGVUaHJvdyhwcm9taXNlLmUpOyB9XG5cdCAgICByZXR1cm4gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHByb21pc2UpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBNdWx0aWNhc3RPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKE11bHRpY2FzdE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBNdWx0aWNhc3RPYnNlcnZhYmxlKHNvdXJjZSwgZm4xLCBmbjIpIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuX2ZuMSA9IGZuMTtcblx0ICAgICAgdGhpcy5fZm4yID0gZm4yO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBNdWx0aWNhc3RPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGNvbm5lY3RhYmxlID0gdGhpcy5zb3VyY2UubXVsdGljYXN0KHRoaXMuX2ZuMSgpKTtcblx0ICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKHRoaXMuX2ZuMihjb25uZWN0YWJsZSkuc3Vic2NyaWJlKG8pLCBjb25uZWN0YWJsZS5jb25uZWN0KCkpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gTXVsdGljYXN0T2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIE11bHRpY2FzdHMgdGhlIHNvdXJjZSBzZXF1ZW5jZSBub3RpZmljYXRpb25zIHRocm91Z2ggYW4gaW5zdGFudGlhdGVkIHN1YmplY3QgaW50byBhbGwgdXNlcyBvZiB0aGUgc2VxdWVuY2Ugd2l0aGluIGEgc2VsZWN0b3IgZnVuY3Rpb24uIEVhY2hcblx0ICAgKiBzdWJzY3JpcHRpb24gdG8gdGhlIHJlc3VsdGluZyBzZXF1ZW5jZSBjYXVzZXMgYSBzZXBhcmF0ZSBtdWx0aWNhc3QgaW52b2NhdGlvbiwgZXhwb3NpbmcgdGhlIHNlcXVlbmNlIHJlc3VsdGluZyBmcm9tIHRoZSBzZWxlY3RvciBmdW5jdGlvbidzXG5cdCAgICogaW52b2NhdGlvbi4gRm9yIHNwZWNpYWxpemF0aW9ucyB3aXRoIGZpeGVkIHN1YmplY3QgdHlwZXMsIHNlZSBQdWJsaXNoLCBQdWJsaXNoTGFzdCwgYW5kIFJlcGxheS5cblx0ICAgKlxuXHQgICAqIEBleGFtcGxlXG5cdCAgICogMSAtIHJlcyA9IHNvdXJjZS5tdWx0aWNhc3Qob2JzZXJ2YWJsZSk7XG5cdCAgICogMiAtIHJlcyA9IHNvdXJjZS5tdWx0aWNhc3QoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFN1YmplY3QoKTsgfSwgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHg7IH0pO1xuXHQgICAqXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbnxTdWJqZWN0fSBzdWJqZWN0T3JTdWJqZWN0U2VsZWN0b3Jcblx0ICAgKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBpbnRlcm1lZGlhdGUgc3ViamVjdCB0aHJvdWdoIHdoaWNoIHRoZSBzb3VyY2Ugc2VxdWVuY2UncyBlbGVtZW50cyB3aWxsIGJlIG11bHRpY2FzdCB0byB0aGUgc2VsZWN0b3IgZnVuY3Rpb24uXG5cdCAgICogT3I6XG5cdCAgICogU3ViamVjdCB0byBwdXNoIHNvdXJjZSBlbGVtZW50cyBpbnRvLlxuXHQgICAqXG5cdCAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NlbGVjdG9yXSBPcHRpb25hbCBzZWxlY3RvciBmdW5jdGlvbiB3aGljaCBjYW4gdXNlIHRoZSBtdWx0aWNhc3RlZCBzb3VyY2Ugc2VxdWVuY2Ugc3ViamVjdCB0byB0aGUgcG9saWNpZXMgZW5mb3JjZWQgYnkgdGhlIGNyZWF0ZWQgc3ViamVjdC4gU3BlY2lmaWVkIG9ubHkgaWYgPHBhcmFtcmVmIG5hbWU9XCJzdWJqZWN0T3JTdWJqZWN0U2VsZWN0b3JcIiBpcyBhIGZhY3RvcnkgZnVuY3Rpb24uXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBwcm9kdWNlZCBieSBtdWx0aWNhc3RpbmcgdGhlIHNvdXJjZSBzZXF1ZW5jZSB3aXRoaW4gYSBzZWxlY3RvciBmdW5jdGlvbi5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ubXVsdGljYXN0ID0gZnVuY3Rpb24gKHN1YmplY3RPclN1YmplY3RTZWxlY3Rvciwgc2VsZWN0b3IpIHtcblx0ICAgIHJldHVybiBpc0Z1bmN0aW9uKHN1YmplY3RPclN1YmplY3RTZWxlY3RvcikgP1xuXHQgICAgICBuZXcgTXVsdGljYXN0T2JzZXJ2YWJsZSh0aGlzLCBzdWJqZWN0T3JTdWJqZWN0U2VsZWN0b3IsIHNlbGVjdG9yKSA6XG5cdCAgICAgIG5ldyBDb25uZWN0YWJsZU9ic2VydmFibGUodGhpcywgc3ViamVjdE9yU3ViamVjdFNlbGVjdG9yKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBzZWxlY3RvciBvbiBhIGNvbm5lY3RhYmxlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBzaGFyZXMgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlLlxuXHQgICAqIFRoaXMgb3BlcmF0b3IgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiBNdWx0aWNhc3QgdXNpbmcgYSByZWd1bGFyIFN1YmplY3QuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqIHZhciByZXNyZXMgPSBzb3VyY2UucHVibGlzaCgpO1xuXHQgICAqIHZhciByZXMgPSBzb3VyY2UucHVibGlzaChmdW5jdGlvbiAoeCkgeyByZXR1cm4geDsgfSk7XG5cdCAgICpcblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIFNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiB1c2UgdGhlIG11bHRpY2FzdGVkIHNvdXJjZSBzZXF1ZW5jZSBhcyBtYW55IHRpbWVzIGFzIG5lZWRlZCwgd2l0aG91dCBjYXVzaW5nIG11bHRpcGxlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNvdXJjZSBzZXF1ZW5jZS4gU3Vic2NyaWJlcnMgdG8gdGhlIGdpdmVuIHNvdXJjZSB3aWxsIHJlY2VpdmUgYWxsIG5vdGlmaWNhdGlvbnMgb2YgdGhlIHNvdXJjZSBmcm9tIHRoZSB0aW1lIG9mIHRoZSBzdWJzY3JpcHRpb24gb24uXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBwcm9kdWNlZCBieSBtdWx0aWNhc3RpbmcgdGhlIHNvdXJjZSBzZXF1ZW5jZSB3aXRoaW4gYSBzZWxlY3RvciBmdW5jdGlvbi5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ucHVibGlzaCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuXHQgICAgcmV0dXJuIHNlbGVjdG9yICYmIGlzRnVuY3Rpb24oc2VsZWN0b3IpID9cblx0ICAgICAgdGhpcy5tdWx0aWNhc3QoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFN1YmplY3QoKTsgfSwgc2VsZWN0b3IpIDpcblx0ICAgICAgdGhpcy5tdWx0aWNhc3QobmV3IFN1YmplY3QoKSk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cblx0ICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgcHVibGlzaCB3aGljaCBjcmVhdGVzIGEgc3Vic2NyaXB0aW9uIHdoZW4gdGhlIG51bWJlciBvZiBvYnNlcnZlcnMgZ29lcyBmcm9tIHplcm8gdG8gb25lLCB0aGVuIHNoYXJlcyB0aGF0IHN1YnNjcmlwdGlvbiB3aXRoIGFsbCBzdWJzZXF1ZW50IG9ic2VydmVycyB1bnRpbCB0aGUgbnVtYmVyIG9mIG9ic2VydmVycyByZXR1cm5zIHRvIHplcm8sIGF0IHdoaWNoIHBvaW50IHRoZSBzdWJzY3JpcHRpb24gaXMgZGlzcG9zZWQuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBwcm9kdWNlZCBieSBtdWx0aWNhc3RpbmcgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uc2hhcmUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5wdWJsaXNoKCkucmVmQ291bnQoKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBzZWxlY3RvciBvbiBhIGNvbm5lY3RhYmxlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBzaGFyZXMgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlIGNvbnRhaW5pbmcgb25seSB0aGUgbGFzdCBub3RpZmljYXRpb24uXG5cdCAgICogVGhpcyBvcGVyYXRvciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIE11bHRpY2FzdCB1c2luZyBhIEFzeW5jU3ViamVjdC5cblx0ICAgKlxuXHQgICAqIEBleGFtcGxlXG5cdCAgICogdmFyIHJlcyA9IHNvdXJjZS5wdWJsaXNoTGFzdCgpO1xuXHQgICAqIHZhciByZXMgPSBzb3VyY2UucHVibGlzaExhc3QoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHg7IH0pO1xuXHQgICAqXG5cdCAgICogQHBhcmFtIHNlbGVjdG9yIFtPcHRpb25hbF0gU2VsZWN0b3IgZnVuY3Rpb24gd2hpY2ggY2FuIHVzZSB0aGUgbXVsdGljYXN0ZWQgc291cmNlIHNlcXVlbmNlIGFzIG1hbnkgdGltZXMgYXMgbmVlZGVkLCB3aXRob3V0IGNhdXNpbmcgbXVsdGlwbGUgc3Vic2NyaXB0aW9ucyB0byB0aGUgc291cmNlIHNlcXVlbmNlLiBTdWJzY3JpYmVycyB0byB0aGUgZ2l2ZW4gc291cmNlIHdpbGwgb25seSByZWNlaXZlIHRoZSBsYXN0IG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aGluIGEgc2VsZWN0b3IgZnVuY3Rpb24uXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnB1Ymxpc2hMYXN0ID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG5cdCAgICByZXR1cm4gc2VsZWN0b3IgJiYgaXNGdW5jdGlvbihzZWxlY3RvcikgP1xuXHQgICAgICB0aGlzLm11bHRpY2FzdChmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgQXN5bmNTdWJqZWN0KCk7IH0sIHNlbGVjdG9yKSA6XG5cdCAgICAgIHRoaXMubXVsdGljYXN0KG5ldyBBc3luY1N1YmplY3QoKSk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgc2VsZWN0b3Igb24gYSBjb25uZWN0YWJsZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSBhbmQgc3RhcnRzIHdpdGggaW5pdGlhbFZhbHVlLlxuXHQgICAqIFRoaXMgb3BlcmF0b3IgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiBNdWx0aWNhc3QgdXNpbmcgYSBCZWhhdmlvclN1YmplY3QuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqIHZhciByZXMgPSBzb3VyY2UucHVibGlzaFZhbHVlKDQyKTtcblx0ICAgKiB2YXIgcmVzID0gc291cmNlLnB1Ymxpc2hWYWx1ZShmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5zZWxlY3QoZnVuY3Rpb24gKHkpIHsgcmV0dXJuIHkgKiB5OyB9KSB9LCA0Mik7XG5cdCAgICpcblx0ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIE9wdGlvbmFsIHNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiB1c2UgdGhlIG11bHRpY2FzdGVkIHNvdXJjZSBzZXF1ZW5jZSBhcyBtYW55IHRpbWVzIGFzIG5lZWRlZCwgd2l0aG91dCBjYXVzaW5nIG11bHRpcGxlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNvdXJjZSBzZXF1ZW5jZS4gU3Vic2NyaWJlcnMgdG8gdGhlIGdpdmVuIHNvdXJjZSB3aWxsIHJlY2VpdmUgaW1tZWRpYXRlbHkgcmVjZWl2ZSB0aGUgaW5pdGlhbCB2YWx1ZSwgZm9sbG93ZWQgYnkgYWxsIG5vdGlmaWNhdGlvbnMgb2YgdGhlIHNvdXJjZSBmcm9tIHRoZSB0aW1lIG9mIHRoZSBzdWJzY3JpcHRpb24gb24uXG5cdCAgICogQHBhcmFtIHtNaXhlZH0gaW5pdGlhbFZhbHVlIEluaXRpYWwgdmFsdWUgcmVjZWl2ZWQgYnkgb2JzZXJ2ZXJzIHVwb24gc3Vic2NyaXB0aW9uLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aGluIGEgc2VsZWN0b3IgZnVuY3Rpb24uXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnB1Ymxpc2hWYWx1ZSA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWVPclNlbGVjdG9yLCBpbml0aWFsVmFsdWUpIHtcblx0ICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAyID9cblx0ICAgICAgdGhpcy5tdWx0aWNhc3QoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBuZXcgQmVoYXZpb3JTdWJqZWN0KGluaXRpYWxWYWx1ZSk7XG5cdCAgICAgIH0sIGluaXRpYWxWYWx1ZU9yU2VsZWN0b3IpIDpcblx0ICAgICAgdGhpcy5tdWx0aWNhc3QobmV3IEJlaGF2aW9yU3ViamVjdChpbml0aWFsVmFsdWVPclNlbGVjdG9yKSk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSBhbmQgc3RhcnRzIHdpdGggYW4gaW5pdGlhbFZhbHVlLlxuXHQgICAqIFRoaXMgb3BlcmF0b3IgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiBwdWJsaXNoVmFsdWUgd2hpY2ggY3JlYXRlcyBhIHN1YnNjcmlwdGlvbiB3aGVuIHRoZSBudW1iZXIgb2Ygb2JzZXJ2ZXJzIGdvZXMgZnJvbSB6ZXJvIHRvIG9uZSwgdGhlbiBzaGFyZXMgdGhhdCBzdWJzY3JpcHRpb24gd2l0aCBhbGwgc3Vic2VxdWVudCBvYnNlcnZlcnMgdW50aWwgdGhlIG51bWJlciBvZiBvYnNlcnZlcnMgcmV0dXJucyB0byB6ZXJvLCBhdCB3aGljaCBwb2ludCB0aGUgc3Vic2NyaXB0aW9uIGlzIGRpc3Bvc2VkLlxuXHQgICAqIEBwYXJhbSB7TWl4ZWR9IGluaXRpYWxWYWx1ZSBJbml0aWFsIHZhbHVlIHJlY2VpdmVkIGJ5IG9ic2VydmVycyB1cG9uIHN1YnNjcmlwdGlvbi5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5zaGFyZVZhbHVlID0gZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuXHQgICAgcmV0dXJuIHRoaXMucHVibGlzaFZhbHVlKGluaXRpYWxWYWx1ZSkucmVmQ291bnQoKTtcblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBzZWxlY3RvciBvbiBhIGNvbm5lY3RhYmxlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBzaGFyZXMgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlIHJlcGxheWluZyBub3RpZmljYXRpb25zIHN1YmplY3QgdG8gYSBtYXhpbXVtIHRpbWUgbGVuZ3RoIGZvciB0aGUgcmVwbGF5IGJ1ZmZlci5cblx0ICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgTXVsdGljYXN0IHVzaW5nIGEgUmVwbGF5U3ViamVjdC5cblx0ICAgKlxuXHQgICAqIEBleGFtcGxlXG5cdCAgICogdmFyIHJlcyA9IHNvdXJjZS5yZXBsYXkobnVsbCwgMyk7XG5cdCAgICogdmFyIHJlcyA9IHNvdXJjZS5yZXBsYXkobnVsbCwgMywgNTAwKTtcblx0ICAgKiB2YXIgcmVzID0gc291cmNlLnJlcGxheShudWxsLCAzLCA1MDAsIHNjaGVkdWxlcik7XG5cdCAgICogdmFyIHJlcyA9IHNvdXJjZS5yZXBsYXkoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHgudGFrZSg2KS5yZXBlYXQoKTsgfSwgMywgNTAwLCBzY2hlZHVsZXIpO1xuXHQgICAqXG5cdCAgICogQHBhcmFtIHNlbGVjdG9yIFtPcHRpb25hbF0gU2VsZWN0b3IgZnVuY3Rpb24gd2hpY2ggY2FuIHVzZSB0aGUgbXVsdGljYXN0ZWQgc291cmNlIHNlcXVlbmNlIGFzIG1hbnkgdGltZXMgYXMgbmVlZGVkLCB3aXRob3V0IGNhdXNpbmcgbXVsdGlwbGUgc3Vic2NyaXB0aW9ucyB0byB0aGUgc291cmNlIHNlcXVlbmNlLiBTdWJzY3JpYmVycyB0byB0aGUgZ2l2ZW4gc291cmNlIHdpbGwgcmVjZWl2ZSBhbGwgdGhlIG5vdGlmaWNhdGlvbnMgb2YgdGhlIHNvdXJjZSBzdWJqZWN0IHRvIHRoZSBzcGVjaWZpZWQgcmVwbGF5IGJ1ZmZlciB0cmltbWluZyBwb2xpY3kuXG5cdCAgICogQHBhcmFtIGJ1ZmZlclNpemUgW09wdGlvbmFsXSBNYXhpbXVtIGVsZW1lbnQgY291bnQgb2YgdGhlIHJlcGxheSBidWZmZXIuXG5cdCAgICogQHBhcmFtIHdpbmRvd1NpemUgW09wdGlvbmFsXSBNYXhpbXVtIHRpbWUgbGVuZ3RoIG9mIHRoZSByZXBsYXkgYnVmZmVyLlxuXHQgICAqIEBwYXJhbSBzY2hlZHVsZXIgW09wdGlvbmFsXSBTY2hlZHVsZXIgd2hlcmUgY29ubmVjdGVkIG9ic2VydmVycyB3aXRoaW4gdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBvbi5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5yZXBsYXkgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGJ1ZmZlclNpemUsIHdpbmRvd1NpemUsIHNjaGVkdWxlcikge1xuXHQgICAgcmV0dXJuIHNlbGVjdG9yICYmIGlzRnVuY3Rpb24oc2VsZWN0b3IpID9cblx0ICAgICAgdGhpcy5tdWx0aWNhc3QoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFJlcGxheVN1YmplY3QoYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKTsgfSwgc2VsZWN0b3IpIDpcblx0ICAgICAgdGhpcy5tdWx0aWNhc3QobmV3IFJlcGxheVN1YmplY3QoYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKSk7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSByZXBsYXlpbmcgbm90aWZpY2F0aW9ucyBzdWJqZWN0IHRvIGEgbWF4aW11bSB0aW1lIGxlbmd0aCBmb3IgdGhlIHJlcGxheSBidWZmZXIuXG5cdCAgICogVGhpcyBvcGVyYXRvciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIHJlcGxheSB3aGljaCBjcmVhdGVzIGEgc3Vic2NyaXB0aW9uIHdoZW4gdGhlIG51bWJlciBvZiBvYnNlcnZlcnMgZ29lcyBmcm9tIHplcm8gdG8gb25lLCB0aGVuIHNoYXJlcyB0aGF0IHN1YnNjcmlwdGlvbiB3aXRoIGFsbCBzdWJzZXF1ZW50IG9ic2VydmVycyB1bnRpbCB0aGUgbnVtYmVyIG9mIG9ic2VydmVycyByZXR1cm5zIHRvIHplcm8sIGF0IHdoaWNoIHBvaW50IHRoZSBzdWJzY3JpcHRpb24gaXMgZGlzcG9zZWQuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqIHZhciByZXMgPSBzb3VyY2Uuc2hhcmVSZXBsYXkoMyk7XG5cdCAgICogdmFyIHJlcyA9IHNvdXJjZS5zaGFyZVJlcGxheSgzLCA1MDApO1xuXHQgICAqIHZhciByZXMgPSBzb3VyY2Uuc2hhcmVSZXBsYXkoMywgNTAwLCBzY2hlZHVsZXIpO1xuXHQgICAqXG5cdFxuXHQgICAqIEBwYXJhbSBidWZmZXJTaXplIFtPcHRpb25hbF0gTWF4aW11bSBlbGVtZW50IGNvdW50IG9mIHRoZSByZXBsYXkgYnVmZmVyLlxuXHQgICAqIEBwYXJhbSB3aW5kb3cgW09wdGlvbmFsXSBNYXhpbXVtIHRpbWUgbGVuZ3RoIG9mIHRoZSByZXBsYXkgYnVmZmVyLlxuXHQgICAqIEBwYXJhbSBzY2hlZHVsZXIgW09wdGlvbmFsXSBTY2hlZHVsZXIgd2hlcmUgY29ubmVjdGVkIG9ic2VydmVycyB3aXRoaW4gdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBvbi5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by5zaGFyZVJlcGxheSA9IGZ1bmN0aW9uIChidWZmZXJTaXplLCB3aW5kb3dTaXplLCBzY2hlZHVsZXIpIHtcblx0ICAgIHJldHVybiB0aGlzLnJlcGxheShudWxsLCBidWZmZXJTaXplLCB3aW5kb3dTaXplLCBzY2hlZHVsZXIpLnJlZkNvdW50KCk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFJlZkNvdW50T2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhSZWZDb3VudE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBSZWZDb3VudE9ic2VydmFibGUoc291cmNlKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLl9jb3VudCA9IDA7XG5cdCAgICAgIHRoaXMuX2Nvbm5lY3RhYmxlU3Vic2NyaXB0aW9uID0gbnVsbDtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgUmVmQ291bnRPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIHNob3VsZENvbm5lY3QgPSArK3RoaXMuX2NvdW50ID09PSAxLCBzdWJzY3JpcHRpb24gPSB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobyk7XG5cdCAgICAgIHNob3VsZENvbm5lY3QgJiYgKHRoaXMuX2Nvbm5lY3RhYmxlU3Vic2NyaXB0aW9uID0gdGhpcy5zb3VyY2UuY29ubmVjdCgpKTtcblx0ICAgICAgcmV0dXJuIG5ldyBSZWZDb3VudERpc3Bvc2FibGUodGhpcywgc3Vic2NyaXB0aW9uKTtcblx0ICAgIH07XG5cdFxuXHQgICAgZnVuY3Rpb24gUmVmQ291bnREaXNwb3NhYmxlKHAsIHMpIHtcblx0ICAgICAgdGhpcy5fcCA9IHA7XG5cdCAgICAgIHRoaXMuX3MgPSBzO1xuXHQgICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcblx0ICAgIH1cblx0XG5cdCAgICBSZWZDb3VudERpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdCAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLl9zLmRpc3Bvc2UoKTtcblx0ICAgICAgICAtLXRoaXMuX3AuX2NvdW50ID09PSAwICYmIHRoaXMuX3AuX2Nvbm5lY3RhYmxlU3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gUmVmQ291bnRPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblx0XG5cdCAgdmFyIENvbm5lY3RhYmxlT2JzZXJ2YWJsZSA9IFJ4LkNvbm5lY3RhYmxlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhDb25uZWN0YWJsZU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBDb25uZWN0YWJsZU9ic2VydmFibGUoc291cmNlLCBzdWJqZWN0KSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLl9oYXNTdWJzY3JpcHRpb24gID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IG51bGw7XG5cdCAgICAgIHRoaXMuX3NvdXJjZU9ic2VydmFibGUgPSBzb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cdCAgICAgIHRoaXMuX3N1YmplY3QgPSBzdWJqZWN0O1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBDb25uZWN0RGlzcG9zYWJsZShwYXJlbnQpIHtcblx0ICAgICAgdGhpcy5fcCA9IHBhcmVudDtcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICB9XG5cdFxuXHQgICAgQ29ubmVjdERpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdCAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLl9wLl9oYXNTdWJzY3JpcHRpb24gPSBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0XG5cdCAgICBDb25uZWN0YWJsZU9ic2VydmFibGUucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGlmICghdGhpcy5faGFzU3Vic2NyaXB0aW9uKSB7XG5cdCAgICAgICAgdGhpcy5faGFzU3Vic2NyaXB0aW9uID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSBuZXcgQmluYXJ5RGlzcG9zYWJsZShcblx0ICAgICAgICAgIHRoaXMuX3NvdXJjZU9ic2VydmFibGUuc3Vic2NyaWJlKHRoaXMuX3N1YmplY3QpLFxuXHQgICAgICAgICAgbmV3IENvbm5lY3REaXNwb3NhYmxlKHRoaXMpXG5cdCAgICAgICAgKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0aW9uO1xuXHQgICAgfTtcblx0XG5cdCAgICBDb25uZWN0YWJsZU9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3ViamVjdC5zdWJzY3JpYmUobyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVmQ291bnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiBuZXcgUmVmQ291bnRPYnNlcnZhYmxlKHRoaXMpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gQ29ubmVjdGFibGVPYnNlcnZhYmxlO1xuXHQgIH0oT2JzZXJ2YWJsZSkpO1xuXHRcblx0ICB2YXIgVGltZXJPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoVGltZXJPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gVGltZXJPYnNlcnZhYmxlKGR0LCBzKSB7XG5cdCAgICAgIHRoaXMuX2R0ID0gZHQ7XG5cdCAgICAgIHRoaXMuX3MgPSBzO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBUaW1lck9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcy5zY2hlZHVsZUZ1dHVyZShvLCB0aGlzLl9kdCwgc2NoZWR1bGVNZXRob2QpO1xuXHQgICAgfTtcblx0XG5cdCAgICBmdW5jdGlvbiBzY2hlZHVsZU1ldGhvZChzLCBvKSB7XG5cdCAgICAgIG8ub25OZXh0KDApO1xuXHQgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICB9XG5cdFxuXHQgICAgcmV0dXJuIFRpbWVyT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIGZ1bmN0aW9uIF9vYnNlcnZhYmxlVGltZXIoZHVlVGltZSwgc2NoZWR1bGVyKSB7XG5cdCAgICByZXR1cm4gbmV3IFRpbWVyT2JzZXJ2YWJsZShkdWVUaW1lLCBzY2hlZHVsZXIpO1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gb2JzZXJ2YWJsZVRpbWVyRGF0ZUFuZFBlcmlvZChkdWVUaW1lLCBwZXJpb2QsIHNjaGVkdWxlcikge1xuXHQgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuXHQgICAgICB2YXIgZCA9IGR1ZVRpbWUsIHAgPSBub3JtYWxpemVUaW1lKHBlcmlvZCk7XG5cdCAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmVGdXR1cmUoMCwgZCwgZnVuY3Rpb24gKGNvdW50LCBzZWxmKSB7XG5cdCAgICAgICAgaWYgKHAgPiAwKSB7XG5cdCAgICAgICAgICB2YXIgbm93ID0gc2NoZWR1bGVyLm5vdygpO1xuXHQgICAgICAgICAgZCA9IG5ldyBEYXRlKGQuZ2V0VGltZSgpICsgcCk7XG5cdCAgICAgICAgICBkLmdldFRpbWUoKSA8PSBub3cgJiYgKGQgPSBuZXcgRGF0ZShub3cgKyBwKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIG9ic2VydmVyLm9uTmV4dChjb3VudCk7XG5cdCAgICAgICAgc2VsZihjb3VudCArIDEsIG5ldyBEYXRlKGQpKTtcblx0ICAgICAgfSk7XG5cdCAgICB9KTtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIG9ic2VydmFibGVUaW1lclRpbWVTcGFuQW5kUGVyaW9kKGR1ZVRpbWUsIHBlcmlvZCwgc2NoZWR1bGVyKSB7XG5cdCAgICByZXR1cm4gZHVlVGltZSA9PT0gcGVyaW9kID9cblx0ICAgICAgbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG5cdCAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZVBlcmlvZGljKDAsIHBlcmlvZCwgZnVuY3Rpb24gKGNvdW50KSB7XG5cdCAgICAgICAgICBvYnNlcnZlci5vbk5leHQoY291bnQpO1xuXHQgICAgICAgICAgcmV0dXJuIGNvdW50ICsgMTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSkgOlxuXHQgICAgICBvYnNlcnZhYmxlRGVmZXIoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBvYnNlcnZhYmxlVGltZXJEYXRlQW5kUGVyaW9kKG5ldyBEYXRlKHNjaGVkdWxlci5ub3coKSArIGR1ZVRpbWUpLCBwZXJpb2QsIHNjaGVkdWxlcik7XG5cdCAgICAgIH0pO1xuXHQgIH1cblx0XG5cdCAgLyoqXG5cdCAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYWZ0ZXIgZWFjaCBwZXJpb2QuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqICAxIC0gcmVzID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKTtcblx0ICAgKiAgMiAtIHJlcyA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCwgUnguU2NoZWR1bGVyLnRpbWVvdXQpO1xuXHQgICAqXG5cdCAgICogQHBhcmFtIHtOdW1iZXJ9IHBlcmlvZCBQZXJpb2QgZm9yIHByb2R1Y2luZyB0aGUgdmFsdWVzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UgKHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGRlbm90aW5nIG1pbGxpc2Vjb25kcykuXG5cdCAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBydW4gdGhlIHRpbWVyIG9uLiBJZiBub3Qgc3BlY2lmaWVkLCBSeC5TY2hlZHVsZXIudGltZW91dCBpcyB1c2VkLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgcHJvZHVjZXMgYSB2YWx1ZSBhZnRlciBlYWNoIHBlcmlvZC5cblx0ICAgKi9cblx0ICB2YXIgb2JzZXJ2YWJsZWludGVydmFsID0gT2JzZXJ2YWJsZS5pbnRlcnZhbCA9IGZ1bmN0aW9uIChwZXJpb2QsIHNjaGVkdWxlcikge1xuXHQgICAgcmV0dXJuIG9ic2VydmFibGVUaW1lclRpbWVTcGFuQW5kUGVyaW9kKHBlcmlvZCwgcGVyaW9kLCBpc1NjaGVkdWxlcihzY2hlZHVsZXIpID8gc2NoZWR1bGVyIDogZGVmYXVsdFNjaGVkdWxlcik7XG5cdCAgfTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYWZ0ZXIgZHVlVGltZSBoYXMgZWxhcHNlZCBhbmQgdGhlbiBhZnRlciBlYWNoIHBlcmlvZC5cblx0ICAgKiBAcGFyYW0ge051bWJlcn0gZHVlVGltZSBBYnNvbHV0ZSAoc3BlY2lmaWVkIGFzIGEgRGF0ZSBvYmplY3QpIG9yIHJlbGF0aXZlIHRpbWUgKHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGRlbm90aW5nIG1pbGxpc2Vjb25kcykgYXQgd2hpY2ggdG8gcHJvZHVjZSB0aGUgZmlyc3QgdmFsdWUuXG5cdCAgICogQHBhcmFtIHtNaXhlZH0gW3BlcmlvZE9yU2NoZWR1bGVyXSAgUGVyaW9kIHRvIHByb2R1Y2Ugc3Vic2VxdWVudCB2YWx1ZXMgKHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGRlbm90aW5nIG1pbGxpc2Vjb25kcyksIG9yIHRoZSBzY2hlZHVsZXIgdG8gcnVuIHRoZSB0aW1lciBvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHJlc3VsdGluZyB0aW1lciBpcyBub3QgcmVjdXJyaW5nLlxuXHQgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSAgU2NoZWR1bGVyIHRvIHJ1biB0aGUgdGltZXIgb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0aW1lb3V0IHNjaGVkdWxlciBpcyB1c2VkLlxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgcHJvZHVjZXMgYSB2YWx1ZSBhZnRlciBkdWUgdGltZSBoYXMgZWxhcHNlZCBhbmQgdGhlbiBlYWNoIHBlcmlvZC5cblx0ICAgKi9cblx0ICB2YXIgb2JzZXJ2YWJsZVRpbWVyID0gT2JzZXJ2YWJsZS50aW1lciA9IGZ1bmN0aW9uIChkdWVUaW1lLCBwZXJpb2RPclNjaGVkdWxlciwgc2NoZWR1bGVyKSB7XG5cdCAgICB2YXIgcGVyaW9kO1xuXHQgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gZGVmYXVsdFNjaGVkdWxlcik7XG5cdCAgICBpZiAocGVyaW9kT3JTY2hlZHVsZXIgIT0gbnVsbCAmJiB0eXBlb2YgcGVyaW9kT3JTY2hlZHVsZXIgPT09ICdudW1iZXInKSB7XG5cdCAgICAgIHBlcmlvZCA9IHBlcmlvZE9yU2NoZWR1bGVyO1xuXHQgICAgfSBlbHNlIGlmIChpc1NjaGVkdWxlcihwZXJpb2RPclNjaGVkdWxlcikpIHtcblx0ICAgICAgc2NoZWR1bGVyID0gcGVyaW9kT3JTY2hlZHVsZXI7XG5cdCAgICB9XG5cdCAgICBpZiAoKGR1ZVRpbWUgaW5zdGFuY2VvZiBEYXRlIHx8IHR5cGVvZiBkdWVUaW1lID09PSAnbnVtYmVyJykgJiYgcGVyaW9kID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGltZXIoZHVlVGltZSwgc2NoZWR1bGVyKTtcblx0ICAgIH1cblx0ICAgIGlmIChkdWVUaW1lIGluc3RhbmNlb2YgRGF0ZSAmJiBwZXJpb2QgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICByZXR1cm4gb2JzZXJ2YWJsZVRpbWVyRGF0ZUFuZFBlcmlvZChkdWVUaW1lLmdldFRpbWUoKSwgcGVyaW9kT3JTY2hlZHVsZXIsIHNjaGVkdWxlcik7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gb2JzZXJ2YWJsZVRpbWVyVGltZVNwYW5BbmRQZXJpb2QoZHVlVGltZSwgcGVyaW9kLCBzY2hlZHVsZXIpO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIG9ic2VydmFibGVEZWxheVJlbGF0aXZlKHNvdXJjZSwgZHVlVGltZSwgc2NoZWR1bGVyKSB7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGFjdGl2ZSA9IGZhbHNlLFxuXHQgICAgICAgIGNhbmNlbGFibGUgPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpLFxuXHQgICAgICAgIGV4Y2VwdGlvbiA9IG51bGwsXG5cdCAgICAgICAgcSA9IFtdLFxuXHQgICAgICAgIHJ1bm5pbmcgPSBmYWxzZSxcblx0ICAgICAgICBzdWJzY3JpcHRpb247XG5cdCAgICAgIHN1YnNjcmlwdGlvbiA9IHNvdXJjZS5tYXRlcmlhbGl6ZSgpLnRpbWVzdGFtcChzY2hlZHVsZXIpLnN1YnNjcmliZShmdW5jdGlvbiAobm90aWZpY2F0aW9uKSB7XG5cdCAgICAgICAgdmFyIGQsIHNob3VsZFJ1bjtcblx0ICAgICAgICBpZiAobm90aWZpY2F0aW9uLnZhbHVlLmtpbmQgPT09ICdFJykge1xuXHQgICAgICAgICAgcSA9IFtdO1xuXHQgICAgICAgICAgcS5wdXNoKG5vdGlmaWNhdGlvbik7XG5cdCAgICAgICAgICBleGNlcHRpb24gPSBub3RpZmljYXRpb24udmFsdWUuZXJyb3I7XG5cdCAgICAgICAgICBzaG91bGRSdW4gPSAhcnVubmluZztcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgcS5wdXNoKHsgdmFsdWU6IG5vdGlmaWNhdGlvbi52YWx1ZSwgdGltZXN0YW1wOiBub3RpZmljYXRpb24udGltZXN0YW1wICsgZHVlVGltZSB9KTtcblx0ICAgICAgICAgIHNob3VsZFJ1biA9ICFhY3RpdmU7XG5cdCAgICAgICAgICBhY3RpdmUgPSB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoc2hvdWxkUnVuKSB7XG5cdCAgICAgICAgICBpZiAoZXhjZXB0aW9uICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIG8ub25FcnJvcihleGNlcHRpb24pO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICAgICAgICBjYW5jZWxhYmxlLnNldERpc3Bvc2FibGUoZCk7XG5cdCAgICAgICAgICAgIGQuc2V0RGlzcG9zYWJsZShzY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmVGdXR1cmUobnVsbCwgZHVlVGltZSwgZnVuY3Rpb24gKF8sIHNlbGYpIHtcblx0ICAgICAgICAgICAgICB2YXIgZSwgcmVjdXJzZUR1ZVRpbWUsIHJlc3VsdCwgc2hvdWxkUmVjdXJzZTtcblx0ICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuXHQgICAgICAgICAgICAgIGRvIHtcblx0ICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICBpZiAocS5sZW5ndGggPiAwICYmIHFbMF0udGltZXN0YW1wIC0gc2NoZWR1bGVyLm5vdygpIDw9IDApIHtcblx0ICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcS5zaGlmdCgpLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICByZXN1bHQuYWNjZXB0KG8pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgIH0gd2hpbGUgKHJlc3VsdCAhPT0gbnVsbCk7XG5cdCAgICAgICAgICAgICAgc2hvdWxkUmVjdXJzZSA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgIHJlY3Vyc2VEdWVUaW1lID0gMDtcblx0ICAgICAgICAgICAgICBpZiAocS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICBzaG91bGRSZWN1cnNlID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHJlY3Vyc2VEdWVUaW1lID0gTWF0aC5tYXgoMCwgcVswXS50aW1lc3RhbXAgLSBzY2hlZHVsZXIubm93KCkpO1xuXHQgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBhY3RpdmUgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgZSA9IGV4Y2VwdGlvbjtcblx0ICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgaWYgKGUgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIG8ub25FcnJvcihlKTtcblx0ICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNob3VsZFJlY3Vyc2UpIHtcblx0ICAgICAgICAgICAgICAgIHNlbGYobnVsbCwgcmVjdXJzZUR1ZVRpbWUpO1xuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSkpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUpO1xuXHQgICAgfSwgc291cmNlKTtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIG9ic2VydmFibGVEZWxheUFic29sdXRlKHNvdXJjZSwgZHVlVGltZSwgc2NoZWR1bGVyKSB7XG5cdCAgICByZXR1cm4gb2JzZXJ2YWJsZURlZmVyKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIG9ic2VydmFibGVEZWxheVJlbGF0aXZlKHNvdXJjZSwgZHVlVGltZSAtIHNjaGVkdWxlci5ub3coKSwgc2NoZWR1bGVyKTtcblx0ICAgIH0pO1xuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gZGVsYXlXaXRoU2VsZWN0b3Ioc291cmNlLCBzdWJzY3JpcHRpb25EZWxheSwgZGVsYXlEdXJhdGlvblNlbGVjdG9yKSB7XG5cdCAgICB2YXIgc3ViRGVsYXksIHNlbGVjdG9yO1xuXHQgICAgaWYgKGlzRnVuY3Rpb24oc3Vic2NyaXB0aW9uRGVsYXkpKSB7XG5cdCAgICAgIHNlbGVjdG9yID0gc3Vic2NyaXB0aW9uRGVsYXk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBzdWJEZWxheSA9IHN1YnNjcmlwdGlvbkRlbGF5O1xuXHQgICAgICBzZWxlY3RvciA9IGRlbGF5RHVyYXRpb25TZWxlY3Rvcjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgZGVsYXlzID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKSwgYXRFbmQgPSBmYWxzZSwgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKTtcblx0XG5cdCAgICAgIGZ1bmN0aW9uIHN0YXJ0KCkge1xuXHQgICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoXG5cdCAgICAgICAgICBmdW5jdGlvbiAoeCkge1xuXHQgICAgICAgICAgICB2YXIgZGVsYXkgPSB0cnlDYXRjaChzZWxlY3RvcikoeCk7XG5cdCAgICAgICAgICAgIGlmIChkZWxheSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihkZWxheS5lKTsgfVxuXHQgICAgICAgICAgICB2YXIgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICAgICAgICBkZWxheXMuYWRkKGQpO1xuXHQgICAgICAgICAgICBkLnNldERpc3Bvc2FibGUoZGVsYXkuc3Vic2NyaWJlKFxuXHQgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIG8ub25OZXh0KHgpO1xuXHQgICAgICAgICAgICAgICAgZGVsYXlzLnJlbW92ZShkKTtcblx0ICAgICAgICAgICAgICAgIGRvbmUoKTtcblx0ICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcblx0ICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICBvLm9uTmV4dCh4KTtcblx0ICAgICAgICAgICAgICAgIGRlbGF5cy5yZW1vdmUoZCk7XG5cdCAgICAgICAgICAgICAgICBkb25lKCk7XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICApKTtcblx0ICAgICAgICAgIH0sXG5cdCAgICAgICAgICBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sXG5cdCAgICAgICAgICBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGF0RW5kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcblx0ICAgICAgICAgICAgZG9uZSgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICkpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBmdW5jdGlvbiBkb25lICgpIHtcblx0ICAgICAgICBhdEVuZCAmJiBkZWxheXMubGVuZ3RoID09PSAwICYmIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgaWYgKCFzdWJEZWxheSkge1xuXHQgICAgICAgIHN0YXJ0KCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUoc3ViRGVsYXkuc3Vic2NyaWJlKHN0YXJ0LCBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sIHN0YXJ0KSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIGRlbGF5cyk7XG5cdCAgICB9LCB0aGlzKTtcblx0ICB9XG5cdFxuXHQgIC8qKlxuXHQgICAqICBUaW1lIHNoaWZ0cyB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSBkdWVUaW1lLlxuXHQgICAqICBUaGUgcmVsYXRpdmUgdGltZSBpbnRlcnZhbHMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBwcmVzZXJ2ZWQuXG5cdCAgICpcblx0ICAgKiBAcGFyYW0ge051bWJlcn0gZHVlVGltZSBBYnNvbHV0ZSAoc3BlY2lmaWVkIGFzIGEgRGF0ZSBvYmplY3QpIG9yIHJlbGF0aXZlIHRpbWUgKHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGRlbm90aW5nIG1pbGxpc2Vjb25kcykgYnkgd2hpY2ggdG8gc2hpZnQgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG5cdCAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBydW4gdGhlIGRlbGF5IHRpbWVycyBvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHRpbWVvdXQgc2NoZWR1bGVyIGlzIHVzZWQuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IFRpbWUtc2hpZnRlZCBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uZGVsYXkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgZmlyc3RBcmcgPSBhcmd1bWVudHNbMF07XG5cdCAgICBpZiAodHlwZW9mIGZpcnN0QXJnID09PSAnbnVtYmVyJyB8fCBmaXJzdEFyZyBpbnN0YW5jZW9mIERhdGUpIHtcblx0ICAgICAgdmFyIGR1ZVRpbWUgPSBmaXJzdEFyZywgc2NoZWR1bGVyID0gYXJndW1lbnRzWzFdO1xuXHQgICAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcblx0ICAgICAgcmV0dXJuIGR1ZVRpbWUgaW5zdGFuY2VvZiBEYXRlID9cblx0ICAgICAgICBvYnNlcnZhYmxlRGVsYXlBYnNvbHV0ZSh0aGlzLCBkdWVUaW1lLCBzY2hlZHVsZXIpIDpcblx0ICAgICAgICBvYnNlcnZhYmxlRGVsYXlSZWxhdGl2ZSh0aGlzLCBkdWVUaW1lLCBzY2hlZHVsZXIpO1xuXHQgICAgfSBlbHNlIGlmIChPYnNlcnZhYmxlLmlzT2JzZXJ2YWJsZShmaXJzdEFyZykgfHwgaXNGdW5jdGlvbihmaXJzdEFyZykpIHtcblx0ICAgICAgcmV0dXJuIGRlbGF5V2l0aFNlbGVjdG9yKHRoaXMsIGZpcnN0QXJnLCBhcmd1bWVudHNbMV0pO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cycpO1xuXHQgICAgfVxuXHQgIH07XG5cdFxuXHQgIHZhciBEZWJvdW5jZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoRGVib3VuY2VPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gRGVib3VuY2VPYnNlcnZhYmxlKHNvdXJjZSwgZHQsIHMpIHtcblx0ICAgICAgaXNTY2hlZHVsZXIocykgfHwgKHMgPSBkZWZhdWx0U2NoZWR1bGVyKTtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuX2R0ID0gZHQ7XG5cdCAgICAgIHRoaXMuX3MgPSBzO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBEZWJvdW5jZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgY2FuY2VsYWJsZSA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShcblx0ICAgICAgICB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IERlYm91bmNlT2JzZXJ2ZXIobywgdGhpcy5zb3VyY2UsIHRoaXMuX2R0LCB0aGlzLl9zLCBjYW5jZWxhYmxlKSksXG5cdCAgICAgICAgY2FuY2VsYWJsZSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBEZWJvdW5jZU9ic2VydmFibGU7XG5cdCAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXHRcblx0ICB2YXIgRGVib3VuY2VPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhEZWJvdW5jZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gRGVib3VuY2VPYnNlcnZlcihvYnNlcnZlciwgc291cmNlLCBkdWVUaW1lLCBzY2hlZHVsZXIsIGNhbmNlbGFibGUpIHtcblx0ICAgICAgdGhpcy5fbyA9IG9ic2VydmVyO1xuXHQgICAgICB0aGlzLl9zID0gc291cmNlO1xuXHQgICAgICB0aGlzLl9kID0gZHVlVGltZTtcblx0ICAgICAgdGhpcy5fc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHQgICAgICB0aGlzLl9jID0gY2FuY2VsYWJsZTtcblx0ICAgICAgdGhpcy5fdiA9IG51bGw7XG5cdCAgICAgIHRoaXMuX2h2ID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuX2lkID0gMDtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgRGVib3VuY2VPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHRoaXMuX2h2ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fdiA9IHg7XG5cdCAgICAgIHZhciBjdXJyZW50SWQgPSArK3RoaXMuX2lkLCBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cdCAgICAgIHRoaXMuX2Muc2V0RGlzcG9zYWJsZShkKTtcblx0ICAgICAgZC5zZXREaXNwb3NhYmxlKHRoaXMuX3NjaGVkdWxlci5zY2hlZHVsZUZ1dHVyZSh0aGlzLCB0aGlzLl9kLCBmdW5jdGlvbiAoXywgc2VsZikge1xuXHQgICAgICAgIHNlbGYuX2h2ICYmIHNlbGYuX2lkID09PSBjdXJyZW50SWQgJiYgc2VsZi5fby5vbk5leHQoeCk7XG5cdCAgICAgICAgc2VsZi5faHYgPSBmYWxzZTtcblx0ICAgICAgfSkpO1xuXHQgICAgfTtcblx0XG5cdCAgICBEZWJvdW5jZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHRoaXMuX2MuZGlzcG9zZSgpO1xuXHQgICAgICB0aGlzLl9vLm9uRXJyb3IoZSk7XG5cdCAgICAgIHRoaXMuX2h2ID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuX2lkKys7XG5cdCAgICB9O1xuXHRcblx0ICAgIERlYm91bmNlT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5fYy5kaXNwb3NlKCk7XG5cdCAgICAgIHRoaXMuX2h2ICYmIHRoaXMuX28ub25OZXh0KHRoaXMuX3YpO1xuXHQgICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIHRoaXMuX2h2ID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuX2lkKys7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBEZWJvdW5jZU9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICBmdW5jdGlvbiBkZWJvdW5jZVdpdGhTZWxlY3Rvcihzb3VyY2UsIGR1cmF0aW9uU2VsZWN0b3IpIHtcblx0ICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgdmFsdWUsIGhhc1ZhbHVlID0gZmFsc2UsIGNhbmNlbGFibGUgPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpLCBpZCA9IDA7XG5cdCAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBzb3VyY2Uuc3Vic2NyaWJlKFxuXHQgICAgICAgIGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgICAgICB2YXIgdGhyb3R0bGUgPSB0cnlDYXRjaChkdXJhdGlvblNlbGVjdG9yKSh4KTtcblx0ICAgICAgICAgIGlmICh0aHJvdHRsZSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcih0aHJvdHRsZS5lKTsgfVxuXHRcblx0ICAgICAgICAgIGlzUHJvbWlzZSh0aHJvdHRsZSkgJiYgKHRocm90dGxlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHRocm90dGxlKSk7XG5cdFxuXHQgICAgICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuXHQgICAgICAgICAgdmFsdWUgPSB4O1xuXHQgICAgICAgICAgaWQrKztcblx0ICAgICAgICAgIHZhciBjdXJyZW50aWQgPSBpZCwgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHQgICAgICAgICAgY2FuY2VsYWJsZS5zZXREaXNwb3NhYmxlKGQpO1xuXHQgICAgICAgICAgZC5zZXREaXNwb3NhYmxlKHRocm90dGxlLnN1YnNjcmliZShcblx0ICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgIGhhc1ZhbHVlICYmIGlkID09PSBjdXJyZW50aWQgJiYgby5vbk5leHQodmFsdWUpO1xuXHQgICAgICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgZC5kaXNwb3NlKCk7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcblx0ICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgIGhhc1ZhbHVlICYmIGlkID09PSBjdXJyZW50aWQgJiYgby5vbk5leHQodmFsdWUpO1xuXHQgICAgICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgZC5kaXNwb3NlKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICkpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIGNhbmNlbGFibGUuZGlzcG9zZSgpO1xuXHQgICAgICAgICAgby5vbkVycm9yKGUpO1xuXHQgICAgICAgICAgaGFzVmFsdWUgPSBmYWxzZTtcblx0ICAgICAgICAgIGlkKys7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICBjYW5jZWxhYmxlLmRpc3Bvc2UoKTtcblx0ICAgICAgICAgIGhhc1ZhbHVlICYmIG8ub25OZXh0KHZhbHVlKTtcblx0ICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG5cdCAgICAgICAgICBpZCsrO1xuXHQgICAgICAgIH1cblx0ICAgICAgKTtcblx0ICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbiwgY2FuY2VsYWJsZSk7XG5cdCAgICB9LCBzb3VyY2UpO1xuXHQgIH1cblx0XG5cdCAgb2JzZXJ2YWJsZVByb3RvLmRlYm91bmNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKGlzRnVuY3Rpb24gKGFyZ3VtZW50c1swXSkpIHtcblx0ICAgICAgcmV0dXJuIGRlYm91bmNlV2l0aFNlbGVjdG9yKHRoaXMsIGFyZ3VtZW50c1swXSk7XG5cdCAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdudW1iZXInKSB7XG5cdCAgICAgIHJldHVybiBuZXcgRGVib3VuY2VPYnNlcnZhYmxlKHRoaXMsIGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMnKTtcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICB2YXIgVGltZXN0YW1wT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhUaW1lc3RhbXBPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gVGltZXN0YW1wT2JzZXJ2YWJsZShzb3VyY2UsIHMpIHtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICAgIHRoaXMuX3MgPSBzO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBUaW1lc3RhbXBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgVGltZXN0YW1wT2JzZXJ2ZXIobywgdGhpcy5fcykpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gVGltZXN0YW1wT2JzZXJ2YWJsZTtcblx0ICB9KE9ic2VydmFibGVCYXNlKSk7XG5cdFxuXHQgIHZhciBUaW1lc3RhbXBPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhUaW1lc3RhbXBPYnNlcnZlciwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIFRpbWVzdGFtcE9ic2VydmVyKG8sIHMpIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX3MgPSBzO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBUaW1lc3RhbXBPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgIHRoaXMuX28ub25OZXh0KHsgdmFsdWU6IHgsIHRpbWVzdGFtcDogdGhpcy5fcy5ub3coKSB9KTtcblx0ICAgIH07XG5cdFxuXHQgICAgVGltZXN0YW1wT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBUaW1lc3RhbXBPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBUaW1lc3RhbXBPYnNlcnZlcjtcblx0ICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJlY29yZHMgdGhlIHRpbWVzdGFtcCBmb3IgZWFjaCB2YWx1ZSBpbiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuXHQgICAqXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiAgMSAtIHJlcyA9IHNvdXJjZS50aW1lc3RhbXAoKTsgLy8gcHJvZHVjZXMgeyB2YWx1ZTogeCwgdGltZXN0YW1wOiB0cyB9XG5cdCAgICogIDIgLSByZXMgPSBzb3VyY2UudGltZXN0YW1wKFJ4LlNjaGVkdWxlci5kZWZhdWx0KTtcblx0ICAgKlxuXHQgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSAgU2NoZWR1bGVyIHVzZWQgdG8gY29tcHV0ZSB0aW1lc3RhbXBzLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBzY2hlZHVsZXIgaXMgdXNlZC5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIHRpbWVzdGFtcCBpbmZvcm1hdGlvbiBvbiB2YWx1ZXMuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnRpbWVzdGFtcCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIpIHtcblx0ICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGRlZmF1bHRTY2hlZHVsZXIpO1xuXHQgICAgcmV0dXJuIG5ldyBUaW1lc3RhbXBPYnNlcnZhYmxlKHRoaXMsIHNjaGVkdWxlcik7XG5cdCAgfTtcblx0XG5cdCAgZnVuY3Rpb24gc2FtcGxlT2JzZXJ2YWJsZShzb3VyY2UsIHNhbXBsZXIpIHtcblx0ICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgYXRFbmQgPSBmYWxzZSwgdmFsdWUsIGhhc1ZhbHVlID0gZmFsc2U7XG5cdFxuXHQgICAgICBmdW5jdGlvbiBzYW1wbGVTdWJzY3JpYmUoKSB7XG5cdCAgICAgICAgaWYgKGhhc1ZhbHVlKSB7XG5cdCAgICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlO1xuXHQgICAgICAgICAgby5vbk5leHQodmFsdWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBhdEVuZCAmJiBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHZhciBzb3VyY2VTdWJzY3JpcHRpb24gPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgICAgc291cmNlU3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUoc291cmNlLnN1YnNjcmliZShcblx0ICAgICAgICBmdW5jdGlvbiAobmV3VmFsdWUpIHtcblx0ICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcblx0ICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sXG5cdCAgICAgICAgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgYXRFbmQgPSB0cnVlO1xuXHQgICAgICAgICAgc291cmNlU3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICkpO1xuXHRcblx0ICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKFxuXHQgICAgICAgIHNvdXJjZVN1YnNjcmlwdGlvbixcblx0ICAgICAgICBzYW1wbGVyLnN1YnNjcmliZShzYW1wbGVTdWJzY3JpYmUsIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSwgc2FtcGxlU3Vic2NyaWJlKVxuXHQgICAgICApO1xuXHQgICAgfSwgc291cmNlKTtcblx0ICB9XG5cdFxuXHQgIC8qKlxuXHQgICAqICBTYW1wbGVzIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGF0IGVhY2ggaW50ZXJ2YWwuXG5cdCAgICpcblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqICAxIC0gcmVzID0gc291cmNlLnNhbXBsZShzYW1wbGVPYnNlcnZhYmxlKTsgLy8gU2FtcGxlciB0aWNrIHNlcXVlbmNlXG5cdCAgICogIDIgLSByZXMgPSBzb3VyY2Uuc2FtcGxlKDUwMDApOyAvLyA1IHNlY29uZHNcblx0ICAgKiAgMiAtIHJlcyA9IHNvdXJjZS5zYW1wbGUoNTAwMCwgUnguU2NoZWR1bGVyLnRpbWVvdXQpOyAvLyA1IHNlY29uZHNcblx0ICAgKlxuXHQgICAqIEBwYXJhbSB7TWl4ZWR9IGludGVydmFsT3JTYW1wbGVyIEludGVydmFsIGF0IHdoaWNoIHRvIHNhbXBsZSAoc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgZGVub3RpbmcgbWlsbGlzZWNvbmRzKSBvciBTYW1wbGVyIE9ic2VydmFibGUuXG5cdCAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdICBTY2hlZHVsZXIgdG8gcnVuIHRoZSBzYW1wbGluZyB0aW1lciBvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHRpbWVvdXQgc2NoZWR1bGVyIGlzIHVzZWQuXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IFNhbXBsZWQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8uc2FtcGxlID0gb2JzZXJ2YWJsZVByb3RvLnRocm90dGxlTGF0ZXN0ID0gZnVuY3Rpb24gKGludGVydmFsT3JTYW1wbGVyLCBzY2hlZHVsZXIpIHtcblx0ICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGRlZmF1bHRTY2hlZHVsZXIpO1xuXHQgICAgcmV0dXJuIHR5cGVvZiBpbnRlcnZhbE9yU2FtcGxlciA9PT0gJ251bWJlcicgP1xuXHQgICAgICBzYW1wbGVPYnNlcnZhYmxlKHRoaXMsIG9ic2VydmFibGVpbnRlcnZhbChpbnRlcnZhbE9yU2FtcGxlciwgc2NoZWR1bGVyKSkgOlxuXHQgICAgICBzYW1wbGVPYnNlcnZhYmxlKHRoaXMsIGludGVydmFsT3JTYW1wbGVyKTtcblx0ICB9O1xuXHRcblx0ICB2YXIgVGltZW91dEVycm9yID0gUnguVGltZW91dEVycm9yID0gZnVuY3Rpb24obWVzc2FnZSkge1xuXHQgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGltZW91dCBoYXMgb2NjdXJyZWQnO1xuXHQgICAgdGhpcy5uYW1lID0gJ1RpbWVvdXRFcnJvcic7XG5cdCAgICBFcnJvci5jYWxsKHRoaXMpO1xuXHQgIH07XG5cdCAgVGltZW91dEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcblx0XG5cdCAgZnVuY3Rpb24gdGltZW91dFdpdGhTZWxlY3Rvcihzb3VyY2UsIGZpcnN0VGltZW91dCwgdGltZW91dER1cmF0aW9uU2VsZWN0b3IsIG90aGVyKSB7XG5cdCAgICBpZiAoaXNGdW5jdGlvbihmaXJzdFRpbWVvdXQpKSB7XG5cdCAgICAgIG90aGVyID0gdGltZW91dER1cmF0aW9uU2VsZWN0b3I7XG5cdCAgICAgIHRpbWVvdXREdXJhdGlvblNlbGVjdG9yID0gZmlyc3RUaW1lb3V0O1xuXHQgICAgICBmaXJzdFRpbWVvdXQgPSBvYnNlcnZhYmxlTmV2ZXIoKTtcblx0ICAgIH1cblx0ICAgIG90aGVyIHx8IChvdGhlciA9IG9ic2VydmFibGVUaHJvdyhuZXcgVGltZW91dEVycm9yKCkpKTtcblx0ICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuXHQgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKSxcblx0ICAgICAgICB0aW1lciA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksXG5cdCAgICAgICAgb3JpZ2luYWwgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0XG5cdCAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG9yaWdpbmFsKTtcblx0XG5cdCAgICAgIHZhciBpZCA9IDAsIHN3aXRjaGVkID0gZmFsc2U7XG5cdFxuXHQgICAgICBmdW5jdGlvbiBzZXRUaW1lcih0aW1lb3V0KSB7XG5cdCAgICAgICAgdmFyIG15SWQgPSBpZCwgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXHRcblx0ICAgICAgICBmdW5jdGlvbiB0aW1lcldpbnMoKSB7XG5cdCAgICAgICAgICBzd2l0Y2hlZCA9IChteUlkID09PSBpZCk7XG5cdCAgICAgICAgICByZXR1cm4gc3dpdGNoZWQ7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aW1lci5zZXREaXNwb3NhYmxlKGQpO1xuXHQgICAgICAgIGQuc2V0RGlzcG9zYWJsZSh0aW1lb3V0LnN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICB0aW1lcldpbnMoKSAmJiBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShvdGhlci5zdWJzY3JpYmUobykpO1xuXHQgICAgICAgICAgZC5kaXNwb3NlKCk7XG5cdCAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIHRpbWVyV2lucygpICYmIG8ub25FcnJvcihlKTtcblx0ICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICB0aW1lcldpbnMoKSAmJiBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShvdGhlci5zdWJzY3JpYmUobykpO1xuXHQgICAgICAgIH0pKTtcblx0ICAgICAgfTtcblx0XG5cdCAgICAgIHNldFRpbWVyKGZpcnN0VGltZW91dCk7XG5cdFxuXHQgICAgICBmdW5jdGlvbiBvV2lucygpIHtcblx0ICAgICAgICB2YXIgcmVzID0gIXN3aXRjaGVkO1xuXHQgICAgICAgIGlmIChyZXMpIHsgaWQrKzsgfVxuXHQgICAgICAgIHJldHVybiByZXM7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIG9yaWdpbmFsLnNldERpc3Bvc2FibGUoc291cmNlLnN1YnNjcmliZShmdW5jdGlvbiAoeCkge1xuXHQgICAgICAgIGlmIChvV2lucygpKSB7XG5cdCAgICAgICAgICBvLm9uTmV4dCh4KTtcblx0ICAgICAgICAgIHZhciB0aW1lb3V0ID0gdHJ5Q2F0Y2godGltZW91dER1cmF0aW9uU2VsZWN0b3IpKHgpO1xuXHQgICAgICAgICAgaWYgKHRpbWVvdXQgPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IodGltZW91dC5lKTsgfVxuXHQgICAgICAgICAgc2V0VGltZXIoaXNQcm9taXNlKHRpbWVvdXQpID8gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHRpbWVvdXQpIDogdGltZW91dCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgIG9XaW5zKCkgJiYgby5vbkVycm9yKGUpO1xuXHQgICAgICB9LCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgb1dpbnMoKSAmJiBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH0pKTtcblx0ICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbiwgdGltZXIpO1xuXHQgICAgfSwgc291cmNlKTtcblx0ICB9XG5cdFxuXHQgIGZ1bmN0aW9uIHRpbWVvdXQoc291cmNlLCBkdWVUaW1lLCBvdGhlciwgc2NoZWR1bGVyKSB7XG5cdCAgICBpZiAoaXNTY2hlZHVsZXIob3RoZXIpKSB7XG5cdCAgICAgIHNjaGVkdWxlciA9IG90aGVyO1xuXHQgICAgICBvdGhlciA9IG9ic2VydmFibGVUaHJvdyhuZXcgVGltZW91dEVycm9yKCkpO1xuXHQgICAgfVxuXHQgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgRXJyb3IpIHsgb3RoZXIgPSBvYnNlcnZhYmxlVGhyb3cob3RoZXIpOyB9XG5cdCAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcblx0XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGlkID0gMCxcblx0ICAgICAgICBvcmlnaW5hbCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpLFxuXHQgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksXG5cdCAgICAgICAgc3dpdGNoZWQgPSBmYWxzZSxcblx0ICAgICAgICB0aW1lciA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG5cdFxuXHQgICAgICBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShvcmlnaW5hbCk7XG5cdFxuXHQgICAgICBmdW5jdGlvbiBjcmVhdGVUaW1lcigpIHtcblx0ICAgICAgICB2YXIgbXlJZCA9IGlkO1xuXHQgICAgICAgIHRpbWVyLnNldERpc3Bvc2FibGUoc2NoZWR1bGVyLnNjaGVkdWxlRnV0dXJlKG51bGwsIGR1ZVRpbWUsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHN3aXRjaGVkID0gaWQgPT09IG15SWQ7XG5cdCAgICAgICAgICBpZiAoc3dpdGNoZWQpIHtcblx0ICAgICAgICAgICAgaXNQcm9taXNlKG90aGVyKSAmJiAob3RoZXIgPSBvYnNlcnZhYmxlRnJvbVByb21pc2Uob3RoZXIpKTtcblx0ICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUob3RoZXIuc3Vic2NyaWJlKG8pKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGNyZWF0ZVRpbWVyKCk7XG5cdFxuXHQgICAgICBvcmlnaW5hbC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgICBpZiAoIXN3aXRjaGVkKSB7XG5cdCAgICAgICAgICBpZCsrO1xuXHQgICAgICAgICAgby5vbk5leHQoeCk7XG5cdCAgICAgICAgICBjcmVhdGVUaW1lcigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSwgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBpZiAoIXN3aXRjaGVkKSB7XG5cdCAgICAgICAgICBpZCsrO1xuXHQgICAgICAgICAgby5vbkVycm9yKGUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICghc3dpdGNoZWQpIHtcblx0ICAgICAgICAgIGlkKys7XG5cdCAgICAgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KSk7XG5cdCAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIHRpbWVyKTtcblx0ICAgIH0sIHNvdXJjZSk7XG5cdCAgfVxuXHRcblx0ICBvYnNlcnZhYmxlUHJvdG8udGltZW91dCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBmaXJzdEFyZyA9IGFyZ3VtZW50c1swXTtcblx0ICAgIGlmIChmaXJzdEFyZyBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIGZpcnN0QXJnID09PSAnbnVtYmVyJykge1xuXHQgICAgICByZXR1cm4gdGltZW91dCh0aGlzLCBmaXJzdEFyZywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuXHQgICAgfSBlbHNlIGlmIChPYnNlcnZhYmxlLmlzT2JzZXJ2YWJsZShmaXJzdEFyZykgfHwgaXNGdW5jdGlvbihmaXJzdEFyZykpIHtcblx0ICAgICAgcmV0dXJuIHRpbWVvdXRXaXRoU2VsZWN0b3IodGhpcywgZmlyc3RBcmcsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMnKTtcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBvbmx5IHRoZSBmaXJzdCBpdGVtIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGR1cmluZyBzZXF1ZW50aWFsIHRpbWUgd2luZG93cyBvZiBhIHNwZWNpZmllZCBkdXJhdGlvbi5cblx0ICAgKiBAcGFyYW0ge051bWJlcn0gd2luZG93RHVyYXRpb24gdGltZSB0byB3YWl0IGJlZm9yZSBlbWl0dGluZyBhbm90aGVyIGl0ZW0gYWZ0ZXIgZW1pdHRpbmcgdGhlIGxhc3QgaXRlbVxuXHQgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSB0aGUgU2NoZWR1bGVyIHRvIHVzZSBpbnRlcm5hbGx5IHRvIG1hbmFnZSB0aGUgdGltZXJzIHRoYXQgaGFuZGxlIHRpbWVvdXQgZm9yIGVhY2ggaXRlbS4gSWYgbm90IHByb3ZpZGVkLCBkZWZhdWx0cyB0byBTY2hlZHVsZXIudGltZW91dC5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSB0aGF0IHBlcmZvcm1zIHRoZSB0aHJvdHRsZSBvcGVyYXRpb24uXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLnRocm90dGxlID0gZnVuY3Rpb24gKHdpbmRvd0R1cmF0aW9uLCBzY2hlZHVsZXIpIHtcblx0ICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGRlZmF1bHRTY2hlZHVsZXIpO1xuXHQgICAgdmFyIGR1cmF0aW9uID0gK3dpbmRvd0R1cmF0aW9uIHx8IDA7XG5cdCAgICBpZiAoZHVyYXRpb24gPD0gMCkgeyB0aHJvdyBuZXcgUmFuZ2VFcnJvcignd2luZG93RHVyYXRpb24gY2Fubm90IGJlIGxlc3Mgb3IgZXF1YWwgemVyby4nKTsgfVxuXHQgICAgdmFyIHNvdXJjZSA9IHRoaXM7XG5cdCAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGxhc3RPbk5leHQgPSAwO1xuXHQgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShcblx0ICAgICAgICBmdW5jdGlvbiAoeCkge1xuXHQgICAgICAgICAgdmFyIG5vdyA9IHNjaGVkdWxlci5ub3coKTtcblx0ICAgICAgICAgIGlmIChsYXN0T25OZXh0ID09PSAwIHx8IG5vdyAtIGxhc3RPbk5leHQgPj0gZHVyYXRpb24pIHtcblx0ICAgICAgICAgICAgbGFzdE9uTmV4dCA9IG5vdztcblx0ICAgICAgICAgICAgby5vbk5leHQoeCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSxmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sIGZ1bmN0aW9uICgpIHsgby5vbkNvbXBsZXRlZCgpOyB9XG5cdCAgICAgICk7XG5cdCAgICB9LCBzb3VyY2UpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBQYXVzYWJsZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoUGF1c2FibGVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gUGF1c2FibGVPYnNlcnZhYmxlKHNvdXJjZSwgcGF1c2VyKSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgU3ViamVjdCgpO1xuXHRcblx0ICAgICAgaWYgKHBhdXNlciAmJiBwYXVzZXIuc3Vic2NyaWJlKSB7XG5cdCAgICAgICAgdGhpcy5wYXVzZXIgPSB0aGlzLmNvbnRyb2xsZXIubWVyZ2UocGF1c2VyKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLnBhdXNlciA9IHRoaXMuY29udHJvbGxlcjtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICB9XG5cdFxuXHQgICAgUGF1c2FibGVPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGNvbm4gPSB0aGlzLnNvdXJjZS5wdWJsaXNoKCksXG5cdCAgICAgICAgc3Vic2NyaXB0aW9uID0gY29ubi5zdWJzY3JpYmUobyksXG5cdCAgICAgICAgY29ubmVjdGlvbiA9IGRpc3Bvc2FibGVFbXB0eTtcblx0XG5cdCAgICAgIHZhciBwYXVzYWJsZSA9IHRoaXMucGF1c2VyLmRpc3RpbmN0VW50aWxDaGFuZ2VkKCkuc3Vic2NyaWJlKGZ1bmN0aW9uIChiKSB7XG5cdCAgICAgICAgaWYgKGIpIHtcblx0ICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uLmNvbm5lY3QoKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgY29ubmVjdGlvbi5kaXNwb3NlKCk7XG5cdCAgICAgICAgICBjb25uZWN0aW9uID0gZGlzcG9zYWJsZUVtcHR5O1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdFxuXHQgICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKFtzdWJzY3JpcHRpb24sIGNvbm5lY3Rpb24sIHBhdXNhYmxlXSk7XG5cdCAgICB9O1xuXHRcblx0ICAgIFBhdXNhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuY29udHJvbGxlci5vbk5leHQoZmFsc2UpO1xuXHQgICAgfTtcblx0XG5cdCAgICBQYXVzYWJsZU9ic2VydmFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5jb250cm9sbGVyLm9uTmV4dCh0cnVlKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFBhdXNhYmxlT2JzZXJ2YWJsZTtcblx0XG5cdCAgfShPYnNlcnZhYmxlKSk7XG5cdFxuXHQgIC8qKlxuXHQgICAqIFBhdXNlcyB0aGUgdW5kZXJseWluZyBvYnNlcnZhYmxlIHNlcXVlbmNlIGJhc2VkIHVwb24gdGhlIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hpY2ggeWllbGRzIHRydWUvZmFsc2UuXG5cdCAgICogQGV4YW1wbGVcblx0ICAgKiB2YXIgcGF1c2VyID0gbmV3IFJ4LlN1YmplY3QoKTtcblx0ICAgKiB2YXIgc291cmNlID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDApLnBhdXNhYmxlKHBhdXNlcik7XG5cdCAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBwYXVzZXIgVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdXNlZCB0byBwYXVzZSB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hpY2ggaXMgcGF1c2VkIGJhc2VkIHVwb24gdGhlIHBhdXNlci5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ucGF1c2FibGUgPSBmdW5jdGlvbiAocGF1c2VyKSB7XG5cdCAgICByZXR1cm4gbmV3IFBhdXNhYmxlT2JzZXJ2YWJsZSh0aGlzLCBwYXVzZXIpO1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIGNvbWJpbmVMYXRlc3RTb3VyY2Uoc291cmNlLCBzdWJqZWN0LCByZXN1bHRTZWxlY3Rvcikge1xuXHQgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHZhciBoYXNWYWx1ZSA9IFtmYWxzZSwgZmFsc2VdLFxuXHQgICAgICAgIGhhc1ZhbHVlQWxsID0gZmFsc2UsXG5cdCAgICAgICAgaXNEb25lID0gZmFsc2UsXG5cdCAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KDIpLFxuXHQgICAgICAgIGVycjtcblx0XG5cdCAgICAgIGZ1bmN0aW9uIG5leHQoeCwgaSkge1xuXHQgICAgICAgIHZhbHVlc1tpXSA9IHg7XG5cdCAgICAgICAgaGFzVmFsdWVbaV0gPSB0cnVlO1xuXHQgICAgICAgIGlmIChoYXNWYWx1ZUFsbCB8fCAoaGFzVmFsdWVBbGwgPSBoYXNWYWx1ZS5ldmVyeShpZGVudGl0eSkpKSB7XG5cdCAgICAgICAgICBpZiAoZXJyKSB7IHJldHVybiBvLm9uRXJyb3IoZXJyKTsgfVxuXHQgICAgICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHJlc3VsdFNlbGVjdG9yKS5hcHBseShudWxsLCB2YWx1ZXMpO1xuXHQgICAgICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihyZXMuZSk7IH1cblx0ICAgICAgICAgIG8ub25OZXh0KHJlcyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlzRG9uZSAmJiB2YWx1ZXNbMV0gJiYgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoXG5cdCAgICAgICAgc291cmNlLnN1YnNjcmliZShcblx0ICAgICAgICAgIGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgICAgICAgIG5leHQoeCwgMCk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlc1sxXSkge1xuXHQgICAgICAgICAgICAgIG8ub25FcnJvcihlKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICBlcnIgPSBlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBpc0RvbmUgPSB0cnVlO1xuXHQgICAgICAgICAgICB2YWx1ZXNbMV0gJiYgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgICAgfSksXG5cdCAgICAgICAgc3ViamVjdC5zdWJzY3JpYmUoXG5cdCAgICAgICAgICBmdW5jdGlvbiAoeCkge1xuXHQgICAgICAgICAgICBuZXh0KHgsIDEpO1xuXHQgICAgICAgICAgfSxcblx0ICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcblx0ICAgICAgICAgIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaXNEb25lID0gdHJ1ZTtcblx0ICAgICAgICAgICAgbmV4dCh0cnVlLCAxKTtcblx0ICAgICAgICAgIH0pXG5cdCAgICAgICAgKTtcblx0ICAgIH0sIHNvdXJjZSk7XG5cdCAgfVxuXHRcblx0ICB2YXIgUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZShzb3VyY2UsIHBhdXNlcikge1xuXHQgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IFN1YmplY3QoKTtcblx0XG5cdCAgICAgIGlmIChwYXVzZXIgJiYgcGF1c2VyLnN1YnNjcmliZSkge1xuXHQgICAgICAgIHRoaXMucGF1c2VyID0gdGhpcy5jb250cm9sbGVyLm1lcmdlKHBhdXNlcik7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5wYXVzZXIgPSB0aGlzLmNvbnRyb2xsZXI7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFBhdXNhYmxlQnVmZmVyZWRPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIHEgPSBbXSwgcHJldmlvdXNTaG91bGRGaXJlO1xuXHRcblx0ICAgICAgZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHsgd2hpbGUgKHEubGVuZ3RoID4gMCkgeyBvLm9uTmV4dChxLnNoaWZ0KCkpOyB9IH1cblx0XG5cdCAgICAgIHZhciBzdWJzY3JpcHRpb24gPVxuXHQgICAgICAgIGNvbWJpbmVMYXRlc3RTb3VyY2UoXG5cdCAgICAgICAgICB0aGlzLnNvdXJjZSxcblx0ICAgICAgICAgIHRoaXMucGF1c2VyLnN0YXJ0V2l0aChmYWxzZSkuZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcblx0ICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzaG91bGRGaXJlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGRhdGEsIHNob3VsZEZpcmU6IHNob3VsZEZpcmUgfTtcblx0ICAgICAgICAgIH0pXG5cdCAgICAgICAgICAuc3Vic2NyaWJlKFxuXHQgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0cykge1xuXHQgICAgICAgICAgICAgIGlmIChwcmV2aW91c1Nob3VsZEZpcmUgIT09IHVuZGVmaW5lZCAmJiByZXN1bHRzLnNob3VsZEZpcmUgIT09IHByZXZpb3VzU2hvdWxkRmlyZSkge1xuXHQgICAgICAgICAgICAgICAgcHJldmlvdXNTaG91bGRGaXJlID0gcmVzdWx0cy5zaG91bGRGaXJlO1xuXHQgICAgICAgICAgICAgICAgLy8gY2hhbmdlIGluIHNob3VsZEZpcmVcblx0ICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLnNob3VsZEZpcmUpIHsgZHJhaW5RdWV1ZSgpOyB9XG5cdCAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHByZXZpb3VzU2hvdWxkRmlyZSA9IHJlc3VsdHMuc2hvdWxkRmlyZTtcblx0ICAgICAgICAgICAgICAgIC8vIG5ldyBkYXRhXG5cdCAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5zaG91bGRGaXJlKSB7XG5cdCAgICAgICAgICAgICAgICAgIG8ub25OZXh0KHJlc3VsdHMuZGF0YSk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICBxLnB1c2gocmVzdWx0cy5kYXRhKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIChlcnIpIHtcblx0ICAgICAgICAgICAgICBkcmFpblF1ZXVlKCk7XG5cdCAgICAgICAgICAgICAgby5vbkVycm9yKGVycik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICBkcmFpblF1ZXVlKCk7XG5cdCAgICAgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICApO1xuXHQgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOyAgICAgIFxuXHQgICAgfTtcblx0XG5cdCAgICBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuY29udHJvbGxlci5vbk5leHQoZmFsc2UpO1xuXHQgICAgfTtcblx0XG5cdCAgICBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmNvbnRyb2xsZXIub25OZXh0KHRydWUpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGU7XG5cdFxuXHQgIH0oT2JzZXJ2YWJsZSkpO1xuXHRcblx0ICAvKipcblx0ICAgKiBQYXVzZXMgdGhlIHVuZGVybHlpbmcgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBiYXNlZCB1cG9uIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIHlpZWxkcyB0cnVlL2ZhbHNlLFxuXHQgICAqIGFuZCB5aWVsZHMgdGhlIHZhbHVlcyB0aGF0IHdlcmUgYnVmZmVyZWQgd2hpbGUgcGF1c2VkLlxuXHQgICAqIEBleGFtcGxlXG5cdCAgICogdmFyIHBhdXNlciA9IG5ldyBSeC5TdWJqZWN0KCk7XG5cdCAgICogdmFyIHNvdXJjZSA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwKS5wYXVzYWJsZUJ1ZmZlcmVkKHBhdXNlcik7XG5cdCAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBwYXVzZXIgVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdXNlZCB0byBwYXVzZSB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cblx0ICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hpY2ggaXMgcGF1c2VkIGJhc2VkIHVwb24gdGhlIHBhdXNlci5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ucGF1c2FibGVCdWZmZXJlZCA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG5cdCAgICByZXR1cm4gbmV3IFBhdXNhYmxlQnVmZmVyZWRPYnNlcnZhYmxlKHRoaXMsIHN1YmplY3QpO1xuXHQgIH07XG5cdFxuXHQgIHZhciBDb250cm9sbGVkT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhDb250cm9sbGVkT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIENvbnRyb2xsZWRPYnNlcnZhYmxlIChzb3VyY2UsIGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpIHtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICAgIHRoaXMuc3ViamVjdCA9IG5ldyBDb250cm9sbGVkU3ViamVjdChlbmFibGVRdWV1ZSwgc2NoZWR1bGVyKTtcblx0ICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2UubXVsdGljYXN0KHRoaXMuc3ViamVjdCkucmVmQ291bnQoKTtcblx0ICAgIH1cblx0XG5cdCAgICBDb250cm9sbGVkT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIENvbnRyb2xsZWRPYnNlcnZhYmxlLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gKG51bWJlck9mSXRlbXMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuc3ViamVjdC5yZXF1ZXN0KG51bWJlck9mSXRlbXMgPT0gbnVsbCA/IC0xIDogbnVtYmVyT2ZJdGVtcyk7XG5cdCAgICB9O1xuXHRcblx0ICAgIHJldHVybiBDb250cm9sbGVkT2JzZXJ2YWJsZTtcblx0XG5cdCAgfShPYnNlcnZhYmxlKSk7XG5cdFxuXHQgIHZhciBDb250cm9sbGVkU3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhDb250cm9sbGVkU3ViamVjdCwgX19zdXBlcl9fKTtcblx0ICAgIGZ1bmN0aW9uIENvbnRyb2xsZWRTdWJqZWN0KGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpIHtcblx0ICAgICAgZW5hYmxlUXVldWUgPT0gbnVsbCAmJiAoZW5hYmxlUXVldWUgPSB0cnVlKTtcblx0XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgICB0aGlzLnN1YmplY3QgPSBuZXcgU3ViamVjdCgpO1xuXHQgICAgICB0aGlzLmVuYWJsZVF1ZXVlID0gZW5hYmxlUXVldWU7XG5cdCAgICAgIHRoaXMucXVldWUgPSBlbmFibGVRdWV1ZSA/IFtdIDogbnVsbDtcblx0ICAgICAgdGhpcy5yZXF1ZXN0ZWRDb3VudCA9IDA7XG5cdCAgICAgIHRoaXMucmVxdWVzdGVkRGlzcG9zYWJsZSA9IG51bGw7XG5cdCAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXHQgICAgICB0aGlzLmhhc0ZhaWxlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlciB8fCBjdXJyZW50VGhyZWFkU2NoZWR1bGVyO1xuXHQgICAgfVxuXHRcblx0ICAgIGFkZFByb3BlcnRpZXMoQ29udHJvbGxlZFN1YmplY3QucHJvdG90eXBlLCBPYnNlcnZlciwge1xuXHQgICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnN1YmplY3Quc3Vic2NyaWJlKG8pO1xuXHQgICAgICB9LFxuXHQgICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gdHJ1ZTtcblx0ICAgICAgICBpZiAoIXRoaXMuZW5hYmxlUXVldWUgfHwgdGhpcy5xdWV1ZS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgIHRoaXMuc3ViamVjdC5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgICAgdGhpcy5kaXNwb3NlQ3VycmVudFJlcXVlc3QoKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKE5vdGlmaWNhdGlvbi5jcmVhdGVPbkNvbXBsZXRlZCgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgIHRoaXMuaGFzRmFpbGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG5cdCAgICAgICAgaWYgKCF0aGlzLmVuYWJsZVF1ZXVlIHx8IHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICB0aGlzLnN1YmplY3Qub25FcnJvcihlcnJvcik7XG5cdCAgICAgICAgICB0aGlzLmRpc3Bvc2VDdXJyZW50UmVxdWVzdCgpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2goTm90aWZpY2F0aW9uLmNyZWF0ZU9uRXJyb3IoZXJyb3IpKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgaWYgKHRoaXMucmVxdWVzdGVkQ291bnQgPD0gMCkge1xuXHQgICAgICAgICAgdGhpcy5lbmFibGVRdWV1ZSAmJiB0aGlzLnF1ZXVlLnB1c2goTm90aWZpY2F0aW9uLmNyZWF0ZU9uTmV4dCh2YWx1ZSkpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAodGhpcy5yZXF1ZXN0ZWRDb3VudC0tID09PSAwKSAmJiB0aGlzLmRpc3Bvc2VDdXJyZW50UmVxdWVzdCgpO1xuXHQgICAgICAgICAgdGhpcy5zdWJqZWN0Lm9uTmV4dCh2YWx1ZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICBfcHJvY2Vzc1JlcXVlc3Q6IGZ1bmN0aW9uIChudW1iZXJPZkl0ZW1zKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuZW5hYmxlUXVldWUpIHtcblx0ICAgICAgICAgIHdoaWxlICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDAgJiYgKG51bWJlck9mSXRlbXMgPiAwIHx8IHRoaXMucXVldWVbMF0ua2luZCAhPT0gJ04nKSkge1xuXHQgICAgICAgICAgICB2YXIgZmlyc3QgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cdCAgICAgICAgICAgIGZpcnN0LmFjY2VwdCh0aGlzLnN1YmplY3QpO1xuXHQgICAgICAgICAgICBpZiAoZmlyc3Qua2luZCA9PT0gJ04nKSB7XG5cdCAgICAgICAgICAgICAgbnVtYmVyT2ZJdGVtcy0tO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgIHRoaXMuZGlzcG9zZUN1cnJlbnRSZXF1ZXN0KCk7XG5cdCAgICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICByZXR1cm4gbnVtYmVyT2ZJdGVtcztcblx0ICAgICAgfSxcblx0ICAgICAgcmVxdWVzdDogZnVuY3Rpb24gKG51bWJlcikge1xuXHQgICAgICAgIHRoaXMuZGlzcG9zZUN1cnJlbnRSZXF1ZXN0KCk7XG5cdCAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXHRcblx0ICAgICAgICB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUgPSB0aGlzLnNjaGVkdWxlci5zY2hlZHVsZShudW1iZXIsXG5cdCAgICAgICAgZnVuY3Rpb24ocywgaSkge1xuXHQgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IHNlbGYuX3Byb2Nlc3NSZXF1ZXN0KGkpO1xuXHQgICAgICAgICAgdmFyIHN0b3BwZWQgPSBzZWxmLmhhc0NvbXBsZXRlZCB8fCBzZWxmLmhhc0ZhaWxlZDtcblx0ICAgICAgICAgIGlmICghc3RvcHBlZCAmJiByZW1haW5pbmcgPiAwKSB7XG5cdCAgICAgICAgICAgIHNlbGYucmVxdWVzdGVkQ291bnQgPSByZW1haW5pbmc7XG5cdFxuXHQgICAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUNyZWF0ZShmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0ZWRDb3VudCA9IDA7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgIC8vIFNjaGVkdWxlZCBpdGVtIGlzIHN0aWxsIGluIHByb2dyZXNzLiBSZXR1cm4gYSBuZXdcblx0ICAgICAgICAgICAgICAvLyBkaXNwb3NhYmxlIHRvIGFsbG93IHRoZSByZXF1ZXN0IHRvIGJlIGludGVycnVwdGVkXG5cdCAgICAgICAgICAgICAgLy8gdmlhIGRpc3Bvc2UuXG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdFxuXHQgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGU7XG5cdCAgICAgIH0sXG5cdCAgICAgIGRpc3Bvc2VDdXJyZW50UmVxdWVzdDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUpIHtcblx0ICAgICAgICAgIHRoaXMucmVxdWVzdGVkRGlzcG9zYWJsZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgICB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdFxuXHQgICAgcmV0dXJuIENvbnRyb2xsZWRTdWJqZWN0O1xuXHQgIH0oT2JzZXJ2YWJsZSkpO1xuXHRcblx0ICAvKipcblx0ICAgKiBBdHRhY2hlcyBhIGNvbnRyb2xsZXIgdG8gdGhlIG9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCB0aGUgYWJpbGl0eSB0byBxdWV1ZS5cblx0ICAgKiBAZXhhbXBsZVxuXHQgICAqIHZhciBzb3VyY2UgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMCkuY29udHJvbGxlZCgpO1xuXHQgICAqIHNvdXJjZS5yZXF1ZXN0KDMpOyAvLyBSZWFkcyAzIHZhbHVlc1xuXHQgICAqIEBwYXJhbSB7Ym9vbH0gZW5hYmxlUXVldWUgdHJ1dGh5IHZhbHVlIHRvIGRldGVybWluZSBpZiB2YWx1ZXMgc2hvdWxkIGJlIHF1ZXVlZCBwZW5kaW5nIHRoZSBuZXh0IHJlcXVlc3Rcblx0ICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIGRldGVybWluZXMgaG93IHRoZSByZXF1ZXN0cyB3aWxsIGJlIHNjaGVkdWxlZFxuXHQgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aGljaCBvbmx5IHByb3BhZ2F0ZXMgdmFsdWVzIG9uIHJlcXVlc3QuXG5cdCAgICovXG5cdCAgb2JzZXJ2YWJsZVByb3RvLmNvbnRyb2xsZWQgPSBmdW5jdGlvbiAoZW5hYmxlUXVldWUsIHNjaGVkdWxlcikge1xuXHRcblx0ICAgIGlmIChlbmFibGVRdWV1ZSAmJiBpc1NjaGVkdWxlcihlbmFibGVRdWV1ZSkpIHtcblx0ICAgICAgc2NoZWR1bGVyID0gZW5hYmxlUXVldWU7XG5cdCAgICAgIGVuYWJsZVF1ZXVlID0gdHJ1ZTtcblx0ICAgIH1cblx0XG5cdCAgICBpZiAoZW5hYmxlUXVldWUgPT0gbnVsbCkgeyAgZW5hYmxlUXVldWUgPSB0cnVlOyB9XG5cdCAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRPYnNlcnZhYmxlKHRoaXMsIGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpO1xuXHQgIH07XG5cdFxuXHQgIC8qKlxuXHQgICAqIFBpcGVzIHRoZSBleGlzdGluZyBPYnNlcnZhYmxlIHNlcXVlbmNlIGludG8gYSBOb2RlLmpzIFN0cmVhbS5cblx0ICAgKiBAcGFyYW0ge1N0cmVhbX0gZGVzdCBUaGUgZGVzdGluYXRpb24gTm9kZS5qcyBzdHJlYW0uXG5cdCAgICogQHJldHVybnMge1N0cmVhbX0gVGhlIGRlc3RpbmF0aW9uIHN0cmVhbS5cblx0ICAgKi9cblx0ICBvYnNlcnZhYmxlUHJvdG8ucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG5cdCAgICB2YXIgc291cmNlID0gdGhpcy5wYXVzYWJsZUJ1ZmZlcmVkKCk7XG5cdFxuXHQgICAgZnVuY3Rpb24gb25EcmFpbigpIHtcblx0ICAgICAgc291cmNlLnJlc3VtZSgpO1xuXHQgICAgfVxuXHRcblx0ICAgIGRlc3QuYWRkTGlzdGVuZXIoJ2RyYWluJywgb25EcmFpbik7XG5cdFxuXHQgICAgc291cmNlLnN1YnNjcmliZShcblx0ICAgICAgZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgICAhZGVzdC53cml0ZShTdHJpbmcoeCkpICYmIHNvdXJjZS5wYXVzZSgpO1xuXHQgICAgICB9LFxuXHQgICAgICBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVycik7XG5cdCAgICAgIH0sXG5cdCAgICAgIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvLyBIYWNrIGNoZWNrIGJlY2F1c2UgU1RESU8gaXMgbm90IGNsb3NhYmxlXG5cdCAgICAgICAgIWRlc3QuX2lzU3RkaW8gJiYgZGVzdC5lbmQoKTtcblx0ICAgICAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uRHJhaW4pO1xuXHQgICAgICB9KTtcblx0XG5cdCAgICBzb3VyY2UucmVzdW1lKCk7XG5cdFxuXHQgICAgcmV0dXJuIGRlc3Q7XG5cdCAgfTtcblx0XG5cdCAgdmFyIFRyYW5zZHVjZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKFRyYW5zZHVjZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gVHJhbnNkdWNlT2JzZXJ2ZXIobywgeGZvcm0pIHtcblx0ICAgICAgdGhpcy5fbyA9IG87XG5cdCAgICAgIHRoaXMuX3hmb3JtID0geGZvcm07XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIFRyYW5zZHVjZU9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMuX3hmb3JtWydAQHRyYW5zZHVjZXIvc3RlcCddKS5jYWxsKHRoaXMuX3hmb3JtLCB0aGlzLl9vLCB4KTtcblx0ICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuXHQgICAgfTtcblx0XG5cdCAgICBUcmFuc2R1Y2VPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uRXJyb3IoZSk7IH07XG5cdFxuXHQgICAgVHJhbnNkdWNlT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdGhpcy5feGZvcm1bJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSh0aGlzLl9vKTtcblx0ICAgIH07XG5cdFxuXHQgICAgcmV0dXJuIFRyYW5zZHVjZU9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICBmdW5jdGlvbiB0cmFuc2Zvcm1Gb3JPYnNlcnZlcihvKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICAnQEB0cmFuc2R1Y2VyL2luaXQnOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICByZXR1cm4gbztcblx0ICAgICAgfSxcblx0ICAgICAgJ0BAdHJhbnNkdWNlci9zdGVwJzogZnVuY3Rpb24ob2JzLCBpbnB1dCkge1xuXHQgICAgICAgIHJldHVybiBvYnMub25OZXh0KGlucHV0KTtcblx0ICAgICAgfSxcblx0ICAgICAgJ0BAdHJhbnNkdWNlci9yZXN1bHQnOiBmdW5jdGlvbihvYnMpIHtcblx0ICAgICAgICByZXR1cm4gb2JzLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfVxuXHRcblx0ICAvKipcblx0ICAgKiBFeGVjdXRlcyBhIHRyYW5zZHVjZXIgdG8gdHJhbnNmb3JtIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlXG5cdCAgICogQHBhcmFtIHtUcmFuc2R1Y2VyfSB0cmFuc2R1Y2VyIEEgdHJhbnNkdWNlciB0byBleGVjdXRlXG5cdCAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgcmVzdWx0cyBmcm9tIHRoZSB0cmFuc2R1Y2VyLlxuXHQgICAqL1xuXHQgIG9ic2VydmFibGVQcm90by50cmFuc2R1Y2UgPSBmdW5jdGlvbih0cmFuc2R1Y2VyKSB7XG5cdCAgICB2YXIgc291cmNlID0gdGhpcztcblx0ICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbihvKSB7XG5cdCAgICAgIHZhciB4Zm9ybSA9IHRyYW5zZHVjZXIodHJhbnNmb3JtRm9yT2JzZXJ2ZXIobykpO1xuXHQgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgVHJhbnNkdWNlT2JzZXJ2ZXIobywgeGZvcm0pKTtcblx0ICAgIH0sIHNvdXJjZSk7XG5cdCAgfTtcblx0XG5cdCAgdmFyIEFub255bW91c09ic2VydmFibGUgPSBSeC5Bbm9ueW1vdXNPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0ICAgIGluaGVyaXRzKEFub255bW91c09ic2VydmFibGUsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgLy8gRml4IHN1YnNjcmliZXIgdG8gY2hlY2sgZm9yIHVuZGVmaW5lZCBvciBmdW5jdGlvbiByZXR1cm5lZCB0byBkZWNvcmF0ZSBhcyBEaXNwb3NhYmxlXG5cdCAgICBmdW5jdGlvbiBmaXhTdWJzY3JpYmVyKHN1YnNjcmliZXIpIHtcblx0ICAgICAgcmV0dXJuIHN1YnNjcmliZXIgJiYgaXNGdW5jdGlvbihzdWJzY3JpYmVyLmRpc3Bvc2UpID8gc3Vic2NyaWJlciA6XG5cdCAgICAgICAgaXNGdW5jdGlvbihzdWJzY3JpYmVyKSA/IGRpc3Bvc2FibGVDcmVhdGUoc3Vic2NyaWJlcikgOiBkaXNwb3NhYmxlRW1wdHk7XG5cdCAgICB9XG5cdFxuXHQgICAgZnVuY3Rpb24gc2V0RGlzcG9zYWJsZShzLCBzdGF0ZSkge1xuXHQgICAgICB2YXIgYWRvID0gc3RhdGVbMF0sIHNlbGYgPSBzdGF0ZVsxXTtcblx0ICAgICAgdmFyIHN1YiA9IHRyeUNhdGNoKHNlbGYuX19zdWJzY3JpYmUpLmNhbGwoc2VsZiwgYWRvKTtcblx0ICAgICAgaWYgKHN1YiA9PT0gZXJyb3JPYmogJiYgIWFkby5mYWlsKGVycm9yT2JqLmUpKSB7IHRocm93ZXIoZXJyb3JPYmouZSk7IH1cblx0ICAgICAgYWRvLnNldERpc3Bvc2FibGUoZml4U3Vic2NyaWJlcihzdWIpKTtcblx0ICAgIH1cblx0XG5cdCAgICBmdW5jdGlvbiBBbm9ueW1vdXNPYnNlcnZhYmxlKHN1YnNjcmliZSwgcGFyZW50KSB7XG5cdCAgICAgIHRoaXMuc291cmNlID0gcGFyZW50O1xuXHQgICAgICB0aGlzLl9fc3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0XG5cdCAgICBBbm9ueW1vdXNPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgdmFyIGFkbyA9IG5ldyBBdXRvRGV0YWNoT2JzZXJ2ZXIobyksIHN0YXRlID0gW2FkbywgdGhpc107XG5cdFxuXHQgICAgICBpZiAoY3VycmVudFRocmVhZFNjaGVkdWxlci5zY2hlZHVsZVJlcXVpcmVkKCkpIHtcblx0ICAgICAgICBjdXJyZW50VGhyZWFkU2NoZWR1bGVyLnNjaGVkdWxlKHN0YXRlLCBzZXREaXNwb3NhYmxlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBzZXREaXNwb3NhYmxlKG51bGwsIHN0YXRlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYWRvO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gQW5vbnltb3VzT2JzZXJ2YWJsZTtcblx0XG5cdCAgfShPYnNlcnZhYmxlKSk7XG5cdFxuXHQgIHZhciBBdXRvRGV0YWNoT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQXV0b0RldGFjaE9ic2VydmVyLCBfX3N1cGVyX18pO1xuXHRcblx0ICAgIGZ1bmN0aW9uIEF1dG9EZXRhY2hPYnNlcnZlcihvYnNlcnZlcikge1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuXHQgICAgICB0aGlzLm0gPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcblx0ICAgIH1cblx0XG5cdCAgICB2YXIgQXV0b0RldGFjaE9ic2VydmVyUHJvdG90eXBlID0gQXV0b0RldGFjaE9ic2VydmVyLnByb3RvdHlwZTtcblx0XG5cdCAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godGhpcy5vYnNlcnZlci5vbk5leHQpLmNhbGwodGhpcy5vYnNlcnZlciwgdmFsdWUpO1xuXHQgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikge1xuXHQgICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRocm93ZXIocmVzdWx0LmUpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHRcblx0ICAgIEF1dG9EZXRhY2hPYnNlcnZlclByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcblx0ICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMub2JzZXJ2ZXIub25FcnJvcikuY2FsbCh0aGlzLm9ic2VydmVyLCBlcnIpO1xuXHQgICAgICB0aGlzLmRpc3Bvc2UoKTtcblx0ICAgICAgcmVzdWx0ID09PSBlcnJvck9iaiAmJiB0aHJvd2VyKHJlc3VsdC5lKTtcblx0ICAgIH07XG5cdFxuXHQgICAgQXV0b0RldGFjaE9ic2VydmVyUHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMub2JzZXJ2ZXIub25Db21wbGV0ZWQpLmNhbGwodGhpcy5vYnNlcnZlcik7XG5cdCAgICAgIHRoaXMuZGlzcG9zZSgpO1xuXHQgICAgICByZXN1bHQgPT09IGVycm9yT2JqICYmIHRocm93ZXIocmVzdWx0LmUpO1xuXHQgICAgfTtcblx0XG5cdCAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUuc2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyB0aGlzLm0uc2V0RGlzcG9zYWJsZSh2YWx1ZSk7IH07XG5cdCAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUuZ2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubS5nZXREaXNwb3NhYmxlKCk7IH07XG5cdFxuXHQgICAgQXV0b0RldGFjaE9ic2VydmVyUHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIF9fc3VwZXJfXy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICB0aGlzLm0uZGlzcG9zZSgpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gQXV0b0RldGFjaE9ic2VydmVyO1xuXHQgIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXHRcblx0ICB2YXIgSW5uZXJTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAocywgbykge1xuXHQgICAgdGhpcy5fcyA9IHM7XG5cdCAgICB0aGlzLl9vID0gbztcblx0ICB9O1xuXHRcblx0ICBJbm5lclN1YnNjcmlwdGlvbi5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmICghdGhpcy5fcy5pc0Rpc3Bvc2VkICYmIHRoaXMuX28gIT09IG51bGwpIHtcblx0ICAgICAgdmFyIGlkeCA9IHRoaXMuX3Mub2JzZXJ2ZXJzLmluZGV4T2YodGhpcy5fbyk7XG5cdCAgICAgIHRoaXMuX3Mub2JzZXJ2ZXJzLnNwbGljZShpZHgsIDEpO1xuXHQgICAgICB0aGlzLl9vID0gbnVsbDtcblx0ICAgIH1cblx0ICB9O1xuXHRcblx0ICAvKipcblx0ICAgKiAgUmVwcmVzZW50cyBhbiBvYmplY3QgdGhhdCBpcyBib3RoIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgd2VsbCBhcyBhbiBvYnNlcnZlci5cblx0ICAgKiAgRWFjaCBub3RpZmljYXRpb24gaXMgYnJvYWRjYXN0ZWQgdG8gYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzLlxuXHQgICAqL1xuXHQgIHZhciBTdWJqZWN0ID0gUnguU3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhTdWJqZWN0LCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gU3ViamVjdCgpIHtcblx0ICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuXHQgICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7XG5cdCAgICB9XG5cdFxuXHQgICAgYWRkUHJvcGVydGllcyhTdWJqZWN0LnByb3RvdHlwZSwgT2JzZXJ2ZXIucHJvdG90eXBlLCB7XG5cdCAgICAgIF9zdWJzY3JpYmU6IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLm9ic2VydmVycy5wdXNoKG8pO1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBJbm5lclN1YnNjcmlwdGlvbih0aGlzLCBvKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuaGFzRXJyb3IpIHtcblx0ICAgICAgICAgIG8ub25FcnJvcih0aGlzLmVycm9yKTtcblx0ICAgICAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuXHQgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuXHQgICAgICAgKi9cblx0ICAgICAgaGFzT2JzZXJ2ZXJzOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm9ic2VydmVycy5sZW5ndGggPiAwOyB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuXHQgICAgICAgKi9cblx0ICAgICAgb25Db21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXHQgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvcyA9IGNsb25lQXJyYXkodGhpcy5vYnNlcnZlcnMpLCBsZW4gPSBvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICBvc1tpXS5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgICAgfVxuXHRcblx0ICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBleGNlcHRpb24uXG5cdCAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IGVycm9yIFRoZSBleGNlcHRpb24gdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuXHQgICAgICAgKi9cblx0ICAgICAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG5cdCAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcblx0ICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvcyA9IGNsb25lQXJyYXkodGhpcy5vYnNlcnZlcnMpLCBsZW4gPSBvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICBvc1tpXS5vbkVycm9yKGVycm9yKTtcblx0ICAgICAgICAgIH1cblx0XG5cdCAgICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIE5vdGlmaWVzIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycyBhYm91dCB0aGUgYXJyaXZhbCBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLlxuXHQgICAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuXHQgICAgICAgKi9cblx0ICAgICAgb25OZXh0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXHQgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvcyA9IGNsb25lQXJyYXkodGhpcy5vYnNlcnZlcnMpLCBsZW4gPSBvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICBvc1tpXS5vbk5leHQodmFsdWUpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIFVuc3Vic2NyaWJlIGFsbCBvYnNlcnZlcnMgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLlxuXHQgICAgICAgKi9cblx0ICAgICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0XG5cdCAgICAvKipcblx0ICAgICAqIENyZWF0ZXMgYSBzdWJqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBvYnNlcnZlciBhbmQgb2JzZXJ2YWJsZS5cblx0ICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIFRoZSBvYnNlcnZlciB1c2VkIHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHN1YmplY3QuXG5cdCAgICAgKiBAcGFyYW0ge09ic2VydmFibGV9IG9ic2VydmFibGUgVGhlIG9ic2VydmFibGUgdXNlZCB0byBzdWJzY3JpYmUgdG8gbWVzc2FnZXMgc2VudCBmcm9tIHRoZSBzdWJqZWN0LlxuXHQgICAgICogQHJldHVybnMge1N1YmplY3R9IFN1YmplY3QgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIGdpdmVuIG9ic2VydmVyIGFuZCBvYnNlcnZhYmxlLlxuXHQgICAgICovXG5cdCAgICBTdWJqZWN0LmNyZWF0ZSA9IGZ1bmN0aW9uIChvYnNlcnZlciwgb2JzZXJ2YWJsZSkge1xuXHQgICAgICByZXR1cm4gbmV3IEFub255bW91c1N1YmplY3Qob2JzZXJ2ZXIsIG9ic2VydmFibGUpO1xuXHQgICAgfTtcblx0XG5cdCAgICByZXR1cm4gU3ViamVjdDtcblx0ICB9KE9ic2VydmFibGUpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLlxuXHQgICAqICBUaGUgbGFzdCB2YWx1ZSBiZWZvcmUgdGhlIE9uQ29tcGxldGVkIG5vdGlmaWNhdGlvbiwgb3IgdGhlIGVycm9yIHJlY2VpdmVkIHRocm91Z2ggT25FcnJvciwgaXMgc2VudCB0byBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMuXG5cdCAgICovXG5cdCAgdmFyIEFzeW5jU3ViamVjdCA9IFJ4LkFzeW5jU3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhBc3luY1N1YmplY3QsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBDcmVhdGVzIGEgc3ViamVjdCB0aGF0IGNhbiBvbmx5IHJlY2VpdmUgb25lIHZhbHVlIGFuZCB0aGF0IHZhbHVlIGlzIGNhY2hlZCBmb3IgYWxsIGZ1dHVyZSBvYnNlcnZhdGlvbnMuXG5cdCAgICAgKiBAY29uc3RydWN0b3Jcblx0ICAgICAqL1xuXHQgICAgZnVuY3Rpb24gQXN5bmNTdWJqZWN0KCkge1xuXHQgICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5vYnNlcnZlcnMgPSBbXTtcblx0ICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuXHQgICAgfVxuXHRcblx0ICAgIGFkZFByb3BlcnRpZXMoQXN5bmNTdWJqZWN0LnByb3RvdHlwZSwgT2JzZXJ2ZXIucHJvdG90eXBlLCB7XG5cdCAgICAgIF9zdWJzY3JpYmU6IGZ1bmN0aW9uIChvKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuXHQgICAgICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChvKTtcblx0ICAgICAgICAgIHJldHVybiBuZXcgSW5uZXJTdWJzY3JpcHRpb24odGhpcywgbyk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikge1xuXHQgICAgICAgICAgby5vbkVycm9yKHRoaXMuZXJyb3IpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNWYWx1ZSkge1xuXHQgICAgICAgICAgby5vbk5leHQodGhpcy52YWx1ZSk7XG5cdCAgICAgICAgICBvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzIHN1YnNjcmliZWQgdG8gaXQuXG5cdCAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzIHN1YnNjcmliZWQgdG8gaXQuXG5cdCAgICAgICAqL1xuXHQgICAgICBoYXNPYnNlcnZlcnM6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5sZW5ndGggPiAwO1xuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLCBhbHNvIGNhdXNpbmcgdGhlIGxhc3QgcmVjZWl2ZWQgdmFsdWUgdG8gYmUgc2VudCBvdXQgKGlmIGFueSkuXG5cdCAgICAgICAqL1xuXHQgICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBpLCBsZW47XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB2YXIgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoO1xuXHRcblx0ICAgICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlKSB7XG5cdCAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICAgIHZhciBvID0gb3NbaV07XG5cdCAgICAgICAgICAgICAgby5vbk5leHQodGhpcy52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgICBvc1tpXS5vbkNvbXBsZXRlZCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGVycm9yLlxuXHQgICAgICAgKiBAcGFyYW0ge01peGVkfSBlcnJvciBUaGUgRXJyb3IgdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuXHQgICAgICAgKi9cblx0ICAgICAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG5cdCAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcblx0ICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcblx0XG5cdCAgICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgb3NbaV0ub25FcnJvcihlcnJvcik7XG5cdCAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBTZW5kcyBhIHZhbHVlIHRvIHRoZSBzdWJqZWN0LiBUaGUgbGFzdCB2YWx1ZSByZWNlaXZlZCBiZWZvcmUgc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbiB3aWxsIGJlIHNlbnQgdG8gYWxsIHN1YnNjcmliZWQgYW5kIGZ1dHVyZSBvYnNlcnZlcnMuXG5cdCAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzdG9yZSBpbiB0aGUgc3ViamVjdC5cblx0ICAgICAgICovXG5cdCAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgIHRoaXMuaGFzVmFsdWUgPSB0cnVlO1xuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogVW5zdWJzY3JpYmUgYWxsIG9ic2VydmVycyBhbmQgcmVsZWFzZSByZXNvdXJjZXMuXG5cdCAgICAgICAqL1xuXHQgICAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLm9ic2VydmVycyA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHRcblx0ICAgIHJldHVybiBBc3luY1N1YmplY3Q7XG5cdCAgfShPYnNlcnZhYmxlKSk7XG5cdFxuXHQgIHZhciBBbm9ueW1vdXNTdWJqZWN0ID0gUnguQW5vbnltb3VzU3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhBbm9ueW1vdXNTdWJqZWN0LCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gQW5vbnltb3VzU3ViamVjdChvYnNlcnZlciwgb2JzZXJ2YWJsZSkge1xuXHQgICAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG5cdCAgICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGU7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIGFkZFByb3BlcnRpZXMoQW5vbnltb3VzU3ViamVjdC5wcm90b3R5cGUsIE9ic2VydmVyLnByb3RvdHlwZSwge1xuXHQgICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuXHQgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGUuc3Vic2NyaWJlKG8pO1xuXHQgICAgICB9LFxuXHQgICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMub2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcblx0ICAgICAgfSxcblx0ICAgICAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG5cdCAgICAgICAgdGhpcy5vYnNlcnZlci5vbkVycm9yKGVycm9yKTtcblx0ICAgICAgfSxcblx0ICAgICAgb25OZXh0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICB0aGlzLm9ic2VydmVyLm9uTmV4dCh2YWx1ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHRcblx0ICAgIHJldHVybiBBbm9ueW1vdXNTdWJqZWN0O1xuXHQgIH0oT2JzZXJ2YWJsZSkpO1xuXHRcblx0ICAvKipcblx0ICAgKiAgUmVwcmVzZW50cyBhIHZhbHVlIHRoYXQgY2hhbmdlcyBvdmVyIHRpbWUuXG5cdCAgICogIE9ic2VydmVycyBjYW4gc3Vic2NyaWJlIHRvIHRoZSBzdWJqZWN0IHRvIHJlY2VpdmUgdGhlIGxhc3QgKG9yIGluaXRpYWwpIHZhbHVlIGFuZCBhbGwgc3Vic2VxdWVudCBub3RpZmljYXRpb25zLlxuXHQgICAqL1xuXHQgIHZhciBCZWhhdmlvclN1YmplY3QgPSBSeC5CZWhhdmlvclN1YmplY3QgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXHQgICAgaW5oZXJpdHMoQmVoYXZpb3JTdWJqZWN0LCBfX3N1cGVyX18pO1xuXHQgICAgZnVuY3Rpb24gQmVoYXZpb3JTdWJqZWN0KHZhbHVlKSB7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgIHRoaXMub2JzZXJ2ZXJzID0gW107XG5cdCAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7XG5cdCAgICB9XG5cdFxuXHQgICAgYWRkUHJvcGVydGllcyhCZWhhdmlvclN1YmplY3QucHJvdG90eXBlLCBPYnNlcnZlci5wcm90b3R5cGUsIHtcblx0ICAgICAgX3N1YnNjcmliZTogZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXHQgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gobyk7XG5cdCAgICAgICAgICBvLm9uTmV4dCh0aGlzLnZhbHVlKTtcblx0ICAgICAgICAgIHJldHVybiBuZXcgSW5uZXJTdWJzY3JpcHRpb24odGhpcywgbyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmhhc0Vycm9yKSB7XG5cdCAgICAgICAgICBvLm9uRXJyb3IodGhpcy5lcnJvcik7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGVFbXB0eTtcblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cblx0ICAgICAgICogVmFsdWUgaXMgZnJvemVuIGFmdGVyIG9uQ29tcGxldGVkIGlzIGNhbGxlZC5cblx0ICAgICAgICogQWZ0ZXIgb25FcnJvciBpcyBjYWxsZWQgYWx3YXlzIHRocm93cyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbi5cblx0ICAgICAgICogQW4gZXhjZXB0aW9uIGlzIGFsd2F5cyB0aHJvd24gYWZ0ZXIgZGlzcG9zZSBpcyBjYWxsZWQuXG5cdCAgICAgICAqIEByZXR1cm5zIHtNaXhlZH0gVGhlIGluaXRpYWwgdmFsdWUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciB1bnRpbCBvbk5leHQgaXMgY2FsbGVkOyBhZnRlciB3aGljaCwgdGhlIGxhc3QgdmFsdWUgcGFzc2VkIHRvIG9uTmV4dC5cblx0ICAgICAgICovXG5cdCAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXHQgICAgICAgICAgaWYgKHRoaXMuaGFzRXJyb3IpIHtcblx0ICAgICAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzIHN1YnNjcmliZWQgdG8gaXQuXG5cdCAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzIHN1YnNjcmliZWQgdG8gaXQuXG5cdCAgICAgICAqL1xuXHQgICAgICBoYXNPYnNlcnZlcnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA+IDA7IH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuXG5cdCAgICAgICAqL1xuXHQgICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgIG9zW2ldLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBleGNlcHRpb24uXG5cdCAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IGVycm9yIFRoZSBleGNlcHRpb24gdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuXHQgICAgICAgKi9cblx0ICAgICAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcblx0XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICBvc1tpXS5vbkVycm9yKGVycm9yKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGFycml2YWwgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cblx0ICAgICAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVycy5cblx0ICAgICAgICovXG5cdCAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwLCBvcyA9IGNsb25lQXJyYXkodGhpcy5vYnNlcnZlcnMpLCBsZW4gPSBvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgb3NbaV0ub25OZXh0KHZhbHVlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBVbnN1YnNjcmliZSBhbGwgb2JzZXJ2ZXJzIGFuZCByZWxlYXNlIHJlc291cmNlcy5cblx0ICAgICAgICovXG5cdCAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdFxuXHQgICAgcmV0dXJuIEJlaGF2aW9yU3ViamVjdDtcblx0ICB9KE9ic2VydmFibGUpKTtcblx0XG5cdCAgLyoqXG5cdCAgICogUmVwcmVzZW50cyBhbiBvYmplY3QgdGhhdCBpcyBib3RoIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgd2VsbCBhcyBhbiBvYnNlcnZlci5cblx0ICAgKiBFYWNoIG5vdGlmaWNhdGlvbiBpcyBicm9hZGNhc3RlZCB0byBhbGwgc3Vic2NyaWJlZCBhbmQgZnV0dXJlIG9ic2VydmVycywgc3ViamVjdCB0byBidWZmZXIgdHJpbW1pbmcgcG9saWNpZXMuXG5cdCAgICovXG5cdCAgdmFyIFJlcGxheVN1YmplY3QgPSBSeC5SZXBsYXlTdWJqZWN0ID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcblx0XG5cdCAgICB2YXIgbWF4U2FmZUludGVnZXIgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuXHRcblx0ICAgIGZ1bmN0aW9uIGNyZWF0ZVJlbW92YWJsZURpc3Bvc2FibGUoc3ViamVjdCwgb2JzZXJ2ZXIpIHtcblx0ICAgICAgcmV0dXJuIGRpc3Bvc2FibGVDcmVhdGUoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIG9ic2VydmVyLmRpc3Bvc2UoKTtcblx0ICAgICAgICAhc3ViamVjdC5pc0Rpc3Bvc2VkICYmIHN1YmplY3Qub2JzZXJ2ZXJzLnNwbGljZShzdWJqZWN0Lm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKSwgMSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHRcblx0ICAgIGluaGVyaXRzKFJlcGxheVN1YmplY3QsIF9fc3VwZXJfXyk7XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJlcGxheVN1YmplY3QgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBzaXplLCB3aW5kb3cgc2l6ZSBhbmQgc2NoZWR1bGVyLlxuXHQgICAgICogIEBwYXJhbSB7TnVtYmVyfSBbYnVmZmVyU2l6ZV0gTWF4aW11bSBlbGVtZW50IGNvdW50IG9mIHRoZSByZXBsYXkgYnVmZmVyLlxuXHQgICAgICogIEBwYXJhbSB7TnVtYmVyfSBbd2luZG93U2l6ZV0gTWF4aW11bSB0aW1lIGxlbmd0aCBvZiB0aGUgcmVwbGF5IGJ1ZmZlci5cblx0ICAgICAqICBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gU2NoZWR1bGVyIHRoZSBvYnNlcnZlcnMgYXJlIGludm9rZWQgb24uXG5cdCAgICAgKi9cblx0ICAgIGZ1bmN0aW9uIFJlcGxheVN1YmplY3QoYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKSB7XG5cdCAgICAgIHRoaXMuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemUgPT0gbnVsbCA/IG1heFNhZmVJbnRlZ2VyIDogYnVmZmVyU2l6ZTtcblx0ICAgICAgdGhpcy53aW5kb3dTaXplID0gd2luZG93U2l6ZSA9PSBudWxsID8gbWF4U2FmZUludGVnZXIgOiB3aW5kb3dTaXplO1xuXHQgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlciB8fCBjdXJyZW50VGhyZWFkU2NoZWR1bGVyO1xuXHQgICAgICB0aGlzLnEgPSBbXTtcblx0ICAgICAgdGhpcy5vYnNlcnZlcnMgPSBbXTtcblx0ICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuaGFzRXJyb3IgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIGFkZFByb3BlcnRpZXMoUmVwbGF5U3ViamVjdC5wcm90b3R5cGUsIE9ic2VydmVyLnByb3RvdHlwZSwge1xuXHQgICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgdmFyIHNvID0gbmV3IFNjaGVkdWxlZE9ic2VydmVyKHRoaXMuc2NoZWR1bGVyLCBvKSwgc3Vic2NyaXB0aW9uID0gY3JlYXRlUmVtb3ZhYmxlRGlzcG9zYWJsZSh0aGlzLCBzbyk7XG5cdFxuXHQgICAgICAgIHRoaXMuX3RyaW0odGhpcy5zY2hlZHVsZXIubm93KCkpO1xuXHQgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goc28pO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5xLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICBzby5vbk5leHQodGhpcy5xW2ldLnZhbHVlKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIGlmICh0aGlzLmhhc0Vycm9yKSB7XG5cdCAgICAgICAgICBzby5vbkVycm9yKHRoaXMuZXJyb3IpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1N0b3BwZWQpIHtcblx0ICAgICAgICAgIHNvLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBzby5lbnN1cmVBY3RpdmUoKTtcblx0ICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuXHQgICAgICB9LFxuXHQgICAgICAvKipcblx0ICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuXHQgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuXHQgICAgICAgKi9cblx0ICAgICAgaGFzT2JzZXJ2ZXJzOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA+IDA7XG5cdCAgICAgIH0sXG5cdCAgICAgIF90cmltOiBmdW5jdGlvbiAobm93KSB7XG5cdCAgICAgICAgd2hpbGUgKHRoaXMucS5sZW5ndGggPiB0aGlzLmJ1ZmZlclNpemUpIHtcblx0ICAgICAgICAgIHRoaXMucS5zaGlmdCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB3aGlsZSAodGhpcy5xLmxlbmd0aCA+IDAgJiYgKG5vdyAtIHRoaXMucVswXS5pbnRlcnZhbCkgPiB0aGlzLndpbmRvd1NpemUpIHtcblx0ICAgICAgICAgIHRoaXMucS5zaGlmdCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIE5vdGlmaWVzIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycyBhYm91dCB0aGUgYXJyaXZhbCBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLlxuXHQgICAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuXHQgICAgICAgKi9cblx0ICAgICAgb25OZXh0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXHQgICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cblx0ICAgICAgICB2YXIgbm93ID0gdGhpcy5zY2hlZHVsZXIubm93KCk7XG5cdCAgICAgICAgdGhpcy5xLnB1c2goeyBpbnRlcnZhbDogbm93LCB2YWx1ZTogdmFsdWUgfSk7XG5cdCAgICAgICAgdGhpcy5fdHJpbShub3cpO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgIHZhciBvYnNlcnZlciA9IG9zW2ldO1xuXHQgICAgICAgICAgb2JzZXJ2ZXIub25OZXh0KHZhbHVlKTtcblx0ICAgICAgICAgIG9ic2VydmVyLmVuc3VyZUFjdGl2ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIE5vdGlmaWVzIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycyBhYm91dCB0aGUgZXhjZXB0aW9uLlxuXHQgICAgICAgKiBAcGFyYW0ge01peGVkfSBlcnJvciBUaGUgZXhjZXB0aW9uIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVycy5cblx0ICAgICAgICovXG5cdCAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuXHQgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG5cdCAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG5cdCAgICAgICAgdmFyIG5vdyA9IHRoaXMuc2NoZWR1bGVyLm5vdygpO1xuXHQgICAgICAgIHRoaXMuX3RyaW0obm93KTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgIHZhciBvYnNlcnZlciA9IG9zW2ldO1xuXHQgICAgICAgICAgb2JzZXJ2ZXIub25FcnJvcihlcnJvcik7XG5cdCAgICAgICAgICBvYnNlcnZlci5lbnN1cmVBY3RpdmUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIE5vdGlmaWVzIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycyBhYm91dCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cblx0ICAgICAgICovXG5cdCAgICAgIG9uQ29tcGxldGVkOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcblx0ICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuXHQgICAgICAgIHZhciBub3cgPSB0aGlzLnNjaGVkdWxlci5ub3coKTtcblx0ICAgICAgICB0aGlzLl90cmltKG5vdyk7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBvc1tpXTtcblx0ICAgICAgICAgIG9ic2VydmVyLm9uQ29tcGxldGVkKCk7XG5cdCAgICAgICAgICBvYnNlcnZlci5lbnN1cmVBY3RpdmUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcblx0ICAgICAgfSxcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIFVuc3Vic2NyaWJlIGFsbCBvYnNlcnZlcnMgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLlxuXHQgICAgICAgKi9cblx0ICAgICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0XG5cdCAgICByZXR1cm4gUmVwbGF5U3ViamVjdDtcblx0ICB9KE9ic2VydmFibGUpKTtcblx0XG5cdCAgLyoqXG5cdCAgKiBVc2VkIHRvIHBhdXNlIGFuZCByZXN1bWUgc3RyZWFtcy5cblx0ICAqL1xuXHQgIFJ4LlBhdXNlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG5cdCAgICBpbmhlcml0cyhQYXVzZXIsIF9fc3VwZXJfXyk7XG5cdCAgICBmdW5jdGlvbiBQYXVzZXIoKSB7XG5cdCAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHRcblx0ICAgIC8qKlxuXHQgICAgICogUGF1c2VzIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlLlxuXHQgICAgICovXG5cdCAgICBQYXVzZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkgeyB0aGlzLm9uTmV4dChmYWxzZSk7IH07XG5cdFxuXHQgICAgLyoqXG5cdCAgICAqIFJlc3VtZXMgdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UuXG5cdCAgICAqL1xuXHQgICAgUGF1c2VyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7IHRoaXMub25OZXh0KHRydWUpOyB9O1xuXHRcblx0ICAgIHJldHVybiBQYXVzZXI7XG5cdCAgfShTdWJqZWN0KSk7XG5cdFxuXHQgIGlmICh0cnVlKSB7XG5cdCAgICByb290LlJ4ID0gUng7XG5cdFxuXHQgICAgIShfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICByZXR1cm4gUng7XG5cdCAgICB9LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXywgZXhwb3J0cywgbW9kdWxlKSwgX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gIT09IHVuZGVmaW5lZCAmJiAobW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXykpO1xuXHQgIH0gZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSkge1xuXHQgICAgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTXG5cdCAgICBpZiAobW9kdWxlRXhwb3J0cykge1xuXHQgICAgICAoZnJlZU1vZHVsZS5leHBvcnRzID0gUngpLlJ4ID0gUng7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBmcmVlRXhwb3J0cy5SeCA9IFJ4O1xuXHQgICAgfVxuXHQgIH0gZWxzZSB7XG5cdCAgICAvLyBpbiBhIGJyb3dzZXIgb3IgUmhpbm9cblx0ICAgIHJvb3QuUnggPSBSeDtcblx0ICB9XG5cdFxuXHQgIC8vIEFsbCBjb2RlIGJlZm9yZSB0aGlzIHBvaW50IHdpbGwgYmUgZmlsdGVyZWQgZnJvbSBzdGFjayB0cmFjZXMuXG5cdCAgdmFyIHJFbmRpbmdMaW5lID0gY2FwdHVyZUxpbmUoKTtcblx0XG5cdH0uY2FsbCh0aGlzKSk7XG5cdFxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXygzNCkobW9kdWxlKSwgKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSgpKSwgX193ZWJwYWNrX3JlcXVpcmVfXyg2KSkpXG5cbi8qKiovIH0sXG4vKiAxNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIuY2xpbWJfX3dhbGx7d2lkdGg6MTAwJTtwYWRkaW5nOjA7bWFyZ2luOjA7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpyb3c7LW1zLWZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LWRpcmVjdGlvbjpyb3c7LXdlYmtpdC1mbGV4LXdyYXA6d3JhcDstbXMtZmxleC13cmFwOndyYXA7ZmxleC13cmFwOndyYXA7Zm9udC1zaXplOjEwMCV9LmNsaW1iX190aWxlLC5jbGltYl9fd2FsbHtkaXNwbGF5Oi13ZWJraXQtZmxleDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleH0uY2xpbWJfX3RpbGV7LXdlYmtpdC1mbGV4LXNocmluazowOy1tcy1mbGV4LW5lZ2F0aXZlOjA7ZmxleC1zaHJpbms6MDtoZWlnaHQ6NDI1cHg7Ym94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtanVzdGlmeS1jb250ZW50OmZsZXgtZW5kOy1tcy1mbGV4LXBhY2s6ZW5kO2p1c3RpZnktY29udGVudDpmbGV4LWVuZDstd2Via2l0LWZsZXgtZGlyZWN0aW9uOmNvbHVtbjstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtvdXRsaW5lOjFweCBzb2xpZCB0cmFuc3BhcmVudDttYXJnaW4tYm90dG9tOjIwcHg7b3ZlcmZsb3c6aGlkZGVuO3RleHQtYWxpZ246bGVmdDtib3JkZXItcmFkaXVzOjdweDtiYWNrZ3JvdW5kLWNvbG9yOiNmNmY2ZjY7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjstd2Via2l0LXBlcnNwZWN0aXZlOjEwMDBweDtwZXJzcGVjdGl2ZToxMDAwcHh9LmNsaW1iX190aWxlX19jb250ZW50e3otaW5kZXg6MTtwYWRkaW5nOjI2cHg7YmFja2dyb3VuZC1jb2xvcjojZjZmNmY2fS5jbGltYl9fdGlsZS0taGFzLW5vLWltYWdlIC5jbGltYl9fdGlsZV9fY29udGVudHtoZWlnaHQ6MTAwJTtkaXNwbGF5Oi13ZWJraXQtZmxleDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWZsZXgtZGlyZWN0aW9uOmNvbHVtbjstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjstd2Via2l0LWp1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuOy1tcy1mbGV4LXBhY2s6anVzdGlmeTtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbjtib3gtc2l6aW5nOmJvcmRlci1ib3h9LmNsaW1iX190aWxlX19pbWFnZXttYXgtd2lkdGg6MTAwJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjdweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo3cHh9LmNsaW1iX190aWxlX19tZXNzYWdle3otaW5kZXg6MTttYXJnaW4tYm90dG9tOjI0cHh9LmNsaW1iX190aWxlX19tZXNzYWdlPmF7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO21heC13aWR0aDoyNjBweDtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjpib3R0b219LmNsaW1iX190aWxlLS1oYXMtbm8taW1hZ2UgLmNsaW1iX190aWxlX19tZXNzYWdle2ZvbnQtc2l6ZToxODUlfS5jbGltYl9fdGlsZV9fYXV0aG9ye2Rpc3BsYXk6YmxvY2s7bWFyZ2luOi0xMHB4fS5jbGltYl9fdGlsZV9fYXV0aG9yIGltZ3tib3JkZXItcmFkaXVzOjI1cHg7d2lkdGg6MzRweH0uY2xpbWJfX3RpbGVfX2F1dGhvciAuY2xpbWJfX3RpbGVfX2F1dGhvcl9fdXNlcm5hbWV7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjAgMCAwIDEwcHg7bGluZS1oZWlnaHQ6MzRweDt2ZXJ0aWNhbC1hbGlnbjp0b3B9LmNsaW1iLXNvY2lhbC1iYWRnZXtwb3NpdGlvbjpmaXhlZDtib3R0b206MjBweDtyaWdodDoyMHB4O3otaW5kZXg6OTtiYWNrZ3JvdW5kLWNvbG9yOiNhOWNhZTI7d2lkdGg6MjAwcHg7aGVpZ2h0OjY2cHg7Ym9yZGVyLXJhZGl1czo1cHh9LmNsaW1iLXNvY2lhbC1iYWRnZT5zcGFue3Bvc2l0aW9uOmFic29sdXRlIWltcG9ydGFudDt0b3A6LTk5OTlweCFpbXBvcnRhbnQ7bGVmdDotOTk5OXB4IWltcG9ydGFudH1cIiwgXCJcIl0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0LypcclxuXHRcdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcblx0XHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXHJcblx0Ki9cclxuXHQvLyBjc3MgYmFzZSBjb2RlLCBpbmplY3RlZCBieSB0aGUgY3NzLWxvYWRlclxyXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbGlzdCA9IFtdO1xyXG5cdFxyXG5cdFx0Ly8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xyXG5cdFx0bGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xyXG5cdFx0XHR2YXIgcmVzdWx0ID0gW107XHJcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0dmFyIGl0ZW0gPSB0aGlzW2ldO1xyXG5cdFx0XHRcdGlmKGl0ZW1bMl0pIHtcclxuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKFwiQG1lZGlhIFwiICsgaXRlbVsyXSArIFwie1wiICsgaXRlbVsxXSArIFwifVwiKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goaXRlbVsxXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXN1bHQuam9pbihcIlwiKTtcclxuXHRcdH07XHJcblx0XHJcblx0XHQvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxyXG5cdFx0bGlzdC5pID0gZnVuY3Rpb24obW9kdWxlcywgbWVkaWFRdWVyeSkge1xyXG5cdFx0XHRpZih0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIilcclxuXHRcdFx0XHRtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCBcIlwiXV07XHJcblx0XHRcdHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XHJcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0dmFyIGlkID0gdGhpc1tpXVswXTtcclxuXHRcdFx0XHRpZih0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIpXHJcblx0XHRcdFx0XHRhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Zm9yKGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpdGVtID0gbW9kdWxlc1tpXTtcclxuXHRcdFx0XHQvLyBza2lwIGFscmVhZHkgaW1wb3J0ZWQgbW9kdWxlXHJcblx0XHRcdFx0Ly8gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgMTAwJSBwZXJmZWN0IGZvciB3ZWlyZCBtZWRpYSBxdWVyeSBjb21iaW5hdGlvbnNcclxuXHRcdFx0XHQvLyAgd2hlbiBhIG1vZHVsZSBpcyBpbXBvcnRlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBtZWRpYSBxdWVyaWVzLlxyXG5cdFx0XHRcdC8vICBJIGhvcGUgdGhpcyB3aWxsIG5ldmVyIG9jY3VyIChIZXkgdGhpcyB3YXkgd2UgaGF2ZSBzbWFsbGVyIGJ1bmRsZXMpXHJcblx0XHRcdFx0aWYodHlwZW9mIGl0ZW1bMF0gIT09IFwibnVtYmVyXCIgfHwgIWFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcclxuXHRcdFx0XHRcdGlmKG1lZGlhUXVlcnkgJiYgIWl0ZW1bMl0pIHtcclxuXHRcdFx0XHRcdFx0aXRlbVsyXSA9IG1lZGlhUXVlcnk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYobWVkaWFRdWVyeSkge1xyXG5cdFx0XHRcdFx0XHRpdGVtWzJdID0gXCIoXCIgKyBpdGVtWzJdICsgXCIpIGFuZCAoXCIgKyBtZWRpYVF1ZXJ5ICsgXCIpXCI7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRsaXN0LnB1c2goaXRlbSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0cmV0dXJuIGxpc3Q7XHJcblx0fTtcclxuXG5cbi8qKiovIH0sXG4vKiAxNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXywgX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXywgX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX187KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0ICBpZiAodHJ1ZSkge1xuXHQgICAgIShfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fID0gW2V4cG9ydHMsIG1vZHVsZV0sIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyA9IChmYWN0b3J5KSwgX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gPSAodHlwZW9mIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyA9PT0gJ2Z1bmN0aW9uJyA/IChfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18uYXBwbHkoZXhwb3J0cywgX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXykpIDogX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fKSwgX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gIT09IHVuZGVmaW5lZCAmJiAobW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXykpO1xuXHQgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICBmYWN0b3J5KGV4cG9ydHMsIG1vZHVsZSk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIHZhciBtb2QgPSB7XG5cdCAgICAgIGV4cG9ydHM6IHt9XG5cdCAgICB9O1xuXHQgICAgZmFjdG9yeShtb2QuZXhwb3J0cywgbW9kKTtcblx0ICAgIGdsb2JhbC5mZXRjaEpzb25wID0gbW9kLmV4cG9ydHM7XG5cdCAgfVxuXHR9KSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cywgbW9kdWxlKSB7XG5cdCAgJ3VzZSBzdHJpY3QnO1xuXHRcblx0ICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG5cdCAgICB0aW1lb3V0OiA1MDAwLFxuXHQgICAganNvbnBDYWxsYmFjazogJ2NhbGxiYWNrJ1xuXHQgIH07XG5cdFxuXHQgIGZ1bmN0aW9uIGdlbmVyYXRlQ2FsbGJhY2tGdW5jdGlvbigpIHtcblx0ICAgIHJldHVybiAnanNvbnBfJyArIERhdGUubm93KCkgKyAnXycgKyBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSAqIDEwMDAwMCk7XG5cdCAgfVxuXHRcblx0ICAvLyBLbm93biBpc3N1ZTogV2lsbCB0aHJvdyAnVW5jYXVnaHQgUmVmZXJlbmNlRXJyb3I6IGNhbGxiYWNrXyoqKiBpcyBub3QgZGVmaW5lZCcgZXJyb3IgaWYgcmVxdWVzdCB0aW1lb3V0XG5cdCAgZnVuY3Rpb24gY2xlYXJGdW5jdGlvbihmdW5jdGlvbk5hbWUpIHtcblx0ICAgIC8vIElFOCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4geW91IHRyeSB0byBkZWxldGUgYSBwcm9wZXJ0eSBvbiB3aW5kb3dcblx0ICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE4MjQyMjgvNzUxMDg5XG5cdCAgICB0cnkge1xuXHQgICAgICBkZWxldGUgd2luZG93W2Z1bmN0aW9uTmFtZV07XG5cdCAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgIHdpbmRvd1tmdW5jdGlvbk5hbWVdID0gdW5kZWZpbmVkO1xuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gcmVtb3ZlU2NyaXB0KHNjcmlwdElkKSB7XG5cdCAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2NyaXB0SWQpO1xuXHQgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdCAgfVxuXHRcblx0ICB2YXIgZmV0Y2hKc29ucCA9IGZ1bmN0aW9uIGZldGNoSnNvbnAodXJsKSB7XG5cdCAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzFdO1xuXHRcblx0ICAgIHZhciB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ICE9IG51bGwgPyBvcHRpb25zLnRpbWVvdXQgOiBkZWZhdWx0T3B0aW9ucy50aW1lb3V0O1xuXHQgICAgdmFyIGpzb25wQ2FsbGJhY2sgPSBvcHRpb25zLmpzb25wQ2FsbGJhY2sgIT0gbnVsbCA/IG9wdGlvbnMuanNvbnBDYWxsYmFjayA6IGRlZmF1bHRPcHRpb25zLmpzb25wQ2FsbGJhY2s7XG5cdFxuXHQgICAgdmFyIHRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcblx0XG5cdCAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHQgICAgICB2YXIgY2FsbGJhY2tGdW5jdGlvbiA9IGdlbmVyYXRlQ2FsbGJhY2tGdW5jdGlvbigpO1xuXHRcblx0ICAgICAgd2luZG93W2NhbGxiYWNrRnVuY3Rpb25dID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgcmVzb2x2ZSh7XG5cdCAgICAgICAgICBvazogdHJ1ZSxcblx0ICAgICAgICAgIC8vIGtlZXAgY29uc2lzdGVudCB3aXRoIGZldGNoIEFQSVxuXHQgICAgICAgICAganNvbjogZnVuY3Rpb24ganNvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdFxuXHQgICAgICAgIGlmICh0aW1lb3V0SWQpIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuXHRcblx0ICAgICAgICByZW1vdmVTY3JpcHQoanNvbnBDYWxsYmFjayArICdfJyArIGNhbGxiYWNrRnVuY3Rpb24pO1xuXHRcblx0ICAgICAgICBjbGVhckZ1bmN0aW9uKGNhbGxiYWNrRnVuY3Rpb24pO1xuXHQgICAgICB9O1xuXHRcblx0ICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgc2V0IHRoZWlyIG93biBwYXJhbXMsIGFuZCBpZiBub3QgYWRkIGEgPyB0byBzdGFydCBhIGxpc3Qgb2YgcGFyYW1zXG5cdCAgICAgIHVybCArPSB1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJztcblx0XG5cdCAgICAgIHZhciBqc29ucFNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXHQgICAgICBqc29ucFNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdXJsICsganNvbnBDYWxsYmFjayArICc9JyArIGNhbGxiYWNrRnVuY3Rpb24pO1xuXHQgICAgICBqc29ucFNjcmlwdC5pZCA9IGpzb25wQ2FsbGJhY2sgKyAnXycgKyBjYWxsYmFja0Z1bmN0aW9uO1xuXHQgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF0uYXBwZW5kQ2hpbGQoanNvbnBTY3JpcHQpO1xuXHRcblx0ICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignSlNPTlAgcmVxdWVzdCB0byAnICsgdXJsICsgJyB0aW1lZCBvdXQnKSk7XG5cdFxuXHQgICAgICAgIGNsZWFyRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlvbik7XG5cdCAgICAgICAgcmVtb3ZlU2NyaXB0KGpzb25wQ2FsbGJhY2sgKyAnXycgKyBjYWxsYmFja0Z1bmN0aW9uKTtcblx0ICAgICAgfSwgdGltZW91dCk7XG5cdCAgICB9KTtcblx0ICB9O1xuXHRcblx0ICAvLyBleHBvcnQgYXMgZ2xvYmFsIGZ1bmN0aW9uXG5cdCAgLypcblx0ICBsZXQgbG9jYWw7XG5cdCAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICBsb2NhbCA9IGdsb2JhbDtcblx0ICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgbG9jYWwgPSBzZWxmO1xuXHQgIH0gZWxzZSB7XG5cdCAgICB0cnkge1xuXHQgICAgICBsb2NhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdCAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIFxuXHQgIGxvY2FsLmZldGNoSnNvbnAgPSBmZXRjaEpzb25wO1xuXHQgICovXG5cdFxuXHQgIG1vZHVsZS5leHBvcnRzID0gZmV0Y2hKc29ucDtcblx0fSk7XG5cbi8qKiovIH0sXG4vKiAxNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1snZGVmYXVsdCddID0gY29uZmlnQW5pbWF0aW9uO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXHRcblx0dmFyIF9wZXJmb3JtYW5jZU5vdyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cdFxuXHR2YXIgX3BlcmZvcm1hbmNlTm93MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BlcmZvcm1hbmNlTm93KTtcblx0XG5cdHZhciBfcmFmID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCk7XG5cdFxuXHR2YXIgX3JhZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yYWYpO1xuXHRcblx0ZnVuY3Rpb24gY29uZmlnQW5pbWF0aW9uKCkge1xuXHQgIHZhciBjb25maWcgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblx0ICB2YXIgX2NvbmZpZyR0aW1lU3RlcCA9IGNvbmZpZy50aW1lU3RlcDtcblx0ICB2YXIgdGltZVN0ZXAgPSBfY29uZmlnJHRpbWVTdGVwID09PSB1bmRlZmluZWQgPyAxIC8gNjAgKiAxMDAwIDogX2NvbmZpZyR0aW1lU3RlcDtcblx0ICB2YXIgX2NvbmZpZyR0aW1lU2NhbGUgPSBjb25maWcudGltZVNjYWxlO1xuXHQgIHZhciB0aW1lU2NhbGUgPSBfY29uZmlnJHRpbWVTY2FsZSA9PT0gdW5kZWZpbmVkID8gMSA6IF9jb25maWckdGltZVNjYWxlO1xuXHQgIHZhciBfY29uZmlnJG1heFN0ZXBzID0gY29uZmlnLm1heFN0ZXBzO1xuXHQgIHZhciBtYXhTdGVwcyA9IF9jb25maWckbWF4U3RlcHMgPT09IHVuZGVmaW5lZCA/IDEwIDogX2NvbmZpZyRtYXhTdGVwcztcblx0ICB2YXIgX2NvbmZpZyRyYWYgPSBjb25maWcucmFmO1xuXHQgIHZhciByYWYgPSBfY29uZmlnJHJhZiA9PT0gdW5kZWZpbmVkID8gX3JhZjJbJ2RlZmF1bHQnXSA6IF9jb25maWckcmFmO1xuXHQgIHZhciBfY29uZmlnJG5vdyA9IGNvbmZpZy5ub3c7XG5cdCAgdmFyIG5vdyA9IF9jb25maWckbm93ID09PSB1bmRlZmluZWQgPyBfcGVyZm9ybWFuY2VOb3cyWydkZWZhdWx0J10gOiBfY29uZmlnJG5vdztcblx0XG5cdCAgdmFyIGFuaW1SdW5uaW5nID0gW107XG5cdCAgdmFyIHJ1bm5pbmcgPSBmYWxzZTtcblx0ICB2YXIgcHJldlRpbWUgPSAwO1xuXHQgIHZhciBhY2N1bXVsYXRlZFRpbWUgPSAwO1xuXHRcblx0ICBmdW5jdGlvbiBsb29wKCkge1xuXHQgICAgdmFyIGN1cnJlbnRUaW1lID0gbm93KCk7XG5cdCAgICB2YXIgZnJhbWVUaW1lID0gY3VycmVudFRpbWUgLSBwcmV2VGltZTsgLy8gZGVsdGFcblx0XG5cdCAgICBwcmV2VGltZSA9IGN1cnJlbnRUaW1lO1xuXHQgICAgYWNjdW11bGF0ZWRUaW1lICs9IGZyYW1lVGltZSAqIHRpbWVTY2FsZTtcblx0XG5cdCAgICBpZiAoYWNjdW11bGF0ZWRUaW1lID4gdGltZVN0ZXAgKiBtYXhTdGVwcykge1xuXHQgICAgICBhY2N1bXVsYXRlZFRpbWUgPSAwO1xuXHQgICAgfVxuXHRcblx0ICAgIHZhciBmcmFtZU51bWJlciA9IE1hdGguY2VpbChhY2N1bXVsYXRlZFRpbWUgLyB0aW1lU3RlcCk7XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuaW1SdW5uaW5nLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIHZhciBfYW5pbVJ1bm5pbmckaSA9IGFuaW1SdW5uaW5nW2ldO1xuXHQgICAgICB2YXIgYWN0aXZlID0gX2FuaW1SdW5uaW5nJGkuYWN0aXZlO1xuXHQgICAgICB2YXIgYW5pbWF0aW9uU3RlcCA9IF9hbmltUnVubmluZyRpLmFuaW1hdGlvblN0ZXA7XG5cdCAgICAgIHZhciBwcmV2UHJldlN0YXRlID0gX2FuaW1SdW5uaW5nJGkucHJldlN0YXRlO1xuXHQgICAgICB2YXIgcHJldk5leHRTdGF0ZSA9IGFuaW1SdW5uaW5nW2ldLm5leHRTdGF0ZTtcblx0XG5cdCAgICAgIGlmICghYWN0aXZlKSB7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIC8vIFNlZW1zIGxpa2UgYmVjYXVzZSB0aGUgVFMgc2V0cyBkZXN0VmFscyBhcyBlbnRlclZhbHMgZm9yIHRoZSBmaXJzdFxuXHQgICAgICAvLyB0aWNrLCB3ZSBtaWdodCByZW5kZXIgdGhhdCB2YWx1ZSB0d2ljZS4gV2UgcmVuZGVyIGl0IG9uY2UsIGN1cnJWYWx1ZSBpc1xuXHQgICAgICAvLyBlbnRlclZhbCBhbmQgZGVzdFZhbCBpcyBlbnRlclZhbC4gVGhlIG5leHQgdGljayBpcyBmYXN0ZXIgdGhhbiAxNm1zLFxuXHQgICAgICAvLyBzbyBhY2N1bXVsYXRlZFRpbWUgKHdoaWNoIHdvdWxkIGJlIGFib3V0IC0xNm1zIGZyb20gdGhlIHByZXZpb3VzIHRpY2spXG5cdCAgICAgIC8vIGlzIG5lZ2F0aXZlICgtMTZtcyArIGFueSBudW1iZXIgbGVzcyB0aGFuIDE2bXMgPCAwKS4gU28gd2UganVzdCByZW5kZXJcblx0ICAgICAgLy8gcGFydCB3YXlzIHRvd2FyZHMgdGhlIG5leHRTdGF0ZSwgYnV0IHRoYXQncyBlbnRlclZhbCBzdGlsbC4gV2UgcmVuZGVyXG5cdCAgICAgIC8vIHNheSA3NSUgYmV0d2VlbiBjdXJyVmFsdWUgKD09PSBlbnRlclZhbCkgYW5kIGRlc3RWYWx1ZSAoPT09IGVudGVyVmFsKS5cblx0ICAgICAgLy8gU28gd2UgcmVuZGVyIHRoZSBzYW1lIHZhbHVlIGEgc2Vjb25kIHRpbWUuXG5cdCAgICAgIC8vIFRoZSBzb2x1dGlvbiBiZWxvdyBpcyB0byByZWNhbGN1bGF0ZSB0aGUgZGVzdGluYXRpb24gc3RhdGUgZXZlbiB3aGVuXG5cdCAgICAgIC8vIHlvdSdyZSBtb3ZpbmcgcGFydGlhbGx5IHRvd2FyZHMgaXQuXG5cdCAgICAgIGlmIChhY2N1bXVsYXRlZFRpbWUgPD0gMCkge1xuXHQgICAgICAgIGFuaW1SdW5uaW5nW2ldLm5leHRTdGF0ZSA9IGFuaW1hdGlvblN0ZXAodGltZVN0ZXAgLyAxMDAwLCBwcmV2UHJldlN0YXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZyYW1lTnVtYmVyOyBqKyspIHtcblx0ICAgICAgICAgIGFuaW1SdW5uaW5nW2ldLm5leHRTdGF0ZSA9IGFuaW1hdGlvblN0ZXAodGltZVN0ZXAgLyAxMDAwLCBwcmV2TmV4dFN0YXRlKTtcblx0ICAgICAgICAgIHZhciBfcmVmID0gW3ByZXZOZXh0U3RhdGUsIGFuaW1SdW5uaW5nW2ldLm5leHRTdGF0ZV07XG5cdCAgICAgICAgICBhbmltUnVubmluZ1tpXS5wcmV2U3RhdGUgPSBfcmVmWzBdO1xuXHQgICAgICAgICAgcHJldk5leHRTdGF0ZSA9IF9yZWZbMV07XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdFxuXHQgICAgYWNjdW11bGF0ZWRUaW1lID0gYWNjdW11bGF0ZWRUaW1lIC0gZnJhbWVOdW1iZXIgKiB0aW1lU3RlcDtcblx0XG5cdCAgICAvLyBSZW5kZXIgYW5kIGZpbHRlciBpbiBvbmUgaXRlcmF0aW9uLlxuXHQgICAgdmFyIGFscGhhID0gMSArIGFjY3VtdWxhdGVkVGltZSAvIHRpbWVTdGVwO1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmltUnVubmluZy5sZW5ndGg7IGkrKykge1xuXHQgICAgICB2YXIgX2FuaW1SdW5uaW5nJGkyID0gYW5pbVJ1bm5pbmdbaV07XG5cdCAgICAgIHZhciBhbmltYXRpb25SZW5kZXIgPSBfYW5pbVJ1bm5pbmckaTIuYW5pbWF0aW9uUmVuZGVyO1xuXHQgICAgICB2YXIgbmV4dFN0YXRlID0gX2FuaW1SdW5uaW5nJGkyLm5leHRTdGF0ZTtcblx0ICAgICAgdmFyIHByZXZTdGF0ZSA9IF9hbmltUnVubmluZyRpMi5wcmV2U3RhdGU7XG5cdFxuXHQgICAgICAvLyBNaWdodCBtdXRhdGUgYW5pbVJ1bm5pbmcuLi4uLi4uLlxuXHQgICAgICBhbmltYXRpb25SZW5kZXIoYWxwaGEsIG5leHRTdGF0ZSwgcHJldlN0YXRlKTtcblx0ICAgIH1cblx0XG5cdCAgICBhbmltUnVubmluZyA9IGFuaW1SdW5uaW5nLmZpbHRlcihmdW5jdGlvbiAoX3JlZjIpIHtcblx0ICAgICAgdmFyIGFjdGl2ZSA9IF9yZWYyLmFjdGl2ZTtcblx0ICAgICAgcmV0dXJuIGFjdGl2ZTtcblx0ICAgIH0pO1xuXHRcblx0ICAgIGlmIChhbmltUnVubmluZy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgcnVubmluZyA9IGZhbHNlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcmFmKGxvb3ApO1xuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgZnVuY3Rpb24gc3RhcnQoKSB7XG5cdCAgICBpZiAoIXJ1bm5pbmcpIHtcblx0ICAgICAgcnVubmluZyA9IHRydWU7XG5cdCAgICAgIHByZXZUaW1lID0gbm93KCk7XG5cdCAgICAgIGFjY3VtdWxhdGVkVGltZSA9IDA7XG5cdCAgICAgIHJhZihsb29wKTtcblx0ICAgIH1cblx0ICB9XG5cdFxuXHQgIHJldHVybiBmdW5jdGlvbiBzdGFydEFuaW1hdGlvbihzdGF0ZSwgYW5pbWF0aW9uU3RlcCwgYW5pbWF0aW9uUmVuZGVyKSB7XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuaW1SdW5uaW5nLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIHZhciB2YWwgPSBhbmltUnVubmluZ1tpXTtcblx0ICAgICAgaWYgKHZhbC5hbmltYXRpb25TdGVwID09PSBhbmltYXRpb25TdGVwKSB7XG5cdCAgICAgICAgdmFsLmFjdGl2ZSA9IHRydWU7XG5cdCAgICAgICAgdmFsLnByZXZTdGF0ZSA9IHN0YXRlO1xuXHQgICAgICAgIHN0YXJ0KCk7XG5cdCAgICAgICAgcmV0dXJuIHZhbC5zdG9wO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdFxuXHQgICAgdmFyIG5ld0FuaW0gPSB7XG5cdCAgICAgIGFuaW1hdGlvblN0ZXA6IGFuaW1hdGlvblN0ZXAsXG5cdCAgICAgIGFuaW1hdGlvblJlbmRlcjogYW5pbWF0aW9uUmVuZGVyLFxuXHQgICAgICBwcmV2U3RhdGU6IHN0YXRlLFxuXHQgICAgICBuZXh0U3RhdGU6IHN0YXRlLFxuXHQgICAgICBhY3RpdmU6IHRydWVcblx0ICAgIH07XG5cdFxuXHQgICAgbmV3QW5pbS5zdG9wID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gbmV3QW5pbS5hY3RpdmUgPSBmYWxzZTtcblx0ICAgIH07XG5cdCAgICBhbmltUnVubmluZy5wdXNoKG5ld0FuaW0pO1xuXHRcblx0ICAgIHN0YXJ0KCk7XG5cdFxuXHQgICAgcmV0dXJuIG5ld0FuaW0uc3RvcDtcblx0ICB9O1xuXHR9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSxcbi8qIDE4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRcblx0dmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblx0XG5cdGV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNvbXBvbmVudHM7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cdFxuXHR2YXIgX25vVmVsb2NpdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcblx0XG5cdHZhciBfbm9WZWxvY2l0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ub1ZlbG9jaXR5KTtcblx0XG5cdHZhciBfaGFzUmVhY2hlZFN0eWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cdFxuXHR2YXIgX2hhc1JlYWNoZWRTdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYXNSZWFjaGVkU3R5bGUpO1xuXHRcblx0dmFyIF9tZXJnZURpZmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTtcblx0XG5cdHZhciBfbWVyZ2VEaWZmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX21lcmdlRGlmZik7XG5cdFxuXHR2YXIgX2FuaW1hdGlvbkxvb3AgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcblx0XG5cdHZhciBfYW5pbWF0aW9uTG9vcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hbmltYXRpb25Mb29wKTtcblx0XG5cdHZhciBfemVybyA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpO1xuXHRcblx0dmFyIF96ZXJvMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3plcm8pO1xuXHRcblx0dmFyIF91cGRhdGVUcmVlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOCk7XG5cdFxuXHR2YXIgX2RlcHJlY2F0ZWRTcHJpbmdzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xuXHRcblx0dmFyIF9kZXByZWNhdGVkU3ByaW5nczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZXByZWNhdGVkU3ByaW5nczIpO1xuXHRcblx0dmFyIF9zdHJpcFN0eWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNyk7XG5cdFxuXHR2YXIgX3N0cmlwU3R5bGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3RyaXBTdHlsZSk7XG5cdFxuXHR2YXIgc3RhcnRBbmltYXRpb24gPSBfYW5pbWF0aW9uTG9vcDJbJ2RlZmF1bHQnXSgpO1xuXHRcblx0ZnVuY3Rpb24gbWFwT2JqZWN0KGYsIG9iaikge1xuXHQgIHZhciByZXQgPSB7fTtcblx0ICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdCAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgcmV0W2tleV0gPSBmKG9ialtrZXldLCBrZXkpO1xuXHQgIH1cblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBldmVyeU9iaihmLCBvYmopIHtcblx0ICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdCAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKCFmKG9ialtrZXldLCBrZXkpKSB7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIHRydWU7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGNvbXBvbmVudHMoUmVhY3QpIHtcblx0ICB2YXIgUHJvcFR5cGVzID0gUmVhY3QuUHJvcFR5cGVzO1xuXHRcblx0ICB2YXIgTW90aW9uID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHQgICAgZGlzcGxheU5hbWU6ICdNb3Rpb24nLFxuXHRcblx0ICAgIHByb3BUeXBlczoge1xuXHQgICAgICAvLyBUT09EOiB3YXJuIGFnYWluc3QgcHV0dGluZyBhIGNvbmZpZyBpbiBoZXJlXG5cdCAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gZGVmYXVsdFZhbHVlKHByb3AsIHByb3BOYW1lKSB7XG5cdCAgICAgICAgaWYgKHByb3BbcHJvcE5hbWVdKSB7XG5cdCAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdTcHJpbmdcXCdzIGBkZWZhdWx0VmFsdWVgIGhhcyBiZWVuIGNoYW5nZWQgdG8gYGRlZmF1bHRTdHlsZWAuICcgKyAnSXRzIGZvcm1hdCByZWNlaXZlZCBhIGZldyAoZWFzeSB0byB1cGRhdGUhKSBjaGFuZ2VzIGFzIHdlbGwuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICBlbmRWYWx1ZTogZnVuY3Rpb24gZW5kVmFsdWUocHJvcCwgcHJvcE5hbWUpIHtcblx0ICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcblx0ICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1NwcmluZ1xcJ3MgYGVuZFZhbHVlYCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGBzdHlsZWAuIEl0cyBmb3JtYXQgJyArICdyZWNlaXZlZCBhIGZldyAoZWFzeSB0byB1cGRhdGUhKSBjaGFuZ2VzIGFzIHdlbGwuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICBkZWZhdWx0U3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG5cdCAgICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG5cdCAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG5cdCAgICB9LFxuXHRcblx0ICAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKCkge1xuXHQgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcblx0ICAgICAgdmFyIGRlZmF1bHRTdHlsZSA9IF9wcm9wcy5kZWZhdWx0U3R5bGU7XG5cdCAgICAgIHZhciBzdHlsZSA9IF9wcm9wcy5zdHlsZTtcblx0XG5cdCAgICAgIHZhciBjdXJyZW50U3R5bGUgPSBkZWZhdWx0U3R5bGUgfHwgc3R5bGU7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgY3VycmVudFN0eWxlOiBjdXJyZW50U3R5bGUsXG5cdCAgICAgICAgY3VycmVudFZlbG9jaXR5OiBtYXBPYmplY3QoX3plcm8yWydkZWZhdWx0J10sIGN1cnJlbnRTdHlsZSlcblx0ICAgICAgfTtcblx0ICAgIH0sXG5cdFxuXHQgICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuXHQgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG5cdCAgICB9LFxuXHRcblx0ICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKSB7XG5cdCAgICAgIHRoaXMuc3RhcnRBbmltYXRpbmcoKTtcblx0ICAgIH0sXG5cdFxuXHQgICAgYW5pbWF0aW9uU3RlcDogZnVuY3Rpb24gYW5pbWF0aW9uU3RlcCh0aW1lc3RlcCwgc3RhdGUpIHtcblx0ICAgICAgdmFyIGN1cnJlbnRTdHlsZSA9IHN0YXRlLmN1cnJlbnRTdHlsZTtcblx0ICAgICAgdmFyIGN1cnJlbnRWZWxvY2l0eSA9IHN0YXRlLmN1cnJlbnRWZWxvY2l0eTtcblx0ICAgICAgdmFyIHN0eWxlID0gdGhpcy5wcm9wcy5zdHlsZTtcblx0XG5cdCAgICAgIHZhciBuZXdDdXJyZW50U3R5bGUgPSBfdXBkYXRlVHJlZS51cGRhdGVDdXJyZW50U3R5bGUodGltZXN0ZXAsIGN1cnJlbnRTdHlsZSwgY3VycmVudFZlbG9jaXR5LCBzdHlsZSk7XG5cdCAgICAgIHZhciBuZXdDdXJyZW50VmVsb2NpdHkgPSBfdXBkYXRlVHJlZS51cGRhdGVDdXJyZW50VmVsb2NpdHkodGltZXN0ZXAsIGN1cnJlbnRTdHlsZSwgY3VycmVudFZlbG9jaXR5LCBzdHlsZSk7XG5cdFxuXHQgICAgICAvLyBUT09EOiB0aGlzIGlzbid0IG5lY2Vzc2FyeSBhbnltb3JlLiBJdCB3YXMgdXNlZCBvbmx5IGFnYWluc3QgZW5kVmFsdWUgZnVuY1xuXHQgICAgICBpZiAoX25vVmVsb2NpdHkyWydkZWZhdWx0J10oY3VycmVudFZlbG9jaXR5LCBuZXdDdXJyZW50U3R5bGUpICYmIF9ub1ZlbG9jaXR5MlsnZGVmYXVsdCddKG5ld0N1cnJlbnRWZWxvY2l0eSwgbmV3Q3VycmVudFN0eWxlKSkge1xuXHQgICAgICAgIC8vIGNoZWNrIGV4cGxhbmF0aW9uIGluIGBNb3Rpb24uYW5pbWF0aW9uUmVuZGVyYFxuXHQgICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpOyAvLyBOYXN0eSBzaWRlIGVmZmVjdHMuLi4uXG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgY3VycmVudFN0eWxlOiBuZXdDdXJyZW50U3R5bGUsXG5cdCAgICAgICAgY3VycmVudFZlbG9jaXR5OiBuZXdDdXJyZW50VmVsb2NpdHlcblx0ICAgICAgfTtcblx0ICAgIH0sXG5cdFxuXHQgICAgc3RvcEFuaW1hdGlvbjogbnVsbCxcblx0XG5cdCAgICAvLyB1c2VkIGluIGFuaW1hdGlvblJlbmRlclxuXHQgICAgaGFzVW5tb3VudGVkOiBmYWxzZSxcblx0XG5cdCAgICBjb21wb25lbnRXaWxsVW5tb3VudDogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG5cdCAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xuXHQgICAgICB0aGlzLmhhc1VubW91bnRlZCA9IHRydWU7XG5cdCAgICB9LFxuXHRcblx0ICAgIHN0YXJ0QW5pbWF0aW5nOiBmdW5jdGlvbiBzdGFydEFuaW1hdGluZygpIHtcblx0ICAgICAgLy8gSXMgc21hcnQgZW5vdWdoIHRvIG5vdCBzdGFydCBpdCB0d2ljZVxuXHQgICAgICB0aGlzLnN0b3BBbmltYXRpb24gPSBzdGFydEFuaW1hdGlvbih0aGlzLnN0YXRlLCB0aGlzLmFuaW1hdGlvblN0ZXAsIHRoaXMuYW5pbWF0aW9uUmVuZGVyKTtcblx0ICAgIH0sXG5cdFxuXHQgICAgYW5pbWF0aW9uUmVuZGVyOiBmdW5jdGlvbiBhbmltYXRpb25SZW5kZXIoYWxwaGEsIG5leHRTdGF0ZSwgcHJldlN0YXRlKSB7XG5cdCAgICAgIC8vIGB0aGlzLmhhc1VubW91bnRlZGAgbWlnaHQgYmUgdHJ1ZSBpbiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbjpcblx0ICAgICAgLy8gdXNlciBkb2VzIHNvbWUgY2hlY2tzIGluIGBzdHlsZWAgYW5kIGNhbGxzIGFuIG93bmVyIGhhbmRsZXJcblx0ICAgICAgLy8gb3duZXIgc2V0cyBzdGF0ZSBpbiB0aGUgY2FsbGJhY2ssIHRyaWdnZXJpbmcgYSByZS1yZW5kZXJcblx0ICAgICAgLy8gdW5tb3VudHMgTW90aW9uXG5cdCAgICAgIGlmICghdGhpcy5oYXNVbm1vdW50ZWQpIHtcblx0ICAgICAgICB0aGlzLnNldFN0YXRlKHtcblx0ICAgICAgICAgIGN1cnJlbnRTdHlsZTogX3VwZGF0ZVRyZWUuaW50ZXJwb2xhdGVWYWx1ZShhbHBoYSwgbmV4dFN0YXRlLmN1cnJlbnRTdHlsZSwgcHJldlN0YXRlLmN1cnJlbnRTdHlsZSksXG5cdCAgICAgICAgICBjdXJyZW50VmVsb2NpdHk6IG5leHRTdGF0ZS5jdXJyZW50VmVsb2NpdHlcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0XG5cdCAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0ICAgICAgdmFyIHN0cmlwcGVkU3R5bGUgPSBfc3RyaXBTdHlsZTJbJ2RlZmF1bHQnXSh0aGlzLnN0YXRlLmN1cnJlbnRTdHlsZSk7XG5cdCAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbihzdHJpcHBlZFN0eWxlKTtcblx0ICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGRyZW4gJiYgUmVhY3QuQ2hpbGRyZW4ub25seShyZW5kZXJlZENoaWxkcmVuKTtcblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgdmFyIFN0YWdnZXJlZE1vdGlvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblx0ICAgIGRpc3BsYXlOYW1lOiAnU3RhZ2dlcmVkTW90aW9uJyxcblx0XG5cdCAgICBwcm9wVHlwZXM6IHtcblx0ICAgICAgZGVmYXVsdFN0eWxlOiBmdW5jdGlvbiBkZWZhdWx0U3R5bGUocHJvcCwgcHJvcE5hbWUpIHtcblx0ICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcblx0ICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBmb3Jnb3QgdGhlIFwic1wiIGZvciBgU3RhZ2dlcmVkTW90aW9uYFxcJ3MgYGRlZmF1bHRTdHlsZXNgLicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKHByb3AsIHByb3BOYW1lKSB7XG5cdCAgICAgICAgaWYgKHByb3BbcHJvcE5hbWVdKSB7XG5cdCAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdZb3UgZm9yZ290IHRoZSBcInNcIiBmb3IgYFN0YWdnZXJlZE1vdGlvbmBcXCdzIGBzdHlsZXNgLicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgLy8gVE9PRDogd2FybiBhZ2FpbnN0IHB1dHRpbmcgY29uZmlncyBpbiBoZXJlXG5cdCAgICAgIGRlZmF1bHRTdHlsZXM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuXHQgICAgICBzdHlsZXM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG5cdCAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG5cdCAgICB9LFxuXHRcblx0ICAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKCkge1xuXHQgICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHM7XG5cdCAgICAgIHZhciBzdHlsZXMgPSBfcHJvcHMyLnN0eWxlcztcblx0ICAgICAgdmFyIGRlZmF1bHRTdHlsZXMgPSBfcHJvcHMyLmRlZmF1bHRTdHlsZXM7XG5cdFxuXHQgICAgICB2YXIgY3VycmVudFN0eWxlcyA9IGRlZmF1bHRTdHlsZXMgPyBkZWZhdWx0U3R5bGVzIDogc3R5bGVzKCk7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgY3VycmVudFN0eWxlczogY3VycmVudFN0eWxlcyxcblx0ICAgICAgICBjdXJyZW50VmVsb2NpdGllczogY3VycmVudFN0eWxlcy5tYXAoZnVuY3Rpb24gKHMpIHtcblx0ICAgICAgICAgIHJldHVybiBtYXBPYmplY3QoX3plcm8yWydkZWZhdWx0J10sIHMpO1xuXHQgICAgICAgIH0pXG5cdCAgICAgIH07XG5cdCAgICB9LFxuXHRcblx0ICAgIGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcblx0ICAgICAgdGhpcy5zdGFydEFuaW1hdGluZygpO1xuXHQgICAgfSxcblx0XG5cdCAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkge1xuXHQgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG5cdCAgICB9LFxuXHRcblx0ICAgIGFuaW1hdGlvblN0ZXA6IGZ1bmN0aW9uIGFuaW1hdGlvblN0ZXAodGltZXN0ZXAsIHN0YXRlKSB7XG5cdCAgICAgIHZhciBjdXJyZW50U3R5bGVzID0gc3RhdGUuY3VycmVudFN0eWxlcztcblx0ICAgICAgdmFyIGN1cnJlbnRWZWxvY2l0aWVzID0gc3RhdGUuY3VycmVudFZlbG9jaXRpZXM7XG5cdFxuXHQgICAgICB2YXIgc3R5bGVzID0gdGhpcy5wcm9wcy5zdHlsZXMoY3VycmVudFN0eWxlcy5tYXAoX3N0cmlwU3R5bGUyWydkZWZhdWx0J10pKTtcblx0XG5cdCAgICAgIHZhciBuZXdDdXJyZW50U3R5bGVzID0gY3VycmVudFN0eWxlcy5tYXAoZnVuY3Rpb24gKGN1cnJlbnRTdHlsZSwgaSkge1xuXHQgICAgICAgIHJldHVybiBfdXBkYXRlVHJlZS51cGRhdGVDdXJyZW50U3R5bGUodGltZXN0ZXAsIGN1cnJlbnRTdHlsZSwgY3VycmVudFZlbG9jaXRpZXNbaV0sIHN0eWxlc1tpXSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICB2YXIgbmV3Q3VycmVudFZlbG9jaXRpZXMgPSBjdXJyZW50U3R5bGVzLm1hcChmdW5jdGlvbiAoY3VycmVudFN0eWxlLCBpKSB7XG5cdCAgICAgICAgcmV0dXJuIF91cGRhdGVUcmVlLnVwZGF0ZUN1cnJlbnRWZWxvY2l0eSh0aW1lc3RlcCwgY3VycmVudFN0eWxlLCBjdXJyZW50VmVsb2NpdGllc1tpXSwgc3R5bGVzW2ldKTtcblx0ICAgICAgfSk7XG5cdFxuXHQgICAgICAvLyBUT0RPOiBpcyB0aGlzIHJpZ2h0P1xuXHQgICAgICBpZiAoY3VycmVudFZlbG9jaXRpZXMuZXZlcnkoZnVuY3Rpb24gKHYsIGspIHtcblx0ICAgICAgICByZXR1cm4gX25vVmVsb2NpdHkyWydkZWZhdWx0J10odiwgY3VycmVudFN0eWxlc1trXSk7XG5cdCAgICAgIH0pICYmIG5ld0N1cnJlbnRWZWxvY2l0aWVzLmV2ZXJ5KGZ1bmN0aW9uICh2LCBrKSB7XG5cdCAgICAgICAgcmV0dXJuIF9ub1ZlbG9jaXR5MlsnZGVmYXVsdCddKHYsIG5ld0N1cnJlbnRTdHlsZXNba10pO1xuXHQgICAgICB9KSkge1xuXHQgICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGN1cnJlbnRTdHlsZXM6IG5ld0N1cnJlbnRTdHlsZXMsXG5cdCAgICAgICAgY3VycmVudFZlbG9jaXRpZXM6IG5ld0N1cnJlbnRWZWxvY2l0aWVzXG5cdCAgICAgIH07XG5cdCAgICB9LFxuXHRcblx0ICAgIHN0b3BBbmltYXRpb246IG51bGwsXG5cdFxuXHQgICAgLy8gdXNlZCBpbiBhbmltYXRpb25SZW5kZXJcblx0ICAgIGhhc1VubW91bnRlZDogZmFsc2UsXG5cdFxuXHQgICAgY29tcG9uZW50V2lsbFVubW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuXHQgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcblx0ICAgICAgdGhpcy5oYXNVbm1vdW50ZWQgPSB0cnVlO1xuXHQgICAgfSxcblx0XG5cdCAgICBzdGFydEFuaW1hdGluZzogZnVuY3Rpb24gc3RhcnRBbmltYXRpbmcoKSB7XG5cdCAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbiA9IHN0YXJ0QW5pbWF0aW9uKHRoaXMuc3RhdGUsIHRoaXMuYW5pbWF0aW9uU3RlcCwgdGhpcy5hbmltYXRpb25SZW5kZXIpO1xuXHQgICAgfSxcblx0XG5cdCAgICBhbmltYXRpb25SZW5kZXI6IGZ1bmN0aW9uIGFuaW1hdGlvblJlbmRlcihhbHBoYSwgbmV4dFN0YXRlLCBwcmV2U3RhdGUpIHtcblx0ICAgICAgLy8gU2VlIGNvbW1lbnQgaW4gTW90aW9uLlxuXHQgICAgICBpZiAoIXRoaXMuaGFzVW5tb3VudGVkKSB7XG5cdCAgICAgICAgdmFyIGN1cnJlbnRTdHlsZXMgPSBuZXh0U3RhdGUuY3VycmVudFN0eWxlcy5tYXAoZnVuY3Rpb24gKHN0eWxlLCBpKSB7XG5cdCAgICAgICAgICByZXR1cm4gX3VwZGF0ZVRyZWUuaW50ZXJwb2xhdGVWYWx1ZShhbHBoYSwgc3R5bGUsIHByZXZTdGF0ZS5jdXJyZW50U3R5bGVzW2ldKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLnNldFN0YXRlKHtcblx0ICAgICAgICAgIGN1cnJlbnRTdHlsZXM6IGN1cnJlbnRTdHlsZXMsXG5cdCAgICAgICAgICBjdXJyZW50VmVsb2NpdGllczogbmV4dFN0YXRlLmN1cnJlbnRWZWxvY2l0aWVzXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdFxuXHQgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHZhciBzdHJpcHBlZFN0eWxlID0gdGhpcy5zdGF0ZS5jdXJyZW50U3R5bGVzLm1hcChfc3RyaXBTdHlsZTJbJ2RlZmF1bHQnXSk7XG5cdCAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbihzdHJpcHBlZFN0eWxlKTtcblx0ICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGRyZW4gJiYgUmVhY3QuQ2hpbGRyZW4ub25seShyZW5kZXJlZENoaWxkcmVuKTtcblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgdmFyIFRyYW5zaXRpb25Nb3Rpb24gPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdCAgICBkaXNwbGF5TmFtZTogJ1RyYW5zaXRpb25Nb3Rpb24nLFxuXHRcblx0ICAgIHByb3BUeXBlczoge1xuXHQgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZShwcm9wLCBwcm9wTmFtZSkge1xuXHQgICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignVHJhbnNpdGlvblNwcmluZ1xcJ3MgYGRlZmF1bHRWYWx1ZWAgaGFzIGJlZW4gY2hhbmdlZCB0byAnICsgJ2BkZWZhdWx0U3R5bGVzYC4gSXRzIGZvcm1hdCByZWNlaXZlZCBhIGZldyAoZWFzeSB0byB1cGRhdGUhKSAnICsgJ2NoYW5nZXMgYXMgd2VsbC4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIGVuZFZhbHVlOiBmdW5jdGlvbiBlbmRWYWx1ZShwcm9wLCBwcm9wTmFtZSkge1xuXHQgICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignVHJhbnNpdGlvblNwcmluZ1xcJ3MgYGVuZFZhbHVlYCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGBzdHlsZXNgLiAnICsgJ0l0cyBmb3JtYXQgcmVjZWl2ZWQgYSBmZXcgKGVhc3kgdG8gdXBkYXRlISkgY2hhbmdlcyBhcyB3ZWxsLicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgZGVmYXVsdFN0eWxlOiBmdW5jdGlvbiBkZWZhdWx0U3R5bGUocHJvcCwgcHJvcE5hbWUpIHtcblx0ICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcblx0ICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBmb3Jnb3QgdGhlIFwic1wiIGZvciBgVHJhbnNpdGlvbk1vdGlvbmBcXCdzIGBkZWZhdWx0U3R5bGVzYC4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShwcm9wLCBwcm9wTmFtZSkge1xuXHQgICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignWW91IGZvcmdvdCB0aGUgXCJzXCIgZm9yIGBUcmFuc2l0aW9uTW90aW9uYFxcJ3MgYHN0eWxlc2AuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICAvLyBUT09EOiB3YXJuIGFnYWluc3QgcHV0dGluZyBjb25maWdzIGluIGhlcmVcblx0ICAgICAgZGVmYXVsdFN0eWxlczogUHJvcFR5cGVzLm9iamVjdE9mKFByb3BUeXBlcy5hbnkpLFxuXHQgICAgICBzdHlsZXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMub2JqZWN0T2YoUHJvcFR5cGVzLmFueS5pc1JlcXVpcmVkKV0pLmlzUmVxdWlyZWQsXG5cdCAgICAgIHdpbGxMZWF2ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmNdKSxcblx0ICAgICAgLy8gVE9PRDogd2FybiBhZ2FpbnN0IHB1dHRpbmcgY29uZmlncyBpbiBoZXJlXG5cdCAgICAgIHdpbGxFbnRlcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmNdKSxcblx0ICAgICAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcblx0ICAgIH0sXG5cdFxuXHQgICAgZ2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbiBnZXREZWZhdWx0UHJvcHMoKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgd2lsbEVudGVyOiBmdW5jdGlvbiB3aWxsRW50ZXIoa2V5LCB2YWx1ZSkge1xuXHQgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgd2lsbExlYXZlOiBmdW5jdGlvbiB3aWxsTGVhdmUoKSB7XG5cdCAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICB9LFxuXHRcblx0ICAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKCkge1xuXHQgICAgICB2YXIgX3Byb3BzMyA9IHRoaXMucHJvcHM7XG5cdCAgICAgIHZhciBzdHlsZXMgPSBfcHJvcHMzLnN0eWxlcztcblx0ICAgICAgdmFyIGRlZmF1bHRTdHlsZXMgPSBfcHJvcHMzLmRlZmF1bHRTdHlsZXM7XG5cdFxuXHQgICAgICB2YXIgY3VycmVudFN0eWxlcyA9IHVuZGVmaW5lZDtcblx0ICAgICAgaWYgKGRlZmF1bHRTdHlsZXMgPT0gbnVsbCkge1xuXHQgICAgICAgIGlmICh0eXBlb2Ygc3R5bGVzID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICBjdXJyZW50U3R5bGVzID0gc3R5bGVzKCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGN1cnJlbnRTdHlsZXMgPSBzdHlsZXM7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGN1cnJlbnRTdHlsZXMgPSBkZWZhdWx0U3R5bGVzO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgY3VycmVudFN0eWxlczogY3VycmVudFN0eWxlcyxcblx0ICAgICAgICBjdXJyZW50VmVsb2NpdGllczogbWFwT2JqZWN0KGZ1bmN0aW9uIChzKSB7XG5cdCAgICAgICAgICByZXR1cm4gbWFwT2JqZWN0KF96ZXJvMlsnZGVmYXVsdCddLCBzKTtcblx0ICAgICAgICB9LCBjdXJyZW50U3R5bGVzKVxuXHQgICAgICB9O1xuXHQgICAgfSxcblx0XG5cdCAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG5cdCAgICAgIHRoaXMuc3RhcnRBbmltYXRpbmcoKTtcblx0ICAgIH0sXG5cdFxuXHQgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpIHtcblx0ICAgICAgdGhpcy5zdGFydEFuaW1hdGluZygpO1xuXHQgICAgfSxcblx0XG5cdCAgICBhbmltYXRpb25TdGVwOiBmdW5jdGlvbiBhbmltYXRpb25TdGVwKHRpbWVzdGVwLCBzdGF0ZSkge1xuXHQgICAgICB2YXIgY3VycmVudFN0eWxlcyA9IHN0YXRlLmN1cnJlbnRTdHlsZXM7XG5cdCAgICAgIHZhciBjdXJyZW50VmVsb2NpdGllcyA9IHN0YXRlLmN1cnJlbnRWZWxvY2l0aWVzO1xuXHQgICAgICB2YXIgX3Byb3BzNCA9IHRoaXMucHJvcHM7XG5cdCAgICAgIHZhciBzdHlsZXMgPSBfcHJvcHM0LnN0eWxlcztcblx0ICAgICAgdmFyIHdpbGxFbnRlciA9IF9wcm9wczQud2lsbEVudGVyO1xuXHQgICAgICB2YXIgd2lsbExlYXZlID0gX3Byb3BzNC53aWxsTGVhdmU7XG5cdFxuXHQgICAgICBpZiAodHlwZW9mIHN0eWxlcyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgIHN0eWxlcyA9IHN0eWxlcyhjdXJyZW50U3R5bGVzKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgLy8gVE9ETzogaHVoP1xuXHQgICAgICB2YXIgbWVyZ2VkU3R5bGVzID0gc3R5bGVzOyAvLyBzZXQgbWVyZ2VkU3R5bGVzIHRvIHN0eWxlcyBhcyB0aGUgZGVmYXVsdFxuXHQgICAgICB2YXIgaGFzTmV3S2V5ID0gZmFsc2U7XG5cdFxuXHQgICAgICBtZXJnZWRTdHlsZXMgPSBfbWVyZ2VEaWZmMlsnZGVmYXVsdCddKGN1cnJlbnRTdHlsZXMsIHN0eWxlcyxcblx0ICAgICAgLy8gVE9ETzogc3RvcCBhbGxvY2F0aW5nIGxpa2UgY3JhenkgaW4gdGhpcyB3aG9sZSBjb2RlIHBhdGhcblx0ICAgICAgZnVuY3Rpb24gKGtleSkge1xuXHQgICAgICAgIHZhciByZXMgPSB3aWxsTGVhdmUoa2V5LCBjdXJyZW50U3R5bGVzW2tleV0sIHN0eWxlcywgY3VycmVudFN0eWxlcywgY3VycmVudFZlbG9jaXRpZXMpO1xuXHQgICAgICAgIGlmIChyZXMgPT0gbnVsbCkge1xuXHQgICAgICAgICAgLy8gRm9yIGxlZ2FjeSByZWFzb24uIFdlIHdvbid0IGFsbG93IHJldHVybmluZyBudWxsIHNvb25cblx0ICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSwgYWZ0ZXIgbmV4dCByZWxlYXNlXG5cdCAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIGlmIChfbm9WZWxvY2l0eTJbJ2RlZmF1bHQnXShjdXJyZW50VmVsb2NpdGllc1trZXldLCBjdXJyZW50U3R5bGVzW2tleV0pICYmIF9oYXNSZWFjaGVkU3R5bGUyWydkZWZhdWx0J10oY3VycmVudFN0eWxlc1trZXldLCByZXMpKSB7XG5cdCAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlcztcblx0ICAgICAgfSk7XG5cdFxuXHQgICAgICBPYmplY3Qua2V5cyhtZXJnZWRTdHlsZXMpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG5cdCAgICAgICAgcmV0dXJuICFjdXJyZW50U3R5bGVzLmhhc093blByb3BlcnR5KGtleSk7XG5cdCAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHQgICAgICAgIHZhciBfZXh0ZW5kczIsIF9leHRlbmRzMztcblx0XG5cdCAgICAgICAgaGFzTmV3S2V5ID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgZW50ZXJTdHlsZSA9IHdpbGxFbnRlcihrZXksIG1lcmdlZFN0eWxlc1trZXldLCBzdHlsZXMsIGN1cnJlbnRTdHlsZXMsIGN1cnJlbnRWZWxvY2l0aWVzKTtcblx0XG5cdCAgICAgICAgLy8gV2UgY2FuIG11dGF0ZSB0aGlzIGhlcmUgYmVjYXVzZSBtZXJnZURpZmYgcmV0dXJucyBhIG5ldyBPYmpcblx0ICAgICAgICBtZXJnZWRTdHlsZXNba2V5XSA9IGVudGVyU3R5bGU7XG5cdFxuXHQgICAgICAgIGN1cnJlbnRTdHlsZXMgPSBfZXh0ZW5kcyh7fSwgY3VycmVudFN0eWxlcywgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJba2V5XSA9IGVudGVyU3R5bGUsIF9leHRlbmRzMikpO1xuXHQgICAgICAgIGN1cnJlbnRWZWxvY2l0aWVzID0gX2V4dGVuZHMoe30sIGN1cnJlbnRWZWxvY2l0aWVzLCAoX2V4dGVuZHMzID0ge30sIF9leHRlbmRzM1trZXldID0gbWFwT2JqZWN0KF96ZXJvMlsnZGVmYXVsdCddLCBlbnRlclN0eWxlKSwgX2V4dGVuZHMzKSk7XG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgdmFyIG5ld0N1cnJlbnRTdHlsZXMgPSBtYXBPYmplY3QoZnVuY3Rpb24gKG1lcmdlZFN0eWxlLCBrZXkpIHtcblx0ICAgICAgICByZXR1cm4gX3VwZGF0ZVRyZWUudXBkYXRlQ3VycmVudFN0eWxlKHRpbWVzdGVwLCBjdXJyZW50U3R5bGVzW2tleV0sIGN1cnJlbnRWZWxvY2l0aWVzW2tleV0sIG1lcmdlZFN0eWxlKTtcblx0ICAgICAgfSwgbWVyZ2VkU3R5bGVzKTtcblx0ICAgICAgdmFyIG5ld0N1cnJlbnRWZWxvY2l0aWVzID0gbWFwT2JqZWN0KGZ1bmN0aW9uIChtZXJnZWRTdHlsZSwga2V5KSB7XG5cdCAgICAgICAgcmV0dXJuIF91cGRhdGVUcmVlLnVwZGF0ZUN1cnJlbnRWZWxvY2l0eSh0aW1lc3RlcCwgY3VycmVudFN0eWxlc1trZXldLCBjdXJyZW50VmVsb2NpdGllc1trZXldLCBtZXJnZWRTdHlsZSk7XG5cdCAgICAgIH0sIG1lcmdlZFN0eWxlcyk7XG5cdFxuXHQgICAgICBpZiAoIWhhc05ld0tleSAmJiBldmVyeU9iaihmdW5jdGlvbiAodiwgaykge1xuXHQgICAgICAgIHJldHVybiBfbm9WZWxvY2l0eTJbJ2RlZmF1bHQnXSh2LCBjdXJyZW50U3R5bGVzW2tdKTtcblx0ICAgICAgfSwgY3VycmVudFZlbG9jaXRpZXMpICYmIGV2ZXJ5T2JqKGZ1bmN0aW9uICh2LCBrKSB7XG5cdCAgICAgICAgcmV0dXJuIF9ub1ZlbG9jaXR5MlsnZGVmYXVsdCddKHYsIG5ld0N1cnJlbnRTdHlsZXNba10pO1xuXHQgICAgICB9LCBuZXdDdXJyZW50VmVsb2NpdGllcykpIHtcblx0ICAgICAgICAvLyBjaGVjayBleHBsYW5hdGlvbiBpbiBgTW90aW9uLmFuaW1hdGlvblJlbmRlcmBcblx0ICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTsgLy8gTmFzdHkgc2lkZSBlZmZlY3RzLi4uLlxuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGN1cnJlbnRTdHlsZXM6IG5ld0N1cnJlbnRTdHlsZXMsXG5cdCAgICAgICAgY3VycmVudFZlbG9jaXRpZXM6IG5ld0N1cnJlbnRWZWxvY2l0aWVzXG5cdCAgICAgIH07XG5cdCAgICB9LFxuXHRcblx0ICAgIHN0b3BBbmltYXRpb246IG51bGwsXG5cdFxuXHQgICAgLy8gdXNlZCBpbiBhbmltYXRpb25SZW5kZXJcblx0ICAgIGhhc1VubW91bnRlZDogZmFsc2UsXG5cdFxuXHQgICAgY29tcG9uZW50V2lsbFVubW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuXHQgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcblx0ICAgICAgdGhpcy5oYXNVbm1vdW50ZWQgPSB0cnVlO1xuXHQgICAgfSxcblx0XG5cdCAgICBzdGFydEFuaW1hdGluZzogZnVuY3Rpb24gc3RhcnRBbmltYXRpbmcoKSB7XG5cdCAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbiA9IHN0YXJ0QW5pbWF0aW9uKHRoaXMuc3RhdGUsIHRoaXMuYW5pbWF0aW9uU3RlcCwgdGhpcy5hbmltYXRpb25SZW5kZXIpO1xuXHQgICAgfSxcblx0XG5cdCAgICBhbmltYXRpb25SZW5kZXI6IGZ1bmN0aW9uIGFuaW1hdGlvblJlbmRlcihhbHBoYSwgbmV4dFN0YXRlLCBwcmV2U3RhdGUpIHtcblx0ICAgICAgLy8gU2VlIGNvbW1lbnQgaW4gTW90aW9uLlxuXHQgICAgICBpZiAoIXRoaXMuaGFzVW5tb3VudGVkKSB7XG5cdCAgICAgICAgdmFyIGN1cnJlbnRTdHlsZXMgPSBtYXBPYmplY3QoZnVuY3Rpb24gKHN0eWxlLCBrZXkpIHtcblx0ICAgICAgICAgIHJldHVybiBfdXBkYXRlVHJlZS5pbnRlcnBvbGF0ZVZhbHVlKGFscGhhLCBzdHlsZSwgcHJldlN0YXRlLmN1cnJlbnRTdHlsZXNba2V5XSk7XG5cdCAgICAgICAgfSwgbmV4dFN0YXRlLmN1cnJlbnRTdHlsZXMpO1xuXHQgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuXHQgICAgICAgICAgY3VycmVudFN0eWxlczogY3VycmVudFN0eWxlcyxcblx0ICAgICAgICAgIGN1cnJlbnRWZWxvY2l0aWVzOiBuZXh0U3RhdGUuY3VycmVudFZlbG9jaXRpZXNcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0XG5cdCAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0ICAgICAgdmFyIHN0cmlwcGVkU3R5bGUgPSBtYXBPYmplY3QoX3N0cmlwU3R5bGUyWydkZWZhdWx0J10sIHRoaXMuc3RhdGUuY3VycmVudFN0eWxlcyk7XG5cdCAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbihzdHJpcHBlZFN0eWxlKTtcblx0ICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGRyZW4gJiYgUmVhY3QuQ2hpbGRyZW4ub25seShyZW5kZXJlZENoaWxkcmVuKTtcblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgdmFyIF9kZXByZWNhdGVkU3ByaW5ncyA9IF9kZXByZWNhdGVkU3ByaW5nczNbJ2RlZmF1bHQnXShSZWFjdCk7XG5cdFxuXHQgIHZhciBTcHJpbmcgPSBfZGVwcmVjYXRlZFNwcmluZ3MuU3ByaW5nO1xuXHQgIHZhciBUcmFuc2l0aW9uU3ByaW5nID0gX2RlcHJlY2F0ZWRTcHJpbmdzLlRyYW5zaXRpb25TcHJpbmc7XG5cdFxuXHQgIHJldHVybiB7IFNwcmluZzogU3ByaW5nLCBUcmFuc2l0aW9uU3ByaW5nOiBUcmFuc2l0aW9uU3ByaW5nLCBNb3Rpb246IE1vdGlvbiwgU3RhZ2dlcmVkTW90aW9uOiBTdGFnZ2VyZWRNb3Rpb24sIFRyYW5zaXRpb25Nb3Rpb246IFRyYW5zaXRpb25Nb3Rpb24gfTtcblx0fVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0sXG4vKiAxOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1snZGVmYXVsdCddID0gZGVwcmVjYXRlZFNwcmluZ3M7XG5cdHZhciBoYXNXYXJuZWRGb3JTcHJpbmcgPSB7fTtcblx0dmFyIGhhc1dhcm5lZEZvclRyYW5zaXRpb25TcHJpbmcgPSB7fTtcblx0XG5cdGZ1bmN0aW9uIGRlcHJlY2F0ZWRTcHJpbmdzKFJlYWN0KSB7XG5cdCAgdmFyIFNwcmluZyA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblx0ICAgIGRpc3BsYXlOYW1lOiAnU3ByaW5nJyxcblx0XG5cdCAgICBjb21wb25lbnRXaWxsTW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcblx0ICAgICAgaWYgKGZhbHNlKSB7XG5cdCAgICAgICAgdmFyIG93bmVyTmFtZSA9IHRoaXMuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyICYmIHRoaXMuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5hbWUoKTtcblx0ICAgICAgICBpZiAoIWhhc1dhcm5lZEZvclNwcmluZ1tvd25lck5hbWVdKSB7XG5cdCAgICAgICAgICBoYXNXYXJuZWRGb3JTcHJpbmdbb3duZXJOYW1lXSA9IHRydWU7XG5cdCAgICAgICAgICBjb25zb2xlLmVycm9yKCdTcHJpbmcgKHVzZWQgaW4gJXNyZW5kZXIpIGhhcyBub3cgYmVlbiByZW5hbWVkIHRvIE1vdGlvbi4gJyArICdQbGVhc2Ugc2VlIHRoZSByZWxlYXNlIG5vdGUgZm9yIHRoZSB1cGdyYWRlIHBhdGguIFRoYW5rIHlvdSEnLCBvd25lck5hbWUgPyBvd25lck5hbWUgKyAnXFwncyAnIDogJ1JlYWN0LicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0XG5cdCAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHZhciBUcmFuc2l0aW9uU3ByaW5nID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHQgICAgZGlzcGxheU5hbWU6ICdUcmFuc2l0aW9uU3ByaW5nJyxcblx0XG5cdCAgICBjb21wb25lbnRXaWxsTW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcblx0ICAgICAgaWYgKGZhbHNlKSB7XG5cdCAgICAgICAgdmFyIG93bmVyTmFtZSA9IHRoaXMuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyICYmIHRoaXMuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5hbWUoKTtcblx0ICAgICAgICBpZiAoIWhhc1dhcm5lZEZvclRyYW5zaXRpb25TcHJpbmdbb3duZXJOYW1lXSkge1xuXHQgICAgICAgICAgaGFzV2FybmVkRm9yVHJhbnNpdGlvblNwcmluZ1tvd25lck5hbWVdID0gdHJ1ZTtcblx0ICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RyYW5zaXRpb25TcHJpbmcgKHVzZWQgaW4gJXNyZW5kZXIpIGhhcyBub3cgYmVlbiByZW5hbWVkIHRvICcgKyAnVHJhbnNpdGlvbk1vdGlvbi4gUGxlYXNlIHNlZSB0aGUgcmVsZWFzZSBub3RlIGZvciB0aGUgdXBncmFkZSAnICsgJ3BhdGguIFRoYW5rIHlvdSEnLCBvd25lck5hbWUgPyBvd25lck5hbWUgKyAnXFwncyAnIDogJ1JlYWN0LicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0XG5cdCAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiB7IFNwcmluZzogU3ByaW5nLCBUcmFuc2l0aW9uU3ByaW5nOiBUcmFuc2l0aW9uU3ByaW5nIH07XG5cdH1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9LFxuLyogMjAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBoYXNSZWFjaGVkU3R5bGU7XG5cdFxuXHRmdW5jdGlvbiBoYXNSZWFjaGVkU3R5bGUoY3VycmVudFN0eWxlLCBzdHlsZSkge1xuXHQgIGZvciAodmFyIGtleSBpbiBzdHlsZSkge1xuXHQgICAgaWYgKCFzdHlsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRTdHlsZVtrZXldO1xuXHQgICAgdmFyIGRlc3RWYWx1ZSA9IHN0eWxlW2tleV07XG5cdCAgICBpZiAoIWRlc3RWYWx1ZS5jb25maWcpIHtcblx0ICAgICAgLy8gbm90IGEgc3ByaW5nIGNvbmZpZ1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIGlmIChjdXJyZW50VmFsdWUuY29uZmlnICYmIGN1cnJlbnRWYWx1ZS52YWwgIT09IGRlc3RWYWx1ZS52YWwpIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgICAgaWYgKCFjdXJyZW50VmFsdWUuY29uZmlnICYmIGN1cnJlbnRWYWx1ZSAhPT0gZGVzdFZhbHVlLnZhbCkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gdHJ1ZTtcblx0fVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSxcbi8qIDIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyB0aGlzIGZ1bmN0aW9uIGlzIGFsbG9jYXRpb24tbGVzcyB0aGFua3MgdG8gYmFiZWwsIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHRhaWxcblx0Ly8gY2FsbHMgaW50byBsb29wc1xuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbWVyZ2VEaWZmO1xuXHRmdW5jdGlvbiBtZXJnZURpZmZBcnIoX3gsIF94MiwgX3gzLCBfeDQsIF94NSwgX3g2LCBfeDcpIHtcblx0ICB2YXIgX2FnYWluID0gdHJ1ZTtcblx0XG5cdCAgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7XG5cdCAgICB2YXIgYXJyQSA9IF94LFxuXHQgICAgICAgIGFyckIgPSBfeDIsXG5cdCAgICAgICAgY29sbEIgPSBfeDMsXG5cdCAgICAgICAgaW5kZXhBID0gX3g0LFxuXHQgICAgICAgIGluZGV4QiA9IF94NSxcblx0ICAgICAgICBvblJlbW92ZSA9IF94Nixcblx0ICAgICAgICBhY2N1bSA9IF94Nztcblx0ICAgIGVuZEEgPSBlbmRCID0ga2V5QSA9IGtleUIgPSBmaWxsID0gZmlsbCA9IHVuZGVmaW5lZDtcblx0ICAgIF9hZ2FpbiA9IGZhbHNlO1xuXHRcblx0ICAgIHZhciBlbmRBID0gaW5kZXhBID09PSBhcnJBLmxlbmd0aDtcblx0ICAgIHZhciBlbmRCID0gaW5kZXhCID09PSBhcnJCLmxlbmd0aDtcblx0ICAgIHZhciBrZXlBID0gYXJyQVtpbmRleEFdO1xuXHQgICAgdmFyIGtleUIgPSBhcnJCW2luZGV4Ql07XG5cdCAgICBpZiAoZW5kQSAmJiBlbmRCKSB7XG5cdCAgICAgIC8vIHJldHVybmluZyBudWxsIGhlcmUsIG90aGVyd2lzZSBsaW50IGNvbXBsYWlucyB0aGF0IHdlJ3JlIG5vdCBleHBlY3Rpbmdcblx0ICAgICAgLy8gYSByZXR1cm4gdmFsdWUgaW4gc3Vic2VxdWVudCBjYWxscy4gV2Uga25vdyB3aGF0IHdlJ3JlIGRvaW5nLlxuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0XG5cdCAgICBpZiAoZW5kQSkge1xuXHQgICAgICBhY2N1bVtrZXlCXSA9IGNvbGxCW2tleUJdO1xuXHQgICAgICBfeCA9IGFyckE7XG5cdCAgICAgIF94MiA9IGFyckI7XG5cdCAgICAgIF94MyA9IGNvbGxCO1xuXHQgICAgICBfeDQgPSBpbmRleEE7XG5cdCAgICAgIF94NSA9IGluZGV4QiArIDE7XG5cdCAgICAgIF94NiA9IG9uUmVtb3ZlO1xuXHQgICAgICBfeDcgPSBhY2N1bTtcblx0ICAgICAgX2FnYWluID0gdHJ1ZTtcblx0ICAgICAgY29udGludWUgX2Z1bmN0aW9uO1xuXHQgICAgfVxuXHRcblx0ICAgIGlmIChlbmRCKSB7XG5cdCAgICAgIHZhciBmaWxsID0gb25SZW1vdmUoa2V5QSk7XG5cdCAgICAgIGlmIChmaWxsICE9IG51bGwpIHtcblx0ICAgICAgICBhY2N1bVtrZXlBXSA9IGZpbGw7XG5cdCAgICAgIH1cblx0ICAgICAgX3ggPSBhcnJBO1xuXHQgICAgICBfeDIgPSBhcnJCO1xuXHQgICAgICBfeDMgPSBjb2xsQjtcblx0ICAgICAgX3g0ID0gaW5kZXhBICsgMTtcblx0ICAgICAgX3g1ID0gaW5kZXhCO1xuXHQgICAgICBfeDYgPSBvblJlbW92ZTtcblx0ICAgICAgX3g3ID0gYWNjdW07XG5cdCAgICAgIF9hZ2FpbiA9IHRydWU7XG5cdCAgICAgIGNvbnRpbnVlIF9mdW5jdGlvbjtcblx0ICAgIH1cblx0XG5cdCAgICBpZiAoa2V5QSA9PT0ga2V5Qikge1xuXHQgICAgICBhY2N1bVtrZXlBXSA9IGNvbGxCW2tleUFdO1xuXHQgICAgICBfeCA9IGFyckE7XG5cdCAgICAgIF94MiA9IGFyckI7XG5cdCAgICAgIF94MyA9IGNvbGxCO1xuXHQgICAgICBfeDQgPSBpbmRleEEgKyAxO1xuXHQgICAgICBfeDUgPSBpbmRleEIgKyAxO1xuXHQgICAgICBfeDYgPSBvblJlbW92ZTtcblx0ICAgICAgX3g3ID0gYWNjdW07XG5cdCAgICAgIF9hZ2FpbiA9IHRydWU7XG5cdCAgICAgIGNvbnRpbnVlIF9mdW5jdGlvbjtcblx0ICAgIH1cblx0XG5cdCAgICBpZiAoIWNvbGxCLmhhc093blByb3BlcnR5KGtleUEpKSB7XG5cdCAgICAgIHZhciBmaWxsID0gb25SZW1vdmUoa2V5QSk7XG5cdCAgICAgIGlmIChmaWxsICE9IG51bGwpIHtcblx0ICAgICAgICBhY2N1bVtrZXlBXSA9IGZpbGw7XG5cdCAgICAgIH1cblx0ICAgICAgX3ggPSBhcnJBO1xuXHQgICAgICBfeDIgPSBhcnJCO1xuXHQgICAgICBfeDMgPSBjb2xsQjtcblx0ICAgICAgX3g0ID0gaW5kZXhBICsgMTtcblx0ICAgICAgX3g1ID0gaW5kZXhCO1xuXHQgICAgICBfeDYgPSBvblJlbW92ZTtcblx0ICAgICAgX3g3ID0gYWNjdW07XG5cdCAgICAgIF9hZ2FpbiA9IHRydWU7XG5cdCAgICAgIGNvbnRpbnVlIF9mdW5jdGlvbjtcblx0ICAgIH1cblx0XG5cdCAgICBfeCA9IGFyckE7XG5cdCAgICBfeDIgPSBhcnJCO1xuXHQgICAgX3gzID0gY29sbEI7XG5cdCAgICBfeDQgPSBpbmRleEEgKyAxO1xuXHQgICAgX3g1ID0gaW5kZXhCO1xuXHQgICAgX3g2ID0gb25SZW1vdmU7XG5cdCAgICBfeDcgPSBhY2N1bTtcblx0ICAgIF9hZ2FpbiA9IHRydWU7XG5cdCAgICBjb250aW51ZSBfZnVuY3Rpb247XG5cdCAgfVxuXHR9XG5cdFxuXHRmdW5jdGlvbiBtZXJnZURpZmYoYSwgYiwgb25SZW1vdmUpIHtcblx0ICB2YXIgcmV0ID0ge307XG5cdCAgLy8gaWYgYW55b25lIGNhbiBtYWtlIHRoaXMgd29yayB3aXRob3V0IGFsbG9jYXRpbmcgdGhlIGFycmF5cyBoZXJlLCB3ZSdsbFxuXHQgIC8vIGdpdmUgeW91IGEgbWVkYWxcblx0ICBtZXJnZURpZmZBcnIoT2JqZWN0LmtleXMoYSksIE9iamVjdC5rZXlzKGIpLCBiLCAwLCAwLCBvblJlbW92ZSwgcmV0KTtcblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9LFxuLyogMjIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIGN1cnJlbnRTdHlsZSBrZWVwcyB0aGUgaW5mbyBhYm91dCB3aGV0aGVyIGEgcHJvcCBpcyBjb25maWd1cmVkIGFzIGEgc3ByaW5nXG5cdC8vIG9yIGlmIGl0J3MganVzdCBhIHJhbmRvbSBwcm9wIHRoYXQgaGFwcGVucyB0byBiZSBwcmVzZW50IG9uIHRoZSBzdHlsZVxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbm9WZWxvY2l0eTtcblx0XG5cdGZ1bmN0aW9uIG5vVmVsb2NpdHkoY3VycmVudFZlbG9jaXR5LCBjdXJyZW50U3R5bGUpIHtcblx0ICBmb3IgKHZhciBrZXkgaW4gY3VycmVudFZlbG9jaXR5KSB7XG5cdCAgICBpZiAoIWN1cnJlbnRWZWxvY2l0eS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKGN1cnJlbnRTdHlsZVtrZXldLmNvbmZpZyAmJiBjdXJyZW50VmVsb2NpdHlba2V5XSAhPT0gMCkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiB0cnVlO1xuXHR9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9LFxuLyogMjMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cdFxuXHR2YXIgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXHRcblx0dmFyIF9jb21wb25lbnRzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpO1xuXHRcblx0dmFyIF9jb21wb25lbnRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudHMyKTtcblx0XG5cdHZhciBfcmVvcmRlcktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KTtcblx0XG5cdHZhciBfcmVvcmRlcktleXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVvcmRlcktleXMpO1xuXHRcblx0dmFyIF9jb21wb25lbnRzID0gX2NvbXBvbmVudHMzWydkZWZhdWx0J10oX3JlYWN0MlsnZGVmYXVsdCddKTtcblx0XG5cdHZhciBTcHJpbmcgPSBfY29tcG9uZW50cy5TcHJpbmc7XG5cdHZhciBUcmFuc2l0aW9uU3ByaW5nID0gX2NvbXBvbmVudHMuVHJhbnNpdGlvblNwcmluZztcblx0dmFyIE1vdGlvbiA9IF9jb21wb25lbnRzLk1vdGlvbjtcblx0dmFyIFN0YWdnZXJlZE1vdGlvbiA9IF9jb21wb25lbnRzLlN0YWdnZXJlZE1vdGlvbjtcblx0dmFyIFRyYW5zaXRpb25Nb3Rpb24gPSBfY29tcG9uZW50cy5UcmFuc2l0aW9uTW90aW9uO1xuXHRleHBvcnRzLlNwcmluZyA9IFNwcmluZztcblx0ZXhwb3J0cy5UcmFuc2l0aW9uU3ByaW5nID0gVHJhbnNpdGlvblNwcmluZztcblx0ZXhwb3J0cy5Nb3Rpb24gPSBNb3Rpb247XG5cdGV4cG9ydHMuU3RhZ2dlcmVkTW90aW9uID0gU3RhZ2dlcmVkTW90aW9uO1xuXHRleHBvcnRzLlRyYW5zaXRpb25Nb3Rpb24gPSBUcmFuc2l0aW9uTW90aW9uO1xuXHRcblx0dmFyIF9zcHJpbmcyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cdFxuXHR2YXIgX3NwcmluZzMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zcHJpbmcyKTtcblx0XG5cdGV4cG9ydHMuc3ByaW5nID0gX3NwcmluZzNbJ2RlZmF1bHQnXTtcblx0XG5cdHZhciBfcHJlc2V0czIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHRcblx0dmFyIF9wcmVzZXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ByZXNldHMyKTtcblx0XG5cdGV4cG9ydHMucHJlc2V0cyA9IF9wcmVzZXRzM1snZGVmYXVsdCddO1xuXHR2YXIgdXRpbHMgPSB7XG5cdCAgcmVvcmRlcktleXM6IF9yZW9yZGVyS2V5czJbJ2RlZmF1bHQnXVxuXHR9O1xuXHRleHBvcnRzLnV0aWxzID0gdXRpbHM7XG5cbi8qKiovIH0sXG4vKiAyNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IHJlb3JkZXJLZXlzO1xuXHRcblx0ZnVuY3Rpb24gcmVvcmRlcktleXMob2JqLCBmKSB7XG5cdCAgdmFyIG5ld0tleXMgPSBmKE9iamVjdC5rZXlzKG9iaikpO1xuXHQgIHZhciByZXQgPSB7fTtcblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0tleXMubGVuZ3RoOyBpKyspIHtcblx0ICAgIHZhciBrZXkgPSBuZXdLZXlzW2ldO1xuXHQgICAgcmV0W2tleV0gPSBvYmpba2V5XTtcblx0ICB9XG5cdFxuXHQgIHJldHVybiByZXQ7XG5cdH1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cbi8qKiovIH0sXG4vKiAyNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1snZGVmYXVsdCddID0gc3ByaW5nO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXHRcblx0dmFyIF9wcmVzZXRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0XG5cdHZhciBfcHJlc2V0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcmVzZXRzKTtcblx0XG5cdC8vIGluc3RlYWQgb2YgZXhwb3Npbmcge3ZhbDogYmxhLCBjb25maWc6IGJsYX0sIHVzZSBhIGhlbHBlclxuXHRcblx0ZnVuY3Rpb24gc3ByaW5nKHZhbCkge1xuXHQgIHZhciBjb25maWcgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBfcHJlc2V0czJbJ2RlZmF1bHQnXS5ub1dvYmJsZSA6IGFyZ3VtZW50c1sxXTtcblx0XG5cdCAgcmV0dXJuIHsgdmFsOiB2YWwsIGNvbmZpZzogY29uZmlnIH07XG5cdH1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9LFxuLyogMjYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBzdGVwcGVyO1xuXHR2YXIgZXJyb3JNYXJnaW4gPSAwLjAwMDE7XG5cdFxuXHRmdW5jdGlvbiBzdGVwcGVyKGZyYW1lUmF0ZSwgeCwgdiwgZGVzdFgsIGssIGIpIHtcblx0ICAvLyBTcHJpbmcgc3RpZmZuZXNzLCBpbiBrZyAvIHNeMlxuXHRcblx0ICAvLyBmb3IgYW5pbWF0aW9ucywgZGVzdFggaXMgcmVhbGx5IHNwcmluZyBsZW5ndGggKHNwcmluZyBhdCByZXN0KS4gaW5pdGlhbFxuXHQgIC8vIHBvc2l0aW9uIGlzIGNvbnNpZGVyZWQgYXMgdGhlIHN0cmV0Y2hlZC9jb21wcmVzc2VkIHBvc2l0aW9uIG9mIGEgc3ByaW5nXG5cdCAgdmFyIEZzcHJpbmcgPSAtayAqICh4IC0gZGVzdFgpO1xuXHRcblx0ICAvLyBEYW1waW5nLCBpbiBrZyAvIHNcblx0ICB2YXIgRmRhbXBlciA9IC1iICogdjtcblx0XG5cdCAgLy8gdXN1YWxseSB3ZSBwdXQgbWFzcyBoZXJlLCBidXQgZm9yIGFuaW1hdGlvbiBwdXJwb3Nlcywgc3BlY2lmeWluZyBtYXNzIGlzIGFcblx0ICAvLyBiaXQgcmVkdW5kYW50LiB5b3UgY291bGQgc2ltcGx5IGFkanVzdCBrIGFuZCBiIGFjY29yZGluZ2x5XG5cdCAgLy8gbGV0IGEgPSAoRnNwcmluZyArIEZkYW1wZXIpIC8gbWFzcztcblx0ICB2YXIgYSA9IEZzcHJpbmcgKyBGZGFtcGVyO1xuXHRcblx0ICB2YXIgbmV3ViA9IHYgKyBhICogZnJhbWVSYXRlO1xuXHQgIHZhciBuZXdYID0geCArIG5ld1YgKiBmcmFtZVJhdGU7XG5cdFxuXHQgIGlmIChNYXRoLmFicyhuZXdWIC0gdikgPCBlcnJvck1hcmdpbiAmJiBNYXRoLmFicyhuZXdYIC0geCkgPCBlcnJvck1hcmdpbikge1xuXHQgICAgcmV0dXJuIFtkZXN0WCwgMF07XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gW25ld1gsIG5ld1ZdO1xuXHR9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9LFxuLyogMjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIHR1cm4ge3g6IHt2YWw6IDEsIGNvbmZpZzogWzEsIDJdfSwgeTogMn0gaW50byB7eDogMSwgeTogMn1cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IHN0cmlwU3R5bGU7XG5cdFxuXHRmdW5jdGlvbiBzdHJpcFN0eWxlKHN0eWxlKSB7XG5cdCAgdmFyIHJldCA9IHt9O1xuXHQgIGZvciAodmFyIGtleSBpbiBzdHlsZSkge1xuXHQgICAgaWYgKCFzdHlsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgcmV0W2tleV0gPSBzdHlsZVtrZXldLnZhbCA9PSBudWxsID8gc3R5bGVba2V5XSA6IHN0eWxlW2tleV0udmFsO1xuXHQgIH1cblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9LFxuLyogMjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuaW50ZXJwb2xhdGVWYWx1ZSA9IGludGVycG9sYXRlVmFsdWU7XG5cdGV4cG9ydHMudXBkYXRlQ3VycmVudFN0eWxlID0gdXBkYXRlQ3VycmVudFN0eWxlO1xuXHRleHBvcnRzLnVwZGF0ZUN1cnJlbnRWZWxvY2l0eSA9IHVwZGF0ZUN1cnJlbnRWZWxvY2l0eTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblx0XG5cdHZhciBfc3RlcHBlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpO1xuXHRcblx0dmFyIF9zdGVwcGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0ZXBwZXIpO1xuXHRcblx0Ly8gVE9ETzogcmVmYWN0b3IgY29tbW9uIGxvZ2ljIHdpdGggdXBkYXRlQ3VyclZhbHVlIGFuZCB1cGRhdGVDdXJyVmVsb2NpdHlcblx0XG5cdGZ1bmN0aW9uIGludGVycG9sYXRlVmFsdWUoYWxwaGEsIG5leHRTdHlsZSwgcHJldlN0eWxlKSB7XG5cdCAgLy8gbWlnaHQgYmUgdXNlZCBieSBhIFRyYW5zaXRpb25Nb3Rpb24sIHdoZXJlIHByZXZTdHlsZSBtaWdodCBub3QgZXhpc3QgYW55bW9yZVxuXHQgIGlmICghcHJldlN0eWxlKSB7XG5cdCAgICByZXR1cm4gbmV4dFN0eWxlO1xuXHQgIH1cblx0XG5cdCAgdmFyIHJldCA9IHt9O1xuXHQgIGZvciAodmFyIGtleSBpbiBuZXh0U3R5bGUpIHtcblx0ICAgIGlmICghbmV4dFN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0ICAgICAgY29udGludWU7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKCFuZXh0U3R5bGVba2V5XS5jb25maWcpIHtcblx0ICAgICAgcmV0W2tleV0gPSBuZXh0U3R5bGVba2V5XTtcblx0ICAgICAgLy8gbm90IGEgc3ByaW5nIGNvbmZpZywgbm90IHNvbWV0aGluZyB3ZSB3YW50IHRvIGludGVycG9sYXRlXG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgdmFyIHByZXZWYWx1ZSA9IHByZXZTdHlsZVtrZXldLmNvbmZpZyA/IHByZXZTdHlsZVtrZXldLnZhbCA6IHByZXZTdHlsZVtrZXldO1xuXHQgICAgcmV0W2tleV0gPSB7XG5cdCAgICAgIHZhbDogbmV4dFN0eWxlW2tleV0udmFsICogYWxwaGEgKyBwcmV2VmFsdWUgKiAoMSAtIGFscGhhKSxcblx0ICAgICAgY29uZmlnOiBuZXh0U3R5bGVba2V5XS5jb25maWdcblx0ICAgIH07XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cdFxuXHQvLyBUT0RPOiByZWZhY3RvciBjb21tb24gbG9naWMgd2l0aCB1cGRhdGVDdXJyZW50VmVsb2NpdHlcblx0XG5cdGZ1bmN0aW9uIHVwZGF0ZUN1cnJlbnRTdHlsZShmcmFtZVJhdGUsIGN1cnJlbnRTdHlsZSwgY3VycmVudFZlbG9jaXR5LCBzdHlsZSkge1xuXHQgIHZhciByZXQgPSB7fTtcblx0ICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcblx0ICAgIGlmICghc3R5bGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIGlmICghc3R5bGVba2V5XS5jb25maWcpIHtcblx0ICAgICAgcmV0W2tleV0gPSBzdHlsZVtrZXldO1xuXHQgICAgICAvLyBub3QgYSBzcHJpbmcgY29uZmlnLCBub3Qgc29tZXRoaW5nIHdlIHdhbnQgdG8gaW50ZXJwb2xhdGVcblx0ICAgICAgY29udGludWU7XG5cdCAgICB9XG5cdCAgICB2YXIgX3N0eWxlJGtleSRjb25maWcgPSBzdHlsZVtrZXldLmNvbmZpZztcblx0ICAgIHZhciBrID0gX3N0eWxlJGtleSRjb25maWdbMF07XG5cdCAgICB2YXIgYiA9IF9zdHlsZSRrZXkkY29uZmlnWzFdO1xuXHRcblx0ICAgIHZhciB2YWwgPSBfc3RlcHBlcjJbJ2RlZmF1bHQnXShmcmFtZVJhdGUsXG5cdCAgICAvLyBtaWdodCBoYXZlIGJlZW4gYSBub24tc3ByaW5nZWQgcHJvcCB0aGF0IGp1c3QgYmVjYW1lIG9uZVxuXHQgICAgY3VycmVudFN0eWxlW2tleV0udmFsID09IG51bGwgPyBjdXJyZW50U3R5bGVba2V5XSA6IGN1cnJlbnRTdHlsZVtrZXldLnZhbCwgY3VycmVudFZlbG9jaXR5W2tleV0sIHN0eWxlW2tleV0udmFsLCBrLCBiKVswXTtcblx0ICAgIHJldFtrZXldID0ge1xuXHQgICAgICB2YWw6IHZhbCxcblx0ICAgICAgY29uZmlnOiBzdHlsZVtrZXldLmNvbmZpZ1xuXHQgICAgfTtcblx0ICB9XG5cdCAgcmV0dXJuIHJldDtcblx0fVxuXHRcblx0ZnVuY3Rpb24gdXBkYXRlQ3VycmVudFZlbG9jaXR5KGZyYW1lUmF0ZSwgY3VycmVudFN0eWxlLCBjdXJyZW50VmVsb2NpdHksIHN0eWxlKSB7XG5cdCAgdmFyIHJldCA9IHt9O1xuXHQgIGZvciAodmFyIGtleSBpbiBzdHlsZSkge1xuXHQgICAgaWYgKCFzdHlsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKCFzdHlsZVtrZXldLmNvbmZpZykge1xuXHQgICAgICAvLyBub3QgYSBzcHJpbmcgY29uZmlnLCBub3Qgc29tZXRoaW5nIHdlIHdhbnQgdG8gaW50ZXJwb2xhdGVcblx0ICAgICAgcmV0W2tleV0gPSAwO1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIHZhciBfc3R5bGUka2V5JGNvbmZpZzIgPSBzdHlsZVtrZXldLmNvbmZpZztcblx0ICAgIHZhciBrID0gX3N0eWxlJGtleSRjb25maWcyWzBdO1xuXHQgICAgdmFyIGIgPSBfc3R5bGUka2V5JGNvbmZpZzJbMV07XG5cdFxuXHQgICAgdmFyIHZhbCA9IF9zdGVwcGVyMlsnZGVmYXVsdCddKGZyYW1lUmF0ZSxcblx0ICAgIC8vIG1pZ2h0IGhhdmUgYmVlbiBhIG5vbi1zcHJpbmdlZCBwcm9wIHRoYXQganVzdCBiZWNhbWUgb25lXG5cdCAgICBjdXJyZW50U3R5bGVba2V5XS52YWwgPT0gbnVsbCA/IGN1cnJlbnRTdHlsZVtrZXldIDogY3VycmVudFN0eWxlW2tleV0udmFsLCBjdXJyZW50VmVsb2NpdHlba2V5XSwgc3R5bGVba2V5XS52YWwsIGssIGIpWzFdO1xuXHQgICAgcmV0W2tleV0gPSB2YWw7XG5cdCAgfVxuXHQgIHJldHVybiByZXQ7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDI5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyB1c2VkIGJ5IHRoZSB0cmVlLXdhbGtpbmcgdXBkYXRlcyBhbmQgc3ByaW5ncy4gQXZvaWRzIHNvbWUgYWxsb2NhdGlvbnNcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IHplcm87XG5cdFxuXHRmdW5jdGlvbiB6ZXJvKCkge1xuXHQgIHJldHVybiAwO1xuXHR9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9LFxuLyogMzAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBub3cgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCBnbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IHt9IDogd2luZG93XG5cdCAgLCB2ZW5kb3JzID0gWydtb3onLCAnd2Via2l0J11cblx0ICAsIHN1ZmZpeCA9ICdBbmltYXRpb25GcmFtZSdcblx0ICAsIHJhZiA9IGdsb2JhbFsncmVxdWVzdCcgKyBzdWZmaXhdXG5cdCAgLCBjYWYgPSBnbG9iYWxbJ2NhbmNlbCcgKyBzdWZmaXhdIHx8IGdsb2JhbFsnY2FuY2VsUmVxdWVzdCcgKyBzdWZmaXhdXG5cdFxuXHRmb3IodmFyIGkgPSAwOyBpIDwgdmVuZG9ycy5sZW5ndGggJiYgIXJhZjsgaSsrKSB7XG5cdCAgcmFmID0gZ2xvYmFsW3ZlbmRvcnNbaV0gKyAnUmVxdWVzdCcgKyBzdWZmaXhdXG5cdCAgY2FmID0gZ2xvYmFsW3ZlbmRvcnNbaV0gKyAnQ2FuY2VsJyArIHN1ZmZpeF1cblx0ICAgICAgfHwgZ2xvYmFsW3ZlbmRvcnNbaV0gKyAnQ2FuY2VsUmVxdWVzdCcgKyBzdWZmaXhdXG5cdH1cblx0XG5cdC8vIFNvbWUgdmVyc2lvbnMgb2YgRkYgaGF2ZSByQUYgYnV0IG5vdCBjQUZcblx0aWYoIXJhZiB8fCAhY2FmKSB7XG5cdCAgdmFyIGxhc3QgPSAwXG5cdCAgICAsIGlkID0gMFxuXHQgICAgLCBxdWV1ZSA9IFtdXG5cdCAgICAsIGZyYW1lRHVyYXRpb24gPSAxMDAwIC8gNjBcblx0XG5cdCAgcmFmID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcblx0ICAgIGlmKHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICB2YXIgX25vdyA9IG5vdygpXG5cdCAgICAgICAgLCBuZXh0ID0gTWF0aC5tYXgoMCwgZnJhbWVEdXJhdGlvbiAtIChfbm93IC0gbGFzdCkpXG5cdCAgICAgIGxhc3QgPSBuZXh0ICsgX25vd1xuXHQgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHZhciBjcCA9IHF1ZXVlLnNsaWNlKDApXG5cdCAgICAgICAgLy8gQ2xlYXIgcXVldWUgaGVyZSB0byBwcmV2ZW50XG5cdCAgICAgICAgLy8gY2FsbGJhY2tzIGZyb20gYXBwZW5kaW5nIGxpc3RlbmVyc1xuXHQgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGZyYW1lJ3MgcXVldWVcblx0ICAgICAgICBxdWV1ZS5sZW5ndGggPSAwXG5cdCAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICBpZighY3BbaV0uY2FuY2VsbGVkKSB7XG5cdCAgICAgICAgICAgIHRyeXtcblx0ICAgICAgICAgICAgICBjcFtpXS5jYWxsYmFjayhsYXN0KVxuXHQgICAgICAgICAgICB9IGNhdGNoKGUpIHtcblx0ICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0aHJvdyBlIH0sIDApXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIE1hdGgucm91bmQobmV4dCkpXG5cdCAgICB9XG5cdCAgICBxdWV1ZS5wdXNoKHtcblx0ICAgICAgaGFuZGxlOiArK2lkLFxuXHQgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG5cdCAgICAgIGNhbmNlbGxlZDogZmFsc2Vcblx0ICAgIH0pXG5cdCAgICByZXR1cm4gaWRcblx0ICB9XG5cdFxuXHQgIGNhZiA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuXHQgICAgZm9yKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIGlmKHF1ZXVlW2ldLmhhbmRsZSA9PT0gaGFuZGxlKSB7XG5cdCAgICAgICAgcXVldWVbaV0uY2FuY2VsbGVkID0gdHJ1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuKSB7XG5cdCAgLy8gV3JhcCBpbiBhIG5ldyBmdW5jdGlvbiB0byBwcmV2ZW50XG5cdCAgLy8gYGNhbmNlbGAgcG90ZW50aWFsbHkgYmVpbmcgYXNzaWduZWRcblx0ICAvLyB0byB0aGUgbmF0aXZlIHJBRiBmdW5jdGlvblxuXHQgIHJldHVybiByYWYuY2FsbChnbG9iYWwsIGZuKVxuXHR9XG5cdG1vZHVsZS5leHBvcnRzLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuXHQgIGNhZi5hcHBseShnbG9iYWwsIGFyZ3VtZW50cylcblx0fVxuXG5cbi8qKiovIH0sXG4vKiAzMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LypcclxuXHRcdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcblx0XHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXHJcblx0Ki9cclxuXHR2YXIgc3R5bGVzSW5Eb20gPSB7fSxcclxuXHRcdG1lbW9pemUgPSBmdW5jdGlvbihmbikge1xyXG5cdFx0XHR2YXIgbWVtbztcclxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRpZiAodHlwZW9mIG1lbW8gPT09IFwidW5kZWZpbmVkXCIpIG1lbW8gPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG5cdFx0XHRcdHJldHVybiBtZW1vO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSxcclxuXHRcdGlzT2xkSUUgPSBtZW1vaXplKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZXR1cm4gL21zaWUgWzYtOV1cXGIvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7XHJcblx0XHR9KSxcclxuXHRcdGdldEhlYWRFbGVtZW50ID0gbWVtb2l6ZShmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJldHVybiBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcclxuXHRcdH0pLFxyXG5cdFx0c2luZ2xldG9uRWxlbWVudCA9IG51bGwsXHJcblx0XHRzaW5nbGV0b25Db3VudGVyID0gMDtcclxuXHRcclxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGxpc3QsIG9wdGlvbnMpIHtcclxuXHRcdGlmKHRydWUpIHtcclxuXHRcdFx0aWYodHlwZW9mIGRvY3VtZW50ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIik7XHJcblx0XHR9XHJcblx0XHJcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuXHRcdC8vIEZvcmNlIHNpbmdsZS10YWcgc29sdXRpb24gb24gSUU2LTksIHdoaWNoIGhhcyBhIGhhcmQgbGltaXQgb24gdGhlICMgb2YgPHN0eWxlPlxyXG5cdFx0Ly8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxyXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zLnNpbmdsZXRvbiA9PT0gXCJ1bmRlZmluZWRcIikgb3B0aW9ucy5zaW5nbGV0b24gPSBpc09sZElFKCk7XHJcblx0XHJcblx0XHR2YXIgc3R5bGVzID0gbGlzdFRvU3R5bGVzKGxpc3QpO1xyXG5cdFx0YWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKTtcclxuXHRcclxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xyXG5cdFx0XHR2YXIgbWF5UmVtb3ZlID0gW107XHJcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcclxuXHRcdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcclxuXHRcdFx0XHRkb21TdHlsZS5yZWZzLS07XHJcblx0XHRcdFx0bWF5UmVtb3ZlLnB1c2goZG9tU3R5bGUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKG5ld0xpc3QpIHtcclxuXHRcdFx0XHR2YXIgbmV3U3R5bGVzID0gbGlzdFRvU3R5bGVzKG5ld0xpc3QpO1xyXG5cdFx0XHRcdGFkZFN0eWxlc1RvRG9tKG5ld1N0eWxlcywgb3B0aW9ucyk7XHJcblx0XHRcdH1cclxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IG1heVJlbW92ZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBkb21TdHlsZSA9IG1heVJlbW92ZVtpXTtcclxuXHRcdFx0XHRpZihkb21TdHlsZS5yZWZzID09PSAwKSB7XHJcblx0XHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspXHJcblx0XHRcdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKCk7XHJcblx0XHRcdFx0XHRkZWxldGUgc3R5bGVzSW5Eb21bZG9tU3R5bGUuaWRdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHR9XHJcblx0XHJcblx0ZnVuY3Rpb24gYWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKSB7XHJcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xyXG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcclxuXHRcdFx0aWYoZG9tU3R5bGUpIHtcclxuXHRcdFx0XHRkb21TdHlsZS5yZWZzKys7XHJcblx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXShpdGVtLnBhcnRzW2pdKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Zm9yKDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdGRvbVN0eWxlLnBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR2YXIgcGFydHMgPSBbXTtcclxuXHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdFx0cGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHN0eWxlc0luRG9tW2l0ZW0uaWRdID0ge2lkOiBpdGVtLmlkLCByZWZzOiAxLCBwYXJ0czogcGFydHN9O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cdGZ1bmN0aW9uIGxpc3RUb1N0eWxlcyhsaXN0KSB7XHJcblx0XHR2YXIgc3R5bGVzID0gW107XHJcblx0XHR2YXIgbmV3U3R5bGVzID0ge307XHJcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgaXRlbSA9IGxpc3RbaV07XHJcblx0XHRcdHZhciBpZCA9IGl0ZW1bMF07XHJcblx0XHRcdHZhciBjc3MgPSBpdGVtWzFdO1xyXG5cdFx0XHR2YXIgbWVkaWEgPSBpdGVtWzJdO1xyXG5cdFx0XHR2YXIgc291cmNlTWFwID0gaXRlbVszXTtcclxuXHRcdFx0dmFyIHBhcnQgPSB7Y3NzOiBjc3MsIG1lZGlhOiBtZWRpYSwgc291cmNlTWFwOiBzb3VyY2VNYXB9O1xyXG5cdFx0XHRpZighbmV3U3R5bGVzW2lkXSlcclxuXHRcdFx0XHRzdHlsZXMucHVzaChuZXdTdHlsZXNbaWRdID0ge2lkOiBpZCwgcGFydHM6IFtwYXJ0XX0pO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdFx0bmV3U3R5bGVzW2lkXS5wYXJ0cy5wdXNoKHBhcnQpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHN0eWxlcztcclxuXHR9XHJcblx0XHJcblx0ZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KCkge1xyXG5cdFx0dmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcclxuXHRcdHZhciBoZWFkID0gZ2V0SGVhZEVsZW1lbnQoKTtcclxuXHRcdHN0eWxlRWxlbWVudC50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xyXG5cdFx0aGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xyXG5cdFx0cmV0dXJuIHN0eWxlRWxlbWVudDtcclxuXHR9XHJcblx0XHJcblx0ZnVuY3Rpb24gY3JlYXRlTGlua0VsZW1lbnQoKSB7XHJcblx0XHR2YXIgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcclxuXHRcdHZhciBoZWFkID0gZ2V0SGVhZEVsZW1lbnQoKTtcclxuXHRcdGxpbmtFbGVtZW50LnJlbCA9IFwic3R5bGVzaGVldFwiO1xyXG5cdFx0aGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XHJcblx0XHRyZXR1cm4gbGlua0VsZW1lbnQ7XHJcblx0fVxyXG5cdFxyXG5cdGZ1bmN0aW9uIGFkZFN0eWxlKG9iaiwgb3B0aW9ucykge1xyXG5cdFx0dmFyIHN0eWxlRWxlbWVudCwgdXBkYXRlLCByZW1vdmU7XHJcblx0XHJcblx0XHRpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcclxuXHRcdFx0dmFyIHN0eWxlSW5kZXggPSBzaW5nbGV0b25Db3VudGVyKys7XHJcblx0XHRcdHN0eWxlRWxlbWVudCA9IHNpbmdsZXRvbkVsZW1lbnQgfHwgKHNpbmdsZXRvbkVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQoKSk7XHJcblx0XHRcdHVwZGF0ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQsIHN0eWxlSW5kZXgsIGZhbHNlKTtcclxuXHRcdFx0cmVtb3ZlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgdHJ1ZSk7XHJcblx0XHR9IGVsc2UgaWYob2JqLnNvdXJjZU1hcCAmJlxyXG5cdFx0XHR0eXBlb2YgVVJMID09PSBcImZ1bmN0aW9uXCIgJiZcclxuXHRcdFx0dHlwZW9mIFVSTC5jcmVhdGVPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG5cdFx0XHR0eXBlb2YgVVJMLnJldm9rZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHRcdHR5cGVvZiBCbG9iID09PSBcImZ1bmN0aW9uXCIgJiZcclxuXHRcdFx0dHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xyXG5cdFx0XHRzdHlsZUVsZW1lbnQgPSBjcmVhdGVMaW5rRWxlbWVudCgpO1xyXG5cdFx0XHR1cGRhdGUgPSB1cGRhdGVMaW5rLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50KTtcclxuXHRcdFx0cmVtb3ZlID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0c3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcclxuXHRcdFx0XHRpZihzdHlsZUVsZW1lbnQuaHJlZilcclxuXHRcdFx0XHRcdFVSTC5yZXZva2VPYmplY3RVUkwoc3R5bGVFbGVtZW50LmhyZWYpO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0c3R5bGVFbGVtZW50ID0gY3JlYXRlU3R5bGVFbGVtZW50KCk7XHJcblx0XHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQpO1xyXG5cdFx0XHRyZW1vdmUgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdFxyXG5cdFx0dXBkYXRlKG9iaik7XHJcblx0XHJcblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUobmV3T2JqKSB7XHJcblx0XHRcdGlmKG5ld09iaikge1xyXG5cdFx0XHRcdGlmKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcClcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR1cGRhdGUob2JqID0gbmV3T2JqKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRyZW1vdmUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHR9XHJcblx0XHJcblx0dmFyIHJlcGxhY2VUZXh0ID0gKGZ1bmN0aW9uICgpIHtcclxuXHRcdHZhciB0ZXh0U3RvcmUgPSBbXTtcclxuXHRcclxuXHRcdHJldHVybiBmdW5jdGlvbiAoaW5kZXgsIHJlcGxhY2VtZW50KSB7XHJcblx0XHRcdHRleHRTdG9yZVtpbmRleF0gPSByZXBsYWNlbWVudDtcclxuXHRcdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XHJcblx0XHR9O1xyXG5cdH0pKCk7XHJcblx0XHJcblx0ZnVuY3Rpb24gYXBwbHlUb1NpbmdsZXRvblRhZyhzdHlsZUVsZW1lbnQsIGluZGV4LCByZW1vdmUsIG9iaikge1xyXG5cdFx0dmFyIGNzcyA9IHJlbW92ZSA/IFwiXCIgOiBvYmouY3NzO1xyXG5cdFxyXG5cdFx0aWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XHJcblx0XHRcdHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSByZXBsYWNlVGV4dChpbmRleCwgY3NzKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHZhciBjc3NOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKTtcclxuXHRcdFx0dmFyIGNoaWxkTm9kZXMgPSBzdHlsZUVsZW1lbnQuY2hpbGROb2RlcztcclxuXHRcdFx0aWYgKGNoaWxkTm9kZXNbaW5kZXhdKSBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xyXG5cdFx0XHRpZiAoY2hpbGROb2Rlcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRzdHlsZUVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoY3NzTm9kZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0XHJcblx0ZnVuY3Rpb24gYXBwbHlUb1RhZyhzdHlsZUVsZW1lbnQsIG9iaikge1xyXG5cdFx0dmFyIGNzcyA9IG9iai5jc3M7XHJcblx0XHR2YXIgbWVkaWEgPSBvYmoubWVkaWE7XHJcblx0XHR2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcclxuXHRcclxuXHRcdGlmKG1lZGlhKSB7XHJcblx0XHRcdHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBtZWRpYSlcclxuXHRcdH1cclxuXHRcclxuXHRcdGlmKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XHJcblx0XHRcdHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR3aGlsZShzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xyXG5cdFx0XHRcdHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XHJcblx0XHRcdH1cclxuXHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHRmdW5jdGlvbiB1cGRhdGVMaW5rKGxpbmtFbGVtZW50LCBvYmopIHtcclxuXHRcdHZhciBjc3MgPSBvYmouY3NzO1xyXG5cdFx0dmFyIG1lZGlhID0gb2JqLm1lZGlhO1xyXG5cdFx0dmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XHJcblx0XHJcblx0XHRpZihzb3VyY2VNYXApIHtcclxuXHRcdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjY2MDM4NzVcclxuXHRcdFx0Y3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIiArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSkgKyBcIiAqL1wiO1xyXG5cdFx0fVxyXG5cdFxyXG5cdFx0dmFyIGJsb2IgPSBuZXcgQmxvYihbY3NzXSwgeyB0eXBlOiBcInRleHQvY3NzXCIgfSk7XHJcblx0XHJcblx0XHR2YXIgb2xkU3JjID0gbGlua0VsZW1lbnQuaHJlZjtcclxuXHRcclxuXHRcdGxpbmtFbGVtZW50LmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cdFxyXG5cdFx0aWYob2xkU3JjKVxyXG5cdFx0XHRVUkwucmV2b2tlT2JqZWN0VVJMKG9sZFNyYyk7XHJcblx0fVxyXG5cblxuLyoqKi8gfSxcbi8qIDMyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzIS4vLi4vLi4vbm9kZV9tb2R1bGVzL2F1dG9wcmVmaXhlci1sb2FkZXIvaW5kZXguanM/YnJvd3NlcnM9bGFzdCAyIHZlcnNpb24hLi8uLi8uLi9ub2RlX21vZHVsZXMvc2Fzcy1sb2FkZXIvaW5kZXguanMhLi9tYWluLnNjc3NcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcyEuLy4uLy4uL25vZGVfbW9kdWxlcy9hdXRvcHJlZml4ZXItbG9hZGVyL2luZGV4LmpzP2Jyb3dzZXJzPWxhc3QgMiB2ZXJzaW9uIS4vLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2luZGV4LmpzIS4vbWFpbi5zY3NzXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMzMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHZpZXdCb3g9XFxcIjAgMCAyNjgxIDgxNFxcXCIgdmVyc2lvbj1cXFwiMS4xXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIiB4bWxuczpza2V0Y2g9XFxcImh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9uc1xcXCI+PHRpdGxlPkNsaW1iIExvZ28gQmV0YTwvdGl0bGU+PGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+PGRlZnM+PC9kZWZzPjxnIGlkPVxcXCJQYWdlLTFcXFwiIHN0cm9rZT1cXFwibm9uZVxcXCIgc3Ryb2tlLXdpZHRoPVxcXCIxXFxcIiBmaWxsPVxcXCJub25lXFxcIiBmaWxsLXJ1bGU9XFxcImV2ZW5vZGRcXFwiIHNrZXRjaDp0eXBlPVxcXCJNU1BhZ2VcXFwiPjxnIGlkPVxcXCJDbGltYi1Mb2dvLUJldGFcXFwiIHNrZXRjaDp0eXBlPVxcXCJNU0FydGJvYXJkR3JvdXBcXFwiIGZpbGw9XFxcIiMxOTM3NERcXFwiPjxnIGlkPVxcXCJjbGktLS0tYi5zb2NpYWwtKy1QYXRoLUNvcHktKy1UeXBlLXNvbWV0aGluZy1Db3B5LUNvcHktQ29weS1Db3B5LUNvcHlcXFwiIHNrZXRjaDp0eXBlPVxcXCJNU0xheWVyR3JvdXBcXFwiIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKDIwNi4wMDAwMDAsIDI0OS4wMDAwMDApXFxcIj48ZyBpZD1cXFwiY2xpLS0tLWIuc29jaWFsLSstUGF0aC1Db3B5XFxcIiBza2V0Y2g6dHlwZT1cXFwiTVNTaGFwZUdyb3VwXFxcIj48cGF0aCBkPVxcXCJNNzIzLjM3NDIwNywxODcuNDQyMjExIEw3NjcuMDI3NjQxLDMzNy4zODM1NzUgQzc2Ny41MTA4ODksMzQxLjI2NTU1MiA3NzEuODYwMTI0LDM0NS4xNDc1MjkgNzc2LjIwOTM1OSwzNDUuMTQ3NTI5IEw4MzMuMjMyNjY0LDM0NS4xNDc1MjkgQzgzOS4wMzE2NDQsMzQ1LjE0NzUyOSA4NDMuMzgwODc5LDM0MC43ODAzMDUgODQyLjQxNDM4MywzMzQuNDcyMDkyIEw3MzkuNDgyNDg1LDguMzg2MDE5ODIgQzczOC45OTkyMzcsNC4wMTg3OTU2NCA3MzQuNjUwMDAyLDAuNjIyMDY1NzI4IDczMC43ODQwMTUsMC42MjIwNjU3MjggTDcyMy4wNTIwNDEsMC42MjIwNjU3MjggQzcyMC42MzU4LDAuNjIyMDY1NzI4IDcxNi4yODY1NjUsMi41NjMwNTQyNSA3MTQuODM2ODIsNS40NzQ1MzcwNCBMNjQzLjUxNDMwMiwyMDkuMDE5MDYyIEw1NzYuNDk0MDAzLDEwNS40MzE3ODggQzU3My43MjEwNTgsMTAxLjE0NTg5NSA1NjcuMzQyNTM5LDk3LjY3MTQ5MTkgNTYyLjI1NTYsOTcuNjcxNDkxOSBMNTUyLjE3OTAzMyw5Ny42NzE0OTE5IEM1NDcuMDg4MzI2LDk3LjY3MTQ5MTkgNTQxLjUyOTM4NCwxMDEuNTU4NzQ5IDUzOS43NzAwNjEsMTA2LjMzNDE4NyBMNDU0Ljk4MDA2OCwzMzYuNDg0ODMzIEM0NTMuMjE3NDksMzQxLjI2OTEwOCA0NTUuOTI3MDg2LDM0NS4xNDc1MjkgNDYxLjAxNDEwMiwzNDUuMTQ3NTI5IEw1MjIuMTM4MDY3LDM0NS4xNDc1MjkgQzUyNy4yMzMxNSwzNDUuMTQ3NTI5IDUzMi43OTEwNTQsMzQxLjI2MTczMyA1MzQuNTUyNzk3LDMzNi40NjYxNzEgTDU3MS40NzMxNDQsMjM1Ljk2NjkyNCBMNjQyLjEwODUyOCwzNDYuMTA3NzEyIEM2NDMuNDg3MTQxLDM0OC4yNTczNjMgNjQ2LjY2NzA5MiwzNTAgNjQ5LjIxMjMwNywzNTAgTDY1OS45NzE0MTIsMzUwIEM2NjIuNTE2MTA4LDM1MCA2NjUuMjgyMDQ0LDM0OC4wNDUwNzggNjY2LjE0MTk4MiwzNDUuNjUzOTE4IEw2ODMuODI3MjYxLDI5Ni40Nzc4NzIgTDcyMy4zNzQyMDcsMTg3LjQ0MjIxMSBaXFxcIiBpZD1cXFwiUGF0aC1Db3B5XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTAuMTQ1MjEzNDQxLDI0Ny4wODUxMDEgQzAuMTQ1MjEzNDQxLDMwNS4yMzQwNCA0OS4wODcyMzc3LDM0OC44NDU3NDUgMTA0LjMyODczLDM0OC44NDU3NDUgQzEzOS4yMTgwOTQsMzQ4Ljg0NTc0NSAxNjQuNDE1OTY4LDMzNS4yNzc2NTkgMTgyLjM0NTIyNCwzMDguMTQxNDg3IEMxODUuNzM3MjQ2LDMwMy4yOTU3NDIgMTgzLjMxNDM3MywyOTguNDQ5OTk3IDE3OC45NTMyMDMsMjk0LjU3MzQwMSBMMTQ5Ljg3ODczMywyNjkuMzc1NTI3IEMxNDYuOTcxMjg2LDI2Ni45NTI2NTUgMTQyLjYxMDExNiwyNjcuOTIxODA0IDEzOS4yMTgwOTQsMjcxLjMxMzgyNSBDMTMxLjQ2NDkwMiwyNzkuMDY3MDE3IDEyMy4yMjcxMzYsMjg2LjMzNTYzNSAxMDYuMjY3MDI4LDI4Ni4zMzU2MzUgQzg0Ljk0NTc1MDUsMjg2LjMzNTYzNSA2OC40NzAyMTc2LDI2OC44OTA5NTMgNjguNDcwMjE3NiwyNDcuMDg1MTAxIEM2OC40NzAyMTc2LDIyNS43NjM4MjMgODUuOTE0ODk5NSwyMDcuODM0NTY2IDEwNy4yMzYxNzcsMjA3LjgzNDU2NiBDMTE4LjM4MTM5MSwyMDcuODM0NTY2IDEyOC41NTc0NTUsMjEzLjE2NDg4NiAxMzUuMzQxNDk4LDIyMC40MzM1MDMgQzEzNy43NjQzNzEsMjIyLjg1NjM3NiAxNDMuNTc5MjY1LDIyMy44MjU1MjUgMTQ2LjAwMjEzNywyMjEuNDAyNjUyIEwxNzUuMDc2NjA3LDE5My43ODE5MDYgQzE3OS40Mzc3NzcsMTg5LjkwNTMxIDE4MC44OTE1MDEsMTg0LjU3NDk5IDE3Ny40OTk0OCwxODAuMjEzODIgQzE1OS4wODU2NDksMTU3LjkyMzM5MyAxMzUuMzQxNDk4LDE0NS4zMjQ0NTYgMTA0LjgxMzMwNSwxNDUuMzI0NDU2IEM0OS41NzE4MTIyLDE0NS4zMjQ0NTYgMC4xNDUyMTM0NDEsMTg5LjkwNTMxIDAuMTQ1MjEzNDQxLDI0Ny4wODUxMDEgTDAuMTQ1MjEzNDQxLDI0Ny4wODUxMDEgWiBNMjE4LjY4ODMxMiwzMzQuNzkzMDg1IEMyMTguNjg4MzEyLDMzOS42Mzg4MyAyMjMuMDQ5NDgyLDM0NCAyMjcuODk1MjI3LDM0NCBMMjgxLjE5ODQyMiwzNDQgQzI4Ni4wNDQxNjcsMzQ0IDI5MC40MDUzMzcsMzM5LjYzODgzIDI5MC40MDUzMzcsMzM0Ljc5MzA4NSBMMjkwLjQwNTMzNywxNC4wMDQ3NjcyIEMyOTAuNDA1MzM3LDkuMTU5MDIyMjYgMjg2LjA0NDE2Nyw0Ljc5Nzg1MTc5IDI4MS4xOTg0MjIsNC43OTc4NTE3OSBMMjI3Ljg5NTIyNyw0Ljc5Nzg1MTc5IEMyMjMuMDQ5NDgyLDQuNzk3ODUxNzkgMjE4LjY4ODMxMiw5LjE1OTAyMjI2IDIxOC42ODgzMTIsMTQuMDA0NzY3MiBMMjE4LjY4ODMxMiwzMzQuNzkzMDg1IFogTTM3OC4xMTMzMjEsOTEuNTM2Njg2OCBDMzk5LjQzNDU5OSw5MS41MzY2ODY4IDQxNi44NzkyODEsNzQuNTc2NTc5NCA0MTYuODc5MjgxLDUzLjI1NTMwMTUgQzQxNi44NzkyODEsMzEuOTM0MDIzNiAzOTkuNDM0NTk5LDE0LjQ4OTM0MTcgMzc4LjExMzMyMSwxNC40ODkzNDE3IEMzNTYuNzkyMDQ0LDE0LjQ4OTM0MTcgMzM5LjgzMTkzNiwzMS45MzQwMjM2IDMzOS44MzE5MzYsNTMuMjU1MzAxNSBDMzM5LjgzMTkzNiw3NC41NzY1Nzk0IDM1Ni43OTIwNDQsOTEuNTM2Njg2OCAzNzguMTEzMzIxLDkxLjUzNjY4NjggTDM3OC4xMTMzMjEsOTEuNTM2Njg2OCBaIE0zNDIuNzM5MzgzLDMzNC43OTMwODUgQzM0Mi43MzkzODMsMzM5LjYzODgzIDM0Ny4xMDA1NTQsMzQ0IDM1MS45NDYyOTksMzQ0IEw0MDUuMjQ5NDkzLDM0NCBDNDEwLjA5NTIzOCwzNDQgNDE0LjQ1NjQwOSwzMzkuNjM4ODMgNDE0LjQ1NjQwOSwzMzQuNzkzMDg1IEw0MTQuNDU2NDA5LDE1OS4zNzcxMTYgQzQxNC40NTY0MDksMTU0LjA0Njc5NyA0MTAuMDk1MjM4LDE1MC4xNzAyMDEgNDA1LjI0OTQ5MywxNTAuMTcwMjAxIEwzNTEuOTQ2Mjk5LDE1MC4xNzAyMDEgQzM0Ny4xMDA1NTQsMTUwLjE3MDIwMSAzNDIuNzM5MzgzLDE1NC4wNDY3OTcgMzQyLjczOTM4MywxNTkuMzc3MTE2IEwzNDIuNzM5MzgzLDMzNC43OTMwODUgWiBNODg5LjE1NDMxLDMzNC43OTMwODUgQzg4OS4xNTQzMSwzMzkuNjM4ODMgODkzLjUxNTQ4MSwzNDQgODk4LjM2MTIyNiwzNDQgTDkyMS4xMzYyMjcsMzQ0IEM5MjUuOTgxOTcyLDM0NCA5MjkuMzczOTk0LDMzOS42Mzg4MyA5MzEuMzEyMjkyLDMzNC4zMDg1MSBMOTM3LjEyNzE4NSwzMTguMzE3NTUyIEM5MzcuMTI3MTg1LDMxOC4zMTc1NTIgOTU5LjQxNzYxMiwzNDguODQ1NzQ1IDEwMDIuMDYwMTcsMzQ4Ljg0NTc0NSBDMTA1Ni44MTcwOSwzNDguODQ1NzQ1IDEwOTguMDA1OTIsMzAyLjgxMTE2OCAxMDk4LjAwNTkyLDI0Ny4wODUxMDEgQzEwOTguMDA1OTIsMTc4Ljc2MDA5NiAxMDUzLjQyNTA2LDE0NS4zMjQ0NTYgMTAwMS41NzU1OSwxNDUuMzI0NDU2IEM5ODUuMTAwMDYxLDE0NS4zMjQ0NTYgOTY3LjE3MDgwNCwxNTEuMTM5MzUgOTYxLjM1NTkxLDE1NC41MzEzNzEgTDk2MS4zNTU5MSwxNC4wMDQ3NjcyIEM5NjEuMzU1OTEsOS4xNTkwMjIyNiA5NTYuOTk0NzQsNC43OTc4NTE3OSA5NTIuMTQ4OTk1LDQuNzk3ODUxNzkgTDg5OC4zNjEyMjYsNC43OTc4NTE3OSBDODkzLjUxNTQ4MSw0Ljc5Nzg1MTc5IDg4OS4xNTQzMSw5LjE1OTAyMjI2IDg4OS4xNTQzMSwxNC4wMDQ3NjcyIEw4ODkuMTU0MzEsMzM0Ljc5MzA4NSBaIE05NTMuNjAyNzE4LDI0Ni42MDA1MjYgQzk1My42MDI3MTgsMjI0Ljc5NDY3NCA5NzAuMDc4MjUxLDIwNy44MzQ1NjYgOTkyLjM2ODY3OCwyMDcuODM0NTY2IEMxMDE0LjY1OTExLDIwNy44MzQ1NjYgMTAzMS42MTkyMSwyMjQuNzk0Njc0IDEwMzEuNjE5MjEsMjQ2LjYwMDUyNiBDMTAzMS42MTkyMSwyNjguODkwOTUzIDEwMTQuNjU5MTEsMjg2LjMzNTYzNSA5OTIuMzY4Njc4LDI4Ni4zMzU2MzUgQzk3MC4wNzgyNTEsMjg2LjMzNTYzNSA5NTMuNjAyNzE4LDI2OC44OTA5NTMgOTUzLjYwMjcxOCwyNDYuNjAwNTI2IEw5NTMuNjAyNzE4LDI0Ni42MDA1MjYgWiBNMTEzNC4yNTY0NSwzMjEuMjI0OTk5IEMxMTM0LjI1NjQ1LDMzNi4yNDY4MDggMTE0Ni44NTUzOSwzNDguODQ1NzQ1IDExNjEuODc3MiwzNDguODQ1NzQ1IEMxMTc3LjM4MzU4LDM0OC44NDU3NDUgMTE4OS40OTc5NSwzMzYuMjQ2ODA4IDExODkuNDk3OTUsMzIxLjIyNDk5OSBDMTE4OS40OTc5NSwzMDUuNzE4NjE1IDExNzcuMzgzNTgsMjkzLjYwNDI1MiAxMTYxLjg3NzIsMjkzLjYwNDI1MiBDMTE0Ni44NTUzOSwyOTMuNjA0MjUyIDExMzQuMjU2NDUsMzA1LjcxODYxNSAxMTM0LjI1NjQ1LDMyMS4yMjQ5OTkgTDExMzQuMjU2NDUsMzIxLjIyNDk5OSBaIE0xMjM2LjAxNzEsMzMyLjg1NDc4NyBDMTI0NS43MDg1OSwzNDAuNjA3OTc5IDEyNjkuOTM3MzEsMzQ4Ljg0NTc0NSAxMzAxLjkxOTIzLDM0OC44NDU3NDUgQzEzNTYuNjc2MTUsMzQ4Ljg0NTc0NSAxMzgzLjgxMjMyLDMyMS4yMjQ5OTkgMTM4My44MTIzMiwyODcuMzA0Nzg0IEMxMzgzLjgxMjMyLDI0OC41Mzg4MjQgMTM1Ni42NzYxNSwyMzMuMDMyNDQgMTMxNy40MjU2MSwyMTkuNDY0MzU0IEMxMzAwLjk1MDA4LDIxMy42NDk0NiAxMjk1LjYxOTc2LDIwOC44MDM3MTUgMTI5NS42MTk3NiwyMDMuOTU3OTcgQzEyOTUuNjE5NzYsMTk4LjYyNzY1MSAxMjk5Ljk4MDkzLDE5Ny4xNzM5MjcgMTMwNi4yODA0LDE5Ny4xNzM5MjcgQzEzMjUuMTc4OCwxOTcuMTczOTI3IDEzNDcuNDY5MjMsMjA4LjMxOTE0MSAxMzQ3LjQ2OTIzLDIwOC4zMTkxNDEgQzEzNTEuMzQ1ODMsMjA5Ljc3Mjg2NCAxMzU2LjE5MTU3LDIwOC4zMTkxNDEgMTM1Ny42NDUzLDIwNS40MTE2OTQgTDEzNzUuNTc0NTUsMTcyLjQ2MDYyOCBDMTM3OC40ODIsMTY3LjYxNDg4MyAxMzc1LjA4OTk4LDE2My4yNTM3MTIgMTM3MC43Mjg4MSwxNjAuMzQ2MjY1IEMxMzYwLjA2ODE3LDE1My41NjIyMjMgMTMzNi44MDg1OSwxNDUuMzI0NDU2IDEzMDYuMjgwNCwxNDUuMzI0NDU2IEMxMjUzLjk0NjM1LDE0NS4zMjQ0NTYgMTIzMC42ODY3OCwxNzEuNDkxNDc5IDEyMzAuNjg2NzgsMjAzLjk1Nzk3IEMxMjMwLjY4Njc4LDIzNC4wMDE1ODkgMTI0Ny4xNjIzMSwyNTUuODA3NDQxIDEyODQuOTU5MTIsMjY4Ljg5MDk1MyBDMTMwOS42NzI0MiwyNzcuNjEzMjk0IDEzMTIuNTc5ODcsMjg0LjM5NzMzNyAxMzEyLjU3OTg3LDI4OS4yNDMwODIgQzEzMTIuNTc5ODcsMjk1LjA1Nzk3NiAxMzA4LjIxODcsMjk3Ljk2NTQyMyAxMzAzLjM3Mjk1LDI5Ny45NjU0MjMgQzEyODIuNTM2MjUsMjk3Ljk2NTQyMyAxMjU5Ljc2MTI1LDI4NS4zNjY0ODYgMTI1OS43NjEyNSwyODUuMzY2NDg2IEMxMjU1Ljg4NDY1LDI4My40MjgxODggMTI1MS4wMzg5MSwyODYuMzM1NjM1IDEyNDkuNTg1MTgsMjg5LjI0MzA4MiBMMTIzMi42MjUwOCwzMjIuNjc4NzIyIEMxMjMwLjIwMjIsMzI3LjAzOTg5MyAxMjMyLjYyNTA4LDMyOS45NDczNCAxMjM2LjAxNzEsMzMyLjg1NDc4NyBMMTIzNi4wMTcxLDMzMi44NTQ3ODcgWiBNMTQwNy41NTY0NywyNDYuNjAwNTI2IEMxNDA3LjU1NjQ3LDMwMi4zMjY1OTMgMTQ1My4xMDY0NywzNDguODQ1NzQ1IDE1MDguMzQ3OTYsMzQ4Ljg0NTc0NSBDMTU2My41ODk0NiwzNDguODQ1NzQ1IDE2MDkuMTM5NDYsMzAyLjMyNjU5MyAxNjA5LjEzOTQ2LDI0Ni42MDA1MjYgQzE2MDkuMTM5NDYsMTkxLjg0MzYwOCAxNTYzLjU4OTQ2LDE0NS4zMjQ0NTYgMTUwOC4zNDc5NiwxNDUuMzI0NDU2IEMxNDUzLjEwNjQ3LDE0NS4zMjQ0NTYgMTQwNy41NTY0NywxOTEuODQzNjA4IDE0MDcuNTU2NDcsMjQ2LjYwMDUyNiBMMTQwNy41NTY0NywyNDYuNjAwNTI2IFogTTE0NzAuMDY2NTgsMjQ2LjYwMDUyNiBDMTQ3MC4wNjY1OCwyMjUuMjc5MjQ4IDE0ODcuMDI2NjksMjA3LjgzNDU2NiAxNTA4LjM0Nzk2LDIwNy44MzQ1NjYgQzE1MjkuNjY5MjQsMjA3LjgzNDU2NiAxNTQ2LjYyOTM1LDIyNS4yNzkyNDggMTU0Ni42MjkzNSwyNDYuNjAwNTI2IEMxNTQ2LjYyOTM1LDI2OC40MDYzNzggMTUyOS42NjkyNCwyODYuMzM1NjM1IDE1MDguMzQ3OTYsMjg2LjMzNTYzNSBDMTQ4Ny4wMjY2OSwyODYuMzM1NjM1IDE0NzAuMDY2NTgsMjY4LjQwNjM3OCAxNDcwLjA2NjU4LDI0Ni42MDA1MjYgTDE0NzAuMDY2NTgsMjQ2LjYwMDUyNiBaIE0xNjMxLjQyOTg5LDI0Ny4wODUxMDEgQzE2MzEuNDI5ODksMzA1LjIzNDA0IDE2ODAuMzcxOTEsMzQ4Ljg0NTc0NSAxNzM1LjYxMzQsMzQ4Ljg0NTc0NSBDMTc3MC41MDI3NywzNDguODQ1NzQ1IDE3OTUuNzAwNjQsMzM1LjI3NzY1OSAxODEzLjYyOTksMzA4LjE0MTQ4NyBDMTgxNy4wMjE5MiwzMDMuMjk1NzQyIDE4MTQuNTk5MDUsMjk4LjQ0OTk5NyAxODEwLjIzNzg4LDI5NC41NzM0MDEgTDE3ODEuMTYzNDEsMjY5LjM3NTUyNyBDMTc3OC4yNTU5NiwyNjYuOTUyNjU1IDE3NzMuODk0NzksMjY3LjkyMTgwNCAxNzcwLjUwMjc3LDI3MS4zMTM4MjUgQzE3NjIuNzQ5NTgsMjc5LjA2NzAxNyAxNzU0LjUxMTgxLDI4Ni4zMzU2MzUgMTczNy41NTE3LDI4Ni4zMzU2MzUgQzE3MTYuMjMwNDIsMjg2LjMzNTYzNSAxNjk5Ljc1NDg5LDI2OC44OTA5NTMgMTY5OS43NTQ4OSwyNDcuMDg1MTAxIEMxNjk5Ljc1NDg5LDIyNS43NjM4MjMgMTcxNy4xOTk1NywyMDcuODM0NTY2IDE3MzguNTIwODUsMjA3LjgzNDU2NiBDMTc0OS42NjYwNiwyMDcuODM0NTY2IDE3NTkuODQyMTMsMjEzLjE2NDg4NiAxNzY2LjYyNjE3LDIyMC40MzM1MDMgQzE3NjkuMDQ5MDQsMjIyLjg1NjM3NiAxNzc0Ljg2Mzk0LDIyMy44MjU1MjUgMTc3Ny4yODY4MSwyMjEuNDAyNjUyIEwxODA2LjM2MTI4LDE5My43ODE5MDYgQzE4MTAuNzIyNDUsMTg5LjkwNTMxIDE4MTIuMTc2MTcsMTg0LjU3NDk5IDE4MDguNzg0MTUsMTgwLjIxMzgyIEMxNzkwLjM3MDMyLDE1Ny45MjMzOTMgMTc2Ni42MjYxNywxNDUuMzI0NDU2IDE3MzYuMDk3OTgsMTQ1LjMyNDQ1NiBDMTY4MC44NTY0OSwxNDUuMzI0NDU2IDE2MzEuNDI5ODksMTg5LjkwNTMxIDE2MzEuNDI5ODksMjQ3LjA4NTEwMSBMMTYzMS40Mjk4OSwyNDcuMDg1MTAxIFogTTE4ODUuMzQ2OTIsOTEuNTM2Njg2OCBDMTkwNi42NjgyLDkxLjUzNjY4NjggMTkyNC4xMTI4OCw3NC41NzY1Nzk0IDE5MjQuMTEyODgsNTMuMjU1MzAxNSBDMTkyNC4xMTI4OCwzMS45MzQwMjM2IDE5MDYuNjY4MiwxNC40ODkzNDE3IDE4ODUuMzQ2OTIsMTQuNDg5MzQxNyBDMTg2NC4wMjU2NSwxNC40ODkzNDE3IDE4NDcuMDY1NTQsMzEuOTM0MDIzNiAxODQ3LjA2NTU0LDUzLjI1NTMwMTUgQzE4NDcuMDY1NTQsNzQuNTc2NTc5NCAxODY0LjAyNTY1LDkxLjUzNjY4NjggMTg4NS4zNDY5Miw5MS41MzY2ODY4IEwxODg1LjM0NjkyLDkxLjUzNjY4NjggWiBNMTg0OS45NzI5OSwzMzQuNzkzMDg1IEMxODQ5Ljk3Mjk5LDMzOS42Mzg4MyAxODU0LjMzNDE2LDM0NCAxODU5LjE3OTksMzQ0IEwxOTEyLjQ4MzEsMzQ0IEMxOTE3LjMyODg0LDM0NCAxOTIxLjY5MDAxLDMzOS42Mzg4MyAxOTIxLjY5MDAxLDMzNC43OTMwODUgTDE5MjEuNjkwMDEsMTU5LjM3NzExNiBDMTkyMS42OTAwMSwxNTQuMDQ2Nzk3IDE5MTcuMzI4ODQsMTUwLjE3MDIwMSAxOTEyLjQ4MzEsMTUwLjE3MDIwMSBMMTg1OS4xNzk5LDE1MC4xNzAyMDEgQzE4NTQuMzM0MTYsMTUwLjE3MDIwMSAxODQ5Ljk3Mjk5LDE1NC4wNDY3OTcgMTg0OS45NzI5OSwxNTkuMzc3MTE2IEwxODQ5Ljk3Mjk5LDMzNC43OTMwODUgWiBNMTk2MC45NDA1NSwyODQuODgxOTExIEMxOTYwLjk0MDU1LDMyMy4xNjMyOTcgMTk4OS41MzA0NCwzNDguODQ1NzQ1IDIwMjcuODExODMsMzQ4Ljg0NTc0NSBDMjA1OC4zNDAwMiwzNDguODQ1NzQ1IDIwNzUuMzAwMTMsMzM0Ljc5MzA4NSAyMDg2LjQ0NTM0LDMyNC42MTcwMiBMMjA5My4yMjkzOCwzMzcuNzAwNTMyIEMyMDk1LjY1MjI2LDM0My4wMzA4NTEgMjA5OS4wNDQyOCwzNDQgMjEwMS45NTE3MiwzNDQgTDIxMjMuMjczLDM0NCBDMjEyOC4xMTg3NSwzNDQgMjEzMi40Nzk5MiwzMzkuNjM4ODMgMjEzMi40Nzk5MiwzMzQuNzkzMDg1IEwyMTMyLjQ3OTkyLDIyNy43MDIxMjEgQzIxMzIuNDc5OTIsMTcwLjUyMjMzIDIxMTAuNjc0MDcsMTQ1LjMyNDQ1NiAyMDUwLjU4NjgzLDE0NS4zMjQ0NTYgQzIwMjQuNDE5OCwxNDUuMzI0NDU2IDE5OTAuNDk5NTksMTUxLjEzOTM1IDE5ODYuMTM4NDIsMTUyLjU5MzA3NCBDMTk4MS43NzcyNSwxNTQuMDQ2Nzk3IDE5NzcuNDE2MDgsMTU3LjQzODgxOCAxOTc4Ljg2OTgsMTY1LjY3NjU4NSBMMTk4My4yMzA5NywxOTYuMjA0Nzc4IEMxOTg0LjIwMDEyLDIwMy40NzMzOTYgMTk4Ny41OTIxNCwyMDguODAzNzE1IDE5OTQuODYwNzYsMjA2LjM4MDg0MyBDMjAwNy40NTk3LDIwMi41MDQyNDcgMjAzMC4yMzQ3LDE5OS4xMTIyMjUgMjA0My4zMTgyMSwxOTkuMTEyMjI1IEMyMDY2LjU3Nzc5LDE5OS4xMTIyMjUgMjA2OS40ODUyMywyMDguODAzNzE1IDIwNjkuNDg1MjMsMjI3LjcwMjEyMSBDMjA2OS40ODUyMywyMjcuNzAyMTIxIDIwNTMuOTc4ODUsMjE5Ljk0ODkyOSAyMDMyLjE3MywyMTkuOTQ4OTI5IEMxOTg4LjA3NjcyLDIxOS45NDg5MjkgMTk2MC45NDA1NSwyNDcuNTY5Njc1IDE5NjAuOTQwNTUsMjg0Ljg4MTkxMSBMMTk2MC45NDA1NSwyODQuODgxOTExIFogTTIwMjMuOTM1MjMsMjgwLjAzNjE2NiBDMjAyMy45MzUyMywyNjguODkwOTUzIDIwMzMuMTQyMTUsMjU5LjY4NDAzNyAyMDQ0Ljc3MTkzLDI1OS42ODQwMzcgQzIwNTYuNDAxNzIsMjU5LjY4NDAzNyAyMDY1LjYwODY0LDI2OC44OTA5NTMgMjA2Ni4wOTMyMSwyODAuMDM2MTY2IEMyMDY2LjA5MzIxLDI5MS42NjU5NTQgMjA1Ni40MDE3MiwzMDEuMzU3NDQ0IDIwNDQuNzcxOTMsMzAxLjM1NzQ0NCBDMjAzMy4xNDIxNSwzMDEuMzU3NDQ0IDIwMjMuOTM1MjMsMjkxLjY2NTk1NCAyMDIzLjkzNTIzLDI4MC4wMzYxNjYgTDIwMjMuOTM1MjMsMjgwLjAzNjE2NiBaIE0yMTgxLjkwNjUyLDMzNC43OTMwODUgQzIxODEuOTA2NTIsMzM5LjYzODgzIDIxODYuMjY3NjksMzQ0IDIxOTEuMTEzNDMsMzQ0IEwyMjQ0LjQxNjYzLDM0NCBDMjI0OS4yNjIzNywzNDQgMjI1My42MjM1NCwzMzkuNjM4ODMgMjI1My42MjM1NCwzMzQuNzkzMDg1IEwyMjUzLjYyMzU0LDE0LjAwNDc2NzIgQzIyNTMuNjIzNTQsOS4xNTkwMjIyNiAyMjQ5LjI2MjM3LDQuNzk3ODUxNzkgMjI0NC40MTY2Myw0Ljc5Nzg1MTc5IEwyMTkxLjExMzQzLDQuNzk3ODUxNzkgQzIxODYuMjY3NjksNC43OTc4NTE3OSAyMTgxLjkwNjUyLDkuMTU5MDIyMjYgMjE4MS45MDY1MiwxNC4wMDQ3NjcyIEwyMTgxLjkwNjUyLDMzNC43OTMwODUgWlxcXCIgaWQ9XFxcImNsaS0tLS1iLnNvY2lhbFxcXCI+PC9wYXRoPjwvZz48L2c+PC9nPjwvZz48L3N2Zz5cIlxuXG4vKioqLyB9LFxuLyogMzQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XHJcblx0XHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcclxuXHRcdFx0bW9kdWxlLnBhdGhzID0gW107XHJcblx0XHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0XHRtb2R1bGUuY2hpbGRyZW4gPSBbXTtcclxuXHRcdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbW9kdWxlO1xyXG5cdH1cclxuXG5cbi8qKiovIH1cbi8qKioqKiovIF0pXG59KTtcbjtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiByZWFjdC1jbGltYi1zb2NpYWwubWluLmpzXG4gKiovIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL1wiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgM2IzMzU1NDc0NmRkMmRlOTAyMDJcbiAqKi8iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgV2FsbENvbnRhaW5lciBmcm9tICcuL2NvbXBvbmVudHMvV2FsbENvbnRhaW5lcic7XG5cbmltcG9ydCAnLi9zdHlsZS9tYWluLnNjc3MnO1xuXG5pZiAod2luZG93KSB7XG4gICAgd2luZG93LkNsaW1iID0gd2luZG93LkNsaW1iIHx8IHt9O1xuXG4gICAgY29uc3QgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2xpbWItd2FsbCcpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkdGFyZ2V0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCAkaXRlbSA9ICR0YXJnZXRzW2ldO1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uSWQgPSAkaXRlbS5kYXRhc2V0LmNvbGxlY3Rpb25JZDtcbiAgICAgICAgY29uc3QgbGltaXQgPSAkaXRlbS5kYXRhc2V0LmxpbWl0O1xuXG4gICAgICAgIFJlYWN0LnJlbmRlcihcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoV2FsbENvbnRhaW5lciwge2NvbGxlY3Rpb25JZCwgbGltaXR9KSxcbiAgICAgICAgICAgICRpdGVtXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQge1dhbGxDb250YWluZXJ9O1xuZXhwb3J0IHtXYWxsfSBmcm9tICcuL2NvbXBvbmVudHMvV2FsbCc7XG5leHBvcnQge1RpbGV9IGZyb20gJy4vY29tcG9uZW50cy9UaWxlJztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vfi9lc2xpbnQtbG9hZGVyIS4vc3JjL2luZGV4LmpzXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzFfXztcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIGV4dGVybmFsIHtcInJvb3RcIjpcIlJlYWN0XCIsXCJjb21tb25qczJcIjpcInJlYWN0XCIsXCJjb21tb25qc1wiOlwicmVhY3RcIixcImFtZFwiOlwicmVhY3RcIn1cbiAqKiBtb2R1bGUgaWQgPSAxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEltYWdlIGZyb20gJy4vSW1hZ2UnO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSAnLi9NZXNzYWdlJztcbmltcG9ydCBBdXRob3IgZnJvbSAnLi9BdXRob3InO1xuXG5cbmNsYXNzIFRpbGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIGNyZWF0ZUltYWdlKCkge1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmltYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB7dXJsOiBzcmMsIHdpZHRoLCBoZWlnaHR9ID0gdGhpcy5wcm9wcy5pbWFnZTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPEltYWdlIHNyYz17IHNyYyB9XG4gICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXsgd2lkdGggfVxuICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9eyBoZWlnaHQgfS8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNyZWF0ZU1lc3NhZ2UoKSB7XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMubWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8TWVzc2FnZSBib2R5PXsgdGhpcy5wcm9wcy5tZXNzYWdlIH0vPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjcmVhdGVDbGFzc1N0cmluZygpIHtcblxuICAgICAgICBsZXQgY2xhc3NTdHJpbmcgPSBgY2xpbWJfX3RpbGUgY2xpbWJfX3RpbGUtLSR7dGhpcy5wcm9wcy5zb3VyY2VfdHlwZX1gO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmltYWdlKSB7XG4gICAgICAgICAgICBjbGFzc1N0cmluZyArPSAnIGNsaW1iX190aWxlLS1oYXMtbWVkaWEgY2xpbWJfX3RpbGUtLWhhcy1pbWFnZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGFzc1N0cmluZyArPSAnIGNsaW1iX190aWxlLS1oYXMtbm8taW1hZ2UnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMudmlkZW9fdXJsKSB7XG4gICAgICAgICAgICBjbGFzc1N0cmluZyArPSAnIGNsaW1iX190aWxlLS1oYXMtbWVkaWEgY2xpbWJfX3RpbGUtLWhhcy12aWRlbyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGFzc1N0cmluZyArPSAnIGNsaW1iX190aWxlLS1oYXMtbm8tdmlkZW8nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsYXNzU3RyaW5nO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcblxuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuY3JlYXRlSW1hZ2UoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuY3JlYXRlTWVzc2FnZSgpO1xuICAgICAgICBjb25zdCBjbGFzc1N0cmluZyA9IHRoaXMuY3JlYXRlQ2xhc3NTdHJpbmcoKTtcbiAgICAgICAgY29uc3Qge2F1dGhvcn0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17IGNsYXNzU3RyaW5nIH1cbiAgICAgICAgICAgICAgICAgc3R5bGU9e3RoaXMucHJvcHMuc3R5bGV9PlxuXG4gICAgICAgICAgICAgICAgPGEgaHJlZj17IHRoaXMucHJvcHMubGluayB9PlxuICAgICAgICAgICAgICAgICAgICB7IGltYWdlIH1cbiAgICAgICAgICAgICAgICA8L2E+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNsaW1iX190aWxlX19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIHsgbWVzc2FnZSB9XG5cbiAgICAgICAgICAgICAgICAgICAgPEF1dGhvciB7Li4uYXV0aG9yfSAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5cblRpbGUucHJvcFR5cGVzID0ge1xuXG4gICAgLy8gUmVxdWlyZWQgYXR0cnNcbiAgICBsaW5rOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgc291cmNlX3R5cGU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB0aW1lc3RhbXA6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICBhdXRob3I6IFJlYWN0LlByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIHVzZXJuYW1lOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgICAgIHBpY3R1cmU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgICAgbGluazogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG4gICAgfSksXG5cbiAgICAvLyBPcHRpb25hbCBhdHRyc1xuICAgIG1lc3NhZ2U6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gICAgdmlkZW9fc3JjOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIGltYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICB1cmw6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgICAgd2lkdGg6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICAgICAgaGVpZ2h0OiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWRcbiAgICB9KVxuXG59O1xuXG5leHBvcnQgZGVmYXVsdCBUaWxlO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L2VzbGludC1sb2FkZXIhLi9zcmMvY29tcG9uZW50cy9UaWxlLmpzeFxuICoqLyIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgUHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL1RpbGUnO1xuaW1wb3J0IHtUcmFuc2l0aW9uTW90aW9uLCBzcHJpbmd9IGZyb20gJ3JlYWN0LW1vdGlvbic7XG5cblxuY2xhc3MgV2FsbCBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICBpdGVtczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG4gICAgfTtcblxuICAgIGdldFN0eWxlcygpIHtcbiAgICAgICAgY29uc3QgY29uZmlncyA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnByb3BzLml0ZW1zKS5tYXAoa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbmZpZ3Nba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiBzcHJpbmcoMSksXG4gICAgICAgICAgICAgICAgd2lkdGg6IHNwcmluZygzNzUpLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogc3ByaW5nKDEwKSxcbiAgICAgICAgICAgICAgICBpdGVtOiB0aGlzLnByb3BzLml0ZW1zW2tleV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29uZmlncztcbiAgICB9XG5cbiAgICB3aWxsRW50ZXIoa2V5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGFjaXR5OiBzcHJpbmcoMCksXG4gICAgICAgICAgICB3aWR0aDogc3ByaW5nKDApLFxuICAgICAgICAgICAgbWFyZ2luOiBzcHJpbmcoMCksXG4gICAgICAgICAgICBpdGVtOiB0aGlzLnByb3BzLml0ZW1zW2tleV1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB3aWxsTGVhdmUoa2V5LCBzdHlsZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BhY2l0eTogc3ByaW5nKDApLFxuICAgICAgICAgICAgd2lkdGg6IHNwcmluZygwKSxcbiAgICAgICAgICAgIG1hcmdpbjogc3ByaW5nKDApLFxuICAgICAgICAgICAgaXRlbTogc3R5bGUuaXRlbVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlbmRlclRpbGUoa2V5LCBpdGVtVmFsdWVzKSB7XG5cbiAgICAgICAgY29uc3Qge2l0ZW0sIC4uLnN0eWxlQ29uZmlnfSA9IGl0ZW1WYWx1ZXM7XG4gICAgICAgIGNvbnN0IHsuLi5pdGVtUHJvcHN9ID0gaXRlbTtcblxuICAgICAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgICAgICAgIG9wYWNpdHk6IHN0eWxlQ29uZmlnLm9wYWNpdHksXG4gICAgICAgICAgICB3aWR0aDogYCR7c3R5bGVDb25maWcud2lkdGh9cHhgLFxuICAgICAgICAgICAgbWFyZ2luTGVmdDogc3R5bGVDb25maWcubWFyZ2luLFxuICAgICAgICAgICAgbWFyZ2luUmlnaHQ6IHN0eWxlQ29uZmlnLm1hcmdpblxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8VGlsZSBrZXk9e2tleX1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICAgICAgICB7Li4uaXRlbVByb3BzIH0gLz5cbiAgICAgICAgKTtcblxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxUcmFuc2l0aW9uTW90aW9uXG4gICAgICAgICAgICAgICAgc3R5bGVzPXt0aGlzLmdldFN0eWxlcy5iaW5kKHRoaXMpKCl9XG4gICAgICAgICAgICAgICAgd2lsbEVudGVyPXt0aGlzLndpbGxFbnRlci5iaW5kKHRoaXMpfVxuICAgICAgICAgICAgICAgIHdpbGxMZWF2ZT17dGhpcy53aWxsTGVhdmUuYmluZCh0aGlzKX0+XG4gICAgICAgICAgICAgICAge3ZhbHVlcyA9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNsaW1iX193YWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7T2JqZWN0LmtleXModmFsdWVzKS5tYXAoa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFsdWVzID0gdmFsdWVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVGlsZShrZXksIGl0ZW1WYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvVHJhbnNpdGlvbk1vdGlvbj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdhbGw7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vZXNsaW50LWxvYWRlciEuL3NyYy9jb21wb25lbnRzL1dhbGwuanN4XG4gKiovIiwiLy8gW3N0aWZmbmVzcywgZGFtcGluZ11cblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB7XG4gIG5vV29iYmxlOiBbMTcwLCAyNl0sIC8vIHRoZSBkZWZhdWx0XG4gIGdlbnRsZTogWzEyMCwgMTRdLFxuICB3b2JibHk6IFsxODAsIDEyXSxcbiAgc3RpZmY6IFsyMTAsIDIwXVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3QtbW90aW9uL2xpYi9wcmVzZXRzLmpzXG4gKiogbW9kdWxlIGlkID0gNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuKGZ1bmN0aW9uKCkge1xuICB2YXIgZ2V0TmFub1NlY29uZHMsIGhydGltZSwgbG9hZFRpbWU7XG5cbiAgaWYgKCh0eXBlb2YgcGVyZm9ybWFuY2UgIT09IFwidW5kZWZpbmVkXCIgJiYgcGVyZm9ybWFuY2UgIT09IG51bGwpICYmIHBlcmZvcm1hbmNlLm5vdykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmICgodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2VzcyAhPT0gbnVsbCkgJiYgcHJvY2Vzcy5ocnRpbWUpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIChnZXROYW5vU2Vjb25kcygpIC0gbG9hZFRpbWUpIC8gMWU2O1xuICAgIH07XG4gICAgaHJ0aW1lID0gcHJvY2Vzcy5ocnRpbWU7XG4gICAgZ2V0TmFub1NlY29uZHMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBocjtcbiAgICAgIGhyID0gaHJ0aW1lKCk7XG4gICAgICByZXR1cm4gaHJbMF0gKiAxZTkgKyBoclsxXTtcbiAgICB9O1xuICAgIGxvYWRUaW1lID0gZ2V0TmFub1NlY29uZHMoKTtcbiAgfSBlbHNlIGlmIChEYXRlLm5vdykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIGxvYWRUaW1lO1xuICAgIH07XG4gICAgbG9hZFRpbWUgPSBEYXRlLm5vdygpO1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBsb2FkVGltZTtcbiAgICB9O1xuICAgIGxvYWRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH1cblxufSkuY2FsbCh0aGlzKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0LW1vdGlvbi9+L3BlcmZvcm1hbmNlLW5vdy9saWIvcGVyZm9ybWFuY2Utbm93LmpzXG4gKiogbW9kdWxlIGlkID0gNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqICh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vcHJvY2Vzcy9icm93c2VyLmpzXG4gKiogbW9kdWxlIGlkID0gNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuXG5jbGFzcyBBdXRob3IgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuXG4gICAgcmVuZGVyKCkge1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YSBjbGFzc05hbWU9XCJjbGltYl9fdGlsZV9fYXV0aG9yXCJcbiAgICAgICAgICAgICAgIGhyZWY9eyB0aGlzLnByb3BzLmxpbmsgfT5cblxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPXsgdGhpcy5wcm9wcy5waWN0dXJlfVxuICAgICAgICAgICAgICAgICAgICAgYWx0PXsgYFByb2ZpbGUgcGljIG9mICR7dGhpcy5wcm9wcy5uYW1lfWAgfS8+XG5cbiAgICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwiY2xpbWJfX3RpbGVfX2F1dGhvcl9fdXNlcm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgeyB0aGlzLnByb3BzLnVzZXJuYW1lIH1cbiAgICAgICAgICAgICAgICA8L2g0PlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuQXV0aG9yLnByb3BUeXBlcyA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBBdXRob3I7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vZXNsaW50LWxvYWRlciEuL3NyYy9jb21wb25lbnRzL0F1dGhvci5qc3hcbiAqKi8iLCJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcblxuXG5jbGFzcyBDbGltYkJhZGdlIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAgIHJlbmRlcigpIHtcblxuICAgICAgICBjb25zdCBsb2dvID0gcmVxdWlyZSgnLi4vaW1nL2NsaW1iX2xvZ28uc3ZnJyk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwOi8vY2xpbWIuc29jaWFsL1wiXG4gICAgICAgICAgICAgICBjbGFzc05hbWU9XCJjbGltYi1zb2NpYWwtYmFkZ2VcIlxuICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGxvZ299fT5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENsaW1iQmFkZ2U7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vZXNsaW50LWxvYWRlciEuL3NyYy9jb21wb25lbnRzL0NsaW1iQmFkZ2UuanN4XG4gKiovIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuXG5jbGFzcyBJbWFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImNsaW1iX190aWxlX19pbWFnZVwiXG4gICAgICAgICAgICAgICAgIHNyYz17IHRoaXMucHJvcHMuc3JjIH0gZGF0YS13aWR0aD17IHRoaXMucHJvcHMud2lkdGggfSBkYXRhLWhlaWdodD17IHRoaXMucHJvcHMuaGVpZ2h0IH0vPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuSW1hZ2UucHJvcFR5cGVzID0ge1xuICAgIHNyYzogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHdpZHRoOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAgIGhlaWdodDogUmVhY3QuUHJvcFR5cGVzLm51bWJlclxufTtcblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2U7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vZXNsaW50LWxvYWRlciEuL3NyYy9jb21wb25lbnRzL0ltYWdlLmpzeFxuICoqLyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cblxuY2xhc3MgTWVzc2FnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG5cbiAgICByZW5kZXIoKSB7XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMucHJvcHMuYm9keVxuICAgICAgICAgICAgLnJlcGxhY2UoLzxhIGhyZWY9XCJodHRwOlxcL1xcL3BpYy50d2l0dGVyLmNvbVxcL1tePl0qPihbXjxdKyk8XFwvYT4vZywgJycpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNsaW1iX190aWxlX19tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IG1lc3NhZ2V9fT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuTWVzc2FnZS5wcm9wVHlwZXMgPSB7XG4gICAgYm9keTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L2VzbGludC1sb2FkZXIhLi9zcmMvY29tcG9uZW50cy9NZXNzYWdlLmpzeFxuICoqLyIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgUHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xpbWIgZnJvbSAnY2xpbWItc29jaWFsJztcbmltcG9ydCBXYWxsIGZyb20gJy4vV2FsbCc7XG5pbXBvcnQgQmFkZ2UgZnJvbSAnLi9DbGltYkJhZGdlJztcblxuXG5jbGFzcyBXYWxsQ29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgICAgaXRlbXM6IHt9XG4gICAgfTtcblxuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIGNvbGxlY3Rpb25JZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgICAgICBsaW1pdDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgICAgICBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICAgICAgUHJvcFR5cGVzLnN0cmluZ1xuICAgICAgICBdKVxuICAgIH07XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBjb2xsZWN0aW9uSWQ6ICc1NjFiYTYzNDQ1Mjg0ZTE3NDBlMDE2ZjcnLFxuICAgICAgICBsaW1pdDogMzBcbiAgICB9O1xuXG4gICAgaW5pdCgpIHtcblxuICAgICAgICBpZiAoIXRoaXMucHJvcHMuY29sbGVjdGlvbklkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjbGltYlxuICAgICAgICAgICAgLmdldFN0cmVhbSh0aGlzLnByb3BzLmNvbGxlY3Rpb25JZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaXRlbXMgPT4ge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlSW50KHRoaXMucHJvcHMubGltaXQsIDApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkSXRlbXMgPSB7fTtcbiAgICAgICAgICAgICAgICBpdGVtcy5zcGxpY2UoMCwgbWF4U2l6ZSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBtYXBwZWRJdGVtc1tpdGVtLmlkXSA9IGl0ZW07XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IG1hcHBlZEl0ZW1zXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGxldCBjYjtcbiAgICAgICAgaWYgKHdpbmRvdy5DbGltYiAmJiB3aW5kb3cuQ2xpbWIub25VcGRhdGUpIHtcbiAgICAgICAgICAgIGNiID0gd2luZG93LkNsaW1iLm9uVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm9vcFxuICAgICAgICAgICAgY2IgPSAoKSA9PiB7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNiKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8V2FsbCBpdGVtcz17dGhpcy5zdGF0ZS5pdGVtc30vPlxuICAgICAgICAgICAgICAgIDxCYWRnZSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBXYWxsQ29udGFpbmVyO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L2VzbGludC1sb2FkZXIhLi9zcmMvY29tcG9uZW50cy9XYWxsQ29udGFpbmVyLmpzeFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3J4TGl0ZSA9IHJlcXVpcmUoJ3J4LWxpdGUnKTtcblxudmFyIF9mZXRjaEpzb25wID0gcmVxdWlyZSgnZmV0Y2gtanNvbnAnKTtcblxudmFyIF9mZXRjaEpzb25wMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZldGNoSnNvbnApO1xuXG52YXIgZ2V0U3RyZWFtID0gZnVuY3Rpb24gZ2V0U3RyZWFtKGNvbGxlY3Rpb25JZCkge1xuXG4gICAgdmFyIHBvbGxSYXRlID0gNSAqIDEwMDA7XG5cbiAgICB2YXIgcmVxdWVzdFN0cmVhbSA9IF9yeExpdGUuT2JzZXJ2YWJsZS5qdXN0KCdodHRwOi8vYXBwLmNsaW1iLnNvY2lhbC9hcGkvdjEvY29sbGVjdGlvbnMvJyArIGNvbGxlY3Rpb25JZCk7XG5cbiAgICB2YXIgdXBkYXRlU3RyZWFtID0gX3J4TGl0ZS5PYnNlcnZhYmxlLmludGVydmFsKHBvbGxSYXRlKS5zdGFydFdpdGgobnVsbCk7XG5cbiAgICB2YXIgcmVzcG9uc2VTdHJlYW0gPSB1cGRhdGVTdHJlYW0uY29tYmluZUxhdGVzdChyZXF1ZXN0U3RyZWFtLCBmdW5jdGlvbiAodGljaywgdXJsKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfSkuZmxhdE1hcChmdW5jdGlvbiAoYmFzZVVybCkge1xuXG4gICAgICAgIHZhciByZXF1ZXN0VXJsID0gJycgKyBiYXNlVXJsO1xuXG4gICAgICAgIHJldHVybiBfcnhMaXRlLk9ic2VydmFibGUuZnJvbVByb21pc2UoKDAsIF9mZXRjaEpzb25wMlsnZGVmYXVsdCddKShyZXF1ZXN0VXJsKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcC5qc29uKCk7XG4gICAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXNwb25zZVN0cmVhbTtcbn07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgICBnZXRTdHJlYW06IGdldFN0cmVhbVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY2xpbWItc29jaWFsL2Rpc3QvaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAxMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQsIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG47KGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcblxuICB2YXIgb2JqZWN0VHlwZXMgPSB7XG4gICAgJ2Z1bmN0aW9uJzogdHJ1ZSxcbiAgICAnb2JqZWN0JzogdHJ1ZVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNoZWNrR2xvYmFsKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZS5PYmplY3QgPT09IE9iamVjdCkgPyB2YWx1ZSA6IG51bGw7XG4gIH1cblxuICB2YXIgZnJlZUV4cG9ydHMgPSAob2JqZWN0VHlwZXNbdHlwZW9mIGV4cG9ydHNdICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUpID8gZXhwb3J0cyA6IG51bGw7XG4gIHZhciBmcmVlTW9kdWxlID0gKG9iamVjdFR5cGVzW3R5cGVvZiBtb2R1bGVdICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlKSA/IG1vZHVsZSA6IG51bGw7XG4gIHZhciBmcmVlR2xvYmFsID0gY2hlY2tHbG9iYWwoZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSAmJiB0eXBlb2YgZ2xvYmFsID09PSAnb2JqZWN0JyAmJiBnbG9iYWwpO1xuICB2YXIgZnJlZVNlbGYgPSBjaGVja0dsb2JhbChvYmplY3RUeXBlc1t0eXBlb2Ygc2VsZl0gJiYgc2VsZik7XG4gIHZhciBmcmVlV2luZG93ID0gY2hlY2tHbG9iYWwob2JqZWN0VHlwZXNbdHlwZW9mIHdpbmRvd10gJiYgd2luZG93KTtcbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSAoZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzKSA/IGZyZWVFeHBvcnRzIDogbnVsbDtcbiAgdmFyIHRoaXNHbG9iYWwgPSBjaGVja0dsb2JhbChvYmplY3RUeXBlc1t0eXBlb2YgdGhpc10gJiYgdGhpcyk7XG4gIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCAoKGZyZWVXaW5kb3cgIT09ICh0aGlzR2xvYmFsICYmIHRoaXNHbG9iYWwud2luZG93KSkgJiYgZnJlZVdpbmRvdykgfHwgZnJlZVNlbGYgfHwgdGhpc0dsb2JhbCB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4gIHZhciBSeCA9IHtcbiAgICBpbnRlcm5hbHM6IHt9LFxuICAgIGNvbmZpZzoge1xuICAgICAgUHJvbWlzZTogcm9vdC5Qcm9taXNlXG4gICAgfSxcbiAgICBoZWxwZXJzOiB7IH1cbiAgfTtcblxuICAvLyBEZWZhdWx0c1xuICB2YXIgbm9vcCA9IFJ4LmhlbHBlcnMubm9vcCA9IGZ1bmN0aW9uICgpIHsgfSxcbiAgICBpZGVudGl0eSA9IFJ4LmhlbHBlcnMuaWRlbnRpdHkgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4geDsgfSxcbiAgICBkZWZhdWx0Tm93ID0gUnguaGVscGVycy5kZWZhdWx0Tm93ID0gRGF0ZS5ub3csXG4gICAgZGVmYXVsdENvbXBhcmVyID0gUnguaGVscGVycy5kZWZhdWx0Q29tcGFyZXIgPSBmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4gaXNFcXVhbCh4LCB5KTsgfSxcbiAgICBkZWZhdWx0U3ViQ29tcGFyZXIgPSBSeC5oZWxwZXJzLmRlZmF1bHRTdWJDb21wYXJlciA9IGZ1bmN0aW9uICh4LCB5KSB7IHJldHVybiB4ID4geSA/IDEgOiAoeCA8IHkgPyAtMSA6IDApOyB9LFxuICAgIGRlZmF1bHRLZXlTZXJpYWxpemVyID0gUnguaGVscGVycy5kZWZhdWx0S2V5U2VyaWFsaXplciA9IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LnRvU3RyaW5nKCk7IH0sXG4gICAgZGVmYXVsdEVycm9yID0gUnguaGVscGVycy5kZWZhdWx0RXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7IHRocm93IGVycjsgfSxcbiAgICBpc1Byb21pc2UgPSBSeC5oZWxwZXJzLmlzUHJvbWlzZSA9IGZ1bmN0aW9uIChwKSB7IHJldHVybiAhIXAgJiYgdHlwZW9mIHAuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwLnRoZW4gPT09ICdmdW5jdGlvbic7IH0sXG4gICAgaXNGdW5jdGlvbiA9IFJ4LmhlbHBlcnMuaXNGdW5jdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgIHZhciBpc0ZuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyB8fCBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zIG9mIENocm9tZSBhbmQgU2FmYXJpXG4gICAgICBpZiAoaXNGbigveC8pKSB7XG4gICAgICAgIGlzRm4gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNGbjtcbiAgICB9KCkpO1xuXG4gICAgZnVuY3Rpb24gY2xvbmVBcnJheShhcnIpIHtcbiAgICAgIHZhciBsZW4gPSBhcnIubGVuZ3RoLCBhID0gbmV3IEFycmF5KGxlbik7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYVtpXSA9IGFycltpXTsgfVxuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gIHZhciBlcnJvck9iaiA9IHtlOiB7fX07XG4gIFxuICBmdW5jdGlvbiB0cnlDYXRjaGVyR2VuKHRyeUNhdGNoVGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHRyeUNhdGNoZXIoKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdHJ5Q2F0Y2hUYXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZXJyb3JPYmouZSA9IGU7XG4gICAgICAgIHJldHVybiBlcnJvck9iajtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIHRyeUNhdGNoID0gUnguaW50ZXJuYWxzLnRyeUNhdGNoID0gZnVuY3Rpb24gdHJ5Q2F0Y2goZm4pIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24oZm4pKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZuIG11c3QgYmUgYSBmdW5jdGlvbicpOyB9XG4gICAgcmV0dXJuIHRyeUNhdGNoZXJHZW4oZm4pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHRocm93ZXIoZSkge1xuICAgIHRocm93IGU7XG4gIH1cblxuICBSeC5jb25maWcubG9uZ1N0YWNrU3VwcG9ydCA9IGZhbHNlO1xuICB2YXIgaGFzU3RhY2tzID0gZmFsc2UsIHN0YWNrcyA9IHRyeUNhdGNoKGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IEVycm9yKCk7IH0pKCk7XG4gIGhhc1N0YWNrcyA9ICEhc3RhY2tzLmUgJiYgISFzdGFja3MuZS5zdGFjaztcblxuICAvLyBBbGwgY29kZSBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgZmlsdGVyZWQgZnJvbSBzdGFjayB0cmFjZXMgcmVwb3J0ZWQgYnkgUnhKU1xuICB2YXIgclN0YXJ0aW5nTGluZSA9IGNhcHR1cmVMaW5lKCksIHJGaWxlTmFtZTtcblxuICB2YXIgU1RBQ0tfSlVNUF9TRVBBUkFUT1IgPSAnRnJvbSBwcmV2aW91cyBldmVudDonO1xuXG4gIGZ1bmN0aW9uIG1ha2VTdGFja1RyYWNlTG9uZyhlcnJvciwgb2JzZXJ2YWJsZSkge1xuICAgIC8vIElmIHBvc3NpYmxlLCB0cmFuc2Zvcm0gdGhlIGVycm9yIHN0YWNrIHRyYWNlIGJ5IHJlbW92aW5nIE5vZGUgYW5kIFJ4SlNcbiAgICAvLyBjcnVmdCwgdGhlbiBjb25jYXRlbmF0aW5nIHdpdGggdGhlIHN0YWNrIHRyYWNlIG9mIGBvYnNlcnZhYmxlYC5cbiAgICBpZiAoaGFzU3RhY2tzICYmXG4gICAgICAgIG9ic2VydmFibGUuc3RhY2sgJiZcbiAgICAgICAgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBlcnJvciAhPT0gbnVsbCAmJlxuICAgICAgICBlcnJvci5zdGFjayAmJlxuICAgICAgICBlcnJvci5zdGFjay5pbmRleE9mKFNUQUNLX0pVTVBfU0VQQVJBVE9SKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIHZhciBzdGFja3MgPSBbXTtcbiAgICAgIGZvciAodmFyIG8gPSBvYnNlcnZhYmxlOyAhIW87IG8gPSBvLnNvdXJjZSkge1xuICAgICAgICBpZiAoby5zdGFjaykge1xuICAgICAgICAgIHN0YWNrcy51bnNoaWZ0KG8uc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja3MudW5zaGlmdChlcnJvci5zdGFjayk7XG5cbiAgICAgIHZhciBjb25jYXRlZFN0YWNrcyA9IHN0YWNrcy5qb2luKCdcXG4nICsgU1RBQ0tfSlVNUF9TRVBBUkFUT1IgKyAnXFxuJyk7XG4gICAgICBlcnJvci5zdGFjayA9IGZpbHRlclN0YWNrU3RyaW5nKGNvbmNhdGVkU3RhY2tzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmaWx0ZXJTdGFja1N0cmluZyhzdGFja1N0cmluZykge1xuICAgIHZhciBsaW5lcyA9IHN0YWNrU3RyaW5nLnNwbGl0KCdcXG4nKSwgZGVzaXJlZExpbmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgbGluZSA9IGxpbmVzW2ldO1xuXG4gICAgICBpZiAoIWlzSW50ZXJuYWxGcmFtZShsaW5lKSAmJiAhaXNOb2RlRnJhbWUobGluZSkgJiYgbGluZSkge1xuICAgICAgICBkZXNpcmVkTGluZXMucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc2lyZWRMaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW50ZXJuYWxGcmFtZShzdGFja0xpbmUpIHtcbiAgICB2YXIgZmlsZU5hbWVBbmRMaW5lTnVtYmVyID0gZ2V0RmlsZU5hbWVBbmRMaW5lTnVtYmVyKHN0YWNrTGluZSk7XG4gICAgaWYgKCFmaWxlTmFtZUFuZExpbmVOdW1iZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzBdLCBsaW5lTnVtYmVyID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzFdO1xuXG4gICAgcmV0dXJuIGZpbGVOYW1lID09PSByRmlsZU5hbWUgJiZcbiAgICAgIGxpbmVOdW1iZXIgPj0gclN0YXJ0aW5nTGluZSAmJlxuICAgICAgbGluZU51bWJlciA8PSByRW5kaW5nTGluZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZUZyYW1lKHN0YWNrTGluZSkge1xuICAgIHJldHVybiBzdGFja0xpbmUuaW5kZXhPZignKG1vZHVsZS5qczonKSAhPT0gLTEgfHxcbiAgICAgIHN0YWNrTGluZS5pbmRleE9mKCcobm9kZS5qczonKSAhPT0gLTE7XG4gIH1cblxuICBmdW5jdGlvbiBjYXB0dXJlTGluZSgpIHtcbiAgICBpZiAoIWhhc1N0YWNrcykgeyByZXR1cm47IH1cblxuICAgIHRyeSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB2YXIgbGluZXMgPSBlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBmaXJzdExpbmUgPSBsaW5lc1swXS5pbmRleE9mKCdAJykgPiAwID8gbGluZXNbMV0gOiBsaW5lc1syXTtcbiAgICAgIHZhciBmaWxlTmFtZUFuZExpbmVOdW1iZXIgPSBnZXRGaWxlTmFtZUFuZExpbmVOdW1iZXIoZmlyc3RMaW5lKTtcbiAgICAgIGlmICghZmlsZU5hbWVBbmRMaW5lTnVtYmVyKSB7IHJldHVybjsgfVxuXG4gICAgICByRmlsZU5hbWUgPSBmaWxlTmFtZUFuZExpbmVOdW1iZXJbMF07XG4gICAgICByZXR1cm4gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzFdO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZpbGVOYW1lQW5kTGluZU51bWJlcihzdGFja0xpbmUpIHtcbiAgICAvLyBOYW1lZCBmdW5jdGlvbnM6ICdhdCBmdW5jdGlvbk5hbWUgKGZpbGVuYW1lOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyKSdcbiAgICB2YXIgYXR0ZW1wdDEgPSAvYXQgLisgXFwoKC4rKTooXFxkKyk6KD86XFxkKylcXCkkLy5leGVjKHN0YWNrTGluZSk7XG4gICAgaWYgKGF0dGVtcHQxKSB7IHJldHVybiBbYXR0ZW1wdDFbMV0sIE51bWJlcihhdHRlbXB0MVsyXSldOyB9XG5cbiAgICAvLyBBbm9ueW1vdXMgZnVuY3Rpb25zOiAnYXQgZmlsZW5hbWU6bGluZU51bWJlcjpjb2x1bW5OdW1iZXInXG4gICAgdmFyIGF0dGVtcHQyID0gL2F0IChbXiBdKyk6KFxcZCspOig/OlxcZCspJC8uZXhlYyhzdGFja0xpbmUpO1xuICAgIGlmIChhdHRlbXB0MikgeyByZXR1cm4gW2F0dGVtcHQyWzFdLCBOdW1iZXIoYXR0ZW1wdDJbMl0pXTsgfVxuXG4gICAgLy8gRmlyZWZveCBzdHlsZTogJ2Z1bmN0aW9uQGZpbGVuYW1lOmxpbmVOdW1iZXIgb3IgQGZpbGVuYW1lOmxpbmVOdW1iZXInXG4gICAgdmFyIGF0dGVtcHQzID0gLy4qQCguKyk6KFxcZCspJC8uZXhlYyhzdGFja0xpbmUpO1xuICAgIGlmIChhdHRlbXB0MykgeyByZXR1cm4gW2F0dGVtcHQzWzFdLCBOdW1iZXIoYXR0ZW1wdDNbMl0pXTsgfVxuICB9XG5cbiAgdmFyIEVtcHR5RXJyb3IgPSBSeC5FbXB0eUVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gJ1NlcXVlbmNlIGNvbnRhaW5zIG5vIGVsZW1lbnRzLic7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgfTtcbiAgRW1wdHlFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gIEVtcHR5RXJyb3IucHJvdG90eXBlLm5hbWUgPSAnRW1wdHlFcnJvcic7XG5cbiAgdmFyIE9iamVjdERpc3Bvc2VkRXJyb3IgPSBSeC5PYmplY3REaXNwb3NlZEVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gJ09iamVjdCBoYXMgYmVlbiBkaXNwb3NlZCc7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgfTtcbiAgT2JqZWN0RGlzcG9zZWRFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gIE9iamVjdERpc3Bvc2VkRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnT2JqZWN0RGlzcG9zZWRFcnJvcic7XG5cbiAgdmFyIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yID0gUnguQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gJ0FyZ3VtZW50IG91dCBvZiByYW5nZSc7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgfTtcbiAgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuICBBcmd1bWVudE91dE9mUmFuZ2VFcnJvci5wcm90b3R5cGUubmFtZSA9ICdBcmd1bWVudE91dE9mUmFuZ2VFcnJvcic7XG5cbiAgdmFyIE5vdFN1cHBvcnRlZEVycm9yID0gUnguTm90U3VwcG9ydGVkRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQnO1xuICAgIEVycm9yLmNhbGwodGhpcyk7XG4gIH07XG4gIE5vdFN1cHBvcnRlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbiAgTm90U3VwcG9ydGVkRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnTm90U3VwcG9ydGVkRXJyb3InO1xuXG4gIHZhciBOb3RJbXBsZW1lbnRlZEVycm9yID0gUnguTm90SW1wbGVtZW50ZWRFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhpcyBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkJztcbiAgICBFcnJvci5jYWxsKHRoaXMpO1xuICB9O1xuICBOb3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbiAgTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUubmFtZSA9ICdOb3RJbXBsZW1lbnRlZEVycm9yJztcblxuICB2YXIgbm90SW1wbGVtZW50ZWQgPSBSeC5oZWxwZXJzLm5vdEltcGxlbWVudGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH07XG5cbiAgdmFyIG5vdFN1cHBvcnRlZCA9IFJ4LmhlbHBlcnMubm90U3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICB9O1xuXG4gIC8vIFNoaW0gaW4gaXRlcmF0b3Igc3VwcG9ydFxuICB2YXIgJGl0ZXJhdG9yJCA9ICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcikgfHxcbiAgICAnX2VzNnNoaW1faXRlcmF0b3JfJztcbiAgLy8gQnVnIGZvciBtb3ppbGxhIHZlcnNpb25cbiAgaWYgKHJvb3QuU2V0ICYmIHR5cGVvZiBuZXcgcm9vdC5TZXQoKVsnQEBpdGVyYXRvciddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgJGl0ZXJhdG9yJCA9ICdAQGl0ZXJhdG9yJztcbiAgfVxuXG4gIHZhciBkb25lRW51bWVyYXRvciA9IFJ4LmRvbmVFbnVtZXJhdG9yID0geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG5cbiAgdmFyIGlzSXRlcmFibGUgPSBSeC5oZWxwZXJzLmlzSXRlcmFibGUgPSBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIG9bJGl0ZXJhdG9yJF0gIT09IHVuZGVmaW5lZDtcbiAgfTtcblxuICB2YXIgaXNBcnJheUxpa2UgPSBSeC5oZWxwZXJzLmlzQXJyYXlMaWtlID0gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBvLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICB9O1xuXG4gIFJ4LmhlbHBlcnMuaXRlcmF0b3IgPSAkaXRlcmF0b3IkO1xuXG4gIHZhciBiaW5kQ2FsbGJhY2sgPSBSeC5pbnRlcm5hbHMuYmluZENhbGxiYWNrID0gZnVuY3Rpb24gKGZ1bmMsIHRoaXNBcmcsIGFyZ0NvdW50KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzQXJnID09PSAndW5kZWZpbmVkJykgeyByZXR1cm4gZnVuYzsgfVxuICAgIHN3aXRjaChhcmdDb3VudCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKVxuICAgICAgICB9O1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmcpO1xuICAgICAgICB9XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCk7XG4gICAgICAgIH07XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIGRldGVybWluZSBpZiB2YWx1ZXMgYXJlIG9mIHRoZSBsYW5ndWFnZSB0eXBlIE9iamVjdCAqL1xuICB2YXIgZG9udEVudW1zID0gWyd0b1N0cmluZycsXG4gICAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgICAndmFsdWVPZicsXG4gICAgJ2hhc093blByb3BlcnR5JyxcbiAgICAnaXNQcm90b3R5cGVPZicsXG4gICAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgICAnY29uc3RydWN0b3InXSxcbiAgZG9udEVudW1zTGVuZ3RoID0gZG9udEVudW1zLmxlbmd0aDtcblxuICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHNob3J0Y3V0cyAqL1xuICB2YXIgYXJnc0NsYXNzID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlDbGFzcyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbENsYXNzID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVDbGFzcyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvckNsYXNzID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jQ2xhc3MgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG51bWJlckNsYXNzID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBDbGFzcyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHN0cmluZ0NsYXNzID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbiAgdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxcbiAgICBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksXG4gICAgc3VwcG9ydHNBcmdzQ2xhc3MgPSB0b1N0cmluZy5jYWxsKGFyZ3VtZW50cykgPT0gYXJnc0NsYXNzLCAvLyBGb3IgbGVzcyA8SUU5ICYmIEZGPDRcbiAgICBzdXBwb3J0Tm9kZUNsYXNzLFxuICAgIGVycm9yUHJvdG8gPSBFcnJvci5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlLFxuICAgIHN0cmluZ1Byb3RvID0gU3RyaW5nLnByb3RvdHlwZSxcbiAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4gIHRyeSB7XG4gICAgc3VwcG9ydE5vZGVDbGFzcyA9ICEodG9TdHJpbmcuY2FsbChkb2N1bWVudCkgPT0gb2JqZWN0Q2xhc3MgJiYgISh7ICd0b1N0cmluZyc6IDAgfSArICcnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzdXBwb3J0Tm9kZUNsYXNzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBub25FbnVtUHJvcHMgPSB7fTtcbiAgbm9uRW51bVByb3BzW2FycmF5Q2xhc3NdID0gbm9uRW51bVByb3BzW2RhdGVDbGFzc10gPSBub25FbnVtUHJvcHNbbnVtYmVyQ2xhc3NdID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9Mb2NhbGVTdHJpbmcnOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlLCAndmFsdWVPZic6IHRydWUgfTtcbiAgbm9uRW51bVByb3BzW2Jvb2xDbGFzc10gPSBub25FbnVtUHJvcHNbc3RyaW5nQ2xhc3NdID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlLCAndmFsdWVPZic6IHRydWUgfTtcbiAgbm9uRW51bVByb3BzW2Vycm9yQ2xhc3NdID0gbm9uRW51bVByb3BzW2Z1bmNDbGFzc10gPSBub25FbnVtUHJvcHNbcmVnZXhwQ2xhc3NdID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlIH07XG4gIG5vbkVudW1Qcm9wc1tvYmplY3RDbGFzc10gPSB7ICdjb25zdHJ1Y3Rvcic6IHRydWUgfTtcblxuICB2YXIgc3VwcG9ydCA9IHt9O1xuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjdG9yID0gZnVuY3Rpb24oKSB7IHRoaXMueCA9IDE7IH0sXG4gICAgICBwcm9wcyA9IFtdO1xuXG4gICAgY3Rvci5wcm90b3R5cGUgPSB7ICd2YWx1ZU9mJzogMSwgJ3knOiAxIH07XG4gICAgZm9yICh2YXIga2V5IGluIG5ldyBjdG9yKSB7IHByb3BzLnB1c2goa2V5KTsgfVxuICAgIGZvciAoa2V5IGluIGFyZ3VtZW50cykgeyB9XG5cbiAgICAvLyBEZXRlY3QgaWYgYG5hbWVgIG9yIGBtZXNzYWdlYCBwcm9wZXJ0aWVzIG9mIGBFcnJvci5wcm90b3R5cGVgIGFyZSBlbnVtZXJhYmxlIGJ5IGRlZmF1bHQuXG4gICAgc3VwcG9ydC5lbnVtRXJyb3JQcm9wcyA9IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZXJyb3JQcm90bywgJ21lc3NhZ2UnKSB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGVycm9yUHJvdG8sICduYW1lJyk7XG5cbiAgICAvLyBEZXRlY3QgaWYgYHByb3RvdHlwZWAgcHJvcGVydGllcyBhcmUgZW51bWVyYWJsZSBieSBkZWZhdWx0LlxuICAgIHN1cHBvcnQuZW51bVByb3RvdHlwZXMgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGN0b3IsICdwcm90b3R5cGUnKTtcblxuICAgIC8vIERldGVjdCBpZiBgYXJndW1lbnRzYCBvYmplY3QgaW5kZXhlcyBhcmUgbm9uLWVudW1lcmFibGVcbiAgICBzdXBwb3J0Lm5vbkVudW1BcmdzID0ga2V5ICE9IDA7XG5cbiAgICAvLyBEZXRlY3QgaWYgcHJvcGVydGllcyBzaGFkb3dpbmcgdGhvc2Ugb24gYE9iamVjdC5wcm90b3R5cGVgIGFyZSBub24tZW51bWVyYWJsZS5cbiAgICBzdXBwb3J0Lm5vbkVudW1TaGFkb3dzID0gIS92YWx1ZU9mLy50ZXN0KHByb3BzKTtcbiAgfSgxKSk7XG5cbiAgdmFyIGlzT2JqZWN0ID0gUnguaW50ZXJuYWxzLmlzT2JqZWN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHR5cGUgPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlID09ICdvYmplY3QnKSB8fCBmYWxzZTtcbiAgfTtcblxuICBmdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQubm9uRW51bUFyZ3MgJiYgb2JqZWN0Lmxlbmd0aCAmJiBpc0FyZ3VtZW50cyhvYmplY3QpKSB7XG4gICAgICBvYmplY3QgPSBzbGljZS5jYWxsKG9iamVjdCk7XG4gICAgfVxuICAgIHZhciBza2lwUHJvdG8gPSBzdXBwb3J0LmVudW1Qcm90b3R5cGVzICYmIHR5cGVvZiBvYmplY3QgPT0gJ2Z1bmN0aW9uJyxcbiAgICAgICAgc2tpcEVycm9yUHJvcHMgPSBzdXBwb3J0LmVudW1FcnJvclByb3BzICYmIChvYmplY3QgPT09IGVycm9yUHJvdG8gfHwgb2JqZWN0IGluc3RhbmNlb2YgRXJyb3IpO1xuXG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAgaWYgKCEoc2tpcFByb3RvICYmIGtleSA9PSAncHJvdG90eXBlJykgJiZcbiAgICAgICAgICAhKHNraXBFcnJvclByb3BzICYmIChrZXkgPT0gJ21lc3NhZ2UnIHx8IGtleSA9PSAnbmFtZScpKSkge1xuICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXBwb3J0Lm5vbkVudW1TaGFkb3dzICYmIG9iamVjdCAhPT0gb2JqZWN0UHJvdG8pIHtcbiAgICAgIHZhciBjdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZG9udEVudW1zTGVuZ3RoO1xuXG4gICAgICBpZiAob2JqZWN0ID09PSAoY3RvciAmJiBjdG9yLnByb3RvdHlwZSkpIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IG9iamVjdCA9PT0gc3RyaW5nUHJvdG8gPyBzdHJpbmdDbGFzcyA6IG9iamVjdCA9PT0gZXJyb3JQcm90byA/IGVycm9yQ2xhc3MgOiB0b1N0cmluZy5jYWxsKG9iamVjdCksXG4gICAgICAgICAgICBub25FbnVtID0gbm9uRW51bVByb3BzW2NsYXNzTmFtZV07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBrZXkgPSBkb250RW51bXNbaW5kZXhdO1xuICAgICAgICBpZiAoIShub25FbnVtICYmIG5vbkVudW1ba2V5XSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBpbnRlcm5hbEZvcihvYmplY3QsIGNhbGxiYWNrLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG4gICAgICBpZiAoY2FsbGJhY2sob2JqZWN0W2tleV0sIGtleSwgb2JqZWN0KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICBmdW5jdGlvbiBpbnRlcm5hbEZvckluKG9iamVjdCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gaW50ZXJuYWxGb3Iob2JqZWN0LCBjYWxsYmFjaywga2V5c0luKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZSh2YWx1ZSkge1xuICAgIC8vIElFIDwgOSBwcmVzZW50cyBET00gbm9kZXMgYXMgYE9iamVjdGAgb2JqZWN0cyBleGNlcHQgdGhleSBoYXZlIGB0b1N0cmluZ2BcbiAgICAvLyBtZXRob2RzIHRoYXQgYXJlIGB0eXBlb2ZgIFwic3RyaW5nXCIgYW5kIHN0aWxsIGNhbiBjb2VyY2Ugbm9kZXMgdG8gc3RyaW5nc1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKHZhbHVlICsgJycpID09ICdzdHJpbmcnO1xuICB9XG5cbiAgdmFyIGlzQXJndW1lbnRzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JykgPyB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcmdzQ2xhc3MgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIGZhbGxiYWNrIGZvciBicm93c2VycyB0aGF0IGNhbid0IGRldGVjdCBgYXJndW1lbnRzYCBvYmplY3RzIGJ5IFtbQ2xhc3NdXVxuICBpZiAoIXN1cHBvcnRzQXJnc0NsYXNzKSB7XG4gICAgaXNBcmd1bWVudHMgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpID8gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpIDogZmFsc2U7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpc0VxdWFsID0gUnguaW50ZXJuYWxzLmlzRXF1YWwgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHJldHVybiBkZWVwRXF1YWxzKHgsIHksIFtdLCBbXSk7XG4gIH07XG5cbiAgLyoqIEBwcml2YXRlXG4gICAqIFVzZWQgZm9yIGRlZXAgY29tcGFyaXNvblxuICAgKiovXG4gIGZ1bmN0aW9uIGRlZXBFcXVhbHMoYSwgYiwgc3RhY2tBLCBzdGFja0IpIHtcbiAgICAvLyBleGl0IGVhcmx5IGZvciBpZGVudGljYWwgdmFsdWVzXG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgIC8vIHRyZWF0IGArMGAgdnMuIGAtMGAgYXMgbm90IGVxdWFsXG4gICAgICByZXR1cm4gYSAhPT0gMCB8fCAoMSAvIGEgPT0gMSAvIGIpO1xuICAgIH1cblxuICAgIHZhciB0eXBlID0gdHlwZW9mIGEsXG4gICAgICAgIG90aGVyVHlwZSA9IHR5cGVvZiBiO1xuXG4gICAgLy8gZXhpdCBlYXJseSBmb3IgdW5saWtlIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICBpZiAoYSA9PT0gYSAmJiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCB8fFxuICAgICAgICAodHlwZSAhPSAnZnVuY3Rpb24nICYmIHR5cGUgIT0gJ29iamVjdCcgJiYgb3RoZXJUeXBlICE9ICdmdW5jdGlvbicgJiYgb3RoZXJUeXBlICE9ICdvYmplY3QnKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIFtbQ2xhc3NdXSBuYW1lc1xuICAgIHZhciBjbGFzc05hbWUgPSB0b1N0cmluZy5jYWxsKGEpLFxuICAgICAgICBvdGhlckNsYXNzID0gdG9TdHJpbmcuY2FsbChiKTtcblxuICAgIGlmIChjbGFzc05hbWUgPT0gYXJnc0NsYXNzKSB7XG4gICAgICBjbGFzc05hbWUgPSBvYmplY3RDbGFzcztcbiAgICB9XG4gICAgaWYgKG90aGVyQ2xhc3MgPT0gYXJnc0NsYXNzKSB7XG4gICAgICBvdGhlckNsYXNzID0gb2JqZWN0Q2xhc3M7XG4gICAgfVxuICAgIGlmIChjbGFzc05hbWUgIT0gb3RoZXJDbGFzcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgY2FzZSBib29sQ2xhc3M6XG4gICAgICBjYXNlIGRhdGVDbGFzczpcbiAgICAgICAgLy8gY29lcmNlIGRhdGVzIGFuZCBib29sZWFucyB0byBudW1iZXJzLCBkYXRlcyB0byBtaWxsaXNlY29uZHMgYW5kIGJvb2xlYW5zXG4gICAgICAgIC8vIHRvIGAxYCBvciBgMGAgdHJlYXRpbmcgaW52YWxpZCBkYXRlcyBjb2VyY2VkIHRvIGBOYU5gIGFzIG5vdCBlcXVhbFxuICAgICAgICByZXR1cm4gK2EgPT0gK2I7XG5cbiAgICAgIGNhc2UgbnVtYmVyQ2xhc3M6XG4gICAgICAgIC8vIHRyZWF0IGBOYU5gIHZzLiBgTmFOYCBhcyBlcXVhbFxuICAgICAgICByZXR1cm4gKGEgIT0gK2EpID9cbiAgICAgICAgICBiICE9ICtiIDpcbiAgICAgICAgICAvLyBidXQgdHJlYXQgYC0wYCB2cy4gYCswYCBhcyBub3QgZXF1YWxcbiAgICAgICAgICAoYSA9PSAwID8gKDEgLyBhID09IDEgLyBiKSA6IGEgPT0gK2IpO1xuXG4gICAgICBjYXNlIHJlZ2V4cENsYXNzOlxuICAgICAgY2FzZSBzdHJpbmdDbGFzczpcbiAgICAgICAgLy8gY29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMC42LjQpXG4gICAgICAgIC8vIHRyZWF0IHN0cmluZyBwcmltaXRpdmVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9iamVjdCBpbnN0YW5jZXMgYXMgZXF1YWxcbiAgICAgICAgcmV0dXJuIGEgPT0gU3RyaW5nKGIpO1xuICAgIH1cbiAgICB2YXIgaXNBcnIgPSBjbGFzc05hbWUgPT0gYXJyYXlDbGFzcztcbiAgICBpZiAoIWlzQXJyKSB7XG5cbiAgICAgIC8vIGV4aXQgZm9yIGZ1bmN0aW9ucyBhbmQgRE9NIG5vZGVzXG4gICAgICBpZiAoY2xhc3NOYW1lICE9IG9iamVjdENsYXNzIHx8ICghc3VwcG9ydC5ub2RlQ2xhc3MgJiYgKGlzTm9kZShhKSB8fCBpc05vZGUoYikpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBpbiBvbGRlciB2ZXJzaW9ucyBvZiBPcGVyYSwgYGFyZ3VtZW50c2Agb2JqZWN0cyBoYXZlIGBBcnJheWAgY29uc3RydWN0b3JzXG4gICAgICB2YXIgY3RvckEgPSAhc3VwcG9ydC5hcmdzT2JqZWN0ICYmIGlzQXJndW1lbnRzKGEpID8gT2JqZWN0IDogYS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBjdG9yQiA9ICFzdXBwb3J0LmFyZ3NPYmplY3QgJiYgaXNBcmd1bWVudHMoYikgPyBPYmplY3QgOiBiLmNvbnN0cnVjdG9yO1xuXG4gICAgICAvLyBub24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbFxuICAgICAgaWYgKGN0b3JBICE9IGN0b3JCICYmXG4gICAgICAgICAgICAhKGhhc093blByb3BlcnR5LmNhbGwoYSwgJ2NvbnN0cnVjdG9yJykgJiYgaGFzT3duUHJvcGVydHkuY2FsbChiLCAnY29uc3RydWN0b3InKSkgJiZcbiAgICAgICAgICAgICEoaXNGdW5jdGlvbihjdG9yQSkgJiYgY3RvckEgaW5zdGFuY2VvZiBjdG9yQSAmJiBpc0Z1bmN0aW9uKGN0b3JCKSAmJiBjdG9yQiBpbnN0YW5jZW9mIGN0b3JCKSAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gYSAmJiAnY29uc3RydWN0b3InIGluIGIpXG4gICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYXNzdW1lIGN5Y2xpYyBzdHJ1Y3R1cmVzIGFyZSBlcXVhbFxuICAgIC8vIHRoZSBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBjeWNsaWMgc3RydWN0dXJlcyBpcyBhZGFwdGVkIGZyb20gRVMgNS4xXG4gICAgLy8gc2VjdGlvbiAxNS4xMi4zLCBhYnN0cmFjdCBvcGVyYXRpb24gYEpPYCAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMi4zKVxuICAgIHZhciBpbml0ZWRTdGFjayA9ICFzdGFja0E7XG4gICAgc3RhY2tBIHx8IChzdGFja0EgPSBbXSk7XG4gICAgc3RhY2tCIHx8IChzdGFja0IgPSBbXSk7XG5cbiAgICB2YXIgbGVuZ3RoID0gc3RhY2tBLmxlbmd0aDtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChzdGFja0FbbGVuZ3RoXSA9PSBhKSB7XG4gICAgICAgIHJldHVybiBzdGFja0JbbGVuZ3RoXSA9PSBiO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IHRydWU7XG5cbiAgICAvLyBhZGQgYGFgIGFuZCBgYmAgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzXG4gICAgc3RhY2tBLnB1c2goYSk7XG4gICAgc3RhY2tCLnB1c2goYik7XG5cbiAgICAvLyByZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpXG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAvLyBjb21wYXJlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIGlmIGEgZGVlcCBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeVxuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBzaXplID0gYi5sZW5ndGg7XG4gICAgICByZXN1bHQgPSBzaXplID09IGxlbmd0aDtcblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvLyBkZWVwIGNvbXBhcmUgdGhlIGNvbnRlbnRzLCBpZ25vcmluZyBub24tbnVtZXJpYyBwcm9wZXJ0aWVzXG4gICAgICAgIHdoaWxlIChzaXplLS0pIHtcbiAgICAgICAgICB2YXIgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICAgIHZhbHVlID0gYltzaXplXTtcblxuICAgICAgICAgIGlmICghKHJlc3VsdCA9IGRlZXBFcXVhbHMoYVtzaXplXSwgdmFsdWUsIHN0YWNrQSwgc3RhY2tCKSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIGRlZXAgY29tcGFyZSBvYmplY3RzIHVzaW5nIGBmb3JJbmAsIGluc3RlYWQgb2YgYGZvck93bmAsIHRvIGF2b2lkIGBPYmplY3Qua2V5c2BcbiAgICAgIC8vIHdoaWNoLCBpbiB0aGlzIGNhc2UsIGlzIG1vcmUgY29zdGx5XG4gICAgICBpbnRlcm5hbEZvckluKGIsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGIpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkge1xuICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcy5cbiAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgLy8gZGVlcCBjb21wYXJlIGVhY2ggcHJvcGVydHkgdmFsdWUuXG4gICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGtleSkgJiYgZGVlcEVxdWFscyhhW2tleV0sIHZhbHVlLCBzdGFja0EsIHN0YWNrQikpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvLyBlbnN1cmUgYm90aCBvYmplY3RzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHByb3BlcnRpZXNcbiAgICAgICAgaW50ZXJuYWxGb3JJbihhLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBhKSB7XG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYSwga2V5KSkge1xuICAgICAgICAgICAgLy8gYHNpemVgIHdpbGwgYmUgYC0xYCBpZiBgYWAgaGFzIG1vcmUgcHJvcGVydGllcyB0aGFuIGBiYFxuICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSAtLXNpemUgPiAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhY2tBLnBvcCgpO1xuICAgIHN0YWNrQi5wb3AoKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICAgICAgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbiAgdmFyIGluaGVyaXRzID0gUnguaW50ZXJuYWxzLmluaGVyaXRzID0gZnVuY3Rpb24gKGNoaWxkLCBwYXJlbnQpIHtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9XG4gICAgX18ucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgX18oKTtcbiAgfTtcblxuICB2YXIgYWRkUHJvcGVydGllcyA9IFJ4LmludGVybmFscy5hZGRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKG9iaikge1xuICAgIGZvcih2YXIgc291cmNlcyA9IFtdLCBpID0gMSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7IHNvdXJjZXMucHVzaChhcmd1bWVudHNbaV0pOyB9XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbG4gPSBzb3VyY2VzLmxlbmd0aDsgaWR4IDwgbG47IGlkeCsrKSB7XG4gICAgICB2YXIgc291cmNlID0gc291cmNlc1tpZHhdO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgb2JqW3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBSeCBVdGlsc1xuICB2YXIgYWRkUmVmID0gUnguaW50ZXJuYWxzLmFkZFJlZiA9IGZ1bmN0aW9uICh4cywgcikge1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShyLmdldERpc3Bvc2FibGUoKSwgeHMuc3Vic2NyaWJlKG9ic2VydmVyKSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gYXJyYXlJbml0aWFsaXplKGNvdW50LCBmYWN0b3J5KSB7XG4gICAgdmFyIGEgPSBuZXcgQXJyYXkoY291bnQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgYVtpXSA9IGZhY3RvcnkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGdyb3VwIG9mIGRpc3Bvc2FibGUgcmVzb3VyY2VzIHRoYXQgYXJlIGRpc3Bvc2VkIHRvZ2V0aGVyLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICovXG4gIHZhciBDb21wb3NpdGVEaXNwb3NhYmxlID0gUnguQ29tcG9zaXRlRGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBpLCBsZW47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgYXJncyA9IGFyZ3VtZW50c1swXTtcbiAgICAgIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIH1cbiAgICB0aGlzLmRpc3Bvc2FibGVzID0gYXJncztcbiAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLmxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBDb21wb3NpdGVEaXNwb3NhYmxlUHJvdG90eXBlID0gQ29tcG9zaXRlRGlzcG9zYWJsZS5wcm90b3R5cGU7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBkaXNwb3NhYmxlIHRvIHRoZSBDb21wb3NpdGVEaXNwb3NhYmxlIG9yIGRpc3Bvc2VzIHRoZSBkaXNwb3NhYmxlIGlmIHRoZSBDb21wb3NpdGVEaXNwb3NhYmxlIGlzIGRpc3Bvc2VkLlxuICAgKiBAcGFyYW0ge01peGVkfSBpdGVtIERpc3Bvc2FibGUgdG8gYWRkLlxuICAgKi9cbiAgQ29tcG9zaXRlRGlzcG9zYWJsZVByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIGl0ZW0uZGlzcG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3Bvc2FibGVzLnB1c2goaXRlbSk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbmQgZGlzcG9zZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBkaXNwb3NhYmxlIGZyb20gdGhlIENvbXBvc2l0ZURpc3Bvc2FibGUuXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGl0ZW0gRGlzcG9zYWJsZSB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGZvdW5kOyBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBDb21wb3NpdGVEaXNwb3NhYmxlUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIHNob3VsZERpc3Bvc2UgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgdmFyIGlkeCA9IHRoaXMuZGlzcG9zYWJsZXMuaW5kZXhPZihpdGVtKTtcbiAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgIHNob3VsZERpc3Bvc2UgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpc3Bvc2FibGVzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB0aGlzLmxlbmd0aC0tO1xuICAgICAgICBpdGVtLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNob3VsZERpc3Bvc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqICBEaXNwb3NlcyBhbGwgZGlzcG9zYWJsZXMgaW4gdGhlIGdyb3VwIGFuZCByZW1vdmVzIHRoZW0gZnJvbSB0aGUgZ3JvdXAuXG4gICAqL1xuICBDb21wb3NpdGVEaXNwb3NhYmxlUHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICB2YXIgbGVuID0gdGhpcy5kaXNwb3NhYmxlcy5sZW5ndGgsIGN1cnJlbnREaXNwb3NhYmxlcyA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGN1cnJlbnREaXNwb3NhYmxlc1tpXSA9IHRoaXMuZGlzcG9zYWJsZXNbaV07IH1cbiAgICAgIHRoaXMuZGlzcG9zYWJsZXMgPSBbXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGN1cnJlbnREaXNwb3NhYmxlc1tpXS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIHNldCBvZiBzdGF0aWMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgRGlzcG9zYWJsZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3Bvc2UgQWN0aW9uIHRvIHJ1biBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgdG8gZGlzcG9zZS4gVGhlIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIHJ1biBhdCBtb3N0IG9uY2UuXG4gICAqL1xuICB2YXIgRGlzcG9zYWJsZSA9IFJ4LkRpc3Bvc2FibGUgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgdGhpcy5hY3Rpb24gPSBhY3Rpb24gfHwgbm9vcDtcbiAgfTtcblxuICAvKiogUGVyZm9ybXMgdGhlIHRhc2sgb2YgY2xlYW5pbmcgdXAgcmVzb3VyY2VzLiAqL1xuICBEaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICB0aGlzLmFjdGlvbigpO1xuICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkaXNwb3NhYmxlIG9iamVjdCB0aGF0IGludm9rZXMgdGhlIHNwZWNpZmllZCBhY3Rpb24gd2hlbiBkaXNwb3NlZC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcG9zZSBBY3Rpb24gdG8gcnVuIGR1cmluZyB0aGUgZmlyc3QgY2FsbCB0byBkaXNwb3NlLiBUaGUgYWN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgcnVuIGF0IG1vc3Qgb25jZS5cbiAgICogQHJldHVybiB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHRoYXQgcnVucyB0aGUgZ2l2ZW4gYWN0aW9uIHVwb24gZGlzcG9zYWwuXG4gICAqL1xuICB2YXIgZGlzcG9zYWJsZUNyZWF0ZSA9IERpc3Bvc2FibGUuY3JlYXRlID0gZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gbmV3IERpc3Bvc2FibGUoYWN0aW9uKTsgfTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgZGlzcG9zYWJsZSB0aGF0IGRvZXMgbm90aGluZyB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgdmFyIGRpc3Bvc2FibGVFbXB0eSA9IERpc3Bvc2FibGUuZW1wdHkgPSB7IGRpc3Bvc2U6IG5vb3AgfTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIGRpc3Bvc2FibGVcbiAgICogQHBhcmFtIHtPYmplY3R9IE9iamVjdCB0byB0ZXN0IHdoZXRoZXIgaXQgaGFzIGEgZGlzcG9zZSBtZXRob2RcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgYSBkaXNwb3NhYmxlIG9iamVjdCwgZWxzZSBmYWxzZS5cbiAgICovXG4gIHZhciBpc0Rpc3Bvc2FibGUgPSBEaXNwb3NhYmxlLmlzRGlzcG9zYWJsZSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgcmV0dXJuIGQgJiYgaXNGdW5jdGlvbihkLmRpc3Bvc2UpO1xuICB9O1xuXG4gIHZhciBjaGVja0Rpc3Bvc2VkID0gRGlzcG9zYWJsZS5jaGVja0Rpc3Bvc2VkID0gZnVuY3Rpb24gKGRpc3Bvc2FibGUpIHtcbiAgICBpZiAoZGlzcG9zYWJsZS5pc0Rpc3Bvc2VkKSB7IHRocm93IG5ldyBPYmplY3REaXNwb3NlZEVycm9yKCk7IH1cbiAgfTtcblxuICB2YXIgZGlzcG9zYWJsZUZpeHVwID0gRGlzcG9zYWJsZS5fZml4dXAgPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgcmV0dXJuIGlzRGlzcG9zYWJsZShyZXN1bHQpID8gcmVzdWx0IDogZGlzcG9zYWJsZUVtcHR5O1xuICB9O1xuXG4gIC8vIFNpbmdsZSBhc3NpZ25tZW50XG4gIHZhciBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSA9IFJ4LlNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIH07XG4gIFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlLnByb3RvdHlwZS5nZXREaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnQ7XG4gIH07XG4gIFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlLnByb3RvdHlwZS5zZXREaXNwb3NhYmxlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudCkgeyB0aHJvdyBuZXcgRXJyb3IoJ0Rpc3Bvc2FibGUgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZCcpOyB9XG4gICAgdmFyIHNob3VsZERpc3Bvc2UgPSB0aGlzLmlzRGlzcG9zZWQ7XG4gICAgIXNob3VsZERpc3Bvc2UgJiYgKHRoaXMuY3VycmVudCA9IHZhbHVlKTtcbiAgICBzaG91bGREaXNwb3NlICYmIHZhbHVlICYmIHZhbHVlLmRpc3Bvc2UoKTtcbiAgfTtcbiAgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICB2YXIgb2xkID0gdGhpcy5jdXJyZW50O1xuICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICAgIG9sZCAmJiBvbGQuZGlzcG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBNdWx0aXBsZSBhc3NpZ25tZW50IGRpc3Bvc2FibGVcbiAgdmFyIFNlcmlhbERpc3Bvc2FibGUgPSBSeC5TZXJpYWxEaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIH07XG4gIFNlcmlhbERpc3Bvc2FibGUucHJvdG90eXBlLmdldERpc3Bvc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudDtcbiAgfTtcbiAgU2VyaWFsRGlzcG9zYWJsZS5wcm90b3R5cGUuc2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBzaG91bGREaXNwb3NlID0gdGhpcy5pc0Rpc3Bvc2VkO1xuICAgIGlmICghc2hvdWxkRGlzcG9zZSkge1xuICAgICAgdmFyIG9sZCA9IHRoaXMuY3VycmVudDtcbiAgICAgIHRoaXMuY3VycmVudCA9IHZhbHVlO1xuICAgIH1cbiAgICBvbGQgJiYgb2xkLmRpc3Bvc2UoKTtcbiAgICBzaG91bGREaXNwb3NlICYmIHZhbHVlICYmIHZhbHVlLmRpc3Bvc2UoKTtcbiAgfTtcbiAgU2VyaWFsRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIHZhciBvbGQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgICBvbGQgJiYgb2xkLmRpc3Bvc2UoKTtcbiAgfTtcblxuICB2YXIgQmluYXJ5RGlzcG9zYWJsZSA9IFJ4LkJpbmFyeURpc3Bvc2FibGUgPSBmdW5jdGlvbiAoZmlyc3QsIHNlY29uZCkge1xuICAgIHRoaXMuX2ZpcnN0ID0gZmlyc3Q7XG4gICAgdGhpcy5fc2Vjb25kID0gc2Vjb25kO1xuICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICB9O1xuXG4gIEJpbmFyeURpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICB2YXIgb2xkMSA9IHRoaXMuX2ZpcnN0O1xuICAgICAgdGhpcy5fZmlyc3QgPSBudWxsO1xuICAgICAgb2xkMSAmJiBvbGQxLmRpc3Bvc2UoKTtcbiAgICAgIHZhciBvbGQyID0gdGhpcy5fc2Vjb25kO1xuICAgICAgdGhpcy5fc2Vjb25kID0gbnVsbDtcbiAgICAgIG9sZDIgJiYgb2xkMi5kaXNwb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBOQXJ5RGlzcG9zYWJsZSA9IFJ4Lk5BcnlEaXNwb3NhYmxlID0gZnVuY3Rpb24gKGRpc3Bvc2FibGVzKSB7XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMgPSBkaXNwb3NhYmxlcztcbiAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgfTtcblxuICBOQXJ5RGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0aGlzLl9kaXNwb3NhYmxlc1tpXS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGRpc3Bvc2FibGUgcmVzb3VyY2UgdGhhdCBvbmx5IGRpc3Bvc2VzIGl0cyB1bmRlcmx5aW5nIGRpc3Bvc2FibGUgcmVzb3VyY2Ugd2hlbiBhbGwgZGVwZW5kZW50IGRpc3Bvc2FibGUgb2JqZWN0cyBoYXZlIGJlZW4gZGlzcG9zZWQuXG4gICAqL1xuICB2YXIgUmVmQ291bnREaXNwb3NhYmxlID0gUnguUmVmQ291bnREaXNwb3NhYmxlID0gKGZ1bmN0aW9uICgpIHtcblxuICAgIGZ1bmN0aW9uIElubmVyRGlzcG9zYWJsZShkaXNwb3NhYmxlKSB7XG4gICAgICB0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NhYmxlO1xuICAgICAgdGhpcy5kaXNwb3NhYmxlLmNvdW50Kys7XG4gICAgICB0aGlzLmlzSW5uZXJEaXNwb3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIElubmVyRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5kaXNwb3NhYmxlLmlzRGlzcG9zZWQgJiYgIXRoaXMuaXNJbm5lckRpc3Bvc2VkKSB7XG4gICAgICAgIHRoaXMuaXNJbm5lckRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXNwb3NhYmxlLmNvdW50LS07XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2FibGUuY291bnQgPT09IDAgJiYgdGhpcy5kaXNwb3NhYmxlLmlzUHJpbWFyeURpc3Bvc2VkKSB7XG4gICAgICAgICAgdGhpcy5kaXNwb3NhYmxlLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZGlzcG9zYWJsZS51bmRlcmx5aW5nRGlzcG9zYWJsZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJlZkNvdW50RGlzcG9zYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgZGlzcG9zYWJsZS5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0Rpc3Bvc2FibGV9IGRpc3Bvc2FibGUgVW5kZXJseWluZyBkaXNwb3NhYmxlLlxuICAgICAgKi9cbiAgICBmdW5jdGlvbiBSZWZDb3VudERpc3Bvc2FibGUoZGlzcG9zYWJsZSkge1xuICAgICAgdGhpcy51bmRlcmx5aW5nRGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7XG4gICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNQcmltYXJ5RGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2VzIHRoZSB1bmRlcmx5aW5nIGRpc3Bvc2FibGUgb25seSB3aGVuIGFsbCBkZXBlbmRlbnQgZGlzcG9zYWJsZXMgaGF2ZSBiZWVuIGRpc3Bvc2VkXG4gICAgICovXG4gICAgUmVmQ291bnREaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQgJiYgIXRoaXMuaXNQcmltYXJ5RGlzcG9zZWQpIHtcbiAgICAgICAgdGhpcy5pc1ByaW1hcnlEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnVuZGVybHlpbmdEaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgZGVwZW5kZW50IGRpc3Bvc2FibGUgdGhhdCB3aGVuIGRpc3Bvc2VkIGRlY3JlYXNlcyB0aGUgcmVmY291bnQgb24gdGhlIHVuZGVybHlpbmcgZGlzcG9zYWJsZS5cbiAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gQSBkZXBlbmRlbnQgZGlzcG9zYWJsZSBjb250cmlidXRpbmcgdG8gdGhlIHJlZmVyZW5jZSBjb3VudCB0aGF0IG1hbmFnZXMgdGhlIHVuZGVybHlpbmcgZGlzcG9zYWJsZSdzIGxpZmV0aW1lLlxuICAgICAqL1xuICAgIFJlZkNvdW50RGlzcG9zYWJsZS5wcm90b3R5cGUuZ2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGlzcG9zZWQgPyBkaXNwb3NhYmxlRW1wdHkgOiBuZXcgSW5uZXJEaXNwb3NhYmxlKHRoaXMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gUmVmQ291bnREaXNwb3NhYmxlO1xuICB9KSgpO1xuXG4gIHZhciBTY2hlZHVsZWRJdGVtID0gUnguaW50ZXJuYWxzLlNjaGVkdWxlZEl0ZW0gPSBmdW5jdGlvbiAoc2NoZWR1bGVyLCBzdGF0ZSwgYWN0aW9uLCBkdWVUaW1lLCBjb21wYXJlcikge1xuICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICB0aGlzLmR1ZVRpbWUgPSBkdWVUaW1lO1xuICAgIHRoaXMuY29tcGFyZXIgPSBjb21wYXJlciB8fCBkZWZhdWx0U3ViQ29tcGFyZXI7XG4gICAgdGhpcy5kaXNwb3NhYmxlID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gIH1cblxuICBTY2hlZHVsZWRJdGVtLnByb3RvdHlwZS5pbnZva2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kaXNwb3NhYmxlLnNldERpc3Bvc2FibGUodGhpcy5pbnZva2VDb3JlKCkpO1xuICB9O1xuXG4gIFNjaGVkdWxlZEl0ZW0ucHJvdG90eXBlLmNvbXBhcmVUbyA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmNvbXBhcmVyKHRoaXMuZHVlVGltZSwgb3RoZXIuZHVlVGltZSk7XG4gIH07XG5cbiAgU2NoZWR1bGVkSXRlbS5wcm90b3R5cGUuaXNDYW5jZWxsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcG9zYWJsZS5pc0Rpc3Bvc2VkO1xuICB9O1xuXG4gIFNjaGVkdWxlZEl0ZW0ucHJvdG90eXBlLmludm9rZUNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3Bvc2FibGVGaXh1cCh0aGlzLmFjdGlvbih0aGlzLnNjaGVkdWxlciwgdGhpcy5zdGF0ZSkpO1xuICB9O1xuXG4gIC8qKiBQcm92aWRlcyBhIHNldCBvZiBzdGF0aWMgcHJvcGVydGllcyB0byBhY2Nlc3MgY29tbW9ubHkgdXNlZCBzY2hlZHVsZXJzLiAqL1xuICB2YXIgU2NoZWR1bGVyID0gUnguU2NoZWR1bGVyID0gKGZ1bmN0aW9uICgpIHtcblxuICAgIGZ1bmN0aW9uIFNjaGVkdWxlcigpIHsgfVxuXG4gICAgLyoqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgc2NoZWR1bGVyICovXG4gICAgU2NoZWR1bGVyLmlzU2NoZWR1bGVyID0gZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBzIGluc3RhbmNlb2YgU2NoZWR1bGVyO1xuICAgIH07XG5cbiAgICB2YXIgc2NoZWR1bGVyUHJvdG8gPSBTY2hlZHVsZXIucHJvdG90eXBlO1xuXG4gICAgLyoqXG4gICAqIFNjaGVkdWxlcyBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG4gICAqIEBwYXJhbSBzdGF0ZSBTdGF0ZSBwYXNzZWQgdG8gdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWN0aW9uIEFjdGlvbiB0byBiZSBleGVjdXRlZC5cbiAgICogQHJldHVybnMge0Rpc3Bvc2FibGV9IFRoZSBkaXNwb3NhYmxlIG9iamVjdCB1c2VkIHRvIGNhbmNlbCB0aGUgc2NoZWR1bGVkIGFjdGlvbiAoYmVzdCBlZmZvcnQpLlxuICAgKi9cbiAgICBzY2hlZHVsZXJQcm90by5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZHVlVGltZS5cbiAgICogQHBhcmFtIHN0YXRlIFN0YXRlIHBhc3NlZCB0byB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhY3Rpb24gQWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gZHVlVGltZSBSZWxhdGl2ZSB0aW1lIGFmdGVyIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIGFjdGlvbi5cbiAgICogQHJldHVybnMge0Rpc3Bvc2FibGV9IFRoZSBkaXNwb3NhYmxlIG9iamVjdCB1c2VkIHRvIGNhbmNlbCB0aGUgc2NoZWR1bGVkIGFjdGlvbiAoYmVzdCBlZmZvcnQpLlxuICAgKi9cbiAgICBzY2hlZHVsZXJQcm90by5zY2hlZHVsZUZ1dHVyZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZHVlVGltZSwgYWN0aW9uKSB7XG4gICAgICB2YXIgZHQgPSBkdWVUaW1lO1xuICAgICAgZHQgaW5zdGFuY2VvZiBEYXRlICYmIChkdCA9IGR0IC0gdGhpcy5ub3coKSk7XG4gICAgICBkdCA9IFNjaGVkdWxlci5ub3JtYWxpemUoZHQpO1xuXG4gICAgICBpZiAoZHQgPT09IDApIHsgcmV0dXJuIHRoaXMuc2NoZWR1bGUoc3RhdGUsIGFjdGlvbik7IH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3NjaGVkdWxlRnV0dXJlKHN0YXRlLCBkdCwgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgc2NoZWR1bGVyUHJvdG8uX3NjaGVkdWxlRnV0dXJlID0gZnVuY3Rpb24gKHN0YXRlLCBkdWVUaW1lLCBhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgfTtcblxuICAgIC8qKiBHZXRzIHRoZSBjdXJyZW50IHRpbWUgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbCBtYWNoaW5lJ3Mgc3lzdGVtIGNsb2NrLiAqL1xuICAgIFNjaGVkdWxlci5ub3cgPSBkZWZhdWx0Tm93O1xuXG4gICAgLyoqIEdldHMgdGhlIGN1cnJlbnQgdGltZSBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsIG1hY2hpbmUncyBzeXN0ZW0gY2xvY2suICovXG4gICAgU2NoZWR1bGVyLnByb3RvdHlwZS5ub3cgPSBkZWZhdWx0Tm93O1xuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyB0aGUgc3BlY2lmaWVkIFRpbWVTcGFuIHZhbHVlIHRvIGEgcG9zaXRpdmUgdmFsdWUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVTcGFuIFRoZSB0aW1lIHNwYW4gdmFsdWUgdG8gbm9ybWFsaXplLlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBzcGVjaWZpZWQgVGltZVNwYW4gdmFsdWUgaWYgaXQgaXMgemVybyBvciBwb3NpdGl2ZTsgb3RoZXJ3aXNlLCAwXG4gICAgICovXG4gICAgU2NoZWR1bGVyLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh0aW1lU3Bhbikge1xuICAgICAgdGltZVNwYW4gPCAwICYmICh0aW1lU3BhbiA9IDApO1xuICAgICAgcmV0dXJuIHRpbWVTcGFuO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2NoZWR1bGVyO1xuICB9KCkpO1xuXG4gIHZhciBub3JtYWxpemVUaW1lID0gU2NoZWR1bGVyLm5vcm1hbGl6ZSwgaXNTY2hlZHVsZXIgPSBTY2hlZHVsZXIuaXNTY2hlZHVsZXI7XG5cbiAgKGZ1bmN0aW9uIChzY2hlZHVsZXJQcm90bykge1xuXG4gICAgZnVuY3Rpb24gaW52b2tlUmVjSW1tZWRpYXRlKHNjaGVkdWxlciwgcGFpcikge1xuICAgICAgdmFyIHN0YXRlID0gcGFpclswXSwgYWN0aW9uID0gcGFpclsxXSwgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlRGlzcG9zYWJsZSgpO1xuICAgICAgYWN0aW9uKHN0YXRlLCBpbm5lckFjdGlvbik7XG4gICAgICByZXR1cm4gZ3JvdXA7XG5cbiAgICAgIGZ1bmN0aW9uIGlubmVyQWN0aW9uKHN0YXRlMikge1xuICAgICAgICB2YXIgaXNBZGRlZCA9IGZhbHNlLCBpc0RvbmUgPSBmYWxzZTtcblxuICAgICAgICB2YXIgZCA9IHNjaGVkdWxlci5zY2hlZHVsZShzdGF0ZTIsIHNjaGVkdWxlV29yayk7XG4gICAgICAgIGlmICghaXNEb25lKSB7XG4gICAgICAgICAgZ3JvdXAuYWRkKGQpO1xuICAgICAgICAgIGlzQWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVXb3JrKF8sIHN0YXRlMykge1xuICAgICAgICAgIGlmIChpc0FkZGVkKSB7XG4gICAgICAgICAgICBncm91cC5yZW1vdmUoZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlzRG9uZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGlvbihzdGF0ZTMsIGlubmVyQWN0aW9uKTtcbiAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52b2tlUmVjRGF0ZShzY2hlZHVsZXIsIHBhaXIpIHtcbiAgICAgIHZhciBzdGF0ZSA9IHBhaXJbMF0sIGFjdGlvbiA9IHBhaXJbMV0sIGdyb3VwID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKTtcbiAgICAgIGFjdGlvbihzdGF0ZSwgaW5uZXJBY3Rpb24pO1xuICAgICAgcmV0dXJuIGdyb3VwO1xuXG4gICAgICBmdW5jdGlvbiBpbm5lckFjdGlvbihzdGF0ZTIsIGR1ZVRpbWUxKSB7XG4gICAgICAgIHZhciBpc0FkZGVkID0gZmFsc2UsIGlzRG9uZSA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBkID0gc2NoZWR1bGVyLnNjaGVkdWxlRnV0dXJlKHN0YXRlMiwgZHVlVGltZTEsIHNjaGVkdWxlV29yayk7XG4gICAgICAgIGlmICghaXNEb25lKSB7XG4gICAgICAgICAgZ3JvdXAuYWRkKGQpO1xuICAgICAgICAgIGlzQWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVXb3JrKF8sIHN0YXRlMykge1xuICAgICAgICAgIGlmIChpc0FkZGVkKSB7XG4gICAgICAgICAgICBncm91cC5yZW1vdmUoZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlzRG9uZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGlvbihzdGF0ZTMsIGlubmVyQWN0aW9uKTtcbiAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2NoZWR1bGVzIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZCByZWN1cnNpdmVseS5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBzdGF0ZSBTdGF0ZSBwYXNzZWQgdG8gdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhY3Rpb24gQWN0aW9uIHRvIGV4ZWN1dGUgcmVjdXJzaXZlbHkuIFRoZSBsYXN0IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGFjdGlvbiBpcyB1c2VkIHRvIHRyaWdnZXIgcmVjdXJzaXZlIHNjaGVkdWxpbmcgb2YgdGhlIGFjdGlvbiwgcGFzc2luZyBpbiByZWN1cnNpdmUgaW52b2NhdGlvbiBzdGF0ZS5cbiAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHVzZWQgdG8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgYWN0aW9uIChiZXN0IGVmZm9ydCkuXG4gICAgICovXG4gICAgc2NoZWR1bGVyUHJvdG8uc2NoZWR1bGVSZWN1cnNpdmUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGUoW3N0YXRlLCBhY3Rpb25dLCBpbnZva2VSZWNJbW1lZGlhdGUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTY2hlZHVsZXMgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkIHJlY3Vyc2l2ZWx5IGFmdGVyIGEgc3BlY2lmaWVkIHJlbGF0aXZlIG9yIGFic29sdXRlIGR1ZSB0aW1lLlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHN0YXRlIFN0YXRlIHBhc3NlZCB0byB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFjdGlvbiBBY3Rpb24gdG8gZXhlY3V0ZSByZWN1cnNpdmVseS4gVGhlIGxhc3QgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgYWN0aW9uIGlzIHVzZWQgdG8gdHJpZ2dlciByZWN1cnNpdmUgc2NoZWR1bGluZyBvZiB0aGUgYWN0aW9uLCBwYXNzaW5nIGluIHRoZSByZWN1cnNpdmUgZHVlIHRpbWUgYW5kIGludm9jYXRpb24gc3RhdGUuXG4gICAgICogQHBhcmFtIHtOdW1iZXIgfCBEYXRlfSBkdWVUaW1lIFJlbGF0aXZlIG9yIGFic29sdXRlIHRpbWUgYWZ0ZXIgd2hpY2ggdG8gZXhlY3V0ZSB0aGUgYWN0aW9uIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gVGhlIGRpc3Bvc2FibGUgb2JqZWN0IHVzZWQgdG8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgYWN0aW9uIChiZXN0IGVmZm9ydCkuXG4gICAgICovXG4gICAgc2NoZWR1bGVyUHJvdG8uc2NoZWR1bGVSZWN1cnNpdmVGdXR1cmUgPSBmdW5jdGlvbiAoc3RhdGUsIGR1ZVRpbWUsIGFjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVGdXR1cmUoW3N0YXRlLCBhY3Rpb25dLCBkdWVUaW1lLCBpbnZva2VSZWNEYXRlKTtcbiAgICB9O1xuXG4gIH0oU2NoZWR1bGVyLnByb3RvdHlwZSkpO1xuXG4gIChmdW5jdGlvbiAoc2NoZWR1bGVyUHJvdG8pIHtcblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlcyBhIHBlcmlvZGljIHBpZWNlIG9mIHdvcmsgYnkgZHluYW1pY2FsbHkgZGlzY292ZXJpbmcgdGhlIHNjaGVkdWxlcidzIGNhcGFiaWxpdGllcy4gVGhlIHBlcmlvZGljIHRhc2sgd2lsbCBiZSBzY2hlZHVsZWQgdXNpbmcgd2luZG93LnNldEludGVydmFsIGZvciB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBzdGF0ZSBJbml0aWFsIHN0YXRlIHBhc3NlZCB0byB0aGUgYWN0aW9uIHVwb24gdGhlIGZpcnN0IGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcGVyaW9kIFBlcmlvZCBmb3IgcnVubmluZyB0aGUgd29yayBwZXJpb2RpY2FsbHkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWN0aW9uIEFjdGlvbiB0byBiZSBleGVjdXRlZCwgcG90ZW50aWFsbHkgdXBkYXRpbmcgdGhlIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIHtEaXNwb3NhYmxlfSBUaGUgZGlzcG9zYWJsZSBvYmplY3QgdXNlZCB0byBjYW5jZWwgdGhlIHNjaGVkdWxlZCByZWN1cnJpbmcgYWN0aW9uIChiZXN0IGVmZm9ydCkuXG4gICAgICovXG4gICAgU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZVBlcmlvZGljID0gZnVuY3Rpb24oc3RhdGUsIHBlcmlvZCwgYWN0aW9uKSB7XG4gICAgICBpZiAodHlwZW9mIHJvb3Quc2V0SW50ZXJ2YWwgPT09ICd1bmRlZmluZWQnKSB7IHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcigpOyB9XG4gICAgICBwZXJpb2QgPSBub3JtYWxpemVUaW1lKHBlcmlvZCk7XG4gICAgICB2YXIgcyA9IHN0YXRlLCBpZCA9IHJvb3Quc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgeyBzID0gYWN0aW9uKHMpOyB9LCBwZXJpb2QpO1xuICAgICAgcmV0dXJuIGRpc3Bvc2FibGVDcmVhdGUoZnVuY3Rpb24gKCkgeyByb290LmNsZWFySW50ZXJ2YWwoaWQpOyB9KTtcbiAgICB9O1xuXG4gIH0oU2NoZWR1bGVyLnByb3RvdHlwZSkpO1xuXG4gIC8qKiBHZXRzIGEgc2NoZWR1bGVyIHRoYXQgc2NoZWR1bGVzIHdvcmsgaW1tZWRpYXRlbHkgb24gdGhlIGN1cnJlbnQgdGhyZWFkLiAqL1xuICAgdmFyIEltbWVkaWF0ZVNjaGVkdWxlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoSW1tZWRpYXRlU2NoZWR1bGVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEltbWVkaWF0ZVNjaGVkdWxlcigpIHtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEltbWVkaWF0ZVNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgcmV0dXJuIGRpc3Bvc2FibGVGaXh1cChhY3Rpb24odGhpcywgc3RhdGUpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEltbWVkaWF0ZVNjaGVkdWxlcjtcbiAgfShTY2hlZHVsZXIpKTtcblxuICB2YXIgaW1tZWRpYXRlU2NoZWR1bGVyID0gU2NoZWR1bGVyLmltbWVkaWF0ZSA9IG5ldyBJbW1lZGlhdGVTY2hlZHVsZXIoKTtcblxuICAvKipcbiAgICogR2V0cyBhIHNjaGVkdWxlciB0aGF0IHNjaGVkdWxlcyB3b3JrIGFzIHNvb24gYXMgcG9zc2libGUgb24gdGhlIGN1cnJlbnQgdGhyZWFkLlxuICAgKi9cbiAgdmFyIEN1cnJlbnRUaHJlYWRTY2hlZHVsZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIHZhciBxdWV1ZTtcblxuICAgIGZ1bmN0aW9uIHJ1blRyYW1wb2xpbmUgKCkge1xuICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5kZXF1ZXVlKCk7XG4gICAgICAgICFpdGVtLmlzQ2FuY2VsbGVkKCkgJiYgaXRlbS5pbnZva2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbmhlcml0cyhDdXJyZW50VGhyZWFkU2NoZWR1bGVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEN1cnJlbnRUaHJlYWRTY2hlZHVsZXIoKSB7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBDdXJyZW50VGhyZWFkU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICB2YXIgc2kgPSBuZXcgU2NoZWR1bGVkSXRlbSh0aGlzLCBzdGF0ZSwgYWN0aW9uLCB0aGlzLm5vdygpKTtcblxuICAgICAgaWYgKCFxdWV1ZSkge1xuICAgICAgICBxdWV1ZSA9IG5ldyBQcmlvcml0eVF1ZXVlKDQpO1xuICAgICAgICBxdWV1ZS5lbnF1ZXVlKHNpKTtcblxuICAgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2gocnVuVHJhbXBvbGluZSkoKTtcbiAgICAgICAgcXVldWUgPSBudWxsO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyB0aHJvd2VyKHJlc3VsdC5lKTsgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWUuZW5xdWV1ZShzaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2kuZGlzcG9zYWJsZTtcbiAgICB9O1xuXG4gICAgQ3VycmVudFRocmVhZFNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGVSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICFxdWV1ZTsgfTtcblxuICAgIHJldHVybiBDdXJyZW50VGhyZWFkU2NoZWR1bGVyO1xuICB9KFNjaGVkdWxlcikpO1xuXG4gIHZhciBjdXJyZW50VGhyZWFkU2NoZWR1bGVyID0gU2NoZWR1bGVyLmN1cnJlbnRUaHJlYWQgPSBuZXcgQ3VycmVudFRocmVhZFNjaGVkdWxlcigpO1xuXG4gIHZhciBTY2hlZHVsZVBlcmlvZGljUmVjdXJzaXZlID0gUnguaW50ZXJuYWxzLlNjaGVkdWxlUGVyaW9kaWNSZWN1cnNpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVRpY2soc2VsZikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRpY2soY29tbWFuZCwgcmVjdXJzZSkge1xuICAgICAgICByZWN1cnNlKDAsIHNlbGYuX3BlcmlvZCk7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRyeUNhdGNoKHNlbGYuX2FjdGlvbikoc2VsZi5fc3RhdGUpO1xuICAgICAgICBpZiAoc3RhdGUgPT09IGVycm9yT2JqKSB7XG4gICAgICAgICAgc2VsZi5fY2FuY2VsLmRpc3Bvc2UoKTtcbiAgICAgICAgICB0aHJvd2VyKHN0YXRlLmUpO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuX3N0YXRlID0gc3RhdGU7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFNjaGVkdWxlUGVyaW9kaWNSZWN1cnNpdmUoc2NoZWR1bGVyLCBzdGF0ZSwgcGVyaW9kLCBhY3Rpb24pIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl9wZXJpb2QgPSBwZXJpb2Q7XG4gICAgICB0aGlzLl9hY3Rpb24gPSBhY3Rpb247XG4gICAgfVxuXG4gICAgU2NoZWR1bGVQZXJpb2RpY1JlY3Vyc2l2ZS5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuICAgICAgdGhpcy5fY2FuY2VsID0gZDtcbiAgICAgIGQuc2V0RGlzcG9zYWJsZSh0aGlzLl9zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmVGdXR1cmUoMCwgdGhpcy5fcGVyaW9kLCBjcmVhdGVUaWNrKHRoaXMpKSk7XG5cbiAgICAgIHJldHVybiBkO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2NoZWR1bGVQZXJpb2RpY1JlY3Vyc2l2ZTtcbiAgfSgpKTtcblxuICB2YXIgc2NoZWR1bGVNZXRob2QsIGNsZWFyTWV0aG9kO1xuXG4gIHZhciBsb2NhbFRpbWVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbG9jYWxTZXRUaW1lb3V0LCBsb2NhbENsZWFyVGltZW91dCA9IG5vb3A7XG4gICAgaWYgKCEhcm9vdC5zZXRUaW1lb3V0KSB7XG4gICAgICBsb2NhbFNldFRpbWVvdXQgPSByb290LnNldFRpbWVvdXQ7XG4gICAgICBsb2NhbENsZWFyVGltZW91dCA9IHJvb3QuY2xlYXJUaW1lb3V0O1xuICAgIH0gZWxzZSBpZiAoISFyb290LldTY3JpcHQpIHtcbiAgICAgIGxvY2FsU2V0VGltZW91dCA9IGZ1bmN0aW9uIChmbiwgdGltZSkge1xuICAgICAgICByb290LldTY3JpcHQuU2xlZXAodGltZSk7XG4gICAgICAgIGZuKCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2V0VGltZW91dDogbG9jYWxTZXRUaW1lb3V0LFxuICAgICAgY2xlYXJUaW1lb3V0OiBsb2NhbENsZWFyVGltZW91dFxuICAgIH07XG4gIH0oKSk7XG4gIHZhciBsb2NhbFNldFRpbWVvdXQgPSBsb2NhbFRpbWVyLnNldFRpbWVvdXQsXG4gICAgbG9jYWxDbGVhclRpbWVvdXQgPSBsb2NhbFRpbWVyLmNsZWFyVGltZW91dDtcblxuICAoZnVuY3Rpb24gKCkge1xuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxLCB0YXNrc0J5SGFuZGxlID0ge30sIGN1cnJlbnRseVJ1bm5pbmcgPSBmYWxzZTtcblxuICAgIGNsZWFyTWV0aG9kID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcnVuVGFzayhoYW5kbGUpIHtcbiAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nKSB7XG4gICAgICAgIGxvY2FsU2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJ1blRhc2soaGFuZGxlKTsgfSwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godGFzaykoKTtcbiAgICAgICAgICBjbGVhck1ldGhvZChoYW5kbGUpO1xuICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyB0aHJvd2VyKHJlc3VsdC5lKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlTmF0aXZlID0gbmV3IFJlZ0V4cCgnXicgK1xuICAgICAgU3RyaW5nKHRvU3RyaW5nKVxuICAgICAgICAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKVxuICAgICAgICAucmVwbGFjZSgvdG9TdHJpbmd8IGZvciBbXlxcXV0rL2csICcuKj8nKSArICckJ1xuICAgICk7XG5cbiAgICB2YXIgc2V0SW1tZWRpYXRlID0gdHlwZW9mIChzZXRJbW1lZGlhdGUgPSBmcmVlR2xvYmFsICYmIG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5zZXRJbW1lZGlhdGUpID09ICdmdW5jdGlvbicgJiZcbiAgICAgICFyZU5hdGl2ZS50ZXN0KHNldEltbWVkaWF0ZSkgJiYgc2V0SW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gcG9zdE1lc3NhZ2VTdXBwb3J0ZWQgKCkge1xuICAgICAgLy8gRW5zdXJlIG5vdCBpbiBhIHdvcmtlclxuICAgICAgaWYgKCFyb290LnBvc3RNZXNzYWdlIHx8IHJvb3QuaW1wb3J0U2NyaXB0cykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIHZhciBpc0FzeW5jID0gZmFsc2UsIG9sZEhhbmRsZXIgPSByb290Lm9ubWVzc2FnZTtcbiAgICAgIC8vIFRlc3QgZm9yIGFzeW5jXG4gICAgICByb290Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgaXNBc3luYyA9IHRydWU7IH07XG4gICAgICByb290LnBvc3RNZXNzYWdlKCcnLCAnKicpO1xuICAgICAgcm9vdC5vbm1lc3NhZ2UgPSBvbGRIYW5kbGVyO1xuXG4gICAgICByZXR1cm4gaXNBc3luYztcbiAgICB9XG5cbiAgICAvLyBVc2UgaW4gb3JkZXIsIHNldEltbWVkaWF0ZSwgbmV4dFRpY2ssIHBvc3RNZXNzYWdlLCBNZXNzYWdlQ2hhbm5lbCwgc2NyaXB0IHJlYWR5c3RhdGVjaGFuZ2VkLCBzZXRUaW1lb3V0XG4gICAgaWYgKGlzRnVuY3Rpb24oc2V0SW1tZWRpYXRlKSkge1xuICAgICAgc2NoZWR1bGVNZXRob2QgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHZhciBpZCA9IG5leHRIYW5kbGUrKztcbiAgICAgICAgdGFza3NCeUhhbmRsZVtpZF0gPSBhY3Rpb247XG4gICAgICAgIHNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7IHJ1blRhc2soaWQpOyB9KTtcblxuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJykge1xuICAgICAgc2NoZWR1bGVNZXRob2QgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHZhciBpZCA9IG5leHRIYW5kbGUrKztcbiAgICAgICAgdGFza3NCeUhhbmRsZVtpZF0gPSBhY3Rpb247XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5UYXNrKGlkKTsgfSk7XG5cbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBvc3RNZXNzYWdlU3VwcG9ydGVkKCkpIHtcbiAgICAgIHZhciBNU0dfUFJFRklYID0gJ21zLnJ4LnNjaGVkdWxlJyArIE1hdGgucmFuZG9tKCk7XG5cbiAgICAgIHZhciBvbkdsb2JhbFBvc3RNZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIE9ubHkgaWYgd2UncmUgYSBtYXRjaCB0byBhdm9pZCBhbnkgb3RoZXIgZ2xvYmFsIGV2ZW50c1xuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgPT09ICdzdHJpbmcnICYmIGV2ZW50LmRhdGEuc3Vic3RyaW5nKDAsIE1TR19QUkVGSVgubGVuZ3RoKSA9PT0gTVNHX1BSRUZJWCkge1xuICAgICAgICAgIHJ1blRhc2soZXZlbnQuZGF0YS5zdWJzdHJpbmcoTVNHX1BSRUZJWC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgb25HbG9iYWxQb3N0TWVzc2FnZSwgZmFsc2UpO1xuXG4gICAgICBzY2hlZHVsZU1ldGhvZCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgdmFyIGlkID0gbmV4dEhhbmRsZSsrO1xuICAgICAgICB0YXNrc0J5SGFuZGxlW2lkXSA9IGFjdGlvbjtcbiAgICAgICAgcm9vdC5wb3N0TWVzc2FnZShNU0dfUFJFRklYICsgY3VycmVudElkLCAnKicpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoISFyb290Lk1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICB2YXIgY2hhbm5lbCA9IG5ldyByb290Lk1lc3NhZ2VDaGFubmVsKCk7XG5cbiAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsgcnVuVGFzayhlLmRhdGEpOyB9O1xuXG4gICAgICBzY2hlZHVsZU1ldGhvZCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgdmFyIGlkID0gbmV4dEhhbmRsZSsrO1xuICAgICAgICB0YXNrc0J5SGFuZGxlW2lkXSA9IGFjdGlvbjtcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShpZCk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICgnZG9jdW1lbnQnIGluIHJvb3QgJiYgJ29ucmVhZHlzdGF0ZWNoYW5nZScgaW4gcm9vdC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuXG4gICAgICBzY2hlZHVsZU1ldGhvZCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgdmFyIHNjcmlwdEVsZW1lbnQgPSByb290LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICB2YXIgaWQgPSBuZXh0SGFuZGxlKys7XG4gICAgICAgIHRhc2tzQnlIYW5kbGVbaWRdID0gYWN0aW9uO1xuXG4gICAgICAgIHNjcmlwdEVsZW1lbnQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJ1blRhc2soaWQpO1xuICAgICAgICAgIHNjcmlwdEVsZW1lbnQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICBzY3JpcHRFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0RWxlbWVudCk7XG4gICAgICAgICAgc2NyaXB0RWxlbWVudCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHJvb3QuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVkdWxlTWV0aG9kID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICB2YXIgaWQgPSBuZXh0SGFuZGxlKys7XG4gICAgICAgIHRhc2tzQnlIYW5kbGVbaWRdID0gYWN0aW9uO1xuICAgICAgICBsb2NhbFNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJ1blRhc2soaWQpO1xuICAgICAgICB9LCAwKTtcblxuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9O1xuICAgIH1cbiAgfSgpKTtcblxuICAvKipcbiAgICogR2V0cyBhIHNjaGVkdWxlciB0aGF0IHNjaGVkdWxlcyB3b3JrIHZpYSBhIHRpbWVkIGNhbGxiYWNrIGJhc2VkIHVwb24gcGxhdGZvcm0uXG4gICAqL1xuICAgdmFyIERlZmF1bHRTY2hlZHVsZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgICBpbmhlcml0cyhEZWZhdWx0U2NoZWR1bGVyLCBfX3N1cGVyX18pO1xuICAgICBmdW5jdGlvbiBEZWZhdWx0U2NoZWR1bGVyKCkge1xuICAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgICB9XG5cbiAgICAgZnVuY3Rpb24gc2NoZWR1bGVBY3Rpb24oZGlzcG9zYWJsZSwgYWN0aW9uLCBzY2hlZHVsZXIsIHN0YXRlKSB7XG4gICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNjaGVkdWxlKCkge1xuICAgICAgICAgIWRpc3Bvc2FibGUuaXNEaXNwb3NlZCAmJiBkaXNwb3NhYmxlLnNldERpc3Bvc2FibGUoRGlzcG9zYWJsZS5fZml4dXAoYWN0aW9uKHNjaGVkdWxlciwgc3RhdGUpKSk7XG4gICAgICAgfTtcbiAgICAgfVxuXG4gICAgIGZ1bmN0aW9uIENsZWFyRGlzcG9zYWJsZShtZXRob2QsIGlkKSB7XG4gICAgICAgdGhpcy5faWQgPSBpZDtcbiAgICAgICB0aGlzLl9tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgIH1cblxuICAgICBDbGVhckRpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgICB0aGlzLl9tZXRob2QuY2FsbChudWxsLCB0aGlzLl9pZCk7XG4gICAgICAgfVxuICAgICB9O1xuXG4gICAgRGVmYXVsdFNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgdmFyIGRpc3Bvc2FibGUgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKSxcbiAgICAgICAgICBpZCA9IHNjaGVkdWxlTWV0aG9kKHNjaGVkdWxlQWN0aW9uKGRpc3Bvc2FibGUsIGFjdGlvbiwgdGhpcywgc3RhdGUpKTtcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShkaXNwb3NhYmxlLCBuZXcgQ2xlYXJEaXNwb3NhYmxlKGNsZWFyTWV0aG9kLCBpZCkpO1xuICAgIH07XG5cbiAgICBEZWZhdWx0U2NoZWR1bGVyLnByb3RvdHlwZS5fc2NoZWR1bGVGdXR1cmUgPSBmdW5jdGlvbiAoc3RhdGUsIGR1ZVRpbWUsIGFjdGlvbikge1xuICAgICAgaWYgKGR1ZVRpbWUgPT09IDApIHsgcmV0dXJuIHRoaXMuc2NoZWR1bGUoc3RhdGUsIGFjdGlvbik7IH1cbiAgICAgIHZhciBkaXNwb3NhYmxlID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksXG4gICAgICAgICAgaWQgPSBsb2NhbFNldFRpbWVvdXQoc2NoZWR1bGVBY3Rpb24oZGlzcG9zYWJsZSwgYWN0aW9uLCB0aGlzLCBzdGF0ZSksIGR1ZVRpbWUpO1xuICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKGRpc3Bvc2FibGUsIG5ldyBDbGVhckRpc3Bvc2FibGUobG9jYWxDbGVhclRpbWVvdXQsIGlkKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBEZWZhdWx0U2NoZWR1bGVyO1xuICB9KFNjaGVkdWxlcikpO1xuXG4gIHZhciBkZWZhdWx0U2NoZWR1bGVyID0gU2NoZWR1bGVyWydkZWZhdWx0J10gPSBTY2hlZHVsZXIuYXN5bmMgPSBuZXcgRGVmYXVsdFNjaGVkdWxlcigpO1xuXG4gIGZ1bmN0aW9uIEluZGV4ZWRJdGVtKGlkLCB2YWx1ZSkge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBJbmRleGVkSXRlbS5wcm90b3R5cGUuY29tcGFyZVRvID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgdmFyIGMgPSB0aGlzLnZhbHVlLmNvbXBhcmVUbyhvdGhlci52YWx1ZSk7XG4gICAgYyA9PT0gMCAmJiAoYyA9IHRoaXMuaWQgLSBvdGhlci5pZCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG5cbiAgdmFyIFByaW9yaXR5UXVldWUgPSBSeC5pbnRlcm5hbHMuUHJpb3JpdHlRdWV1ZSA9IGZ1bmN0aW9uIChjYXBhY2l0eSkge1xuICAgIHRoaXMuaXRlbXMgPSBuZXcgQXJyYXkoY2FwYWNpdHkpO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICB2YXIgcHJpb3JpdHlQcm90byA9IFByaW9yaXR5UXVldWUucHJvdG90eXBlO1xuICBwcmlvcml0eVByb3RvLmlzSGlnaGVyUHJpb3JpdHkgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1tsZWZ0XS5jb21wYXJlVG8odGhpcy5pdGVtc1tyaWdodF0pIDwgMDtcbiAgfTtcblxuICBwcmlvcml0eVByb3RvLnBlcmNvbGF0ZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgIGlmIChpbmRleCA+PSB0aGlzLmxlbmd0aCB8fCBpbmRleCA8IDApIHsgcmV0dXJuOyB9XG4gICAgdmFyIHBhcmVudCA9IGluZGV4IC0gMSA+PiAxO1xuICAgIGlmIChwYXJlbnQgPCAwIHx8IHBhcmVudCA9PT0gaW5kZXgpIHsgcmV0dXJuOyB9XG4gICAgaWYgKHRoaXMuaXNIaWdoZXJQcmlvcml0eShpbmRleCwgcGFyZW50KSkge1xuICAgICAgdmFyIHRlbXAgPSB0aGlzLml0ZW1zW2luZGV4XTtcbiAgICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gdGhpcy5pdGVtc1twYXJlbnRdO1xuICAgICAgdGhpcy5pdGVtc1twYXJlbnRdID0gdGVtcDtcbiAgICAgIHRoaXMucGVyY29sYXRlKHBhcmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHByaW9yaXR5UHJvdG8uaGVhcGlmeSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICtpbmRleCB8fCAoaW5kZXggPSAwKTtcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGggfHwgaW5kZXggPCAwKSB7IHJldHVybjsgfVxuICAgIHZhciBsZWZ0ID0gMiAqIGluZGV4ICsgMSxcbiAgICAgICAgcmlnaHQgPSAyICogaW5kZXggKyAyLFxuICAgICAgICBmaXJzdCA9IGluZGV4O1xuICAgIGlmIChsZWZ0IDwgdGhpcy5sZW5ndGggJiYgdGhpcy5pc0hpZ2hlclByaW9yaXR5KGxlZnQsIGZpcnN0KSkge1xuICAgICAgZmlyc3QgPSBsZWZ0O1xuICAgIH1cbiAgICBpZiAocmlnaHQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmlzSGlnaGVyUHJpb3JpdHkocmlnaHQsIGZpcnN0KSkge1xuICAgICAgZmlyc3QgPSByaWdodDtcbiAgICB9XG4gICAgaWYgKGZpcnN0ICE9PSBpbmRleCkge1xuICAgICAgdmFyIHRlbXAgPSB0aGlzLml0ZW1zW2luZGV4XTtcbiAgICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gdGhpcy5pdGVtc1tmaXJzdF07XG4gICAgICB0aGlzLml0ZW1zW2ZpcnN0XSA9IHRlbXA7XG4gICAgICB0aGlzLmhlYXBpZnkoZmlyc3QpO1xuICAgIH1cbiAgfTtcblxuICBwcmlvcml0eVByb3RvLnBlZWsgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLml0ZW1zWzBdLnZhbHVlOyB9O1xuXG4gIHByaW9yaXR5UHJvdG8ucmVtb3ZlQXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICB0aGlzLml0ZW1zW2luZGV4XSA9IHRoaXMuaXRlbXNbLS10aGlzLmxlbmd0aF07XG4gICAgdGhpcy5pdGVtc1t0aGlzLmxlbmd0aF0gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5oZWFwaWZ5KCk7XG4gIH07XG5cbiAgcHJpb3JpdHlQcm90by5kZXF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBlZWsoKTtcbiAgICB0aGlzLnJlbW92ZUF0KDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcHJpb3JpdHlQcm90by5lbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmxlbmd0aCsrO1xuICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gbmV3IEluZGV4ZWRJdGVtKFByaW9yaXR5UXVldWUuY291bnQrKywgaXRlbSk7XG4gICAgdGhpcy5wZXJjb2xhdGUoaW5kZXgpO1xuICB9O1xuXG4gIHByaW9yaXR5UHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zW2ldLnZhbHVlID09PSBpdGVtKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXQoaSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIFByaW9yaXR5UXVldWUuY291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiAgUmVwcmVzZW50cyBhIG5vdGlmaWNhdGlvbiB0byBhbiBvYnNlcnZlci5cbiAgICovXG4gIHZhciBOb3RpZmljYXRpb24gPSBSeC5Ob3RpZmljYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vdGlmaWNhdGlvbigpIHtcblxuICAgIH1cblxuICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdCA9IGZ1bmN0aW9uIChvbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgIH07XG5cbiAgICBOb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHRPYnNlcnZhYmxlID0gZnVuY3Rpb24gKG9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIGRlbGVnYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vdGlmaWNhdGlvbiBvciB0aGUgb2JzZXJ2ZXIncyBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGUgbm90aWZpY2F0aW9uIGFuZCByZXR1cm5zIHRoZSBwcm9kdWNlZCByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgTm90aWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtBbnl9IG9ic2VydmVyT3JPbk5leHQgRGVsZWdhdGUgdG8gaW52b2tlIGZvciBhbiBPbk5leHQgbm90aWZpY2F0aW9uIG9yIE9ic2VydmVyIHRvIGludm9rZSB0aGUgbm90aWZpY2F0aW9uIG9uLi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIERlbGVnYXRlIHRvIGludm9rZSBmb3IgYW4gT25FcnJvciBub3RpZmljYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25Db21wbGV0ZWQgRGVsZWdhdGUgdG8gaW52b2tlIGZvciBhbiBPbkNvbXBsZXRlZCBub3RpZmljYXRpb24uXG4gICAgICogQHJldHVybnMge0FueX0gUmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBvYnNlcnZhdGlvbi5cbiAgICAgKi9cbiAgICBOb3RpZmljYXRpb24ucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uIChvYnNlcnZlck9yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuIG9ic2VydmVyT3JPbk5leHQgJiYgdHlwZW9mIG9ic2VydmVyT3JPbk5leHQgPT09ICdvYmplY3QnID9cbiAgICAgICAgdGhpcy5fYWNjZXB0T2JzZXJ2YWJsZShvYnNlcnZlck9yT25OZXh0KSA6XG4gICAgICAgIHRoaXMuX2FjY2VwdChvYnNlcnZlck9yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIGEgc2luZ2xlIG5vdGlmaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBOb3RpZmljYXRpb25zXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBzZW5kIG91dCB0aGUgbm90aWZpY2F0aW9uIGNhbGxzIG9uLlxuICAgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHN1cmZhY2VzIHRoZSBiZWhhdmlvciBvZiB0aGUgbm90aWZpY2F0aW9uIHVwb24gc3Vic2NyaXB0aW9uLlxuICAgICAqL1xuICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9PYnNlcnZhYmxlID0gZnVuY3Rpb24gKHNjaGVkdWxlcikge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyKTtcbiAgICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKHNlbGYsIGZ1bmN0aW9uIChfLCBub3RpZmljYXRpb24pIHtcbiAgICAgICAgICBub3RpZmljYXRpb24uX2FjY2VwdE9ic2VydmFibGUobyk7XG4gICAgICAgICAgbm90aWZpY2F0aW9uLmtpbmQgPT09ICdOJyAmJiBvLm9uQ29tcGxldGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBOb3RpZmljYXRpb247XG4gIH0pKCk7XG5cbiAgdmFyIE9uTmV4dE5vdGlmaWNhdGlvbiA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoT25OZXh0Tm90aWZpY2F0aW9uLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIE9uTmV4dE5vdGlmaWNhdGlvbih2YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5raW5kID0gJ04nO1xuICAgIH1cblxuICAgIE9uTmV4dE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdCA9IGZ1bmN0aW9uIChvbk5leHQpIHtcbiAgICAgIHJldHVybiBvbk5leHQodGhpcy52YWx1ZSk7XG4gICAgfTtcblxuICAgIE9uTmV4dE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdE9ic2VydmFibGUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIG8ub25OZXh0KHRoaXMudmFsdWUpO1xuICAgIH07XG5cbiAgICBPbk5leHROb3RpZmljYXRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICdPbk5leHQoJyArIHRoaXMudmFsdWUgKyAnKSc7XG4gICAgfTtcblxuICAgIHJldHVybiBPbk5leHROb3RpZmljYXRpb247XG4gIH0oTm90aWZpY2F0aW9uKSk7XG5cbiAgdmFyIE9uRXJyb3JOb3RpZmljYXRpb24gPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKE9uRXJyb3JOb3RpZmljYXRpb24sIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gT25FcnJvck5vdGlmaWNhdGlvbihlcnJvcikge1xuICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgdGhpcy5raW5kID0gJ0UnO1xuICAgIH1cblxuICAgIE9uRXJyb3JOb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHQgPSBmdW5jdGlvbiAob25OZXh0LCBvbkVycm9yKSB7XG4gICAgICByZXR1cm4gb25FcnJvcih0aGlzLmVycm9yKTtcbiAgICB9O1xuXG4gICAgT25FcnJvck5vdGlmaWNhdGlvbi5wcm90b3R5cGUuX2FjY2VwdE9ic2VydmFibGUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIG8ub25FcnJvcih0aGlzLmVycm9yKTtcbiAgICB9O1xuXG4gICAgT25FcnJvck5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJ09uRXJyb3IoJyArIHRoaXMuZXJyb3IgKyAnKSc7XG4gICAgfTtcblxuICAgIHJldHVybiBPbkVycm9yTm90aWZpY2F0aW9uO1xuICB9KE5vdGlmaWNhdGlvbikpO1xuXG4gIHZhciBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbiA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoT25Db21wbGV0ZWROb3RpZmljYXRpb24sIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gT25Db21wbGV0ZWROb3RpZmljYXRpb24oKSB7XG4gICAgICB0aGlzLmtpbmQgPSAnQyc7XG4gICAgfVxuXG4gICAgT25Db21wbGV0ZWROb3RpZmljYXRpb24ucHJvdG90eXBlLl9hY2NlcHQgPSBmdW5jdGlvbiAob25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuIG9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIE9uQ29tcGxldGVkTm90aWZpY2F0aW9uLnByb3RvdHlwZS5fYWNjZXB0T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gby5vbkNvbXBsZXRlZCgpO1xuICAgIH07XG5cbiAgICBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJ09uQ29tcGxldGVkKCknO1xuICAgIH07XG5cbiAgICByZXR1cm4gT25Db21wbGV0ZWROb3RpZmljYXRpb247XG4gIH0oTm90aWZpY2F0aW9uKSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhbiBPbk5leHQgbm90aWZpY2F0aW9uIHRvIGFuIG9ic2VydmVyLlxuICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgVGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgbm90aWZpY2F0aW9uLlxuICAgKiBAcmV0dXJucyB7Tm90aWZpY2F0aW9ufSBUaGUgT25OZXh0IG5vdGlmaWNhdGlvbiBjb250YWluaW5nIHRoZSB2YWx1ZS5cbiAgICovXG4gIHZhciBub3RpZmljYXRpb25DcmVhdGVPbk5leHQgPSBOb3RpZmljYXRpb24uY3JlYXRlT25OZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBPbk5leHROb3RpZmljYXRpb24odmFsdWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYW4gT25FcnJvciBub3RpZmljYXRpb24gdG8gYW4gb2JzZXJ2ZXIuXG4gICAqIEBwYXJhbSB7QW55fSBlcnJvciBUaGUgZXhjZXB0aW9uIGNvbnRhaW5lZCBpbiB0aGUgbm90aWZpY2F0aW9uLlxuICAgKiBAcmV0dXJucyB7Tm90aWZpY2F0aW9ufSBUaGUgT25FcnJvciBub3RpZmljYXRpb24gY29udGFpbmluZyB0aGUgZXhjZXB0aW9uLlxuICAgKi9cbiAgdmFyIG5vdGlmaWNhdGlvbkNyZWF0ZU9uRXJyb3IgPSBOb3RpZmljYXRpb24uY3JlYXRlT25FcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIHJldHVybiBuZXcgT25FcnJvck5vdGlmaWNhdGlvbihlcnJvcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhbiBPbkNvbXBsZXRlZCBub3RpZmljYXRpb24gdG8gYW4gb2JzZXJ2ZXIuXG4gICAqIEByZXR1cm5zIHtOb3RpZmljYXRpb259IFRoZSBPbkNvbXBsZXRlZCBub3RpZmljYXRpb24uXG4gICAqL1xuICB2YXIgbm90aWZpY2F0aW9uQ3JlYXRlT25Db21wbGV0ZWQgPSBOb3RpZmljYXRpb24uY3JlYXRlT25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBPbkNvbXBsZXRlZE5vdGlmaWNhdGlvbigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdXBwb3J0cyBwdXNoLXN0eWxlIGl0ZXJhdGlvbiBvdmVyIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqL1xuICB2YXIgT2JzZXJ2ZXIgPSBSeC5PYnNlcnZlciA9IGZ1bmN0aW9uICgpIHsgfTtcblxuICAvKipcbiAgICogIENyZWF0ZXMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIE9uTmV4dCwgYWxvbmcgd2l0aCBvcHRpb25hbCBPbkVycm9yLCBhbmQgT25Db21wbGV0ZWQgYWN0aW9ucy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uTmV4dF0gT2JzZXJ2ZXIncyBPbk5leHQgYWN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gT2JzZXJ2ZXIncyBPbkVycm9yIGFjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uQ29tcGxldGVkXSBPYnNlcnZlcidzIE9uQ29tcGxldGVkIGFjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMge09ic2VydmVyfSBUaGUgb2JzZXJ2ZXIgb2JqZWN0IGltcGxlbWVudGVkIHVzaW5nIHRoZSBnaXZlbiBhY3Rpb25zLlxuICAgKi9cbiAgdmFyIG9ic2VydmVyQ3JlYXRlID0gT2JzZXJ2ZXIuY3JlYXRlID0gZnVuY3Rpb24gKG9uTmV4dCwgb25FcnJvciwgb25Db21wbGV0ZWQpIHtcbiAgICBvbk5leHQgfHwgKG9uTmV4dCA9IG5vb3ApO1xuICAgIG9uRXJyb3IgfHwgKG9uRXJyb3IgPSBkZWZhdWx0RXJyb3IpO1xuICAgIG9uQ29tcGxldGVkIHx8IChvbkNvbXBsZXRlZCA9IG5vb3ApO1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2ZXIob25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgT2JzZXJ2ZXIgY2xhc3MuXG4gICAqIFRoaXMgYmFzZSBjbGFzcyBlbmZvcmNlcyB0aGUgZ3JhbW1hciBvZiBvYnNlcnZlcnMgd2hlcmUgT25FcnJvciBhbmQgT25Db21wbGV0ZWQgYXJlIHRlcm1pbmFsIG1lc3NhZ2VzLlxuICAgKi9cbiAgdmFyIEFic3RyYWN0T2JzZXJ2ZXIgPSBSeC5pbnRlcm5hbHMuQWJzdHJhY3RPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQWJzdHJhY3RPYnNlcnZlciwgX19zdXBlcl9fKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaW4gYSBub24tc3RvcHBlZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBBYnN0cmFjdE9ic2VydmVyKCkge1xuICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBNdXN0IGJlIGltcGxlbWVudGVkIGJ5IG90aGVyIG9ic2VydmVyc1xuICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBub3RJbXBsZW1lbnRlZDtcbiAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IG5vdEltcGxlbWVudGVkO1xuICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IG5vdEltcGxlbWVudGVkO1xuXG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgdGhlIG9ic2VydmVyIG9mIGEgbmV3IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLlxuICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBOZXh0IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLlxuICAgICAqL1xuICAgIEFic3RyYWN0T2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgIXRoaXMuaXNTdG9wcGVkICYmIHRoaXMubmV4dCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIHRoZSBvYnNlcnZlciB0aGF0IGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuXG4gICAgICogQHBhcmFtIHtBbnl9IGVycm9yIFRoZSBlcnJvciB0aGF0IGhhcyBvY2N1cnJlZC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIHRoZSBvYnNlcnZlciBvZiB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXBsZXRlZCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlcyB0aGUgb2JzZXJ2ZXIsIGNhdXNpbmcgaXQgdG8gdHJhbnNpdGlvbiB0byB0aGUgc3RvcHBlZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH07XG5cbiAgICBBYnN0cmFjdE9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmVycm9yKGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gQWJzdHJhY3RPYnNlcnZlcjtcbiAgfShPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiBDbGFzcyB0byBjcmVhdGUgYW4gT2JzZXJ2ZXIgaW5zdGFuY2UgZnJvbSBkZWxlZ2F0ZS1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG9uKiBtZXRob2RzLlxuICAgKi9cbiAgdmFyIEFub255bW91c09ic2VydmVyID0gUnguQW5vbnltb3VzT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKEFub255bW91c09ic2VydmVyLCBfX3N1cGVyX18pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYnNlcnZlciBmcm9tIHRoZSBzcGVjaWZpZWQgT25OZXh0LCBPbkVycm9yLCBhbmQgT25Db21wbGV0ZWQgYWN0aW9ucy5cbiAgICAgKiBAcGFyYW0ge0FueX0gb25OZXh0IE9ic2VydmVyJ3MgT25OZXh0IGFjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FueX0gb25FcnJvciBPYnNlcnZlcidzIE9uRXJyb3IgYWN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgICAqIEBwYXJhbSB7QW55fSBvbkNvbXBsZXRlZCBPYnNlcnZlcidzIE9uQ29tcGxldGVkIGFjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBBbm9ueW1vdXNPYnNlcnZlcihvbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICAgIHRoaXMuX29uTmV4dCA9IG9uTmV4dDtcbiAgICAgIHRoaXMuX29uRXJyb3IgPSBvbkVycm9yO1xuICAgICAgdGhpcy5fb25Db21wbGV0ZWQgPSBvbkNvbXBsZXRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgb25OZXh0IGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgTmV4dCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cbiAgICAgKi9cbiAgICBBbm9ueW1vdXNPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdGhpcy5fb25OZXh0KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIG9uRXJyb3IgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7QW55fSBlcnJvciBUaGUgZXJyb3IgdGhhdCBoYXMgb2NjdXJyZWQuXG4gICAgICovXG4gICAgQW5vbnltb3VzT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICB0aGlzLl9vbkVycm9yKGVycm9yKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIENhbGxzIHRoZSBvbkNvbXBsZXRlZCBhY3Rpb24uXG4gICAgICovXG4gICAgQW5vbnltb3VzT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX29uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBBbm9ueW1vdXNPYnNlcnZlcjtcbiAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cbiAgdmFyIG9ic2VydmFibGVQcm90bztcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIHB1c2gtc3R5bGUgY29sbGVjdGlvbi5cbiAgICovXG4gIHZhciBPYnNlcnZhYmxlID0gUnguT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoKSB7XG5cbiAgICBmdW5jdGlvbiBtYWtlU3Vic2NyaWJlKHNlbGYsIHN1YnNjcmliZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHZhciBvbGRPbkVycm9yID0gby5vbkVycm9yO1xuICAgICAgICBvLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIG1ha2VTdGFja1RyYWNlTG9uZyhlLCBzZWxmKTtcbiAgICAgICAgICBvbGRPbkVycm9yLmNhbGwobywgZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZS5jYWxsKHNlbGYsIG8pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBPYnNlcnZhYmxlKCkge1xuICAgICAgaWYgKFJ4LmNvbmZpZy5sb25nU3RhY2tTdXBwb3J0ICYmIGhhc1N0YWNrcykge1xuICAgICAgICB2YXIgb2xkU3Vic2NyaWJlID0gdGhpcy5fc3Vic2NyaWJlO1xuICAgICAgICB2YXIgZSA9IHRyeUNhdGNoKHRocm93ZXIpKG5ldyBFcnJvcigpKS5lO1xuICAgICAgICB0aGlzLnN0YWNrID0gZS5zdGFjay5zdWJzdHJpbmcoZS5zdGFjay5pbmRleE9mKCdcXG4nKSArIDEpO1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmUgPSBtYWtlU3Vic2NyaWJlKHRoaXMsIG9sZFN1YnNjcmliZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb2JzZXJ2YWJsZVByb3RvID0gT2JzZXJ2YWJsZS5wcm90b3R5cGU7XG5cbiAgICAvKipcbiAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFuIE9ic2VydmFibGVcbiAgICAqIEBwYXJhbSB7QW55fSBBbiBvYmplY3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgYW4gT2JzZXJ2YWJsZVxuICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgYW4gT2JzZXJ2YWJsZSwgZWxzZSBmYWxzZS5cbiAgICAqL1xuICAgIE9ic2VydmFibGUuaXNPYnNlcnZhYmxlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiBvICYmIGlzRnVuY3Rpb24oby5zdWJzY3JpYmUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAgU3Vic2NyaWJlcyBhbiBvIHRvIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAgICAqICBAcGFyYW0ge01peGVkfSBbb09yT25OZXh0XSBUaGUgb2JqZWN0IHRoYXQgaXMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIG9yIGFuIGFjdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICAgKiAgQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIEFjdGlvbiB0byBpbnZva2UgdXBvbiBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICAgKiAgQHBhcmFtIHtGdW5jdGlvbn0gW29uQ29tcGxldGVkXSBBY3Rpb24gdG8gaW52b2tlIHVwb24gZ3JhY2VmdWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAgICogIEByZXR1cm5zIHtEaXBvc2FibGV9IEEgZGlzcG9zYWJsZSBoYW5kbGluZyB0aGUgc3Vic2NyaXB0aW9ucyBhbmQgdW5zdWJzY3JpcHRpb25zLlxuICAgICAqL1xuICAgIG9ic2VydmFibGVQcm90by5zdWJzY3JpYmUgPSBvYnNlcnZhYmxlUHJvdG8uZm9yRWFjaCA9IGZ1bmN0aW9uIChvT3JPbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKHR5cGVvZiBvT3JPbk5leHQgPT09ICdvYmplY3QnID9cbiAgICAgICAgb09yT25OZXh0IDpcbiAgICAgICAgb2JzZXJ2ZXJDcmVhdGUob09yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZSB3aXRoIGFuIG9wdGlvbmFsIFwidGhpc1wiIGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uTmV4dCBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gQSBkaXNwb3NhYmxlIGhhbmRsaW5nIHRoZSBzdWJzY3JpcHRpb25zIGFuZCB1bnN1YnNjcmlwdGlvbnMuXG4gICAgICovXG4gICAgb2JzZXJ2YWJsZVByb3RvLnN1YnNjcmliZU9uTmV4dCA9IGZ1bmN0aW9uIChvbk5leHQsIHRoaXNBcmcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmUob2JzZXJ2ZXJDcmVhdGUodHlwZW9mIHRoaXNBcmcgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24oeCkgeyBvbk5leHQuY2FsbCh0aGlzQXJnLCB4KTsgfSA6IG9uTmV4dCkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmVzIHRvIGFuIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbiBpbiB0aGUgc2VxdWVuY2Ugd2l0aCBhbiBvcHRpb25hbCBcInRoaXNcIiBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UgdXBvbiBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7RGlzcG9zYWJsZX0gQSBkaXNwb3NhYmxlIGhhbmRsaW5nIHRoZSBzdWJzY3JpcHRpb25zIGFuZCB1bnN1YnNjcmlwdGlvbnMuXG4gICAgICovXG4gICAgb2JzZXJ2YWJsZVByb3RvLnN1YnNjcmliZU9uRXJyb3IgPSBmdW5jdGlvbiAob25FcnJvciwgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZShvYnNlcnZlckNyZWF0ZShudWxsLCB0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbihlKSB7IG9uRXJyb3IuY2FsbCh0aGlzQXJnLCBlKTsgfSA6IG9uRXJyb3IpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlcyB0byB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2Ugd2l0aCBhbiBvcHRpb25hbCBcInRoaXNcIiBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNvbXBsZXRlZCBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIHVwb24gZ3JhY2VmdWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAgICogQHBhcmFtIHtBbnl9IFt0aGlzQXJnXSBPYmplY3QgdG8gdXNlIGFzIHRoaXMgd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMge0Rpc3Bvc2FibGV9IEEgZGlzcG9zYWJsZSBoYW5kbGluZyB0aGUgc3Vic2NyaXB0aW9ucyBhbmQgdW5zdWJzY3JpcHRpb25zLlxuICAgICAqL1xuICAgIG9ic2VydmFibGVQcm90by5zdWJzY3JpYmVPbkNvbXBsZXRlZCA9IGZ1bmN0aW9uIChvbkNvbXBsZXRlZCwgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZShvYnNlcnZlckNyZWF0ZShudWxsLCBudWxsLCB0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbigpIHsgb25Db21wbGV0ZWQuY2FsbCh0aGlzQXJnKTsgfSA6IG9uQ29tcGxldGVkKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlO1xuICB9KSgpO1xuXG4gIHZhciBTY2hlZHVsZWRPYnNlcnZlciA9IFJ4LmludGVybmFscy5TY2hlZHVsZWRPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoU2NoZWR1bGVkT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cbiAgICBmdW5jdGlvbiBTY2hlZHVsZWRPYnNlcnZlcihzY2hlZHVsZXIsIG9ic2VydmVyKSB7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgdGhpcy5pc0FjcXVpcmVkID0gZmFsc2U7XG4gICAgICB0aGlzLmhhc0ZhdWx0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgIHRoaXMuZGlzcG9zYWJsZSA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG4gICAgfVxuXG4gICAgU2NoZWR1bGVkT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHRoaXMucXVldWUucHVzaChmdW5jdGlvbiAoKSB7IHNlbGYub2JzZXJ2ZXIub25OZXh0KHZhbHVlKTsgfSk7XG4gICAgfTtcblxuICAgIFNjaGVkdWxlZE9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goZnVuY3Rpb24gKCkgeyBzZWxmLm9ic2VydmVyLm9uRXJyb3IoZSk7IH0pO1xuICAgIH07XG5cbiAgICBTY2hlZHVsZWRPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGZ1bmN0aW9uICgpIHsgc2VsZi5vYnNlcnZlci5vbkNvbXBsZXRlZCgpOyB9KTtcbiAgICB9O1xuXG4gICAgU2NoZWR1bGVkT2JzZXJ2ZXIucHJvdG90eXBlLmVuc3VyZUFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpc093bmVyID0gZmFsc2U7XG4gICAgICBpZiAoIXRoaXMuaGFzRmF1bHRlZCAmJiB0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNPd25lciA9ICF0aGlzLmlzQWNxdWlyZWQ7XG4gICAgICAgIHRoaXMuaXNBY3F1aXJlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNPd25lcikge1xuICAgICAgICB0aGlzLmRpc3Bvc2FibGUuc2V0RGlzcG9zYWJsZSh0aGlzLnNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSh0aGlzLCBmdW5jdGlvbiAocGFyZW50LCBzZWxmKSB7XG4gICAgICAgICAgdmFyIHdvcms7XG4gICAgICAgICAgaWYgKHBhcmVudC5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB3b3JrID0gcGFyZW50LnF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5pc0FjcXVpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh3b3JrKSgpO1xuICAgICAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7XG4gICAgICAgICAgICBwYXJlbnQucXVldWUgPSBbXTtcbiAgICAgICAgICAgIHBhcmVudC5oYXNGYXVsdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd2VyKHJlcy5lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZihwYXJlbnQpO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFNjaGVkdWxlZE9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgX19zdXBlcl9fLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmRpc3Bvc2FibGUuZGlzcG9zZSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2NoZWR1bGVkT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIHZhciBPYnNlcnZhYmxlQmFzZSA9IFJ4Lk9ic2VydmFibGVCYXNlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhPYnNlcnZhYmxlQmFzZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIGZpeFN1YnNjcmliZXIoc3Vic2NyaWJlcikge1xuICAgICAgcmV0dXJuIHN1YnNjcmliZXIgJiYgaXNGdW5jdGlvbihzdWJzY3JpYmVyLmRpc3Bvc2UpID8gc3Vic2NyaWJlciA6XG4gICAgICAgIGlzRnVuY3Rpb24oc3Vic2NyaWJlcikgPyBkaXNwb3NhYmxlQ3JlYXRlKHN1YnNjcmliZXIpIDogZGlzcG9zYWJsZUVtcHR5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldERpc3Bvc2FibGUocywgc3RhdGUpIHtcbiAgICAgIHZhciBhZG8gPSBzdGF0ZVswXSwgc2VsZiA9IHN0YXRlWzFdO1xuICAgICAgdmFyIHN1YiA9IHRyeUNhdGNoKHNlbGYuc3Vic2NyaWJlQ29yZSkuY2FsbChzZWxmLCBhZG8pO1xuICAgICAgaWYgKHN1YiA9PT0gZXJyb3JPYmogJiYgIWFkby5mYWlsKGVycm9yT2JqLmUpKSB7IHRocm93ZXIoZXJyb3JPYmouZSk7IH1cbiAgICAgIGFkby5zZXREaXNwb3NhYmxlKGZpeFN1YnNjcmliZXIoc3ViKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZUJhc2UoKSB7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBPYnNlcnZhYmxlQmFzZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgYWRvID0gbmV3IEF1dG9EZXRhY2hPYnNlcnZlcihvKSwgc3RhdGUgPSBbYWRvLCB0aGlzXTtcblxuICAgICAgaWYgKGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGVSZXF1aXJlZCgpKSB7XG4gICAgICAgIGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGUoc3RhdGUsIHNldERpc3Bvc2FibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0RGlzcG9zYWJsZShudWxsLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWRvO1xuICAgIH07XG5cbiAgICBPYnNlcnZhYmxlQmFzZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IG5vdEltcGxlbWVudGVkO1xuXG4gICAgcmV0dXJuIE9ic2VydmFibGVCYXNlO1xuICB9KE9ic2VydmFibGUpKTtcblxudmFyIEZsYXRNYXBPYnNlcnZhYmxlID0gUnguRmxhdE1hcE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG5cbiAgICBpbmhlcml0cyhGbGF0TWFwT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIEZsYXRNYXBPYnNlcnZhYmxlKHNvdXJjZSwgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKSB7XG4gICAgICB0aGlzLnJlc3VsdFNlbGVjdG9yID0gaXNGdW5jdGlvbihyZXN1bHRTZWxlY3RvcikgPyByZXN1bHRTZWxlY3RvciA6IG51bGw7XG4gICAgICB0aGlzLnNlbGVjdG9yID0gYmluZENhbGxiYWNrKGlzRnVuY3Rpb24oc2VsZWN0b3IpID8gc2VsZWN0b3IgOiBmdW5jdGlvbigpIHsgcmV0dXJuIHNlbGVjdG9yOyB9LCB0aGlzQXJnLCAzKTtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRmxhdE1hcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHRoaXMuc2VsZWN0b3IsIHRoaXMucmVzdWx0U2VsZWN0b3IsIHRoaXMpKTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG4gICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvYnNlcnZlciwgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCBzb3VyY2UpIHtcbiAgICAgIHRoaXMuaSA9IDA7XG4gICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICB0aGlzLnJlc3VsdFNlbGVjdG9yID0gcmVzdWx0U2VsZWN0b3I7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMubyA9IG9ic2VydmVyO1xuICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLl93cmFwUmVzdWx0ID0gZnVuY3Rpb24ocmVzdWx0LCB4LCBpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXN1bHRTZWxlY3RvciA/XG4gICAgICAgIHJlc3VsdC5tYXAoZnVuY3Rpb24oeSwgaTIpIHsgcmV0dXJuIHRoaXMucmVzdWx0U2VsZWN0b3IoeCwgeSwgaSwgaTIpOyB9LCB0aGlzKSA6XG4gICAgICAgIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHZhciBpID0gdGhpcy5pKys7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godGhpcy5zZWxlY3RvcikoeCwgaSwgdGhpcy5zb3VyY2UpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKHJlc3VsdC5lKTsgfVxuXG4gICAgICBpc1Byb21pc2UocmVzdWx0KSAmJiAocmVzdWx0ID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHJlc3VsdCkpO1xuICAgICAgKGlzQXJyYXlMaWtlKHJlc3VsdCkgfHwgaXNJdGVyYWJsZShyZXN1bHQpKSAmJiAocmVzdWx0ID0gT2JzZXJ2YWJsZS5mcm9tKHJlc3VsdCkpO1xuICAgICAgdGhpcy5vLm9uTmV4dCh0aGlzLl93cmFwUmVzdWx0KHJlc3VsdCwgeCwgaSkpO1xuICAgIH07XG5cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGUpIHsgdGhpcy5vLm9uRXJyb3IoZSk7IH07XG5cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uKCkgeyB0aGlzLm8ub25Db21wbGV0ZWQoKTsgfTtcblxuICAgIHJldHVybiBGbGF0TWFwT2JzZXJ2YWJsZTtcblxufShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBFbnVtZXJhYmxlID0gUnguaW50ZXJuYWxzLkVudW1lcmFibGUgPSBmdW5jdGlvbiAoKSB7IH07XG5cbiAgZnVuY3Rpb24gSXNEaXNwb3NlZERpc3Bvc2FibGUoc3RhdGUpIHtcbiAgICB0aGlzLl9zID0gc3RhdGU7XG4gICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG4gIH1cblxuICBJc0Rpc3Bvc2VkRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3MuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIHZhciBDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZShzb3VyY2VzKSB7XG4gICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgQ29uY2F0RW51bWVyYWJsZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIHN0YXRlID0geyBpc0Rpc3Bvc2VkOiBmYWxzZSB9LCBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpO1xuICAgICAgdmFyIGNhbmNlbGFibGUgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKHRoaXMuc291cmNlc1skaXRlcmF0b3IkXSgpLCBmdW5jdGlvbiAoZSwgc2VsZikge1xuICAgICAgICBpZiAoc3RhdGUuaXNEaXNwb3NlZCkgeyByZXR1cm47IH1cbiAgICAgICAgdmFyIGN1cnJlbnRJdGVtID0gdHJ5Q2F0Y2goZS5uZXh0KS5jYWxsKGUpO1xuICAgICAgICBpZiAoY3VycmVudEl0ZW0gPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IoY3VycmVudEl0ZW0uZSk7IH1cblxuICAgICAgICBpZiAoY3VycmVudEl0ZW0uZG9uZSkge1xuICAgICAgICAgIHJldHVybiBvLm9uQ29tcGxldGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBwcm9taXNlXG4gICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBjdXJyZW50SXRlbS52YWx1ZTtcbiAgICAgICAgaXNQcm9taXNlKGN1cnJlbnRWYWx1ZSkgJiYgKGN1cnJlbnRWYWx1ZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShjdXJyZW50VmFsdWUpKTtcblxuICAgICAgICB2YXIgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuICAgICAgICBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShkKTtcbiAgICAgICAgZC5zZXREaXNwb3NhYmxlKGN1cnJlbnRWYWx1ZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobywgc2VsZiwgZSkpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKFtzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUsIG5ldyBJc0Rpc3Bvc2VkRGlzcG9zYWJsZShzdGF0ZSldKTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG4gICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvLCBzLCBlKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3MgPSBzO1xuICAgICAgdGhpcy5fZSA9IGU7XG4gICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uICh4KSB7IHRoaXMuX28ub25OZXh0KHgpOyB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uRXJyb3IoZSk7IH07XG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3ModGhpcy5fZSk7IH07XG5cbiAgICByZXR1cm4gQ29uY2F0RW51bWVyYWJsZU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICBFbnVtZXJhYmxlLnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBDb25jYXRFbnVtZXJhYmxlT2JzZXJ2YWJsZSh0aGlzKTtcbiAgfTtcblxuICB2YXIgQ2F0Y2hFcnJvck9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQ2F0Y2hFcnJvck9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ2F0Y2hFcnJvck9ic2VydmFibGUoc291cmNlcykge1xuICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIENhdGNoRXJyb3JPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBlID0gdGhpcy5zb3VyY2VzWyRpdGVyYXRvciRdKCk7XG5cbiAgICAgIHZhciBzdGF0ZSA9IHsgaXNEaXNwb3NlZDogZmFsc2UgfSwgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKTtcbiAgICAgIHZhciBjYW5jZWxhYmxlID0gY3VycmVudFRocmVhZFNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZShudWxsLCBmdW5jdGlvbiAobGFzdEV4Y2VwdGlvbiwgc2VsZikge1xuICAgICAgICBpZiAoc3RhdGUuaXNEaXNwb3NlZCkgeyByZXR1cm47IH1cbiAgICAgICAgdmFyIGN1cnJlbnRJdGVtID0gdHJ5Q2F0Y2goZS5uZXh0KS5jYWxsKGUpO1xuICAgICAgICBpZiAoY3VycmVudEl0ZW0gPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IoY3VycmVudEl0ZW0uZSk7IH1cblxuICAgICAgICBpZiAoY3VycmVudEl0ZW0uZG9uZSkge1xuICAgICAgICAgIHJldHVybiBsYXN0RXhjZXB0aW9uICE9PSBudWxsID8gby5vbkVycm9yKGxhc3RFeGNlcHRpb24pIDogby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgcHJvbWlzZVxuICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gY3VycmVudEl0ZW0udmFsdWU7XG4gICAgICAgIGlzUHJvbWlzZShjdXJyZW50VmFsdWUpICYmIChjdXJyZW50VmFsdWUgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoY3VycmVudFZhbHVlKSk7XG5cbiAgICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUoZCk7XG4gICAgICAgIGQuc2V0RGlzcG9zYWJsZShjdXJyZW50VmFsdWUuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHNlbGYpKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgTkFyeURpc3Bvc2FibGUoW3N1YnNjcmlwdGlvbiwgY2FuY2VsYWJsZSwgbmV3IElzRGlzcG9zZWREaXNwb3NhYmxlKHN0YXRlKV0pO1xuICAgIH07XG5cbiAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcbiAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIHJlY3Vyc2UpIHtcbiAgICAgIHRoaXMuX28gPSBvO1xuICAgICAgdGhpcy5fcmVjdXJzZSA9IHJlY3Vyc2U7XG4gICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7IHRoaXMuX28ub25OZXh0KHgpOyB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHsgdGhpcy5fcmVjdXJzZShlKTsgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX28ub25Db21wbGV0ZWQoKTsgfTtcblxuICAgIHJldHVybiBDYXRjaEVycm9yT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIEVudW1lcmFibGUucHJvdG90eXBlLmNhdGNoRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBDYXRjaEVycm9yT2JzZXJ2YWJsZSh0aGlzKTtcbiAgfTtcblxuICBFbnVtZXJhYmxlLnByb3RvdHlwZS5jYXRjaEVycm9yV2hlbiA9IGZ1bmN0aW9uIChub3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgdmFyIHNvdXJjZXMgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGV4Y2VwdGlvbnMgPSBuZXcgU3ViamVjdCgpLFxuICAgICAgICBub3RpZmllciA9IG5ldyBTdWJqZWN0KCksXG4gICAgICAgIGhhbmRsZWQgPSBub3RpZmljYXRpb25IYW5kbGVyKGV4Y2VwdGlvbnMpLFxuICAgICAgICBub3RpZmljYXRpb25EaXNwb3NhYmxlID0gaGFuZGxlZC5zdWJzY3JpYmUobm90aWZpZXIpO1xuXG4gICAgICB2YXIgZSA9IHNvdXJjZXNbJGl0ZXJhdG9yJF0oKTtcblxuICAgICAgdmFyIHN0YXRlID0geyBpc0Rpc3Bvc2VkOiBmYWxzZSB9LFxuICAgICAgICBsYXN0RXhjZXB0aW9uLFxuICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpO1xuICAgICAgdmFyIGNhbmNlbGFibGUgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlKG51bGwsIGZ1bmN0aW9uIChfLCBzZWxmKSB7XG4gICAgICAgIGlmIChzdGF0ZS5pc0Rpc3Bvc2VkKSB7IHJldHVybjsgfVxuICAgICAgICB2YXIgY3VycmVudEl0ZW0gPSB0cnlDYXRjaChlLm5leHQpLmNhbGwoZSk7XG4gICAgICAgIGlmIChjdXJyZW50SXRlbSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihjdXJyZW50SXRlbS5lKTsgfVxuXG4gICAgICAgIGlmIChjdXJyZW50SXRlbS5kb25lKSB7XG4gICAgICAgICAgaWYgKGxhc3RFeGNlcHRpb24pIHtcbiAgICAgICAgICAgIG8ub25FcnJvcihsYXN0RXhjZXB0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBwcm9taXNlXG4gICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBjdXJyZW50SXRlbS52YWx1ZTtcbiAgICAgICAgaXNQcm9taXNlKGN1cnJlbnRWYWx1ZSkgJiYgKGN1cnJlbnRWYWx1ZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShjdXJyZW50VmFsdWUpKTtcblxuICAgICAgICB2YXIgb3V0ZXIgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgdmFyIGlubmVyID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG5ldyBCaW5hcnlEaXNwb3NhYmxlKGlubmVyLCBvdXRlcikpO1xuICAgICAgICBvdXRlci5zZXREaXNwb3NhYmxlKGN1cnJlbnRWYWx1ZS5zdWJzY3JpYmUoXG4gICAgICAgICAgZnVuY3Rpb24oeCkgeyBvLm9uTmV4dCh4KTsgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoZXhuKSB7XG4gICAgICAgICAgICBpbm5lci5zZXREaXNwb3NhYmxlKG5vdGlmaWVyLnN1YnNjcmliZShzZWxmLCBmdW5jdGlvbihleCkge1xuICAgICAgICAgICAgICBvLm9uRXJyb3IoZXgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgZXhjZXB0aW9ucy5vbk5leHQoZXhuKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uKCkgeyBvLm9uQ29tcGxldGVkKCk7IH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKFtub3RpZmljYXRpb25EaXNwb3NhYmxlLCBzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUsIG5ldyBJc0Rpc3Bvc2VkRGlzcG9zYWJsZShzdGF0ZSldKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgUmVwZWF0RW51bWVyYWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoUmVwZWF0RW51bWVyYWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIFJlcGVhdEVudW1lcmFibGUodiwgYykge1xuICAgICAgdGhpcy52ID0gdjtcbiAgICAgIHRoaXMuYyA9IGMgPT0gbnVsbCA/IC0xIDogYztcbiAgICB9XG4gICAgUmVwZWF0RW51bWVyYWJsZS5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IFJlcGVhdEVudW1lcmF0b3IodGhpcyk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFJlcGVhdEVudW1lcmF0b3IocCkge1xuICAgICAgdGhpcy52ID0gcC52O1xuICAgICAgdGhpcy5sID0gcC5jO1xuICAgIH1cbiAgICBSZXBlYXRFbnVtZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMubCA9PT0gMCkgeyByZXR1cm4gZG9uZUVudW1lcmF0b3I7IH1cbiAgICAgIGlmICh0aGlzLmwgPiAwKSB7IHRoaXMubC0tOyB9XG4gICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IHRoaXMudiB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gUmVwZWF0RW51bWVyYWJsZTtcbiAgfShFbnVtZXJhYmxlKSk7XG5cbiAgdmFyIGVudW1lcmFibGVSZXBlYXQgPSBFbnVtZXJhYmxlLnJlcGVhdCA9IGZ1bmN0aW9uICh2YWx1ZSwgcmVwZWF0Q291bnQpIHtcbiAgICByZXR1cm4gbmV3IFJlcGVhdEVudW1lcmFibGUodmFsdWUsIHJlcGVhdENvdW50KTtcbiAgfTtcblxuICB2YXIgT2ZFbnVtZXJhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKE9mRW51bWVyYWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBPZkVudW1lcmFibGUocywgZm4sIHRoaXNBcmcpIHtcbiAgICAgIHRoaXMucyA9IHM7XG4gICAgICB0aGlzLmZuID0gZm4gPyBiaW5kQ2FsbGJhY2soZm4sIHRoaXNBcmcsIDMpIDogbnVsbDtcbiAgICB9XG4gICAgT2ZFbnVtZXJhYmxlLnByb3RvdHlwZVskaXRlcmF0b3IkXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgT2ZFbnVtZXJhdG9yKHRoaXMpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBPZkVudW1lcmF0b3IocCkge1xuICAgICAgdGhpcy5pID0gLTE7XG4gICAgICB0aGlzLnMgPSBwLnM7XG4gICAgICB0aGlzLmwgPSB0aGlzLnMubGVuZ3RoO1xuICAgICAgdGhpcy5mbiA9IHAuZm47XG4gICAgfVxuICAgIE9mRW51bWVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgcmV0dXJuICsrdGhpcy5pIDwgdGhpcy5sID9cbiAgICAgICB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogIXRoaXMuZm4gPyB0aGlzLnNbdGhpcy5pXSA6IHRoaXMuZm4odGhpcy5zW3RoaXMuaV0sIHRoaXMuaSwgdGhpcy5zKSB9IDpcbiAgICAgICBkb25lRW51bWVyYXRvcjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE9mRW51bWVyYWJsZTtcbiAgfShFbnVtZXJhYmxlKSk7XG5cbiAgdmFyIGVudW1lcmFibGVPZiA9IEVudW1lcmFibGUub2YgPSBmdW5jdGlvbiAoc291cmNlLCBzZWxlY3RvciwgdGhpc0FyZykge1xuICAgIHJldHVybiBuZXcgT2ZFbnVtZXJhYmxlKHNvdXJjZSwgc2VsZWN0b3IsIHRoaXNBcmcpO1xuICB9O1xuXG4gIHZhciBUb0FycmF5T2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUb0FycmF5T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBUb0FycmF5T2JzZXJ2YWJsZShzb3VyY2UpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgVG9BcnJheU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8pKTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdHMoSW5uZXJPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG4gICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvKSB7XG4gICAgICB0aGlzLm8gPSBvO1xuICAgICAgdGhpcy5hID0gW107XG4gICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIFxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkgeyB0aGlzLmEucHVzaCh4KTsgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuby5vbkVycm9yKGUpOyAgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuby5vbk5leHQodGhpcy5hKTsgdGhpcy5vLm9uQ29tcGxldGVkKCk7IH07XG5cbiAgICByZXR1cm4gVG9BcnJheU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgKiBDcmVhdGVzIGFuIGFycmF5IGZyb20gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBhIGxpc3QgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICovXG4gIG9ic2VydmFibGVQcm90by50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgVG9BcnJheU9ic2VydmFibGUodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICBDcmVhdGVzIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgZnJvbSBhIHNwZWNpZmllZCBzdWJzY3JpYmUgbWV0aG9kIGltcGxlbWVudGF0aW9uLlxuICAgKiBAZXhhbXBsZVxuICAgKiAgdmFyIHJlcyA9IFJ4Lk9ic2VydmFibGUuY3JlYXRlKGZ1bmN0aW9uIChvYnNlcnZlcikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB9ICk7XG4gICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5jcmVhdGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7IHJldHVybiBSeC5EaXNwb3NhYmxlLmVtcHR5OyB9ICk7XG4gICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5jcmVhdGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7IH0gKTtcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3Vic2NyaWJlIEltcGxlbWVudGF0aW9uIG9mIHRoZSByZXN1bHRpbmcgb2JzZXJ2YWJsZSBzZXF1ZW5jZSdzIHN1YnNjcmliZSBtZXRob2QsIHJldHVybmluZyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGluIGEgRGlzcG9zYWJsZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFN1YnNjcmliZSBtZXRob2QuXG4gICAqL1xuICBPYnNlcnZhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmUsIHBhcmVudCkge1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShzdWJzY3JpYmUsIHBhcmVudCk7XG4gIH07XG5cbiAgdmFyIERlZmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKERlZmVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIERlZmVyKGZhY3RvcnkpIHtcbiAgICAgIHRoaXMuX2YgPSBmYWN0b3J5O1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRGVmZXIucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMuX2YpKCk7XG4gICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gb2JzZXJ2YWJsZVRocm93KHJlc3VsdC5lKS5zdWJzY3JpYmUobyk7fVxuICAgICAgaXNQcm9taXNlKHJlc3VsdCkgJiYgKHJlc3VsdCA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShyZXN1bHQpKTtcbiAgICAgIHJldHVybiByZXN1bHQuc3Vic2NyaWJlKG8pO1xuICAgIH07XG5cbiAgICByZXR1cm4gRGVmZXI7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGludm9rZXMgdGhlIHNwZWNpZmllZCBmYWN0b3J5IGZ1bmN0aW9uIHdoZW5ldmVyIGEgbmV3IG9ic2VydmVyIHN1YnNjcmliZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICB2YXIgcmVzID0gUnguT2JzZXJ2YWJsZS5kZWZlcihmdW5jdGlvbiAoKSB7IHJldHVybiBSeC5PYnNlcnZhYmxlLmZyb21BcnJheShbMSwyLDNdKTsgfSk7XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9ic2VydmFibGVGYWN0b3J5IE9ic2VydmFibGUgZmFjdG9yeSBmdW5jdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggb2JzZXJ2ZXIgdGhhdCBzdWJzY3JpYmVzIHRvIHRoZSByZXN1bHRpbmcgc2VxdWVuY2Ugb3IgUHJvbWlzZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2hvc2Ugb2JzZXJ2ZXJzIHRyaWdnZXIgYW4gaW52b2NhdGlvbiBvZiB0aGUgZ2l2ZW4gb2JzZXJ2YWJsZSBmYWN0b3J5IGZ1bmN0aW9uLlxuICAgKi9cbiAgdmFyIG9ic2VydmFibGVEZWZlciA9IE9ic2VydmFibGUuZGVmZXIgPSBmdW5jdGlvbiAob2JzZXJ2YWJsZUZhY3RvcnkpIHtcbiAgICByZXR1cm4gbmV3IERlZmVyKG9ic2VydmFibGVGYWN0b3J5KTtcbiAgfTtcblxuICB2YXIgRW1wdHlPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKEVtcHR5T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBFbXB0eU9ic2VydmFibGUoc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEVtcHR5T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIHNpbmsgPSBuZXcgRW1wdHlTaW5rKG9ic2VydmVyLCB0aGlzLnNjaGVkdWxlcik7XG4gICAgICByZXR1cm4gc2luay5ydW4oKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gRW1wdHlTaW5rKG9ic2VydmVyLCBzY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlSXRlbShzLCBzdGF0ZSkge1xuICAgICAgc3RhdGUub25Db21wbGV0ZWQoKTtcbiAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG4gICAgfVxuXG4gICAgRW1wdHlTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhdGUgPSB0aGlzLm9ic2VydmVyO1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyID09PSBpbW1lZGlhdGVTY2hlZHVsZXIgP1xuICAgICAgICBzY2hlZHVsZUl0ZW0obnVsbCwgc3RhdGUpIDpcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUoc3RhdGUsIHNjaGVkdWxlSXRlbSk7XG4gICAgfTtcblxuICAgIHJldHVybiBFbXB0eU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgRU1QVFlfT0JTRVJWQUJMRSA9IG5ldyBFbXB0eU9ic2VydmFibGUoaW1tZWRpYXRlU2NoZWR1bGVyKTtcblxuICAvKipcbiAgICogIFJldHVybnMgYW4gZW1wdHkgb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2hlZHVsZXIgdG8gc2VuZCBvdXQgdGhlIHNpbmdsZSBPbkNvbXBsZXRlZCBtZXNzYWdlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgdmFyIHJlcyA9IFJ4Lk9ic2VydmFibGUuZW1wdHkoKTtcbiAgICogIHZhciByZXMgPSBSeC5PYnNlcnZhYmxlLmVtcHR5KFJ4LlNjaGVkdWxlci50aW1lb3V0KTtcbiAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBzZW5kIHRoZSB0ZXJtaW5hdGlvbiBjYWxsIG9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIG5vIGVsZW1lbnRzLlxuICAgKi9cbiAgdmFyIG9ic2VydmFibGVFbXB0eSA9IE9ic2VydmFibGUuZW1wdHkgPSBmdW5jdGlvbiAoc2NoZWR1bGVyKSB7XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyKTtcbiAgICByZXR1cm4gc2NoZWR1bGVyID09PSBpbW1lZGlhdGVTY2hlZHVsZXIgPyBFTVBUWV9PQlNFUlZBQkxFIDogbmV3IEVtcHR5T2JzZXJ2YWJsZShzY2hlZHVsZXIpO1xuICB9O1xuXG4gIHZhciBGcm9tT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhGcm9tT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBGcm9tT2JzZXJ2YWJsZShpdGVyYWJsZSwgbWFwcGVyLCBzY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTtcbiAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyO1xuICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBGcm9tT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgc2luayA9IG5ldyBGcm9tU2luayhvLCB0aGlzKTtcbiAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gRnJvbU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgRnJvbVNpbmsgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZyb21TaW5rKG8sIHBhcmVudCkge1xuICAgICAgdGhpcy5vID0gbztcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIEZyb21TaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbGlzdCA9IE9iamVjdCh0aGlzLnBhcmVudC5pdGVyYWJsZSksXG4gICAgICAgICAgaXQgPSBnZXRJdGVyYWJsZShsaXN0KSxcbiAgICAgICAgICBvID0gdGhpcy5vLFxuICAgICAgICAgIG1hcHBlciA9IHRoaXMucGFyZW50Lm1hcHBlcjtcblxuICAgICAgZnVuY3Rpb24gbG9vcFJlY3Vyc2l2ZShpLCByZWN1cnNlKSB7XG4gICAgICAgIHZhciBuZXh0ID0gdHJ5Q2F0Y2goaXQubmV4dCkuY2FsbChpdCk7XG4gICAgICAgIGlmIChuZXh0ID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKG5leHQuZSk7IH1cbiAgICAgICAgaWYgKG5leHQuZG9uZSkgeyByZXR1cm4gby5vbkNvbXBsZXRlZCgpOyB9XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IG5leHQudmFsdWU7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24obWFwcGVyKSkge1xuICAgICAgICAgIHJlc3VsdCA9IHRyeUNhdGNoKG1hcHBlcikocmVzdWx0LCBpKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdC5lKTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgby5vbk5leHQocmVzdWx0KTtcbiAgICAgICAgcmVjdXJzZShpICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUoMCwgbG9vcFJlY3Vyc2l2ZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBGcm9tU2luaztcbiAgfSgpKTtcblxuICB2YXIgbWF4U2FmZUludGVnZXIgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuXG4gIGZ1bmN0aW9uIFN0cmluZ0l0ZXJhYmxlKHMpIHtcbiAgICB0aGlzLl9zID0gcztcbiAgfVxuXG4gIFN0cmluZ0l0ZXJhYmxlLnByb3RvdHlwZVskaXRlcmF0b3IkXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFN0cmluZ0l0ZXJhdG9yKHRoaXMuX3MpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFN0cmluZ0l0ZXJhdG9yKHMpIHtcbiAgICB0aGlzLl9zID0gcztcbiAgICB0aGlzLl9sID0gcy5sZW5ndGg7XG4gICAgdGhpcy5faSA9IDA7XG4gIH1cblxuICBTdHJpbmdJdGVyYXRvci5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgU3RyaW5nSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2kgPCB0aGlzLl9sID8geyBkb25lOiBmYWxzZSwgdmFsdWU6IHRoaXMuX3MuY2hhckF0KHRoaXMuX2krKykgfSA6IGRvbmVFbnVtZXJhdG9yO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFycmF5SXRlcmFibGUoYSkge1xuICAgIHRoaXMuX2EgPSBhO1xuICB9XG5cbiAgQXJyYXlJdGVyYWJsZS5wcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKHRoaXMuX2EpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFycmF5SXRlcmF0b3IoYSkge1xuICAgIHRoaXMuX2EgPSBhO1xuICAgIHRoaXMuX2wgPSB0b0xlbmd0aChhKTtcbiAgICB0aGlzLl9pID0gMDtcbiAgfVxuXG4gIEFycmF5SXRlcmF0b3IucHJvdG90eXBlWyRpdGVyYXRvciRdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFycmF5SXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2kgPCB0aGlzLl9sID8geyBkb25lOiBmYWxzZSwgdmFsdWU6IHRoaXMuX2FbdGhpcy5faSsrXSB9IDogZG9uZUVudW1lcmF0b3I7XG4gIH07XG5cbiAgZnVuY3Rpb24gbnVtYmVySXNGaW5pdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiByb290LmlzRmluaXRlKHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTmFuKG4pIHtcbiAgICByZXR1cm4gbiAhPT0gbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEl0ZXJhYmxlKG8pIHtcbiAgICB2YXIgaSA9IG9bJGl0ZXJhdG9yJF0sIGl0O1xuICAgIGlmICghaSAmJiB0eXBlb2YgbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGl0ID0gbmV3IFN0cmluZ0l0ZXJhYmxlKG8pO1xuICAgICAgcmV0dXJuIGl0WyRpdGVyYXRvciRdKCk7XG4gICAgfVxuICAgIGlmICghaSAmJiBvLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpdCA9IG5ldyBBcnJheUl0ZXJhYmxlKG8pO1xuICAgICAgcmV0dXJuIGl0WyRpdGVyYXRvciRdKCk7XG4gICAgfVxuICAgIGlmICghaSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QgaXMgbm90IGl0ZXJhYmxlJyk7IH1cbiAgICByZXR1cm4gb1skaXRlcmF0b3IkXSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbih2YWx1ZSkge1xuICAgIHZhciBudW1iZXIgPSArdmFsdWU7XG4gICAgaWYgKG51bWJlciA9PT0gMCkgeyByZXR1cm4gbnVtYmVyOyB9XG4gICAgaWYgKGlzTmFOKG51bWJlcikpIHsgcmV0dXJuIG51bWJlcjsgfVxuICAgIHJldHVybiBudW1iZXIgPCAwID8gLTEgOiAxO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9MZW5ndGgobykge1xuICAgIHZhciBsZW4gPSArby5sZW5ndGg7XG4gICAgaWYgKGlzTmFOKGxlbikpIHsgcmV0dXJuIDA7IH1cbiAgICBpZiAobGVuID09PSAwIHx8ICFudW1iZXJJc0Zpbml0ZShsZW4pKSB7IHJldHVybiBsZW47IH1cbiAgICBsZW4gPSBzaWduKGxlbikgKiBNYXRoLmZsb29yKE1hdGguYWJzKGxlbikpO1xuICAgIGlmIChsZW4gPD0gMCkgeyByZXR1cm4gMDsgfVxuICAgIGlmIChsZW4gPiBtYXhTYWZlSW50ZWdlcikgeyByZXR1cm4gbWF4U2FmZUludGVnZXI7IH1cbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgLyoqXG4gICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBPYnNlcnZhYmxlIHNlcXVlbmNlIGZyb20gYW4gYXJyYXktbGlrZSBvciBpdGVyYWJsZSBvYmplY3QuXG4gICogQHBhcmFtIHtBbnl9IGFycmF5TGlrZSBBbiBhcnJheS1saWtlIG9yIGl0ZXJhYmxlIG9iamVjdCB0byBjb252ZXJ0IHRvIGFuIE9ic2VydmFibGUgc2VxdWVuY2UuXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gW21hcEZuXSBNYXAgZnVuY3Rpb24gdG8gY2FsbCBvbiBldmVyeSBlbGVtZW50IG9mIHRoZSBhcnJheS5cbiAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIFRoZSBjb250ZXh0IHRvIHVzZSBjYWxsaW5nIHRoZSBtYXBGbiBpZiBwcm92aWRlZC5cbiAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gT3B0aW9uYWwgc2NoZWR1bGVyIHRvIHVzZSBmb3Igc2NoZWR1bGluZy4gIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gU2NoZWR1bGVyLmN1cnJlbnRUaHJlYWQuXG4gICovXG4gIHZhciBvYnNlcnZhYmxlRnJvbSA9IE9ic2VydmFibGUuZnJvbSA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgbWFwRm4sIHRoaXNBcmcsIHNjaGVkdWxlcikge1xuICAgIGlmIChpdGVyYWJsZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2l0ZXJhYmxlIGNhbm5vdCBiZSBudWxsLicpXG4gICAgfVxuICAgIGlmIChtYXBGbiAmJiAhaXNGdW5jdGlvbihtYXBGbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWFwRm4gd2hlbiBwcm92aWRlZCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKG1hcEZuKSB7XG4gICAgICB2YXIgbWFwcGVyID0gYmluZENhbGxiYWNrKG1hcEZuLCB0aGlzQXJnLCAyKTtcbiAgICB9XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG4gICAgcmV0dXJuIG5ldyBGcm9tT2JzZXJ2YWJsZShpdGVyYWJsZSwgbWFwcGVyLCBzY2hlZHVsZXIpO1xuICB9XG5cbiAgdmFyIEZyb21BcnJheU9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoRnJvbUFycmF5T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBGcm9tQXJyYXlPYnNlcnZhYmxlKGFyZ3MsIHNjaGVkdWxlcikge1xuICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRnJvbUFycmF5T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIHNpbmsgPSBuZXcgRnJvbUFycmF5U2luayhvYnNlcnZlciwgdGhpcyk7XG4gICAgICByZXR1cm4gc2luay5ydW4oKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEZyb21BcnJheU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICBmdW5jdGlvbiBGcm9tQXJyYXlTaW5rKG9ic2VydmVyLCBwYXJlbnQpIHtcbiAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBsb29wUmVjdXJzaXZlKGFyZ3MsIG9ic2VydmVyKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICAgIHJldHVybiBmdW5jdGlvbiBsb29wIChpLCByZWN1cnNlKSB7XG4gICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICBvYnNlcnZlci5vbk5leHQoYXJnc1tpXSk7XG4gICAgICAgIHJlY3Vyc2UoaSArIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgRnJvbUFycmF5U2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUoMCwgbG9vcFJlY3Vyc2l2ZSh0aGlzLnBhcmVudC5hcmdzLCB0aGlzLm9ic2VydmVyKSk7XG4gIH07XG5cbiAgLyoqXG4gICogIENvbnZlcnRzIGFuIGFycmF5IHRvIGFuIG9ic2VydmFibGUgc2VxdWVuY2UsIHVzaW5nIGFuIG9wdGlvbmFsIHNjaGVkdWxlciB0byBlbnVtZXJhdGUgdGhlIGFycmF5LlxuICAqIEBkZXByZWNhdGVkIHVzZSBPYnNlcnZhYmxlLmZyb20gb3IgT2JzZXJ2YWJsZS5vZlxuICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gcnVuIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgaW5wdXQgc2VxdWVuY2Ugb24uXG4gICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdob3NlIGVsZW1lbnRzIGFyZSBwdWxsZWQgZnJvbSB0aGUgZ2l2ZW4gZW51bWVyYWJsZSBzZXF1ZW5jZS5cbiAgKi9cbiAgdmFyIG9ic2VydmFibGVGcm9tQXJyYXkgPSBPYnNlcnZhYmxlLmZyb21BcnJheSA9IGZ1bmN0aW9uIChhcnJheSwgc2NoZWR1bGVyKSB7XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG4gICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFycmF5LCBzY2hlZHVsZXIpXG4gIH07XG5cbiAgdmFyIE5ldmVyT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhOZXZlck9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gTmV2ZXJPYnNlcnZhYmxlKCkge1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgTmV2ZXJPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuICAgIH07XG5cbiAgICByZXR1cm4gTmV2ZXJPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIE5FVkVSX09CU0VSVkFCTEUgPSBuZXcgTmV2ZXJPYnNlcnZhYmxlKCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBub24tdGVybWluYXRpbmcgb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGVub3RlIGFuIGluZmluaXRlIGR1cmF0aW9uIChlLmcuIHdoZW4gdXNpbmcgcmVhY3RpdmUgam9pbnMpLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBvYnNlcnZlcnMgd2lsbCBuZXZlciBnZXQgY2FsbGVkLlxuICAgKi9cbiAgdmFyIG9ic2VydmFibGVOZXZlciA9IE9ic2VydmFibGUubmV2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE5FVkVSX09CU0VSVkFCTEU7XG4gIH07XG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZU9mIChzY2hlZHVsZXIsIGFycmF5KSB7XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG4gICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFycmF5LCBzY2hlZHVsZXIpO1xuICB9XG5cbiAgLyoqXG4gICogIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgT2JzZXJ2YWJsZSBpbnN0YW5jZSB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgcmVnYXJkbGVzcyBvZiBudW1iZXIgb3IgdHlwZSBvZiB0aGUgYXJndW1lbnRzLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgcHVsbGVkIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50cy5cbiAgKi9cbiAgT2JzZXJ2YWJsZS5vZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFyZ3MsIGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIpO1xuICB9O1xuXG4gIC8qKlxuICAqICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IE9ic2VydmFibGUgaW5zdGFuY2Ugd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMsIHJlZ2FyZGxlc3Mgb2YgbnVtYmVyIG9yIHR5cGUgb2YgdGhlIGFyZ3VtZW50cy5cbiAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIEEgc2NoZWR1bGVyIHRvIHVzZSBmb3Igc2NoZWR1bGluZyB0aGUgYXJndW1lbnRzLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgcHVsbGVkIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50cy5cbiAgKi9cbiAgT2JzZXJ2YWJsZS5vZldpdGhTY2hlZHVsZXIgPSBmdW5jdGlvbiAoc2NoZWR1bGVyKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgZm9yKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldOyB9XG4gICAgcmV0dXJuIG5ldyBGcm9tQXJyYXlPYnNlcnZhYmxlKGFyZ3MsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgdmFyIFBhaXJzT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhQYWlyc09ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gUGFpcnNPYnNlcnZhYmxlKG9iaiwgc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLm9iaiA9IG9iajtcbiAgICAgIHRoaXMua2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFBhaXJzT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIHNpbmsgPSBuZXcgUGFpcnNTaW5rKG9ic2VydmVyLCB0aGlzKTtcbiAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gUGFpcnNPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgZnVuY3Rpb24gUGFpcnNTaW5rKG9ic2VydmVyLCBwYXJlbnQpIHtcbiAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIH1cblxuICBQYWlyc1NpbmsucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmVyLCBvYmogPSB0aGlzLnBhcmVudC5vYmosIGtleXMgPSB0aGlzLnBhcmVudC5rZXlzLCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBmdW5jdGlvbiBsb29wUmVjdXJzaXZlKGksIHJlY3Vyc2UpIHtcbiAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBvYnNlcnZlci5vbk5leHQoW2tleSwgb2JqW2tleV1dKTtcbiAgICAgICAgcmVjdXJzZShpICsgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYnNlcnZlci5vbkNvbXBsZXRlZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUoMCwgbG9vcFJlY3Vyc2l2ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYW4gb2JqZWN0IGludG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBba2V5LCB2YWx1ZV0gcGFpcnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gU2NoZWR1bGVyIHRvIHJ1biB0aGUgZW51bWVyYXRpb24gb2YgdGhlIGlucHV0IHNlcXVlbmNlIG9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBba2V5LCB2YWx1ZV0gcGFpcnMgZnJvbSB0aGUgb2JqZWN0LlxuICAgKi9cbiAgT2JzZXJ2YWJsZS5wYWlycyA9IGZ1bmN0aW9uIChvYmosIHNjaGVkdWxlcikge1xuICAgIHNjaGVkdWxlciB8fCAoc2NoZWR1bGVyID0gY3VycmVudFRocmVhZFNjaGVkdWxlcik7XG4gICAgcmV0dXJuIG5ldyBQYWlyc09ic2VydmFibGUob2JqLCBzY2hlZHVsZXIpO1xuICB9O1xuXG4gICAgdmFyIFJhbmdlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhSYW5nZU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gUmFuZ2VPYnNlcnZhYmxlKHN0YXJ0LCBjb3VudCwgc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICB0aGlzLnJhbmdlQ291bnQgPSBjb3VudDtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgUmFuZ2VPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2YXIgc2luayA9IG5ldyBSYW5nZVNpbmsob2JzZXJ2ZXIsIHRoaXMpO1xuICAgICAgcmV0dXJuIHNpbmsucnVuKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBSYW5nZU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgUmFuZ2VTaW5rID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSYW5nZVNpbmsob2JzZXJ2ZXIsIHBhcmVudCkge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9vcFJlY3Vyc2l2ZShzdGFydCwgY291bnQsIG9ic2VydmVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gbG9vcCAoaSwgcmVjdXJzZSkge1xuICAgICAgICBpZiAoaSA8IGNvdW50KSB7XG4gICAgICAgICAgb2JzZXJ2ZXIub25OZXh0KHN0YXJ0ICsgaSk7XG4gICAgICAgICAgcmVjdXJzZShpICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBSYW5nZVNpbmsucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5zY2hlZHVsZXIuc2NoZWR1bGVSZWN1cnNpdmUoXG4gICAgICAgIDAsXG4gICAgICAgIGxvb3BSZWN1cnNpdmUodGhpcy5wYXJlbnQuc3RhcnQsIHRoaXMucGFyZW50LnJhbmdlQ291bnQsIHRoaXMub2JzZXJ2ZXIpXG4gICAgICApO1xuICAgIH07XG5cbiAgICByZXR1cm4gUmFuZ2VTaW5rO1xuICB9KCkpO1xuXG4gIC8qKlxuICAqICBHZW5lcmF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBpbnRlZ3JhbCBudW1iZXJzIHdpdGhpbiBhIHNwZWNpZmllZCByYW5nZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2hlZHVsZXIgdG8gc2VuZCBvdXQgb2JzZXJ2ZXIgbWVzc2FnZXMuXG4gICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IFRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW50ZWdlciBpbiB0aGUgc2VxdWVuY2UuXG4gICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2Ygc2VxdWVudGlhbCBpbnRlZ2VycyB0byBnZW5lcmF0ZS5cbiAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gU2NoZWR1bGVyIHRvIHJ1biB0aGUgZ2VuZXJhdG9yIGxvb3Agb24uIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIFNjaGVkdWxlci5jdXJyZW50VGhyZWFkLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgYSByYW5nZSBvZiBzZXF1ZW50aWFsIGludGVncmFsIG51bWJlcnMuXG4gICovXG4gIE9ic2VydmFibGUucmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGNvdW50LCBzY2hlZHVsZXIpIHtcbiAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBjdXJyZW50VGhyZWFkU2NoZWR1bGVyKTtcbiAgICByZXR1cm4gbmV3IFJhbmdlT2JzZXJ2YWJsZShzdGFydCwgY291bnQsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgdmFyIFJlcGVhdE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoUmVwZWF0T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBSZXBlYXRPYnNlcnZhYmxlKHZhbHVlLCByZXBlYXRDb3VudCwgc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnJlcGVhdENvdW50ID0gcmVwZWF0Q291bnQgPT0gbnVsbCA/IC0xIDogcmVwZWF0Q291bnQ7XG4gICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFJlcGVhdE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBzaW5rID0gbmV3IFJlcGVhdFNpbmsob2JzZXJ2ZXIsIHRoaXMpO1xuICAgICAgcmV0dXJuIHNpbmsucnVuKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBSZXBlYXRPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgZnVuY3Rpb24gUmVwZWF0U2luayhvYnNlcnZlciwgcGFyZW50KSB7XG4gICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB9XG5cbiAgUmVwZWF0U2luay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvYnNlcnZlciA9IHRoaXMub2JzZXJ2ZXIsIHZhbHVlID0gdGhpcy5wYXJlbnQudmFsdWU7XG4gICAgZnVuY3Rpb24gbG9vcFJlY3Vyc2l2ZShpLCByZWN1cnNlKSB7XG4gICAgICBpZiAoaSA9PT0gLTEgfHwgaSA+IDApIHtcbiAgICAgICAgb2JzZXJ2ZXIub25OZXh0KHZhbHVlKTtcbiAgICAgICAgaSA+IDAgJiYgaS0tO1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IDApIHsgcmV0dXJuIG9ic2VydmVyLm9uQ29tcGxldGVkKCk7IH1cbiAgICAgIHJlY3Vyc2UoaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyZW50LnNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSh0aGlzLnBhcmVudC5yZXBlYXRDb3VudCwgbG9vcFJlY3Vyc2l2ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICBHZW5lcmF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHJlcGVhdHMgdGhlIGdpdmVuIGVsZW1lbnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMsIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2NoZWR1bGVyIHRvIHNlbmQgb3V0IG9ic2VydmVyIG1lc3NhZ2VzLlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBFbGVtZW50IHRvIHJlcGVhdC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHJlcGVhdENvdW50IFtPcHRpb25hXSBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBlbGVtZW50LiBJZiBub3Qgc3BlY2lmaWVkLCByZXBlYXRzIGluZGVmaW5pdGVseS5cbiAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciBTY2hlZHVsZXIgdG8gcnVuIHRoZSBwcm9kdWNlciBsb29wIG9uLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBTY2hlZHVsZXIuaW1tZWRpYXRlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHJlcGVhdHMgdGhlIGdpdmVuIGVsZW1lbnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMuXG4gICAqL1xuICBPYnNlcnZhYmxlLnJlcGVhdCA9IGZ1bmN0aW9uICh2YWx1ZSwgcmVwZWF0Q291bnQsIHNjaGVkdWxlcikge1xuICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIpO1xuICAgIHJldHVybiBuZXcgUmVwZWF0T2JzZXJ2YWJsZSh2YWx1ZSwgcmVwZWF0Q291bnQsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgdmFyIEp1c3RPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKEp1c3RPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEp1c3RPYnNlcnZhYmxlKHZhbHVlLCBzY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSnVzdE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBzaW5rID0gbmV3IEp1c3RTaW5rKG9ic2VydmVyLCB0aGlzLnZhbHVlLCB0aGlzLnNjaGVkdWxlcik7XG4gICAgICByZXR1cm4gc2luay5ydW4oKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gSnVzdFNpbmsob2JzZXJ2ZXIsIHZhbHVlLCBzY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlSXRlbShzLCBzdGF0ZSkge1xuICAgICAgdmFyIHZhbHVlID0gc3RhdGVbMF0sIG9ic2VydmVyID0gc3RhdGVbMV07XG4gICAgICBvYnNlcnZlci5vbk5leHQodmFsdWUpO1xuICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG4gICAgfVxuXG4gICAgSnVzdFNpbmsucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IFt0aGlzLnZhbHVlLCB0aGlzLm9ic2VydmVyXTtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlciA9PT0gaW1tZWRpYXRlU2NoZWR1bGVyID9cbiAgICAgICAgc2NoZWR1bGVJdGVtKG51bGwsIHN0YXRlKSA6XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKHN0YXRlLCBzY2hlZHVsZUl0ZW0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gSnVzdE9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGVsZW1lbnQsIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2NoZWR1bGVyIHRvIHNlbmQgb3V0IG9ic2VydmVyIG1lc3NhZ2VzLlxuICAgKiAgVGhlcmUgaXMgYW4gYWxpYXMgY2FsbGVkICdqdXN0JyBvciBicm93c2VycyA8SUU5LlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBTaW5nbGUgZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBzY2hlZHVsZXIgU2NoZWR1bGVyIHRvIHNlbmQgdGhlIHNpbmdsZSBlbGVtZW50IG9uLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBTY2hlZHVsZXIuaW1tZWRpYXRlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBzaW5nbGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAqL1xuICB2YXIgb2JzZXJ2YWJsZVJldHVybiA9IE9ic2VydmFibGVbJ3JldHVybiddID0gT2JzZXJ2YWJsZS5qdXN0ID0gZnVuY3Rpb24gKHZhbHVlLCBzY2hlZHVsZXIpIHtcbiAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBpbW1lZGlhdGVTY2hlZHVsZXIpO1xuICAgIHJldHVybiBuZXcgSnVzdE9ic2VydmFibGUodmFsdWUsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgdmFyIFRocm93T2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUaHJvd09ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gVGhyb3dPYnNlcnZhYmxlKGVycm9yLCBzY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgVGhyb3dPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBzaW5rID0gbmV3IFRocm93U2luayhvLCB0aGlzKTtcbiAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBUaHJvd1NpbmsobywgcCkge1xuICAgICAgdGhpcy5vID0gbztcbiAgICAgIHRoaXMucCA9IHA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2NoZWR1bGVJdGVtKHMsIHN0YXRlKSB7XG4gICAgICB2YXIgZSA9IHN0YXRlWzBdLCBvID0gc3RhdGVbMV07XG4gICAgICBvLm9uRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgVGhyb3dTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wLnNjaGVkdWxlci5zY2hlZHVsZShbdGhpcy5wLmVycm9yLCB0aGlzLm9dLCBzY2hlZHVsZUl0ZW0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gVGhyb3dPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgLyoqXG4gICAqICBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCB0ZXJtaW5hdGVzIHdpdGggYW4gZXhjZXB0aW9uLCB1c2luZyB0aGUgc3BlY2lmaWVkIHNjaGVkdWxlciB0byBzZW5kIG91dCB0aGUgc2luZ2xlIG9uRXJyb3IgbWVzc2FnZS5cbiAgICogIFRoZXJlIGlzIGFuIGFsaWFzIHRvIHRoaXMgbWV0aG9kIGNhbGxlZCAndGhyb3dFcnJvcicgZm9yIGJyb3dzZXJzIDxJRTkuXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGVycm9yIEFuIG9iamVjdCB1c2VkIGZvciB0aGUgc2VxdWVuY2UncyB0ZXJtaW5hdGlvbi5cbiAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciBTY2hlZHVsZXIgdG8gc2VuZCB0aGUgZXhjZXB0aW9uYWwgdGVybWluYXRpb24gY2FsbCBvbi4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gU2NoZWR1bGVyLmltbWVkaWF0ZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgdGVybWluYXRlcyBleGNlcHRpb25hbGx5IHdpdGggdGhlIHNwZWNpZmllZCBleGNlcHRpb24gb2JqZWN0LlxuICAgKi9cbiAgdmFyIG9ic2VydmFibGVUaHJvdyA9IE9ic2VydmFibGVbJ3Rocm93J10gPSBmdW5jdGlvbiAoZXJyb3IsIHNjaGVkdWxlcikge1xuICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGltbWVkaWF0ZVNjaGVkdWxlcik7XG4gICAgcmV0dXJuIG5ldyBUaHJvd09ic2VydmFibGUoZXJyb3IsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgdmFyIENhdGNoT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQ2F0Y2hPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIENhdGNoT2JzZXJ2YWJsZShzb3VyY2UsIGZuKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuX2ZuID0gZm47XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBDYXRjaE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGQxID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksIHN1YnNjcmlwdGlvbiA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG4gICAgICBzdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZShkMSk7XG4gICAgICBkMS5zZXREaXNwb3NhYmxlKHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgQ2F0Y2hPYnNlcnZlcihvLCBzdWJzY3JpcHRpb24sIHRoaXMuX2ZuKSkpO1xuICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENhdGNoT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBDYXRjaE9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKENhdGNoT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ2F0Y2hPYnNlcnZlcihvLCBzLCBmbikge1xuICAgICAgdGhpcy5fbyA9IG87XG4gICAgICB0aGlzLl9zID0gcztcbiAgICAgIHRoaXMuX2ZuID0gZm47XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBDYXRjaE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHsgdGhpcy5fby5vbk5leHQoeCk7IH07XG4gICAgQ2F0Y2hPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuICAgIENhdGNoT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnlDYXRjaCh0aGlzLl9mbikoZSk7XG4gICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlc3VsdC5lKTsgfVxuICAgICAgaXNQcm9taXNlKHJlc3VsdCkgJiYgKHJlc3VsdCA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShyZXN1bHQpKTtcblxuICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIHRoaXMuX3Muc2V0RGlzcG9zYWJsZShkKTtcbiAgICAgIGQuc2V0RGlzcG9zYWJsZShyZXN1bHQuc3Vic2NyaWJlKHRoaXMuX28pKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENhdGNoT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiBDb250aW51ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZXhjZXB0aW9uIHdpdGggdGhlIG5leHQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogQHBhcmFtIHtNaXhlZH0gaGFuZGxlck9yU2Vjb25kIEV4Y2VwdGlvbiBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGdpdmVuIHRoZSBlcnJvciB0aGF0IG9jY3VycmVkIGluIHRoZSBmaXJzdCBzZXF1ZW5jZSwgb3IgYSBzZWNvbmQgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB1c2VkIHRvIHByb2R1Y2UgcmVzdWx0cyB3aGVuIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgZmlyc3Qgc2VxdWVuY2UncyBlbGVtZW50cywgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzIG9mIHRoZSBoYW5kbGVyIHNlcXVlbmNlIGluIGNhc2UgYW4gZXhjZXB0aW9uIG9jY3VycmVkLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvWydjYXRjaCddID0gZnVuY3Rpb24gKGhhbmRsZXJPclNlY29uZCkge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKGhhbmRsZXJPclNlY29uZCkgPyBuZXcgQ2F0Y2hPYnNlcnZhYmxlKHRoaXMsIGhhbmRsZXJPclNlY29uZCkgOiBvYnNlcnZhYmxlQ2F0Y2goW3RoaXMsIGhhbmRsZXJPclNlY29uZF0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb250aW51ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZXhjZXB0aW9uIHdpdGggdGhlIG5leHQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogQHBhcmFtIHtBcnJheSB8IEFyZ3VtZW50c30gYXJncyBBcmd1bWVudHMgb3IgYW4gYXJyYXkgdG8gdXNlIGFzIHRoZSBuZXh0IHNlcXVlbmNlIGlmIGFuIGVycm9yIG9jY3Vycy5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyBlbGVtZW50cyBmcm9tIGNvbnNlY3V0aXZlIHNvdXJjZSBzZXF1ZW5jZXMgdW50aWwgYSBzb3VyY2Ugc2VxdWVuY2UgdGVybWluYXRlcyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICB2YXIgb2JzZXJ2YWJsZUNhdGNoID0gT2JzZXJ2YWJsZVsnY2F0Y2gnXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaXRlbXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgaXRlbXMgPSBhcmd1bWVudHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaXRlbXMgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBpdGVtc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIH1cbiAgICByZXR1cm4gZW51bWVyYWJsZU9mKGl0ZW1zKS5jYXRjaEVycm9yKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gb25lIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgdXNpbmcgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHdoZW5ldmVyIGFueSBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgb3IgUHJvbWlzZXMgcHJvZHVjZXMgYW4gZWxlbWVudC5cbiAgICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYW4gYXJndW1lbnQgbGlzdCBvZiBvYnNlcnZhYmxlcyBvciBhbiBhcnJheS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogMSAtIG9icyA9IG9ic2VydmFibGUuY29tYmluZUxhdGVzdChvYnMxLCBvYnMyLCBvYnMzLCBmdW5jdGlvbiAobzEsIG8yLCBvMykgeyByZXR1cm4gbzEgKyBvMiArIG8zOyB9KTtcbiAgICogMiAtIG9icyA9IG9ic2VydmFibGUuY29tYmluZUxhdGVzdChbb2JzMSwgb2JzMiwgb2JzM10sIGZ1bmN0aW9uIChvMSwgbzIsIG8zKSB7IHJldHVybiBvMSArIG8yICsgbzM7IH0pO1xuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY29tYmluaW5nIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2VzIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVzdWx0IHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLmNvbWJpbmVMYXRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XG4gICAgICBhcmdzWzBdLnVuc2hpZnQodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QuYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gZmFsc2VGYWN0b3J5KCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgZnVuY3Rpb24gYXJndW1lbnRzVG9BcnJheSgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgcmV0dXJuIGFyZ3M7XG4gIH1cblxuICB2YXIgQ29tYmluZUxhdGVzdE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQ29tYmluZUxhdGVzdE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ29tYmluZUxhdGVzdE9ic2VydmFibGUocGFyYW1zLCBjYikge1xuICAgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuICAgICAgdGhpcy5fY2IgPSBjYjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIENvbWJpbmVMYXRlc3RPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBsZW4gPSB0aGlzLl9wYXJhbXMubGVuZ3RoLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXkobGVuKTtcblxuICAgICAgdmFyIHN0YXRlID0ge1xuICAgICAgICBoYXNWYWx1ZTogYXJyYXlJbml0aWFsaXplKGxlbiwgZmFsc2VGYWN0b3J5KSxcbiAgICAgICAgaGFzVmFsdWVBbGw6IGZhbHNlLFxuICAgICAgICBpc0RvbmU6IGFycmF5SW5pdGlhbGl6ZShsZW4sIGZhbHNlRmFjdG9yeSksXG4gICAgICAgIHZhbHVlczogbmV3IEFycmF5KGxlbilcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuX3BhcmFtc1tpXSwgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgICAgIHN1YnNjcmlwdGlvbnNbaV0gPSBzYWQ7XG4gICAgICAgIGlzUHJvbWlzZShzb3VyY2UpICYmIChzb3VyY2UgPSBvYnNlcnZhYmxlRnJvbVByb21pc2Uoc291cmNlKSk7XG4gICAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUobmV3IENvbWJpbmVMYXRlc3RPYnNlcnZlcihvYnNlcnZlciwgaSwgdGhpcy5fY2IsIHN0YXRlKSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IE5BcnlEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbnMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gQ29tYmluZUxhdGVzdE9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgQ29tYmluZUxhdGVzdE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhDb21iaW5lTGF0ZXN0T2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ29tYmluZUxhdGVzdE9ic2VydmVyKG8sIGksIGNiLCBzdGF0ZSkge1xuICAgICAgdGhpcy5fbyA9IG87XG4gICAgICB0aGlzLl9pID0gaTtcbiAgICAgIHRoaXMuX2NiID0gY2I7XG4gICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm90VGhlU2FtZShpKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHgsIGopIHtcbiAgICAgICAgcmV0dXJuIGogIT09IGk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIENvbWJpbmVMYXRlc3RPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB0aGlzLl9zdGF0ZS52YWx1ZXNbdGhpcy5faV0gPSB4O1xuICAgICAgdGhpcy5fc3RhdGUuaGFzVmFsdWVbdGhpcy5faV0gPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuX3N0YXRlLmhhc1ZhbHVlQWxsIHx8ICh0aGlzLl9zdGF0ZS5oYXNWYWx1ZUFsbCA9IHRoaXMuX3N0YXRlLmhhc1ZhbHVlLmV2ZXJ5KGlkZW50aXR5KSkpIHtcbiAgICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMuX2NiKS5hcHBseShudWxsLCB0aGlzLl9zdGF0ZS52YWx1ZXMpO1xuICAgICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgICB0aGlzLl9vLm9uTmV4dChyZXMpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9zdGF0ZS5pc0RvbmUuZmlsdGVyKG5vdFRoZVNhbWUodGhpcy5faSkpLmV2ZXJ5KGlkZW50aXR5KSkge1xuICAgICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIENvbWJpbmVMYXRlc3RPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuICAgIH07XG5cbiAgICBDb21iaW5lTGF0ZXN0T2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX3N0YXRlLmlzRG9uZVt0aGlzLl9pXSA9IHRydWU7XG4gICAgICB0aGlzLl9zdGF0ZS5pc0RvbmUuZXZlcnkoaWRlbnRpdHkpICYmIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENvbWJpbmVMYXRlc3RPYnNlcnZlcjtcbiAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cbiAgLyoqXG4gICogTWVyZ2VzIHRoZSBzcGVjaWZpZWQgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBvbmUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSB1c2luZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gd2hlbmV2ZXIgYW55IG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlcyBvciBQcm9taXNlcyBwcm9kdWNlcyBhbiBlbGVtZW50LlxuICAqXG4gICogQGV4YW1wbGVcbiAgKiAxIC0gb2JzID0gUnguT2JzZXJ2YWJsZS5jb21iaW5lTGF0ZXN0KG9iczEsIG9iczIsIG9iczMsIGZ1bmN0aW9uIChvMSwgbzIsIG8zKSB7IHJldHVybiBvMSArIG8yICsgbzM7IH0pO1xuICAqIDIgLSBvYnMgPSBSeC5PYnNlcnZhYmxlLmNvbWJpbmVMYXRlc3QoW29iczEsIG9iczIsIG9iczNdLCBmdW5jdGlvbiAobzEsIG8yLCBvMykgeyByZXR1cm4gbzEgKyBvMiArIG8zOyB9KTtcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY29tYmluaW5nIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2VzIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVzdWx0IHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAqL1xuICB2YXIgY29tYmluZUxhdGVzdCA9IE9ic2VydmFibGUuY29tYmluZUxhdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgdmFyIHJlc3VsdFNlbGVjdG9yID0gaXNGdW5jdGlvbihhcmdzW2xlbiAtIDFdKSA/IGFyZ3MucG9wKCkgOiBhcmd1bWVudHNUb0FycmF5O1xuICAgIEFycmF5LmlzQXJyYXkoYXJnc1swXSkgJiYgKGFyZ3MgPSBhcmdzWzBdKTtcbiAgICByZXR1cm4gbmV3IENvbWJpbmVMYXRlc3RPYnNlcnZhYmxlKGFyZ3MsIHJlc3VsdFNlbGVjdG9yKTtcbiAgfTtcblxuICAvKipcbiAgICogQ29uY2F0ZW5hdGVzIGFsbCB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuICBUaGlzIHRha2VzIGluIGVpdGhlciBhbiBhcnJheSBvciB2YXJpYWJsZSBhcmd1bWVudHMgdG8gY29uY2F0ZW5hdGUuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGVhY2ggZ2l2ZW4gc2VxdWVuY2UsIGluIHNlcXVlbnRpYWwgb3JkZXIuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uY29uY2F0ID0gZnVuY3Rpb24gKCkge1xuICAgIGZvcih2YXIgYXJncyA9IFtdLCBpID0gMCwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOyB9XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiBvYnNlcnZhYmxlQ29uY2F0LmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9O1xuXG4gIHZhciBDb25jYXRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKENvbmNhdE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ29uY2F0T2JzZXJ2YWJsZShzb3VyY2VzKSB7XG4gICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgQ29uY2F0T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uKG8pIHtcbiAgICAgIHZhciBzaW5rID0gbmV3IENvbmNhdFNpbmsodGhpcy5zb3VyY2VzLCBvKTtcbiAgICAgIHJldHVybiBzaW5rLnJ1bigpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBDb25jYXRTaW5rKHNvdXJjZXMsIG8pIHtcbiAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7XG4gICAgICB0aGlzLm8gPSBvO1xuICAgIH1cbiAgICBDb25jYXRTaW5rLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaXNEaXNwb3NlZCwgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKSwgc291cmNlcyA9IHRoaXMuc291cmNlcywgbGVuZ3RoID0gc291cmNlcy5sZW5ndGgsIG8gPSB0aGlzLm87XG4gICAgICB2YXIgY2FuY2VsYWJsZSA9IGltbWVkaWF0ZVNjaGVkdWxlci5zY2hlZHVsZVJlY3Vyc2l2ZSgwLCBmdW5jdGlvbiAoaSwgc2VsZikge1xuICAgICAgICBpZiAoaXNEaXNwb3NlZCkgeyByZXR1cm47IH1cbiAgICAgICAgaWYgKGkgPT09IGxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBvLm9uQ29tcGxldGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBwcm9taXNlXG4gICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBzb3VyY2VzW2ldO1xuICAgICAgICBpc1Byb21pc2UoY3VycmVudFZhbHVlKSAmJiAoY3VycmVudFZhbHVlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKGN1cnJlbnRWYWx1ZSkpO1xuXG4gICAgICAgIHZhciBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKGQpO1xuICAgICAgICBkLnNldERpc3Bvc2FibGUoY3VycmVudFZhbHVlLnN1YnNjcmliZShcbiAgICAgICAgICBmdW5jdGlvbiAoeCkgeyBvLm9uTmV4dCh4KTsgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sXG4gICAgICAgICAgZnVuY3Rpb24gKCkgeyBzZWxmKGkgKyAxKTsgfVxuICAgICAgICApKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoc3Vic2NyaXB0aW9uLCBjYW5jZWxhYmxlLCBkaXNwb3NhYmxlQ3JlYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICB9KSk7XG4gICAgfTtcblxuXG4gICAgcmV0dXJuIENvbmNhdE9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgICogQ29uY2F0ZW5hdGVzIGFsbCB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuXG4gICAqIEBwYXJhbSB7QXJyYXkgfCBBcmd1bWVudHN9IGFyZ3MgQXJndW1lbnRzIG9yIGFuIGFycmF5IHRvIGNvbmNhdCB0byB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgZWFjaCBnaXZlbiBzZXF1ZW5jZSwgaW4gc2VxdWVudGlhbCBvcmRlci5cbiAgICovXG4gIHZhciBvYnNlcnZhYmxlQ29uY2F0ID0gT2JzZXJ2YWJsZS5jb25jYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3M7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgYXJncyA9IGFyZ3VtZW50c1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ29uY2F0T2JzZXJ2YWJsZShhcmdzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ29uY2F0ZW5hdGVzIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugb2Ygb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGVhY2ggb2JzZXJ2ZWQgaW5uZXIgc2VxdWVuY2UsIGluIHNlcXVlbnRpYWwgb3JkZXIuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uY29uY2F0QWxsID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm1lcmdlKDEpO1xuICB9O1xuXG4gIHZhciBNZXJnZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKE1lcmdlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIE1lcmdlT2JzZXJ2YWJsZShzb3VyY2UsIG1heENvbmN1cnJlbnQpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5tYXhDb25jdXJyZW50ID0gbWF4Q29uY3VycmVudDtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIE1lcmdlT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uKG9ic2VydmVyKSB7XG4gICAgICB2YXIgZyA9IG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKCk7XG4gICAgICBnLmFkZCh0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IE1lcmdlT2JzZXJ2ZXIob2JzZXJ2ZXIsIHRoaXMubWF4Q29uY3VycmVudCwgZykpKTtcbiAgICAgIHJldHVybiBnO1xuICAgIH07XG5cbiAgICByZXR1cm4gTWVyZ2VPYnNlcnZhYmxlO1xuXG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgTWVyZ2VPYnNlcnZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWVyZ2VPYnNlcnZlcihvLCBtYXgsIGcpIHtcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLm1heCA9IG1heDtcbiAgICAgIHRoaXMuZyA9IGc7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMucSA9IFtdO1xuICAgICAgdGhpcy5hY3RpdmVDb3VudCA9IDA7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5oYW5kbGVTdWJzY3JpYmUgPSBmdW5jdGlvbiAoeHMpIHtcbiAgICAgIHZhciBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIHRoaXMuZy5hZGQoc2FkKTtcbiAgICAgIGlzUHJvbWlzZSh4cykgJiYgKHhzID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHhzKSk7XG4gICAgICBzYWQuc2V0RGlzcG9zYWJsZSh4cy5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIodGhpcywgc2FkKSkpO1xuICAgIH07XG4gICAgTWVyZ2VPYnNlcnZlci5wcm90b3R5cGUub25OZXh0ID0gZnVuY3Rpb24gKGlubmVyU291cmNlKSB7XG4gICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmKHRoaXMuYWN0aXZlQ291bnQgPCB0aGlzLm1heCkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ291bnQrKztcbiAgICAgICAgICB0aGlzLmhhbmRsZVN1YnNjcmliZShpbm5lclNvdXJjZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xLnB1c2goaW5uZXJTb3VyY2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgTWVyZ2VPYnNlcnZlci5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ291bnQgPT09IDAgJiYgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBNZXJnZU9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcbiAgICAgIE1lcmdlT2JzZXJ2ZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcblxuICAgICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihwYXJlbnQsIHNhZCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5zYWQgPSBzYWQ7XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBmdW5jdGlvbiAoeCkgeyBpZighdGhpcy5pc1N0b3BwZWQpIHsgdGhpcy5wYXJlbnQuby5vbk5leHQoeCk7IH0gfTtcbiAgICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgICAgIHBhcmVudC5nLnJlbW92ZSh0aGlzLnNhZCk7XG4gICAgICAgICAgaWYgKHBhcmVudC5xLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBhcmVudC5oYW5kbGVTdWJzY3JpYmUocGFyZW50LnEuc2hpZnQoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5hY3RpdmVDb3VudC0tO1xuICAgICAgICAgICAgcGFyZW50LmRvbmUgJiYgcGFyZW50LmFjdGl2ZUNvdW50ID09PSAwICYmIHBhcmVudC5vLm9uQ29tcGxldGVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH07XG4gICAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnBhcmVudC5vLm9uRXJyb3IoZSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gTWVyZ2VPYnNlcnZlcjtcbiAgfSgpKTtcblxuXG5cblxuXG4gIC8qKlxuICAqIE1lcmdlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9mIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgbGltaXRpbmcgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHN1YnNjcmlwdGlvbnMgdG8gaW5uZXIgc2VxdWVuY2VzLlxuICAqIE9yIG1lcmdlcyB0d28gb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBhIHNpbmdsZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqXG4gICogQGV4YW1wbGVcbiAgKiAxIC0gbWVyZ2VkID0gc291cmNlcy5tZXJnZSgxKTtcbiAgKiAyIC0gbWVyZ2VkID0gc291cmNlLm1lcmdlKG90aGVyU291cmNlKTtcbiAgKiBAcGFyYW0ge01peGVkfSBbbWF4Q29uY3VycmVudE9yT3RoZXJdIE1heGltdW0gbnVtYmVyIG9mIGlubmVyIG9ic2VydmFibGUgc2VxdWVuY2VzIGJlaW5nIHN1YnNjcmliZWQgdG8gY29uY3VycmVudGx5IG9yIHRoZSBzZWNvbmQgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBtZXJnZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBpbm5lciBzZXF1ZW5jZXMuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5tZXJnZSA9IGZ1bmN0aW9uIChtYXhDb25jdXJyZW50T3JPdGhlcikge1xuICAgIHJldHVybiB0eXBlb2YgbWF4Q29uY3VycmVudE9yT3RoZXIgIT09ICdudW1iZXInID9cbiAgICAgIG9ic2VydmFibGVNZXJnZSh0aGlzLCBtYXhDb25jdXJyZW50T3JPdGhlcikgOlxuICAgICAgbmV3IE1lcmdlT2JzZXJ2YWJsZSh0aGlzLCBtYXhDb25jdXJyZW50T3JPdGhlcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1lcmdlcyBhbGwgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gYSBzaW5nbGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogVGhlIHNjaGVkdWxlciBpcyBvcHRpb25hbCBhbmQgaWYgbm90IHNwZWNpZmllZCwgdGhlIGltbWVkaWF0ZSBzY2hlZHVsZXIgaXMgdXNlZC5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgbWVyZ2VzIHRoZSBlbGVtZW50cyBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMuXG4gICAqL1xuICB2YXIgb2JzZXJ2YWJsZU1lcmdlID0gT2JzZXJ2YWJsZS5tZXJnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2NoZWR1bGVyLCBzb3VyY2VzID0gW10sIGksIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKCFhcmd1bWVudHNbMF0pIHtcbiAgICAgIHNjaGVkdWxlciA9IGltbWVkaWF0ZVNjaGVkdWxlcjtcbiAgICAgIGZvcihpID0gMTsgaSA8IGxlbjsgaSsrKSB7IHNvdXJjZXMucHVzaChhcmd1bWVudHNbaV0pOyB9XG4gICAgfSBlbHNlIGlmIChpc1NjaGVkdWxlcihhcmd1bWVudHNbMF0pKSB7XG4gICAgICBzY2hlZHVsZXIgPSBhcmd1bWVudHNbMF07XG4gICAgICBmb3IoaSA9IDE7IGkgPCBsZW47IGkrKykgeyBzb3VyY2VzLnB1c2goYXJndW1lbnRzW2ldKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZXIgPSBpbW1lZGlhdGVTY2hlZHVsZXI7XG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeyBzb3VyY2VzLnB1c2goYXJndW1lbnRzW2ldKTsgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VzWzBdKSkge1xuICAgICAgc291cmNlcyA9IHNvdXJjZXNbMF07XG4gICAgfVxuICAgIHJldHVybiBvYnNlcnZhYmxlT2Yoc2NoZWR1bGVyLCBzb3VyY2VzKS5tZXJnZUFsbCgpO1xuICB9O1xuXG4gIHZhciBDb21wb3NpdGVFcnJvciA9IFJ4LkNvbXBvc2l0ZUVycm9yID0gZnVuY3Rpb24oZXJyb3JzKSB7XG4gICAgdGhpcy5pbm5lckVycm9ycyA9IGVycm9ycztcbiAgICB0aGlzLm1lc3NhZ2UgPSAnVGhpcyBjb250YWlucyBtdWx0aXBsZSBlcnJvcnMuIENoZWNrIHRoZSBpbm5lckVycm9ycyc7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgfTtcbiAgQ29tcG9zaXRlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuICBDb21wb3NpdGVFcnJvci5wcm90b3R5cGUubmFtZSA9ICdDb21wb3NpdGVFcnJvcic7XG5cbiAgdmFyIE1lcmdlRGVsYXlFcnJvck9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoTWVyZ2VEZWxheUVycm9yT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlKHNvdXJjZSkge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBncm91cCA9IG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKCksXG4gICAgICAgIG0gPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKSxcbiAgICAgICAgc3RhdGUgPSB7IGlzU3RvcHBlZDogZmFsc2UsIGVycm9yczogW10sIG86IG8gfTtcblxuICAgICAgZ3JvdXAuYWRkKG0pO1xuICAgICAgbS5zZXREaXNwb3NhYmxlKHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgTWVyZ2VEZWxheUVycm9yT2JzZXJ2ZXIoZ3JvdXAsIHN0YXRlKSkpO1xuXG4gICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfTtcblxuICAgIHJldHVybiBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIE1lcmdlRGVsYXlFcnJvck9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKE1lcmdlRGVsYXlFcnJvck9ic2VydmVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIE1lcmdlRGVsYXlFcnJvck9ic2VydmVyKGdyb3VwLCBzdGF0ZSkge1xuICAgICAgdGhpcy5fZ3JvdXAgPSBncm91cDtcbiAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRDb21wbGV0aW9uKG8sIGVycm9ycykge1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgfSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIG8ub25FcnJvcihlcnJvcnNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgby5vbkVycm9yKG5ldyBDb21wb3NpdGVFcnJvcihlcnJvcnMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBNZXJnZURlbGF5RXJyb3JPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB2YXIgaW5uZXIgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIHRoaXMuX2dyb3VwLmFkZChpbm5lcik7XG5cbiAgICAgIC8vIENoZWNrIGZvciBwcm9taXNlcyBzdXBwb3J0XG4gICAgICBpc1Byb21pc2UoeCkgJiYgKHggPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoeCkpO1xuICAgICAgaW5uZXIuc2V0RGlzcG9zYWJsZSh4LnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihpbm5lciwgdGhpcy5fZ3JvdXAsIHRoaXMuX3N0YXRlKSkpO1xuICAgIH07XG5cbiAgICBNZXJnZURlbGF5RXJyb3JPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fc3RhdGUuZXJyb3JzLnB1c2goZSk7XG4gICAgICB0aGlzLl9zdGF0ZS5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fZ3JvdXAubGVuZ3RoID09PSAxICYmIHNldENvbXBsZXRpb24odGhpcy5fc3RhdGUubywgdGhpcy5fc3RhdGUuZXJyb3JzKTtcbiAgICB9O1xuXG4gICAgTWVyZ2VEZWxheUVycm9yT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX3N0YXRlLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICB0aGlzLl9ncm91cC5sZW5ndGggPT09IDEgJiYgc2V0Q29tcGxldGlvbih0aGlzLl9zdGF0ZS5vLCB0aGlzLl9zdGF0ZS5lcnJvcnMpO1xuICAgIH07XG5cbiAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIoaW5uZXIsIGdyb3VwLCBzdGF0ZSkge1xuICAgICAgdGhpcy5faW5uZXIgPSBpbm5lcjtcbiAgICAgIHRoaXMuX2dyb3VwID0gZ3JvdXA7XG4gICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7IHRoaXMuX3N0YXRlLm8ub25OZXh0KHgpOyB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX3N0YXRlLmVycm9ycy5wdXNoKGUpO1xuICAgICAgdGhpcy5fZ3JvdXAucmVtb3ZlKHRoaXMuX2lubmVyKTtcbiAgICAgIHRoaXMuX3N0YXRlLmlzU3RvcHBlZCAmJiB0aGlzLl9ncm91cC5sZW5ndGggPT09IDEgJiYgc2V0Q29tcGxldGlvbih0aGlzLl9zdGF0ZS5vLCB0aGlzLl9zdGF0ZS5lcnJvcnMpO1xuICAgIH07XG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZ3JvdXAucmVtb3ZlKHRoaXMuX2lubmVyKTtcbiAgICAgIHRoaXMuX3N0YXRlLmlzU3RvcHBlZCAmJiB0aGlzLl9ncm91cC5sZW5ndGggPT09IDEgJiYgc2V0Q29tcGxldGlvbih0aGlzLl9zdGF0ZS5vLCB0aGlzLl9zdGF0ZS5lcnJvcnMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gTWVyZ2VEZWxheUVycm9yT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAqIEZsYXR0ZW5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBPYnNlcnZhYmxlcyBpbnRvIG9uZSBPYnNlcnZhYmxlLCBpbiBhIHdheSB0aGF0IGFsbG93cyBhbiBPYnNlcnZlciB0b1xuICAqIHJlY2VpdmUgYWxsIHN1Y2Nlc3NmdWxseSBlbWl0dGVkIGl0ZW1zIGZyb20gYWxsIG9mIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZXMgd2l0aG91dCBiZWluZyBpbnRlcnJ1cHRlZCBieVxuICAqIGFuIGVycm9yIG5vdGlmaWNhdGlvbiBmcm9tIG9uZSBvZiB0aGVtLlxuICAqXG4gICogVGhpcyBiZWhhdmVzIGxpa2UgT2JzZXJ2YWJsZS5wcm90b3R5cGUubWVyZ2VBbGwgZXhjZXB0IHRoYXQgaWYgYW55IG9mIHRoZSBtZXJnZWQgT2JzZXJ2YWJsZXMgbm90aWZ5IG9mIGFuXG4gICogZXJyb3IgdmlhIHRoZSBPYnNlcnZlcidzIG9uRXJyb3IsIG1lcmdlRGVsYXlFcnJvciB3aWxsIHJlZnJhaW4gZnJvbSBwcm9wYWdhdGluZyB0aGF0XG4gICogZXJyb3Igbm90aWZpY2F0aW9uIHVudGlsIGFsbCBvZiB0aGUgbWVyZ2VkIE9ic2VydmFibGVzIGhhdmUgZmluaXNoZWQgZW1pdHRpbmcgaXRlbXMuXG4gICogQHBhcmFtIHtBcnJheSB8IEFyZ3VtZW50c30gYXJncyBBcmd1bWVudHMgb3IgYW4gYXJyYXkgdG8gbWVyZ2UuXG4gICogQHJldHVybnMge09ic2VydmFibGV9IGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhbGwgb2YgdGhlIGl0ZW1zIGVtaXR0ZWQgYnkgdGhlIE9ic2VydmFibGVzIGVtaXR0ZWQgYnkgdGhlIE9ic2VydmFibGVcbiAgKi9cbiAgT2JzZXJ2YWJsZS5tZXJnZURlbGF5RXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmd1bWVudHNbMF0pKSB7XG4gICAgICBhcmdzID0gYXJndW1lbnRzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgfVxuICAgIHZhciBzb3VyY2UgPSBvYnNlcnZhYmxlT2YobnVsbCwgYXJncyk7XG4gICAgcmV0dXJuIG5ldyBNZXJnZURlbGF5RXJyb3JPYnNlcnZhYmxlKHNvdXJjZSk7XG4gIH07XG5cbiAgdmFyIE1lcmdlQWxsT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoTWVyZ2VBbGxPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXG4gICAgZnVuY3Rpb24gTWVyZ2VBbGxPYnNlcnZhYmxlKHNvdXJjZSkge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBNZXJnZUFsbE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBnID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKSwgbSA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuICAgICAgZy5hZGQobSk7XG4gICAgICBtLnNldERpc3Bvc2FibGUodGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBNZXJnZUFsbE9ic2VydmVyKG9ic2VydmVyLCBnKSkpO1xuICAgICAgcmV0dXJuIGc7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIE1lcmdlQWxsT2JzZXJ2ZXIobywgZykge1xuICAgICAgdGhpcy5vID0gbztcbiAgICAgIHRoaXMuZyA9IGc7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgfVxuICAgIE1lcmdlQWxsT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uKGlubmVyU291cmNlKSB7XG4gICAgICBpZih0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cbiAgICAgIHZhciBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIHRoaXMuZy5hZGQoc2FkKTtcblxuICAgICAgaXNQcm9taXNlKGlubmVyU291cmNlKSAmJiAoaW5uZXJTb3VyY2UgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UoaW5uZXJTb3VyY2UpKTtcblxuICAgICAgc2FkLnNldERpc3Bvc2FibGUoaW5uZXJTb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKHRoaXMsIHNhZCkpKTtcbiAgICB9O1xuICAgIE1lcmdlQWxsT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBNZXJnZUFsbE9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZy5sZW5ndGggPT09IDEgJiYgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBNZXJnZUFsbE9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcbiAgICBNZXJnZUFsbE9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm8ub25FcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihwYXJlbnQsIHNhZCkge1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB0aGlzLnNhZCA9IHNhZDtcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uTmV4dCA9IGZ1bmN0aW9uICh4KSB7IGlmICghdGhpcy5pc1N0b3BwZWQpIHsgdGhpcy5wYXJlbnQuby5vbk5leHQoeCk7IH0gfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uQ29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICBwYXJlbnQuZy5yZW1vdmUodGhpcy5zYWQpO1xuICAgICAgICBwYXJlbnQuZG9uZSAmJiBwYXJlbnQuZy5sZW5ndGggPT09IDEgJiYgcGFyZW50Lm8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOyB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE1lcmdlQWxsT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIC8qKlxuICAqIE1lcmdlcyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9mIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBtZXJnZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBpbm5lciBzZXF1ZW5jZXMuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5tZXJnZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IE1lcmdlQWxsT2JzZXJ2YWJsZSh0aGlzKTtcbiAgfTtcblxuICB2YXIgU2tpcFVudGlsT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhTa2lwVW50aWxPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXG4gICAgZnVuY3Rpb24gU2tpcFVudGlsT2JzZXJ2YWJsZShzb3VyY2UsIG90aGVyKSB7XG4gICAgICB0aGlzLl9zID0gc291cmNlO1xuICAgICAgdGhpcy5fbyA9IGlzUHJvbWlzZShvdGhlcikgPyBvYnNlcnZhYmxlRnJvbVByb21pc2Uob3RoZXIpIDogb3RoZXI7XG4gICAgICB0aGlzLl9vcGVuID0gZmFsc2U7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBTa2lwVW50aWxPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24obykge1xuICAgICAgdmFyIGxlZnRTdWJzY3JpcHRpb24gPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIGxlZnRTdWJzY3JpcHRpb24uc2V0RGlzcG9zYWJsZSh0aGlzLl9zLnN1YnNjcmliZShuZXcgU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIobywgdGhpcykpKTtcblxuICAgICAgaXNQcm9taXNlKHRoaXMuX28pICYmICh0aGlzLl9vID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHRoaXMuX28pKTtcblxuICAgICAgdmFyIHJpZ2h0U3Vic2NyaXB0aW9uID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgICByaWdodFN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKHRoaXMuX28uc3Vic2NyaWJlKG5ldyBTa2lwVW50aWxPdGhlck9ic2VydmVyKG8sIHRoaXMsIHJpZ2h0U3Vic2NyaXB0aW9uKSkpO1xuXG4gICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUobGVmdFN1YnNjcmlwdGlvbiwgcmlnaHRTdWJzY3JpcHRpb24pO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2tpcFVudGlsT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBTa2lwVW50aWxTb3VyY2VPYnNlcnZlciA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhTa2lwVW50aWxTb3VyY2VPYnNlcnZlciwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTa2lwVW50aWxTb3VyY2VPYnNlcnZlcihvLCBwKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3AgPSBwO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgdGhpcy5fcC5fb3BlbiAmJiB0aGlzLl9vLm9uTmV4dCh4KTtcbiAgICB9O1xuXG4gICAgU2tpcFVudGlsU291cmNlT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGVycik7XG4gICAgfTtcblxuICAgIFNraXBVbnRpbFNvdXJjZU9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX3AuX29wZW4gJiYgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2tpcFVudGlsU291cmNlT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIHZhciBTa2lwVW50aWxPdGhlck9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFNraXBVbnRpbE90aGVyT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gU2tpcFVudGlsT3RoZXJPYnNlcnZlcihvLCBwLCByKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3AgPSBwO1xuICAgICAgdGhpcy5fciA9IHI7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBTa2lwVW50aWxPdGhlck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fcC5fb3BlbiA9IHRydWU7XG4gICAgICB0aGlzLl9yLmRpc3Bvc2UoKTtcbiAgICB9O1xuXG4gICAgU2tpcFVudGlsT3RoZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICB0aGlzLl9vLm9uRXJyb3IoZXJyKTtcbiAgICB9O1xuXG4gICAgU2tpcFVudGlsT3RoZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9yLmRpc3Bvc2UoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFNraXBVbnRpbE90aGVyT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2Ugb25seSBhZnRlciB0aGUgb3RoZXIgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBwcm9kdWNlcyBhIHZhbHVlLlxuICAgKiBAcGFyYW0ge09ic2VydmFibGUgfCBQcm9taXNlfSBvdGhlciBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvciBQcm9taXNlIHRoYXQgdHJpZ2dlcnMgcHJvcGFnYXRpb24gb2YgZWxlbWVudHMgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZSBzdGFydGluZyBmcm9tIHRoZSBwb2ludCB0aGUgb3RoZXIgc2VxdWVuY2UgdHJpZ2dlcmVkIHByb3BhZ2F0aW9uLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnNraXBVbnRpbCA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgIHJldHVybiBuZXcgU2tpcFVudGlsT2JzZXJ2YWJsZSh0aGlzLCBvdGhlcik7XG4gIH07XG5cbiAgdmFyIFN3aXRjaE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoU3dpdGNoT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTd2l0Y2hPYnNlcnZhYmxlKHNvdXJjZSkge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBTd2l0Y2hPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBpbm5lciA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksIHMgPSB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IFN3aXRjaE9ic2VydmVyKG8sIGlubmVyKSk7XG4gICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUocywgaW5uZXIpO1xuICAgIH07XG5cbiAgICBpbmhlcml0cyhTd2l0Y2hPYnNlcnZlciwgQWJzdHJhY3RPYnNlcnZlcik7XG4gICAgZnVuY3Rpb24gU3dpdGNoT2JzZXJ2ZXIobywgaW5uZXIpIHtcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgICB0aGlzLnN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMubGF0ZXN0ID0gMDtcbiAgICAgIHRoaXMuaGFzTGF0ZXN0ID0gZmFsc2U7XG4gICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgU3dpdGNoT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoaW5uZXJTb3VyY2UpIHtcbiAgICAgIHZhciBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksIGlkID0gKyt0aGlzLmxhdGVzdDtcbiAgICAgIHRoaXMuaGFzTGF0ZXN0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5uZXIuc2V0RGlzcG9zYWJsZShkKTtcbiAgICAgIGlzUHJvbWlzZShpbm5lclNvdXJjZSkgJiYgKGlubmVyU291cmNlID0gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKGlubmVyU291cmNlKSk7XG4gICAgICBkLnNldERpc3Bvc2FibGUoaW5uZXJTb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKHRoaXMsIGlkKSkpO1xuICAgIH07XG5cbiAgICBTd2l0Y2hPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG4gICAgfTtcblxuICAgIFN3aXRjaE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgIXRoaXMuaGFzTGF0ZXN0ICYmIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuICAgIH07XG5cbiAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcbiAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKHBhcmVudCwgaWQpIHtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuICAgIH1cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHRoaXMucGFyZW50LmxhdGVzdCA9PT0gdGhpcy5pZCAmJiB0aGlzLnBhcmVudC5vLm9uTmV4dCh4KTtcbiAgICB9O1xuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5wYXJlbnQubGF0ZXN0ID09PSB0aGlzLmlkICYmIHRoaXMucGFyZW50Lm8ub25FcnJvcihlKTtcbiAgICB9O1xuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50LmxhdGVzdCA9PT0gdGhpcy5pZCkge1xuICAgICAgICB0aGlzLnBhcmVudC5oYXNMYXRlc3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYXJlbnQuaXNTdG9wcGVkICYmIHRoaXMucGFyZW50Lm8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFN3aXRjaE9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgKiBUcmFuc2Zvcm1zIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugb2Ygb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2luZyB2YWx1ZXMgb25seSBmcm9tIHRoZSBtb3N0IHJlY2VudCBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGF0IGFueSBwb2ludCBpbiB0aW1lIHByb2R1Y2VzIHRoZSBlbGVtZW50cyBvZiB0aGUgbW9zdCByZWNlbnQgaW5uZXIgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGhhcyBiZWVuIHJlY2VpdmVkLlxuICAqL1xuICBvYnNlcnZhYmxlUHJvdG9bJ3N3aXRjaCddID0gb2JzZXJ2YWJsZVByb3RvLnN3aXRjaExhdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFN3aXRjaE9ic2VydmFibGUodGhpcyk7XG4gIH07XG5cbiAgdmFyIFRha2VVbnRpbE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoVGFrZVVudGlsT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIFRha2VVbnRpbE9ic2VydmFibGUoc291cmNlLCBvdGhlcikge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aGlzLm90aGVyID0gaXNQcm9taXNlKG90aGVyKSA/IG9ic2VydmFibGVGcm9tUHJvbWlzZShvdGhlcikgOiBvdGhlcjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFRha2VVbnRpbE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG4gICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoXG4gICAgICAgIHRoaXMuc291cmNlLnN1YnNjcmliZShvKSxcbiAgICAgICAgdGhpcy5vdGhlci5zdWJzY3JpYmUobmV3IFRha2VVbnRpbE9ic2VydmVyKG8pKVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRha2VVbnRpbE9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgVGFrZVVudGlsT2JzZXJ2ZXIgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoVGFrZVVudGlsT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gVGFrZVVudGlsT2JzZXJ2ZXIobykge1xuICAgICAgdGhpcy5fbyA9IG87XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBUYWtlVW50aWxPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcbiAgICB9O1xuXG4gICAgVGFrZVVudGlsT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGVycik7XG4gICAgfTtcblxuICAgIFRha2VVbnRpbE9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IG5vb3A7XG5cbiAgICByZXR1cm4gVGFrZVVudGlsT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2UgdW50aWwgdGhlIG90aGVyIG9ic2VydmFibGUgc2VxdWVuY2UgcHJvZHVjZXMgYSB2YWx1ZS5cbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlIHwgUHJvbWlzZX0gb3RoZXIgT2JzZXJ2YWJsZSBzZXF1ZW5jZSBvciBQcm9taXNlIHRoYXQgdGVybWluYXRlcyBwcm9wYWdhdGlvbiBvZiBlbGVtZW50cyBvZiB0aGUgc291cmNlIHNlcXVlbmNlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgc291cmNlIHNlcXVlbmNlIHVwIHRvIHRoZSBwb2ludCB0aGUgb3RoZXIgc2VxdWVuY2UgaW50ZXJydXB0ZWQgZnVydGhlciBwcm9wYWdhdGlvbi5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by50YWtlVW50aWwgPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICByZXR1cm4gbmV3IFRha2VVbnRpbE9ic2VydmFibGUodGhpcywgb3RoZXIpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGZhbHNlRmFjdG9yeSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGZ1bmN0aW9uIGFyZ3VtZW50c1RvQXJyYXkoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgdmFyIFdpdGhMYXRlc3RGcm9tT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhXaXRoTGF0ZXN0RnJvbU9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gV2l0aExhdGVzdEZyb21PYnNlcnZhYmxlKHNvdXJjZSwgc291cmNlcywgcmVzdWx0U2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuX3MgPSBzb3VyY2U7XG4gICAgICB0aGlzLl9zcyA9IHNvdXJjZXM7XG4gICAgICB0aGlzLl9jYiA9IHJlc3VsdFNlbGVjdG9yO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgV2l0aExhdGVzdEZyb21PYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBsZW4gPSB0aGlzLl9zcy5sZW5ndGg7XG4gICAgICB2YXIgc3RhdGUgPSB7XG4gICAgICAgIGhhc1ZhbHVlOiBhcnJheUluaXRpYWxpemUobGVuLCBmYWxzZUZhY3RvcnkpLFxuICAgICAgICBoYXNWYWx1ZUFsbDogZmFsc2UsXG4gICAgICAgIHZhbHVlczogbmV3IEFycmF5KGxlbilcbiAgICAgIH07XG5cbiAgICAgIHZhciBuID0gdGhpcy5fc3MubGVuZ3RoLCBzdWJzY3JpcHRpb25zID0gbmV3IEFycmF5KG4gKyAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBvdGhlciA9IHRoaXMuX3NzW2ldLCBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgaXNQcm9taXNlKG90aGVyKSAmJiAob3RoZXIgPSBvYnNlcnZhYmxlRnJvbVByb21pc2Uob3RoZXIpKTtcbiAgICAgICAgc2FkLnNldERpc3Bvc2FibGUob3RoZXIuc3Vic2NyaWJlKG5ldyBXaXRoTGF0ZXN0RnJvbU90aGVyT2JzZXJ2ZXIobywgaSwgc3RhdGUpKSk7XG4gICAgICAgIHN1YnNjcmlwdGlvbnNbaV0gPSBzYWQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHRoaXMuX3Muc3Vic2NyaWJlKG5ldyBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyKG8sIHRoaXMuX2NiLCBzdGF0ZSkpKTtcbiAgICAgIHN1YnNjcmlwdGlvbnNbbl0gPSBzYWQ7XG5cbiAgICAgIHJldHVybiBuZXcgTkFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9ucyk7XG4gICAgfTtcblxuICAgIHJldHVybiBXaXRoTGF0ZXN0RnJvbU9ic2VydmFibGU7XG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICB2YXIgV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhXaXRoTGF0ZXN0RnJvbU90aGVyT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyKG8sIGksIHN0YXRlKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX2kgPSBpO1xuICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFdpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB0aGlzLl9zdGF0ZS52YWx1ZXNbdGhpcy5faV0gPSB4O1xuICAgICAgdGhpcy5fc3RhdGUuaGFzVmFsdWVbdGhpcy5faV0gPSB0cnVlO1xuICAgICAgdGhpcy5fc3RhdGUuaGFzVmFsdWVBbGwgPSB0aGlzLl9zdGF0ZS5oYXNWYWx1ZS5ldmVyeShpZGVudGl0eSk7XG4gICAgfTtcblxuICAgIFdpdGhMYXRlc3RGcm9tT3RoZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuICAgIH07XG5cbiAgICBXaXRoTGF0ZXN0RnJvbU90aGVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IG5vb3A7XG5cbiAgICByZXR1cm4gV2l0aExhdGVzdEZyb21PdGhlck9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICB2YXIgV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlciwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyKG8sIGNiLCBzdGF0ZSkge1xuICAgICAgdGhpcy5fbyA9IG87XG4gICAgICB0aGlzLl9jYiA9IGNiO1xuICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFdpdGhMYXRlc3RGcm9tU291cmNlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgdmFyIGFsbFZhbHVlcyA9IFt4XS5jb25jYXQodGhpcy5fc3RhdGUudmFsdWVzKTtcbiAgICAgIGlmICghdGhpcy5fc3RhdGUuaGFzVmFsdWVBbGwpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2godGhpcy5fY2IpLmFwcGx5KG51bGwsIGFsbFZhbHVlcyk7XG4gICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgdGhpcy5fby5vbk5leHQocmVzKTtcbiAgICB9O1xuXG4gICAgV2l0aExhdGVzdEZyb21Tb3VyY2VPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuICAgIH07XG5cbiAgICBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBXaXRoTGF0ZXN0RnJvbVNvdXJjZU9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogTWVyZ2VzIHRoZSBzcGVjaWZpZWQgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBvbmUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSB1c2luZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gb25seSB3aGVuIHRoZSAoZmlyc3QpIHNvdXJjZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2VzIGFuIGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIHNvdXJjZXMgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8ud2l0aExhdGVzdEZyb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50cycpOyB9XG5cbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgdmFyIHJlc3VsdFNlbGVjdG9yID0gaXNGdW5jdGlvbihhcmdzW2xlbiAtIDFdKSA/IGFyZ3MucG9wKCkgOiBhcmd1bWVudHNUb0FycmF5O1xuICAgIEFycmF5LmlzQXJyYXkoYXJnc1swXSkgJiYgKGFyZ3MgPSBhcmdzWzBdKTtcblxuICAgIHJldHVybiBuZXcgV2l0aExhdGVzdEZyb21PYnNlcnZhYmxlKHRoaXMsIGFyZ3MsIHJlc3VsdFNlbGVjdG9yKTtcbiAgfTtcblxuICBmdW5jdGlvbiBmYWxzZUZhY3RvcnkoKSB7IHJldHVybiBmYWxzZTsgfVxuICBmdW5jdGlvbiBlbXB0eUFycmF5RmFjdG9yeSgpIHsgcmV0dXJuIFtdOyB9XG5cbiAgdmFyIFppcE9ic2VydmFibGUgPSAoZnVuY3Rpb24oX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoWmlwT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBaaXBPYnNlcnZhYmxlKHNvdXJjZXMsIHJlc3VsdFNlbGVjdG9yKSB7XG4gICAgICB0aGlzLl9zID0gc291cmNlcztcbiAgICAgIHRoaXMuX2NiID0gcmVzdWx0U2VsZWN0b3I7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBaaXBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBuID0gdGhpcy5fcy5sZW5ndGgsXG4gICAgICAgICAgc3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheShuKTtcbiAgICAgICAgICBkb25lID0gYXJyYXlJbml0aWFsaXplKG4sIGZhbHNlRmFjdG9yeSksXG4gICAgICAgICAgcSA9IGFycmF5SW5pdGlhbGl6ZShuLCBlbXB0eUFycmF5RmFjdG9yeSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLl9zW2ldLCBzYWQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uc1tpXSA9IHNhZDtcbiAgICAgICAgaXNQcm9taXNlKHNvdXJjZSkgJiYgKHNvdXJjZSA9IG9ic2VydmFibGVGcm9tUHJvbWlzZShzb3VyY2UpKTtcbiAgICAgICAgc2FkLnNldERpc3Bvc2FibGUoc291cmNlLnN1YnNjcmliZShuZXcgWmlwT2JzZXJ2ZXIob2JzZXJ2ZXIsIGksIHRoaXMsIHEsIGRvbmUpKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgTkFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9ucyk7XG4gICAgfTtcblxuICAgIHJldHVybiBaaXBPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIFppcE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhaaXBPYnNlcnZlciwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBaaXBPYnNlcnZlcihvLCBpLCBwLCBxLCBkKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX2kgPSBpO1xuICAgICAgdGhpcy5fcCA9IHA7XG4gICAgICB0aGlzLl9xID0gcTtcbiAgICAgIHRoaXMuX2QgPSBkO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm90RW1wdHkoeCkgeyByZXR1cm4geC5sZW5ndGggPiAwOyB9XG4gICAgZnVuY3Rpb24gc2hpZnRFYWNoKHgpIHsgcmV0dXJuIHguc2hpZnQoKTsgfVxuICAgIGZ1bmN0aW9uIG5vdFRoZVNhbWUoaSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh4LCBqKSB7XG4gICAgICAgIHJldHVybiBqICE9PSBpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBaaXBPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB0aGlzLl9xW3RoaXMuX2ldLnB1c2goeCk7XG4gICAgICBpZiAodGhpcy5fcS5ldmVyeShub3RFbXB0eSkpIHtcbiAgICAgICAgdmFyIHF1ZXVlZFZhbHVlcyA9IHRoaXMuX3EubWFwKHNoaWZ0RWFjaCk7XG4gICAgICAgIHZhciByZXMgPSB0cnlDYXRjaCh0aGlzLl9wLl9jYikuYXBwbHkobnVsbCwgcXVldWVkVmFsdWVzKTtcbiAgICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuX28ub25FcnJvcihyZXMuZSk7IH1cbiAgICAgICAgdGhpcy5fby5vbk5leHQocmVzKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fZC5maWx0ZXIobm90VGhlU2FtZSh0aGlzLl9pKSkuZXZlcnkoaWRlbnRpdHkpKSB7XG4gICAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWmlwT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcbiAgICB9O1xuXG4gICAgWmlwT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2RbdGhpcy5faV0gPSB0cnVlO1xuICAgICAgdGhpcy5fZC5ldmVyeShpZGVudGl0eSkgJiYgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWmlwT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiBNZXJnZXMgdGhlIHNwZWNpZmllZCBvYnNlcnZhYmxlIHNlcXVlbmNlcyBpbnRvIG9uZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGJ5IHVzaW5nIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aGVuZXZlciBhbGwgb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2VzIG9yIGFuIGFycmF5IGhhdmUgcHJvZHVjZWQgYW4gZWxlbWVudCBhdCBhIGNvcnJlc3BvbmRpbmcgaW5kZXguXG4gICAqIFRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFyZ3VtZW50cyBtdXN0IGJlIGEgZnVuY3Rpb24gdG8gaW52b2tlIGZvciBlYWNoIHNlcmllcyBvZiBlbGVtZW50cyBhdCBjb3JyZXNwb25kaW5nIGluZGV4ZXMgaW4gdGhlIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIGFyZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uemlwID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7IHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudHMnKTsgfVxuXG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIHZhciByZXN1bHRTZWxlY3RvciA9IGlzRnVuY3Rpb24oYXJnc1tsZW4gLSAxXSkgPyBhcmdzLnBvcCgpIDogYXJndW1lbnRzVG9BcnJheTtcbiAgICBBcnJheS5pc0FycmF5KGFyZ3NbMF0pICYmIChhcmdzID0gYXJnc1swXSk7XG5cbiAgICB2YXIgcGFyZW50ID0gdGhpcztcbiAgICBhcmdzLnVuc2hpZnQocGFyZW50KTtcblxuICAgIHJldHVybiBuZXcgWmlwT2JzZXJ2YWJsZShhcmdzLCByZXN1bHRTZWxlY3Rvcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIG9ic2VydmFibGUgc2VxdWVuY2VzIGludG8gb25lIG9ic2VydmFibGUgc2VxdWVuY2UgYnkgdXNpbmcgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHdoZW5ldmVyIGFsbCBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaGF2ZSBwcm9kdWNlZCBhbiBlbGVtZW50IGF0IGEgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICogQHBhcmFtIGFyZ3VtZW50cyBPYnNlcnZhYmxlIHNvdXJjZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc3VsdFNlbGVjdG9yIEZ1bmN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBzZXJpZXMgb2YgZWxlbWVudHMgYXQgY29ycmVzcG9uZGluZyBpbmRleGVzIGluIHRoZSBzb3VyY2VzLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY29tYmluaW5nIGVsZW1lbnRzIG9mIHRoZSBzb3VyY2VzIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVzdWx0IHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKi9cbiAgT2JzZXJ2YWJsZS56aXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XG4gICAgICBhcmdzID0gaXNGdW5jdGlvbihhcmdzWzFdKSA/IGFyZ3NbMF0uY29uY2F0KGFyZ3NbMV0pIDogYXJnc1swXTtcbiAgICB9XG4gICAgdmFyIGZpcnN0ID0gYXJncy5zaGlmdCgpO1xuICAgIHJldHVybiBmaXJzdC56aXAuYXBwbHkoZmlyc3QsIGFyZ3MpO1xuICB9O1xuXG5mdW5jdGlvbiBmYWxzZUZhY3RvcnkoKSB7IHJldHVybiBmYWxzZTsgfVxuZnVuY3Rpb24gZW1wdHlBcnJheUZhY3RvcnkoKSB7IHJldHVybiBbXTsgfVxuZnVuY3Rpb24gYXJndW1lbnRzVG9BcnJheSgpIHtcbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbi8qKlxuICogTWVyZ2VzIHRoZSBzcGVjaWZpZWQgb2JzZXJ2YWJsZSBzZXF1ZW5jZXMgaW50byBvbmUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSB1c2luZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gd2hlbmV2ZXIgYWxsIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlcyBvciBhbiBhcnJheSBoYXZlIHByb2R1Y2VkIGFuIGVsZW1lbnQgYXQgYSBjb3JyZXNwb25kaW5nIGluZGV4LlxuICogVGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJndW1lbnRzIG11c3QgYmUgYSBmdW5jdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggc2VyaWVzIG9mIGVsZW1lbnRzIGF0IGNvcnJlc3BvbmRpbmcgaW5kZXhlcyBpbiB0aGUgYXJncy5cbiAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgZWxlbWVudHMgb2YgdGhlIGFyZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCByZXN1bHQgc2VsZWN0b3IgZnVuY3Rpb24uXG4gKi9cbm9ic2VydmFibGVQcm90by56aXBJdGVyYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50cycpOyB9XG5cbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cbiAgdmFyIHJlc3VsdFNlbGVjdG9yID0gaXNGdW5jdGlvbihhcmdzW2xlbiAtIDFdKSA/IGFyZ3MucG9wKCkgOiBhcmd1bWVudHNUb0FycmF5O1xuXG4gIHZhciBwYXJlbnQgPSB0aGlzO1xuICBhcmdzLnVuc2hpZnQocGFyZW50KTtcbiAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG4gICAgdmFyIG4gPSBhcmdzLmxlbmd0aCxcbiAgICAgIHF1ZXVlcyA9IGFycmF5SW5pdGlhbGl6ZShuLCBlbXB0eUFycmF5RmFjdG9yeSksXG4gICAgICBpc0RvbmUgPSBhcnJheUluaXRpYWxpemUobiwgZmFsc2VGYWN0b3J5KTtcblxuICAgIHZhciBzdWJzY3JpcHRpb25zID0gbmV3IEFycmF5KG4pO1xuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IG47IGlkeCsrKSB7XG4gICAgICAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3NbaV0sIHNhZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuXG4gICAgICAgIChpc0FycmF5TGlrZShzb3VyY2UpIHx8IGlzSXRlcmFibGUoc291cmNlKSkgJiYgKHNvdXJjZSA9IG9ic2VydmFibGVGcm9tKHNvdXJjZSkpO1xuXG4gICAgICAgIHNhZC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICBxdWV1ZXNbaV0ucHVzaCh4KTtcbiAgICAgICAgICBpZiAocXVldWVzLmV2ZXJ5KGZ1bmN0aW9uICh4KSB7IHJldHVybiB4Lmxlbmd0aCA+IDA7IH0pKSB7XG4gICAgICAgICAgICB2YXIgcXVldWVkVmFsdWVzID0gcXVldWVzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5zaGlmdCgpOyB9KSxcbiAgICAgICAgICAgICAgICByZXMgPSB0cnlDYXRjaChyZXN1bHRTZWxlY3RvcikuYXBwbHkocGFyZW50LCBxdWV1ZWRWYWx1ZXMpO1xuICAgICAgICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihyZXMuZSk7IH1cbiAgICAgICAgICAgIG8ub25OZXh0KHJlcyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0RvbmUuZmlsdGVyKGZ1bmN0aW9uICh4LCBqKSB7IHJldHVybiBqICE9PSBpOyB9KS5ldmVyeShpZGVudGl0eSkpIHtcbiAgICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlzRG9uZVtpXSA9IHRydWU7XG4gICAgICAgICAgaXNEb25lLmV2ZXJ5KGlkZW50aXR5KSAmJiBvLm9uQ29tcGxldGVkKCk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uc1tpXSA9IHNhZDtcbiAgICAgIH0pKGlkeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbnMpO1xuICB9LCBwYXJlbnQpO1xufTtcblxuICBmdW5jdGlvbiBhc09ic2VydmFibGUoc291cmNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHN1YnNjcmliZShvKSB7IHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG8pOyB9O1xuICB9XG5cbiAgLyoqXG4gICAqICBIaWRlcyB0aGUgaWRlbnRpdHkgb2YgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBoaWRlcyB0aGUgaWRlbnRpdHkgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5hc09ic2VydmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGFzT2JzZXJ2YWJsZSh0aGlzKSwgdGhpcyk7XG4gIH07XG5cbiAgdmFyIERlbWF0ZXJpYWxpemVPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhEZW1hdGVyaWFsaXplT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBEZW1hdGVyaWFsaXplT2JzZXJ2YWJsZShzb3VyY2UpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRGVtYXRlcmlhbGl6ZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgRGVtYXRlcmlhbGl6ZU9ic2VydmVyKG8pKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERlbWF0ZXJpYWxpemVPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIERlbWF0ZXJpYWxpemVPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoRGVtYXRlcmlhbGl6ZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXG4gICAgZnVuY3Rpb24gRGVtYXRlcmlhbGl6ZU9ic2VydmVyKG8pIHtcbiAgICAgIHRoaXMuX28gPSBvO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRGVtYXRlcmlhbGl6ZU9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHsgeC5hY2NlcHQodGhpcy5fbyk7IH07XG4gICAgRGVtYXRlcmlhbGl6ZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuX28ub25FcnJvcihlKTsgfTtcbiAgICBEZW1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuXG4gICAgcmV0dXJuIERlbWF0ZXJpYWxpemVPYnNlcnZlcjtcbiAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cbiAgLyoqXG4gICAqIERlbWF0ZXJpYWxpemVzIHRoZSBleHBsaWNpdCBub3RpZmljYXRpb24gdmFsdWVzIG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgaW1wbGljaXQgbm90aWZpY2F0aW9ucy5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgZXhoaWJpdGluZyB0aGUgYmVoYXZpb3IgY29ycmVzcG9uZGluZyB0byB0aGUgc291cmNlIHNlcXVlbmNlJ3Mgbm90aWZpY2F0aW9uIHZhbHVlcy5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5kZW1hdGVyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRGVtYXRlcmlhbGl6ZU9ic2VydmFibGUodGhpcyk7XG4gIH07XG5cbiAgdmFyIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZhYmxlKHNvdXJjZSwga2V5Rm4sIGNvbXBhcmVyKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMua2V5Rm4gPSBrZXlGbjtcbiAgICAgIHRoaXMuY29tcGFyZXIgPSBjb21wYXJlcjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyKG8sIHRoaXMua2V5Rm4sIHRoaXMuY29tcGFyZXIpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gRGlzdGluY3RVbnRpbENoYW5nZWRPYnNlcnZlcihvLCBrZXlGbiwgY29tcGFyZXIpIHtcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLmtleUZuID0ga2V5Rm47XG4gICAgICB0aGlzLmNvbXBhcmVyID0gY29tcGFyZXI7XG4gICAgICB0aGlzLmhhc0N1cnJlbnRLZXkgPSBmYWxzZTtcbiAgICAgIHRoaXMuY3VycmVudEtleSA9IG51bGw7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHZhciBrZXkgPSB4LCBjb21wYXJlckVxdWFscztcbiAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMua2V5Rm4pKSB7XG4gICAgICAgIGtleSA9IHRyeUNhdGNoKHRoaXMua2V5Rm4pKHgpO1xuICAgICAgICBpZiAoa2V5ID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5vLm9uRXJyb3Ioa2V5LmUpOyB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oYXNDdXJyZW50S2V5KSB7XG4gICAgICAgIGNvbXBhcmVyRXF1YWxzID0gdHJ5Q2F0Y2godGhpcy5jb21wYXJlcikodGhpcy5jdXJyZW50S2V5LCBrZXkpO1xuICAgICAgICBpZiAoY29tcGFyZXJFcXVhbHMgPT09IGVycm9yT2JqKSB7IHJldHVybiB0aGlzLm8ub25FcnJvcihjb21wYXJlckVxdWFscy5lKTsgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmhhc0N1cnJlbnRLZXkgfHwgIWNvbXBhcmVyRXF1YWxzKSB7XG4gICAgICAgIHRoaXMuaGFzQ3VycmVudEtleSA9IHRydWU7XG4gICAgICAgIHRoaXMuY3VycmVudEtleSA9IGtleTtcbiAgICAgICAgdGhpcy5vLm9uTmV4dCh4KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgdGhpcy5vLm9uRXJyb3IoZSk7XG4gICAgfTtcbiAgICBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLm8ub25Db21wbGV0ZWQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERpc3RpbmN0VW50aWxDaGFuZ2VkT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAqICBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyBvbmx5IGRpc3RpbmN0IGNvbnRpZ3VvdXMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBrZXlGbiBhbmQgdGhlIGNvbXBhcmVyLlxuICAqIEBwYXJhbSB7RnVuY3Rpb259IFtrZXlGbl0gQSBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSBjb21wYXJpc29uIGtleSBmb3IgZWFjaCBlbGVtZW50LiBJZiBub3QgcHJvdmlkZWQsIGl0IHByb2plY3RzIHRoZSB2YWx1ZS5cbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyZXJdIEVxdWFsaXR5IGNvbXBhcmVyIGZvciBjb21wdXRlZCBrZXkgdmFsdWVzLiBJZiBub3QgcHJvdmlkZWQsIGRlZmF1bHRzIHRvIGFuIGVxdWFsaXR5IGNvbXBhcmVyIGZ1bmN0aW9uLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9ubHkgY29udGFpbmluZyB0aGUgZGlzdGluY3QgY29udGlndW91cyBlbGVtZW50cywgYmFzZWQgb24gYSBjb21wdXRlZCBrZXkgdmFsdWUsIGZyb20gdGhlIHNvdXJjZSBzZXF1ZW5jZS5cbiAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLmRpc3RpbmN0VW50aWxDaGFuZ2VkID0gZnVuY3Rpb24gKGtleUZuLCBjb21wYXJlcikge1xuICAgIGNvbXBhcmVyIHx8IChjb21wYXJlciA9IGRlZmF1bHRDb21wYXJlcik7XG4gICAgcmV0dXJuIG5ldyBEaXN0aW5jdFVudGlsQ2hhbmdlZE9ic2VydmFibGUodGhpcywga2V5Rm4sIGNvbXBhcmVyKTtcbiAgfTtcblxuICB2YXIgVGFwT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUYXBPYnNlcnZhYmxlLF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gVGFwT2JzZXJ2YWJsZShzb3VyY2UsIG9ic2VydmVyT3JPbk5leHQsIG9uRXJyb3IsIG9uQ29tcGxldGVkKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuX29OID0gb2JzZXJ2ZXJPck9uTmV4dDtcbiAgICAgIHRoaXMuX29FID0gb25FcnJvcjtcbiAgICAgIHRoaXMuX29DID0gb25Db21wbGV0ZWQ7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBUYXBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24obykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzKSk7XG4gICAgfTtcblxuICAgIGluaGVyaXRzKElubmVyT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIobywgcCkge1xuICAgICAgdGhpcy5vID0gbztcbiAgICAgIHRoaXMudCA9ICFwLl9vTiB8fCBpc0Z1bmN0aW9uKHAuX29OKSA/XG4gICAgICAgIG9ic2VydmVyQ3JlYXRlKHAuX29OIHx8IG5vb3AsIHAuX29FIHx8IG5vb3AsIHAuX29DIHx8IG5vb3ApIDpcbiAgICAgICAgcC5fb047XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgQWJzdHJhY3RPYnNlcnZlci5jYWxsKHRoaXMpO1xuICAgIH1cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oeCkge1xuICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMudC5vbk5leHQpLmNhbGwodGhpcy50LCB4KTtcbiAgICAgIGlmIChyZXMgPT09IGVycm9yT2JqKSB7IHRoaXMuby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgdGhpcy5vLm9uTmV4dCh4KTtcbiAgICB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2godGhpcy50Lm9uRXJyb3IpLmNhbGwodGhpcy50LCBlcnIpO1xuICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgdGhpcy5vLm9uRXJyb3IoZXJyKTtcbiAgICB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMudC5vbkNvbXBsZXRlZCkuY2FsbCh0aGlzLnQpO1xuICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBUYXBPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgLyoqXG4gICogIEludm9rZXMgYW4gYWN0aW9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIG9ic2VydmFibGUgc2VxdWVuY2UgYW5kIGludm9rZXMgYW4gYWN0aW9uIHVwb24gZ3JhY2VmdWwgb3IgZXhjZXB0aW9uYWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICogIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcsIGxvZ2dpbmcsIGV0Yy4gb2YgcXVlcnkgYmVoYXZpb3IgYnkgaW50ZXJjZXB0aW5nIHRoZSBtZXNzYWdlIHN0cmVhbSB0byBydW4gYXJiaXRyYXJ5IGFjdGlvbnMgZm9yIG1lc3NhZ2VzIG9uIHRoZSBwaXBlbGluZS5cbiAgKiBAcGFyYW0ge0Z1bmN0aW9uIHwgT2JzZXJ2ZXJ9IG9ic2VydmVyT3JPbk5leHQgQWN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIG9yIGFuIG8uXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdICBBY3Rpb24gdG8gaW52b2tlIHVwb24gZXhjZXB0aW9uYWwgdGVybWluYXRpb24gb2YgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuIFVzZWQgaWYgb25seSB0aGUgb2JzZXJ2ZXJPck9uTmV4dCBwYXJhbWV0ZXIgaXMgYWxzbyBhIGZ1bmN0aW9uLlxuICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkNvbXBsZXRlZF0gIEFjdGlvbiB0byBpbnZva2UgdXBvbiBncmFjZWZ1bCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS4gVXNlZCBpZiBvbmx5IHRoZSBvYnNlcnZlck9yT25OZXh0IHBhcmFtZXRlciBpcyBhbHNvIGEgZnVuY3Rpb24uXG4gICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aCB0aGUgc2lkZS1lZmZlY3RpbmcgYmVoYXZpb3IgYXBwbGllZC5cbiAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvWydkbyddID0gb2JzZXJ2YWJsZVByb3RvLnRhcCA9IG9ic2VydmFibGVQcm90by5kb0FjdGlvbiA9IGZ1bmN0aW9uIChvYnNlcnZlck9yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCkge1xuICAgIHJldHVybiBuZXcgVGFwT2JzZXJ2YWJsZSh0aGlzLCBvYnNlcnZlck9yT25OZXh0LCBvbkVycm9yLCBvbkNvbXBsZXRlZCk7XG4gIH07XG5cbiAgLyoqXG4gICogIEludm9rZXMgYW4gYWN0aW9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICogIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcsIGxvZ2dpbmcsIGV0Yy4gb2YgcXVlcnkgYmVoYXZpb3IgYnkgaW50ZXJjZXB0aW5nIHRoZSBtZXNzYWdlIHN0cmVhbSB0byBydW4gYXJiaXRyYXJ5IGFjdGlvbnMgZm9yIG1lc3NhZ2VzIG9uIHRoZSBwaXBlbGluZS5cbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbk5leHQgQWN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gT2JqZWN0IHRvIHVzZSBhcyB0aGlzIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHdpdGggdGhlIHNpZGUtZWZmZWN0aW5nIGJlaGF2aW9yIGFwcGxpZWQuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5kb09uTmV4dCA9IG9ic2VydmFibGVQcm90by50YXBPbk5leHQgPSBmdW5jdGlvbiAob25OZXh0LCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIHRoaXMudGFwKHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uICh4KSB7IG9uTmV4dC5jYWxsKHRoaXNBcmcsIHgpOyB9IDogb25OZXh0KTtcbiAgfTtcblxuICAvKipcbiAgKiAgSW52b2tlcyBhbiBhY3Rpb24gdXBvbiBleGNlcHRpb25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgKiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZywgbG9nZ2luZywgZXRjLiBvZiBxdWVyeSBiZWhhdmlvciBieSBpbnRlcmNlcHRpbmcgdGhlIG1lc3NhZ2Ugc3RyZWFtIHRvIHJ1biBhcmJpdHJhcnkgYWN0aW9ucyBmb3IgbWVzc2FnZXMgb24gdGhlIHBpcGVsaW5lLlxuICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3IgQWN0aW9uIHRvIGludm9rZSB1cG9uIGV4Y2VwdGlvbmFsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gT2JqZWN0IHRvIHVzZSBhcyB0aGlzIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHdpdGggdGhlIHNpZGUtZWZmZWN0aW5nIGJlaGF2aW9yIGFwcGxpZWQuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5kb09uRXJyb3IgPSBvYnNlcnZhYmxlUHJvdG8udGFwT25FcnJvciA9IGZ1bmN0aW9uIChvbkVycm9yLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIHRoaXMudGFwKG5vb3AsIHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uIChlKSB7IG9uRXJyb3IuY2FsbCh0aGlzQXJnLCBlKTsgfSA6IG9uRXJyb3IpO1xuICB9O1xuXG4gIC8qKlxuICAqICBJbnZva2VzIGFuIGFjdGlvbiB1cG9uIGdyYWNlZnVsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nLCBsb2dnaW5nLCBldGMuIG9mIHF1ZXJ5IGJlaGF2aW9yIGJ5IGludGVyY2VwdGluZyB0aGUgbWVzc2FnZSBzdHJlYW0gdG8gcnVuIGFyYml0cmFyeSBhY3Rpb25zIGZvciBtZXNzYWdlcyBvbiB0aGUgcGlwZWxpbmUuXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gb25Db21wbGV0ZWQgQWN0aW9uIHRvIGludm9rZSB1cG9uIGdyYWNlZnVsIHRlcm1pbmF0aW9uIG9mIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAqIEBwYXJhbSB7QW55fSBbdGhpc0FyZ10gT2JqZWN0IHRvIHVzZSBhcyB0aGlzIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHdpdGggdGhlIHNpZGUtZWZmZWN0aW5nIGJlaGF2aW9yIGFwcGxpZWQuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5kb09uQ29tcGxldGVkID0gb2JzZXJ2YWJsZVByb3RvLnRhcE9uQ29tcGxldGVkID0gZnVuY3Rpb24gKG9uQ29tcGxldGVkLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIHRoaXMudGFwKG5vb3AsIG51bGwsIHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uICgpIHsgb25Db21wbGV0ZWQuY2FsbCh0aGlzQXJnKTsgfSA6IG9uQ29tcGxldGVkKTtcbiAgfTtcblxuICAvKipcbiAgICogIEludm9rZXMgYSBzcGVjaWZpZWQgYWN0aW9uIGFmdGVyIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0ZXJtaW5hdGVzIGdyYWNlZnVsbHkgb3IgZXhjZXB0aW9uYWxseS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmluYWxseUFjdGlvbiBBY3Rpb24gdG8gaW52b2tlIGFmdGVyIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0ZXJtaW5hdGVzLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gU291cmNlIHNlcXVlbmNlIHdpdGggdGhlIGFjdGlvbi1pbnZva2luZyB0ZXJtaW5hdGlvbiBiZWhhdmlvciBhcHBsaWVkLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvWydmaW5hbGx5J10gPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRyeUNhdGNoKHNvdXJjZS5zdWJzY3JpYmUpLmNhbGwoc291cmNlLCBvYnNlcnZlcik7XG4gICAgICBpZiAoc3Vic2NyaXB0aW9uID09PSBlcnJvck9iaikge1xuICAgICAgICBhY3Rpb24oKTtcbiAgICAgICAgcmV0dXJuIHRocm93ZXIoc3Vic2NyaXB0aW9uLmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRpc3Bvc2FibGVDcmVhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgciA9IHRyeUNhdGNoKHN1YnNjcmlwdGlvbi5kaXNwb3NlKS5jYWxsKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIGFjdGlvbigpO1xuICAgICAgICByID09PSBlcnJvck9iaiAmJiB0aHJvd2VyKHIuZSk7XG4gICAgICB9KTtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuICB2YXIgSWdub3JlRWxlbWVudHNPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZShzb3VyY2UpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSWdub3JlRWxlbWVudHNPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IElubmVyT2JzZXJ2ZXIobykpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8pIHtcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBub29wO1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm8ub25FcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH07XG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUub25Db21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZighdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOyB9O1xuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub25FcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIElnbm9yZUVsZW1lbnRzT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIC8qKlxuICAgKiAgSWdub3JlcyBhbGwgZWxlbWVudHMgaW4gYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBsZWF2aW5nIG9ubHkgdGhlIHRlcm1pbmF0aW9uIG1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gZW1wdHkgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNpZ25hbHMgdGVybWluYXRpb24sIHN1Y2Nlc3NmdWwgb3IgZXhjZXB0aW9uYWwsIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uaWdub3JlRWxlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBJZ25vcmVFbGVtZW50c09ic2VydmFibGUodGhpcyk7XG4gIH07XG5cbiAgdmFyIE1hdGVyaWFsaXplT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoTWF0ZXJpYWxpemVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIE1hdGVyaWFsaXplT2JzZXJ2YWJsZShzb3VyY2UsIGZuKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIE1hdGVyaWFsaXplT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBNYXRlcmlhbGl6ZU9ic2VydmVyKG8pKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE1hdGVyaWFsaXplT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBNYXRlcmlhbGl6ZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhNYXRlcmlhbGl6ZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuXG4gICAgZnVuY3Rpb24gTWF0ZXJpYWxpemVPYnNlcnZlcihvKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIE1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkgeyB0aGlzLl9vLm9uTmV4dChub3RpZmljYXRpb25DcmVhdGVPbk5leHQoeCkpIH07XG4gICAgTWF0ZXJpYWxpemVPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uTmV4dChub3RpZmljYXRpb25DcmVhdGVPbkVycm9yKGUpKTsgdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuICAgIE1hdGVyaWFsaXplT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbk5leHQobm90aWZpY2F0aW9uQ3JlYXRlT25Db21wbGV0ZWQoKSk7IHRoaXMuX28ub25Db21wbGV0ZWQoKTsgfTtcblxuICAgIHJldHVybiBNYXRlcmlhbGl6ZU9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogIE1hdGVyaWFsaXplcyB0aGUgaW1wbGljaXQgbm90aWZpY2F0aW9ucyBvZiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGFzIGV4cGxpY2l0IG5vdGlmaWNhdGlvbiB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIG1hdGVyaWFsaXplZCBub3RpZmljYXRpb24gdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBzZXF1ZW5jZS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5tYXRlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IE1hdGVyaWFsaXplT2JzZXJ2YWJsZSh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogIFJlcGVhdHMgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRpbWVzLiBJZiB0aGUgcmVwZWF0IGNvdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzZXF1ZW5jZSByZXBlYXRzIGluZGVmaW5pdGVseS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtyZXBlYXRDb3VudF0gIE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHNlcXVlbmNlLiBJZiBub3QgcHJvdmlkZWQsIHJlcGVhdHMgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHByb2R1Y2luZyB0aGUgZWxlbWVudHMgb2YgdGhlIGdpdmVuIHNlcXVlbmNlIHJlcGVhdGVkbHkuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8ucmVwZWF0ID0gZnVuY3Rpb24gKHJlcGVhdENvdW50KSB7XG4gICAgcmV0dXJuIGVudW1lcmFibGVSZXBlYXQodGhpcywgcmVwZWF0Q291bnQpLmNvbmNhdCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAgUmVwZWF0cyB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMgb3IgdW50aWwgaXQgc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZXMuIElmIHRoZSByZXRyeSBjb3VudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCByZXRyaWVzIGluZGVmaW5pdGVseS5cbiAgICogIE5vdGUgaWYgeW91IGVuY291bnRlciBhbiBlcnJvciBhbmQgd2FudCBpdCB0byByZXRyeSBvbmNlLCB0aGVuIHlvdSBtdXN0IHVzZSAucmV0cnkoMik7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICB2YXIgcmVzID0gcmV0cmllZCA9IHJldHJ5LnJlcGVhdCgpO1xuICAgKiAgdmFyIHJlcyA9IHJldHJpZWQgPSByZXRyeS5yZXBlYXQoMik7XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcmV0cnlDb3VudF0gIE51bWJlciBvZiB0aW1lcyB0byByZXRyeSB0aGUgc2VxdWVuY2UuIElmIG5vdCBwcm92aWRlZCwgcmV0cnkgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgcHJvZHVjaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UgcmVwZWF0ZWRseSB1bnRpbCBpdCB0ZXJtaW5hdGVzIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5yZXRyeSA9IGZ1bmN0aW9uIChyZXRyeUNvdW50KSB7XG4gICAgcmV0dXJuIGVudW1lcmFibGVSZXBlYXQodGhpcywgcmV0cnlDb3VudCkuY2F0Y2hFcnJvcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAgUmVwZWF0cyB0aGUgc291cmNlIG9ic2VydmFibGUgc2VxdWVuY2UgdXBvbiBlcnJvciBlYWNoIHRpbWUgdGhlIG5vdGlmaWVyIGVtaXRzIG9yIHVudGlsIGl0IHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVzLiBcbiAgICogIGlmIHRoZSBub3RpZmllciBjb21wbGV0ZXMsIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbXBsZXRlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogIHZhciB0aW1lciA9IE9ic2VydmFibGUudGltZXIoNTAwKTtcbiAgICogIHZhciBzb3VyY2UgPSBvYnNlcnZhYmxlLnJldHJ5V2hlbih0aW1lcik7XG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gW25vdGlmaWVyXSBBbiBvYnNlcnZhYmxlIHRoYXQgdHJpZ2dlcnMgdGhlIHJldHJpZXMgb3IgY29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdpdGggb25OZXh0IG9yIG9uQ29tcGxldGVkIHJlc3BlY3RpdmVseS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgcHJvZHVjaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UgcmVwZWF0ZWRseSB1bnRpbCBpdCB0ZXJtaW5hdGVzIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5yZXRyeVdoZW4gPSBmdW5jdGlvbiAobm90aWZpZXIpIHtcbiAgICByZXR1cm4gZW51bWVyYWJsZVJlcGVhdCh0aGlzKS5jYXRjaEVycm9yV2hlbihub3RpZmllcik7XG4gIH07XG4gIHZhciBTY2FuT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhTY2FuT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTY2FuT2JzZXJ2YWJsZShzb3VyY2UsIGFjY3VtdWxhdG9yLCBoYXNTZWVkLCBzZWVkKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuYWNjdW11bGF0b3IgPSBhY2N1bXVsYXRvcjtcbiAgICAgIHRoaXMuaGFzU2VlZCA9IGhhc1NlZWQ7XG4gICAgICB0aGlzLnNlZWQgPSBzZWVkO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgU2Nhbk9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBTY2FuT2JzZXJ2ZXIobyx0aGlzKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBTY2FuT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBTY2FuT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFNjYW5PYnNlcnZlciwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTY2FuT2JzZXJ2ZXIobywgcGFyZW50KSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3AgPSBwYXJlbnQ7XG4gICAgICB0aGlzLl9mbiA9IHBhcmVudC5hY2N1bXVsYXRvcjtcbiAgICAgIHRoaXMuX2hzID0gcGFyZW50Lmhhc1NlZWQ7XG4gICAgICB0aGlzLl9zID0gcGFyZW50LnNlZWQ7XG4gICAgICB0aGlzLl9oYSA9IGZhbHNlO1xuICAgICAgdGhpcy5fYSA9IG51bGw7XG4gICAgICB0aGlzLl9odiA9IGZhbHNlO1xuICAgICAgdGhpcy5faSA9IDA7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBTY2FuT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgIXRoaXMuX2h2ICYmICh0aGlzLl9odiA9IHRydWUpO1xuICAgICAgaWYgKHRoaXMuX2hhKSB7XG4gICAgICAgIHRoaXMuX2EgPSB0cnlDYXRjaCh0aGlzLl9mbikodGhpcy5fYSwgeCwgdGhpcy5faSwgdGhpcy5fcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hID0gdGhpcy5faHMgPyB0cnlDYXRjaCh0aGlzLl9mbikodGhpcy5fcywgeCwgdGhpcy5faSwgdGhpcy5fcCkgOiB4O1xuICAgICAgICB0aGlzLl9oYSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fYSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuX28ub25FcnJvcih0aGlzLl9hLmUpOyB9XG4gICAgICB0aGlzLl9vLm9uTmV4dCh0aGlzLl9hKTtcbiAgICAgIHRoaXMuX2krKztcbiAgICB9O1xuXG4gICAgU2Nhbk9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzLl9vLm9uRXJyb3IoZSk7XG4gICAgfTtcblxuICAgIFNjYW5PYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgIXRoaXMuX2h2ICYmIHRoaXMuX2hzICYmIHRoaXMuX28ub25OZXh0KHRoaXMuX3MpO1xuICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2Nhbk9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgKiAgQXBwbGllcyBhbiBhY2N1bXVsYXRvciBmdW5jdGlvbiBvdmVyIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYW5kIHJldHVybnMgZWFjaCBpbnRlcm1lZGlhdGUgcmVzdWx0LiBUaGUgb3B0aW9uYWwgc2VlZCB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAqICBGb3IgYWdncmVnYXRpb24gYmVoYXZpb3Igd2l0aCBubyBpbnRlcm1lZGlhdGUgcmVzdWx0cywgc2VlIE9ic2VydmFibGUuYWdncmVnYXRlLlxuICAqIEBwYXJhbSB7TWl4ZWR9IFtzZWVkXSBUaGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZS5cbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhY2N1bXVsYXRvciBBbiBhY2N1bXVsYXRvciBmdW5jdGlvbiB0byBiZSBpbnZva2VkIG9uIGVhY2ggZWxlbWVudC5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5zY2FuID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYXNTZWVkID0gZmFsc2UsIHNlZWQsIGFjY3VtdWxhdG9yID0gYXJndW1lbnRzWzBdO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBoYXNTZWVkID0gdHJ1ZTtcbiAgICAgIHNlZWQgPSBhcmd1bWVudHNbMV07XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2Nhbk9ic2VydmFibGUodGhpcywgYWNjdW11bGF0b3IsIGhhc1NlZWQsIHNlZWQpO1xuICB9O1xuXG4gIHZhciBTa2lwTGFzdE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFNraXBMYXN0T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTa2lwTGFzdE9ic2VydmFibGUoc291cmNlLCBjKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuX2MgPSBjO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgU2tpcExhc3RPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IFNraXBMYXN0T2JzZXJ2ZXIobywgdGhpcy5fYykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2tpcExhc3RPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIFNraXBMYXN0T2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFNraXBMYXN0T2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gU2tpcExhc3RPYnNlcnZlcihvLCBjKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX2MgPSBjO1xuICAgICAgdGhpcy5fcSA9IFtdO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgU2tpcExhc3RPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB0aGlzLl9xLnB1c2goeCk7XG4gICAgICB0aGlzLl9xLmxlbmd0aCA+IHRoaXMuX2MgJiYgdGhpcy5fby5vbk5leHQodGhpcy5fcS5zaGlmdCgpKTtcbiAgICB9O1xuXG4gICAgU2tpcExhc3RPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fby5vbkVycm9yKGUpO1xuICAgIH07XG5cbiAgICBTa2lwTGFzdE9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBTa2lwTGFzdE9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogIEJ5cGFzc2VzIGEgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cyBhdCB0aGUgZW5kIG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgVGhpcyBvcGVyYXRvciBhY2N1bXVsYXRlcyBhIHF1ZXVlIHdpdGggYSBsZW5ndGggZW5vdWdoIHRvIHN0b3JlIHRoZSBmaXJzdCBgY291bnRgIGVsZW1lbnRzLiBBcyBtb3JlIGVsZW1lbnRzIGFyZVxuICAgKiAgcmVjZWl2ZWQsIGVsZW1lbnRzIGFyZSB0YWtlbiBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgYW5kIHByb2R1Y2VkIG9uIHRoZSByZXN1bHQgc2VxdWVuY2UuIFRoaXMgY2F1c2VzIGVsZW1lbnRzIHRvIGJlIGRlbGF5ZWQuXG4gICAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gYnlwYXNzIGF0IHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgc291cmNlIHNlcXVlbmNlIGVsZW1lbnRzIGV4Y2VwdCBmb3IgdGhlIGJ5cGFzc2VkIG9uZXMgYXQgdGhlIGVuZC5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5za2lwTGFzdCA9IGZ1bmN0aW9uIChjb3VudCkge1xuICAgIGlmIChjb3VudCA8IDApIHsgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yKCk7IH1cbiAgICByZXR1cm4gbmV3IFNraXBMYXN0T2JzZXJ2YWJsZSh0aGlzLCBjb3VudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICBQcmVwZW5kcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB0byBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHdpdGggYW4gb3B0aW9uYWwgc2NoZWR1bGVyIGFuZCBhbiBhcmd1bWVudCBsaXN0IG9mIHZhbHVlcyB0byBwcmVwZW5kLlxuICAgKiAgQGV4YW1wbGVcbiAgICogIHZhciByZXMgPSBzb3VyY2Uuc3RhcnRXaXRoKDEsIDIsIDMpO1xuICAgKiAgdmFyIHJlcyA9IHNvdXJjZS5zdGFydFdpdGgoUnguU2NoZWR1bGVyLnRpbWVvdXQsIDEsIDIsIDMpO1xuICAgKiBAcGFyYW0ge0FyZ3VtZW50c30gYXJncyBUaGUgc3BlY2lmaWVkIHZhbHVlcyB0byBwcmVwZW5kIHRvIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaGUgc291cmNlIHNlcXVlbmNlIHByZXBlbmRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnN0YXJ0V2l0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWVzLCBzY2hlZHVsZXIsIHN0YXJ0ID0gMDtcbiAgICBpZiAoISFhcmd1bWVudHMubGVuZ3RoICYmIGlzU2NoZWR1bGVyKGFyZ3VtZW50c1swXSkpIHtcbiAgICAgIHNjaGVkdWxlciA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHN0YXJ0ID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVyID0gaW1tZWRpYXRlU2NoZWR1bGVyO1xuICAgIH1cbiAgICBmb3IodmFyIGFyZ3MgPSBbXSwgaSA9IHN0YXJ0LCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7IH1cbiAgICByZXR1cm4gZW51bWVyYWJsZU9mKFtvYnNlcnZhYmxlRnJvbUFycmF5KGFyZ3MsIHNjaGVkdWxlciksIHRoaXNdKS5jb25jYXQoKTtcbiAgfTtcblxuICB2YXIgVGFrZUxhc3RPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoVGFrZUxhc3RPYnNlcnZlciwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBUYWtlTGFzdE9ic2VydmVyKG8sIGMpIHtcbiAgICAgIHRoaXMuX28gPSBvO1xuICAgICAgdGhpcy5fYyA9IGM7XG4gICAgICB0aGlzLl9xID0gW107XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBUYWtlTGFzdE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHRoaXMuX3EucHVzaCh4KTtcbiAgICAgIHRoaXMuX3EubGVuZ3RoID4gdGhpcy5fYyAmJiB0aGlzLl9xLnNoaWZ0KCk7XG4gICAgfTtcblxuICAgIFRha2VMYXN0T2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcbiAgICB9O1xuXG4gICAgVGFrZUxhc3RPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2hpbGUgKHRoaXMuX3EubGVuZ3RoID4gMCkgeyB0aGlzLl9vLm9uTmV4dCh0aGlzLl9xLnNoaWZ0KCkpOyB9XG4gICAgICB0aGlzLl9vLm9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBUYWtlTGFzdE9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogIFJldHVybnMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZWxlbWVudHMgZnJvbSB0aGUgZW5kIG9mIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgVGhpcyBvcGVyYXRvciBhY2N1bXVsYXRlcyBhIGJ1ZmZlciB3aXRoIGEgbGVuZ3RoIGVub3VnaCB0byBzdG9yZSBlbGVtZW50cyBjb3VudCBlbGVtZW50cy4gVXBvbiBjb21wbGV0aW9uIG9mXG4gICAqICB0aGUgc291cmNlIHNlcXVlbmNlLCB0aGlzIGJ1ZmZlciBpcyBkcmFpbmVkIG9uIHRoZSByZXN1bHQgc2VxdWVuY2UuIFRoaXMgY2F1c2VzIHRoZSBlbGVtZW50cyB0byBiZSBkZWxheWVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UgZnJvbSB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMgZnJvbSB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8udGFrZUxhc3QgPSBmdW5jdGlvbiAoY291bnQpIHtcbiAgICBpZiAoY291bnQgPCAwKSB7IHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcigpOyB9XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgVGFrZUxhc3RPYnNlcnZlcihvLCBjb3VudCkpO1xuICAgIH0sIHNvdXJjZSk7XG4gIH07XG5cbm9ic2VydmFibGVQcm90by5mbGF0TWFwQ29uY2F0ID0gb2JzZXJ2YWJsZVByb3RvLmNvbmNhdE1hcCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykge1xuICAgIHJldHVybiBuZXcgRmxhdE1hcE9ic2VydmFibGUodGhpcywgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKS5tZXJnZSgxKTtcbn07XG4gIHZhciBNYXBPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhNYXBPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXG4gICAgZnVuY3Rpb24gTWFwT2JzZXJ2YWJsZShzb3VyY2UsIHNlbGVjdG9yLCB0aGlzQXJnKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuc2VsZWN0b3IgPSBiaW5kQ2FsbGJhY2soc2VsZWN0b3IsIHRoaXNBcmcsIDMpO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5uZXJNYXAoc2VsZWN0b3IsIHNlbGYpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoeCwgaSwgbykgeyByZXR1cm4gc2VsZWN0b3IuY2FsbCh0aGlzLCBzZWxmLnNlbGVjdG9yKHgsIGksIG8pLCBpLCBvKTsgfVxuICAgIH1cblxuICAgIE1hcE9ic2VydmFibGUucHJvdG90eXBlLmludGVybmFsTWFwID0gZnVuY3Rpb24gKHNlbGVjdG9yLCB0aGlzQXJnKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcE9ic2VydmFibGUodGhpcy5zb3VyY2UsIGlubmVyTWFwKHNlbGVjdG9yLCB0aGlzKSwgdGhpc0FyZyk7XG4gICAgfTtcblxuICAgIE1hcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnNlbGVjdG9yLCB0aGlzKSk7XG4gICAgfTtcblxuICAgIGluaGVyaXRzKElubmVyT2JzZXJ2ZXIsIEFic3RyYWN0T2JzZXJ2ZXIpO1xuICAgIGZ1bmN0aW9uIElubmVyT2JzZXJ2ZXIobywgc2VsZWN0b3IsIHNvdXJjZSkge1xuICAgICAgdGhpcy5vID0gbztcbiAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5pID0gMDtcbiAgICAgIEFic3RyYWN0T2JzZXJ2ZXIuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oeCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMuc2VsZWN0b3IpKHgsIHRoaXMuaSsrLCB0aGlzLnNvdXJjZSk7XG4gICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5vLm9uRXJyb3IocmVzdWx0LmUpOyB9XG4gICAgICB0aGlzLm8ub25OZXh0KHJlc3VsdCk7XG4gICAgfTtcblxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuICAgIH07XG5cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLm8ub25Db21wbGV0ZWQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE1hcE9ic2VydmFibGU7XG5cbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIC8qKlxuICAqIFByb2plY3RzIGVhY2ggZWxlbWVudCBvZiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIGludG8gYSBuZXcgZm9ybSBieSBpbmNvcnBvcmF0aW5nIHRoZSBlbGVtZW50J3MgaW5kZXguXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZWN0b3IgQSB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBzb3VyY2UgZWxlbWVudDsgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBzb3VyY2UgZWxlbWVudC5cbiAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uIG9uIGVhY2ggZWxlbWVudCBvZiBzb3VyY2UuXG4gICovXG4gIG9ic2VydmFibGVQcm90by5tYXAgPSBvYnNlcnZhYmxlUHJvdG8uc2VsZWN0ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCB0aGlzQXJnKSB7XG4gICAgdmFyIHNlbGVjdG9yRm4gPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICdmdW5jdGlvbicgPyBzZWxlY3RvciA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlbGVjdG9yOyB9O1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgTWFwT2JzZXJ2YWJsZSA/XG4gICAgICB0aGlzLmludGVybmFsTWFwKHNlbGVjdG9yRm4sIHRoaXNBcmcpIDpcbiAgICAgIG5ldyBNYXBPYnNlcnZhYmxlKHRoaXMsIHNlbGVjdG9yRm4sIHRoaXNBcmcpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHBsdWNrZXIoYXJncywgbGVuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1hcHBlcih4KSB7XG4gICAgICB2YXIgY3VycmVudFByb3AgPSB4O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgcCA9IGN1cnJlbnRQcm9wW2FyZ3NbaV1dO1xuICAgICAgICBpZiAodHlwZW9mIHAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgY3VycmVudFByb3AgPSBwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50UHJvcDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBuZXN0ZWQgcHJvcGVydHkgZnJvbSBhbGwgZWxlbWVudHMgaW5cbiAgICogdGhlIE9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7QXJndW1lbnRzfSBhcmd1bWVudHMgVGhlIG5lc3RlZCBwcm9wZXJ0aWVzIHRvIHBsdWNrLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gUmV0dXJucyBhIG5ldyBPYnNlcnZhYmxlIHNlcXVlbmNlIG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5wbHVjayA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGlmIChsZW4gPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdMaXN0IG9mIHByb3BlcnRpZXMgY2Fubm90IGJlIGVtcHR5LicpOyB9XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07IH1cbiAgICByZXR1cm4gdGhpcy5tYXAocGx1Y2tlcihhcmdzLCBsZW4pKTtcbiAgfTtcblxub2JzZXJ2YWJsZVByb3RvLmZsYXRNYXAgPSBvYnNlcnZhYmxlUHJvdG8uc2VsZWN0TWFueSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykge1xuICAgIHJldHVybiBuZXcgRmxhdE1hcE9ic2VydmFibGUodGhpcywgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKS5tZXJnZUFsbCgpO1xufTtcblxuXG4vL1xuLy9SeC5PYnNlcnZhYmxlLnByb3RvdHlwZS5mbGF0TWFwV2l0aE1heENvbmN1cnJlbnQgPSBmdW5jdGlvbihsaW1pdCwgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKSB7XG4vLyAgICByZXR1cm4gbmV3IEZsYXRNYXBPYnNlcnZhYmxlKHRoaXMsIHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykubWVyZ2UobGltaXQpO1xuLy99O1xuLy9cblxuUnguT2JzZXJ2YWJsZS5wcm90b3R5cGUuZmxhdE1hcExhdGVzdCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCByZXN1bHRTZWxlY3RvciwgdGhpc0FyZykge1xuICAgIHJldHVybiBuZXcgRmxhdE1hcE9ic2VydmFibGUodGhpcywgc2VsZWN0b3IsIHJlc3VsdFNlbGVjdG9yLCB0aGlzQXJnKS5zd2l0Y2hMYXRlc3QoKTtcbn07XG4gIHZhciBTa2lwT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhTa2lwT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTa2lwT2JzZXJ2YWJsZShzb3VyY2UsIGNvdW50KSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuc2tpcENvdW50ID0gY291bnQ7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG4gICAgXG4gICAgU2tpcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnNraXBDb3VudCkpO1xuICAgIH07XG4gICAgXG4gICAgZnVuY3Rpb24gSW5uZXJPYnNlcnZlcihvLCBjKSB7XG4gICAgICB0aGlzLmMgPSBjO1xuICAgICAgdGhpcy5yID0gYztcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbk5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuICAgICAgaWYgKHRoaXMuciA8PSAwKSB7IFxuICAgICAgICB0aGlzLm8ub25OZXh0KHgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yLS07XG4gICAgICB9XG4gICAgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IHRoaXMuby5vbkVycm9yKGUpOyB9XG4gICAgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5vbkNvbXBsZXRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IHRoaXMuby5vbkNvbXBsZXRlZCgpOyB9XG4gICAgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsgfTtcbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBTa2lwT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpOyAgXG4gIFxuICAvKipcbiAgICogQnlwYXNzZXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYW5kIHRoZW4gcmV0dXJucyB0aGUgcmVtYWluaW5nIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgdGhlIHJlbWFpbmluZyBlbGVtZW50cy5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgdGhhdCBvY2N1ciBhZnRlciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBpbnB1dCBzZXF1ZW5jZS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5za2lwID0gZnVuY3Rpb24gKGNvdW50KSB7XG4gICAgaWYgKGNvdW50IDwgMCkgeyB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IoKTsgfVxuICAgIHJldHVybiBuZXcgU2tpcE9ic2VydmFibGUodGhpcywgY291bnQpO1xuICB9O1xuICB2YXIgU2tpcFdoaWxlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoU2tpcFdoaWxlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTa2lwV2hpbGVPYnNlcnZhYmxlKHNvdXJjZSwgZm4pIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5fZm4gPSBmbjtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFNraXBXaGlsZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgU2tpcFdoaWxlT2JzZXJ2ZXIobywgdGhpcykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2tpcFdoaWxlT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBTa2lwV2hpbGVPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoU2tpcFdoaWxlT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cbiAgICBmdW5jdGlvbiBTa2lwV2hpbGVPYnNlcnZlcihvLCBwKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3AgPSBwO1xuICAgICAgdGhpcy5faSA9IDA7XG4gICAgICB0aGlzLl9yID0gZmFsc2U7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBTa2lwV2hpbGVPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICBpZiAoIXRoaXMuX3IpIHtcbiAgICAgICAgdmFyIHJlcyA9IHRyeUNhdGNoKHRoaXMuX3AuX2ZuKSh4LCB0aGlzLl9pKyssIHRoaXMuX3ApO1xuICAgICAgICBpZiAocmVzID09PSBlcnJvck9iaikgeyByZXR1cm4gdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuICAgICAgICB0aGlzLl9yID0gIXJlcztcbiAgICAgIH1cbiAgICAgIHRoaXMuX3IgJiYgdGhpcy5fby5vbk5leHQoeCk7XG4gICAgfTtcbiAgICBTa2lwV2hpbGVPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uRXJyb3IoZSk7IH07XG4gICAgU2tpcFdoaWxlT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fby5vbkNvbXBsZXRlZCgpOyB9O1xuXG4gICAgcmV0dXJuIFNraXBXaGlsZU9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogIEJ5cGFzc2VzIGVsZW1lbnRzIGluIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgbG9uZyBhcyBhIHNwZWNpZmllZCBjb25kaXRpb24gaXMgdHJ1ZSBhbmQgdGhlbiByZXR1cm5zIHRoZSByZW1haW5pbmcgZWxlbWVudHMuXG4gICAqICBUaGUgZWxlbWVudCdzIGluZGV4IGlzIHVzZWQgaW4gdGhlIGxvZ2ljIG9mIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqICB2YXIgcmVzID0gc291cmNlLnNraXBXaGlsZShmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlIDwgMTA7IH0pO1xuICAgKiAgdmFyIHJlcyA9IHNvdXJjZS5za2lwV2hpbGUoZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkgeyByZXR1cm4gdmFsdWUgPCAxMCB8fCBpbmRleCA8IDEwOyB9KTtcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIEEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQgZm9yIGEgY29uZGl0aW9uOyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgdGhlIHNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgZnJvbSB0aGUgaW5wdXQgc2VxdWVuY2Ugc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGxpbmVhciBzZXJpZXMgdGhhdCBkb2VzIG5vdCBwYXNzIHRoZSB0ZXN0IHNwZWNpZmllZCBieSBwcmVkaWNhdGUuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uc2tpcFdoaWxlID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgIHZhciBmbiA9IGJpbmRDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpO1xuICAgIHJldHVybiBuZXcgU2tpcFdoaWxlT2JzZXJ2YWJsZSh0aGlzLCBmbik7XG4gIH07XG5cbiAgdmFyIFRha2VPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFRha2VPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIFxuICAgIGZ1bmN0aW9uIFRha2VPYnNlcnZhYmxlKHNvdXJjZSwgY291bnQpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy50YWtlQ291bnQgPSBjb3VudDtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cbiAgICBcbiAgICBUYWtlT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBJbm5lck9ic2VydmVyKG8sIHRoaXMudGFrZUNvdW50KSk7XG4gICAgfTtcbiAgICBcbiAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIGMpIHtcbiAgICAgIHRoaXMubyA9IG87XG4gICAgICB0aGlzLmMgPSBjO1xuICAgICAgdGhpcy5yID0gYztcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIElubmVyT2JzZXJ2ZXIucHJvdG90eXBlID0ge1xuICAgICAgb25OZXh0OiBmdW5jdGlvbiAoeCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmICh0aGlzLnItLSA+IDApIHtcbiAgICAgICAgICB0aGlzLm8ub25OZXh0KHgpO1xuICAgICAgICAgIHRoaXMuciA8PSAwICYmIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuby5vbkVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcG9zZTogZnVuY3Rpb24gKCkgeyB0aGlzLmlzU3RvcHBlZCA9IHRydWU7IH0sXG4gICAgICBmYWlsOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuby5vbkVycm9yKGUpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBUYWtlT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpOyAgXG4gIFxuICAvKipcbiAgICogIFJldHVybnMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZWxlbWVudHMgZnJvbSB0aGUgc3RhcnQgb2YgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2hlZHVsZXIgZm9yIHRoZSBlZGdlIGNhc2Ugb2YgdGFrZSgwKS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gU2NoZWR1bGVyIHVzZWQgdG8gcHJvZHVjZSBhbiBPbkNvbXBsZXRlZCBtZXNzYWdlIGluIGNhc2UgPHBhcmFtcmVmIG5hbWU9XCJjb3VudCBjb3VudDwvcGFyYW1yZWY+IGlzIHNldCB0byAwLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBzZXF1ZW5jZS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by50YWtlID0gZnVuY3Rpb24gKGNvdW50LCBzY2hlZHVsZXIpIHtcbiAgICBpZiAoY291bnQgPCAwKSB7IHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcigpOyB9XG4gICAgaWYgKGNvdW50ID09PSAwKSB7IHJldHVybiBvYnNlcnZhYmxlRW1wdHkoc2NoZWR1bGVyKTsgfVxuICAgIHJldHVybiBuZXcgVGFrZU9ic2VydmFibGUodGhpcywgY291bnQpO1xuICB9O1xuXG4gIHZhciBUYWtlV2hpbGVPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUYWtlV2hpbGVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIFRha2VXaGlsZU9ic2VydmFibGUoc291cmNlLCBmbikge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aGlzLl9mbiA9IGZuO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgVGFrZVdoaWxlT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBUYWtlV2hpbGVPYnNlcnZlcihvLCB0aGlzKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBUYWtlV2hpbGVPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgdmFyIFRha2VXaGlsZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUYWtlV2hpbGVPYnNlcnZlciwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIFRha2VXaGlsZU9ic2VydmVyKG8sIHApIHtcbiAgICAgIHRoaXMuX28gPSBvO1xuICAgICAgdGhpcy5fcCA9IHA7XG4gICAgICB0aGlzLl9pID0gMDtcbiAgICAgIHRoaXMuX3IgPSB0cnVlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgVGFrZVdoaWxlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgaWYgKHRoaXMuX3IpIHtcbiAgICAgICAgdGhpcy5fciA9IHRyeUNhdGNoKHRoaXMuX3AuX2ZuKSh4LCB0aGlzLl9pKyssIHRoaXMuX3ApO1xuICAgICAgICBpZiAodGhpcy5fciA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIHRoaXMuX28ub25FcnJvcih0aGlzLl9yLmUpOyB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fcikge1xuICAgICAgICB0aGlzLl9vLm9uTmV4dCh4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFRha2VXaGlsZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuX28ub25FcnJvcihlKTsgfTtcbiAgICBUYWtlV2hpbGVPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9vLm9uQ29tcGxldGVkKCk7IH07XG5cbiAgICByZXR1cm4gVGFrZVdoaWxlT2JzZXJ2ZXI7XG4gIH0oQWJzdHJhY3RPYnNlcnZlcikpO1xuXG4gIC8qKlxuICAgKiAgUmV0dXJucyBlbGVtZW50cyBmcm9tIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgbG9uZyBhcyBhIHNwZWNpZmllZCBjb25kaXRpb24gaXMgdHJ1ZS5cbiAgICogIFRoZSBlbGVtZW50J3MgaW5kZXggaXMgdXNlZCBpbiB0aGUgbG9naWMgb2YgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIEEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQgZm9yIGEgY29uZGl0aW9uOyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgdGhlIHNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgZnJvbSB0aGUgaW5wdXQgc2VxdWVuY2UgdGhhdCBvY2N1ciBiZWZvcmUgdGhlIGVsZW1lbnQgYXQgd2hpY2ggdGhlIHRlc3Qgbm8gbG9uZ2VyIHBhc3Nlcy5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by50YWtlV2hpbGUgPSBmdW5jdGlvbiAocHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgdmFyIGZuID0gYmluZENhbGxiYWNrKHByZWRpY2F0ZSwgdGhpc0FyZywgMyk7XG4gICAgcmV0dXJuIG5ldyBUYWtlV2hpbGVPYnNlcnZhYmxlKHRoaXMsIGZuKTtcbiAgfTtcblxuICB2YXIgRmlsdGVyT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoRmlsdGVyT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcblxuICAgIGZ1bmN0aW9uIEZpbHRlck9ic2VydmFibGUoc291cmNlLCBwcmVkaWNhdGUsIHRoaXNBcmcpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5wcmVkaWNhdGUgPSBiaW5kQ2FsbGJhY2socHJlZGljYXRlLCB0aGlzQXJnLCAzKTtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEZpbHRlck9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgSW5uZXJPYnNlcnZlcihvLCB0aGlzLnByZWRpY2F0ZSwgdGhpcykpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpbm5lclByZWRpY2F0ZShwcmVkaWNhdGUsIHNlbGYpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih4LCBpLCBvKSB7IHJldHVybiBzZWxmLnByZWRpY2F0ZSh4LCBpLCBvKSAmJiBwcmVkaWNhdGUuY2FsbCh0aGlzLCB4LCBpLCBvKTsgfVxuICAgIH1cblxuICAgIEZpbHRlck9ic2VydmFibGUucHJvdG90eXBlLmludGVybmFsRmlsdGVyID0gZnVuY3Rpb24ocHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICByZXR1cm4gbmV3IEZpbHRlck9ic2VydmFibGUodGhpcy5zb3VyY2UsIGlubmVyUHJlZGljYXRlKHByZWRpY2F0ZSwgdGhpcyksIHRoaXNBcmcpO1xuICAgIH07XG5cbiAgICBpbmhlcml0cyhJbm5lck9ic2VydmVyLCBBYnN0cmFjdE9ic2VydmVyKTtcbiAgICBmdW5jdGlvbiBJbm5lck9ic2VydmVyKG8sIHByZWRpY2F0ZSwgc291cmNlKSB7XG4gICAgICB0aGlzLm8gPSBvO1xuICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuaSA9IDA7XG4gICAgICBBYnN0cmFjdE9ic2VydmVyLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHZhciBzaG91bGRZaWVsZCA9IHRyeUNhdGNoKHRoaXMucHJlZGljYXRlKSh4LCB0aGlzLmkrKywgdGhpcy5zb3VyY2UpO1xuICAgICAgaWYgKHNob3VsZFlpZWxkID09PSBlcnJvck9iaikge1xuICAgICAgICByZXR1cm4gdGhpcy5vLm9uRXJyb3Ioc2hvdWxkWWllbGQuZSk7XG4gICAgICB9XG4gICAgICBzaG91bGRZaWVsZCAmJiB0aGlzLm8ub25OZXh0KHgpO1xuICAgIH07XG5cbiAgICBJbm5lck9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzLm8ub25FcnJvcihlKTtcbiAgICB9O1xuXG4gICAgSW5uZXJPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5vLm9uQ29tcGxldGVkKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBGaWx0ZXJPYnNlcnZhYmxlO1xuXG4gIH0oT2JzZXJ2YWJsZUJhc2UpKTtcblxuICAvKipcbiAgKiAgRmlsdGVycyB0aGUgZWxlbWVudHMgb2YgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBiYXNlZCBvbiBhIHByZWRpY2F0ZSBieSBpbmNvcnBvcmF0aW5nIHRoZSBlbGVtZW50J3MgaW5kZXguXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIEEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIHNvdXJjZSBlbGVtZW50IGZvciBhIGNvbmRpdGlvbjsgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBzb3VyY2UgZWxlbWVudC5cbiAgKiBAcGFyYW0ge0FueX0gW3RoaXNBcmddIE9iamVjdCB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIGVsZW1lbnRzIGZyb20gdGhlIGlucHV0IHNlcXVlbmNlIHRoYXQgc2F0aXNmeSB0aGUgY29uZGl0aW9uLlxuICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uZmlsdGVyID0gb2JzZXJ2YWJsZVByb3RvLndoZXJlID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgRmlsdGVyT2JzZXJ2YWJsZSA/IHRoaXMuaW50ZXJuYWxGaWx0ZXIocHJlZGljYXRlLCB0aGlzQXJnKSA6XG4gICAgICBuZXcgRmlsdGVyT2JzZXJ2YWJsZSh0aGlzLCBwcmVkaWNhdGUsIHRoaXNBcmcpO1xuICB9O1xuXG5mdW5jdGlvbiBjcmVhdGVDYk9ic2VydmFibGUoZm4sIGN0eCwgc2VsZWN0b3IsIGFyZ3MpIHtcbiAgdmFyIG8gPSBuZXcgQXN5bmNTdWJqZWN0KCk7XG5cbiAgYXJncy5wdXNoKGNyZWF0ZUNiSGFuZGxlcihvLCBjdHgsIHNlbGVjdG9yKSk7XG4gIGZuLmFwcGx5KGN0eCwgYXJncyk7XG5cbiAgcmV0dXJuIG8uYXNPYnNlcnZhYmxlKCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNiSGFuZGxlcihvLCBjdHgsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdWx0cyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyByZXN1bHRzW2ldID0gYXJndW1lbnRzW2ldOyB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgIHJlc3VsdHMgPSB0cnlDYXRjaChzZWxlY3RvcikuYXBwbHkoY3R4LCByZXN1bHRzKTtcbiAgICAgIGlmIChyZXN1bHRzID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdHMuZSk7IH1cbiAgICAgIG8ub25OZXh0KHJlc3VsdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPD0gMSkge1xuICAgICAgICBvLm9uTmV4dChyZXN1bHRzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG8ub25OZXh0KHJlc3VsdHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gd2l0aCBhIGNhbGxiYWNrIGFzIHRoZSBsYXN0IHBhcmFtZXRlciB0byBjb252ZXJ0IHRvIGFuIE9ic2VydmFibGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0ge01peGVkfSBbY3R4XSBUaGUgY29udGV4dCBmb3IgdGhlIGZ1bmMgcGFyYW1ldGVyIHRvIGJlIGV4ZWN1dGVkLiAgSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdW5kZWZpbmVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3NlbGVjdG9yXSBBIHNlbGVjdG9yIHdoaWNoIHRha2VzIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgY2FsbGJhY2sgdG8gcHJvZHVjZSBhIHNpbmdsZSBpdGVtIHRvIHlpZWxkIG9uIG5leHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24sIHdoZW4gZXhlY3V0ZWQgd2l0aCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBtaW51cyB0aGUgY2FsbGJhY2ssIHByb2R1Y2VzIGFuIE9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCBhIHNpbmdsZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBjYWxsYmFjayBhcyBhbiBhcnJheS5cbiAqL1xuT2JzZXJ2YWJsZS5mcm9tQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZm4sIGN0eCwgc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB0eXBlb2YgY3R4ID09PSAndW5kZWZpbmVkJyAmJiAoY3R4ID0gdGhpcyk7IFxuXG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkobGVuKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgcmV0dXJuIGNyZWF0ZUNiT2JzZXJ2YWJsZShmbiwgY3R4LCBzZWxlY3RvciwgYXJncyk7XG4gIH07XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVOb2RlT2JzZXJ2YWJsZShmbiwgY3R4LCBzZWxlY3RvciwgYXJncykge1xuICB2YXIgbyA9IG5ldyBBc3luY1N1YmplY3QoKTtcblxuICBhcmdzLnB1c2goY3JlYXRlTm9kZUhhbmRsZXIobywgY3R4LCBzZWxlY3RvcikpO1xuICBmbi5hcHBseShjdHgsIGFyZ3MpO1xuXG4gIHJldHVybiBvLmFzT2JzZXJ2YWJsZSgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlSGFuZGxlcihvLCBjdHgsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyICgpIHtcbiAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdO1xuICAgIGlmIChlcnIpIHsgcmV0dXJuIG8ub25FcnJvcihlcnIpOyB9XG5cbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdWx0cyA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgeyByZXN1bHRzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTsgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24oc2VsZWN0b3IpKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IHRyeUNhdGNoKHNlbGVjdG9yKS5hcHBseShjdHgsIHJlc3VsdHMpO1xuICAgICAgaWYgKHJlc3VsdHMgPT09IGVycm9yT2JqKSB7IHJldHVybiBvLm9uRXJyb3IocmVzdWx0cy5lKTsgfVxuICAgICAgby5vbk5leHQocmVzdWx0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIG8ub25OZXh0KHJlc3VsdHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgby5vbk5leHQocmVzdWx0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgby5vbkNvbXBsZXRlZCgpO1xuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgTm9kZS5qcyBjYWxsYmFjayBzdHlsZSBmdW5jdGlvbiB0byBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLiAgVGhpcyBtdXN0IGJlIGluIGZ1bmN0aW9uIChlcnIsIC4uLikgZm9ybWF0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGxcbiAqIEBwYXJhbSB7TWl4ZWR9IFtjdHhdIFRoZSBjb250ZXh0IGZvciB0aGUgZnVuYyBwYXJhbWV0ZXIgdG8gYmUgZXhlY3V0ZWQuICBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB1bmRlZmluZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIEEgc2VsZWN0b3Igd2hpY2ggdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsYmFjayBtaW51cyB0aGUgZXJyb3IgdG8gcHJvZHVjZSBhIHNpbmdsZSBpdGVtIHRvIHlpZWxkIG9uIG5leHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoIHdoZW4gYXBwbGllZCwgcmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHdpdGggdGhlIGNhbGxiYWNrIGFyZ3VtZW50cyBhcyBhbiBhcnJheS5cbiAqL1xuT2JzZXJ2YWJsZS5mcm9tTm9kZUNhbGxiYWNrID0gZnVuY3Rpb24gKGZuLCBjdHgsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdHlwZW9mIGN0eCA9PT0gJ3VuZGVmaW5lZCcgJiYgKGN0eCA9IHRoaXMpOyBcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeyBhcmdzW2ldID0gYXJndW1lbnRzW2ldOyB9XG4gICAgcmV0dXJuIGNyZWF0ZU5vZGVPYnNlcnZhYmxlKGZuLCBjdHgsIHNlbGVjdG9yLCBhcmdzKTtcbiAgfTtcbn07XG5cbiAgZnVuY3Rpb24gaXNOb2RlTGlzdChlbCkge1xuICAgIGlmIChyb290LlN0YXRpY05vZGVMaXN0KSB7XG4gICAgICAvLyBJRTggU3BlY2lmaWNcbiAgICAgIC8vIGluc3RhbmNlb2YgaXMgc2xvd2VyIHRoYW4gT2JqZWN0I3RvU3RyaW5nLCBidXQgT2JqZWN0I3RvU3RyaW5nIHdpbGwgbm90IHdvcmsgYXMgaW50ZW5kZWQgaW4gSUU4XG4gICAgICByZXR1cm4gZWwgaW5zdGFuY2VvZiByb290LlN0YXRpY05vZGVMaXN0IHx8IGVsIGluc3RhbmNlb2Ygcm9vdC5Ob2RlTGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbCkgPT09ICdbb2JqZWN0IE5vZGVMaXN0XSc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gTGlzdGVuRGlzcG9zYWJsZShlLCBuLCBmbikge1xuICAgIHRoaXMuX2UgPSBlO1xuICAgIHRoaXMuX24gPSBuO1xuICAgIHRoaXMuX2ZuID0gZm47XG4gICAgdGhpcy5fZS5hZGRFdmVudExpc3RlbmVyKHRoaXMuX24sIHRoaXMuX2ZuLCBmYWxzZSk7XG4gICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG4gIH1cbiAgTGlzdGVuRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgdGhpcy5fZS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX24sIHRoaXMuX2ZuLCBmYWxzZSk7XG4gICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVFdmVudExpc3RlbmVyIChlbCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgdmFyIGRpc3Bvc2FibGVzID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKTtcblxuICAgIC8vIEFzdW1lIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uXG4gICAgdmFyIGVsZW1Ub1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbCk7XG4gICAgaWYgKGlzTm9kZUxpc3QoZWwpIHx8IGVsZW1Ub1N0cmluZyA9PT0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGRpc3Bvc2FibGVzLmFkZChjcmVhdGVFdmVudExpc3RlbmVyKGVsLml0ZW0oaSksIGV2ZW50TmFtZSwgaGFuZGxlcikpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZWwpIHtcbiAgICAgIGRpc3Bvc2FibGVzLmFkZChuZXcgTGlzdGVuRGlzcG9zYWJsZShlbCwgZXZlbnROYW1lLCBoYW5kbGVyKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc3Bvc2FibGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSBuYXRpdmUgZXZlbnRzIG9ubHlcbiAgICovXG4gIFJ4LmNvbmZpZy51c2VOYXRpdmVFdmVudHMgPSBmYWxzZTtcblxuICB2YXIgRXZlbnRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKEV2ZW50T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBFdmVudE9ic2VydmFibGUoZWwsIG5hbWUsIGZuKSB7XG4gICAgICB0aGlzLl9lbCA9IGVsO1xuICAgICAgdGhpcy5fbiA9IG5hbWU7XG4gICAgICB0aGlzLl9mbiA9IGZuO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihvLCBmbikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIgKCkge1xuICAgICAgICB2YXIgcmVzdWx0cyA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAgICAgcmVzdWx0cyA9IHRyeUNhdGNoKGZuKS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgIGlmIChyZXN1bHRzID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdHMuZSk7IH1cbiAgICAgICAgfVxuICAgICAgICBvLm9uTmV4dChyZXN1bHRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgRXZlbnRPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiBjcmVhdGVFdmVudExpc3RlbmVyKFxuICAgICAgICB0aGlzLl9lbCxcbiAgICAgICAgdGhpcy5fbixcbiAgICAgICAgY3JlYXRlSGFuZGxlcihvLCB0aGlzLl9mbikpO1xuICAgIH07XG5cbiAgICByZXR1cm4gRXZlbnRPYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBieSBhZGRpbmcgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG1hdGNoaW5nIERPTUVsZW1lbnQgb3IgZWFjaCBpdGVtIGluIHRoZSBOb2RlTGlzdC5cbiAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgVGhlIERPTUVsZW1lbnQgb3IgTm9kZUxpc3QgdG8gYXR0YWNoIGEgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gYXR0YWNoIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIEEgc2VsZWN0b3Igd2hpY2ggdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBldmVudCBoYW5kbGVyIHRvIHByb2R1Y2UgYSBzaW5nbGUgaXRlbSB0byB5aWVsZCBvbiBuZXh0LlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZiBldmVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAqL1xuICBPYnNlcnZhYmxlLmZyb21FdmVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudE5hbWUsIHNlbGVjdG9yKSB7XG4gICAgLy8gTm9kZS5qcyBzcGVjaWZpY1xuICAgIGlmIChlbGVtZW50LmFkZExpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gZnJvbUV2ZW50UGF0dGVybihcbiAgICAgICAgZnVuY3Rpb24gKGgpIHsgZWxlbWVudC5hZGRMaXN0ZW5lcihldmVudE5hbWUsIGgpOyB9LFxuICAgICAgICBmdW5jdGlvbiAoaCkgeyBlbGVtZW50LnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgaCk7IH0sXG4gICAgICAgIHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugb25seSBpZiBub24tbmF0aXZlIGV2ZW50cyBhcmUgYWxsb3dlZFxuICAgIGlmICghUnguY29uZmlnLnVzZU5hdGl2ZUV2ZW50cykge1xuICAgICAgLy8gSGFuZGxlcyBqcSwgQW5ndWxhci5qcywgWmVwdG8sIE1hcmlvbmV0dGUsIEVtYmVyLmpzXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQub24gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVsZW1lbnQub2ZmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmcm9tRXZlbnRQYXR0ZXJuKFxuICAgICAgICAgIGZ1bmN0aW9uIChoKSB7IGVsZW1lbnQub24oZXZlbnROYW1lLCBoKTsgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoaCkgeyBlbGVtZW50Lm9mZihldmVudE5hbWUsIGgpOyB9LFxuICAgICAgICAgIHNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEV2ZW50T2JzZXJ2YWJsZShlbGVtZW50LCBldmVudE5hbWUsIHNlbGVjdG9yKS5wdWJsaXNoKCkucmVmQ291bnQoKTtcbiAgfTtcblxuICB2YXIgRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhFdmVudFBhdHRlcm5PYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEV2ZW50UGF0dGVybk9ic2VydmFibGUoYWRkLCBkZWwsIGZuKSB7XG4gICAgICB0aGlzLl9hZGQgPSBhZGQ7XG4gICAgICB0aGlzLl9kZWwgPSBkZWw7XG4gICAgICB0aGlzLl9mbiA9IGZuO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihvLCBmbikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIgKCkge1xuICAgICAgICB2YXIgcmVzdWx0cyA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAgICAgcmVzdWx0cyA9IHRyeUNhdGNoKGZuKS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgIGlmIChyZXN1bHRzID09PSBlcnJvck9iaikgeyByZXR1cm4gby5vbkVycm9yKHJlc3VsdHMuZSk7IH1cbiAgICAgICAgfVxuICAgICAgICBvLm9uTmV4dChyZXN1bHRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgZm4gPSBjcmVhdGVIYW5kbGVyKG8sIHRoaXMuX2ZuKTtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHRoaXMuX2FkZChmbik7XG4gICAgICByZXR1cm4gbmV3IEV2ZW50UGF0dGVybkRpc3Bvc2FibGUodGhpcy5fZGVsLCBmbiwgcmV0dXJuVmFsdWUpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBFdmVudFBhdHRlcm5EaXNwb3NhYmxlKGRlbCwgZm4sIHJldCkge1xuICAgICAgdGhpcy5fZGVsID0gZGVsO1xuICAgICAgdGhpcy5fZm4gPSBmbjtcbiAgICAgIHRoaXMuX3JldCA9IHJldDtcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIEV2ZW50UGF0dGVybkRpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZighdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgIGlzRnVuY3Rpb24odGhpcy5fZGVsKSAmJiB0aGlzLl9kZWwodGhpcy5fZm4sIHRoaXMuX3JldCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBFdmVudFBhdHRlcm5PYnNlcnZhYmxlO1xuICB9KE9ic2VydmFibGVCYXNlKSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBmcm9tIGFuIGV2ZW50IGVtaXR0ZXIgdmlhIGFuIGFkZEhhbmRsZXIvcmVtb3ZlSGFuZGxlciBwYWlyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZGRIYW5kbGVyIFRoZSBmdW5jdGlvbiB0byBhZGQgYSBoYW5kbGVyIHRvIHRoZSBlbWl0dGVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVtb3ZlSGFuZGxlcl0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIGhhbmRsZXIgZnJvbSBhbiBlbWl0dGVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIEEgc2VsZWN0b3Igd2hpY2ggdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBldmVudCBoYW5kbGVyIHRvIHByb2R1Y2UgYSBzaW5nbGUgaXRlbSB0byB5aWVsZCBvbiBuZXh0LlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aGljaCB3cmFwcyBhbiBldmVudCBmcm9tIGFuIGV2ZW50IGVtaXR0ZXJcbiAgICovXG4gIHZhciBmcm9tRXZlbnRQYXR0ZXJuID0gT2JzZXJ2YWJsZS5mcm9tRXZlbnRQYXR0ZXJuID0gZnVuY3Rpb24gKGFkZEhhbmRsZXIsIHJlbW92ZUhhbmRsZXIsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIG5ldyBFdmVudFBhdHRlcm5PYnNlcnZhYmxlKGFkZEhhbmRsZXIsIHJlbW92ZUhhbmRsZXIsIHNlbGVjdG9yKS5wdWJsaXNoKCkucmVmQ291bnQoKTtcbiAgfTtcblxuICB2YXIgRnJvbVByb21pc2VPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKEZyb21Qcm9taXNlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBGcm9tUHJvbWlzZU9ic2VydmFibGUocCwgcykge1xuICAgICAgdGhpcy5fcCA9IHA7XG4gICAgICB0aGlzLl9zID0gcztcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlTmV4dChzLCBzdGF0ZSkge1xuICAgICAgdmFyIG8gPSBzdGF0ZVswXSwgZGF0YSA9IHN0YXRlWzFdO1xuICAgICAgby5vbk5leHQoZGF0YSk7XG4gICAgICBvLm9uQ29tcGxldGVkKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2NoZWR1bGVFcnJvcihzLCBzdGF0ZSkge1xuICAgICAgdmFyIG8gPSBzdGF0ZVswXSwgZXJyID0gc3RhdGVbMV07XG4gICAgICBvLm9uRXJyb3IoZXJyKTtcbiAgICB9XG5cbiAgICBGcm9tUHJvbWlzZU9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbihvKSB7XG4gICAgICB2YXIgc2FkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCksIHNlbGYgPSB0aGlzO1xuXG4gICAgICB0aGlzLl9wXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgc2FkLnNldERpc3Bvc2FibGUoc2VsZi5fcy5zY2hlZHVsZShbbywgZGF0YV0sIHNjaGVkdWxlTmV4dCkpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgc2FkLnNldERpc3Bvc2FibGUoc2VsZi5fcy5zY2hlZHVsZShbbywgZXJyXSwgc2NoZWR1bGVFcnJvcikpO1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNhZDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEZyb21Qcm9taXNlT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIC8qKlxuICAqIENvbnZlcnRzIGEgUHJvbWlzZSB0byBhbiBPYnNlcnZhYmxlIHNlcXVlbmNlXG4gICogQHBhcmFtIHtQcm9taXNlfSBBbiBFUzYgQ29tcGxpYW50IHByb21pc2UuXG4gICogQHJldHVybnMge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgc2VxdWVuY2Ugd2hpY2ggd3JhcHMgdGhlIGV4aXN0aW5nIHByb21pc2Ugc3VjY2VzcyBhbmQgZmFpbHVyZS5cbiAgKi9cbiAgdmFyIG9ic2VydmFibGVGcm9tUHJvbWlzZSA9IE9ic2VydmFibGUuZnJvbVByb21pc2UgPSBmdW5jdGlvbiAocHJvbWlzZSwgc2NoZWR1bGVyKSB7XG4gICAgc2NoZWR1bGVyIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcbiAgICByZXR1cm4gbmV3IEZyb21Qcm9taXNlT2JzZXJ2YWJsZShwcm9taXNlLCBzY2hlZHVsZXIpO1xuICB9O1xuXG4gIC8qXG4gICAqIENvbnZlcnRzIGFuIGV4aXN0aW5nIG9ic2VydmFibGUgc2VxdWVuY2UgdG8gYW4gRVM2IENvbXBhdGlibGUgUHJvbWlzZVxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcHJvbWlzZSA9IFJ4Lk9ic2VydmFibGUucmV0dXJuKDQyKS50b1Byb21pc2UoUlNWUC5Qcm9taXNlKTtcbiAgICpcbiAgICogLy8gV2l0aCBjb25maWdcbiAgICogUnguY29uZmlnLlByb21pc2UgPSBSU1ZQLlByb21pc2U7XG4gICAqIHZhciBwcm9taXNlID0gUnguT2JzZXJ2YWJsZS5yZXR1cm4oNDIpLnRvUHJvbWlzZSgpO1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvbWlzZUN0b3JdIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcHJvbWlzZS4gSWYgbm90IHByb3ZpZGVkLCBpdCBsb29rcyBmb3IgaXQgaW4gUnguY29uZmlnLlByb21pc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBbiBFUzYgY29tcGF0aWJsZSBwcm9taXNlIHdpdGggdGhlIGxhc3QgdmFsdWUgZnJvbSB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by50b1Byb21pc2UgPSBmdW5jdGlvbiAocHJvbWlzZUN0b3IpIHtcbiAgICBwcm9taXNlQ3RvciB8fCAocHJvbWlzZUN0b3IgPSBSeC5jb25maWcuUHJvbWlzZSk7XG4gICAgaWYgKCFwcm9taXNlQ3RvcikgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoJ1Byb21pc2UgdHlwZSBub3QgcHJvdmlkZWQgbm9yIGluIFJ4LmNvbmZpZy5Qcm9taXNlJyk7IH1cbiAgICB2YXIgc291cmNlID0gdGhpcztcbiAgICByZXR1cm4gbmV3IHByb21pc2VDdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIC8vIE5vIGNhbmNlbGxhdGlvbiBjYW4gYmUgZG9uZVxuICAgICAgdmFyIHZhbHVlO1xuICAgICAgc291cmNlLnN1YnNjcmliZShmdW5jdGlvbiAodikge1xuICAgICAgICB2YWx1ZSA9IHY7XG4gICAgICB9LCByZWplY3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogSW52b2tlcyB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLCBzdXJmYWNpbmcgdGhlIHJlc3VsdCB0aHJvdWdoIGFuIG9ic2VydmFibGUgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uQXN5bmMgQXN5bmNocm9ub3VzIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBQcm9taXNlIHRvIHJ1bi5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgZXhwb3NpbmcgdGhlIGZ1bmN0aW9uJ3MgcmVzdWx0IHZhbHVlLCBvciBhbiBleGNlcHRpb24uXG4gICAqL1xuICBPYnNlcnZhYmxlLnN0YXJ0QXN5bmMgPSBmdW5jdGlvbiAoZnVuY3Rpb25Bc3luYykge1xuICAgIHZhciBwcm9taXNlID0gdHJ5Q2F0Y2goZnVuY3Rpb25Bc3luYykoKTtcbiAgICBpZiAocHJvbWlzZSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG9ic2VydmFibGVUaHJvdyhwcm9taXNlLmUpOyB9XG4gICAgcmV0dXJuIG9ic2VydmFibGVGcm9tUHJvbWlzZShwcm9taXNlKTtcbiAgfTtcblxuICB2YXIgTXVsdGljYXN0T2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoTXVsdGljYXN0T2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBNdWx0aWNhc3RPYnNlcnZhYmxlKHNvdXJjZSwgZm4xLCBmbjIpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5fZm4xID0gZm4xO1xuICAgICAgdGhpcy5fZm4yID0gZm4yO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgTXVsdGljYXN0T2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlQ29yZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgY29ubmVjdGFibGUgPSB0aGlzLnNvdXJjZS5tdWx0aWNhc3QodGhpcy5fZm4xKCkpO1xuICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKHRoaXMuX2ZuMihjb25uZWN0YWJsZSkuc3Vic2NyaWJlKG8pLCBjb25uZWN0YWJsZS5jb25uZWN0KCkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gTXVsdGljYXN0T2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIC8qKlxuICAgKiBNdWx0aWNhc3RzIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugbm90aWZpY2F0aW9ucyB0aHJvdWdoIGFuIGluc3RhbnRpYXRlZCBzdWJqZWN0IGludG8gYWxsIHVzZXMgb2YgdGhlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLiBFYWNoXG4gICAqIHN1YnNjcmlwdGlvbiB0byB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlIGNhdXNlcyBhIHNlcGFyYXRlIG11bHRpY2FzdCBpbnZvY2F0aW9uLCBleHBvc2luZyB0aGUgc2VxdWVuY2UgcmVzdWx0aW5nIGZyb20gdGhlIHNlbGVjdG9yIGZ1bmN0aW9uJ3NcbiAgICogaW52b2NhdGlvbi4gRm9yIHNwZWNpYWxpemF0aW9ucyB3aXRoIGZpeGVkIHN1YmplY3QgdHlwZXMsIHNlZSBQdWJsaXNoLCBQdWJsaXNoTGFzdCwgYW5kIFJlcGxheS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogMSAtIHJlcyA9IHNvdXJjZS5tdWx0aWNhc3Qob2JzZXJ2YWJsZSk7XG4gICAqIDIgLSByZXMgPSBzb3VyY2UubXVsdGljYXN0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBTdWJqZWN0KCk7IH0sIGZ1bmN0aW9uICh4KSB7IHJldHVybiB4OyB9KTtcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbnxTdWJqZWN0fSBzdWJqZWN0T3JTdWJqZWN0U2VsZWN0b3JcbiAgICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gaW50ZXJtZWRpYXRlIHN1YmplY3QgdGhyb3VnaCB3aGljaCB0aGUgc291cmNlIHNlcXVlbmNlJ3MgZWxlbWVudHMgd2lsbCBiZSBtdWx0aWNhc3QgdG8gdGhlIHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKiBPcjpcbiAgICogU3ViamVjdCB0byBwdXNoIHNvdXJjZSBlbGVtZW50cyBpbnRvLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2VsZWN0b3JdIE9wdGlvbmFsIHNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiB1c2UgdGhlIG11bHRpY2FzdGVkIHNvdXJjZSBzZXF1ZW5jZSBzdWJqZWN0IHRvIHRoZSBwb2xpY2llcyBlbmZvcmNlZCBieSB0aGUgY3JlYXRlZCBzdWJqZWN0LiBTcGVjaWZpZWQgb25seSBpZiA8cGFyYW1yZWYgbmFtZT1cInN1YmplY3RPclN1YmplY3RTZWxlY3RvclwiIGlzIGEgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBwcm9kdWNlZCBieSBtdWx0aWNhc3RpbmcgdGhlIHNvdXJjZSBzZXF1ZW5jZSB3aXRoaW4gYSBzZWxlY3RvciBmdW5jdGlvbi5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5tdWx0aWNhc3QgPSBmdW5jdGlvbiAoc3ViamVjdE9yU3ViamVjdFNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKHN1YmplY3RPclN1YmplY3RTZWxlY3RvcikgP1xuICAgICAgbmV3IE11bHRpY2FzdE9ic2VydmFibGUodGhpcywgc3ViamVjdE9yU3ViamVjdFNlbGVjdG9yLCBzZWxlY3RvcikgOlxuICAgICAgbmV3IENvbm5lY3RhYmxlT2JzZXJ2YWJsZSh0aGlzLCBzdWJqZWN0T3JTdWJqZWN0U2VsZWN0b3IpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBzZWxlY3RvciBvbiBhIGNvbm5lY3RhYmxlIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBzaGFyZXMgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlLlxuICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgTXVsdGljYXN0IHVzaW5nIGEgcmVndWxhciBTdWJqZWN0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcmVzcmVzID0gc291cmNlLnB1Ymxpc2goKTtcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5wdWJsaXNoKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4OyB9KTtcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NlbGVjdG9yXSBTZWxlY3RvciBmdW5jdGlvbiB3aGljaCBjYW4gdXNlIHRoZSBtdWx0aWNhc3RlZCBzb3VyY2Ugc2VxdWVuY2UgYXMgbWFueSB0aW1lcyBhcyBuZWVkZWQsIHdpdGhvdXQgY2F1c2luZyBtdWx0aXBsZSBzdWJzY3JpcHRpb25zIHRvIHRoZSBzb3VyY2Ugc2VxdWVuY2UuIFN1YnNjcmliZXJzIHRvIHRoZSBnaXZlbiBzb3VyY2Ugd2lsbCByZWNlaXZlIGFsbCBub3RpZmljYXRpb25zIG9mIHRoZSBzb3VyY2UgZnJvbSB0aGUgdGltZSBvZiB0aGUgc3Vic2NyaXB0aW9uIG9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnB1Ymxpc2ggPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gc2VsZWN0b3IgJiYgaXNGdW5jdGlvbihzZWxlY3RvcikgP1xuICAgICAgdGhpcy5tdWx0aWNhc3QoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFN1YmplY3QoKTsgfSwgc2VsZWN0b3IpIDpcbiAgICAgIHRoaXMubXVsdGljYXN0KG5ldyBTdWJqZWN0KCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBzaGFyZXMgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlLlxuICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgcHVibGlzaCB3aGljaCBjcmVhdGVzIGEgc3Vic2NyaXB0aW9uIHdoZW4gdGhlIG51bWJlciBvZiBvYnNlcnZlcnMgZ29lcyBmcm9tIHplcm8gdG8gb25lLCB0aGVuIHNoYXJlcyB0aGF0IHN1YnNjcmlwdGlvbiB3aXRoIGFsbCBzdWJzZXF1ZW50IG9ic2VydmVycyB1bnRpbCB0aGUgbnVtYmVyIG9mIG9ic2VydmVycyByZXR1cm5zIHRvIHplcm8sIGF0IHdoaWNoIHBvaW50IHRoZSBzdWJzY3JpcHRpb24gaXMgZGlzcG9zZWQuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uc2hhcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMucHVibGlzaCgpLnJlZkNvdW50KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIHNlbGVjdG9yIG9uIGEgY29ubmVjdGFibGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNoYXJlcyBhIHNpbmdsZSBzdWJzY3JpcHRpb24gdG8gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UgY29udGFpbmluZyBvbmx5IHRoZSBsYXN0IG5vdGlmaWNhdGlvbi5cbiAgICogVGhpcyBvcGVyYXRvciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIE11bHRpY2FzdCB1c2luZyBhIEFzeW5jU3ViamVjdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5wdWJsaXNoTGFzdCgpO1xuICAgKiB2YXIgcmVzID0gc291cmNlLnB1Ymxpc2hMYXN0KGZ1bmN0aW9uICh4KSB7IHJldHVybiB4OyB9KTtcbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdG9yIFtPcHRpb25hbF0gU2VsZWN0b3IgZnVuY3Rpb24gd2hpY2ggY2FuIHVzZSB0aGUgbXVsdGljYXN0ZWQgc291cmNlIHNlcXVlbmNlIGFzIG1hbnkgdGltZXMgYXMgbmVlZGVkLCB3aXRob3V0IGNhdXNpbmcgbXVsdGlwbGUgc3Vic2NyaXB0aW9ucyB0byB0aGUgc291cmNlIHNlcXVlbmNlLiBTdWJzY3JpYmVycyB0byB0aGUgZ2l2ZW4gc291cmNlIHdpbGwgb25seSByZWNlaXZlIHRoZSBsYXN0IG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnB1Ymxpc2hMYXN0ID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yICYmIGlzRnVuY3Rpb24oc2VsZWN0b3IpID9cbiAgICAgIHRoaXMubXVsdGljYXN0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBBc3luY1N1YmplY3QoKTsgfSwgc2VsZWN0b3IpIDpcbiAgICAgIHRoaXMubXVsdGljYXN0KG5ldyBBc3luY1N1YmplY3QoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIHNlbGVjdG9yIG9uIGEgY29ubmVjdGFibGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHNoYXJlcyBhIHNpbmdsZSBzdWJzY3JpcHRpb24gdG8gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UgYW5kIHN0YXJ0cyB3aXRoIGluaXRpYWxWYWx1ZS5cbiAgICogVGhpcyBvcGVyYXRvciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIE11bHRpY2FzdCB1c2luZyBhIEJlaGF2aW9yU3ViamVjdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5wdWJsaXNoVmFsdWUoNDIpO1xuICAgKiB2YXIgcmVzID0gc291cmNlLnB1Ymxpc2hWYWx1ZShmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5zZWxlY3QoZnVuY3Rpb24gKHkpIHsgcmV0dXJuIHkgKiB5OyB9KSB9LCA0Mik7XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtzZWxlY3Rvcl0gT3B0aW9uYWwgc2VsZWN0b3IgZnVuY3Rpb24gd2hpY2ggY2FuIHVzZSB0aGUgbXVsdGljYXN0ZWQgc291cmNlIHNlcXVlbmNlIGFzIG1hbnkgdGltZXMgYXMgbmVlZGVkLCB3aXRob3V0IGNhdXNpbmcgbXVsdGlwbGUgc3Vic2NyaXB0aW9ucyB0byB0aGUgc291cmNlIHNlcXVlbmNlLiBTdWJzY3JpYmVycyB0byB0aGUgZ2l2ZW4gc291cmNlIHdpbGwgcmVjZWl2ZSBpbW1lZGlhdGVseSByZWNlaXZlIHRoZSBpbml0aWFsIHZhbHVlLCBmb2xsb3dlZCBieSBhbGwgbm90aWZpY2F0aW9ucyBvZiB0aGUgc291cmNlIGZyb20gdGhlIHRpbWUgb2YgdGhlIHN1YnNjcmlwdGlvbiBvbi5cbiAgICogQHBhcmFtIHtNaXhlZH0gaW5pdGlhbFZhbHVlIEluaXRpYWwgdmFsdWUgcmVjZWl2ZWQgYnkgb2JzZXJ2ZXJzIHVwb24gc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlIHdpdGhpbiBhIHNlbGVjdG9yIGZ1bmN0aW9uLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnB1Ymxpc2hWYWx1ZSA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWVPclNlbGVjdG9yLCBpbml0aWFsVmFsdWUpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMiA/XG4gICAgICB0aGlzLm11bHRpY2FzdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmVoYXZpb3JTdWJqZWN0KGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LCBpbml0aWFsVmFsdWVPclNlbGVjdG9yKSA6XG4gICAgICB0aGlzLm11bHRpY2FzdChuZXcgQmVoYXZpb3JTdWJqZWN0KGluaXRpYWxWYWx1ZU9yU2VsZWN0b3IpKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSBhbmQgc3RhcnRzIHdpdGggYW4gaW5pdGlhbFZhbHVlLlxuICAgKiBUaGlzIG9wZXJhdG9yIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgcHVibGlzaFZhbHVlIHdoaWNoIGNyZWF0ZXMgYSBzdWJzY3JpcHRpb24gd2hlbiB0aGUgbnVtYmVyIG9mIG9ic2VydmVycyBnb2VzIGZyb20gemVybyB0byBvbmUsIHRoZW4gc2hhcmVzIHRoYXQgc3Vic2NyaXB0aW9uIHdpdGggYWxsIHN1YnNlcXVlbnQgb2JzZXJ2ZXJzIHVudGlsIHRoZSBudW1iZXIgb2Ygb2JzZXJ2ZXJzIHJldHVybnMgdG8gemVybywgYXQgd2hpY2ggcG9pbnQgdGhlIHN1YnNjcmlwdGlvbiBpcyBkaXNwb3NlZC5cbiAgICogQHBhcmFtIHtNaXhlZH0gaW5pdGlhbFZhbHVlIEluaXRpYWwgdmFsdWUgcmVjZWl2ZWQgYnkgb2JzZXJ2ZXJzIHVwb24gc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IG11bHRpY2FzdGluZyB0aGUgc291cmNlIHNlcXVlbmNlLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnNoYXJlVmFsdWUgPSBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMucHVibGlzaFZhbHVlKGluaXRpYWxWYWx1ZSkucmVmQ291bnQoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgc2VsZWN0b3Igb24gYSBjb25uZWN0YWJsZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgc2hhcmVzIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiB0byB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSByZXBsYXlpbmcgbm90aWZpY2F0aW9ucyBzdWJqZWN0IHRvIGEgbWF4aW11bSB0aW1lIGxlbmd0aCBmb3IgdGhlIHJlcGxheSBidWZmZXIuXG4gICAqIFRoaXMgb3BlcmF0b3IgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiBNdWx0aWNhc3QgdXNpbmcgYSBSZXBsYXlTdWJqZWN0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcmVzID0gc291cmNlLnJlcGxheShudWxsLCAzKTtcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5yZXBsYXkobnVsbCwgMywgNTAwKTtcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5yZXBsYXkobnVsbCwgMywgNTAwLCBzY2hlZHVsZXIpO1xuICAgKiB2YXIgcmVzID0gc291cmNlLnJlcGxheShmdW5jdGlvbiAoeCkgeyByZXR1cm4geC50YWtlKDYpLnJlcGVhdCgpOyB9LCAzLCA1MDAsIHNjaGVkdWxlcik7XG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3RvciBbT3B0aW9uYWxdIFNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiB1c2UgdGhlIG11bHRpY2FzdGVkIHNvdXJjZSBzZXF1ZW5jZSBhcyBtYW55IHRpbWVzIGFzIG5lZWRlZCwgd2l0aG91dCBjYXVzaW5nIG11bHRpcGxlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNvdXJjZSBzZXF1ZW5jZS4gU3Vic2NyaWJlcnMgdG8gdGhlIGdpdmVuIHNvdXJjZSB3aWxsIHJlY2VpdmUgYWxsIHRoZSBub3RpZmljYXRpb25zIG9mIHRoZSBzb3VyY2Ugc3ViamVjdCB0byB0aGUgc3BlY2lmaWVkIHJlcGxheSBidWZmZXIgdHJpbW1pbmcgcG9saWN5LlxuICAgKiBAcGFyYW0gYnVmZmVyU2l6ZSBbT3B0aW9uYWxdIE1heGltdW0gZWxlbWVudCBjb3VudCBvZiB0aGUgcmVwbGF5IGJ1ZmZlci5cbiAgICogQHBhcmFtIHdpbmRvd1NpemUgW09wdGlvbmFsXSBNYXhpbXVtIHRpbWUgbGVuZ3RoIG9mIHRoZSByZXBsYXkgYnVmZmVyLlxuICAgKiBAcGFyYW0gc2NoZWR1bGVyIFtPcHRpb25hbF0gU2NoZWR1bGVyIHdoZXJlIGNvbm5lY3RlZCBvYnNlcnZlcnMgd2l0aGluIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb24uXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugd2l0aGluIGEgc2VsZWN0b3IgZnVuY3Rpb24uXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8ucmVwbGF5ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBidWZmZXJTaXplLCB3aW5kb3dTaXplLCBzY2hlZHVsZXIpIHtcbiAgICByZXR1cm4gc2VsZWN0b3IgJiYgaXNGdW5jdGlvbihzZWxlY3RvcikgP1xuICAgICAgdGhpcy5tdWx0aWNhc3QoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFJlcGxheVN1YmplY3QoYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKTsgfSwgc2VsZWN0b3IpIDpcbiAgICAgIHRoaXMubXVsdGljYXN0KG5ldyBSZXBsYXlTdWJqZWN0KGJ1ZmZlclNpemUsIHdpbmRvd1NpemUsIHNjaGVkdWxlcikpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBzaGFyZXMgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlIHJlcGxheWluZyBub3RpZmljYXRpb25zIHN1YmplY3QgdG8gYSBtYXhpbXVtIHRpbWUgbGVuZ3RoIGZvciB0aGUgcmVwbGF5IGJ1ZmZlci5cbiAgICogVGhpcyBvcGVyYXRvciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIHJlcGxheSB3aGljaCBjcmVhdGVzIGEgc3Vic2NyaXB0aW9uIHdoZW4gdGhlIG51bWJlciBvZiBvYnNlcnZlcnMgZ29lcyBmcm9tIHplcm8gdG8gb25lLCB0aGVuIHNoYXJlcyB0aGF0IHN1YnNjcmlwdGlvbiB3aXRoIGFsbCBzdWJzZXF1ZW50IG9ic2VydmVycyB1bnRpbCB0aGUgbnVtYmVyIG9mIG9ic2VydmVycyByZXR1cm5zIHRvIHplcm8sIGF0IHdoaWNoIHBvaW50IHRoZSBzdWJzY3JpcHRpb24gaXMgZGlzcG9zZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciByZXMgPSBzb3VyY2Uuc2hhcmVSZXBsYXkoMyk7XG4gICAqIHZhciByZXMgPSBzb3VyY2Uuc2hhcmVSZXBsYXkoMywgNTAwKTtcbiAgICogdmFyIHJlcyA9IHNvdXJjZS5zaGFyZVJlcGxheSgzLCA1MDAsIHNjaGVkdWxlcik7XG4gICAqXG5cbiAgICogQHBhcmFtIGJ1ZmZlclNpemUgW09wdGlvbmFsXSBNYXhpbXVtIGVsZW1lbnQgY291bnQgb2YgdGhlIHJlcGxheSBidWZmZXIuXG4gICAqIEBwYXJhbSB3aW5kb3cgW09wdGlvbmFsXSBNYXhpbXVtIHRpbWUgbGVuZ3RoIG9mIHRoZSByZXBsYXkgYnVmZmVyLlxuICAgKiBAcGFyYW0gc2NoZWR1bGVyIFtPcHRpb25hbF0gU2NoZWR1bGVyIHdoZXJlIGNvbm5lY3RlZCBvYnNlcnZlcnMgd2l0aGluIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb24uXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgcHJvZHVjZWQgYnkgbXVsdGljYXN0aW5nIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uc2hhcmVSZXBsYXkgPSBmdW5jdGlvbiAoYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGF5KG51bGwsIGJ1ZmZlclNpemUsIHdpbmRvd1NpemUsIHNjaGVkdWxlcikucmVmQ291bnQoKTtcbiAgfTtcblxuICB2YXIgUmVmQ291bnRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhSZWZDb3VudE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gUmVmQ291bnRPYnNlcnZhYmxlKHNvdXJjZSkge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aGlzLl9jb3VudCA9IDA7XG4gICAgICB0aGlzLl9jb25uZWN0YWJsZVN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBSZWZDb3VudE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIHNob3VsZENvbm5lY3QgPSArK3RoaXMuX2NvdW50ID09PSAxLCBzdWJzY3JpcHRpb24gPSB0aGlzLnNvdXJjZS5zdWJzY3JpYmUobyk7XG4gICAgICBzaG91bGRDb25uZWN0ICYmICh0aGlzLl9jb25uZWN0YWJsZVN1YnNjcmlwdGlvbiA9IHRoaXMuc291cmNlLmNvbm5lY3QoKSk7XG4gICAgICByZXR1cm4gbmV3IFJlZkNvdW50RGlzcG9zYWJsZSh0aGlzLCBzdWJzY3JpcHRpb24pO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBSZWZDb3VudERpc3Bvc2FibGUocCwgcykge1xuICAgICAgdGhpcy5fcCA9IHA7XG4gICAgICB0aGlzLl9zID0gcztcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIFJlZkNvdW50RGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3MuZGlzcG9zZSgpO1xuICAgICAgICAtLXRoaXMuX3AuX2NvdW50ID09PSAwICYmIHRoaXMuX3AuX2Nvbm5lY3RhYmxlU3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFJlZkNvdW50T2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBDb25uZWN0YWJsZU9ic2VydmFibGUgPSBSeC5Db25uZWN0YWJsZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKENvbm5lY3RhYmxlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBDb25uZWN0YWJsZU9ic2VydmFibGUoc291cmNlLCBzdWJqZWN0KSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuX2hhc1N1YnNjcmlwdGlvbiAgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICB0aGlzLl9zb3VyY2VPYnNlcnZhYmxlID0gc291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IHN1YmplY3Q7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDb25uZWN0RGlzcG9zYWJsZShwYXJlbnQpIHtcbiAgICAgIHRoaXMuX3AgPSBwYXJlbnQ7XG4gICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBDb25uZWN0RGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3AuX2hhc1N1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBDb25uZWN0YWJsZU9ic2VydmFibGUucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMuX2hhc1N1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLl9oYXNTdWJzY3JpcHRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSBuZXcgQmluYXJ5RGlzcG9zYWJsZShcbiAgICAgICAgICB0aGlzLl9zb3VyY2VPYnNlcnZhYmxlLnN1YnNjcmliZSh0aGlzLl9zdWJqZWN0KSxcbiAgICAgICAgICBuZXcgQ29ubmVjdERpc3Bvc2FibGUodGhpcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpcHRpb247XG4gICAgfTtcblxuICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3ViamVjdC5zdWJzY3JpYmUobyk7XG4gICAgfTtcblxuICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVmQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IFJlZkNvdW50T2JzZXJ2YWJsZSh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlKSk7XG5cbiAgdmFyIFRpbWVyT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhUaW1lck9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gVGltZXJPYnNlcnZhYmxlKGR0LCBzKSB7XG4gICAgICB0aGlzLl9kdCA9IGR0O1xuICAgICAgdGhpcy5fcyA9IHM7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBUaW1lck9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuX3Muc2NoZWR1bGVGdXR1cmUobywgdGhpcy5fZHQsIHNjaGVkdWxlTWV0aG9kKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gc2NoZWR1bGVNZXRob2Qocywgbykge1xuICAgICAgby5vbk5leHQoMCk7XG4gICAgICBvLm9uQ29tcGxldGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFRpbWVyT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIGZ1bmN0aW9uIF9vYnNlcnZhYmxlVGltZXIoZHVlVGltZSwgc2NoZWR1bGVyKSB7XG4gICAgcmV0dXJuIG5ldyBUaW1lck9ic2VydmFibGUoZHVlVGltZSwgc2NoZWR1bGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ic2VydmFibGVUaW1lckRhdGVBbmRQZXJpb2QoZHVlVGltZSwgcGVyaW9kLCBzY2hlZHVsZXIpIHtcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2YXIgZCA9IGR1ZVRpbWUsIHAgPSBub3JtYWxpemVUaW1lKHBlcmlvZCk7XG4gICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlRnV0dXJlKDAsIGQsIGZ1bmN0aW9uIChjb3VudCwgc2VsZikge1xuICAgICAgICBpZiAocCA+IDApIHtcbiAgICAgICAgICB2YXIgbm93ID0gc2NoZWR1bGVyLm5vdygpO1xuICAgICAgICAgIGQgPSBuZXcgRGF0ZShkLmdldFRpbWUoKSArIHApO1xuICAgICAgICAgIGQuZ2V0VGltZSgpIDw9IG5vdyAmJiAoZCA9IG5ldyBEYXRlKG5vdyArIHApKTtcbiAgICAgICAgfVxuICAgICAgICBvYnNlcnZlci5vbk5leHQoY291bnQpO1xuICAgICAgICBzZWxmKGNvdW50ICsgMSwgbmV3IERhdGUoZCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvYnNlcnZhYmxlVGltZXJUaW1lU3BhbkFuZFBlcmlvZChkdWVUaW1lLCBwZXJpb2QsIHNjaGVkdWxlcikge1xuICAgIHJldHVybiBkdWVUaW1lID09PSBwZXJpb2QgP1xuICAgICAgbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGVQZXJpb2RpYygwLCBwZXJpb2QsIGZ1bmN0aW9uIChjb3VudCkge1xuICAgICAgICAgIG9ic2VydmVyLm9uTmV4dChjb3VudCk7XG4gICAgICAgICAgcmV0dXJuIGNvdW50ICsgMTtcbiAgICAgICAgfSk7XG4gICAgICB9KSA6XG4gICAgICBvYnNlcnZhYmxlRGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVRpbWVyRGF0ZUFuZFBlcmlvZChuZXcgRGF0ZShzY2hlZHVsZXIubm93KCkgKyBkdWVUaW1lKSwgcGVyaW9kLCBzY2hlZHVsZXIpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYWZ0ZXIgZWFjaCBwZXJpb2QuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAxIC0gcmVzID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKTtcbiAgICogIDIgLSByZXMgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDAsIFJ4LlNjaGVkdWxlci50aW1lb3V0KTtcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBlcmlvZCBQZXJpb2QgZm9yIHByb2R1Y2luZyB0aGUgdmFsdWVzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UgKHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGRlbm90aW5nIG1pbGxpc2Vjb25kcykuXG4gICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBTY2hlZHVsZXIgdG8gcnVuIHRoZSB0aW1lciBvbi4gSWYgbm90IHNwZWNpZmllZCwgUnguU2NoZWR1bGVyLnRpbWVvdXQgaXMgdXNlZC5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgdGhhdCBwcm9kdWNlcyBhIHZhbHVlIGFmdGVyIGVhY2ggcGVyaW9kLlxuICAgKi9cbiAgdmFyIG9ic2VydmFibGVpbnRlcnZhbCA9IE9ic2VydmFibGUuaW50ZXJ2YWwgPSBmdW5jdGlvbiAocGVyaW9kLCBzY2hlZHVsZXIpIHtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZVRpbWVyVGltZVNwYW5BbmRQZXJpb2QocGVyaW9kLCBwZXJpb2QsIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgPyBzY2hlZHVsZXIgOiBkZWZhdWx0U2NoZWR1bGVyKTtcbiAgfTtcblxuICAvKipcbiAgICogIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYWZ0ZXIgZHVlVGltZSBoYXMgZWxhcHNlZCBhbmQgdGhlbiBhZnRlciBlYWNoIHBlcmlvZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGR1ZVRpbWUgQWJzb2x1dGUgKHNwZWNpZmllZCBhcyBhIERhdGUgb2JqZWN0KSBvciByZWxhdGl2ZSB0aW1lIChzcGVjaWZpZWQgYXMgYW4gaW50ZWdlciBkZW5vdGluZyBtaWxsaXNlY29uZHMpIGF0IHdoaWNoIHRvIHByb2R1Y2UgdGhlIGZpcnN0IHZhbHVlLlxuICAgKiBAcGFyYW0ge01peGVkfSBbcGVyaW9kT3JTY2hlZHVsZXJdICBQZXJpb2QgdG8gcHJvZHVjZSBzdWJzZXF1ZW50IHZhbHVlcyAoc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgZGVub3RpbmcgbWlsbGlzZWNvbmRzKSwgb3IgdGhlIHNjaGVkdWxlciB0byBydW4gdGhlIHRpbWVyIG9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgcmVzdWx0aW5nIHRpbWVyIGlzIG5vdCByZWN1cnJpbmcuXG4gICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSAgU2NoZWR1bGVyIHRvIHJ1biB0aGUgdGltZXIgb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0aW1lb3V0IHNjaGVkdWxlciBpcyB1c2VkLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYWZ0ZXIgZHVlIHRpbWUgaGFzIGVsYXBzZWQgYW5kIHRoZW4gZWFjaCBwZXJpb2QuXG4gICAqL1xuICB2YXIgb2JzZXJ2YWJsZVRpbWVyID0gT2JzZXJ2YWJsZS50aW1lciA9IGZ1bmN0aW9uIChkdWVUaW1lLCBwZXJpb2RPclNjaGVkdWxlciwgc2NoZWR1bGVyKSB7XG4gICAgdmFyIHBlcmlvZDtcbiAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcbiAgICBpZiAocGVyaW9kT3JTY2hlZHVsZXIgIT0gbnVsbCAmJiB0eXBlb2YgcGVyaW9kT3JTY2hlZHVsZXIgPT09ICdudW1iZXInKSB7XG4gICAgICBwZXJpb2QgPSBwZXJpb2RPclNjaGVkdWxlcjtcbiAgICB9IGVsc2UgaWYgKGlzU2NoZWR1bGVyKHBlcmlvZE9yU2NoZWR1bGVyKSkge1xuICAgICAgc2NoZWR1bGVyID0gcGVyaW9kT3JTY2hlZHVsZXI7XG4gICAgfVxuICAgIGlmICgoZHVlVGltZSBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIGR1ZVRpbWUgPT09ICdudW1iZXInKSAmJiBwZXJpb2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGltZXIoZHVlVGltZSwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGR1ZVRpbWUgaW5zdGFuY2VvZiBEYXRlICYmIHBlcmlvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZVRpbWVyRGF0ZUFuZFBlcmlvZChkdWVUaW1lLmdldFRpbWUoKSwgcGVyaW9kT3JTY2hlZHVsZXIsIHNjaGVkdWxlcik7XG4gICAgfVxuICAgIHJldHVybiBvYnNlcnZhYmxlVGltZXJUaW1lU3BhbkFuZFBlcmlvZChkdWVUaW1lLCBwZXJpb2QsIHNjaGVkdWxlcik7XG4gIH07XG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZURlbGF5UmVsYXRpdmUoc291cmNlLCBkdWVUaW1lLCBzY2hlZHVsZXIpIHtcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBhY3RpdmUgPSBmYWxzZSxcbiAgICAgICAgY2FuY2VsYWJsZSA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksXG4gICAgICAgIGV4Y2VwdGlvbiA9IG51bGwsXG4gICAgICAgIHEgPSBbXSxcbiAgICAgICAgcnVubmluZyA9IGZhbHNlLFxuICAgICAgICBzdWJzY3JpcHRpb247XG4gICAgICBzdWJzY3JpcHRpb24gPSBzb3VyY2UubWF0ZXJpYWxpemUoKS50aW1lc3RhbXAoc2NoZWR1bGVyKS5zdWJzY3JpYmUoZnVuY3Rpb24gKG5vdGlmaWNhdGlvbikge1xuICAgICAgICB2YXIgZCwgc2hvdWxkUnVuO1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uLnZhbHVlLmtpbmQgPT09ICdFJykge1xuICAgICAgICAgIHEgPSBbXTtcbiAgICAgICAgICBxLnB1c2gobm90aWZpY2F0aW9uKTtcbiAgICAgICAgICBleGNlcHRpb24gPSBub3RpZmljYXRpb24udmFsdWUuZXJyb3I7XG4gICAgICAgICAgc2hvdWxkUnVuID0gIXJ1bm5pbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcS5wdXNoKHsgdmFsdWU6IG5vdGlmaWNhdGlvbi52YWx1ZSwgdGltZXN0YW1wOiBub3RpZmljYXRpb24udGltZXN0YW1wICsgZHVlVGltZSB9KTtcbiAgICAgICAgICBzaG91bGRSdW4gPSAhYWN0aXZlO1xuICAgICAgICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZFJ1bikge1xuICAgICAgICAgIGlmIChleGNlcHRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIG8ub25FcnJvcihleGNlcHRpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgICAgICAgICBjYW5jZWxhYmxlLnNldERpc3Bvc2FibGUoZCk7XG4gICAgICAgICAgICBkLnNldERpc3Bvc2FibGUoc2NoZWR1bGVyLnNjaGVkdWxlUmVjdXJzaXZlRnV0dXJlKG51bGwsIGR1ZVRpbWUsIGZ1bmN0aW9uIChfLCBzZWxmKSB7XG4gICAgICAgICAgICAgIHZhciBlLCByZWN1cnNlRHVlVGltZSwgcmVzdWx0LCBzaG91bGRSZWN1cnNlO1xuICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocS5sZW5ndGggPiAwICYmIHFbMF0udGltZXN0YW1wIC0gc2NoZWR1bGVyLm5vdygpIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHEuc2hpZnQoKS52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0LmFjY2VwdChvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gd2hpbGUgKHJlc3VsdCAhPT0gbnVsbCk7XG4gICAgICAgICAgICAgIHNob3VsZFJlY3Vyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmVjdXJzZUR1ZVRpbWUgPSAwO1xuICAgICAgICAgICAgICBpZiAocS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc2hvdWxkUmVjdXJzZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVjdXJzZUR1ZVRpbWUgPSBNYXRoLm1heCgwLCBxWzBdLnRpbWVzdGFtcCAtIHNjaGVkdWxlci5ub3coKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZSA9IGV4Y2VwdGlvbjtcbiAgICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAoZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG8ub25FcnJvcihlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSZWN1cnNlKSB7XG4gICAgICAgICAgICAgICAgc2VsZihudWxsLCByZWN1cnNlRHVlVGltZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKHN1YnNjcmlwdGlvbiwgY2FuY2VsYWJsZSk7XG4gICAgfSwgc291cmNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ic2VydmFibGVEZWxheUFic29sdXRlKHNvdXJjZSwgZHVlVGltZSwgc2NoZWR1bGVyKSB7XG4gICAgcmV0dXJuIG9ic2VydmFibGVEZWZlcihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZURlbGF5UmVsYXRpdmUoc291cmNlLCBkdWVUaW1lIC0gc2NoZWR1bGVyLm5vdygpLCBzY2hlZHVsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVsYXlXaXRoU2VsZWN0b3Ioc291cmNlLCBzdWJzY3JpcHRpb25EZWxheSwgZGVsYXlEdXJhdGlvblNlbGVjdG9yKSB7XG4gICAgdmFyIHN1YkRlbGF5LCBzZWxlY3RvcjtcbiAgICBpZiAoaXNGdW5jdGlvbihzdWJzY3JpcHRpb25EZWxheSkpIHtcbiAgICAgIHNlbGVjdG9yID0gc3Vic2NyaXB0aW9uRGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1YkRlbGF5ID0gc3Vic2NyaXB0aW9uRGVsYXk7XG4gICAgICBzZWxlY3RvciA9IGRlbGF5RHVyYXRpb25TZWxlY3RvcjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgZGVsYXlzID0gbmV3IENvbXBvc2l0ZURpc3Bvc2FibGUoKSwgYXRFbmQgPSBmYWxzZSwgc3Vic2NyaXB0aW9uID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKTtcblxuICAgICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoXG4gICAgICAgICAgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHZhciBkZWxheSA9IHRyeUNhdGNoKHNlbGVjdG9yKSh4KTtcbiAgICAgICAgICAgIGlmIChkZWxheSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihkZWxheS5lKTsgfVxuICAgICAgICAgICAgdmFyIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgICAgIGRlbGF5cy5hZGQoZCk7XG4gICAgICAgICAgICBkLnNldERpc3Bvc2FibGUoZGVsYXkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgby5vbk5leHQoeCk7XG4gICAgICAgICAgICAgICAgZGVsYXlzLnJlbW92ZShkKTtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIG8ub25OZXh0KHgpO1xuICAgICAgICAgICAgICAgIGRlbGF5cy5yZW1vdmUoZCk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhdEVuZCA9IHRydWU7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUgKCkge1xuICAgICAgICBhdEVuZCAmJiBkZWxheXMubGVuZ3RoID09PSAwICYmIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdWJEZWxheSkge1xuICAgICAgICBzdGFydCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUoc3ViRGVsYXkuc3Vic2NyaWJlKHN0YXJ0LCBmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sIHN0YXJ0KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIGRlbGF5cyk7XG4gICAgfSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogIFRpbWUgc2hpZnRzIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIGJ5IGR1ZVRpbWUuXG4gICAqICBUaGUgcmVsYXRpdmUgdGltZSBpbnRlcnZhbHMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBwcmVzZXJ2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkdWVUaW1lIEFic29sdXRlIChzcGVjaWZpZWQgYXMgYSBEYXRlIG9iamVjdCkgb3IgcmVsYXRpdmUgdGltZSAoc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgZGVub3RpbmcgbWlsbGlzZWNvbmRzKSBieSB3aGljaCB0byBzaGlmdCB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZS5cbiAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0byBydW4gdGhlIGRlbGF5IHRpbWVycyBvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHRpbWVvdXQgc2NoZWR1bGVyIGlzIHVzZWQuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBUaW1lLXNoaWZ0ZWQgc2VxdWVuY2UuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8uZGVsYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZpcnN0QXJnID0gYXJndW1lbnRzWzBdO1xuICAgIGlmICh0eXBlb2YgZmlyc3RBcmcgPT09ICdudW1iZXInIHx8IGZpcnN0QXJnIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgdmFyIGR1ZVRpbWUgPSBmaXJzdEFyZywgc2NoZWR1bGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gZGVmYXVsdFNjaGVkdWxlcik7XG4gICAgICByZXR1cm4gZHVlVGltZSBpbnN0YW5jZW9mIERhdGUgP1xuICAgICAgICBvYnNlcnZhYmxlRGVsYXlBYnNvbHV0ZSh0aGlzLCBkdWVUaW1lLCBzY2hlZHVsZXIpIDpcbiAgICAgICAgb2JzZXJ2YWJsZURlbGF5UmVsYXRpdmUodGhpcywgZHVlVGltZSwgc2NoZWR1bGVyKTtcbiAgICB9IGVsc2UgaWYgKE9ic2VydmFibGUuaXNPYnNlcnZhYmxlKGZpcnN0QXJnKSB8fCBpc0Z1bmN0aW9uKGZpcnN0QXJnKSkge1xuICAgICAgcmV0dXJuIGRlbGF5V2l0aFNlbGVjdG9yKHRoaXMsIGZpcnN0QXJnLCBhcmd1bWVudHNbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzJyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBEZWJvdW5jZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKERlYm91bmNlT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBEZWJvdW5jZU9ic2VydmFibGUoc291cmNlLCBkdCwgcykge1xuICAgICAgaXNTY2hlZHVsZXIocykgfHwgKHMgPSBkZWZhdWx0U2NoZWR1bGVyKTtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5fZHQgPSBkdDtcbiAgICAgIHRoaXMuX3MgPSBzO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgRGVib3VuY2VPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVDb3JlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBjYW5jZWxhYmxlID0gbmV3IFNlcmlhbERpc3Bvc2FibGUoKTtcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShcbiAgICAgICAgdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZWJvdW5jZU9ic2VydmVyKG8sIHRoaXMuc291cmNlLCB0aGlzLl9kdCwgdGhpcy5fcywgY2FuY2VsYWJsZSkpLFxuICAgICAgICBjYW5jZWxhYmxlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERlYm91bmNlT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBEZWJvdW5jZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhEZWJvdW5jZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIERlYm91bmNlT2JzZXJ2ZXIob2JzZXJ2ZXIsIHNvdXJjZSwgZHVlVGltZSwgc2NoZWR1bGVyLCBjYW5jZWxhYmxlKSB7XG4gICAgICB0aGlzLl9vID0gb2JzZXJ2ZXI7XG4gICAgICB0aGlzLl9zID0gc291cmNlO1xuICAgICAgdGhpcy5fZCA9IGR1ZVRpbWU7XG4gICAgICB0aGlzLl9zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICB0aGlzLl9jID0gY2FuY2VsYWJsZTtcbiAgICAgIHRoaXMuX3YgPSBudWxsO1xuICAgICAgdGhpcy5faHYgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lkID0gMDtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIERlYm91bmNlT2JzZXJ2ZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgdGhpcy5faHYgPSB0cnVlO1xuICAgICAgdGhpcy5fdiA9IHg7XG4gICAgICB2YXIgY3VycmVudElkID0gKyt0aGlzLl9pZCwgZCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuICAgICAgdGhpcy5fYy5zZXREaXNwb3NhYmxlKGQpO1xuICAgICAgZC5zZXREaXNwb3NhYmxlKHRoaXMuX3NjaGVkdWxlci5zY2hlZHVsZUZ1dHVyZSh0aGlzLCB0aGlzLl9kLCBmdW5jdGlvbiAoXywgc2VsZikge1xuICAgICAgICBzZWxmLl9odiAmJiBzZWxmLl9pZCA9PT0gY3VycmVudElkICYmIHNlbGYuX28ub25OZXh0KHgpO1xuICAgICAgICBzZWxmLl9odiA9IGZhbHNlO1xuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICBEZWJvdW5jZU9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzLl9jLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcbiAgICAgIHRoaXMuX2h2ID0gZmFsc2U7XG4gICAgICB0aGlzLl9pZCsrO1xuICAgIH07XG5cbiAgICBEZWJvdW5jZU9ic2VydmVyLnByb3RvdHlwZS5jb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9jLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuX2h2ICYmIHRoaXMuX28ub25OZXh0KHRoaXMuX3YpO1xuICAgICAgdGhpcy5fby5vbkNvbXBsZXRlZCgpO1xuICAgICAgdGhpcy5faHYgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lkKys7XG4gICAgfTtcblxuICAgIHJldHVybiBEZWJvdW5jZU9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICBmdW5jdGlvbiBkZWJvdW5jZVdpdGhTZWxlY3Rvcihzb3VyY2UsIGR1cmF0aW9uU2VsZWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciB2YWx1ZSwgaGFzVmFsdWUgPSBmYWxzZSwgY2FuY2VsYWJsZSA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksIGlkID0gMDtcbiAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBzb3VyY2Uuc3Vic2NyaWJlKFxuICAgICAgICBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgIHZhciB0aHJvdHRsZSA9IHRyeUNhdGNoKGR1cmF0aW9uU2VsZWN0b3IpKHgpO1xuICAgICAgICAgIGlmICh0aHJvdHRsZSA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcih0aHJvdHRsZS5lKTsgfVxuXG4gICAgICAgICAgaXNQcm9taXNlKHRocm90dGxlKSAmJiAodGhyb3R0bGUgPSBvYnNlcnZhYmxlRnJvbVByb21pc2UodGhyb3R0bGUpKTtcblxuICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZSA9IHg7XG4gICAgICAgICAgaWQrKztcbiAgICAgICAgICB2YXIgY3VycmVudGlkID0gaWQsIGQgPSBuZXcgU2luZ2xlQXNzaWdubWVudERpc3Bvc2FibGUoKTtcbiAgICAgICAgICBjYW5jZWxhYmxlLnNldERpc3Bvc2FibGUoZCk7XG4gICAgICAgICAgZC5zZXREaXNwb3NhYmxlKHRocm90dGxlLnN1YnNjcmliZShcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaGFzVmFsdWUgJiYgaWQgPT09IGN1cnJlbnRpZCAmJiBvLm9uTmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgIGQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaGFzVmFsdWUgJiYgaWQgPT09IGN1cnJlbnRpZCAmJiBvLm9uTmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgIGQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICkpO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNhbmNlbGFibGUuZGlzcG9zZSgpO1xuICAgICAgICAgIG8ub25FcnJvcihlKTtcbiAgICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgIGlkKys7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYW5jZWxhYmxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICBoYXNWYWx1ZSAmJiBvLm9uTmV4dCh2YWx1ZSk7XG4gICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgaWQrKztcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIGNhbmNlbGFibGUpO1xuICAgIH0sIHNvdXJjZSk7XG4gIH1cblxuICBvYnNlcnZhYmxlUHJvdG8uZGVib3VuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24gKGFyZ3VtZW50c1swXSkpIHtcbiAgICAgIHJldHVybiBkZWJvdW5jZVdpdGhTZWxlY3Rvcih0aGlzLCBhcmd1bWVudHNbMF0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBuZXcgRGVib3VuY2VPYnNlcnZhYmxlKHRoaXMsIGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cycpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgVGltZXN0YW1wT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoVGltZXN0YW1wT2JzZXJ2YWJsZSwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBUaW1lc3RhbXBPYnNlcnZhYmxlKHNvdXJjZSwgcykge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aGlzLl9zID0gcztcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFRpbWVzdGFtcE9ic2VydmFibGUucHJvdG90eXBlLnN1YnNjcmliZUNvcmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgVGltZXN0YW1wT2JzZXJ2ZXIobywgdGhpcy5fcykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gVGltZXN0YW1wT2JzZXJ2YWJsZTtcbiAgfShPYnNlcnZhYmxlQmFzZSkpO1xuXG4gIHZhciBUaW1lc3RhbXBPYnNlcnZlciA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoVGltZXN0YW1wT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gVGltZXN0YW1wT2JzZXJ2ZXIobywgcykge1xuICAgICAgdGhpcy5fbyA9IG87XG4gICAgICB0aGlzLl9zID0gcztcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIFRpbWVzdGFtcE9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHRoaXMuX28ub25OZXh0KHsgdmFsdWU6IHgsIHRpbWVzdGFtcDogdGhpcy5fcy5ub3coKSB9KTtcbiAgICB9O1xuXG4gICAgVGltZXN0YW1wT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX28ub25FcnJvcihlKTtcbiAgICB9O1xuXG4gICAgVGltZXN0YW1wT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX28ub25Db21wbGV0ZWQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRpbWVzdGFtcE9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICAvKipcbiAgICogIFJlY29yZHMgdGhlIHRpbWVzdGFtcCBmb3IgZWFjaCB2YWx1ZSBpbiBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgMSAtIHJlcyA9IHNvdXJjZS50aW1lc3RhbXAoKTsgLy8gcHJvZHVjZXMgeyB2YWx1ZTogeCwgdGltZXN0YW1wOiB0cyB9XG4gICAqICAyIC0gcmVzID0gc291cmNlLnRpbWVzdGFtcChSeC5TY2hlZHVsZXIuZGVmYXVsdCk7XG4gICAqXG4gICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSAgU2NoZWR1bGVyIHVzZWQgdG8gY29tcHV0ZSB0aW1lc3RhbXBzLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBzY2hlZHVsZXIgaXMgdXNlZC5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCB0aW1lc3RhbXAgaW5mb3JtYXRpb24gb24gdmFsdWVzLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnRpbWVzdGFtcCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIpIHtcbiAgICBpc1NjaGVkdWxlcihzY2hlZHVsZXIpIHx8IChzY2hlZHVsZXIgPSBkZWZhdWx0U2NoZWR1bGVyKTtcbiAgICByZXR1cm4gbmV3IFRpbWVzdGFtcE9ic2VydmFibGUodGhpcywgc2NoZWR1bGVyKTtcbiAgfTtcblxuICBmdW5jdGlvbiBzYW1wbGVPYnNlcnZhYmxlKHNvdXJjZSwgc2FtcGxlcikge1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGF0RW5kID0gZmFsc2UsIHZhbHVlLCBoYXNWYWx1ZSA9IGZhbHNlO1xuXG4gICAgICBmdW5jdGlvbiBzYW1wbGVTdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmIChoYXNWYWx1ZSkge1xuICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgby5vbk5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGF0RW5kICYmIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZVN1YnNjcmlwdGlvbiA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpO1xuICAgICAgc291cmNlU3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUoc291cmNlLnN1YnNjcmliZShcbiAgICAgICAgZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIChlKSB7IG8ub25FcnJvcihlKTsgfSxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF0RW5kID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2VTdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICApKTtcblxuICAgICAgcmV0dXJuIG5ldyBCaW5hcnlEaXNwb3NhYmxlKFxuICAgICAgICBzb3VyY2VTdWJzY3JpcHRpb24sXG4gICAgICAgIHNhbXBsZXIuc3Vic2NyaWJlKHNhbXBsZVN1YnNjcmliZSwgZnVuY3Rpb24gKGUpIHsgby5vbkVycm9yKGUpOyB9LCBzYW1wbGVTdWJzY3JpYmUpXG4gICAgICApO1xuICAgIH0sIHNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogIFNhbXBsZXMgdGhlIG9ic2VydmFibGUgc2VxdWVuY2UgYXQgZWFjaCBpbnRlcnZhbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogIDEgLSByZXMgPSBzb3VyY2Uuc2FtcGxlKHNhbXBsZU9ic2VydmFibGUpOyAvLyBTYW1wbGVyIHRpY2sgc2VxdWVuY2VcbiAgICogIDIgLSByZXMgPSBzb3VyY2Uuc2FtcGxlKDUwMDApOyAvLyA1IHNlY29uZHNcbiAgICogIDIgLSByZXMgPSBzb3VyY2Uuc2FtcGxlKDUwMDAsIFJ4LlNjaGVkdWxlci50aW1lb3V0KTsgLy8gNSBzZWNvbmRzXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGludGVydmFsT3JTYW1wbGVyIEludGVydmFsIGF0IHdoaWNoIHRvIHNhbXBsZSAoc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgZGVub3RpbmcgbWlsbGlzZWNvbmRzKSBvciBTYW1wbGVyIE9ic2VydmFibGUuXG4gICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSAgU2NoZWR1bGVyIHRvIHJ1biB0aGUgc2FtcGxpbmcgdGltZXIgb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0aW1lb3V0IHNjaGVkdWxlciBpcyB1c2VkLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gU2FtcGxlZCBvYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAgKi9cbiAgb2JzZXJ2YWJsZVByb3RvLnNhbXBsZSA9IG9ic2VydmFibGVQcm90by50aHJvdHRsZUxhdGVzdCA9IGZ1bmN0aW9uIChpbnRlcnZhbE9yU2FtcGxlciwgc2NoZWR1bGVyKSB7XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gZGVmYXVsdFNjaGVkdWxlcik7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnRlcnZhbE9yU2FtcGxlciA9PT0gJ251bWJlcicgP1xuICAgICAgc2FtcGxlT2JzZXJ2YWJsZSh0aGlzLCBvYnNlcnZhYmxlaW50ZXJ2YWwoaW50ZXJ2YWxPclNhbXBsZXIsIHNjaGVkdWxlcikpIDpcbiAgICAgIHNhbXBsZU9ic2VydmFibGUodGhpcywgaW50ZXJ2YWxPclNhbXBsZXIpO1xuICB9O1xuXG4gIHZhciBUaW1lb3V0RXJyb3IgPSBSeC5UaW1lb3V0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGltZW91dCBoYXMgb2NjdXJyZWQnO1xuICAgIHRoaXMubmFtZSA9ICdUaW1lb3V0RXJyb3InO1xuICAgIEVycm9yLmNhbGwodGhpcyk7XG4gIH07XG4gIFRpbWVvdXRFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5cbiAgZnVuY3Rpb24gdGltZW91dFdpdGhTZWxlY3Rvcihzb3VyY2UsIGZpcnN0VGltZW91dCwgdGltZW91dER1cmF0aW9uU2VsZWN0b3IsIG90aGVyKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oZmlyc3RUaW1lb3V0KSkge1xuICAgICAgb3RoZXIgPSB0aW1lb3V0RHVyYXRpb25TZWxlY3RvcjtcbiAgICAgIHRpbWVvdXREdXJhdGlvblNlbGVjdG9yID0gZmlyc3RUaW1lb3V0O1xuICAgICAgZmlyc3RUaW1lb3V0ID0gb2JzZXJ2YWJsZU5ldmVyKCk7XG4gICAgfVxuICAgIG90aGVyIHx8IChvdGhlciA9IG9ic2VydmFibGVUaHJvdyhuZXcgVGltZW91dEVycm9yKCkpKTtcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpLFxuICAgICAgICB0aW1lciA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCksXG4gICAgICAgIG9yaWdpbmFsID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cbiAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG9yaWdpbmFsKTtcblxuICAgICAgdmFyIGlkID0gMCwgc3dpdGNoZWQgPSBmYWxzZTtcblxuICAgICAgZnVuY3Rpb24gc2V0VGltZXIodGltZW91dCkge1xuICAgICAgICB2YXIgbXlJZCA9IGlkLCBkID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG5cbiAgICAgICAgZnVuY3Rpb24gdGltZXJXaW5zKCkge1xuICAgICAgICAgIHN3aXRjaGVkID0gKG15SWQgPT09IGlkKTtcbiAgICAgICAgICByZXR1cm4gc3dpdGNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lci5zZXREaXNwb3NhYmxlKGQpO1xuICAgICAgICBkLnNldERpc3Bvc2FibGUodGltZW91dC5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRpbWVyV2lucygpICYmIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG90aGVyLnN1YnNjcmliZShvKSk7XG4gICAgICAgICAgZC5kaXNwb3NlKCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdGltZXJXaW5zKCkgJiYgby5vbkVycm9yKGUpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGltZXJXaW5zKCkgJiYgc3Vic2NyaXB0aW9uLnNldERpc3Bvc2FibGUob3RoZXIuc3Vic2NyaWJlKG8pKTtcbiAgICAgICAgfSkpO1xuICAgICAgfTtcblxuICAgICAgc2V0VGltZXIoZmlyc3RUaW1lb3V0KTtcblxuICAgICAgZnVuY3Rpb24gb1dpbnMoKSB7XG4gICAgICAgIHZhciByZXMgPSAhc3dpdGNoZWQ7XG4gICAgICAgIGlmIChyZXMpIHsgaWQrKzsgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuXG4gICAgICBvcmlnaW5hbC5zZXREaXNwb3NhYmxlKHNvdXJjZS5zdWJzY3JpYmUoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgaWYgKG9XaW5zKCkpIHtcbiAgICAgICAgICBvLm9uTmV4dCh4KTtcbiAgICAgICAgICB2YXIgdGltZW91dCA9IHRyeUNhdGNoKHRpbWVvdXREdXJhdGlvblNlbGVjdG9yKSh4KTtcbiAgICAgICAgICBpZiAodGltZW91dCA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcih0aW1lb3V0LmUpOyB9XG4gICAgICAgICAgc2V0VGltZXIoaXNQcm9taXNlKHRpbWVvdXQpID8gb2JzZXJ2YWJsZUZyb21Qcm9taXNlKHRpbWVvdXQpIDogdGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIG9XaW5zKCkgJiYgby5vbkVycm9yKGUpO1xuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBvV2lucygpICYmIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5RGlzcG9zYWJsZShzdWJzY3JpcHRpb24sIHRpbWVyKTtcbiAgICB9LCBzb3VyY2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZW91dChzb3VyY2UsIGR1ZVRpbWUsIG90aGVyLCBzY2hlZHVsZXIpIHtcbiAgICBpZiAoaXNTY2hlZHVsZXIob3RoZXIpKSB7XG4gICAgICBzY2hlZHVsZXIgPSBvdGhlcjtcbiAgICAgIG90aGVyID0gb2JzZXJ2YWJsZVRocm93KG5ldyBUaW1lb3V0RXJyb3IoKSk7XG4gICAgfVxuICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEVycm9yKSB7IG90aGVyID0gb2JzZXJ2YWJsZVRocm93KG90aGVyKTsgfVxuICAgIGlzU2NoZWR1bGVyKHNjaGVkdWxlcikgfHwgKHNjaGVkdWxlciA9IGRlZmF1bHRTY2hlZHVsZXIpO1xuXG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNPYnNlcnZhYmxlKGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgaWQgPSAwLFxuICAgICAgICBvcmlnaW5hbCA9IG5ldyBTaW5nbGVBc3NpZ25tZW50RGlzcG9zYWJsZSgpLFxuICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU2VyaWFsRGlzcG9zYWJsZSgpLFxuICAgICAgICBzd2l0Y2hlZCA9IGZhbHNlLFxuICAgICAgICB0aW1lciA9IG5ldyBTZXJpYWxEaXNwb3NhYmxlKCk7XG5cbiAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG9yaWdpbmFsKTtcblxuICAgICAgZnVuY3Rpb24gY3JlYXRlVGltZXIoKSB7XG4gICAgICAgIHZhciBteUlkID0gaWQ7XG4gICAgICAgIHRpbWVyLnNldERpc3Bvc2FibGUoc2NoZWR1bGVyLnNjaGVkdWxlRnV0dXJlKG51bGwsIGR1ZVRpbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzd2l0Y2hlZCA9IGlkID09PSBteUlkO1xuICAgICAgICAgIGlmIChzd2l0Y2hlZCkge1xuICAgICAgICAgICAgaXNQcm9taXNlKG90aGVyKSAmJiAob3RoZXIgPSBvYnNlcnZhYmxlRnJvbVByb21pc2Uob3RoZXIpKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5zZXREaXNwb3NhYmxlKG90aGVyLnN1YnNjcmliZShvKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGNyZWF0ZVRpbWVyKCk7XG5cbiAgICAgIG9yaWdpbmFsLnNldERpc3Bvc2FibGUoc291cmNlLnN1YnNjcmliZShmdW5jdGlvbiAoeCkge1xuICAgICAgICBpZiAoIXN3aXRjaGVkKSB7XG4gICAgICAgICAgaWQrKztcbiAgICAgICAgICBvLm9uTmV4dCh4KTtcbiAgICAgICAgICBjcmVhdGVUaW1lcigpO1xuICAgICAgICB9XG4gICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIXN3aXRjaGVkKSB7XG4gICAgICAgICAgaWQrKztcbiAgICAgICAgICBvLm9uRXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFzd2l0Y2hlZCkge1xuICAgICAgICAgIGlkKys7XG4gICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoc3Vic2NyaXB0aW9uLCB0aW1lcik7XG4gICAgfSwgc291cmNlKTtcbiAgfVxuXG4gIG9ic2VydmFibGVQcm90by50aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBmaXJzdEFyZyA9IGFyZ3VtZW50c1swXTtcbiAgICBpZiAoZmlyc3RBcmcgaW5zdGFuY2VvZiBEYXRlIHx8IHR5cGVvZiBmaXJzdEFyZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aW1lb3V0KHRoaXMsIGZpcnN0QXJnLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgfSBlbHNlIGlmIChPYnNlcnZhYmxlLmlzT2JzZXJ2YWJsZShmaXJzdEFyZykgfHwgaXNGdW5jdGlvbihmaXJzdEFyZykpIHtcbiAgICAgIHJldHVybiB0aW1lb3V0V2l0aFNlbGVjdG9yKHRoaXMsIGZpcnN0QXJnLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIG9ubHkgdGhlIGZpcnN0IGl0ZW0gZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgZHVyaW5nIHNlcXVlbnRpYWwgdGltZSB3aW5kb3dzIG9mIGEgc3BlY2lmaWVkIGR1cmF0aW9uLlxuICAgKiBAcGFyYW0ge051bWJlcn0gd2luZG93RHVyYXRpb24gdGltZSB0byB3YWl0IGJlZm9yZSBlbWl0dGluZyBhbm90aGVyIGl0ZW0gYWZ0ZXIgZW1pdHRpbmcgdGhlIGxhc3QgaXRlbVxuICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gdGhlIFNjaGVkdWxlciB0byB1c2UgaW50ZXJuYWxseSB0byBtYW5hZ2UgdGhlIHRpbWVycyB0aGF0IGhhbmRsZSB0aW1lb3V0IGZvciBlYWNoIGl0ZW0uIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gU2NoZWR1bGVyLnRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHRoYXQgcGVyZm9ybXMgdGhlIHRocm90dGxlIG9wZXJhdGlvbi5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by50aHJvdHRsZSA9IGZ1bmN0aW9uICh3aW5kb3dEdXJhdGlvbiwgc2NoZWR1bGVyKSB7XG4gICAgaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSB8fCAoc2NoZWR1bGVyID0gZGVmYXVsdFNjaGVkdWxlcik7XG4gICAgdmFyIGR1cmF0aW9uID0gK3dpbmRvd0R1cmF0aW9uIHx8IDA7XG4gICAgaWYgKGR1cmF0aW9uIDw9IDApIHsgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3dpbmRvd0R1cmF0aW9uIGNhbm5vdCBiZSBsZXNzIG9yIGVxdWFsIHplcm8uJyk7IH1cbiAgICB2YXIgc291cmNlID0gdGhpcztcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBsYXN0T25OZXh0ID0gMDtcbiAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKFxuICAgICAgICBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgIHZhciBub3cgPSBzY2hlZHVsZXIubm93KCk7XG4gICAgICAgICAgaWYgKGxhc3RPbk5leHQgPT09IDAgfHwgbm93IC0gbGFzdE9uTmV4dCA+PSBkdXJhdGlvbikge1xuICAgICAgICAgICAgbGFzdE9uTmV4dCA9IG5vdztcbiAgICAgICAgICAgIG8ub25OZXh0KHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxmdW5jdGlvbiAoZSkgeyBvLm9uRXJyb3IoZSk7IH0sIGZ1bmN0aW9uICgpIHsgby5vbkNvbXBsZXRlZCgpOyB9XG4gICAgICApO1xuICAgIH0sIHNvdXJjZSk7XG4gIH07XG5cbiAgdmFyIFBhdXNhYmxlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoUGF1c2FibGVPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIFBhdXNhYmxlT2JzZXJ2YWJsZShzb3VyY2UsIHBhdXNlcikge1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgICBpZiAocGF1c2VyICYmIHBhdXNlci5zdWJzY3JpYmUpIHtcbiAgICAgICAgdGhpcy5wYXVzZXIgPSB0aGlzLmNvbnRyb2xsZXIubWVyZ2UocGF1c2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGF1c2VyID0gdGhpcy5jb250cm9sbGVyO1xuICAgICAgfVxuXG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBQYXVzYWJsZU9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGNvbm4gPSB0aGlzLnNvdXJjZS5wdWJsaXNoKCksXG4gICAgICAgIHN1YnNjcmlwdGlvbiA9IGNvbm4uc3Vic2NyaWJlKG8pLFxuICAgICAgICBjb25uZWN0aW9uID0gZGlzcG9zYWJsZUVtcHR5O1xuXG4gICAgICB2YXIgcGF1c2FibGUgPSB0aGlzLnBhdXNlci5kaXN0aW5jdFVudGlsQ2hhbmdlZCgpLnN1YnNjcmliZShmdW5jdGlvbiAoYikge1xuICAgICAgICBpZiAoYikge1xuICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uLmNvbm5lY3QoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25uZWN0aW9uLmRpc3Bvc2UoKTtcbiAgICAgICAgICBjb25uZWN0aW9uID0gZGlzcG9zYWJsZUVtcHR5O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ldyBOQXJ5RGlzcG9zYWJsZShbc3Vic2NyaXB0aW9uLCBjb25uZWN0aW9uLCBwYXVzYWJsZV0pO1xuICAgIH07XG5cbiAgICBQYXVzYWJsZU9ic2VydmFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLm9uTmV4dChmYWxzZSk7XG4gICAgfTtcblxuICAgIFBhdXNhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLm9uTmV4dCh0cnVlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFBhdXNhYmxlT2JzZXJ2YWJsZTtcblxuICB9KE9ic2VydmFibGUpKTtcblxuICAvKipcbiAgICogUGF1c2VzIHRoZSB1bmRlcmx5aW5nIG9ic2VydmFibGUgc2VxdWVuY2UgYmFzZWQgdXBvbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aGljaCB5aWVsZHMgdHJ1ZS9mYWxzZS5cbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHBhdXNlciA9IG5ldyBSeC5TdWJqZWN0KCk7XG4gICAqIHZhciBzb3VyY2UgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMCkucGF1c2FibGUocGF1c2VyKTtcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBwYXVzZXIgVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdXNlZCB0byBwYXVzZSB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIGlzIHBhdXNlZCBiYXNlZCB1cG9uIHRoZSBwYXVzZXIuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8ucGF1c2FibGUgPSBmdW5jdGlvbiAocGF1c2VyKSB7XG4gICAgcmV0dXJuIG5ldyBQYXVzYWJsZU9ic2VydmFibGUodGhpcywgcGF1c2VyKTtcbiAgfTtcblxuICBmdW5jdGlvbiBjb21iaW5lTGF0ZXN0U291cmNlKHNvdXJjZSwgc3ViamVjdCwgcmVzdWx0U2VsZWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IEFub255bW91c09ic2VydmFibGUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBoYXNWYWx1ZSA9IFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICBoYXNWYWx1ZUFsbCA9IGZhbHNlLFxuICAgICAgICBpc0RvbmUgPSBmYWxzZSxcbiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KDIpLFxuICAgICAgICBlcnI7XG5cbiAgICAgIGZ1bmN0aW9uIG5leHQoeCwgaSkge1xuICAgICAgICB2YWx1ZXNbaV0gPSB4O1xuICAgICAgICBoYXNWYWx1ZVtpXSA9IHRydWU7XG4gICAgICAgIGlmIChoYXNWYWx1ZUFsbCB8fCAoaGFzVmFsdWVBbGwgPSBoYXNWYWx1ZS5ldmVyeShpZGVudGl0eSkpKSB7XG4gICAgICAgICAgaWYgKGVycikgeyByZXR1cm4gby5vbkVycm9yKGVycik7IH1cbiAgICAgICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2gocmVzdWx0U2VsZWN0b3IpLmFwcGx5KG51bGwsIHZhbHVlcyk7XG4gICAgICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgcmV0dXJuIG8ub25FcnJvcihyZXMuZSk7IH1cbiAgICAgICAgICBvLm9uTmV4dChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlzRG9uZSAmJiB2YWx1ZXNbMV0gJiYgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEJpbmFyeURpc3Bvc2FibGUoXG4gICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoXG4gICAgICAgICAgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIG5leHQoeCwgMCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlc1sxXSkge1xuICAgICAgICAgICAgICBvLm9uRXJyb3IoZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlcnIgPSBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXNEb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbHVlc1sxXSAmJiBvLm9uQ29tcGxldGVkKCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIHN1YmplY3Quc3Vic2NyaWJlKFxuICAgICAgICAgIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICBuZXh0KHgsIDEpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKGUpIHsgby5vbkVycm9yKGUpOyB9LFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlzRG9uZSA9IHRydWU7XG4gICAgICAgICAgICBuZXh0KHRydWUsIDEpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSwgc291cmNlKTtcbiAgfVxuXG4gIHZhciBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUoc291cmNlLCBwYXVzZXIpIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IFN1YmplY3QoKTtcblxuICAgICAgaWYgKHBhdXNlciAmJiBwYXVzZXIuc3Vic2NyaWJlKSB7XG4gICAgICAgIHRoaXMucGF1c2VyID0gdGhpcy5jb250cm9sbGVyLm1lcmdlKHBhdXNlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhdXNlciA9IHRoaXMuY29udHJvbGxlcjtcbiAgICAgIH1cblxuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIHEgPSBbXSwgcHJldmlvdXNTaG91bGRGaXJlO1xuXG4gICAgICBmdW5jdGlvbiBkcmFpblF1ZXVlKCkgeyB3aGlsZSAocS5sZW5ndGggPiAwKSB7IG8ub25OZXh0KHEuc2hpZnQoKSk7IH0gfVxuXG4gICAgICB2YXIgc3Vic2NyaXB0aW9uID1cbiAgICAgICAgY29tYmluZUxhdGVzdFNvdXJjZShcbiAgICAgICAgICB0aGlzLnNvdXJjZSxcbiAgICAgICAgICB0aGlzLnBhdXNlci5zdGFydFdpdGgoZmFsc2UpLmRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHNob3VsZEZpcmUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGRhdGEsIHNob3VsZEZpcmU6IHNob3VsZEZpcmUgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgICAgICAgICBpZiAocHJldmlvdXNTaG91bGRGaXJlICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0cy5zaG91bGRGaXJlICE9PSBwcmV2aW91c1Nob3VsZEZpcmUpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1Nob3VsZEZpcmUgPSByZXN1bHRzLnNob3VsZEZpcmU7XG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIGluIHNob3VsZEZpcmVcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5zaG91bGRGaXJlKSB7IGRyYWluUXVldWUoKTsgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU2hvdWxkRmlyZSA9IHJlc3VsdHMuc2hvdWxkRmlyZTtcbiAgICAgICAgICAgICAgICAvLyBuZXcgZGF0YVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLnNob3VsZEZpcmUpIHtcbiAgICAgICAgICAgICAgICAgIG8ub25OZXh0KHJlc3VsdHMuZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHEucHVzaChyZXN1bHRzLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgICAgICAgICAgICBvLm9uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGRyYWluUXVldWUoKTtcbiAgICAgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOyAgICAgIFxuICAgIH07XG5cbiAgICBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIub25OZXh0KGZhbHNlKTtcbiAgICB9O1xuXG4gICAgUGF1c2FibGVCdWZmZXJlZE9ic2VydmFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5vbk5leHQodHJ1ZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZTtcblxuICB9KE9ic2VydmFibGUpKTtcblxuICAvKipcbiAgICogUGF1c2VzIHRoZSB1bmRlcmx5aW5nIG9ic2VydmFibGUgc2VxdWVuY2UgYmFzZWQgdXBvbiB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aGljaCB5aWVsZHMgdHJ1ZS9mYWxzZSxcbiAgICogYW5kIHlpZWxkcyB0aGUgdmFsdWVzIHRoYXQgd2VyZSBidWZmZXJlZCB3aGlsZSBwYXVzZWQuXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBwYXVzZXIgPSBuZXcgUnguU3ViamVjdCgpO1xuICAgKiB2YXIgc291cmNlID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDApLnBhdXNhYmxlQnVmZmVyZWQocGF1c2VyKTtcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBwYXVzZXIgVGhlIG9ic2VydmFibGUgc2VxdWVuY2UgdXNlZCB0byBwYXVzZSB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIGlzIHBhdXNlZCBiYXNlZCB1cG9uIHRoZSBwYXVzZXIuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8ucGF1c2FibGVCdWZmZXJlZCA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgcmV0dXJuIG5ldyBQYXVzYWJsZUJ1ZmZlcmVkT2JzZXJ2YWJsZSh0aGlzLCBzdWJqZWN0KTtcbiAgfTtcblxuICB2YXIgQ29udHJvbGxlZE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKENvbnRyb2xsZWRPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIENvbnRyb2xsZWRPYnNlcnZhYmxlIChzb3VyY2UsIGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpIHtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgICAgdGhpcy5zdWJqZWN0ID0gbmV3IENvbnRyb2xsZWRTdWJqZWN0KGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpO1xuICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2UubXVsdGljYXN0KHRoaXMuc3ViamVjdCkucmVmQ291bnQoKTtcbiAgICB9XG5cbiAgICBDb250cm9sbGVkT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKG8pO1xuICAgIH07XG5cbiAgICBDb250cm9sbGVkT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIChudW1iZXJPZkl0ZW1zKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdWJqZWN0LnJlcXVlc3QobnVtYmVyT2ZJdGVtcyA9PSBudWxsID8gLTEgOiBudW1iZXJPZkl0ZW1zKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENvbnRyb2xsZWRPYnNlcnZhYmxlO1xuXG4gIH0oT2JzZXJ2YWJsZSkpO1xuXG4gIHZhciBDb250cm9sbGVkU3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQ29udHJvbGxlZFN1YmplY3QsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gQ29udHJvbGxlZFN1YmplY3QoZW5hYmxlUXVldWUsIHNjaGVkdWxlcikge1xuICAgICAgZW5hYmxlUXVldWUgPT0gbnVsbCAmJiAoZW5hYmxlUXVldWUgPSB0cnVlKTtcblxuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLnN1YmplY3QgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgdGhpcy5lbmFibGVRdWV1ZSA9IGVuYWJsZVF1ZXVlO1xuICAgICAgdGhpcy5xdWV1ZSA9IGVuYWJsZVF1ZXVlID8gW10gOiBudWxsO1xuICAgICAgdGhpcy5yZXF1ZXN0ZWRDb3VudCA9IDA7XG4gICAgICB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUgPSBudWxsO1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICB0aGlzLmhhc0ZhaWxlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyIHx8IGN1cnJlbnRUaHJlYWRTY2hlZHVsZXI7XG4gICAgfVxuXG4gICAgYWRkUHJvcGVydGllcyhDb250cm9sbGVkU3ViamVjdC5wcm90b3R5cGUsIE9ic2VydmVyLCB7XG4gICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJqZWN0LnN1YnNjcmliZShvKTtcbiAgICAgIH0sXG4gICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5lbmFibGVRdWV1ZSB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3ViamVjdC5vbkNvbXBsZXRlZCgpO1xuICAgICAgICAgIHRoaXMuZGlzcG9zZUN1cnJlbnRSZXF1ZXN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKE5vdGlmaWNhdGlvbi5jcmVhdGVPbkNvbXBsZXRlZCgpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICB0aGlzLmhhc0ZhaWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZVF1ZXVlIHx8IHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5zdWJqZWN0Lm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRoaXMuZGlzcG9zZUN1cnJlbnRSZXF1ZXN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKE5vdGlmaWNhdGlvbi5jcmVhdGVPbkVycm9yKGVycm9yKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbk5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0ZWRDb3VudCA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5lbmFibGVRdWV1ZSAmJiB0aGlzLnF1ZXVlLnB1c2goTm90aWZpY2F0aW9uLmNyZWF0ZU9uTmV4dCh2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICh0aGlzLnJlcXVlc3RlZENvdW50LS0gPT09IDApICYmIHRoaXMuZGlzcG9zZUN1cnJlbnRSZXF1ZXN0KCk7XG4gICAgICAgICAgdGhpcy5zdWJqZWN0Lm9uTmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfcHJvY2Vzc1JlcXVlc3Q6IGZ1bmN0aW9uIChudW1iZXJPZkl0ZW1zKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVF1ZXVlKSB7XG4gICAgICAgICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCAmJiAobnVtYmVyT2ZJdGVtcyA+IDAgfHwgdGhpcy5xdWV1ZVswXS5raW5kICE9PSAnTicpKSB7XG4gICAgICAgICAgICB2YXIgZmlyc3QgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBmaXJzdC5hY2NlcHQodGhpcy5zdWJqZWN0KTtcbiAgICAgICAgICAgIGlmIChmaXJzdC5raW5kID09PSAnTicpIHtcbiAgICAgICAgICAgICAgbnVtYmVyT2ZJdGVtcy0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ3VycmVudFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudW1iZXJPZkl0ZW1zO1xuICAgICAgfSxcbiAgICAgIHJlcXVlc3Q6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlQ3VycmVudFJlcXVlc3QoKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMucmVxdWVzdGVkRGlzcG9zYWJsZSA9IHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKG51bWJlcixcbiAgICAgICAgZnVuY3Rpb24ocywgaSkge1xuICAgICAgICAgIHZhciByZW1haW5pbmcgPSBzZWxmLl9wcm9jZXNzUmVxdWVzdChpKTtcbiAgICAgICAgICB2YXIgc3RvcHBlZCA9IHNlbGYuaGFzQ29tcGxldGVkIHx8IHNlbGYuaGFzRmFpbGVkO1xuICAgICAgICAgIGlmICghc3RvcHBlZCAmJiByZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICBzZWxmLnJlcXVlc3RlZENvdW50ID0gcmVtYWluaW5nO1xuXG4gICAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUNyZWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHNlbGYucmVxdWVzdGVkQ291bnQgPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIC8vIFNjaGVkdWxlZCBpdGVtIGlzIHN0aWxsIGluIHByb2dyZXNzLiBSZXR1cm4gYSBuZXdcbiAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSB0byBhbGxvdyB0aGUgcmVxdWVzdCB0byBiZSBpbnRlcnJ1cHRlZFxuICAgICAgICAgICAgICAvLyB2aWEgZGlzcG9zZS5cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGU7XG4gICAgICB9LFxuICAgICAgZGlzcG9zZUN1cnJlbnRSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUpIHtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RlZERpc3Bvc2FibGUuZGlzcG9zZSgpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdGVkRGlzcG9zYWJsZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBDb250cm9sbGVkU3ViamVjdDtcbiAgfShPYnNlcnZhYmxlKSk7XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGEgY29udHJvbGxlciB0byB0aGUgb2JzZXJ2YWJsZSBzZXF1ZW5jZSB3aXRoIHRoZSBhYmlsaXR5IHRvIHF1ZXVlLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgc291cmNlID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDApLmNvbnRyb2xsZWQoKTtcbiAgICogc291cmNlLnJlcXVlc3QoMyk7IC8vIFJlYWRzIDMgdmFsdWVzXG4gICAqIEBwYXJhbSB7Ym9vbH0gZW5hYmxlUXVldWUgdHJ1dGh5IHZhbHVlIHRvIGRldGVybWluZSBpZiB2YWx1ZXMgc2hvdWxkIGJlIHF1ZXVlZCBwZW5kaW5nIHRoZSBuZXh0IHJlcXVlc3RcbiAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciBkZXRlcm1pbmVzIGhvdyB0aGUgcmVxdWVzdHMgd2lsbCBiZSBzY2hlZHVsZWRcbiAgICogQHJldHVybnMge09ic2VydmFibGV9IFRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHdoaWNoIG9ubHkgcHJvcGFnYXRlcyB2YWx1ZXMgb24gcmVxdWVzdC5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5jb250cm9sbGVkID0gZnVuY3Rpb24gKGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpIHtcblxuICAgIGlmIChlbmFibGVRdWV1ZSAmJiBpc1NjaGVkdWxlcihlbmFibGVRdWV1ZSkpIHtcbiAgICAgIHNjaGVkdWxlciA9IGVuYWJsZVF1ZXVlO1xuICAgICAgZW5hYmxlUXVldWUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChlbmFibGVRdWV1ZSA9PSBudWxsKSB7ICBlbmFibGVRdWV1ZSA9IHRydWU7IH1cbiAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRPYnNlcnZhYmxlKHRoaXMsIGVuYWJsZVF1ZXVlLCBzY2hlZHVsZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQaXBlcyB0aGUgZXhpc3RpbmcgT2JzZXJ2YWJsZSBzZXF1ZW5jZSBpbnRvIGEgTm9kZS5qcyBTdHJlYW0uXG4gICAqIEBwYXJhbSB7U3RyZWFtfSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBOb2RlLmpzIHN0cmVhbS5cbiAgICogQHJldHVybnMge1N0cmVhbX0gVGhlIGRlc3RpbmF0aW9uIHN0cmVhbS5cbiAgICovXG4gIG9ic2VydmFibGVQcm90by5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgICB2YXIgc291cmNlID0gdGhpcy5wYXVzYWJsZUJ1ZmZlcmVkKCk7XG5cbiAgICBmdW5jdGlvbiBvbkRyYWluKCkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIGRlc3QuYWRkTGlzdGVuZXIoJ2RyYWluJywgb25EcmFpbik7XG5cbiAgICBzb3VyY2Uuc3Vic2NyaWJlKFxuICAgICAgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgIWRlc3Qud3JpdGUoU3RyaW5nKHgpKSAmJiBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGRlc3QuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gSGFjayBjaGVjayBiZWNhdXNlIFNURElPIGlzIG5vdCBjbG9zYWJsZVxuICAgICAgICAhZGVzdC5faXNTdGRpbyAmJiBkZXN0LmVuZCgpO1xuICAgICAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uRHJhaW4pO1xuICAgICAgfSk7XG5cbiAgICBzb3VyY2UucmVzdW1lKCk7XG5cbiAgICByZXR1cm4gZGVzdDtcbiAgfTtcblxuICB2YXIgVHJhbnNkdWNlT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuICAgIGluaGVyaXRzKFRyYW5zZHVjZU9ic2VydmVyLCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIFRyYW5zZHVjZU9ic2VydmVyKG8sIHhmb3JtKSB7XG4gICAgICB0aGlzLl9vID0gbztcbiAgICAgIHRoaXMuX3hmb3JtID0geGZvcm07XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBUcmFuc2R1Y2VPYnNlcnZlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICB2YXIgcmVzID0gdHJ5Q2F0Y2godGhpcy5feGZvcm1bJ0BAdHJhbnNkdWNlci9zdGVwJ10pLmNhbGwodGhpcy5feGZvcm0sIHRoaXMuX28sIHgpO1xuICAgICAgaWYgKHJlcyA9PT0gZXJyb3JPYmopIHsgdGhpcy5fby5vbkVycm9yKHJlcy5lKTsgfVxuICAgIH07XG5cbiAgICBUcmFuc2R1Y2VPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyB0aGlzLl9vLm9uRXJyb3IoZSk7IH07XG5cbiAgICBUcmFuc2R1Y2VPYnNlcnZlci5wcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5feGZvcm1bJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSh0aGlzLl9vKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRyYW5zZHVjZU9ic2VydmVyO1xuICB9KEFic3RyYWN0T2JzZXJ2ZXIpKTtcblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1Gb3JPYnNlcnZlcihvKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdAQHRyYW5zZHVjZXIvaW5pdCc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbztcbiAgICAgIH0sXG4gICAgICAnQEB0cmFuc2R1Y2VyL3N0ZXAnOiBmdW5jdGlvbihvYnMsIGlucHV0KSB7XG4gICAgICAgIHJldHVybiBvYnMub25OZXh0KGlucHV0KTtcbiAgICAgIH0sXG4gICAgICAnQEB0cmFuc2R1Y2VyL3Jlc3VsdCc6IGZ1bmN0aW9uKG9icykge1xuICAgICAgICByZXR1cm4gb2JzLm9uQ29tcGxldGVkKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIHRyYW5zZHVjZXIgdG8gdHJhbnNmb3JtIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlXG4gICAqIEBwYXJhbSB7VHJhbnNkdWNlcn0gdHJhbnNkdWNlciBBIHRyYW5zZHVjZXIgdG8gZXhlY3V0ZVxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSByZXN1bHRzIGZyb20gdGhlIHRyYW5zZHVjZXIuXG4gICAqL1xuICBvYnNlcnZhYmxlUHJvdG8udHJhbnNkdWNlID0gZnVuY3Rpb24odHJhbnNkdWNlcikge1xuICAgIHZhciBzb3VyY2UgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgQW5vbnltb3VzT2JzZXJ2YWJsZShmdW5jdGlvbihvKSB7XG4gICAgICB2YXIgeGZvcm0gPSB0cmFuc2R1Y2VyKHRyYW5zZm9ybUZvck9ic2VydmVyKG8pKTtcbiAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBUcmFuc2R1Y2VPYnNlcnZlcihvLCB4Zm9ybSkpO1xuICAgIH0sIHNvdXJjZSk7XG4gIH07XG5cbiAgdmFyIEFub255bW91c09ic2VydmFibGUgPSBSeC5Bbm9ueW1vdXNPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhBbm9ueW1vdXNPYnNlcnZhYmxlLCBfX3N1cGVyX18pO1xuXG4gICAgLy8gRml4IHN1YnNjcmliZXIgdG8gY2hlY2sgZm9yIHVuZGVmaW5lZCBvciBmdW5jdGlvbiByZXR1cm5lZCB0byBkZWNvcmF0ZSBhcyBEaXNwb3NhYmxlXG4gICAgZnVuY3Rpb24gZml4U3Vic2NyaWJlcihzdWJzY3JpYmVyKSB7XG4gICAgICByZXR1cm4gc3Vic2NyaWJlciAmJiBpc0Z1bmN0aW9uKHN1YnNjcmliZXIuZGlzcG9zZSkgPyBzdWJzY3JpYmVyIDpcbiAgICAgICAgaXNGdW5jdGlvbihzdWJzY3JpYmVyKSA/IGRpc3Bvc2FibGVDcmVhdGUoc3Vic2NyaWJlcikgOiBkaXNwb3NhYmxlRW1wdHk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0RGlzcG9zYWJsZShzLCBzdGF0ZSkge1xuICAgICAgdmFyIGFkbyA9IHN0YXRlWzBdLCBzZWxmID0gc3RhdGVbMV07XG4gICAgICB2YXIgc3ViID0gdHJ5Q2F0Y2goc2VsZi5fX3N1YnNjcmliZSkuY2FsbChzZWxmLCBhZG8pO1xuICAgICAgaWYgKHN1YiA9PT0gZXJyb3JPYmogJiYgIWFkby5mYWlsKGVycm9yT2JqLmUpKSB7IHRocm93ZXIoZXJyb3JPYmouZSk7IH1cbiAgICAgIGFkby5zZXREaXNwb3NhYmxlKGZpeFN1YnNjcmliZXIoc3ViKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQW5vbnltb3VzT2JzZXJ2YWJsZShzdWJzY3JpYmUsIHBhcmVudCkge1xuICAgICAgdGhpcy5zb3VyY2UgPSBwYXJlbnQ7XG4gICAgICB0aGlzLl9fc3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgQW5vbnltb3VzT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgYWRvID0gbmV3IEF1dG9EZXRhY2hPYnNlcnZlcihvKSwgc3RhdGUgPSBbYWRvLCB0aGlzXTtcblxuICAgICAgaWYgKGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGVSZXF1aXJlZCgpKSB7XG4gICAgICAgIGN1cnJlbnRUaHJlYWRTY2hlZHVsZXIuc2NoZWR1bGUoc3RhdGUsIHNldERpc3Bvc2FibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0RGlzcG9zYWJsZShudWxsLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWRvO1xuICAgIH07XG5cbiAgICByZXR1cm4gQW5vbnltb3VzT2JzZXJ2YWJsZTtcblxuICB9KE9ic2VydmFibGUpKTtcblxuICB2YXIgQXV0b0RldGFjaE9ic2VydmVyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhBdXRvRGV0YWNoT2JzZXJ2ZXIsIF9fc3VwZXJfXyk7XG5cbiAgICBmdW5jdGlvbiBBdXRvRGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICAgIF9fc3VwZXJfXy5jYWxsKHRoaXMpO1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgdGhpcy5tID0gbmV3IFNpbmdsZUFzc2lnbm1lbnREaXNwb3NhYmxlKCk7XG4gICAgfVxuXG4gICAgdmFyIEF1dG9EZXRhY2hPYnNlcnZlclByb3RvdHlwZSA9IEF1dG9EZXRhY2hPYnNlcnZlci5wcm90b3R5cGU7XG5cbiAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMub2JzZXJ2ZXIub25OZXh0KS5jYWxsKHRoaXMub2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IGVycm9yT2JqKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICB0aHJvd2VyKHJlc3VsdC5lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgQXV0b0RldGFjaE9ic2VydmVyUHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMub2JzZXJ2ZXIub25FcnJvcikuY2FsbCh0aGlzLm9ic2VydmVyLCBlcnIpO1xuICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgICByZXN1bHQgPT09IGVycm9yT2JqICYmIHRocm93ZXIocmVzdWx0LmUpO1xuICAgIH07XG5cbiAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUuY29tcGxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRoaXMub2JzZXJ2ZXIub25Db21wbGV0ZWQpLmNhbGwodGhpcy5vYnNlcnZlcik7XG4gICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgIHJlc3VsdCA9PT0gZXJyb3JPYmogJiYgdGhyb3dlcihyZXN1bHQuZSk7XG4gICAgfTtcblxuICAgIEF1dG9EZXRhY2hPYnNlcnZlclByb3RvdHlwZS5zZXREaXNwb3NhYmxlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHRoaXMubS5zZXREaXNwb3NhYmxlKHZhbHVlKTsgfTtcbiAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUuZ2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubS5nZXREaXNwb3NhYmxlKCk7IH07XG5cbiAgICBBdXRvRGV0YWNoT2JzZXJ2ZXJQcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF9fc3VwZXJfXy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICAgICAgdGhpcy5tLmRpc3Bvc2UoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEF1dG9EZXRhY2hPYnNlcnZlcjtcbiAgfShBYnN0cmFjdE9ic2VydmVyKSk7XG5cbiAgdmFyIElubmVyU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKHMsIG8pIHtcbiAgICB0aGlzLl9zID0gcztcbiAgICB0aGlzLl9vID0gbztcbiAgfTtcblxuICBJbm5lclN1YnNjcmlwdGlvbi5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3MuaXNEaXNwb3NlZCAmJiB0aGlzLl9vICE9PSBudWxsKSB7XG4gICAgICB2YXIgaWR4ID0gdGhpcy5fcy5vYnNlcnZlcnMuaW5kZXhPZih0aGlzLl9vKTtcbiAgICAgIHRoaXMuX3Mub2JzZXJ2ZXJzLnNwbGljZShpZHgsIDEpO1xuICAgICAgdGhpcy5fbyA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiAgUmVwcmVzZW50cyBhbiBvYmplY3QgdGhhdCBpcyBib3RoIGFuIG9ic2VydmFibGUgc2VxdWVuY2UgYXMgd2VsbCBhcyBhbiBvYnNlcnZlci5cbiAgICogIEVhY2ggbm90aWZpY2F0aW9uIGlzIGJyb2FkY2FzdGVkIHRvIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycy5cbiAgICovXG4gIHZhciBTdWJqZWN0ID0gUnguU3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoU3ViamVjdCwgX19zdXBlcl9fKTtcbiAgICBmdW5jdGlvbiBTdWJqZWN0KCkge1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFByb3BlcnRpZXMoU3ViamVjdC5wcm90b3R5cGUsIE9ic2VydmVyLnByb3RvdHlwZSwge1xuICAgICAgX3N1YnNjcmliZTogZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gobyk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBJbm5lclN1YnNjcmlwdGlvbih0aGlzLCBvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikge1xuICAgICAgICAgIG8ub25FcnJvcih0aGlzLmVycm9yKTtcbiAgICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuICAgICAgICB9XG4gICAgICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGVFbXB0eTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdWJqZWN0IGhhcyBvYnNlcnZlcnMgc3Vic2NyaWJlZCB0byBpdC5cbiAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzIHN1YnNjcmliZWQgdG8gaXQuXG4gICAgICAgKi9cbiAgICAgIGhhc09ic2VydmVyczogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5vYnNlcnZlcnMubGVuZ3RoID4gMDsgfSxcbiAgICAgIC8qKlxuICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuICAgICAgICovXG4gICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvcyA9IGNsb25lQXJyYXkodGhpcy5vYnNlcnZlcnMpLCBsZW4gPSBvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgb3NbaV0ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IGVycm9yIFRoZSBleGNlcHRpb24gdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuICAgICAgICovXG4gICAgICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBvc1tpXS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGFycml2YWwgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cbiAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZW5kIHRvIGFsbCBvYnNlcnZlcnMuXG4gICAgICAgKi9cbiAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIG9zW2ldLm9uTmV4dCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBVbnN1YnNjcmliZSBhbGwgb2JzZXJ2ZXJzIGFuZCByZWxlYXNlIHJlc291cmNlcy5cbiAgICAgICAqL1xuICAgICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3ViamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgb2JzZXJ2ZXIgYW5kIG9ic2VydmFibGUuXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgVGhlIG9ic2VydmVyIHVzZWQgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgc3ViamVjdC5cbiAgICAgKiBAcGFyYW0ge09ic2VydmFibGV9IG9ic2VydmFibGUgVGhlIG9ic2VydmFibGUgdXNlZCB0byBzdWJzY3JpYmUgdG8gbWVzc2FnZXMgc2VudCBmcm9tIHRoZSBzdWJqZWN0LlxuICAgICAqIEByZXR1cm5zIHtTdWJqZWN0fSBTdWJqZWN0IGltcGxlbWVudGVkIHVzaW5nIHRoZSBnaXZlbiBvYnNlcnZlciBhbmQgb2JzZXJ2YWJsZS5cbiAgICAgKi9cbiAgICBTdWJqZWN0LmNyZWF0ZSA9IGZ1bmN0aW9uIChvYnNlcnZlciwgb2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTdWJqZWN0KG9ic2VydmVyLCBvYnNlcnZhYmxlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFN1YmplY3Q7XG4gIH0oT2JzZXJ2YWJsZSkpO1xuXG4gIC8qKlxuICAgKiAgUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uXG4gICAqICBUaGUgbGFzdCB2YWx1ZSBiZWZvcmUgdGhlIE9uQ29tcGxldGVkIG5vdGlmaWNhdGlvbiwgb3IgdGhlIGVycm9yIHJlY2VpdmVkIHRocm91Z2ggT25FcnJvciwgaXMgc2VudCB0byBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMuXG4gICAqL1xuICB2YXIgQXN5bmNTdWJqZWN0ID0gUnguQXN5bmNTdWJqZWN0ID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhBc3luY1N1YmplY3QsIF9fc3VwZXJfXyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3ViamVjdCB0aGF0IGNhbiBvbmx5IHJlY2VpdmUgb25lIHZhbHVlIGFuZCB0aGF0IHZhbHVlIGlzIGNhY2hlZCBmb3IgYWxsIGZ1dHVyZSBvYnNlcnZhdGlvbnMuXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgZnVuY3Rpb24gQXN5bmNTdWJqZWN0KCkge1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFByb3BlcnRpZXMoQXN5bmNTdWJqZWN0LnByb3RvdHlwZSwgT2JzZXJ2ZXIucHJvdG90eXBlLCB7XG4gICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICB0aGlzLm9ic2VydmVycy5wdXNoKG8pO1xuICAgICAgICAgIHJldHVybiBuZXcgSW5uZXJTdWJzY3JpcHRpb24odGhpcywgbyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikge1xuICAgICAgICAgIG8ub25FcnJvcih0aGlzLmVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1ZhbHVlKSB7XG4gICAgICAgICAgby5vbk5leHQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkaXNwb3NhYmxlRW1wdHk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzIHN1YnNjcmliZWQgdG8gaXQuXG4gICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuICAgICAgICovXG4gICAgICBoYXNPYnNlcnZlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA+IDA7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIGFsc28gY2F1c2luZyB0aGUgbGFzdCByZWNlaXZlZCB2YWx1ZSB0byBiZSBzZW50IG91dCAoaWYgYW55KS5cbiAgICAgICAqL1xuICAgICAgb25Db21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGksIGxlbjtcbiAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICB2YXIgbyA9IG9zW2ldO1xuICAgICAgICAgICAgICBvLm9uTmV4dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgICAgby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgb3NbaV0ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGVycm9yLlxuICAgICAgICogQHBhcmFtIHtNaXhlZH0gZXJyb3IgVGhlIEVycm9yIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVycy5cbiAgICAgICAqL1xuICAgICAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9zID0gY2xvbmVBcnJheSh0aGlzLm9ic2VydmVycyksIGxlbiA9IG9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBvc1tpXS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBTZW5kcyBhIHZhbHVlIHRvIHRoZSBzdWJqZWN0LiBUaGUgbGFzdCB2YWx1ZSByZWNlaXZlZCBiZWZvcmUgc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbiB3aWxsIGJlIHNlbnQgdG8gYWxsIHN1YnNjcmliZWQgYW5kIGZ1dHVyZSBvYnNlcnZlcnMuXG4gICAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIHN1YmplY3QuXG4gICAgICAgKi9cbiAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIFVuc3Vic2NyaWJlIGFsbCBvYnNlcnZlcnMgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLlxuICAgICAgICovXG4gICAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFzeW5jU3ViamVjdDtcbiAgfShPYnNlcnZhYmxlKSk7XG5cbiAgdmFyIEFub255bW91c1N1YmplY3QgPSBSeC5Bbm9ueW1vdXNTdWJqZWN0ID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhBbm9ueW1vdXNTdWJqZWN0LCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEFub255bW91c1N1YmplY3Qob2JzZXJ2ZXIsIG9ic2VydmFibGUpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGU7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBhZGRQcm9wZXJ0aWVzKEFub255bW91c1N1YmplY3QucHJvdG90eXBlLCBPYnNlcnZlci5wcm90b3R5cGUsIHtcbiAgICAgIF9zdWJzY3JpYmU6IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGUuc3Vic2NyaWJlKG8pO1xuICAgICAgfSxcbiAgICAgIG9uQ29tcGxldGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5vbkVycm9yKGVycm9yKTtcbiAgICAgIH0sXG4gICAgICBvbk5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLm9ic2VydmVyLm9uTmV4dCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gQW5vbnltb3VzU3ViamVjdDtcbiAgfShPYnNlcnZhYmxlKSk7XG5cbiAgLyoqXG4gICAqICBSZXByZXNlbnRzIGEgdmFsdWUgdGhhdCBjaGFuZ2VzIG92ZXIgdGltZS5cbiAgICogIE9ic2VydmVycyBjYW4gc3Vic2NyaWJlIHRvIHRoZSBzdWJqZWN0IHRvIHJlY2VpdmUgdGhlIGxhc3QgKG9yIGluaXRpYWwpIHZhbHVlIGFuZCBhbGwgc3Vic2VxdWVudCBub3RpZmljYXRpb25zLlxuICAgKi9cbiAgdmFyIEJlaGF2aW9yU3ViamVjdCA9IFJ4LkJlaGF2aW9yU3ViamVjdCA9IChmdW5jdGlvbiAoX19zdXBlcl9fKSB7XG4gICAgaW5oZXJpdHMoQmVoYXZpb3JTdWJqZWN0LCBfX3N1cGVyX18pO1xuICAgIGZ1bmN0aW9uIEJlaGF2aW9yU3ViamVjdCh2YWx1ZSkge1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFByb3BlcnRpZXMoQmVoYXZpb3JTdWJqZWN0LnByb3RvdHlwZSwgT2JzZXJ2ZXIucHJvdG90eXBlLCB7XG4gICAgICBfc3Vic2NyaWJlOiBmdW5jdGlvbiAobykge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChvKTtcbiAgICAgICAgICBvLm9uTmV4dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gbmV3IElubmVyU3Vic2NyaXB0aW9uKHRoaXMsIG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhhc0Vycm9yKSB7XG4gICAgICAgICAgby5vbkVycm9yKHRoaXMuZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG8ub25Db21wbGV0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlzcG9zYWJsZUVtcHR5O1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvciB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAgICogVmFsdWUgaXMgZnJvemVuIGFmdGVyIG9uQ29tcGxldGVkIGlzIGNhbGxlZC5cbiAgICAgICAqIEFmdGVyIG9uRXJyb3IgaXMgY2FsbGVkIGFsd2F5cyB0aHJvd3MgdGhlIHNwZWNpZmllZCBleGNlcHRpb24uXG4gICAgICAgKiBBbiBleGNlcHRpb24gaXMgYWx3YXlzIHRocm93biBhZnRlciBkaXNwb3NlIGlzIGNhbGxlZC5cbiAgICAgICAqIEByZXR1cm5zIHtNaXhlZH0gVGhlIGluaXRpYWwgdmFsdWUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciB1bnRpbCBvbk5leHQgaXMgY2FsbGVkOyBhZnRlciB3aGljaCwgdGhlIGxhc3QgdmFsdWUgcGFzc2VkIHRvIG9uTmV4dC5cbiAgICAgICAqL1xuICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICAgIGlmICh0aGlzLmhhc0Vycm9yKSB7XG4gICAgICAgICAgICAgIHRocm93IHRoaXMuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdWJqZWN0IGhhcyBvYnNlcnZlcnMgc3Vic2NyaWJlZCB0byBpdC5cbiAgICAgICAqL1xuICAgICAgaGFzT2JzZXJ2ZXJzOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm9ic2VydmVycy5sZW5ndGggPiAwOyB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuXG4gICAgICAgKi9cbiAgICAgIG9uQ29tcGxldGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBvc1tpXS5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIE5vdGlmaWVzIGFsbCBzdWJzY3JpYmVkIG9ic2VydmVycyBhYm91dCB0aGUgZXhjZXB0aW9uLlxuICAgICAgICogQHBhcmFtIHtNaXhlZH0gZXJyb3IgVGhlIGV4Y2VwdGlvbiB0byBzZW5kIHRvIGFsbCBvYnNlcnZlcnMuXG4gICAgICAgKi9cbiAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBvc1tpXS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGFycml2YWwgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZS5cbiAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZW5kIHRvIGFsbCBvYnNlcnZlcnMuXG4gICAgICAgKi9cbiAgICAgIG9uTmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBvc1tpXS5vbk5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBVbnN1YnNjcmliZSBhbGwgb2JzZXJ2ZXJzIGFuZCByZWxlYXNlIHJlc291cmNlcy5cbiAgICAgICAqL1xuICAgICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IG51bGw7XG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBCZWhhdmlvclN1YmplY3Q7XG4gIH0oT2JzZXJ2YWJsZSkpO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGFuIG9iamVjdCB0aGF0IGlzIGJvdGggYW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBhcyB3ZWxsIGFzIGFuIG9ic2VydmVyLlxuICAgKiBFYWNoIG5vdGlmaWNhdGlvbiBpcyBicm9hZGNhc3RlZCB0byBhbGwgc3Vic2NyaWJlZCBhbmQgZnV0dXJlIG9ic2VydmVycywgc3ViamVjdCB0byBidWZmZXIgdHJpbW1pbmcgcG9saWNpZXMuXG4gICAqL1xuICB2YXIgUmVwbGF5U3ViamVjdCA9IFJ4LlJlcGxheVN1YmplY3QgPSAoZnVuY3Rpb24gKF9fc3VwZXJfXykge1xuXG4gICAgdmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlbW92YWJsZURpc3Bvc2FibGUoc3ViamVjdCwgb2JzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBkaXNwb3NhYmxlQ3JlYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZGlzcG9zZSgpO1xuICAgICAgICAhc3ViamVjdC5pc0Rpc3Bvc2VkICYmIHN1YmplY3Qub2JzZXJ2ZXJzLnNwbGljZShzdWJqZWN0Lm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKSwgMSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpbmhlcml0cyhSZXBsYXlTdWJqZWN0LCBfX3N1cGVyX18pO1xuXG4gICAgLyoqXG4gICAgICogIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZXBsYXlTdWJqZWN0IGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZSwgd2luZG93IHNpemUgYW5kIHNjaGVkdWxlci5cbiAgICAgKiAgQHBhcmFtIHtOdW1iZXJ9IFtidWZmZXJTaXplXSBNYXhpbXVtIGVsZW1lbnQgY291bnQgb2YgdGhlIHJlcGxheSBidWZmZXIuXG4gICAgICogIEBwYXJhbSB7TnVtYmVyfSBbd2luZG93U2l6ZV0gTWF4aW11bSB0aW1lIGxlbmd0aCBvZiB0aGUgcmVwbGF5IGJ1ZmZlci5cbiAgICAgKiAgQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFNjaGVkdWxlciB0aGUgb2JzZXJ2ZXJzIGFyZSBpbnZva2VkIG9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFJlcGxheVN1YmplY3QoYnVmZmVyU2l6ZSwgd2luZG93U2l6ZSwgc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplID09IG51bGwgPyBtYXhTYWZlSW50ZWdlciA6IGJ1ZmZlclNpemU7XG4gICAgICB0aGlzLndpbmRvd1NpemUgPSB3aW5kb3dTaXplID09IG51bGwgPyBtYXhTYWZlSW50ZWdlciA6IHdpbmRvd1NpemU7XG4gICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlciB8fCBjdXJyZW50VGhyZWFkU2NoZWR1bGVyO1xuICAgICAgdGhpcy5xID0gW107XG4gICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICBfX3N1cGVyX18uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBhZGRQcm9wZXJ0aWVzKFJlcGxheVN1YmplY3QucHJvdG90eXBlLCBPYnNlcnZlci5wcm90b3R5cGUsIHtcbiAgICAgIF9zdWJzY3JpYmU6IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIGNoZWNrRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIHZhciBzbyA9IG5ldyBTY2hlZHVsZWRPYnNlcnZlcih0aGlzLnNjaGVkdWxlciwgbyksIHN1YnNjcmlwdGlvbiA9IGNyZWF0ZVJlbW92YWJsZURpc3Bvc2FibGUodGhpcywgc28pO1xuXG4gICAgICAgIHRoaXMuX3RyaW0odGhpcy5zY2hlZHVsZXIubm93KCkpO1xuICAgICAgICB0aGlzLm9ic2VydmVycy5wdXNoKHNvKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5xLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgc28ub25OZXh0KHRoaXMucVtpXS52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikge1xuICAgICAgICAgIHNvLm9uRXJyb3IodGhpcy5lcnJvcik7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICBzby5vbkNvbXBsZXRlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc28uZW5zdXJlQWN0aXZlKCk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzIHN1YnNjcmliZWQgdG8gaXQuXG4gICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIG9ic2VydmVycyBzdWJzY3JpYmVkIHRvIGl0LlxuICAgICAgICovXG4gICAgICBoYXNPYnNlcnZlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA+IDA7XG4gICAgICB9LFxuICAgICAgX3RyaW06IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMucS5sZW5ndGggPiB0aGlzLmJ1ZmZlclNpemUpIHtcbiAgICAgICAgICB0aGlzLnEuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5xLmxlbmd0aCA+IDAgJiYgKG5vdyAtIHRoaXMucVswXS5pbnRlcnZhbCkgPiB0aGlzLndpbmRvd1NpemUpIHtcbiAgICAgICAgICB0aGlzLnEuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBhcnJpdmFsIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UuXG4gICAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuICAgICAgICovXG4gICAgICBvbk5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHZhciBub3cgPSB0aGlzLnNjaGVkdWxlci5ub3coKTtcbiAgICAgICAgdGhpcy5xLnB1c2goeyBpbnRlcnZhbDogbm93LCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgIHRoaXMuX3RyaW0obm93KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBvc1tpXTtcbiAgICAgICAgICBvYnNlcnZlci5vbk5leHQodmFsdWUpO1xuICAgICAgICAgIG9ic2VydmVyLmVuc3VyZUFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBOb3RpZmllcyBhbGwgc3Vic2NyaWJlZCBvYnNlcnZlcnMgYWJvdXQgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAqIEBwYXJhbSB7TWl4ZWR9IGVycm9yIFRoZSBleGNlcHRpb24gdG8gc2VuZCB0byBhbGwgb2JzZXJ2ZXJzLlxuICAgICAgICovXG4gICAgICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgY2hlY2tEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7IHJldHVybjsgfVxuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIHZhciBub3cgPSB0aGlzLnNjaGVkdWxlci5ub3coKTtcbiAgICAgICAgdGhpcy5fdHJpbShub3cpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgb3MgPSBjbG9uZUFycmF5KHRoaXMub2JzZXJ2ZXJzKSwgbGVuID0gb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBvc1tpXTtcbiAgICAgICAgICBvYnNlcnZlci5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgICBvYnNlcnZlci5lbnN1cmVBY3RpdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogTm90aWZpZXMgYWxsIHN1YnNjcmliZWQgb2JzZXJ2ZXJzIGFib3V0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuICAgICAgICovXG4gICAgICBvbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGVja0Rpc3Bvc2VkKHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIG5vdyA9IHRoaXMuc2NoZWR1bGVyLm5vdygpO1xuICAgICAgICB0aGlzLl90cmltKG5vdyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBvcyA9IGNsb25lQXJyYXkodGhpcy5vYnNlcnZlcnMpLCBsZW4gPSBvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHZhciBvYnNlcnZlciA9IG9zW2ldO1xuICAgICAgICAgIG9ic2VydmVyLm9uQ29tcGxldGVkKCk7XG4gICAgICAgICAgb2JzZXJ2ZXIuZW5zdXJlQWN0aXZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIFVuc3Vic2NyaWJlIGFsbCBvYnNlcnZlcnMgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLlxuICAgICAgICovXG4gICAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBSZXBsYXlTdWJqZWN0O1xuICB9KE9ic2VydmFibGUpKTtcblxuICAvKipcbiAgKiBVc2VkIHRvIHBhdXNlIGFuZCByZXN1bWUgc3RyZWFtcy5cbiAgKi9cbiAgUnguUGF1c2VyID0gKGZ1bmN0aW9uIChfX3N1cGVyX18pIHtcbiAgICBpbmhlcml0cyhQYXVzZXIsIF9fc3VwZXJfXyk7XG4gICAgZnVuY3Rpb24gUGF1c2VyKCkge1xuICAgICAgX19zdXBlcl9fLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlLlxuICAgICAqL1xuICAgIFBhdXNlci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7IHRoaXMub25OZXh0KGZhbHNlKTsgfTtcblxuICAgIC8qKlxuICAgICogUmVzdW1lcyB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZS5cbiAgICAqL1xuICAgIFBhdXNlci5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkgeyB0aGlzLm9uTmV4dCh0cnVlKTsgfTtcblxuICAgIHJldHVybiBQYXVzZXI7XG4gIH0oU3ViamVjdCkpO1xuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIHJvb3QuUnggPSBSeDtcblxuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBSeDtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiBmcmVlTW9kdWxlKSB7XG4gICAgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTXG4gICAgaWYgKG1vZHVsZUV4cG9ydHMpIHtcbiAgICAgIChmcmVlTW9kdWxlLmV4cG9ydHMgPSBSeCkuUnggPSBSeDtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJlZUV4cG9ydHMuUnggPSBSeDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaW4gYSBicm93c2VyIG9yIFJoaW5vXG4gICAgcm9vdC5SeCA9IFJ4O1xuICB9XG5cbiAgLy8gQWxsIGNvZGUgYmVmb3JlIHRoaXMgcG9pbnQgd2lsbCBiZSBmaWx0ZXJlZCBmcm9tIHN0YWNrIHRyYWNlcy5cbiAgdmFyIHJFbmRpbmdMaW5lID0gY2FwdHVyZUxpbmUoKTtcblxufS5jYWxsKHRoaXMpKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NsaW1iLXNvY2lhbC9+L3J4LWxpdGUvcngubGl0ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5jbGltYl9fd2FsbHt3aWR0aDoxMDAlO3BhZGRpbmc6MDttYXJnaW46MDstd2Via2l0LWp1c3RpZnktY29udGVudDpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjstd2Via2l0LWZsZXgtZGlyZWN0aW9uOnJvdzstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvdzstd2Via2l0LWZsZXgtd3JhcDp3cmFwOy1tcy1mbGV4LXdyYXA6d3JhcDtmbGV4LXdyYXA6d3JhcDtmb250LXNpemU6MTAwJX0uY2xpbWJfX3RpbGUsLmNsaW1iX193YWxse2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4fS5jbGltYl9fdGlsZXstd2Via2l0LWZsZXgtc2hyaW5rOjA7LW1zLWZsZXgtbmVnYXRpdmU6MDtmbGV4LXNocmluazowO2hlaWdodDo0MjVweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7LW1zLWZsZXgtcGFjazplbmQ7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kOy13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO291dGxpbmU6MXB4IHNvbGlkIHRyYW5zcGFyZW50O21hcmdpbi1ib3R0b206MjBweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1hbGlnbjpsZWZ0O2JvcmRlci1yYWRpdXM6N3B4O2JhY2tncm91bmQtY29sb3I6I2Y2ZjZmNjstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtcGVyc3BlY3RpdmU6MTAwMHB4O3BlcnNwZWN0aXZlOjEwMDBweH0uY2xpbWJfX3RpbGVfX2NvbnRlbnR7ei1pbmRleDoxO3BhZGRpbmc6MjZweDtiYWNrZ3JvdW5kLWNvbG9yOiNmNmY2ZjZ9LmNsaW1iX190aWxlLS1oYXMtbm8taW1hZ2UgLmNsaW1iX190aWxlX19jb250ZW50e2hlaWdodDoxMDAlO2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uOy13ZWJraXQtanVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47LW1zLWZsZXgtcGFjazpqdXN0aWZ5O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2JveC1zaXppbmc6Ym9yZGVyLWJveH0uY2xpbWJfX3RpbGVfX2ltYWdle21heC13aWR0aDoxMDAlO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6N3B4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjdweH0uY2xpbWJfX3RpbGVfX21lc3NhZ2V7ei1pbmRleDoxO21hcmdpbi1ib3R0b206MjRweH0uY2xpbWJfX3RpbGVfX21lc3NhZ2U+YXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7bWF4LXdpZHRoOjI2MHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0uY2xpbWJfX3RpbGUtLWhhcy1uby1pbWFnZSAuY2xpbWJfX3RpbGVfX21lc3NhZ2V7Zm9udC1zaXplOjE4NSV9LmNsaW1iX190aWxlX19hdXRob3J7ZGlzcGxheTpibG9jazttYXJnaW46LTEwcHh9LmNsaW1iX190aWxlX19hdXRob3IgaW1ne2JvcmRlci1yYWRpdXM6MjVweDt3aWR0aDozNHB4fS5jbGltYl9fdGlsZV9fYXV0aG9yIC5jbGltYl9fdGlsZV9fYXV0aG9yX191c2VybmFtZXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MCAwIDAgMTBweDtsaW5lLWhlaWdodDozNHB4O3ZlcnRpY2FsLWFsaWduOnRvcH0uY2xpbWItc29jaWFsLWJhZGdle3Bvc2l0aW9uOmZpeGVkO2JvdHRvbToyMHB4O3JpZ2h0OjIwcHg7ei1pbmRleDo5O2JhY2tncm91bmQtY29sb3I6I2E5Y2FlMjt3aWR0aDoyMDBweDtoZWlnaHQ6NjZweDtib3JkZXItcmFkaXVzOjVweH0uY2xpbWItc29jaWFsLWJhZGdlPnNwYW57cG9zaXRpb246YWJzb2x1dGUhaW1wb3J0YW50O3RvcDotOTk5OXB4IWltcG9ydGFudDtsZWZ0Oi05OTk5cHghaW1wb3J0YW50fVwiLCBcIlwiXSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2Nzcy1sb2FkZXIhLi9+L2F1dG9wcmVmaXhlci1sb2FkZXI/YnJvd3NlcnM9bGFzdCAyIHZlcnNpb24hLi9+L3Nhc3MtbG9hZGVyIS4vc3JjL3N0eWxlL21haW4uc2Nzc1xuICoqIG1vZHVsZSBpZCA9IDE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvKlxyXG5cdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcblx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxyXG4qL1xyXG4vLyBjc3MgYmFzZSBjb2RlLCBpbmplY3RlZCBieSB0aGUgY3NzLWxvYWRlclxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciBsaXN0ID0gW107XHJcblxyXG5cdC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcclxuXHRsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XHJcblx0XHR2YXIgcmVzdWx0ID0gW107XHJcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgaXRlbSA9IHRoaXNbaV07XHJcblx0XHRcdGlmKGl0ZW1bMl0pIHtcclxuXHRcdFx0XHRyZXN1bHQucHVzaChcIkBtZWRpYSBcIiArIGl0ZW1bMl0gKyBcIntcIiArIGl0ZW1bMV0gKyBcIn1cIik7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmVzdWx0LnB1c2goaXRlbVsxXSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiByZXN1bHQuam9pbihcIlwiKTtcclxuXHR9O1xyXG5cclxuXHQvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxyXG5cdGxpc3QuaSA9IGZ1bmN0aW9uKG1vZHVsZXMsIG1lZGlhUXVlcnkpIHtcclxuXHRcdGlmKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKVxyXG5cdFx0XHRtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCBcIlwiXV07XHJcblx0XHR2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIGlkID0gdGhpc1tpXVswXTtcclxuXHRcdFx0aWYodHlwZW9mIGlkID09PSBcIm51bWJlclwiKVxyXG5cdFx0XHRcdGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGZvcihpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIGl0ZW0gPSBtb2R1bGVzW2ldO1xyXG5cdFx0XHQvLyBza2lwIGFscmVhZHkgaW1wb3J0ZWQgbW9kdWxlXHJcblx0XHRcdC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IDEwMCUgcGVyZmVjdCBmb3Igd2VpcmQgbWVkaWEgcXVlcnkgY29tYmluYXRpb25zXHJcblx0XHRcdC8vICB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IG1lZGlhIHF1ZXJpZXMuXHJcblx0XHRcdC8vICBJIGhvcGUgdGhpcyB3aWxsIG5ldmVyIG9jY3VyIChIZXkgdGhpcyB3YXkgd2UgaGF2ZSBzbWFsbGVyIGJ1bmRsZXMpXHJcblx0XHRcdGlmKHR5cGVvZiBpdGVtWzBdICE9PSBcIm51bWJlclwiIHx8ICFhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XHJcblx0XHRcdFx0aWYobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xyXG5cdFx0XHRcdFx0aXRlbVsyXSA9IG1lZGlhUXVlcnk7XHJcblx0XHRcdFx0fSBlbHNlIGlmKG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0XHRcdGl0ZW1bMl0gPSBcIihcIiArIGl0ZW1bMl0gKyBcIikgYW5kIChcIiArIG1lZGlhUXVlcnkgKyBcIilcIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fTtcclxuXHRyZXR1cm4gbGlzdDtcclxufTtcclxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbJ2V4cG9ydHMnLCAnbW9kdWxlJ10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGZhY3RvcnkoZXhwb3J0cywgbW9kdWxlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbW9kID0ge1xuICAgICAgZXhwb3J0czoge31cbiAgICB9O1xuICAgIGZhY3RvcnkobW9kLmV4cG9ydHMsIG1vZCk7XG4gICAgZ2xvYmFsLmZldGNoSnNvbnAgPSBtb2QuZXhwb3J0cztcbiAgfVxufSkodGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsIG1vZHVsZSkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAganNvbnBDYWxsYmFjazogJ2NhbGxiYWNrJ1xuICB9O1xuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlQ2FsbGJhY2tGdW5jdGlvbigpIHtcbiAgICByZXR1cm4gJ2pzb25wXycgKyBEYXRlLm5vdygpICsgJ18nICsgTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiAxMDAwMDApO1xuICB9XG5cbiAgLy8gS25vd24gaXNzdWU6IFdpbGwgdGhyb3cgJ1VuY2F1Z2h0IFJlZmVyZW5jZUVycm9yOiBjYWxsYmFja18qKiogaXMgbm90IGRlZmluZWQnIGVycm9yIGlmIHJlcXVlc3QgdGltZW91dFxuICBmdW5jdGlvbiBjbGVhckZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSkge1xuICAgIC8vIElFOCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4geW91IHRyeSB0byBkZWxldGUgYSBwcm9wZXJ0eSBvbiB3aW5kb3dcbiAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xODI0MjI4Lzc1MTA4OVxuICAgIHRyeSB7XG4gICAgICBkZWxldGUgd2luZG93W2Z1bmN0aW9uTmFtZV07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgd2luZG93W2Z1bmN0aW9uTmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlU2NyaXB0KHNjcmlwdElkKSB7XG4gICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNjcmlwdElkKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF0ucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgfVxuXG4gIHZhciBmZXRjaEpzb25wID0gZnVuY3Rpb24gZmV0Y2hKc29ucCh1cmwpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzFdO1xuXG4gICAgdmFyIHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgIT0gbnVsbCA/IG9wdGlvbnMudGltZW91dCA6IGRlZmF1bHRPcHRpb25zLnRpbWVvdXQ7XG4gICAgdmFyIGpzb25wQ2FsbGJhY2sgPSBvcHRpb25zLmpzb25wQ2FsbGJhY2sgIT0gbnVsbCA/IG9wdGlvbnMuanNvbnBDYWxsYmFjayA6IGRlZmF1bHRPcHRpb25zLmpzb25wQ2FsbGJhY2s7XG5cbiAgICB2YXIgdGltZW91dElkID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBjYWxsYmFja0Z1bmN0aW9uID0gZ2VuZXJhdGVDYWxsYmFja0Z1bmN0aW9uKCk7XG5cbiAgICAgIHdpbmRvd1tjYWxsYmFja0Z1bmN0aW9uXSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgICAvLyBrZWVwIGNvbnNpc3RlbnQgd2l0aCBmZXRjaCBBUElcbiAgICAgICAgICBqc29uOiBmdW5jdGlvbiBqc29uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGltZW91dElkKSBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICByZW1vdmVTY3JpcHQoanNvbnBDYWxsYmFjayArICdfJyArIGNhbGxiYWNrRnVuY3Rpb24pO1xuXG4gICAgICAgIGNsZWFyRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlvbik7XG4gICAgICB9O1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBzZXQgdGhlaXIgb3duIHBhcmFtcywgYW5kIGlmIG5vdCBhZGQgYSA/IHRvIHN0YXJ0IGEgbGlzdCBvZiBwYXJhbXNcbiAgICAgIHVybCArPSB1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJztcblxuICAgICAgdmFyIGpzb25wU2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBqc29ucFNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdXJsICsganNvbnBDYWxsYmFjayArICc9JyArIGNhbGxiYWNrRnVuY3Rpb24pO1xuICAgICAganNvbnBTY3JpcHQuaWQgPSBqc29ucENhbGxiYWNrICsgJ18nICsgY2FsbGJhY2tGdW5jdGlvbjtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXS5hcHBlbmRDaGlsZChqc29ucFNjcmlwdCk7XG5cbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdKU09OUCByZXF1ZXN0IHRvICcgKyB1cmwgKyAnIHRpbWVkIG91dCcpKTtcblxuICAgICAgICBjbGVhckZ1bmN0aW9uKGNhbGxiYWNrRnVuY3Rpb24pO1xuICAgICAgICByZW1vdmVTY3JpcHQoanNvbnBDYWxsYmFjayArICdfJyArIGNhbGxiYWNrRnVuY3Rpb24pO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gZXhwb3J0IGFzIGdsb2JhbCBmdW5jdGlvblxuICAvKlxuICBsZXQgbG9jYWw7XG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gc2VsZjtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgfVxuICB9XG4gIFxuICBsb2NhbC5mZXRjaEpzb25wID0gZmV0Y2hKc29ucDtcbiAgKi9cblxuICBtb2R1bGUuZXhwb3J0cyA9IGZldGNoSnNvbnA7XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9mZXRjaC1qc29ucC9idWlsZC9mZXRjaC1qc29ucC5qc1xuICoqIG1vZHVsZSBpZCA9IDE2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSBjb25maWdBbmltYXRpb247XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9wZXJmb3JtYW5jZU5vdyA9IHJlcXVpcmUoJ3BlcmZvcm1hbmNlLW5vdycpO1xuXG52YXIgX3BlcmZvcm1hbmNlTm93MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BlcmZvcm1hbmNlTm93KTtcblxudmFyIF9yYWYgPSByZXF1aXJlKCdyYWYnKTtcblxudmFyIF9yYWYyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmFmKTtcblxuZnVuY3Rpb24gY29uZmlnQW5pbWF0aW9uKCkge1xuICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG4gIHZhciBfY29uZmlnJHRpbWVTdGVwID0gY29uZmlnLnRpbWVTdGVwO1xuICB2YXIgdGltZVN0ZXAgPSBfY29uZmlnJHRpbWVTdGVwID09PSB1bmRlZmluZWQgPyAxIC8gNjAgKiAxMDAwIDogX2NvbmZpZyR0aW1lU3RlcDtcbiAgdmFyIF9jb25maWckdGltZVNjYWxlID0gY29uZmlnLnRpbWVTY2FsZTtcbiAgdmFyIHRpbWVTY2FsZSA9IF9jb25maWckdGltZVNjYWxlID09PSB1bmRlZmluZWQgPyAxIDogX2NvbmZpZyR0aW1lU2NhbGU7XG4gIHZhciBfY29uZmlnJG1heFN0ZXBzID0gY29uZmlnLm1heFN0ZXBzO1xuICB2YXIgbWF4U3RlcHMgPSBfY29uZmlnJG1heFN0ZXBzID09PSB1bmRlZmluZWQgPyAxMCA6IF9jb25maWckbWF4U3RlcHM7XG4gIHZhciBfY29uZmlnJHJhZiA9IGNvbmZpZy5yYWY7XG4gIHZhciByYWYgPSBfY29uZmlnJHJhZiA9PT0gdW5kZWZpbmVkID8gX3JhZjJbJ2RlZmF1bHQnXSA6IF9jb25maWckcmFmO1xuICB2YXIgX2NvbmZpZyRub3cgPSBjb25maWcubm93O1xuICB2YXIgbm93ID0gX2NvbmZpZyRub3cgPT09IHVuZGVmaW5lZCA/IF9wZXJmb3JtYW5jZU5vdzJbJ2RlZmF1bHQnXSA6IF9jb25maWckbm93O1xuXG4gIHZhciBhbmltUnVubmluZyA9IFtdO1xuICB2YXIgcnVubmluZyA9IGZhbHNlO1xuICB2YXIgcHJldlRpbWUgPSAwO1xuICB2YXIgYWNjdW11bGF0ZWRUaW1lID0gMDtcblxuICBmdW5jdGlvbiBsb29wKCkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IG5vdygpO1xuICAgIHZhciBmcmFtZVRpbWUgPSBjdXJyZW50VGltZSAtIHByZXZUaW1lOyAvLyBkZWx0YVxuXG4gICAgcHJldlRpbWUgPSBjdXJyZW50VGltZTtcbiAgICBhY2N1bXVsYXRlZFRpbWUgKz0gZnJhbWVUaW1lICogdGltZVNjYWxlO1xuXG4gICAgaWYgKGFjY3VtdWxhdGVkVGltZSA+IHRpbWVTdGVwICogbWF4U3RlcHMpIHtcbiAgICAgIGFjY3VtdWxhdGVkVGltZSA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGZyYW1lTnVtYmVyID0gTWF0aC5jZWlsKGFjY3VtdWxhdGVkVGltZSAvIHRpbWVTdGVwKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuaW1SdW5uaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX2FuaW1SdW5uaW5nJGkgPSBhbmltUnVubmluZ1tpXTtcbiAgICAgIHZhciBhY3RpdmUgPSBfYW5pbVJ1bm5pbmckaS5hY3RpdmU7XG4gICAgICB2YXIgYW5pbWF0aW9uU3RlcCA9IF9hbmltUnVubmluZyRpLmFuaW1hdGlvblN0ZXA7XG4gICAgICB2YXIgcHJldlByZXZTdGF0ZSA9IF9hbmltUnVubmluZyRpLnByZXZTdGF0ZTtcbiAgICAgIHZhciBwcmV2TmV4dFN0YXRlID0gYW5pbVJ1bm5pbmdbaV0ubmV4dFN0YXRlO1xuXG4gICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VlbXMgbGlrZSBiZWNhdXNlIHRoZSBUUyBzZXRzIGRlc3RWYWxzIGFzIGVudGVyVmFscyBmb3IgdGhlIGZpcnN0XG4gICAgICAvLyB0aWNrLCB3ZSBtaWdodCByZW5kZXIgdGhhdCB2YWx1ZSB0d2ljZS4gV2UgcmVuZGVyIGl0IG9uY2UsIGN1cnJWYWx1ZSBpc1xuICAgICAgLy8gZW50ZXJWYWwgYW5kIGRlc3RWYWwgaXMgZW50ZXJWYWwuIFRoZSBuZXh0IHRpY2sgaXMgZmFzdGVyIHRoYW4gMTZtcyxcbiAgICAgIC8vIHNvIGFjY3VtdWxhdGVkVGltZSAod2hpY2ggd291bGQgYmUgYWJvdXQgLTE2bXMgZnJvbSB0aGUgcHJldmlvdXMgdGljaylcbiAgICAgIC8vIGlzIG5lZ2F0aXZlICgtMTZtcyArIGFueSBudW1iZXIgbGVzcyB0aGFuIDE2bXMgPCAwKS4gU28gd2UganVzdCByZW5kZXJcbiAgICAgIC8vIHBhcnQgd2F5cyB0b3dhcmRzIHRoZSBuZXh0U3RhdGUsIGJ1dCB0aGF0J3MgZW50ZXJWYWwgc3RpbGwuIFdlIHJlbmRlclxuICAgICAgLy8gc2F5IDc1JSBiZXR3ZWVuIGN1cnJWYWx1ZSAoPT09IGVudGVyVmFsKSBhbmQgZGVzdFZhbHVlICg9PT0gZW50ZXJWYWwpLlxuICAgICAgLy8gU28gd2UgcmVuZGVyIHRoZSBzYW1lIHZhbHVlIGEgc2Vjb25kIHRpbWUuXG4gICAgICAvLyBUaGUgc29sdXRpb24gYmVsb3cgaXMgdG8gcmVjYWxjdWxhdGUgdGhlIGRlc3RpbmF0aW9uIHN0YXRlIGV2ZW4gd2hlblxuICAgICAgLy8geW91J3JlIG1vdmluZyBwYXJ0aWFsbHkgdG93YXJkcyBpdC5cbiAgICAgIGlmIChhY2N1bXVsYXRlZFRpbWUgPD0gMCkge1xuICAgICAgICBhbmltUnVubmluZ1tpXS5uZXh0U3RhdGUgPSBhbmltYXRpb25TdGVwKHRpbWVTdGVwIC8gMTAwMCwgcHJldlByZXZTdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZyYW1lTnVtYmVyOyBqKyspIHtcbiAgICAgICAgICBhbmltUnVubmluZ1tpXS5uZXh0U3RhdGUgPSBhbmltYXRpb25TdGVwKHRpbWVTdGVwIC8gMTAwMCwgcHJldk5leHRTdGF0ZSk7XG4gICAgICAgICAgdmFyIF9yZWYgPSBbcHJldk5leHRTdGF0ZSwgYW5pbVJ1bm5pbmdbaV0ubmV4dFN0YXRlXTtcbiAgICAgICAgICBhbmltUnVubmluZ1tpXS5wcmV2U3RhdGUgPSBfcmVmWzBdO1xuICAgICAgICAgIHByZXZOZXh0U3RhdGUgPSBfcmVmWzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYWNjdW11bGF0ZWRUaW1lID0gYWNjdW11bGF0ZWRUaW1lIC0gZnJhbWVOdW1iZXIgKiB0aW1lU3RlcDtcblxuICAgIC8vIFJlbmRlciBhbmQgZmlsdGVyIGluIG9uZSBpdGVyYXRpb24uXG4gICAgdmFyIGFscGhhID0gMSArIGFjY3VtdWxhdGVkVGltZSAvIHRpbWVTdGVwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5pbVJ1bm5pbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfYW5pbVJ1bm5pbmckaTIgPSBhbmltUnVubmluZ1tpXTtcbiAgICAgIHZhciBhbmltYXRpb25SZW5kZXIgPSBfYW5pbVJ1bm5pbmckaTIuYW5pbWF0aW9uUmVuZGVyO1xuICAgICAgdmFyIG5leHRTdGF0ZSA9IF9hbmltUnVubmluZyRpMi5uZXh0U3RhdGU7XG4gICAgICB2YXIgcHJldlN0YXRlID0gX2FuaW1SdW5uaW5nJGkyLnByZXZTdGF0ZTtcblxuICAgICAgLy8gTWlnaHQgbXV0YXRlIGFuaW1SdW5uaW5nLi4uLi4uLi5cbiAgICAgIGFuaW1hdGlvblJlbmRlcihhbHBoYSwgbmV4dFN0YXRlLCBwcmV2U3RhdGUpO1xuICAgIH1cblxuICAgIGFuaW1SdW5uaW5nID0gYW5pbVJ1bm5pbmcuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIGFjdGl2ZSA9IF9yZWYyLmFjdGl2ZTtcbiAgICAgIHJldHVybiBhY3RpdmU7XG4gICAgfSk7XG5cbiAgICBpZiAoYW5pbVJ1bm5pbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhZihsb29wKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICBpZiAoIXJ1bm5pbmcpIHtcbiAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgcHJldlRpbWUgPSBub3coKTtcbiAgICAgIGFjY3VtdWxhdGVkVGltZSA9IDA7XG4gICAgICByYWYobG9vcCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW9uKHN0YXRlLCBhbmltYXRpb25TdGVwLCBhbmltYXRpb25SZW5kZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuaW1SdW5uaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsID0gYW5pbVJ1bm5pbmdbaV07XG4gICAgICBpZiAodmFsLmFuaW1hdGlvblN0ZXAgPT09IGFuaW1hdGlvblN0ZXApIHtcbiAgICAgICAgdmFsLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHZhbC5wcmV2U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIHZhbC5zdG9wO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXdBbmltID0ge1xuICAgICAgYW5pbWF0aW9uU3RlcDogYW5pbWF0aW9uU3RlcCxcbiAgICAgIGFuaW1hdGlvblJlbmRlcjogYW5pbWF0aW9uUmVuZGVyLFxuICAgICAgcHJldlN0YXRlOiBzdGF0ZSxcbiAgICAgIG5leHRTdGF0ZTogc3RhdGUsXG4gICAgICBhY3RpdmU6IHRydWVcbiAgICB9O1xuXG4gICAgbmV3QW5pbS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ld0FuaW0uYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgICBhbmltUnVubmluZy5wdXNoKG5ld0FuaW0pO1xuXG4gICAgc3RhcnQoKTtcblxuICAgIHJldHVybiBuZXdBbmltLnN0b3A7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0LW1vdGlvbi9saWIvYW5pbWF0aW9uTG9vcC5qc1xuICoqIG1vZHVsZSBpZCA9IDE3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNvbXBvbmVudHM7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9ub1ZlbG9jaXR5ID0gcmVxdWlyZSgnLi9ub1ZlbG9jaXR5Jyk7XG5cbnZhciBfbm9WZWxvY2l0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ub1ZlbG9jaXR5KTtcblxudmFyIF9oYXNSZWFjaGVkU3R5bGUgPSByZXF1aXJlKCcuL2hhc1JlYWNoZWRTdHlsZScpO1xuXG52YXIgX2hhc1JlYWNoZWRTdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYXNSZWFjaGVkU3R5bGUpO1xuXG52YXIgX21lcmdlRGlmZiA9IHJlcXVpcmUoJy4vbWVyZ2VEaWZmJyk7XG5cbnZhciBfbWVyZ2VEaWZmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX21lcmdlRGlmZik7XG5cbnZhciBfYW5pbWF0aW9uTG9vcCA9IHJlcXVpcmUoJy4vYW5pbWF0aW9uTG9vcCcpO1xuXG52YXIgX2FuaW1hdGlvbkxvb3AyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYW5pbWF0aW9uTG9vcCk7XG5cbnZhciBfemVybyA9IHJlcXVpcmUoJy4vemVybycpO1xuXG52YXIgX3plcm8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfemVybyk7XG5cbnZhciBfdXBkYXRlVHJlZSA9IHJlcXVpcmUoJy4vdXBkYXRlVHJlZScpO1xuXG52YXIgX2RlcHJlY2F0ZWRTcHJpbmdzMiA9IHJlcXVpcmUoJy4vZGVwcmVjYXRlZFNwcmluZ3MnKTtcblxudmFyIF9kZXByZWNhdGVkU3ByaW5nczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZXByZWNhdGVkU3ByaW5nczIpO1xuXG52YXIgX3N0cmlwU3R5bGUgPSByZXF1aXJlKCcuL3N0cmlwU3R5bGUnKTtcblxudmFyIF9zdHJpcFN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0cmlwU3R5bGUpO1xuXG52YXIgc3RhcnRBbmltYXRpb24gPSBfYW5pbWF0aW9uTG9vcDJbJ2RlZmF1bHQnXSgpO1xuXG5mdW5jdGlvbiBtYXBPYmplY3QoZiwgb2JqKSB7XG4gIHZhciByZXQgPSB7fTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXRba2V5XSA9IGYob2JqW2tleV0sIGtleSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZXZlcnlPYmooZiwgb2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFmKG9ialtrZXldLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb21wb25lbnRzKFJlYWN0KSB7XG4gIHZhciBQcm9wVHlwZXMgPSBSZWFjdC5Qcm9wVHlwZXM7XG5cbiAgdmFyIE1vdGlvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICBkaXNwbGF5TmFtZTogJ01vdGlvbicsXG5cbiAgICBwcm9wVHlwZXM6IHtcbiAgICAgIC8vIFRPT0Q6IHdhcm4gYWdhaW5zdCBwdXR0aW5nIGEgY29uZmlnIGluIGhlcmVcbiAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gZGVmYXVsdFZhbHVlKHByb3AsIHByb3BOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1NwcmluZ1xcJ3MgYGRlZmF1bHRWYWx1ZWAgaGFzIGJlZW4gY2hhbmdlZCB0byBgZGVmYXVsdFN0eWxlYC4gJyArICdJdHMgZm9ybWF0IHJlY2VpdmVkIGEgZmV3IChlYXN5IHRvIHVwZGF0ZSEpIGNoYW5nZXMgYXMgd2VsbC4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVuZFZhbHVlOiBmdW5jdGlvbiBlbmRWYWx1ZShwcm9wLCBwcm9wTmFtZSkge1xuICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdTcHJpbmdcXCdzIGBlbmRWYWx1ZWAgaGFzIGJlZW4gY2hhbmdlZCB0byBgc3R5bGVgLiBJdHMgZm9ybWF0ICcgKyAncmVjZWl2ZWQgYSBmZXcgKGVhc3kgdG8gdXBkYXRlISkgY2hhbmdlcyBhcyB3ZWxsLicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVmYXVsdFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG4gICAgfSxcblxuICAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgZGVmYXVsdFN0eWxlID0gX3Byb3BzLmRlZmF1bHRTdHlsZTtcbiAgICAgIHZhciBzdHlsZSA9IF9wcm9wcy5zdHlsZTtcblxuICAgICAgdmFyIGN1cnJlbnRTdHlsZSA9IGRlZmF1bHRTdHlsZSB8fCBzdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRTdHlsZTogY3VycmVudFN0eWxlLFxuICAgICAgICBjdXJyZW50VmVsb2NpdHk6IG1hcE9iamVjdChfemVybzJbJ2RlZmF1bHQnXSwgY3VycmVudFN0eWxlKVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5zdGFydEFuaW1hdGluZygpO1xuICAgIH0sXG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkge1xuICAgICAgdGhpcy5zdGFydEFuaW1hdGluZygpO1xuICAgIH0sXG5cbiAgICBhbmltYXRpb25TdGVwOiBmdW5jdGlvbiBhbmltYXRpb25TdGVwKHRpbWVzdGVwLCBzdGF0ZSkge1xuICAgICAgdmFyIGN1cnJlbnRTdHlsZSA9IHN0YXRlLmN1cnJlbnRTdHlsZTtcbiAgICAgIHZhciBjdXJyZW50VmVsb2NpdHkgPSBzdGF0ZS5jdXJyZW50VmVsb2NpdHk7XG4gICAgICB2YXIgc3R5bGUgPSB0aGlzLnByb3BzLnN0eWxlO1xuXG4gICAgICB2YXIgbmV3Q3VycmVudFN0eWxlID0gX3VwZGF0ZVRyZWUudXBkYXRlQ3VycmVudFN0eWxlKHRpbWVzdGVwLCBjdXJyZW50U3R5bGUsIGN1cnJlbnRWZWxvY2l0eSwgc3R5bGUpO1xuICAgICAgdmFyIG5ld0N1cnJlbnRWZWxvY2l0eSA9IF91cGRhdGVUcmVlLnVwZGF0ZUN1cnJlbnRWZWxvY2l0eSh0aW1lc3RlcCwgY3VycmVudFN0eWxlLCBjdXJyZW50VmVsb2NpdHksIHN0eWxlKTtcblxuICAgICAgLy8gVE9PRDogdGhpcyBpc24ndCBuZWNlc3NhcnkgYW55bW9yZS4gSXQgd2FzIHVzZWQgb25seSBhZ2FpbnN0IGVuZFZhbHVlIGZ1bmNcbiAgICAgIGlmIChfbm9WZWxvY2l0eTJbJ2RlZmF1bHQnXShjdXJyZW50VmVsb2NpdHksIG5ld0N1cnJlbnRTdHlsZSkgJiYgX25vVmVsb2NpdHkyWydkZWZhdWx0J10obmV3Q3VycmVudFZlbG9jaXR5LCBuZXdDdXJyZW50U3R5bGUpKSB7XG4gICAgICAgIC8vIGNoZWNrIGV4cGxhbmF0aW9uIGluIGBNb3Rpb24uYW5pbWF0aW9uUmVuZGVyYFxuICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTsgLy8gTmFzdHkgc2lkZSBlZmZlY3RzLi4uLlxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW50U3R5bGU6IG5ld0N1cnJlbnRTdHlsZSxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5OiBuZXdDdXJyZW50VmVsb2NpdHlcbiAgICAgIH07XG4gICAgfSxcblxuICAgIHN0b3BBbmltYXRpb246IG51bGwsXG5cbiAgICAvLyB1c2VkIGluIGFuaW1hdGlvblJlbmRlclxuICAgIGhhc1VubW91bnRlZDogZmFsc2UsXG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudDogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcbiAgICAgIHRoaXMuaGFzVW5tb3VudGVkID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgc3RhcnRBbmltYXRpbmc6IGZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW5nKCkge1xuICAgICAgLy8gSXMgc21hcnQgZW5vdWdoIHRvIG5vdCBzdGFydCBpdCB0d2ljZVxuICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uID0gc3RhcnRBbmltYXRpb24odGhpcy5zdGF0ZSwgdGhpcy5hbmltYXRpb25TdGVwLCB0aGlzLmFuaW1hdGlvblJlbmRlcik7XG4gICAgfSxcblxuICAgIGFuaW1hdGlvblJlbmRlcjogZnVuY3Rpb24gYW5pbWF0aW9uUmVuZGVyKGFscGhhLCBuZXh0U3RhdGUsIHByZXZTdGF0ZSkge1xuICAgICAgLy8gYHRoaXMuaGFzVW5tb3VudGVkYCBtaWdodCBiZSB0cnVlIGluIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uOlxuICAgICAgLy8gdXNlciBkb2VzIHNvbWUgY2hlY2tzIGluIGBzdHlsZWAgYW5kIGNhbGxzIGFuIG93bmVyIGhhbmRsZXJcbiAgICAgIC8vIG93bmVyIHNldHMgc3RhdGUgaW4gdGhlIGNhbGxiYWNrLCB0cmlnZ2VyaW5nIGEgcmUtcmVuZGVyXG4gICAgICAvLyB1bm1vdW50cyBNb3Rpb25cbiAgICAgIGlmICghdGhpcy5oYXNVbm1vdW50ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgY3VycmVudFN0eWxlOiBfdXBkYXRlVHJlZS5pbnRlcnBvbGF0ZVZhbHVlKGFscGhhLCBuZXh0U3RhdGUuY3VycmVudFN0eWxlLCBwcmV2U3RhdGUuY3VycmVudFN0eWxlKSxcbiAgICAgICAgICBjdXJyZW50VmVsb2NpdHk6IG5leHRTdGF0ZS5jdXJyZW50VmVsb2NpdHlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHN0cmlwcGVkU3R5bGUgPSBfc3RyaXBTdHlsZTJbJ2RlZmF1bHQnXSh0aGlzLnN0YXRlLmN1cnJlbnRTdHlsZSk7XG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW4oc3RyaXBwZWRTdHlsZSk7XG4gICAgICByZXR1cm4gcmVuZGVyZWRDaGlsZHJlbiAmJiBSZWFjdC5DaGlsZHJlbi5vbmx5KHJlbmRlcmVkQ2hpbGRyZW4pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIFN0YWdnZXJlZE1vdGlvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICBkaXNwbGF5TmFtZTogJ1N0YWdnZXJlZE1vdGlvbicsXG5cbiAgICBwcm9wVHlwZXM6IHtcbiAgICAgIGRlZmF1bHRTdHlsZTogZnVuY3Rpb24gZGVmYXVsdFN0eWxlKHByb3AsIHByb3BOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBmb3Jnb3QgdGhlIFwic1wiIGZvciBgU3RhZ2dlcmVkTW90aW9uYFxcJ3MgYGRlZmF1bHRTdHlsZXNgLicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKHByb3AsIHByb3BOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBmb3Jnb3QgdGhlIFwic1wiIGZvciBgU3RhZ2dlcmVkTW90aW9uYFxcJ3MgYHN0eWxlc2AuJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBUT09EOiB3YXJuIGFnYWluc3QgcHV0dGluZyBjb25maWdzIGluIGhlcmVcbiAgICAgIGRlZmF1bHRTdHlsZXM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgc3R5bGVzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgICB9LFxuXG4gICAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgc3R5bGVzID0gX3Byb3BzMi5zdHlsZXM7XG4gICAgICB2YXIgZGVmYXVsdFN0eWxlcyA9IF9wcm9wczIuZGVmYXVsdFN0eWxlcztcblxuICAgICAgdmFyIGN1cnJlbnRTdHlsZXMgPSBkZWZhdWx0U3R5bGVzID8gZGVmYXVsdFN0eWxlcyA6IHN0eWxlcygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudFN0eWxlczogY3VycmVudFN0eWxlcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXRpZXM6IGN1cnJlbnRTdHlsZXMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcE9iamVjdChfemVybzJbJ2RlZmF1bHQnXSwgcyk7XG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG4gICAgfSxcblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKSB7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG4gICAgfSxcblxuICAgIGFuaW1hdGlvblN0ZXA6IGZ1bmN0aW9uIGFuaW1hdGlvblN0ZXAodGltZXN0ZXAsIHN0YXRlKSB7XG4gICAgICB2YXIgY3VycmVudFN0eWxlcyA9IHN0YXRlLmN1cnJlbnRTdHlsZXM7XG4gICAgICB2YXIgY3VycmVudFZlbG9jaXRpZXMgPSBzdGF0ZS5jdXJyZW50VmVsb2NpdGllcztcblxuICAgICAgdmFyIHN0eWxlcyA9IHRoaXMucHJvcHMuc3R5bGVzKGN1cnJlbnRTdHlsZXMubWFwKF9zdHJpcFN0eWxlMlsnZGVmYXVsdCddKSk7XG5cbiAgICAgIHZhciBuZXdDdXJyZW50U3R5bGVzID0gY3VycmVudFN0eWxlcy5tYXAoZnVuY3Rpb24gKGN1cnJlbnRTdHlsZSwgaSkge1xuICAgICAgICByZXR1cm4gX3VwZGF0ZVRyZWUudXBkYXRlQ3VycmVudFN0eWxlKHRpbWVzdGVwLCBjdXJyZW50U3R5bGUsIGN1cnJlbnRWZWxvY2l0aWVzW2ldLCBzdHlsZXNbaV0pO1xuICAgICAgfSk7XG4gICAgICB2YXIgbmV3Q3VycmVudFZlbG9jaXRpZXMgPSBjdXJyZW50U3R5bGVzLm1hcChmdW5jdGlvbiAoY3VycmVudFN0eWxlLCBpKSB7XG4gICAgICAgIHJldHVybiBfdXBkYXRlVHJlZS51cGRhdGVDdXJyZW50VmVsb2NpdHkodGltZXN0ZXAsIGN1cnJlbnRTdHlsZSwgY3VycmVudFZlbG9jaXRpZXNbaV0sIHN0eWxlc1tpXSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVE9ETzogaXMgdGhpcyByaWdodD9cbiAgICAgIGlmIChjdXJyZW50VmVsb2NpdGllcy5ldmVyeShmdW5jdGlvbiAodiwgaykge1xuICAgICAgICByZXR1cm4gX25vVmVsb2NpdHkyWydkZWZhdWx0J10odiwgY3VycmVudFN0eWxlc1trXSk7XG4gICAgICB9KSAmJiBuZXdDdXJyZW50VmVsb2NpdGllcy5ldmVyeShmdW5jdGlvbiAodiwgaykge1xuICAgICAgICByZXR1cm4gX25vVmVsb2NpdHkyWydkZWZhdWx0J10odiwgbmV3Q3VycmVudFN0eWxlc1trXSk7XG4gICAgICB9KSkge1xuICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudFN0eWxlczogbmV3Q3VycmVudFN0eWxlcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXRpZXM6IG5ld0N1cnJlbnRWZWxvY2l0aWVzXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBzdG9wQW5pbWF0aW9uOiBudWxsLFxuXG4gICAgLy8gdXNlZCBpbiBhbmltYXRpb25SZW5kZXJcbiAgICBoYXNVbm1vdW50ZWQ6IGZhbHNlLFxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XG4gICAgICB0aGlzLmhhc1VubW91bnRlZCA9IHRydWU7XG4gICAgfSxcblxuICAgIHN0YXJ0QW5pbWF0aW5nOiBmdW5jdGlvbiBzdGFydEFuaW1hdGluZygpIHtcbiAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbiA9IHN0YXJ0QW5pbWF0aW9uKHRoaXMuc3RhdGUsIHRoaXMuYW5pbWF0aW9uU3RlcCwgdGhpcy5hbmltYXRpb25SZW5kZXIpO1xuICAgIH0sXG5cbiAgICBhbmltYXRpb25SZW5kZXI6IGZ1bmN0aW9uIGFuaW1hdGlvblJlbmRlcihhbHBoYSwgbmV4dFN0YXRlLCBwcmV2U3RhdGUpIHtcbiAgICAgIC8vIFNlZSBjb21tZW50IGluIE1vdGlvbi5cbiAgICAgIGlmICghdGhpcy5oYXNVbm1vdW50ZWQpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTdHlsZXMgPSBuZXh0U3RhdGUuY3VycmVudFN0eWxlcy5tYXAoZnVuY3Rpb24gKHN0eWxlLCBpKSB7XG4gICAgICAgICAgcmV0dXJuIF91cGRhdGVUcmVlLmludGVycG9sYXRlVmFsdWUoYWxwaGEsIHN0eWxlLCBwcmV2U3RhdGUuY3VycmVudFN0eWxlc1tpXSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjdXJyZW50U3R5bGVzOiBjdXJyZW50U3R5bGVzLFxuICAgICAgICAgIGN1cnJlbnRWZWxvY2l0aWVzOiBuZXh0U3RhdGUuY3VycmVudFZlbG9jaXRpZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHN0cmlwcGVkU3R5bGUgPSB0aGlzLnN0YXRlLmN1cnJlbnRTdHlsZXMubWFwKF9zdHJpcFN0eWxlMlsnZGVmYXVsdCddKTtcbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbihzdHJpcHBlZFN0eWxlKTtcbiAgICAgIHJldHVybiByZW5kZXJlZENoaWxkcmVuICYmIFJlYWN0LkNoaWxkcmVuLm9ubHkocmVuZGVyZWRDaGlsZHJlbik7XG4gICAgfVxuICB9KTtcblxuICB2YXIgVHJhbnNpdGlvbk1vdGlvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICBkaXNwbGF5TmFtZTogJ1RyYW5zaXRpb25Nb3Rpb24nLFxuXG4gICAgcHJvcFR5cGVzOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZShwcm9wLCBwcm9wTmFtZSkge1xuICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdUcmFuc2l0aW9uU3ByaW5nXFwncyBgZGVmYXVsdFZhbHVlYCBoYXMgYmVlbiBjaGFuZ2VkIHRvICcgKyAnYGRlZmF1bHRTdHlsZXNgLiBJdHMgZm9ybWF0IHJlY2VpdmVkIGEgZmV3IChlYXN5IHRvIHVwZGF0ZSEpICcgKyAnY2hhbmdlcyBhcyB3ZWxsLicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZW5kVmFsdWU6IGZ1bmN0aW9uIGVuZFZhbHVlKHByb3AsIHByb3BOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1RyYW5zaXRpb25TcHJpbmdcXCdzIGBlbmRWYWx1ZWAgaGFzIGJlZW4gY2hhbmdlZCB0byBgc3R5bGVzYC4gJyArICdJdHMgZm9ybWF0IHJlY2VpdmVkIGEgZmV3IChlYXN5IHRvIHVwZGF0ZSEpIGNoYW5nZXMgYXMgd2VsbC4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRTdHlsZTogZnVuY3Rpb24gZGVmYXVsdFN0eWxlKHByb3AsIHByb3BOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBmb3Jnb3QgdGhlIFwic1wiIGZvciBgVHJhbnNpdGlvbk1vdGlvbmBcXCdzIGBkZWZhdWx0U3R5bGVzYC4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShwcm9wLCBwcm9wTmFtZSkge1xuICAgICAgICBpZiAocHJvcFtwcm9wTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdZb3UgZm9yZ290IHRoZSBcInNcIiBmb3IgYFRyYW5zaXRpb25Nb3Rpb25gXFwncyBgc3R5bGVzYC4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIFRPT0Q6IHdhcm4gYWdhaW5zdCBwdXR0aW5nIGNvbmZpZ3MgaW4gaGVyZVxuICAgICAgZGVmYXVsdFN0eWxlczogUHJvcFR5cGVzLm9iamVjdE9mKFByb3BUeXBlcy5hbnkpLFxuICAgICAgc3R5bGVzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLm9iamVjdE9mKFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCldKS5pc1JlcXVpcmVkLFxuICAgICAgd2lsbExlYXZlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuY10pLFxuICAgICAgLy8gVE9PRDogd2FybiBhZ2FpbnN0IHB1dHRpbmcgY29uZmlncyBpbiBoZXJlXG4gICAgICB3aWxsRW50ZXI6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jXSksXG4gICAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICAgIH0sXG5cbiAgICBnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uIGdldERlZmF1bHRQcm9wcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpbGxFbnRlcjogZnVuY3Rpb24gd2lsbEVudGVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHdpbGxMZWF2ZTogZnVuY3Rpb24gd2lsbExlYXZlKCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgIHZhciBfcHJvcHMzID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBzdHlsZXMgPSBfcHJvcHMzLnN0eWxlcztcbiAgICAgIHZhciBkZWZhdWx0U3R5bGVzID0gX3Byb3BzMy5kZWZhdWx0U3R5bGVzO1xuXG4gICAgICB2YXIgY3VycmVudFN0eWxlcyA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChkZWZhdWx0U3R5bGVzID09IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHlsZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjdXJyZW50U3R5bGVzID0gc3R5bGVzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudFN0eWxlcyA9IHN0eWxlcztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudFN0eWxlcyA9IGRlZmF1bHRTdHlsZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW50U3R5bGVzOiBjdXJyZW50U3R5bGVzLFxuICAgICAgICBjdXJyZW50VmVsb2NpdGllczogbWFwT2JqZWN0KGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcE9iamVjdChfemVybzJbJ2RlZmF1bHQnXSwgcyk7XG4gICAgICAgIH0sIGN1cnJlbnRTdHlsZXMpXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG4gICAgfSxcblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKSB7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW5nKCk7XG4gICAgfSxcblxuICAgIGFuaW1hdGlvblN0ZXA6IGZ1bmN0aW9uIGFuaW1hdGlvblN0ZXAodGltZXN0ZXAsIHN0YXRlKSB7XG4gICAgICB2YXIgY3VycmVudFN0eWxlcyA9IHN0YXRlLmN1cnJlbnRTdHlsZXM7XG4gICAgICB2YXIgY3VycmVudFZlbG9jaXRpZXMgPSBzdGF0ZS5jdXJyZW50VmVsb2NpdGllcztcbiAgICAgIHZhciBfcHJvcHM0ID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBzdHlsZXMgPSBfcHJvcHM0LnN0eWxlcztcbiAgICAgIHZhciB3aWxsRW50ZXIgPSBfcHJvcHM0LndpbGxFbnRlcjtcbiAgICAgIHZhciB3aWxsTGVhdmUgPSBfcHJvcHM0LndpbGxMZWF2ZTtcblxuICAgICAgaWYgKHR5cGVvZiBzdHlsZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgc3R5bGVzID0gc3R5bGVzKGN1cnJlbnRTdHlsZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBodWg/XG4gICAgICB2YXIgbWVyZ2VkU3R5bGVzID0gc3R5bGVzOyAvLyBzZXQgbWVyZ2VkU3R5bGVzIHRvIHN0eWxlcyBhcyB0aGUgZGVmYXVsdFxuICAgICAgdmFyIGhhc05ld0tleSA9IGZhbHNlO1xuXG4gICAgICBtZXJnZWRTdHlsZXMgPSBfbWVyZ2VEaWZmMlsnZGVmYXVsdCddKGN1cnJlbnRTdHlsZXMsIHN0eWxlcyxcbiAgICAgIC8vIFRPRE86IHN0b3AgYWxsb2NhdGluZyBsaWtlIGNyYXp5IGluIHRoaXMgd2hvbGUgY29kZSBwYXRoXG4gICAgICBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciByZXMgPSB3aWxsTGVhdmUoa2V5LCBjdXJyZW50U3R5bGVzW2tleV0sIHN0eWxlcywgY3VycmVudFN0eWxlcywgY3VycmVudFZlbG9jaXRpZXMpO1xuICAgICAgICBpZiAocmVzID09IG51bGwpIHtcbiAgICAgICAgICAvLyBGb3IgbGVnYWN5IHJlYXNvbi4gV2Ugd29uJ3QgYWxsb3cgcmV0dXJuaW5nIG51bGwgc29vblxuICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSwgYWZ0ZXIgbmV4dCByZWxlYXNlXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX25vVmVsb2NpdHkyWydkZWZhdWx0J10oY3VycmVudFZlbG9jaXRpZXNba2V5XSwgY3VycmVudFN0eWxlc1trZXldKSAmJiBfaGFzUmVhY2hlZFN0eWxlMlsnZGVmYXVsdCddKGN1cnJlbnRTdHlsZXNba2V5XSwgcmVzKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KTtcblxuICAgICAgT2JqZWN0LmtleXMobWVyZ2VkU3R5bGVzKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gIWN1cnJlbnRTdHlsZXMuaGFzT3duUHJvcGVydHkoa2V5KTtcbiAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgX2V4dGVuZHMyLCBfZXh0ZW5kczM7XG5cbiAgICAgICAgaGFzTmV3S2V5ID0gdHJ1ZTtcbiAgICAgICAgdmFyIGVudGVyU3R5bGUgPSB3aWxsRW50ZXIoa2V5LCBtZXJnZWRTdHlsZXNba2V5XSwgc3R5bGVzLCBjdXJyZW50U3R5bGVzLCBjdXJyZW50VmVsb2NpdGllcyk7XG5cbiAgICAgICAgLy8gV2UgY2FuIG11dGF0ZSB0aGlzIGhlcmUgYmVjYXVzZSBtZXJnZURpZmYgcmV0dXJucyBhIG5ldyBPYmpcbiAgICAgICAgbWVyZ2VkU3R5bGVzW2tleV0gPSBlbnRlclN0eWxlO1xuXG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSBfZXh0ZW5kcyh7fSwgY3VycmVudFN0eWxlcywgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJba2V5XSA9IGVudGVyU3R5bGUsIF9leHRlbmRzMikpO1xuICAgICAgICBjdXJyZW50VmVsb2NpdGllcyA9IF9leHRlbmRzKHt9LCBjdXJyZW50VmVsb2NpdGllcywgKF9leHRlbmRzMyA9IHt9LCBfZXh0ZW5kczNba2V5XSA9IG1hcE9iamVjdChfemVybzJbJ2RlZmF1bHQnXSwgZW50ZXJTdHlsZSksIF9leHRlbmRzMykpO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBuZXdDdXJyZW50U3R5bGVzID0gbWFwT2JqZWN0KGZ1bmN0aW9uIChtZXJnZWRTdHlsZSwga2V5KSB7XG4gICAgICAgIHJldHVybiBfdXBkYXRlVHJlZS51cGRhdGVDdXJyZW50U3R5bGUodGltZXN0ZXAsIGN1cnJlbnRTdHlsZXNba2V5XSwgY3VycmVudFZlbG9jaXRpZXNba2V5XSwgbWVyZ2VkU3R5bGUpO1xuICAgICAgfSwgbWVyZ2VkU3R5bGVzKTtcbiAgICAgIHZhciBuZXdDdXJyZW50VmVsb2NpdGllcyA9IG1hcE9iamVjdChmdW5jdGlvbiAobWVyZ2VkU3R5bGUsIGtleSkge1xuICAgICAgICByZXR1cm4gX3VwZGF0ZVRyZWUudXBkYXRlQ3VycmVudFZlbG9jaXR5KHRpbWVzdGVwLCBjdXJyZW50U3R5bGVzW2tleV0sIGN1cnJlbnRWZWxvY2l0aWVzW2tleV0sIG1lcmdlZFN0eWxlKTtcbiAgICAgIH0sIG1lcmdlZFN0eWxlcyk7XG5cbiAgICAgIGlmICghaGFzTmV3S2V5ICYmIGV2ZXJ5T2JqKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIHJldHVybiBfbm9WZWxvY2l0eTJbJ2RlZmF1bHQnXSh2LCBjdXJyZW50U3R5bGVzW2tdKTtcbiAgICAgIH0sIGN1cnJlbnRWZWxvY2l0aWVzKSAmJiBldmVyeU9iaihmdW5jdGlvbiAodiwgaykge1xuICAgICAgICByZXR1cm4gX25vVmVsb2NpdHkyWydkZWZhdWx0J10odiwgbmV3Q3VycmVudFN0eWxlc1trXSk7XG4gICAgICB9LCBuZXdDdXJyZW50VmVsb2NpdGllcykpIHtcbiAgICAgICAgLy8gY2hlY2sgZXhwbGFuYXRpb24gaW4gYE1vdGlvbi5hbmltYXRpb25SZW5kZXJgXG4gICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpOyAvLyBOYXN0eSBzaWRlIGVmZmVjdHMuLi4uXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRTdHlsZXM6IG5ld0N1cnJlbnRTdHlsZXMsXG4gICAgICAgIGN1cnJlbnRWZWxvY2l0aWVzOiBuZXdDdXJyZW50VmVsb2NpdGllc1xuICAgICAgfTtcbiAgICB9LFxuXG4gICAgc3RvcEFuaW1hdGlvbjogbnVsbCxcblxuICAgIC8vIHVzZWQgaW4gYW5pbWF0aW9uUmVuZGVyXG4gICAgaGFzVW5tb3VudGVkOiBmYWxzZSxcblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xuICAgICAgdGhpcy5oYXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBzdGFydEFuaW1hdGluZzogZnVuY3Rpb24gc3RhcnRBbmltYXRpbmcoKSB7XG4gICAgICB0aGlzLnN0b3BBbmltYXRpb24gPSBzdGFydEFuaW1hdGlvbih0aGlzLnN0YXRlLCB0aGlzLmFuaW1hdGlvblN0ZXAsIHRoaXMuYW5pbWF0aW9uUmVuZGVyKTtcbiAgICB9LFxuXG4gICAgYW5pbWF0aW9uUmVuZGVyOiBmdW5jdGlvbiBhbmltYXRpb25SZW5kZXIoYWxwaGEsIG5leHRTdGF0ZSwgcHJldlN0YXRlKSB7XG4gICAgICAvLyBTZWUgY29tbWVudCBpbiBNb3Rpb24uXG4gICAgICBpZiAoIXRoaXMuaGFzVW5tb3VudGVkKSB7XG4gICAgICAgIHZhciBjdXJyZW50U3R5bGVzID0gbWFwT2JqZWN0KGZ1bmN0aW9uIChzdHlsZSwga2V5KSB7XG4gICAgICAgICAgcmV0dXJuIF91cGRhdGVUcmVlLmludGVycG9sYXRlVmFsdWUoYWxwaGEsIHN0eWxlLCBwcmV2U3RhdGUuY3VycmVudFN0eWxlc1trZXldKTtcbiAgICAgICAgfSwgbmV4dFN0YXRlLmN1cnJlbnRTdHlsZXMpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjdXJyZW50U3R5bGVzOiBjdXJyZW50U3R5bGVzLFxuICAgICAgICAgIGN1cnJlbnRWZWxvY2l0aWVzOiBuZXh0U3RhdGUuY3VycmVudFZlbG9jaXRpZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHN0cmlwcGVkU3R5bGUgPSBtYXBPYmplY3QoX3N0cmlwU3R5bGUyWydkZWZhdWx0J10sIHRoaXMuc3RhdGUuY3VycmVudFN0eWxlcyk7XG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW4oc3RyaXBwZWRTdHlsZSk7XG4gICAgICByZXR1cm4gcmVuZGVyZWRDaGlsZHJlbiAmJiBSZWFjdC5DaGlsZHJlbi5vbmx5KHJlbmRlcmVkQ2hpbGRyZW4pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIF9kZXByZWNhdGVkU3ByaW5ncyA9IF9kZXByZWNhdGVkU3ByaW5nczNbJ2RlZmF1bHQnXShSZWFjdCk7XG5cbiAgdmFyIFNwcmluZyA9IF9kZXByZWNhdGVkU3ByaW5ncy5TcHJpbmc7XG4gIHZhciBUcmFuc2l0aW9uU3ByaW5nID0gX2RlcHJlY2F0ZWRTcHJpbmdzLlRyYW5zaXRpb25TcHJpbmc7XG5cbiAgcmV0dXJuIHsgU3ByaW5nOiBTcHJpbmcsIFRyYW5zaXRpb25TcHJpbmc6IFRyYW5zaXRpb25TcHJpbmcsIE1vdGlvbjogTW90aW9uLCBTdGFnZ2VyZWRNb3Rpb246IFN0YWdnZXJlZE1vdGlvbiwgVHJhbnNpdGlvbk1vdGlvbjogVHJhbnNpdGlvbk1vdGlvbiB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL2NvbXBvbmVudHMuanNcbiAqKiBtb2R1bGUgaWQgPSAxOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0gZGVwcmVjYXRlZFNwcmluZ3M7XG52YXIgaGFzV2FybmVkRm9yU3ByaW5nID0ge307XG52YXIgaGFzV2FybmVkRm9yVHJhbnNpdGlvblNwcmluZyA9IHt9O1xuXG5mdW5jdGlvbiBkZXByZWNhdGVkU3ByaW5ncyhSZWFjdCkge1xuICB2YXIgU3ByaW5nID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgIGRpc3BsYXlOYW1lOiAnU3ByaW5nJyxcblxuICAgIGNvbXBvbmVudFdpbGxNb3VudDogZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIHZhciBvd25lck5hbWUgPSB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lciAmJiB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lci5nZXROYW1lKCk7XG4gICAgICAgIGlmICghaGFzV2FybmVkRm9yU3ByaW5nW293bmVyTmFtZV0pIHtcbiAgICAgICAgICBoYXNXYXJuZWRGb3JTcHJpbmdbb3duZXJOYW1lXSA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignU3ByaW5nICh1c2VkIGluICVzcmVuZGVyKSBoYXMgbm93IGJlZW4gcmVuYW1lZCB0byBNb3Rpb24uICcgKyAnUGxlYXNlIHNlZSB0aGUgcmVsZWFzZSBub3RlIGZvciB0aGUgdXBncmFkZSBwYXRoLiBUaGFuayB5b3UhJywgb3duZXJOYW1lID8gb3duZXJOYW1lICsgJ1xcJ3MgJyA6ICdSZWFjdC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIFRyYW5zaXRpb25TcHJpbmcgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAgZGlzcGxheU5hbWU6ICdUcmFuc2l0aW9uU3ByaW5nJyxcblxuICAgIGNvbXBvbmVudFdpbGxNb3VudDogZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIHZhciBvd25lck5hbWUgPSB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lciAmJiB0aGlzLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lci5nZXROYW1lKCk7XG4gICAgICAgIGlmICghaGFzV2FybmVkRm9yVHJhbnNpdGlvblNwcmluZ1tvd25lck5hbWVdKSB7XG4gICAgICAgICAgaGFzV2FybmVkRm9yVHJhbnNpdGlvblNwcmluZ1tvd25lck5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdUcmFuc2l0aW9uU3ByaW5nICh1c2VkIGluICVzcmVuZGVyKSBoYXMgbm93IGJlZW4gcmVuYW1lZCB0byAnICsgJ1RyYW5zaXRpb25Nb3Rpb24uIFBsZWFzZSBzZWUgdGhlIHJlbGVhc2Ugbm90ZSBmb3IgdGhlIHVwZ3JhZGUgJyArICdwYXRoLiBUaGFuayB5b3UhJywgb3duZXJOYW1lID8gb3duZXJOYW1lICsgJ1xcJ3MgJyA6ICdSZWFjdC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHsgU3ByaW5nOiBTcHJpbmcsIFRyYW5zaXRpb25TcHJpbmc6IFRyYW5zaXRpb25TcHJpbmcgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3QtbW90aW9uL2xpYi9kZXByZWNhdGVkU3ByaW5ncy5qc1xuICoqIG1vZHVsZSBpZCA9IDE5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaGFzUmVhY2hlZFN0eWxlO1xuXG5mdW5jdGlvbiBoYXNSZWFjaGVkU3R5bGUoY3VycmVudFN0eWxlLCBzdHlsZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcbiAgICBpZiAoIXN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgY3VycmVudFZhbHVlID0gY3VycmVudFN0eWxlW2tleV07XG4gICAgdmFyIGRlc3RWYWx1ZSA9IHN0eWxlW2tleV07XG4gICAgaWYgKCFkZXN0VmFsdWUuY29uZmlnKSB7XG4gICAgICAvLyBub3QgYSBzcHJpbmcgY29uZmlnXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS5jb25maWcgJiYgY3VycmVudFZhbHVlLnZhbCAhPT0gZGVzdFZhbHVlLnZhbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRWYWx1ZS5jb25maWcgJiYgY3VycmVudFZhbHVlICE9PSBkZXN0VmFsdWUudmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3QtbW90aW9uL2xpYi9oYXNSZWFjaGVkU3R5bGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gdGhpcyBmdW5jdGlvbiBpcyBhbGxvY2F0aW9uLWxlc3MgdGhhbmtzIHRvIGJhYmVsLCB3aGljaCB0cmFuc2Zvcm1zIHRoZSB0YWlsXG4vLyBjYWxscyBpbnRvIGxvb3BzXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbWVyZ2VEaWZmO1xuZnVuY3Rpb24gbWVyZ2VEaWZmQXJyKF94LCBfeDIsIF94MywgX3g0LCBfeDUsIF94NiwgX3g3KSB7XG4gIHZhciBfYWdhaW4gPSB0cnVlO1xuXG4gIF9mdW5jdGlvbjogd2hpbGUgKF9hZ2Fpbikge1xuICAgIHZhciBhcnJBID0gX3gsXG4gICAgICAgIGFyckIgPSBfeDIsXG4gICAgICAgIGNvbGxCID0gX3gzLFxuICAgICAgICBpbmRleEEgPSBfeDQsXG4gICAgICAgIGluZGV4QiA9IF94NSxcbiAgICAgICAgb25SZW1vdmUgPSBfeDYsXG4gICAgICAgIGFjY3VtID0gX3g3O1xuICAgIGVuZEEgPSBlbmRCID0ga2V5QSA9IGtleUIgPSBmaWxsID0gZmlsbCA9IHVuZGVmaW5lZDtcbiAgICBfYWdhaW4gPSBmYWxzZTtcblxuICAgIHZhciBlbmRBID0gaW5kZXhBID09PSBhcnJBLmxlbmd0aDtcbiAgICB2YXIgZW5kQiA9IGluZGV4QiA9PT0gYXJyQi5sZW5ndGg7XG4gICAgdmFyIGtleUEgPSBhcnJBW2luZGV4QV07XG4gICAgdmFyIGtleUIgPSBhcnJCW2luZGV4Ql07XG4gICAgaWYgKGVuZEEgJiYgZW5kQikge1xuICAgICAgLy8gcmV0dXJuaW5nIG51bGwgaGVyZSwgb3RoZXJ3aXNlIGxpbnQgY29tcGxhaW5zIHRoYXQgd2UncmUgbm90IGV4cGVjdGluZ1xuICAgICAgLy8gYSByZXR1cm4gdmFsdWUgaW4gc3Vic2VxdWVudCBjYWxscy4gV2Uga25vdyB3aGF0IHdlJ3JlIGRvaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVuZEEpIHtcbiAgICAgIGFjY3VtW2tleUJdID0gY29sbEJba2V5Ql07XG4gICAgICBfeCA9IGFyckE7XG4gICAgICBfeDIgPSBhcnJCO1xuICAgICAgX3gzID0gY29sbEI7XG4gICAgICBfeDQgPSBpbmRleEE7XG4gICAgICBfeDUgPSBpbmRleEIgKyAxO1xuICAgICAgX3g2ID0gb25SZW1vdmU7XG4gICAgICBfeDcgPSBhY2N1bTtcbiAgICAgIF9hZ2FpbiA9IHRydWU7XG4gICAgICBjb250aW51ZSBfZnVuY3Rpb247XG4gICAgfVxuXG4gICAgaWYgKGVuZEIpIHtcbiAgICAgIHZhciBmaWxsID0gb25SZW1vdmUoa2V5QSk7XG4gICAgICBpZiAoZmlsbCAhPSBudWxsKSB7XG4gICAgICAgIGFjY3VtW2tleUFdID0gZmlsbDtcbiAgICAgIH1cbiAgICAgIF94ID0gYXJyQTtcbiAgICAgIF94MiA9IGFyckI7XG4gICAgICBfeDMgPSBjb2xsQjtcbiAgICAgIF94NCA9IGluZGV4QSArIDE7XG4gICAgICBfeDUgPSBpbmRleEI7XG4gICAgICBfeDYgPSBvblJlbW92ZTtcbiAgICAgIF94NyA9IGFjY3VtO1xuICAgICAgX2FnYWluID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlIF9mdW5jdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoa2V5QSA9PT0ga2V5Qikge1xuICAgICAgYWNjdW1ba2V5QV0gPSBjb2xsQltrZXlBXTtcbiAgICAgIF94ID0gYXJyQTtcbiAgICAgIF94MiA9IGFyckI7XG4gICAgICBfeDMgPSBjb2xsQjtcbiAgICAgIF94NCA9IGluZGV4QSArIDE7XG4gICAgICBfeDUgPSBpbmRleEIgKyAxO1xuICAgICAgX3g2ID0gb25SZW1vdmU7XG4gICAgICBfeDcgPSBhY2N1bTtcbiAgICAgIF9hZ2FpbiA9IHRydWU7XG4gICAgICBjb250aW51ZSBfZnVuY3Rpb247XG4gICAgfVxuXG4gICAgaWYgKCFjb2xsQi5oYXNPd25Qcm9wZXJ0eShrZXlBKSkge1xuICAgICAgdmFyIGZpbGwgPSBvblJlbW92ZShrZXlBKTtcbiAgICAgIGlmIChmaWxsICE9IG51bGwpIHtcbiAgICAgICAgYWNjdW1ba2V5QV0gPSBmaWxsO1xuICAgICAgfVxuICAgICAgX3ggPSBhcnJBO1xuICAgICAgX3gyID0gYXJyQjtcbiAgICAgIF94MyA9IGNvbGxCO1xuICAgICAgX3g0ID0gaW5kZXhBICsgMTtcbiAgICAgIF94NSA9IGluZGV4QjtcbiAgICAgIF94NiA9IG9uUmVtb3ZlO1xuICAgICAgX3g3ID0gYWNjdW07XG4gICAgICBfYWdhaW4gPSB0cnVlO1xuICAgICAgY29udGludWUgX2Z1bmN0aW9uO1xuICAgIH1cblxuICAgIF94ID0gYXJyQTtcbiAgICBfeDIgPSBhcnJCO1xuICAgIF94MyA9IGNvbGxCO1xuICAgIF94NCA9IGluZGV4QSArIDE7XG4gICAgX3g1ID0gaW5kZXhCO1xuICAgIF94NiA9IG9uUmVtb3ZlO1xuICAgIF94NyA9IGFjY3VtO1xuICAgIF9hZ2FpbiA9IHRydWU7XG4gICAgY29udGludWUgX2Z1bmN0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlRGlmZihhLCBiLCBvblJlbW92ZSkge1xuICB2YXIgcmV0ID0ge307XG4gIC8vIGlmIGFueW9uZSBjYW4gbWFrZSB0aGlzIHdvcmsgd2l0aG91dCBhbGxvY2F0aW5nIHRoZSBhcnJheXMgaGVyZSwgd2UnbGxcbiAgLy8gZ2l2ZSB5b3UgYSBtZWRhbFxuICBtZXJnZURpZmZBcnIoT2JqZWN0LmtleXMoYSksIE9iamVjdC5rZXlzKGIpLCBiLCAwLCAwLCBvblJlbW92ZSwgcmV0KTtcbiAgcmV0dXJuIHJldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL21lcmdlRGlmZi5qc1xuICoqIG1vZHVsZSBpZCA9IDIxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBjdXJyZW50U3R5bGUga2VlcHMgdGhlIGluZm8gYWJvdXQgd2hldGhlciBhIHByb3AgaXMgY29uZmlndXJlZCBhcyBhIHNwcmluZ1xuLy8gb3IgaWYgaXQncyBqdXN0IGEgcmFuZG9tIHByb3AgdGhhdCBoYXBwZW5zIHRvIGJlIHByZXNlbnQgb24gdGhlIHN0eWxlXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbm9WZWxvY2l0eTtcblxuZnVuY3Rpb24gbm9WZWxvY2l0eShjdXJyZW50VmVsb2NpdHksIGN1cnJlbnRTdHlsZSkge1xuICBmb3IgKHZhciBrZXkgaW4gY3VycmVudFZlbG9jaXR5KSB7XG4gICAgaWYgKCFjdXJyZW50VmVsb2NpdHkuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50U3R5bGVba2V5XS5jb25maWcgJiYgY3VycmVudFZlbG9jaXR5W2tleV0gIT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3QtbW90aW9uL2xpYi9ub1ZlbG9jaXR5LmpzXG4gKiogbW9kdWxlIGlkID0gMjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfY29tcG9uZW50czIgPSByZXF1aXJlKCcuL2NvbXBvbmVudHMnKTtcblxudmFyIF9jb21wb25lbnRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudHMyKTtcblxudmFyIF9yZW9yZGVyS2V5cyA9IHJlcXVpcmUoJy4vcmVvcmRlcktleXMnKTtcblxudmFyIF9yZW9yZGVyS2V5czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZW9yZGVyS2V5cyk7XG5cbnZhciBfY29tcG9uZW50cyA9IF9jb21wb25lbnRzM1snZGVmYXVsdCddKF9yZWFjdDJbJ2RlZmF1bHQnXSk7XG5cbnZhciBTcHJpbmcgPSBfY29tcG9uZW50cy5TcHJpbmc7XG52YXIgVHJhbnNpdGlvblNwcmluZyA9IF9jb21wb25lbnRzLlRyYW5zaXRpb25TcHJpbmc7XG52YXIgTW90aW9uID0gX2NvbXBvbmVudHMuTW90aW9uO1xudmFyIFN0YWdnZXJlZE1vdGlvbiA9IF9jb21wb25lbnRzLlN0YWdnZXJlZE1vdGlvbjtcbnZhciBUcmFuc2l0aW9uTW90aW9uID0gX2NvbXBvbmVudHMuVHJhbnNpdGlvbk1vdGlvbjtcbmV4cG9ydHMuU3ByaW5nID0gU3ByaW5nO1xuZXhwb3J0cy5UcmFuc2l0aW9uU3ByaW5nID0gVHJhbnNpdGlvblNwcmluZztcbmV4cG9ydHMuTW90aW9uID0gTW90aW9uO1xuZXhwb3J0cy5TdGFnZ2VyZWRNb3Rpb24gPSBTdGFnZ2VyZWRNb3Rpb247XG5leHBvcnRzLlRyYW5zaXRpb25Nb3Rpb24gPSBUcmFuc2l0aW9uTW90aW9uO1xuXG52YXIgX3NwcmluZzIgPSByZXF1aXJlKCcuL3NwcmluZycpO1xuXG52YXIgX3NwcmluZzMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zcHJpbmcyKTtcblxuZXhwb3J0cy5zcHJpbmcgPSBfc3ByaW5nM1snZGVmYXVsdCddO1xuXG52YXIgX3ByZXNldHMyID0gcmVxdWlyZSgnLi9wcmVzZXRzJyk7XG5cbnZhciBfcHJlc2V0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcmVzZXRzMik7XG5cbmV4cG9ydHMucHJlc2V0cyA9IF9wcmVzZXRzM1snZGVmYXVsdCddO1xudmFyIHV0aWxzID0ge1xuICByZW9yZGVyS2V5czogX3Jlb3JkZXJLZXlzMlsnZGVmYXVsdCddXG59O1xuZXhwb3J0cy51dGlscyA9IHV0aWxzO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0LW1vdGlvbi9saWIvcmVhY3QtbW90aW9uLmpzXG4gKiogbW9kdWxlIGlkID0gMjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSByZW9yZGVyS2V5cztcblxuZnVuY3Rpb24gcmVvcmRlcktleXMob2JqLCBmKSB7XG4gIHZhciBuZXdLZXlzID0gZihPYmplY3Qua2V5cyhvYmopKTtcbiAgdmFyIHJldCA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gbmV3S2V5c1tpXTtcbiAgICByZXRba2V5XSA9IG9ialtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL3Jlb3JkZXJLZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHNwcmluZztcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3ByZXNldHMgPSByZXF1aXJlKCcuL3ByZXNldHMnKTtcblxudmFyIF9wcmVzZXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ByZXNldHMpO1xuXG4vLyBpbnN0ZWFkIG9mIGV4cG9zaW5nIHt2YWw6IGJsYSwgY29uZmlnOiBibGF9LCB1c2UgYSBoZWxwZXJcblxuZnVuY3Rpb24gc3ByaW5nKHZhbCkge1xuICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gX3ByZXNldHMyWydkZWZhdWx0J10ubm9Xb2JibGUgOiBhcmd1bWVudHNbMV07XG5cbiAgcmV0dXJuIHsgdmFsOiB2YWwsIGNvbmZpZzogY29uZmlnIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0LW1vdGlvbi9saWIvc3ByaW5nLmpzXG4gKiogbW9kdWxlIGlkID0gMjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBzdGVwcGVyO1xudmFyIGVycm9yTWFyZ2luID0gMC4wMDAxO1xuXG5mdW5jdGlvbiBzdGVwcGVyKGZyYW1lUmF0ZSwgeCwgdiwgZGVzdFgsIGssIGIpIHtcbiAgLy8gU3ByaW5nIHN0aWZmbmVzcywgaW4ga2cgLyBzXjJcblxuICAvLyBmb3IgYW5pbWF0aW9ucywgZGVzdFggaXMgcmVhbGx5IHNwcmluZyBsZW5ndGggKHNwcmluZyBhdCByZXN0KS4gaW5pdGlhbFxuICAvLyBwb3NpdGlvbiBpcyBjb25zaWRlcmVkIGFzIHRoZSBzdHJldGNoZWQvY29tcHJlc3NlZCBwb3NpdGlvbiBvZiBhIHNwcmluZ1xuICB2YXIgRnNwcmluZyA9IC1rICogKHggLSBkZXN0WCk7XG5cbiAgLy8gRGFtcGluZywgaW4ga2cgLyBzXG4gIHZhciBGZGFtcGVyID0gLWIgKiB2O1xuXG4gIC8vIHVzdWFsbHkgd2UgcHV0IG1hc3MgaGVyZSwgYnV0IGZvciBhbmltYXRpb24gcHVycG9zZXMsIHNwZWNpZnlpbmcgbWFzcyBpcyBhXG4gIC8vIGJpdCByZWR1bmRhbnQuIHlvdSBjb3VsZCBzaW1wbHkgYWRqdXN0IGsgYW5kIGIgYWNjb3JkaW5nbHlcbiAgLy8gbGV0IGEgPSAoRnNwcmluZyArIEZkYW1wZXIpIC8gbWFzcztcbiAgdmFyIGEgPSBGc3ByaW5nICsgRmRhbXBlcjtcblxuICB2YXIgbmV3ViA9IHYgKyBhICogZnJhbWVSYXRlO1xuICB2YXIgbmV3WCA9IHggKyBuZXdWICogZnJhbWVSYXRlO1xuXG4gIGlmIChNYXRoLmFicyhuZXdWIC0gdikgPCBlcnJvck1hcmdpbiAmJiBNYXRoLmFicyhuZXdYIC0geCkgPCBlcnJvck1hcmdpbikge1xuICAgIHJldHVybiBbZGVzdFgsIDBdO1xuICB9XG5cbiAgcmV0dXJuIFtuZXdYLCBuZXdWXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL3N0ZXBwZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gdHVybiB7eDoge3ZhbDogMSwgY29uZmlnOiBbMSwgMl19LCB5OiAyfSBpbnRvIHt4OiAxLCB5OiAyfVxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHN0cmlwU3R5bGU7XG5cbmZ1bmN0aW9uIHN0cmlwU3R5bGUoc3R5bGUpIHtcbiAgdmFyIHJldCA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcbiAgICBpZiAoIXN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXRba2V5XSA9IHN0eWxlW2tleV0udmFsID09IG51bGwgPyBzdHlsZVtrZXldIDogc3R5bGVba2V5XS52YWw7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL3N0cmlwU3R5bGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5pbnRlcnBvbGF0ZVZhbHVlID0gaW50ZXJwb2xhdGVWYWx1ZTtcbmV4cG9ydHMudXBkYXRlQ3VycmVudFN0eWxlID0gdXBkYXRlQ3VycmVudFN0eWxlO1xuZXhwb3J0cy51cGRhdGVDdXJyZW50VmVsb2NpdHkgPSB1cGRhdGVDdXJyZW50VmVsb2NpdHk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9zdGVwcGVyID0gcmVxdWlyZSgnLi9zdGVwcGVyJyk7XG5cbnZhciBfc3RlcHBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdGVwcGVyKTtcblxuLy8gVE9ETzogcmVmYWN0b3IgY29tbW9uIGxvZ2ljIHdpdGggdXBkYXRlQ3VyclZhbHVlIGFuZCB1cGRhdGVDdXJyVmVsb2NpdHlcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVWYWx1ZShhbHBoYSwgbmV4dFN0eWxlLCBwcmV2U3R5bGUpIHtcbiAgLy8gbWlnaHQgYmUgdXNlZCBieSBhIFRyYW5zaXRpb25Nb3Rpb24sIHdoZXJlIHByZXZTdHlsZSBtaWdodCBub3QgZXhpc3QgYW55bW9yZVxuICBpZiAoIXByZXZTdHlsZSkge1xuICAgIHJldHVybiBuZXh0U3R5bGU7XG4gIH1cblxuICB2YXIgcmV0ID0ge307XG4gIGZvciAodmFyIGtleSBpbiBuZXh0U3R5bGUpIHtcbiAgICBpZiAoIW5leHRTdHlsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIW5leHRTdHlsZVtrZXldLmNvbmZpZykge1xuICAgICAgcmV0W2tleV0gPSBuZXh0U3R5bGVba2V5XTtcbiAgICAgIC8vIG5vdCBhIHNwcmluZyBjb25maWcsIG5vdCBzb21ldGhpbmcgd2Ugd2FudCB0byBpbnRlcnBvbGF0ZVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBwcmV2VmFsdWUgPSBwcmV2U3R5bGVba2V5XS5jb25maWcgPyBwcmV2U3R5bGVba2V5XS52YWwgOiBwcmV2U3R5bGVba2V5XTtcbiAgICByZXRba2V5XSA9IHtcbiAgICAgIHZhbDogbmV4dFN0eWxlW2tleV0udmFsICogYWxwaGEgKyBwcmV2VmFsdWUgKiAoMSAtIGFscGhhKSxcbiAgICAgIGNvbmZpZzogbmV4dFN0eWxlW2tleV0uY29uZmlnXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbi8vIFRPRE86IHJlZmFjdG9yIGNvbW1vbiBsb2dpYyB3aXRoIHVwZGF0ZUN1cnJlbnRWZWxvY2l0eVxuXG5mdW5jdGlvbiB1cGRhdGVDdXJyZW50U3R5bGUoZnJhbWVSYXRlLCBjdXJyZW50U3R5bGUsIGN1cnJlbnRWZWxvY2l0eSwgc3R5bGUpIHtcbiAgdmFyIHJldCA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcbiAgICBpZiAoIXN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIXN0eWxlW2tleV0uY29uZmlnKSB7XG4gICAgICByZXRba2V5XSA9IHN0eWxlW2tleV07XG4gICAgICAvLyBub3QgYSBzcHJpbmcgY29uZmlnLCBub3Qgc29tZXRoaW5nIHdlIHdhbnQgdG8gaW50ZXJwb2xhdGVcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgX3N0eWxlJGtleSRjb25maWcgPSBzdHlsZVtrZXldLmNvbmZpZztcbiAgICB2YXIgayA9IF9zdHlsZSRrZXkkY29uZmlnWzBdO1xuICAgIHZhciBiID0gX3N0eWxlJGtleSRjb25maWdbMV07XG5cbiAgICB2YXIgdmFsID0gX3N0ZXBwZXIyWydkZWZhdWx0J10oZnJhbWVSYXRlLFxuICAgIC8vIG1pZ2h0IGhhdmUgYmVlbiBhIG5vbi1zcHJpbmdlZCBwcm9wIHRoYXQganVzdCBiZWNhbWUgb25lXG4gICAgY3VycmVudFN0eWxlW2tleV0udmFsID09IG51bGwgPyBjdXJyZW50U3R5bGVba2V5XSA6IGN1cnJlbnRTdHlsZVtrZXldLnZhbCwgY3VycmVudFZlbG9jaXR5W2tleV0sIHN0eWxlW2tleV0udmFsLCBrLCBiKVswXTtcbiAgICByZXRba2V5XSA9IHtcbiAgICAgIHZhbDogdmFsLFxuICAgICAgY29uZmlnOiBzdHlsZVtrZXldLmNvbmZpZ1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ3VycmVudFZlbG9jaXR5KGZyYW1lUmF0ZSwgY3VycmVudFN0eWxlLCBjdXJyZW50VmVsb2NpdHksIHN0eWxlKSB7XG4gIHZhciByZXQgPSB7fTtcbiAgZm9yICh2YXIga2V5IGluIHN0eWxlKSB7XG4gICAgaWYgKCFzdHlsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFzdHlsZVtrZXldLmNvbmZpZykge1xuICAgICAgLy8gbm90IGEgc3ByaW5nIGNvbmZpZywgbm90IHNvbWV0aGluZyB3ZSB3YW50IHRvIGludGVycG9sYXRlXG4gICAgICByZXRba2V5XSA9IDA7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIF9zdHlsZSRrZXkkY29uZmlnMiA9IHN0eWxlW2tleV0uY29uZmlnO1xuICAgIHZhciBrID0gX3N0eWxlJGtleSRjb25maWcyWzBdO1xuICAgIHZhciBiID0gX3N0eWxlJGtleSRjb25maWcyWzFdO1xuXG4gICAgdmFyIHZhbCA9IF9zdGVwcGVyMlsnZGVmYXVsdCddKGZyYW1lUmF0ZSxcbiAgICAvLyBtaWdodCBoYXZlIGJlZW4gYSBub24tc3ByaW5nZWQgcHJvcCB0aGF0IGp1c3QgYmVjYW1lIG9uZVxuICAgIGN1cnJlbnRTdHlsZVtrZXldLnZhbCA9PSBudWxsID8gY3VycmVudFN0eWxlW2tleV0gOiBjdXJyZW50U3R5bGVba2V5XS52YWwsIGN1cnJlbnRWZWxvY2l0eVtrZXldLCBzdHlsZVtrZXldLnZhbCwgaywgYilbMV07XG4gICAgcmV0W2tleV0gPSB2YWw7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vbGliL3VwZGF0ZVRyZWUuanNcbiAqKiBtb2R1bGUgaWQgPSAyOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gdXNlZCBieSB0aGUgdHJlZS13YWxraW5nIHVwZGF0ZXMgYW5kIHNwcmluZ3MuIEF2b2lkcyBzb21lIGFsbG9jYXRpb25zXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gemVybztcblxuZnVuY3Rpb24gemVybygpIHtcbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3QtbW90aW9uL2xpYi96ZXJvLmpzXG4gKiogbW9kdWxlIGlkID0gMjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBub3cgPSByZXF1aXJlKCdwZXJmb3JtYW5jZS1ub3cnKVxuICAsIGdsb2JhbCA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8ge30gOiB3aW5kb3dcbiAgLCB2ZW5kb3JzID0gWydtb3onLCAnd2Via2l0J11cbiAgLCBzdWZmaXggPSAnQW5pbWF0aW9uRnJhbWUnXG4gICwgcmFmID0gZ2xvYmFsWydyZXF1ZXN0JyArIHN1ZmZpeF1cbiAgLCBjYWYgPSBnbG9iYWxbJ2NhbmNlbCcgKyBzdWZmaXhdIHx8IGdsb2JhbFsnY2FuY2VsUmVxdWVzdCcgKyBzdWZmaXhdXG5cbmZvcih2YXIgaSA9IDA7IGkgPCB2ZW5kb3JzLmxlbmd0aCAmJiAhcmFmOyBpKyspIHtcbiAgcmFmID0gZ2xvYmFsW3ZlbmRvcnNbaV0gKyAnUmVxdWVzdCcgKyBzdWZmaXhdXG4gIGNhZiA9IGdsb2JhbFt2ZW5kb3JzW2ldICsgJ0NhbmNlbCcgKyBzdWZmaXhdXG4gICAgICB8fCBnbG9iYWxbdmVuZG9yc1tpXSArICdDYW5jZWxSZXF1ZXN0JyArIHN1ZmZpeF1cbn1cblxuLy8gU29tZSB2ZXJzaW9ucyBvZiBGRiBoYXZlIHJBRiBidXQgbm90IGNBRlxuaWYoIXJhZiB8fCAhY2FmKSB7XG4gIHZhciBsYXN0ID0gMFxuICAgICwgaWQgPSAwXG4gICAgLCBxdWV1ZSA9IFtdXG4gICAgLCBmcmFtZUR1cmF0aW9uID0gMTAwMCAvIDYwXG5cbiAgcmFmID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZihxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHZhciBfbm93ID0gbm93KClcbiAgICAgICAgLCBuZXh0ID0gTWF0aC5tYXgoMCwgZnJhbWVEdXJhdGlvbiAtIChfbm93IC0gbGFzdCkpXG4gICAgICBsYXN0ID0gbmV4dCArIF9ub3dcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjcCA9IHF1ZXVlLnNsaWNlKDApXG4gICAgICAgIC8vIENsZWFyIHF1ZXVlIGhlcmUgdG8gcHJldmVudFxuICAgICAgICAvLyBjYWxsYmFja3MgZnJvbSBhcHBlbmRpbmcgbGlzdGVuZXJzXG4gICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGZyYW1lJ3MgcXVldWVcbiAgICAgICAgcXVldWUubGVuZ3RoID0gMFxuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZighY3BbaV0uY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgIGNwW2ldLmNhbGxiYWNrKGxhc3QpXG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgdGhyb3cgZSB9LCAwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgTWF0aC5yb3VuZChuZXh0KSlcbiAgICB9XG4gICAgcXVldWUucHVzaCh7XG4gICAgICBoYW5kbGU6ICsraWQsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICBjYW5jZWxsZWQ6IGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm4gaWRcbiAgfVxuXG4gIGNhZiA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYocXVldWVbaV0uaGFuZGxlID09PSBoYW5kbGUpIHtcbiAgICAgICAgcXVldWVbaV0uY2FuY2VsbGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuKSB7XG4gIC8vIFdyYXAgaW4gYSBuZXcgZnVuY3Rpb24gdG8gcHJldmVudFxuICAvLyBgY2FuY2VsYCBwb3RlbnRpYWxseSBiZWluZyBhc3NpZ25lZFxuICAvLyB0byB0aGUgbmF0aXZlIHJBRiBmdW5jdGlvblxuICByZXR1cm4gcmFmLmNhbGwoZ2xvYmFsLCBmbilcbn1cbm1vZHVsZS5leHBvcnRzLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICBjYWYuYXBwbHkoZ2xvYmFsLCBhcmd1bWVudHMpXG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1tb3Rpb24vfi9yYWYvaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAzMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLypcclxuXHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5cdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcclxuKi9cclxudmFyIHN0eWxlc0luRG9tID0ge30sXHJcblx0bWVtb2l6ZSA9IGZ1bmN0aW9uKGZuKSB7XHJcblx0XHR2YXIgbWVtbztcclxuXHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGlmICh0eXBlb2YgbWVtbyA9PT0gXCJ1bmRlZmluZWRcIikgbWVtbyA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblx0XHRcdHJldHVybiBtZW1vO1xyXG5cdFx0fTtcclxuXHR9LFxyXG5cdGlzT2xkSUUgPSBtZW1vaXplKGZ1bmN0aW9uKCkge1xyXG5cdFx0cmV0dXJuIC9tc2llIFs2LTldXFxiLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpO1xyXG5cdH0pLFxyXG5cdGdldEhlYWRFbGVtZW50ID0gbWVtb2l6ZShmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XHJcblx0fSksXHJcblx0c2luZ2xldG9uRWxlbWVudCA9IG51bGwsXHJcblx0c2luZ2xldG9uQ291bnRlciA9IDA7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGxpc3QsIG9wdGlvbnMpIHtcclxuXHRpZih0eXBlb2YgREVCVUcgIT09IFwidW5kZWZpbmVkXCIgJiYgREVCVUcpIHtcclxuXHRcdGlmKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xyXG5cdH1cclxuXHJcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblx0Ly8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XHJcblx0Ly8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxyXG5cdGlmICh0eXBlb2Ygb3B0aW9ucy5zaW5nbGV0b24gPT09IFwidW5kZWZpbmVkXCIpIG9wdGlvbnMuc2luZ2xldG9uID0gaXNPbGRJRSgpO1xyXG5cclxuXHR2YXIgc3R5bGVzID0gbGlzdFRvU3R5bGVzKGxpc3QpO1xyXG5cdGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucyk7XHJcblxyXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xyXG5cdFx0dmFyIG1heVJlbW92ZSA9IFtdO1xyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcclxuXHRcdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XHJcblx0XHRcdGRvbVN0eWxlLnJlZnMtLTtcclxuXHRcdFx0bWF5UmVtb3ZlLnB1c2goZG9tU3R5bGUpO1xyXG5cdFx0fVxyXG5cdFx0aWYobmV3TGlzdCkge1xyXG5cdFx0XHR2YXIgbmV3U3R5bGVzID0gbGlzdFRvU3R5bGVzKG5ld0xpc3QpO1xyXG5cdFx0XHRhZGRTdHlsZXNUb0RvbShuZXdTdHlsZXMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IG1heVJlbW92ZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBtYXlSZW1vdmVbaV07XHJcblx0XHRcdGlmKGRvbVN0eWxlLnJlZnMgPT09IDApIHtcclxuXHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspXHJcblx0XHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXSgpO1xyXG5cdFx0XHRcdGRlbGV0ZSBzdHlsZXNJbkRvbVtkb21TdHlsZS5pZF07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpIHtcclxuXHRmb3IodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcclxuXHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xyXG5cdFx0aWYoZG9tU3R5bGUpIHtcclxuXHRcdFx0ZG9tU3R5bGUucmVmcysrO1xyXG5cdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXShpdGVtLnBhcnRzW2pdKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IoOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdGRvbVN0eWxlLnBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR2YXIgcGFydHMgPSBbXTtcclxuXHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRwYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRzdHlsZXNJbkRvbVtpdGVtLmlkXSA9IHtpZDogaXRlbS5pZCwgcmVmczogMSwgcGFydHM6IHBhcnRzfTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpc3RUb1N0eWxlcyhsaXN0KSB7XHJcblx0dmFyIHN0eWxlcyA9IFtdO1xyXG5cdHZhciBuZXdTdHlsZXMgPSB7fTtcclxuXHRmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIGl0ZW0gPSBsaXN0W2ldO1xyXG5cdFx0dmFyIGlkID0gaXRlbVswXTtcclxuXHRcdHZhciBjc3MgPSBpdGVtWzFdO1xyXG5cdFx0dmFyIG1lZGlhID0gaXRlbVsyXTtcclxuXHRcdHZhciBzb3VyY2VNYXAgPSBpdGVtWzNdO1xyXG5cdFx0dmFyIHBhcnQgPSB7Y3NzOiBjc3MsIG1lZGlhOiBtZWRpYSwgc291cmNlTWFwOiBzb3VyY2VNYXB9O1xyXG5cdFx0aWYoIW5ld1N0eWxlc1tpZF0pXHJcblx0XHRcdHN0eWxlcy5wdXNoKG5ld1N0eWxlc1tpZF0gPSB7aWQ6IGlkLCBwYXJ0czogW3BhcnRdfSk7XHJcblx0XHRlbHNlXHJcblx0XHRcdG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KTtcclxuXHR9XHJcblx0cmV0dXJuIHN0eWxlcztcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KCkge1xyXG5cdHZhciBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcblx0dmFyIGhlYWQgPSBnZXRIZWFkRWxlbWVudCgpO1xyXG5cdHN0eWxlRWxlbWVudC50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xyXG5cdGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTtcclxuXHRyZXR1cm4gc3R5bGVFbGVtZW50O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVMaW5rRWxlbWVudCgpIHtcclxuXHR2YXIgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcclxuXHR2YXIgaGVhZCA9IGdldEhlYWRFbGVtZW50KCk7XHJcblx0bGlua0VsZW1lbnQucmVsID0gXCJzdHlsZXNoZWV0XCI7XHJcblx0aGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XHJcblx0cmV0dXJuIGxpbmtFbGVtZW50O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRTdHlsZShvYmosIG9wdGlvbnMpIHtcclxuXHR2YXIgc3R5bGVFbGVtZW50LCB1cGRhdGUsIHJlbW92ZTtcclxuXHJcblx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XHJcblx0XHR2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcclxuXHRcdHN0eWxlRWxlbWVudCA9IHNpbmdsZXRvbkVsZW1lbnQgfHwgKHNpbmdsZXRvbkVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQoKSk7XHJcblx0XHR1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCBmYWxzZSk7XHJcblx0XHRyZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCB0cnVlKTtcclxuXHR9IGVsc2UgaWYob2JqLnNvdXJjZU1hcCAmJlxyXG5cdFx0dHlwZW9mIFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHR0eXBlb2YgVVJMLmNyZWF0ZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHR0eXBlb2YgVVJMLnJldm9rZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHR0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiICYmXHJcblx0XHR0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcblx0XHRzdHlsZUVsZW1lbnQgPSBjcmVhdGVMaW5rRWxlbWVudCgpO1xyXG5cdFx0dXBkYXRlID0gdXBkYXRlTGluay5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCk7XHJcblx0XHRyZW1vdmUgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0c3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcclxuXHRcdFx0aWYoc3R5bGVFbGVtZW50LmhyZWYpXHJcblx0XHRcdFx0VVJMLnJldm9rZU9iamVjdFVSTChzdHlsZUVsZW1lbnQuaHJlZik7XHJcblx0XHR9O1xyXG5cdH0gZWxzZSB7XHJcblx0XHRzdHlsZUVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQoKTtcclxuXHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQpO1xyXG5cdFx0cmVtb3ZlID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0dXBkYXRlKG9iaik7XHJcblxyXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGVTdHlsZShuZXdPYmopIHtcclxuXHRcdGlmKG5ld09iaikge1xyXG5cdFx0XHRpZihuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXApXHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR1cGRhdGUob2JqID0gbmV3T2JqKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJlbW92ZSgpO1xyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuXHJcbnZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XHJcblx0dmFyIHRleHRTdG9yZSA9IFtdO1xyXG5cclxuXHRyZXR1cm4gZnVuY3Rpb24gKGluZGV4LCByZXBsYWNlbWVudCkge1xyXG5cdFx0dGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xyXG5cdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XHJcblx0fTtcclxufSkoKTtcclxuXHJcbmZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcoc3R5bGVFbGVtZW50LCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcclxuXHR2YXIgY3NzID0gcmVtb3ZlID8gXCJcIiA6IG9iai5jc3M7XHJcblxyXG5cdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xyXG5cdFx0c3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xyXG5cdH0gZWxzZSB7XHJcblx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcyk7XHJcblx0XHR2YXIgY2hpbGROb2RlcyA9IHN0eWxlRWxlbWVudC5jaGlsZE5vZGVzO1xyXG5cdFx0aWYgKGNoaWxkTm9kZXNbaW5kZXhdKSBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xyXG5cdFx0aWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XHJcblx0XHRcdHN0eWxlRWxlbWVudC5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGNzc05vZGUpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlUb1RhZyhzdHlsZUVsZW1lbnQsIG9iaikge1xyXG5cdHZhciBjc3MgPSBvYmouY3NzO1xyXG5cdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcclxuXHR2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcclxuXHJcblx0aWYobWVkaWEpIHtcclxuXHRcdHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBtZWRpYSlcclxuXHR9XHJcblxyXG5cdGlmKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XHJcblx0XHRzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xyXG5cdH0gZWxzZSB7XHJcblx0XHR3aGlsZShzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xyXG5cdFx0XHRzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xyXG5cdFx0fVxyXG5cdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlTGluayhsaW5rRWxlbWVudCwgb2JqKSB7XHJcblx0dmFyIGNzcyA9IG9iai5jc3M7XHJcblx0dmFyIG1lZGlhID0gb2JqLm1lZGlhO1xyXG5cdHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xyXG5cclxuXHRpZihzb3VyY2VNYXApIHtcclxuXHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI2NjAzODc1XHJcblx0XHRjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSArIFwiICovXCI7XHJcblx0fVxyXG5cclxuXHR2YXIgYmxvYiA9IG5ldyBCbG9iKFtjc3NdLCB7IHR5cGU6IFwidGV4dC9jc3NcIiB9KTtcclxuXHJcblx0dmFyIG9sZFNyYyA9IGxpbmtFbGVtZW50LmhyZWY7XHJcblxyXG5cdGxpbmtFbGVtZW50LmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuXHRpZihvbGRTcmMpXHJcblx0XHRVUkwucmV2b2tlT2JqZWN0VVJMKG9sZFNyYyk7XHJcbn1cclxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vc3R5bGUtbG9hZGVyL2FkZFN0eWxlcy5qc1xuICoqIG1vZHVsZSBpZCA9IDMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcyEuLy4uLy4uL25vZGVfbW9kdWxlcy9hdXRvcHJlZml4ZXItbG9hZGVyL2luZGV4LmpzP2Jyb3dzZXJzPWxhc3QgMiB2ZXJzaW9uIS4vLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2luZGV4LmpzIS4vbWFpbi5zY3NzXCIpO1xuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgdXBkYXRlID0gcmVxdWlyZShcIiEuLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIHt9KTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuaWYobW9kdWxlLmhvdCkge1xuXHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcyEuLy4uLy4uL25vZGVfbW9kdWxlcy9hdXRvcHJlZml4ZXItbG9hZGVyL2luZGV4LmpzP2Jyb3dzZXJzPWxhc3QgMiB2ZXJzaW9uIS4vLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2luZGV4LmpzIS4vbWFpbi5zY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzIS4vLi4vLi4vbm9kZV9tb2R1bGVzL2F1dG9wcmVmaXhlci1sb2FkZXIvaW5kZXguanM/YnJvd3NlcnM9bGFzdCAyIHZlcnNpb24hLi8uLi8uLi9ub2RlX21vZHVsZXMvc2Fzcy1sb2FkZXIvaW5kZXguanMhLi9tYWluLnNjc3NcIik7XG5cdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHR9KTtcblx0fVxuXHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvc3R5bGUvbWFpbi5zY3NzXG4gKiogbW9kdWxlIGlkID0gMzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHZpZXdCb3g9XFxcIjAgMCAyNjgxIDgxNFxcXCIgdmVyc2lvbj1cXFwiMS4xXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIiB4bWxuczpza2V0Y2g9XFxcImh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9uc1xcXCI+PHRpdGxlPkNsaW1iIExvZ28gQmV0YTwvdGl0bGU+PGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+PGRlZnM+PC9kZWZzPjxnIGlkPVxcXCJQYWdlLTFcXFwiIHN0cm9rZT1cXFwibm9uZVxcXCIgc3Ryb2tlLXdpZHRoPVxcXCIxXFxcIiBmaWxsPVxcXCJub25lXFxcIiBmaWxsLXJ1bGU9XFxcImV2ZW5vZGRcXFwiIHNrZXRjaDp0eXBlPVxcXCJNU1BhZ2VcXFwiPjxnIGlkPVxcXCJDbGltYi1Mb2dvLUJldGFcXFwiIHNrZXRjaDp0eXBlPVxcXCJNU0FydGJvYXJkR3JvdXBcXFwiIGZpbGw9XFxcIiMxOTM3NERcXFwiPjxnIGlkPVxcXCJjbGktLS0tYi5zb2NpYWwtKy1QYXRoLUNvcHktKy1UeXBlLXNvbWV0aGluZy1Db3B5LUNvcHktQ29weS1Db3B5LUNvcHlcXFwiIHNrZXRjaDp0eXBlPVxcXCJNU0xheWVyR3JvdXBcXFwiIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKDIwNi4wMDAwMDAsIDI0OS4wMDAwMDApXFxcIj48ZyBpZD1cXFwiY2xpLS0tLWIuc29jaWFsLSstUGF0aC1Db3B5XFxcIiBza2V0Y2g6dHlwZT1cXFwiTVNTaGFwZUdyb3VwXFxcIj48cGF0aCBkPVxcXCJNNzIzLjM3NDIwNywxODcuNDQyMjExIEw3NjcuMDI3NjQxLDMzNy4zODM1NzUgQzc2Ny41MTA4ODksMzQxLjI2NTU1MiA3NzEuODYwMTI0LDM0NS4xNDc1MjkgNzc2LjIwOTM1OSwzNDUuMTQ3NTI5IEw4MzMuMjMyNjY0LDM0NS4xNDc1MjkgQzgzOS4wMzE2NDQsMzQ1LjE0NzUyOSA4NDMuMzgwODc5LDM0MC43ODAzMDUgODQyLjQxNDM4MywzMzQuNDcyMDkyIEw3MzkuNDgyNDg1LDguMzg2MDE5ODIgQzczOC45OTkyMzcsNC4wMTg3OTU2NCA3MzQuNjUwMDAyLDAuNjIyMDY1NzI4IDczMC43ODQwMTUsMC42MjIwNjU3MjggTDcyMy4wNTIwNDEsMC42MjIwNjU3MjggQzcyMC42MzU4LDAuNjIyMDY1NzI4IDcxNi4yODY1NjUsMi41NjMwNTQyNSA3MTQuODM2ODIsNS40NzQ1MzcwNCBMNjQzLjUxNDMwMiwyMDkuMDE5MDYyIEw1NzYuNDk0MDAzLDEwNS40MzE3ODggQzU3My43MjEwNTgsMTAxLjE0NTg5NSA1NjcuMzQyNTM5LDk3LjY3MTQ5MTkgNTYyLjI1NTYsOTcuNjcxNDkxOSBMNTUyLjE3OTAzMyw5Ny42NzE0OTE5IEM1NDcuMDg4MzI2LDk3LjY3MTQ5MTkgNTQxLjUyOTM4NCwxMDEuNTU4NzQ5IDUzOS43NzAwNjEsMTA2LjMzNDE4NyBMNDU0Ljk4MDA2OCwzMzYuNDg0ODMzIEM0NTMuMjE3NDksMzQxLjI2OTEwOCA0NTUuOTI3MDg2LDM0NS4xNDc1MjkgNDYxLjAxNDEwMiwzNDUuMTQ3NTI5IEw1MjIuMTM4MDY3LDM0NS4xNDc1MjkgQzUyNy4yMzMxNSwzNDUuMTQ3NTI5IDUzMi43OTEwNTQsMzQxLjI2MTczMyA1MzQuNTUyNzk3LDMzNi40NjYxNzEgTDU3MS40NzMxNDQsMjM1Ljk2NjkyNCBMNjQyLjEwODUyOCwzNDYuMTA3NzEyIEM2NDMuNDg3MTQxLDM0OC4yNTczNjMgNjQ2LjY2NzA5MiwzNTAgNjQ5LjIxMjMwNywzNTAgTDY1OS45NzE0MTIsMzUwIEM2NjIuNTE2MTA4LDM1MCA2NjUuMjgyMDQ0LDM0OC4wNDUwNzggNjY2LjE0MTk4MiwzNDUuNjUzOTE4IEw2ODMuODI3MjYxLDI5Ni40Nzc4NzIgTDcyMy4zNzQyMDcsMTg3LjQ0MjIxMSBaXFxcIiBpZD1cXFwiUGF0aC1Db3B5XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTAuMTQ1MjEzNDQxLDI0Ny4wODUxMDEgQzAuMTQ1MjEzNDQxLDMwNS4yMzQwNCA0OS4wODcyMzc3LDM0OC44NDU3NDUgMTA0LjMyODczLDM0OC44NDU3NDUgQzEzOS4yMTgwOTQsMzQ4Ljg0NTc0NSAxNjQuNDE1OTY4LDMzNS4yNzc2NTkgMTgyLjM0NTIyNCwzMDguMTQxNDg3IEMxODUuNzM3MjQ2LDMwMy4yOTU3NDIgMTgzLjMxNDM3MywyOTguNDQ5OTk3IDE3OC45NTMyMDMsMjk0LjU3MzQwMSBMMTQ5Ljg3ODczMywyNjkuMzc1NTI3IEMxNDYuOTcxMjg2LDI2Ni45NTI2NTUgMTQyLjYxMDExNiwyNjcuOTIxODA0IDEzOS4yMTgwOTQsMjcxLjMxMzgyNSBDMTMxLjQ2NDkwMiwyNzkuMDY3MDE3IDEyMy4yMjcxMzYsMjg2LjMzNTYzNSAxMDYuMjY3MDI4LDI4Ni4zMzU2MzUgQzg0Ljk0NTc1MDUsMjg2LjMzNTYzNSA2OC40NzAyMTc2LDI2OC44OTA5NTMgNjguNDcwMjE3NiwyNDcuMDg1MTAxIEM2OC40NzAyMTc2LDIyNS43NjM4MjMgODUuOTE0ODk5NSwyMDcuODM0NTY2IDEwNy4yMzYxNzcsMjA3LjgzNDU2NiBDMTE4LjM4MTM5MSwyMDcuODM0NTY2IDEyOC41NTc0NTUsMjEzLjE2NDg4NiAxMzUuMzQxNDk4LDIyMC40MzM1MDMgQzEzNy43NjQzNzEsMjIyLjg1NjM3NiAxNDMuNTc5MjY1LDIyMy44MjU1MjUgMTQ2LjAwMjEzNywyMjEuNDAyNjUyIEwxNzUuMDc2NjA3LDE5My43ODE5MDYgQzE3OS40Mzc3NzcsMTg5LjkwNTMxIDE4MC44OTE1MDEsMTg0LjU3NDk5IDE3Ny40OTk0OCwxODAuMjEzODIgQzE1OS4wODU2NDksMTU3LjkyMzM5MyAxMzUuMzQxNDk4LDE0NS4zMjQ0NTYgMTA0LjgxMzMwNSwxNDUuMzI0NDU2IEM0OS41NzE4MTIyLDE0NS4zMjQ0NTYgMC4xNDUyMTM0NDEsMTg5LjkwNTMxIDAuMTQ1MjEzNDQxLDI0Ny4wODUxMDEgTDAuMTQ1MjEzNDQxLDI0Ny4wODUxMDEgWiBNMjE4LjY4ODMxMiwzMzQuNzkzMDg1IEMyMTguNjg4MzEyLDMzOS42Mzg4MyAyMjMuMDQ5NDgyLDM0NCAyMjcuODk1MjI3LDM0NCBMMjgxLjE5ODQyMiwzNDQgQzI4Ni4wNDQxNjcsMzQ0IDI5MC40MDUzMzcsMzM5LjYzODgzIDI5MC40MDUzMzcsMzM0Ljc5MzA4NSBMMjkwLjQwNTMzNywxNC4wMDQ3NjcyIEMyOTAuNDA1MzM3LDkuMTU5MDIyMjYgMjg2LjA0NDE2Nyw0Ljc5Nzg1MTc5IDI4MS4xOTg0MjIsNC43OTc4NTE3OSBMMjI3Ljg5NTIyNyw0Ljc5Nzg1MTc5IEMyMjMuMDQ5NDgyLDQuNzk3ODUxNzkgMjE4LjY4ODMxMiw5LjE1OTAyMjI2IDIxOC42ODgzMTIsMTQuMDA0NzY3MiBMMjE4LjY4ODMxMiwzMzQuNzkzMDg1IFogTTM3OC4xMTMzMjEsOTEuNTM2Njg2OCBDMzk5LjQzNDU5OSw5MS41MzY2ODY4IDQxNi44NzkyODEsNzQuNTc2NTc5NCA0MTYuODc5MjgxLDUzLjI1NTMwMTUgQzQxNi44NzkyODEsMzEuOTM0MDIzNiAzOTkuNDM0NTk5LDE0LjQ4OTM0MTcgMzc4LjExMzMyMSwxNC40ODkzNDE3IEMzNTYuNzkyMDQ0LDE0LjQ4OTM0MTcgMzM5LjgzMTkzNiwzMS45MzQwMjM2IDMzOS44MzE5MzYsNTMuMjU1MzAxNSBDMzM5LjgzMTkzNiw3NC41NzY1Nzk0IDM1Ni43OTIwNDQsOTEuNTM2Njg2OCAzNzguMTEzMzIxLDkxLjUzNjY4NjggTDM3OC4xMTMzMjEsOTEuNTM2Njg2OCBaIE0zNDIuNzM5MzgzLDMzNC43OTMwODUgQzM0Mi43MzkzODMsMzM5LjYzODgzIDM0Ny4xMDA1NTQsMzQ0IDM1MS45NDYyOTksMzQ0IEw0MDUuMjQ5NDkzLDM0NCBDNDEwLjA5NTIzOCwzNDQgNDE0LjQ1NjQwOSwzMzkuNjM4ODMgNDE0LjQ1NjQwOSwzMzQuNzkzMDg1IEw0MTQuNDU2NDA5LDE1OS4zNzcxMTYgQzQxNC40NTY0MDksMTU0LjA0Njc5NyA0MTAuMDk1MjM4LDE1MC4xNzAyMDEgNDA1LjI0OTQ5MywxNTAuMTcwMjAxIEwzNTEuOTQ2Mjk5LDE1MC4xNzAyMDEgQzM0Ny4xMDA1NTQsMTUwLjE3MDIwMSAzNDIuNzM5MzgzLDE1NC4wNDY3OTcgMzQyLjczOTM4MywxNTkuMzc3MTE2IEwzNDIuNzM5MzgzLDMzNC43OTMwODUgWiBNODg5LjE1NDMxLDMzNC43OTMwODUgQzg4OS4xNTQzMSwzMzkuNjM4ODMgODkzLjUxNTQ4MSwzNDQgODk4LjM2MTIyNiwzNDQgTDkyMS4xMzYyMjcsMzQ0IEM5MjUuOTgxOTcyLDM0NCA5MjkuMzczOTk0LDMzOS42Mzg4MyA5MzEuMzEyMjkyLDMzNC4zMDg1MSBMOTM3LjEyNzE4NSwzMTguMzE3NTUyIEM5MzcuMTI3MTg1LDMxOC4zMTc1NTIgOTU5LjQxNzYxMiwzNDguODQ1NzQ1IDEwMDIuMDYwMTcsMzQ4Ljg0NTc0NSBDMTA1Ni44MTcwOSwzNDguODQ1NzQ1IDEwOTguMDA1OTIsMzAyLjgxMTE2OCAxMDk4LjAwNTkyLDI0Ny4wODUxMDEgQzEwOTguMDA1OTIsMTc4Ljc2MDA5NiAxMDUzLjQyNTA2LDE0NS4zMjQ0NTYgMTAwMS41NzU1OSwxNDUuMzI0NDU2IEM5ODUuMTAwMDYxLDE0NS4zMjQ0NTYgOTY3LjE3MDgwNCwxNTEuMTM5MzUgOTYxLjM1NTkxLDE1NC41MzEzNzEgTDk2MS4zNTU5MSwxNC4wMDQ3NjcyIEM5NjEuMzU1OTEsOS4xNTkwMjIyNiA5NTYuOTk0NzQsNC43OTc4NTE3OSA5NTIuMTQ4OTk1LDQuNzk3ODUxNzkgTDg5OC4zNjEyMjYsNC43OTc4NTE3OSBDODkzLjUxNTQ4MSw0Ljc5Nzg1MTc5IDg4OS4xNTQzMSw5LjE1OTAyMjI2IDg4OS4xNTQzMSwxNC4wMDQ3NjcyIEw4ODkuMTU0MzEsMzM0Ljc5MzA4NSBaIE05NTMuNjAyNzE4LDI0Ni42MDA1MjYgQzk1My42MDI3MTgsMjI0Ljc5NDY3NCA5NzAuMDc4MjUxLDIwNy44MzQ1NjYgOTkyLjM2ODY3OCwyMDcuODM0NTY2IEMxMDE0LjY1OTExLDIwNy44MzQ1NjYgMTAzMS42MTkyMSwyMjQuNzk0Njc0IDEwMzEuNjE5MjEsMjQ2LjYwMDUyNiBDMTAzMS42MTkyMSwyNjguODkwOTUzIDEwMTQuNjU5MTEsMjg2LjMzNTYzNSA5OTIuMzY4Njc4LDI4Ni4zMzU2MzUgQzk3MC4wNzgyNTEsMjg2LjMzNTYzNSA5NTMuNjAyNzE4LDI2OC44OTA5NTMgOTUzLjYwMjcxOCwyNDYuNjAwNTI2IEw5NTMuNjAyNzE4LDI0Ni42MDA1MjYgWiBNMTEzNC4yNTY0NSwzMjEuMjI0OTk5IEMxMTM0LjI1NjQ1LDMzNi4yNDY4MDggMTE0Ni44NTUzOSwzNDguODQ1NzQ1IDExNjEuODc3MiwzNDguODQ1NzQ1IEMxMTc3LjM4MzU4LDM0OC44NDU3NDUgMTE4OS40OTc5NSwzMzYuMjQ2ODA4IDExODkuNDk3OTUsMzIxLjIyNDk5OSBDMTE4OS40OTc5NSwzMDUuNzE4NjE1IDExNzcuMzgzNTgsMjkzLjYwNDI1MiAxMTYxLjg3NzIsMjkzLjYwNDI1MiBDMTE0Ni44NTUzOSwyOTMuNjA0MjUyIDExMzQuMjU2NDUsMzA1LjcxODYxNSAxMTM0LjI1NjQ1LDMyMS4yMjQ5OTkgTDExMzQuMjU2NDUsMzIxLjIyNDk5OSBaIE0xMjM2LjAxNzEsMzMyLjg1NDc4NyBDMTI0NS43MDg1OSwzNDAuNjA3OTc5IDEyNjkuOTM3MzEsMzQ4Ljg0NTc0NSAxMzAxLjkxOTIzLDM0OC44NDU3NDUgQzEzNTYuNjc2MTUsMzQ4Ljg0NTc0NSAxMzgzLjgxMjMyLDMyMS4yMjQ5OTkgMTM4My44MTIzMiwyODcuMzA0Nzg0IEMxMzgzLjgxMjMyLDI0OC41Mzg4MjQgMTM1Ni42NzYxNSwyMzMuMDMyNDQgMTMxNy40MjU2MSwyMTkuNDY0MzU0IEMxMzAwLjk1MDA4LDIxMy42NDk0NiAxMjk1LjYxOTc2LDIwOC44MDM3MTUgMTI5NS42MTk3NiwyMDMuOTU3OTcgQzEyOTUuNjE5NzYsMTk4LjYyNzY1MSAxMjk5Ljk4MDkzLDE5Ny4xNzM5MjcgMTMwNi4yODA0LDE5Ny4xNzM5MjcgQzEzMjUuMTc4OCwxOTcuMTczOTI3IDEzNDcuNDY5MjMsMjA4LjMxOTE0MSAxMzQ3LjQ2OTIzLDIwOC4zMTkxNDEgQzEzNTEuMzQ1ODMsMjA5Ljc3Mjg2NCAxMzU2LjE5MTU3LDIwOC4zMTkxNDEgMTM1Ny42NDUzLDIwNS40MTE2OTQgTDEzNzUuNTc0NTUsMTcyLjQ2MDYyOCBDMTM3OC40ODIsMTY3LjYxNDg4MyAxMzc1LjA4OTk4LDE2My4yNTM3MTIgMTM3MC43Mjg4MSwxNjAuMzQ2MjY1IEMxMzYwLjA2ODE3LDE1My41NjIyMjMgMTMzNi44MDg1OSwxNDUuMzI0NDU2IDEzMDYuMjgwNCwxNDUuMzI0NDU2IEMxMjUzLjk0NjM1LDE0NS4zMjQ0NTYgMTIzMC42ODY3OCwxNzEuNDkxNDc5IDEyMzAuNjg2NzgsMjAzLjk1Nzk3IEMxMjMwLjY4Njc4LDIzNC4wMDE1ODkgMTI0Ny4xNjIzMSwyNTUuODA3NDQxIDEyODQuOTU5MTIsMjY4Ljg5MDk1MyBDMTMwOS42NzI0MiwyNzcuNjEzMjk0IDEzMTIuNTc5ODcsMjg0LjM5NzMzNyAxMzEyLjU3OTg3LDI4OS4yNDMwODIgQzEzMTIuNTc5ODcsMjk1LjA1Nzk3NiAxMzA4LjIxODcsMjk3Ljk2NTQyMyAxMzAzLjM3Mjk1LDI5Ny45NjU0MjMgQzEyODIuNTM2MjUsMjk3Ljk2NTQyMyAxMjU5Ljc2MTI1LDI4NS4zNjY0ODYgMTI1OS43NjEyNSwyODUuMzY2NDg2IEMxMjU1Ljg4NDY1LDI4My40MjgxODggMTI1MS4wMzg5MSwyODYuMzM1NjM1IDEyNDkuNTg1MTgsMjg5LjI0MzA4MiBMMTIzMi42MjUwOCwzMjIuNjc4NzIyIEMxMjMwLjIwMjIsMzI3LjAzOTg5MyAxMjMyLjYyNTA4LDMyOS45NDczNCAxMjM2LjAxNzEsMzMyLjg1NDc4NyBMMTIzNi4wMTcxLDMzMi44NTQ3ODcgWiBNMTQwNy41NTY0NywyNDYuNjAwNTI2IEMxNDA3LjU1NjQ3LDMwMi4zMjY1OTMgMTQ1My4xMDY0NywzNDguODQ1NzQ1IDE1MDguMzQ3OTYsMzQ4Ljg0NTc0NSBDMTU2My41ODk0NiwzNDguODQ1NzQ1IDE2MDkuMTM5NDYsMzAyLjMyNjU5MyAxNjA5LjEzOTQ2LDI0Ni42MDA1MjYgQzE2MDkuMTM5NDYsMTkxLjg0MzYwOCAxNTYzLjU4OTQ2LDE0NS4zMjQ0NTYgMTUwOC4zNDc5NiwxNDUuMzI0NDU2IEMxNDUzLjEwNjQ3LDE0NS4zMjQ0NTYgMTQwNy41NTY0NywxOTEuODQzNjA4IDE0MDcuNTU2NDcsMjQ2LjYwMDUyNiBMMTQwNy41NTY0NywyNDYuNjAwNTI2IFogTTE0NzAuMDY2NTgsMjQ2LjYwMDUyNiBDMTQ3MC4wNjY1OCwyMjUuMjc5MjQ4IDE0ODcuMDI2NjksMjA3LjgzNDU2NiAxNTA4LjM0Nzk2LDIwNy44MzQ1NjYgQzE1MjkuNjY5MjQsMjA3LjgzNDU2NiAxNTQ2LjYyOTM1LDIyNS4yNzkyNDggMTU0Ni42MjkzNSwyNDYuNjAwNTI2IEMxNTQ2LjYyOTM1LDI2OC40MDYzNzggMTUyOS42NjkyNCwyODYuMzM1NjM1IDE1MDguMzQ3OTYsMjg2LjMzNTYzNSBDMTQ4Ny4wMjY2OSwyODYuMzM1NjM1IDE0NzAuMDY2NTgsMjY4LjQwNjM3OCAxNDcwLjA2NjU4LDI0Ni42MDA1MjYgTDE0NzAuMDY2NTgsMjQ2LjYwMDUyNiBaIE0xNjMxLjQyOTg5LDI0Ny4wODUxMDEgQzE2MzEuNDI5ODksMzA1LjIzNDA0IDE2ODAuMzcxOTEsMzQ4Ljg0NTc0NSAxNzM1LjYxMzQsMzQ4Ljg0NTc0NSBDMTc3MC41MDI3NywzNDguODQ1NzQ1IDE3OTUuNzAwNjQsMzM1LjI3NzY1OSAxODEzLjYyOTksMzA4LjE0MTQ4NyBDMTgxNy4wMjE5MiwzMDMuMjk1NzQyIDE4MTQuNTk5MDUsMjk4LjQ0OTk5NyAxODEwLjIzNzg4LDI5NC41NzM0MDEgTDE3ODEuMTYzNDEsMjY5LjM3NTUyNyBDMTc3OC4yNTU5NiwyNjYuOTUyNjU1IDE3NzMuODk0NzksMjY3LjkyMTgwNCAxNzcwLjUwMjc3LDI3MS4zMTM4MjUgQzE3NjIuNzQ5NTgsMjc5LjA2NzAxNyAxNzU0LjUxMTgxLDI4Ni4zMzU2MzUgMTczNy41NTE3LDI4Ni4zMzU2MzUgQzE3MTYuMjMwNDIsMjg2LjMzNTYzNSAxNjk5Ljc1NDg5LDI2OC44OTA5NTMgMTY5OS43NTQ4OSwyNDcuMDg1MTAxIEMxNjk5Ljc1NDg5LDIyNS43NjM4MjMgMTcxNy4xOTk1NywyMDcuODM0NTY2IDE3MzguNTIwODUsMjA3LjgzNDU2NiBDMTc0OS42NjYwNiwyMDcuODM0NTY2IDE3NTkuODQyMTMsMjEzLjE2NDg4NiAxNzY2LjYyNjE3LDIyMC40MzM1MDMgQzE3NjkuMDQ5MDQsMjIyLjg1NjM3NiAxNzc0Ljg2Mzk0LDIyMy44MjU1MjUgMTc3Ny4yODY4MSwyMjEuNDAyNjUyIEwxODA2LjM2MTI4LDE5My43ODE5MDYgQzE4MTAuNzIyNDUsMTg5LjkwNTMxIDE4MTIuMTc2MTcsMTg0LjU3NDk5IDE4MDguNzg0MTUsMTgwLjIxMzgyIEMxNzkwLjM3MDMyLDE1Ny45MjMzOTMgMTc2Ni42MjYxNywxNDUuMzI0NDU2IDE3MzYuMDk3OTgsMTQ1LjMyNDQ1NiBDMTY4MC44NTY0OSwxNDUuMzI0NDU2IDE2MzEuNDI5ODksMTg5LjkwNTMxIDE2MzEuNDI5ODksMjQ3LjA4NTEwMSBMMTYzMS40Mjk4OSwyNDcuMDg1MTAxIFogTTE4ODUuMzQ2OTIsOTEuNTM2Njg2OCBDMTkwNi42NjgyLDkxLjUzNjY4NjggMTkyNC4xMTI4OCw3NC41NzY1Nzk0IDE5MjQuMTEyODgsNTMuMjU1MzAxNSBDMTkyNC4xMTI4OCwzMS45MzQwMjM2IDE5MDYuNjY4MiwxNC40ODkzNDE3IDE4ODUuMzQ2OTIsMTQuNDg5MzQxNyBDMTg2NC4wMjU2NSwxNC40ODkzNDE3IDE4NDcuMDY1NTQsMzEuOTM0MDIzNiAxODQ3LjA2NTU0LDUzLjI1NTMwMTUgQzE4NDcuMDY1NTQsNzQuNTc2NTc5NCAxODY0LjAyNTY1LDkxLjUzNjY4NjggMTg4NS4zNDY5Miw5MS41MzY2ODY4IEwxODg1LjM0NjkyLDkxLjUzNjY4NjggWiBNMTg0OS45NzI5OSwzMzQuNzkzMDg1IEMxODQ5Ljk3Mjk5LDMzOS42Mzg4MyAxODU0LjMzNDE2LDM0NCAxODU5LjE3OTksMzQ0IEwxOTEyLjQ4MzEsMzQ0IEMxOTE3LjMyODg0LDM0NCAxOTIxLjY5MDAxLDMzOS42Mzg4MyAxOTIxLjY5MDAxLDMzNC43OTMwODUgTDE5MjEuNjkwMDEsMTU5LjM3NzExNiBDMTkyMS42OTAwMSwxNTQuMDQ2Nzk3IDE5MTcuMzI4ODQsMTUwLjE3MDIwMSAxOTEyLjQ4MzEsMTUwLjE3MDIwMSBMMTg1OS4xNzk5LDE1MC4xNzAyMDEgQzE4NTQuMzM0MTYsMTUwLjE3MDIwMSAxODQ5Ljk3Mjk5LDE1NC4wNDY3OTcgMTg0OS45NzI5OSwxNTkuMzc3MTE2IEwxODQ5Ljk3Mjk5LDMzNC43OTMwODUgWiBNMTk2MC45NDA1NSwyODQuODgxOTExIEMxOTYwLjk0MDU1LDMyMy4xNjMyOTcgMTk4OS41MzA0NCwzNDguODQ1NzQ1IDIwMjcuODExODMsMzQ4Ljg0NTc0NSBDMjA1OC4zNDAwMiwzNDguODQ1NzQ1IDIwNzUuMzAwMTMsMzM0Ljc5MzA4NSAyMDg2LjQ0NTM0LDMyNC42MTcwMiBMMjA5My4yMjkzOCwzMzcuNzAwNTMyIEMyMDk1LjY1MjI2LDM0My4wMzA4NTEgMjA5OS4wNDQyOCwzNDQgMjEwMS45NTE3MiwzNDQgTDIxMjMuMjczLDM0NCBDMjEyOC4xMTg3NSwzNDQgMjEzMi40Nzk5MiwzMzkuNjM4ODMgMjEzMi40Nzk5MiwzMzQuNzkzMDg1IEwyMTMyLjQ3OTkyLDIyNy43MDIxMjEgQzIxMzIuNDc5OTIsMTcwLjUyMjMzIDIxMTAuNjc0MDcsMTQ1LjMyNDQ1NiAyMDUwLjU4NjgzLDE0NS4zMjQ0NTYgQzIwMjQuNDE5OCwxNDUuMzI0NDU2IDE5OTAuNDk5NTksMTUxLjEzOTM1IDE5ODYuMTM4NDIsMTUyLjU5MzA3NCBDMTk4MS43NzcyNSwxNTQuMDQ2Nzk3IDE5NzcuNDE2MDgsMTU3LjQzODgxOCAxOTc4Ljg2OTgsMTY1LjY3NjU4NSBMMTk4My4yMzA5NywxOTYuMjA0Nzc4IEMxOTg0LjIwMDEyLDIwMy40NzMzOTYgMTk4Ny41OTIxNCwyMDguODAzNzE1IDE5OTQuODYwNzYsMjA2LjM4MDg0MyBDMjAwNy40NTk3LDIwMi41MDQyNDcgMjAzMC4yMzQ3LDE5OS4xMTIyMjUgMjA0My4zMTgyMSwxOTkuMTEyMjI1IEMyMDY2LjU3Nzc5LDE5OS4xMTIyMjUgMjA2OS40ODUyMywyMDguODAzNzE1IDIwNjkuNDg1MjMsMjI3LjcwMjEyMSBDMjA2OS40ODUyMywyMjcuNzAyMTIxIDIwNTMuOTc4ODUsMjE5Ljk0ODkyOSAyMDMyLjE3MywyMTkuOTQ4OTI5IEMxOTg4LjA3NjcyLDIxOS45NDg5MjkgMTk2MC45NDA1NSwyNDcuNTY5Njc1IDE5NjAuOTQwNTUsMjg0Ljg4MTkxMSBMMTk2MC45NDA1NSwyODQuODgxOTExIFogTTIwMjMuOTM1MjMsMjgwLjAzNjE2NiBDMjAyMy45MzUyMywyNjguODkwOTUzIDIwMzMuMTQyMTUsMjU5LjY4NDAzNyAyMDQ0Ljc3MTkzLDI1OS42ODQwMzcgQzIwNTYuNDAxNzIsMjU5LjY4NDAzNyAyMDY1LjYwODY0LDI2OC44OTA5NTMgMjA2Ni4wOTMyMSwyODAuMDM2MTY2IEMyMDY2LjA5MzIxLDI5MS42NjU5NTQgMjA1Ni40MDE3MiwzMDEuMzU3NDQ0IDIwNDQuNzcxOTMsMzAxLjM1NzQ0NCBDMjAzMy4xNDIxNSwzMDEuMzU3NDQ0IDIwMjMuOTM1MjMsMjkxLjY2NTk1NCAyMDIzLjkzNTIzLDI4MC4wMzYxNjYgTDIwMjMuOTM1MjMsMjgwLjAzNjE2NiBaIE0yMTgxLjkwNjUyLDMzNC43OTMwODUgQzIxODEuOTA2NTIsMzM5LjYzODgzIDIxODYuMjY3NjksMzQ0IDIxOTEuMTEzNDMsMzQ0IEwyMjQ0LjQxNjYzLDM0NCBDMjI0OS4yNjIzNywzNDQgMjI1My42MjM1NCwzMzkuNjM4ODMgMjI1My42MjM1NCwzMzQuNzkzMDg1IEwyMjUzLjYyMzU0LDE0LjAwNDc2NzIgQzIyNTMuNjIzNTQsOS4xNTkwMjIyNiAyMjQ5LjI2MjM3LDQuNzk3ODUxNzkgMjI0NC40MTY2Myw0Ljc5Nzg1MTc5IEwyMTkxLjExMzQzLDQuNzk3ODUxNzkgQzIxODYuMjY3NjksNC43OTc4NTE3OSAyMTgxLjkwNjUyLDkuMTU5MDIyMjYgMjE4MS45MDY1MiwxNC4wMDQ3NjcyIEwyMTgxLjkwNjUyLDMzNC43OTMwODUgWlxcXCIgaWQ9XFxcImNsaS0tLS1iLnNvY2lhbFxcXCI+PC9wYXRoPjwvZz48L2c+PC9nPjwvZz48L3N2Zz5cIlxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvaW1nL2NsaW1iX2xvZ28uc3ZnXG4gKiogbW9kdWxlIGlkID0gMzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XHJcblx0aWYoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcclxuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xyXG5cdFx0bW9kdWxlLnBhdGhzID0gW107XHJcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcclxuXHRcdG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XHJcblx0fVxyXG5cdHJldHVybiBtb2R1bGU7XHJcbn1cclxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAod2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanNcbiAqKiBtb2R1bGUgaWQgPSAzNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/src/components/Message.jsx b/src/components/Message.jsx index f76d133..8a46d2e 100644 --- a/src/components/Message.jsx +++ b/src/components/Message.jsx @@ -4,9 +4,13 @@ import React from 'react'; class Message extends React.Component { render() { + + const message = this.props.body + .replace(/ + dangerouslySetInnerHTML={{__html: message}}> ); }