File: D:/HostingSpaces/ReturnIndustries/return-industries.nl/wwwroot/js/site/vendor.js
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{1:function(t,e,n){n("yLV6"),n("eCb9"),t.exports=n("x0D+")},eCb9:function(t,e){!function(){"use strict";if("undefined"!=typeof window){var t=window.navigator.userAgent.match(/Edge\/(\d{2})\./),e=!!t&&16<=parseInt(t[1],10);if("objectFit"in document.documentElement.style==0||e){var n=function(t,e,n){var i,o,r,s,a;if((n=n.split(" ")).length<2&&(n[1]=n[0]),"x"===t)i=n[0],o=n[1],r="left",s="right",a=e.clientWidth;else{if("y"!==t)return;i=n[1],o=n[0],r="top",s="bottom",a=e.clientHeight}if(i!==r&&o!==r){if(i!==s&&o!==s)return"center"===i||"50%"===i?(e.style[r]="50%",void(e.style["margin-"+r]=a/-2+"px")):void(0<=i.indexOf("%")?(i=parseInt(i))<50?(e.style[r]=i+"%",e.style["margin-"+r]=a*(i/-100)+"px"):(i=100-i,e.style[s]=i+"%",e.style["margin-"+s]=a*(i/-100)+"px"):e.style[r]=i);e.style[s]="0"}else e.style[r]="0"},i=function(t){var e=t.dataset?t.dataset.objectFit:t.getAttribute("data-object-fit"),i=t.dataset?t.dataset.objectPosition:t.getAttribute("data-object-position");e=e||"cover",i=i||"50% 50%";var o=t.parentNode;return function(t){var e=window.getComputedStyle(t,null),n=e.getPropertyValue("position"),i=e.getPropertyValue("overflow"),o=e.getPropertyValue("display");n&&"static"!==n||(t.style.position="relative"),"hidden"!==i&&(t.style.overflow="hidden"),o&&"inline"!==o||(t.style.display="block"),0===t.clientHeight&&(t.style.height="100%"),-1===t.className.indexOf("object-fit-polyfill")&&(t.className=t.className+" object-fit-polyfill")}(o),function(t){var e=window.getComputedStyle(t,null),n={"max-width":"none","max-height":"none","min-width":"0px","min-height":"0px",top:"auto",right:"auto",bottom:"auto",left:"auto","margin-top":"0px","margin-right":"0px","margin-bottom":"0px","margin-left":"0px"};for(var i in n)e.getPropertyValue(i)!==n[i]&&(t.style[i]=n[i])}(t),t.style.position="absolute",t.style.width="auto",t.style.height="auto","scale-down"===e&&(e=t.clientWidth<o.clientWidth&&t.clientHeight<o.clientHeight?"none":"contain"),"none"===e?(n("x",t,i),void n("y",t,i)):"fill"===e?(t.style.width="100%",t.style.height="100%",n("x",t,i),void n("y",t,i)):(t.style.height="100%",void("cover"===e&&t.clientWidth>o.clientWidth||"contain"===e&&t.clientWidth<o.clientWidth?(t.style.top="0",t.style.marginTop="0",n("x",t,i)):(t.style.width="100%",t.style.height="auto",t.style.left="0",t.style.marginLeft="0",n("y",t,i))))},o=function(t){if(void 0===t||t instanceof Event)t=document.querySelectorAll("[data-object-fit]");else if(t&&t.nodeName)t=[t];else{if("object"!=typeof t||!t.length||!t[0].nodeName)return!1;t=t}for(var n=0;n<t.length;n++)if(t[n].nodeName){var o=t[n].nodeName.toLowerCase();if("img"===o){if(e)continue;t[n].complete?i(t[n]):t[n].addEventListener("load",(function(){i(this)}))}else"video"===o?0<t[n].readyState?i(t[n]):t[n].addEventListener("loadedmetadata",(function(){i(this)})):i(t[n])}return!0};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",o):o(),window.addEventListener("resize",o),window.objectFitPolyfill=o}else window.objectFitPolyfill=function(){return!1}}}()},"x0D+":function(t,e,n){var i,o,r;o=[e],void 0===(r="function"==typeof(i=function(t){"use strict";function e(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e<t.length;e++)n[e]=t[e];return n}return Array.from(t)}Object.defineProperty(t,"__esModule",{value:!0});var n=!1;if("undefined"!=typeof window){var i={get passive(){n=!0}};window.addEventListener("testPassive",null,i),window.removeEventListener("testPassive",null,i)}var o="undefined"!=typeof window&&window.navigator&&window.navigator.platform&&/iP(ad|hone|od)/.test(window.navigator.platform),r=[],s=!1,a=-1,u=void 0,c=void 0,l=function(t){return r.some((function(e){return!(!e.options.allowTouchMove||!e.options.allowTouchMove(t))}))},h=function(t){var e=t||window.event;return!!l(e.target)||1<e.touches.length||(e.preventDefault&&e.preventDefault(),!1)},p=function(){setTimeout((function(){void 0!==c&&(document.body.style.paddingRight=c,c=void 0),void 0!==u&&(document.body.style.overflow=u,u=void 0)}))};t.disableBodyScroll=function(t,i){if(o){if(!t)return void console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");if(t&&!r.some((function(e){return e.targetElement===t}))){var p={targetElement:t,options:i||{}};r=[].concat(e(r),[p]),t.ontouchstart=function(t){1===t.targetTouches.length&&(a=t.targetTouches[0].clientY)},t.ontouchmove=function(e){var n,i,o,r;1===e.targetTouches.length&&(i=t,r=(n=e).targetTouches[0].clientY-a,!l(n.target)&&(i&&0===i.scrollTop&&0<r?h(n):(o=i)&&o.scrollHeight-o.scrollTop<=o.clientHeight&&r<0?h(n):n.stopPropagation()))},s||(document.addEventListener("touchmove",h,n?{passive:!1}:void 0),s=!0)}}else{d=i,setTimeout((function(){if(void 0===c){var t=!!d&&!0===d.reserveScrollBarGap,e=window.innerWidth-document.documentElement.clientWidth;t&&0<e&&(c=document.body.style.paddingRight,document.body.style.paddingRight=e+"px")}void 0===u&&(u=document.body.style.overflow,document.body.style.overflow="hidden")}));var f={targetElement:t,options:i||{}};r=[].concat(e(r),[f])}var d},t.clearAllBodyScrollLocks=function(){o?(r.forEach((function(t){t.targetElement.ontouchstart=null,t.targetElement.ontouchmove=null})),s&&(document.removeEventListener("touchmove",h,n?{passive:!1}:void 0),s=!1),r=[],a=-1):(p(),r=[])},t.enableBodyScroll=function(t){if(o){if(!t)return void console.error("enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.");t.ontouchstart=null,t.ontouchmove=null,r=r.filter((function(e){return e.targetElement!==t})),s&&0===r.length&&(document.removeEventListener("touchmove",h,n?{passive:!1}:void 0),s=!1)}else(r=r.filter((function(e){return e.targetElement!==t}))).length||p()}})?i.apply(e,o):i)||(t.exports=r)},yLV6:function(t,e,n){var i;!function(o,r,s,a){"use strict";var u,c=["","webkit","Moz","MS","ms","o"],l=r.createElement("div"),h="function",p=Math.round,f=Math.abs,d=Date.now;function v(t,e,n){return setTimeout(b(t,n),e)}function m(t,e,n){return!!Array.isArray(t)&&(g(t,n[e],n),!0)}function g(t,e,n){var i;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==a)for(i=0;i<t.length;)e.call(n,t[i],i,t),i++;else for(i in t)t.hasOwnProperty(i)&&e.call(n,t[i],i,t)}function y(t,e,n){var i="DEPRECATED METHOD: "+e+"\n"+n+" AT \n";return function(){var e=new Error("get-stack-trace"),n=e&&e.stack?e.stack.replace(/^[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^Object.<anonymous>\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",r=o.console&&(o.console.warn||o.console.log);return r&&r.call(o.console,i,n),t.apply(this,arguments)}}u="function"!=typeof Object.assign?function(t){if(t===a||null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),n=1;n<arguments.length;n++){var i=arguments[n];if(i!==a&&null!==i)for(var o in i)i.hasOwnProperty(o)&&(e[o]=i[o])}return e}:Object.assign;var T=y((function(t,e,n){for(var i=Object.keys(e),o=0;o<i.length;)(!n||n&&t[i[o]]===a)&&(t[i[o]]=e[i[o]]),o++;return t}),"extend","Use `assign`."),E=y((function(t,e){return T(t,e,!0)}),"merge","Use `assign`.");function w(t,e,n){var i,o=e.prototype;(i=t.prototype=Object.create(o)).constructor=t,i._super=o,n&&u(i,n)}function b(t,e){return function(){return t.apply(e,arguments)}}function x(t,e){return typeof t==h?t.apply(e&&e[0]||a,e):t}function S(t,e){return t===a?e:t}function A(t,e,n){g(D(e),(function(e){t.addEventListener(e,n,!1)}))}function I(t,e,n){g(D(e),(function(e){t.removeEventListener(e,n,!1)}))}function P(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function C(t,e){return t.indexOf(e)>-1}function D(t){return t.trim().split(/\s+/g)}function _(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;i<t.length;){if(n&&t[i][n]==e||!n&&t[i]===e)return i;i++}return-1}function O(t){return Array.prototype.slice.call(t,0)}function N(t,e,n){for(var i=[],o=[],r=0;r<t.length;){var s=e?t[r][e]:t[r];_(o,s)<0&&i.push(t[r]),o[r]=s,r++}return n&&(i=e?i.sort((function(t,n){return t[e]>n[e]})):i.sort()),i}function M(t,e){for(var n,i,o=e[0].toUpperCase()+e.slice(1),r=0;r<c.length;){if((i=(n=c[r])?n+o:e)in t)return i;r++}return a}var R=1;function L(t){var e=t.ownerDocument||t;return e.defaultView||e.parentWindow||o}var z="ontouchstart"in o,Y=M(o,"PointerEvent")!==a,W=z&&/mobile|tablet|ip(ad|hone|od)|android/i.test(navigator.userAgent),X=25,F=1,j=2,H=4,k=8,q=1,V=2,B=4,U=8,G=16,Z=V|B,J=U|G,$=Z|J,K=["x","y"],Q=["clientX","clientY"];function tt(t,e){var n=this;this.manager=t,this.callback=e,this.element=t.element,this.target=t.options.inputTarget,this.domHandler=function(e){x(t.options.enable,[t])&&n.handler(e)},this.init()}function et(t,e,n){var i=n.pointers.length,o=n.changedPointers.length,r=e&F&&i-o==0,s=e&(H|k)&&i-o==0;n.isFirst=!!r,n.isFinal=!!s,r&&(t.session={}),n.eventType=e,function(t,e){var n=t.session,i=e.pointers,o=i.length;n.firstInput||(n.firstInput=nt(e));o>1&&!n.firstMultiple?n.firstMultiple=nt(e):1===o&&(n.firstMultiple=!1);var r=n.firstInput,s=n.firstMultiple,u=s?s.center:r.center,c=e.center=it(i);e.timeStamp=d(),e.deltaTime=e.timeStamp-r.timeStamp,e.angle=at(u,c),e.distance=st(u,c),function(t,e){var n=e.center,i=t.offsetDelta||{},o=t.prevDelta||{},r=t.prevInput||{};e.eventType!==F&&r.eventType!==H||(o=t.prevDelta={x:r.deltaX||0,y:r.deltaY||0},i=t.offsetDelta={x:n.x,y:n.y});e.deltaX=o.x+(n.x-i.x),e.deltaY=o.y+(n.y-i.y)}(n,e),e.offsetDirection=rt(e.deltaX,e.deltaY);var l=ot(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=l.x,e.overallVelocityY=l.y,e.overallVelocity=f(l.x)>f(l.y)?l.x:l.y,e.scale=s?(h=s.pointers,p=i,st(p[0],p[1],Q)/st(h[0],h[1],Q)):1,e.rotation=s?function(t,e){return at(e[1],e[0],Q)+at(t[1],t[0],Q)}(s.pointers,i):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,function(t,e){var n,i,o,r,s=t.lastInterval||e,u=e.timeStamp-s.timeStamp;if(e.eventType!=k&&(u>X||s.velocity===a)){var c=e.deltaX-s.deltaX,l=e.deltaY-s.deltaY,h=ot(u,c,l);i=h.x,o=h.y,n=f(h.x)>f(h.y)?h.x:h.y,r=rt(c,l),t.lastInterval=e}else n=s.velocity,i=s.velocityX,o=s.velocityY,r=s.direction;e.velocity=n,e.velocityX=i,e.velocityY=o,e.direction=r}(n,e);var h,p;var v=t.element;P(e.srcEvent.target,v)&&(v=e.srcEvent.target);e.target=v}(t,n),t.emit("hammer.input",n),t.recognize(n),t.session.prevInput=n}function nt(t){for(var e=[],n=0;n<t.pointers.length;)e[n]={clientX:p(t.pointers[n].clientX),clientY:p(t.pointers[n].clientY)},n++;return{timeStamp:d(),pointers:e,center:it(e),deltaX:t.deltaX,deltaY:t.deltaY}}function it(t){var e=t.length;if(1===e)return{x:p(t[0].clientX),y:p(t[0].clientY)};for(var n=0,i=0,o=0;o<e;)n+=t[o].clientX,i+=t[o].clientY,o++;return{x:p(n/e),y:p(i/e)}}function ot(t,e,n){return{x:e/t||0,y:n/t||0}}function rt(t,e){return t===e?q:f(t)>=f(e)?t<0?V:B:e<0?U:G}function st(t,e,n){n||(n=K);var i=e[n[0]]-t[n[0]],o=e[n[1]]-t[n[1]];return Math.sqrt(i*i+o*o)}function at(t,e,n){n||(n=K);var i=e[n[0]]-t[n[0]],o=e[n[1]]-t[n[1]];return 180*Math.atan2(o,i)/Math.PI}tt.prototype={handler:function(){},init:function(){this.evEl&&A(this.element,this.evEl,this.domHandler),this.evTarget&&A(this.target,this.evTarget,this.domHandler),this.evWin&&A(L(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&I(this.element,this.evEl,this.domHandler),this.evTarget&&I(this.target,this.evTarget,this.domHandler),this.evWin&&I(L(this.element),this.evWin,this.domHandler)}};var ut={mousedown:F,mousemove:j,mouseup:H},ct="mousedown",lt="mousemove mouseup";function ht(){this.evEl=ct,this.evWin=lt,this.pressed=!1,tt.apply(this,arguments)}w(ht,tt,{handler:function(t){var e=ut[t.type];e&F&&0===t.button&&(this.pressed=!0),e&j&&1!==t.which&&(e=H),this.pressed&&(e&H&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:"mouse",srcEvent:t}))}});var pt={pointerdown:F,pointermove:j,pointerup:H,pointercancel:k,pointerout:k},ft={2:"touch",3:"pen",4:"mouse",5:"kinect"},dt="pointerdown",vt="pointermove pointerup pointercancel";function mt(){this.evEl=dt,this.evWin=vt,tt.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}o.MSPointerEvent&&!o.PointerEvent&&(dt="MSPointerDown",vt="MSPointerMove MSPointerUp MSPointerCancel"),w(mt,tt,{handler:function(t){var e=this.store,n=!1,i=t.type.toLowerCase().replace("ms",""),o=pt[i],r=ft[t.pointerType]||t.pointerType,s="touch"==r,a=_(e,t.pointerId,"pointerId");o&F&&(0===t.button||s)?a<0&&(e.push(t),a=e.length-1):o&(H|k)&&(n=!0),a<0||(e[a]=t,this.callback(this.manager,o,{pointers:e,changedPointers:[t],pointerType:r,srcEvent:t}),n&&e.splice(a,1))}});var gt={touchstart:F,touchmove:j,touchend:H,touchcancel:k},yt="touchstart",Tt="touchstart touchmove touchend touchcancel";function Et(){this.evTarget=yt,this.evWin=Tt,this.started=!1,tt.apply(this,arguments)}function wt(t,e){var n=O(t.touches),i=O(t.changedTouches);return e&(H|k)&&(n=N(n.concat(i),"identifier",!0)),[n,i]}w(Et,tt,{handler:function(t){var e=gt[t.type];if(e===F&&(this.started=!0),this.started){var n=wt.call(this,t,e);e&(H|k)&&n[0].length-n[1].length==0&&(this.started=!1),this.callback(this.manager,e,{pointers:n[0],changedPointers:n[1],pointerType:"touch",srcEvent:t})}}});var bt={touchstart:F,touchmove:j,touchend:H,touchcancel:k},xt="touchstart touchmove touchend touchcancel";function St(){this.evTarget=xt,this.targetIds={},tt.apply(this,arguments)}function At(t,e){var n=O(t.touches),i=this.targetIds;if(e&(F|j)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var o,r,s=O(t.changedTouches),a=[],u=this.target;if(r=n.filter((function(t){return P(t.target,u)})),e===F)for(o=0;o<r.length;)i[r[o].identifier]=!0,o++;for(o=0;o<s.length;)i[s[o].identifier]&&a.push(s[o]),e&(H|k)&&delete i[s[o].identifier],o++;return a.length?[N(r.concat(a),"identifier",!0),a]:void 0}w(St,tt,{handler:function(t){var e=bt[t.type],n=At.call(this,t,e);n&&this.callback(this.manager,e,{pointers:n[0],changedPointers:n[1],pointerType:"touch",srcEvent:t})}});var It=2500,Pt=25;function Ct(){tt.apply(this,arguments);var t=b(this.handler,this);this.touch=new St(this.manager,t),this.mouse=new ht(this.manager,t),this.primaryTouch=null,this.lastTouches=[]}function Dt(t,e){t&F?(this.primaryTouch=e.changedPointers[0].identifier,_t.call(this,e)):t&(H|k)&&_t.call(this,e)}function _t(t){var e=t.changedPointers[0];if(e.identifier===this.primaryTouch){var n={x:e.clientX,y:e.clientY};this.lastTouches.push(n);var i=this.lastTouches;setTimeout((function(){var t=i.indexOf(n);t>-1&&i.splice(t,1)}),It)}}function Ot(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,i=0;i<this.lastTouches.length;i++){var o=this.lastTouches[i],r=Math.abs(e-o.x),s=Math.abs(n-o.y);if(r<=Pt&&s<=Pt)return!0}return!1}w(Ct,tt,{handler:function(t,e,n){var i="touch"==n.pointerType,o="mouse"==n.pointerType;if(!(o&&n.sourceCapabilities&&n.sourceCapabilities.firesTouchEvents)){if(i)Dt.call(this,e,n);else if(o&&Ot.call(this,n))return;this.callback(t,e,n)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Nt=M(l.style,"touchAction"),Mt=Nt!==a,Rt="auto",Lt="manipulation",zt="none",Yt="pan-x",Wt="pan-y",Xt=function(){if(!Mt)return!1;var t={},e=o.CSS&&o.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach((function(n){t[n]=!e||o.CSS.supports("touch-action",n)})),t}();function Ft(t,e){this.manager=t,this.set(e)}Ft.prototype={set:function(t){"compute"==t&&(t=this.compute()),Mt&&this.manager.element.style&&Xt[t]&&(this.manager.element.style[Nt]=t),this.actions=t.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var t=[];return g(this.manager.recognizers,(function(e){x(e.options.enable,[e])&&(t=t.concat(e.getTouchAction()))})),function(t){if(C(t,zt))return zt;var e=C(t,Yt),n=C(t,Wt);if(e&&n)return zt;if(e||n)return e?Yt:Wt;if(C(t,Lt))return Lt;return Rt}(t.join(" "))},preventDefaults:function(t){var e=t.srcEvent,n=t.offsetDirection;if(this.manager.session.prevented)e.preventDefault();else{var i=this.actions,o=C(i,zt)&&!Xt[zt],r=C(i,Wt)&&!Xt[Wt],s=C(i,Yt)&&!Xt[Yt];if(o){var a=1===t.pointers.length,u=t.distance<2,c=t.deltaTime<250;if(a&&u&&c)return}if(!s||!r)return o||r&&n&Z||s&&n&J?this.preventSrc(e):void 0}},preventSrc:function(t){this.manager.session.prevented=!0,t.preventDefault()}};var jt=1,Ht=2,kt=4,qt=8,Vt=qt,Bt=16;function Ut(t){this.options=u({},this.defaults,t||{}),this.id=R++,this.manager=null,this.options.enable=S(this.options.enable,!0),this.state=jt,this.simultaneous={},this.requireFail=[]}function Gt(t){return t&Bt?"cancel":t&qt?"end":t&kt?"move":t&Ht?"start":""}function Zt(t){return t==G?"down":t==U?"up":t==V?"left":t==B?"right":""}function Jt(t,e){var n=e.manager;return n?n.get(t):t}function $t(){Ut.apply(this,arguments)}function Kt(){$t.apply(this,arguments),this.pX=null,this.pY=null}function Qt(){$t.apply(this,arguments)}function te(){Ut.apply(this,arguments),this._timer=null,this._input=null}function ee(){$t.apply(this,arguments)}function ne(){$t.apply(this,arguments)}function ie(){Ut.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function oe(t,e){return(e=e||{}).recognizers=S(e.recognizers,oe.defaults.preset),new re(t,e)}Ut.prototype={defaults:{},set:function(t){return u(this.options,t),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(t){if(m(t,"recognizeWith",this))return this;var e=this.simultaneous;return e[(t=Jt(t,this)).id]||(e[t.id]=t,t.recognizeWith(this)),this},dropRecognizeWith:function(t){return m(t,"dropRecognizeWith",this)?this:(t=Jt(t,this),delete this.simultaneous[t.id],this)},requireFailure:function(t){if(m(t,"requireFailure",this))return this;var e=this.requireFail;return-1===_(e,t=Jt(t,this))&&(e.push(t),t.requireFailure(this)),this},dropRequireFailure:function(t){if(m(t,"dropRequireFailure",this))return this;t=Jt(t,this);var e=_(this.requireFail,t);return e>-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){var e=this,n=this.state;function i(n){e.manager.emit(n,t)}n<qt&&i(e.options.event+Gt(n)),i(e.options.event),t.additionalEvent&&i(t.additionalEvent),n>=qt&&i(e.options.event+Gt(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;t<this.requireFail.length;){if(!(this.requireFail[t].state&(32|jt)))return!1;t++}return!0},recognize:function(t){var e=u({},t);if(!x(this.options.enable,[this,e]))return this.reset(),void(this.state=32);this.state&(Vt|Bt|32)&&(this.state=jt),this.state=this.process(e),this.state&(Ht|kt|qt|Bt)&&this.tryEmit(e)},process:function(t){},getTouchAction:function(){},reset:function(){}},w($t,Ut,{defaults:{pointers:1},attrTest:function(t){var e=this.options.pointers;return 0===e||t.pointers.length===e},process:function(t){var e=this.state,n=t.eventType,i=e&(Ht|kt),o=this.attrTest(t);return i&&(n&k||!o)?e|Bt:i||o?n&H?e|qt:e&Ht?e|kt:Ht:32}}),w(Kt,$t,{defaults:{event:"pan",threshold:10,pointers:1,direction:$},getTouchAction:function(){var t=this.options.direction,e=[];return t&Z&&e.push(Wt),t&J&&e.push(Yt),e},directionTest:function(t){var e=this.options,n=!0,i=t.distance,o=t.direction,r=t.deltaX,s=t.deltaY;return o&e.direction||(e.direction&Z?(o=0===r?q:r<0?V:B,n=r!=this.pX,i=Math.abs(t.deltaX)):(o=0===s?q:s<0?U:G,n=s!=this.pY,i=Math.abs(t.deltaY))),t.direction=o,n&&i>e.threshold&&o&e.direction},attrTest:function(t){return $t.prototype.attrTest.call(this,t)&&(this.state&Ht||!(this.state&Ht)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=Zt(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),w(Qt,$t,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[zt]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&Ht)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),w(te,Ut,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[Rt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance<e.threshold,o=t.deltaTime>e.time;if(this._input=t,!i||!n||t.eventType&(H|k)&&!o)this.reset();else if(t.eventType&F)this.reset(),this._timer=v((function(){this.state=Vt,this.tryEmit()}),e.time,this);else if(t.eventType&H)return Vt;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===Vt&&(t&&t.eventType&H?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),w(ee,$t,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[zt]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&Ht)}}),w(ne,$t,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Z|J,pointers:1},getTouchAction:function(){return Kt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(Z|J)?e=t.overallVelocity:n&Z?e=t.overallVelocityX:n&J&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&f(e)>this.options.velocity&&t.eventType&H},emit:function(t){var e=Zt(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),w(ie,Ut,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[Lt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance<e.threshold,o=t.deltaTime<e.time;if(this.reset(),t.eventType&F&&0===this.count)return this.failTimeout();if(i&&o&&n){if(t.eventType!=H)return this.failTimeout();var r=!this.pTime||t.timeStamp-this.pTime<e.interval,s=!this.pCenter||st(this.pCenter,t.center)<e.posThreshold;if(this.pTime=t.timeStamp,this.pCenter=t.center,s&&r?this.count+=1:this.count=1,this._input=t,0===this.count%e.taps)return this.hasRequireFailures()?(this._timer=v((function(){this.state=Vt,this.tryEmit()}),e.interval,this),Ht):Vt}return 32},failTimeout:function(){return this._timer=v((function(){this.state=32}),this.options.interval,this),32},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==Vt&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),oe.VERSION="2.0.7",oe.defaults={domEvents:!1,touchAction:"compute",enable:!0,inputTarget:null,inputClass:null,preset:[[ee,{enable:!1}],[Qt,{enable:!1},["rotate"]],[ne,{direction:Z}],[Kt,{direction:Z},["swipe"]],[ie],[ie,{event:"doubletap",taps:2},["tap"]],[te]],cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}};function re(t,e){var n;this.options=u({},oe.defaults,e||{}),this.options.inputTarget=this.options.inputTarget||t,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=t,this.input=new((n=this).options.inputClass||(Y?mt:W?St:z?Ct:ht))(n,et),this.touchAction=new Ft(this,this.options.touchAction),se(this,!0),g(this.options.recognizers,(function(t){var e=this.add(new t[0](t[1]));t[2]&&e.recognizeWith(t[2]),t[3]&&e.requireFailure(t[3])}),this)}function se(t,e){var n,i=t.element;i.style&&(g(t.options.cssProps,(function(o,r){n=M(i.style,r),e?(t.oldCssProps[n]=i.style[n],i.style[n]=o):i.style[n]=t.oldCssProps[n]||""})),e||(t.oldCssProps={}))}re.prototype={set:function(t){return u(this.options,t),t.touchAction&&this.touchAction.update(),t.inputTarget&&(this.input.destroy(),this.input.target=t.inputTarget,this.input.init()),this},stop:function(t){this.session.stopped=t?2:1},recognize:function(t){var e=this.session;if(!e.stopped){var n;this.touchAction.preventDefaults(t);var i=this.recognizers,o=e.curRecognizer;(!o||o&&o.state&Vt)&&(o=e.curRecognizer=null);for(var r=0;r<i.length;)n=i[r],2===e.stopped||o&&n!=o&&!n.canRecognizeWith(o)?n.reset():n.recognize(t),!o&&n.state&(Ht|kt|qt)&&(o=e.curRecognizer=n),r++}},get:function(t){if(t instanceof Ut)return t;for(var e=this.recognizers,n=0;n<e.length;n++)if(e[n].options.event==t)return e[n];return null},add:function(t){if(m(t,"add",this))return this;var e=this.get(t.options.event);return e&&this.remove(e),this.recognizers.push(t),t.manager=this,this.touchAction.update(),t},remove:function(t){if(m(t,"remove",this))return this;if(t=this.get(t)){var e=this.recognizers,n=_(e,t);-1!==n&&(e.splice(n,1),this.touchAction.update())}return this},on:function(t,e){if(t!==a&&e!==a){var n=this.handlers;return g(D(t),(function(t){n[t]=n[t]||[],n[t].push(e)})),this}},off:function(t,e){if(t!==a){var n=this.handlers;return g(D(t),(function(t){e?n[t]&&n[t].splice(_(n[t],e),1):delete n[t]})),this}},emit:function(t,e){this.options.domEvents&&function(t,e){var n=r.createEvent("Event");n.initEvent(t,!0,!0),n.gesture=e,e.target.dispatchEvent(n)}(t,e);var n=this.handlers[t]&&this.handlers[t].slice();if(n&&n.length){e.type=t,e.preventDefault=function(){e.srcEvent.preventDefault()};for(var i=0;i<n.length;)n[i](e),i++}},destroy:function(){this.element&&se(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},u(oe,{INPUT_START:F,INPUT_MOVE:j,INPUT_END:H,INPUT_CANCEL:k,STATE_POSSIBLE:jt,STATE_BEGAN:Ht,STATE_CHANGED:kt,STATE_ENDED:qt,STATE_RECOGNIZED:Vt,STATE_CANCELLED:Bt,STATE_FAILED:32,DIRECTION_NONE:q,DIRECTION_LEFT:V,DIRECTION_RIGHT:B,DIRECTION_UP:U,DIRECTION_DOWN:G,DIRECTION_HORIZONTAL:Z,DIRECTION_VERTICAL:J,DIRECTION_ALL:$,Manager:re,Input:tt,TouchAction:Ft,TouchInput:St,MouseInput:ht,PointerEventInput:mt,TouchMouseInput:Ct,SingleTouchInput:Et,Recognizer:Ut,AttrRecognizer:$t,Tap:ie,Pan:Kt,Swipe:ne,Pinch:Qt,Rotate:ee,Press:te,on:A,off:I,each:g,merge:E,extend:T,assign:u,inherit:w,bindFn:b,prefixed:M}),(void 0!==o?o:"undefined"!=typeof self?self:{}).Hammer=oe,(i=function(){return oe}.call(e,n,e,t))===a||(t.exports=i)}(window,document)}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0Rml0UG9seWZpbGwvZGlzdC9vYmplY3RGaXRQb2x5ZmlsbC5taW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2JvZHktc2Nyb2xsLWxvY2svbGliL2JvZHlTY3JvbGxMb2NrLm1pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGFtbWVyanMvaGFtbWVyLmpzIl0sIm5hbWVzIjpbIndpbmRvdyIsInQiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJtYXRjaCIsIm4iLCJwYXJzZUludCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iiwic3R5bGUiLCJvIiwiZSIsImkiLCJsIiwiYSIsImQiLCJzcGxpdCIsImxlbmd0aCIsImNsaWVudFdpZHRoIiwiY2xpZW50SGVpZ2h0IiwiaW5kZXhPZiIsImRhdGFzZXQiLCJvYmplY3RGaXQiLCJnZXRBdHRyaWJ1dGUiLCJvYmplY3RQb3NpdGlvbiIsInBhcmVudE5vZGUiLCJnZXRDb21wdXRlZFN0eWxlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsInBvc2l0aW9uIiwib3ZlcmZsb3ciLCJkaXNwbGF5IiwiaGVpZ2h0IiwiY2xhc3NOYW1lIiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Iiwid2lkdGgiLCJtYXJnaW5Ub3AiLCJtYXJnaW5MZWZ0IiwiRXZlbnQiLCJxdWVyeVNlbGVjdG9yQWxsIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsImNvbXBsZXRlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInRoaXMiLCJyZWFkeVN0YXRlIiwib2JqZWN0Rml0UG9seWZpbGwiLCJleHBvcnRzIiwiciIsIkFycmF5IiwiaXNBcnJheSIsImZyb20iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInBsYXRmb3JtIiwidGVzdCIsImMiLCJ1IiwicyIsInYiLCJmIiwic29tZSIsIm9wdGlvbnMiLCJhbGxvd1RvdWNoTW92ZSIsIm0iLCJldmVudCIsInRhcmdldCIsInRvdWNoZXMiLCJwcmV2ZW50RGVmYXVsdCIsInNldFRpbWVvdXQiLCJib2R5IiwicGFkZGluZ1JpZ2h0IiwiZGlzYWJsZUJvZHlTY3JvbGwiLCJjb25zb2xlIiwiZXJyb3IiLCJ0YXJnZXRFbGVtZW50IiwiY29uY2F0Iiwib250b3VjaHN0YXJ0IiwidGFyZ2V0VG91Y2hlcyIsImNsaWVudFkiLCJvbnRvdWNobW92ZSIsInNjcm9sbFRvcCIsInNjcm9sbEhlaWdodCIsInN0b3BQcm9wYWdhdGlvbiIsInBhc3NpdmUiLCJyZXNlcnZlU2Nyb2xsQmFyR2FwIiwiaW5uZXJXaWR0aCIsImNsZWFyQWxsQm9keVNjcm9sbExvY2tzIiwiZm9yRWFjaCIsImVuYWJsZUJvZHlTY3JvbGwiLCJmaWx0ZXIiLCJleHBvcnROYW1lIiwidW5kZWZpbmVkIiwiYXNzaWduIiwiVkVORE9SX1BSRUZJWEVTIiwiVEVTVF9FTEVNRU5UIiwiY3JlYXRlRWxlbWVudCIsIlRZUEVfRlVOQ1RJT04iLCJyb3VuZCIsIk1hdGgiLCJhYnMiLCJub3ciLCJEYXRlIiwic2V0VGltZW91dENvbnRleHQiLCJmbiIsInRpbWVvdXQiLCJjb250ZXh0IiwiYmluZEZuIiwiaW52b2tlQXJyYXlBcmciLCJhcmciLCJlYWNoIiwib2JqIiwiaXRlcmF0b3IiLCJjYWxsIiwiaGFzT3duUHJvcGVydHkiLCJkZXByZWNhdGUiLCJtZXRob2QiLCJuYW1lIiwibWVzc2FnZSIsImRlcHJlY2F0aW9uTWVzc2FnZSIsIkVycm9yIiwic3RhY2siLCJyZXBsYWNlIiwibG9nIiwid2FybiIsImFwcGx5IiwiYXJndW1lbnRzIiwiVHlwZUVycm9yIiwib3V0cHV0IiwiaW5kZXgiLCJzb3VyY2UiLCJuZXh0S2V5IiwiZXh0ZW5kIiwiZGVzdCIsInNyYyIsIm1lcmdlIiwia2V5cyIsImluaGVyaXQiLCJjaGlsZCIsImJhc2UiLCJwcm9wZXJ0aWVzIiwiY2hpbGRQIiwiYmFzZVAiLCJwcm90b3R5cGUiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIl9zdXBlciIsImJvb2xPckZuIiwidmFsIiwiYXJncyIsImlmVW5kZWZpbmVkIiwidmFsMSIsInZhbDIiLCJhZGRFdmVudExpc3RlbmVycyIsInR5cGVzIiwiaGFuZGxlciIsInNwbGl0U3RyIiwidHlwZSIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwiaGFzUGFyZW50Iiwibm9kZSIsInBhcmVudCIsImluU3RyIiwic3RyIiwiZmluZCIsInRyaW0iLCJpbkFycmF5IiwiZmluZEJ5S2V5IiwidG9BcnJheSIsInNsaWNlIiwidW5pcXVlQXJyYXkiLCJrZXkiLCJzb3J0IiwicmVzdWx0cyIsInZhbHVlcyIsInB1c2giLCJiIiwicHJlZml4ZWQiLCJwcm9wZXJ0eSIsInByZWZpeCIsInByb3AiLCJjYW1lbFByb3AiLCJ0b1VwcGVyQ2FzZSIsIl91bmlxdWVJZCIsImdldFdpbmRvd0ZvckVsZW1lbnQiLCJlbGVtZW50IiwiZG9jIiwib3duZXJEb2N1bWVudCIsImRlZmF1bHRWaWV3IiwicGFyZW50V2luZG93IiwiU1VQUE9SVF9UT1VDSCIsIlNVUFBPUlRfUE9JTlRFUl9FVkVOVFMiLCJTVVBQT1JUX09OTFlfVE9VQ0giLCJDT01QVVRFX0lOVEVSVkFMIiwiSU5QVVRfU1RBUlQiLCJJTlBVVF9NT1ZFIiwiSU5QVVRfRU5EIiwiSU5QVVRfQ0FOQ0VMIiwiRElSRUNUSU9OX05PTkUiLCJESVJFQ1RJT05fTEVGVCIsIkRJUkVDVElPTl9SSUdIVCIsIkRJUkVDVElPTl9VUCIsIkRJUkVDVElPTl9ET1dOIiwiRElSRUNUSU9OX0hPUklaT05UQUwiLCJESVJFQ1RJT05fVkVSVElDQUwiLCJESVJFQ1RJT05fQUxMIiwiUFJPUFNfWFkiLCJQUk9QU19DTElFTlRfWFkiLCJJbnB1dCIsIm1hbmFnZXIiLCJjYWxsYmFjayIsInNlbGYiLCJpbnB1dFRhcmdldCIsImRvbUhhbmRsZXIiLCJldiIsImVuYWJsZSIsImluaXQiLCJpbnB1dEhhbmRsZXIiLCJldmVudFR5cGUiLCJpbnB1dCIsInBvaW50ZXJzTGVuIiwicG9pbnRlcnMiLCJjaGFuZ2VkUG9pbnRlcnNMZW4iLCJjaGFuZ2VkUG9pbnRlcnMiLCJpc0ZpcnN0IiwiaXNGaW5hbCIsInNlc3Npb24iLCJwb2ludGVyc0xlbmd0aCIsImZpcnN0SW5wdXQiLCJzaW1wbGVDbG9uZUlucHV0RGF0YSIsImZpcnN0TXVsdGlwbGUiLCJvZmZzZXRDZW50ZXIiLCJjZW50ZXIiLCJnZXRDZW50ZXIiLCJ0aW1lU3RhbXAiLCJkZWx0YVRpbWUiLCJhbmdsZSIsImdldEFuZ2xlIiwiZGlzdGFuY2UiLCJnZXREaXN0YW5jZSIsIm9mZnNldCIsIm9mZnNldERlbHRhIiwicHJldkRlbHRhIiwicHJldklucHV0IiwieCIsImRlbHRhWCIsInkiLCJkZWx0YVkiLCJjb21wdXRlRGVsdGFYWSIsIm9mZnNldERpcmVjdGlvbiIsImdldERpcmVjdGlvbiIsIm92ZXJhbGxWZWxvY2l0eSIsImdldFZlbG9jaXR5Iiwib3ZlcmFsbFZlbG9jaXR5WCIsIm92ZXJhbGxWZWxvY2l0eVkiLCJzY2FsZSIsInN0YXJ0IiwiZW5kIiwicm90YXRpb24iLCJnZXRSb3RhdGlvbiIsIm1heFBvaW50ZXJzIiwidmVsb2NpdHkiLCJ2ZWxvY2l0eVgiLCJ2ZWxvY2l0eVkiLCJkaXJlY3Rpb24iLCJsYXN0IiwibGFzdEludGVydmFsIiwiY29tcHV0ZUludGVydmFsSW5wdXREYXRhIiwic3JjRXZlbnQiLCJjb21wdXRlSW5wdXREYXRhIiwiZW1pdCIsInJlY29nbml6ZSIsImNsaWVudFgiLCJwMSIsInAyIiwicHJvcHMiLCJzcXJ0IiwiYXRhbjIiLCJQSSIsImV2RWwiLCJldlRhcmdldCIsImV2V2luIiwiZGVzdHJveSIsIk1PVVNFX0lOUFVUX01BUCIsIm1vdXNlZG93biIsIm1vdXNlbW92ZSIsIm1vdXNldXAiLCJNT1VTRV9FTEVNRU5UX0VWRU5UUyIsIk1PVVNFX1dJTkRPV19FVkVOVFMiLCJNb3VzZUlucHV0IiwicHJlc3NlZCIsImJ1dHRvbiIsIndoaWNoIiwicG9pbnRlclR5cGUiLCJQT0lOVEVSX0lOUFVUX01BUCIsInBvaW50ZXJkb3duIiwicG9pbnRlcm1vdmUiLCJwb2ludGVydXAiLCJwb2ludGVyY2FuY2VsIiwicG9pbnRlcm91dCIsIklFMTBfUE9JTlRFUl9UWVBFX0VOVU0iLCIyIiwiMyIsIjQiLCI1IiwiUE9JTlRFUl9FTEVNRU5UX0VWRU5UUyIsIlBPSU5URVJfV0lORE9XX0VWRU5UUyIsIlBvaW50ZXJFdmVudElucHV0Iiwic3RvcmUiLCJwb2ludGVyRXZlbnRzIiwiTVNQb2ludGVyRXZlbnQiLCJQb2ludGVyRXZlbnQiLCJyZW1vdmVQb2ludGVyIiwiZXZlbnRUeXBlTm9ybWFsaXplZCIsImlzVG91Y2giLCJzdG9yZUluZGV4IiwicG9pbnRlcklkIiwic3BsaWNlIiwiU0lOR0xFX1RPVUNIX0lOUFVUX01BUCIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIsInRvdWNoY2FuY2VsIiwiU0lOR0xFX1RPVUNIX1RBUkdFVF9FVkVOVFMiLCJTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUyIsIlNpbmdsZVRvdWNoSW5wdXQiLCJzdGFydGVkIiwibm9ybWFsaXplU2luZ2xlVG91Y2hlcyIsImFsbCIsImNoYW5nZWQiLCJjaGFuZ2VkVG91Y2hlcyIsIlRPVUNIX0lOUFVUX01BUCIsIlRPVUNIX1RBUkdFVF9FVkVOVFMiLCJUb3VjaElucHV0IiwidGFyZ2V0SWRzIiwiZ2V0VG91Y2hlcyIsImFsbFRvdWNoZXMiLCJpZGVudGlmaWVyIiwiY2hhbmdlZFRhcmdldFRvdWNoZXMiLCJ0b3VjaCIsIkRFRFVQX1RJTUVPVVQiLCJERURVUF9ESVNUQU5DRSIsIlRvdWNoTW91c2VJbnB1dCIsIm1vdXNlIiwicHJpbWFyeVRvdWNoIiwibGFzdFRvdWNoZXMiLCJyZWNvcmRUb3VjaGVzIiwiZXZlbnREYXRhIiwic2V0TGFzdFRvdWNoIiwibGFzdFRvdWNoIiwibHRzIiwiaXNTeW50aGV0aWNFdmVudCIsImR4IiwiZHkiLCJpbnB1dEV2ZW50IiwiaW5wdXREYXRhIiwiaXNNb3VzZSIsInNvdXJjZUNhcGFiaWxpdGllcyIsImZpcmVzVG91Y2hFdmVudHMiLCJQUkVGSVhFRF9UT1VDSF9BQ1RJT04iLCJOQVRJVkVfVE9VQ0hfQUNUSU9OIiwiVE9VQ0hfQUNUSU9OX0FVVE8iLCJUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OIiwiVE9VQ0hfQUNUSU9OX05PTkUiLCJUT1VDSF9BQ1RJT05fUEFOX1giLCJUT1VDSF9BQ1RJT05fUEFOX1kiLCJUT1VDSF9BQ1RJT05fTUFQIiwidG91Y2hNYXAiLCJjc3NTdXBwb3J0cyIsIkNTUyIsInN1cHBvcnRzIiwiZ2V0VG91Y2hBY3Rpb25Qcm9wcyIsIlRvdWNoQWN0aW9uIiwic2V0IiwiY29tcHV0ZSIsImFjdGlvbnMiLCJ1cGRhdGUiLCJ0b3VjaEFjdGlvbiIsInJlY29nbml6ZXJzIiwicmVjb2duaXplciIsImdldFRvdWNoQWN0aW9uIiwiaGFzUGFuWCIsImhhc1BhblkiLCJjbGVhblRvdWNoQWN0aW9ucyIsImpvaW4iLCJwcmV2ZW50RGVmYXVsdHMiLCJwcmV2ZW50ZWQiLCJoYXNOb25lIiwiaXNUYXBQb2ludGVyIiwiaXNUYXBNb3ZlbWVudCIsImlzVGFwVG91Y2hUaW1lIiwicHJldmVudFNyYyIsIlNUQVRFX1BPU1NJQkxFIiwiU1RBVEVfQkVHQU4iLCJTVEFURV9DSEFOR0VEIiwiU1RBVEVfRU5ERUQiLCJTVEFURV9SRUNPR05JWkVEIiwiU1RBVEVfQ0FOQ0VMTEVEIiwiUmVjb2duaXplciIsImRlZmF1bHRzIiwiaWQiLCJzdGF0ZSIsInNpbXVsdGFuZW91cyIsInJlcXVpcmVGYWlsIiwic3RhdGVTdHIiLCJkaXJlY3Rpb25TdHIiLCJnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyIiwib3RoZXJSZWNvZ25pemVyIiwiZ2V0IiwiQXR0clJlY29nbml6ZXIiLCJQYW5SZWNvZ25pemVyIiwicFgiLCJwWSIsIlBpbmNoUmVjb2duaXplciIsIlByZXNzUmVjb2duaXplciIsIl90aW1lciIsIl9pbnB1dCIsIlJvdGF0ZVJlY29nbml6ZXIiLCJTd2lwZVJlY29nbml6ZXIiLCJUYXBSZWNvZ25pemVyIiwicFRpbWUiLCJwQ2VudGVyIiwiY291bnQiLCJIYW1tZXIiLCJwcmVzZXQiLCJNYW5hZ2VyIiwicmVjb2duaXplV2l0aCIsImRyb3BSZWNvZ25pemVXaXRoIiwicmVxdWlyZUZhaWx1cmUiLCJkcm9wUmVxdWlyZUZhaWx1cmUiLCJoYXNSZXF1aXJlRmFpbHVyZXMiLCJjYW5SZWNvZ25pemVXaXRoIiwiYWRkaXRpb25hbEV2ZW50IiwidHJ5RW1pdCIsImNhbkVtaXQiLCJpbnB1dERhdGFDbG9uZSIsInJlc2V0IiwicHJvY2VzcyIsImF0dHJUZXN0Iiwib3B0aW9uUG9pbnRlcnMiLCJpc1JlY29nbml6ZWQiLCJpc1ZhbGlkIiwidGhyZXNob2xkIiwiZGlyZWN0aW9uVGVzdCIsImhhc01vdmVkIiwiaW5PdXQiLCJ0aW1lIiwidmFsaWRQb2ludGVycyIsInZhbGlkTW92ZW1lbnQiLCJ2YWxpZFRpbWUiLCJjbGVhclRpbWVvdXQiLCJ0YXBzIiwiaW50ZXJ2YWwiLCJwb3NUaHJlc2hvbGQiLCJ2YWxpZFRvdWNoVGltZSIsImZhaWxUaW1lb3V0IiwidmFsaWRJbnRlcnZhbCIsInZhbGlkTXVsdGlUYXAiLCJ0YXBDb3VudCIsIlZFUlNJT04iLCJkb21FdmVudHMiLCJpbnB1dENsYXNzIiwiY3NzUHJvcHMiLCJ1c2VyU2VsZWN0IiwidG91Y2hTZWxlY3QiLCJ0b3VjaENhbGxvdXQiLCJjb250ZW50Wm9vbWluZyIsInVzZXJEcmFnIiwidGFwSGlnaGxpZ2h0Q29sb3IiLCJoYW5kbGVycyIsIm9sZENzc1Byb3BzIiwidG9nZ2xlQ3NzUHJvcHMiLCJpdGVtIiwiYWRkIiwic3RvcCIsImZvcmNlIiwic3RvcHBlZCIsImN1clJlY29nbml6ZXIiLCJleGlzdGluZyIsInJlbW92ZSIsIm9uIiwiZXZlbnRzIiwib2ZmIiwiZGF0YSIsImdlc3R1cmVFdmVudCIsImNyZWF0ZUV2ZW50IiwiaW5pdEV2ZW50IiwiZ2VzdHVyZSIsImRpc3BhdGNoRXZlbnQiLCJ0cmlnZ2VyRG9tRXZlbnQiLCJTVEFURV9GQUlMRUQiLCJUYXAiLCJQYW4iLCJTd2lwZSIsIlBpbmNoIiwiUm90YXRlIiwiUHJlc3MiXSwibWFwcGluZ3MiOiJ3SUFBQyxXQUFXLGFBQWEsR0FBRyxvQkFBb0JBLE9BQU8sQ0FBQyxJQUFJQyxFQUFFRCxPQUFPRSxVQUFVQyxVQUFVQyxNQUFNLG1CQUFtQkMsSUFBSUosR0FBRyxJQUFJSyxTQUFTTCxFQUFFLEdBQUcsSUFBSSxHQUFLLGNBQWNNLFNBQVNDLGdCQUFnQkMsT0FBTyxHQUFLSixFQUFFLENBQUMsSUFBSUssRUFBRSxTQUFTVCxFQUFFVSxFQUFFQyxHQUFHLElBQUlQLEVBQUVLLEVBQUVHLEVBQUVDLEVBQUVDLEVBQUUsSUFBSUgsRUFBRUEsRUFBRUksTUFBTSxNQUFNQyxPQUFPLElBQUlMLEVBQUUsR0FBR0EsRUFBRSxJQUFJLE1BQU1YLEVBQUVJLEVBQUVPLEVBQUUsR0FBR0YsRUFBRUUsRUFBRSxHQUFHQyxFQUFFLE9BQU9DLEVBQUUsUUFBUUMsRUFBRUosRUFBRU8sZ0JBQWdCLENBQUMsR0FBRyxNQUFNakIsRUFBRSxPQUFPSSxFQUFFTyxFQUFFLEdBQUdGLEVBQUVFLEVBQUUsR0FBR0MsRUFBRSxNQUFNQyxFQUFFLFNBQVNDLEVBQUVKLEVBQUVRLGFBQWEsR0FBR2QsSUFBSVEsR0FBR0gsSUFBSUcsRUFBRSxDQUFDLEdBQUdSLElBQUlTLEdBQUdKLElBQUlJLEVBQUUsTUFBTSxXQUFXVCxHQUFHLFFBQVFBLEdBQUdNLEVBQUVGLE1BQU1JLEdBQUcsV0FBV0YsRUFBRUYsTUFBTSxVQUFVSSxHQUFHRSxHQUFHLEVBQUUsWUFBWSxHQUFHVixFQUFFZSxRQUFRLE1BQU1mLEVBQUVDLFNBQVNELElBQUksSUFBSU0sRUFBRUYsTUFBTUksR0FBR1IsRUFBRSxJQUFJTSxFQUFFRixNQUFNLFVBQVVJLEdBQUdFLEdBQUdWLEdBQUcsS0FBSyxPQUFPQSxFQUFFLElBQUlBLEVBQUVNLEVBQUVGLE1BQU1LLEdBQUdULEVBQUUsSUFBSU0sRUFBRUYsTUFBTSxV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UGtGLE9BQVE5RSxHQUNSK0UsTUFBT2xGLEdBRVBrRSxHQUFJdlUsRUFDSnlVLElBQUtwVSxFQUNMaEQsS0FBTUEsRUFDTnlCLE1BQU9BLEVBQ1BILE9BQVFBLEVBQ1J2QyxPQUFRQSxFQUNSNEMsUUFBU0EsRUFDVDlCLE9BQVFBLEVBQ1JzRSxTQUFVQSxVQUtzQixJQUFYckwsRUFBeUJBLEVBQTBCLG9CQUFUdU4sS0FBdUJBLEtBQU8sSUFDdEZvTixPQUFTQSxJQUdoQixhQUNJLE9BQU9BLElBQ1Ysa0NBdGtGTCxDQTZrRkczYSxPQUFRTyIsImZpbGUiOiIvanMvc2l0ZS92ZW5kb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtpZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93KXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGR7Mn0pXFwuLyksbj0hIXQmJjE2PD1wYXJzZUludCh0WzFdLDEwKTtpZighKFwib2JqZWN0Rml0XCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUhPSExKXx8bil7dmFyIG89ZnVuY3Rpb24odCxlLGkpe3ZhciBuLG8sbCxhLGQ7aWYoKGk9aS5zcGxpdChcIiBcIikpLmxlbmd0aDwyJiYoaVsxXT1pWzBdKSxcInhcIj09PXQpbj1pWzBdLG89aVsxXSxsPVwibGVmdFwiLGE9XCJyaWdodFwiLGQ9ZS5jbGllbnRXaWR0aDtlbHNle2lmKFwieVwiIT09dClyZXR1cm47bj1pWzFdLG89aVswXSxsPVwidG9wXCIsYT1cImJvdHRvbVwiLGQ9ZS5jbGllbnRIZWlnaHR9aWYobiE9PWwmJm8hPT1sKXtpZihuIT09YSYmbyE9PWEpcmV0dXJuXCJjZW50ZXJcIj09PW58fFwiNTAlXCI9PT1uPyhlLnN0eWxlW2xdPVwiNTAlXCIsdm9pZChlLnN0eWxlW1wibWFyZ2luLVwiK2xdPWQvLTIrXCJweFwiKSk6dm9pZCgwPD1uLmluZGV4T2YoXCIlXCIpPyhuPXBhcnNlSW50KG4pKTw1MD8oZS5zdHlsZVtsXT1uK1wiJVwiLGUuc3R5bGVbXCJtYXJnaW4tXCIrbF09ZCoobi8tMTAwKStcInB4XCIpOihuPTEwMC1uLGUuc3R5bGVbYV09bitcIiVcIixlLnN0eWxlW1wibWFyZ2luLVwiK2FdPWQqKG4vLTEwMCkrXCJweFwiKTplLnN0eWxlW2xdPW4pO2Uuc3R5bGVbYV09XCIwXCJ9ZWxzZSBlLnN0eWxlW2xdPVwiMFwifSxsPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZGF0YXNldD90LmRhdGFzZXQub2JqZWN0Rml0OnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1vYmplY3QtZml0XCIpLGk9dC5kYXRhc2V0P3QuZGF0YXNldC5vYmplY3RQb3NpdGlvbjp0LmdldEF0dHJpYnV0ZShcImRhdGEtb2JqZWN0LXBvc2l0aW9uXCIpO2U9ZXx8XCJjb3ZlclwiLGk9aXx8XCI1MCUgNTAlXCI7dmFyIG49dC5wYXJlbnROb2RlO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLGk9ZS5nZXRQcm9wZXJ0eVZhbHVlKFwicG9zaXRpb25cIiksbj1lLmdldFByb3BlcnR5VmFsdWUoXCJvdmVyZmxvd1wiKSxvPWUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7aSYmXCJzdGF0aWNcIiE9PWl8fCh0LnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIiksXCJoaWRkZW5cIiE9PW4mJih0LnN0eWxlLm92ZXJmbG93PVwiaGlkZGVuXCIpLG8mJlwiaW5saW5lXCIhPT1vfHwodC5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIiksMD09PXQuY2xpZW50SGVpZ2h0JiYodC5zdHlsZS5oZWlnaHQ9XCIxMDAlXCIpLC0xPT09dC5jbGFzc05hbWUuaW5kZXhPZihcIm9iamVjdC1maXQtcG9seWZpbGxcIikmJih0LmNsYXNzTmFtZT10LmNsYXNzTmFtZStcIiBvYmplY3QtZml0LXBvbHlmaWxsXCIpfShuKSxmdW5jdGlvbih0KXt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLGk9e1wibWF4LXdpZHRoXCI6XCJub25lXCIsXCJtYXgtaGVpZ2h0XCI6XCJub25lXCIsXCJtaW4td2lkdGhcIjpcIjBweFwiLFwibWluLWhlaWdodFwiOlwiMHB4XCIsdG9wOlwiYXV0b1wiLHJpZ2h0OlwiYXV0b1wiLGJvdHRvbTpcImF1dG9cIixsZWZ0OlwiYXV0b1wiLFwibWFyZ2luLXRvcFwiOlwiMHB4XCIsXCJtYXJnaW4tcmlnaHRcIjpcIjBweFwiLFwibWFyZ2luLWJvdHRvbVwiOlwiMHB4XCIsXCJtYXJnaW4tbGVmdFwiOlwiMHB4XCJ9O2Zvcih2YXIgbiBpbiBpKWUuZ2V0UHJvcGVydHlWYWx1ZShuKSE9PWlbbl0mJih0LnN0eWxlW25dPWlbbl0pfSh0KSx0LnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0LnN0eWxlLndpZHRoPVwiYXV0b1wiLHQuc3R5bGUuaGVpZ2h0PVwiYXV0b1wiLFwic2NhbGUtZG93blwiPT09ZSYmKGU9dC5jbGllbnRXaWR0aDxuLmNsaWVudFdpZHRoJiZ0LmNsaWVudEhlaWdodDxuLmNsaWVudEhlaWdodD9cIm5vbmVcIjpcImNvbnRhaW5cIiksXCJub25lXCI9PT1lPyhvKFwieFwiLHQsaSksdm9pZCBvKFwieVwiLHQsaSkpOlwiZmlsbFwiPT09ZT8odC5zdHlsZS53aWR0aD1cIjEwMCVcIix0LnN0eWxlLmhlaWdodD1cIjEwMCVcIixvKFwieFwiLHQsaSksdm9pZCBvKFwieVwiLHQsaSkpOih0LnN0eWxlLmhlaWdodD1cIjEwMCVcIix2b2lkKFwiY292ZXJcIj09PWUmJnQuY2xpZW50V2lkdGg+bi5jbGllbnRXaWR0aHx8XCJjb250YWluXCI9PT1lJiZ0LmNsaWVudFdpZHRoPG4uY2xpZW50V2lkdGg/KHQuc3R5bGUudG9wPVwiMFwiLHQuc3R5bGUubWFyZ2luVG9wPVwiMFwiLG8oXCJ4XCIsdCxpKSk6KHQuc3R5bGUud2lkdGg9XCIxMDAlXCIsdC5zdHlsZS5oZWlnaHQ9XCJhdXRvXCIsdC5zdHlsZS5sZWZ0PVwiMFwiLHQuc3R5bGUubWFyZ2luTGVmdD1cIjBcIixvKFwieVwiLHQsaSkpKSl9LGU9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dHx8dCBpbnN0YW5jZW9mIEV2ZW50KXQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLW9iamVjdC1maXRdXCIpO2Vsc2UgaWYodCYmdC5ub2RlTmFtZSl0PVt0XTtlbHNle2lmKFwib2JqZWN0XCIhPXR5cGVvZiB0fHwhdC5sZW5ndGh8fCF0WzBdLm5vZGVOYW1lKXJldHVybiExO3Q9dH1mb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdLm5vZGVOYW1lKXt2YXIgaT10W2VdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoXCJpbWdcIj09PWkpe2lmKG4pY29udGludWU7dFtlXS5jb21wbGV0ZT9sKHRbZV0pOnRbZV0uYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixmdW5jdGlvbigpe2wodGhpcyl9KX1lbHNlXCJ2aWRlb1wiPT09aT8wPHRbZV0ucmVhZHlTdGF0ZT9sKHRbZV0pOnRbZV0uYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRlZG1ldGFkYXRhXCIsZnVuY3Rpb24oKXtsKHRoaXMpfSk6bCh0W2VdKX1yZXR1cm4hMH07XCJsb2FkaW5nXCI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsZSk6ZSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsZSksd2luZG93Lm9iamVjdEZpdFBvbHlmaWxsPWV9ZWxzZSB3aW5kb3cub2JqZWN0Rml0UG9seWZpbGw9ZnVuY3Rpb24oKXtyZXR1cm4hMX19fSgpOyIsIiFmdW5jdGlvbihlLHQpe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wiZXhwb3J0c1wiXSx0KTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBleHBvcnRzKXQoZXhwb3J0cyk7ZWxzZXt2YXIgbz17fTt0KG8pLGUuYm9keVNjcm9sbExvY2s9b319KHRoaXMsZnVuY3Rpb24oZXhwb3J0cyl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcihlKXtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHQ9MCxvPUFycmF5KGUubGVuZ3RoKTt0PGUubGVuZ3RoO3QrKylvW3RdPWVbdF07cmV0dXJuIG99cmV0dXJuIEFycmF5LmZyb20oZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGw9ITE7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyl7dmFyIGU9e2dldCBwYXNzaXZlKCl7bD0hMH19O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidGVzdFBhc3NpdmVcIixudWxsLGUpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidGVzdFBhc3NpdmVcIixudWxsLGUpfXZhciBkPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5uYXZpZ2F0b3ImJndpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0mJi9pUChhZHxob25lfG9kKS8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtKSxjPVtdLHU9ITEsYT0tMSxzPXZvaWQgMCx2PXZvaWQgMCxmPWZ1bmN0aW9uKHQpe3JldHVybiBjLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuISghZS5vcHRpb25zLmFsbG93VG91Y2hNb3ZlfHwhZS5vcHRpb25zLmFsbG93VG91Y2hNb3ZlKHQpKX0pfSxtPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHdpbmRvdy5ldmVudDtyZXR1cm4hIWYodC50YXJnZXQpfHwoMTx0LnRvdWNoZXMubGVuZ3RofHwodC5wcmV2ZW50RGVmYXVsdCYmdC5wcmV2ZW50RGVmYXVsdCgpLCExKSl9LG89ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dm9pZCAwIT09diYmKGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PXYsdj12b2lkIDApLHZvaWQgMCE9PXMmJihkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PXMscz12b2lkIDApfSl9O2V4cG9ydHMuZGlzYWJsZUJvZHlTY3JvbGw9ZnVuY3Rpb24oaSxlKXtpZihkKXtpZighaSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKFwiZGlzYWJsZUJvZHlTY3JvbGwgdW5zdWNjZXNzZnVsIC0gdGFyZ2V0RWxlbWVudCBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gY2FsbGluZyBkaXNhYmxlQm9keVNjcm9sbCBvbiBJT1MgZGV2aWNlcy5cIik7aWYoaSYmIWMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gZS50YXJnZXRFbGVtZW50PT09aX0pKXt2YXIgdD17dGFyZ2V0RWxlbWVudDppLG9wdGlvbnM6ZXx8e319O2M9W10uY29uY2F0KHIoYyksW3RdKSxpLm9udG91Y2hzdGFydD1mdW5jdGlvbihlKXsxPT09ZS50YXJnZXRUb3VjaGVzLmxlbmd0aCYmKGE9ZS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFkpfSxpLm9udG91Y2htb3ZlPWZ1bmN0aW9uKGUpe3ZhciB0LG8sbixyOzE9PT1lLnRhcmdldFRvdWNoZXMubGVuZ3RoJiYobz1pLHI9KHQ9ZSkudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZLWEsIWYodC50YXJnZXQpJiYobyYmMD09PW8uc2Nyb2xsVG9wJiYwPHI/bSh0KToobj1vKSYmbi5zY3JvbGxIZWlnaHQtbi5zY3JvbGxUb3A8PW4uY2xpZW50SGVpZ2h0JiZyPDA/bSh0KTp0LnN0b3BQcm9wYWdhdGlvbigpKSl9LHV8fChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsbSxsP3twYXNzaXZlOiExfTp2b2lkIDApLHU9ITApfX1lbHNle249ZSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dil7dmFyIGU9ISFuJiYhMD09PW4ucmVzZXJ2ZVNjcm9sbEJhckdhcCx0PXdpbmRvdy5pbm5lcldpZHRoLWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtlJiYwPHQmJih2PWRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0LGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PXQrXCJweFwiKX12b2lkIDA9PT1zJiYocz1kb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93LGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9XCJoaWRkZW5cIil9KTt2YXIgbz17dGFyZ2V0RWxlbWVudDppLG9wdGlvbnM6ZXx8e319O2M9W10uY29uY2F0KHIoYyksW29dKX12YXIgbn0sZXhwb3J0cy5jbGVhckFsbEJvZHlTY3JvbGxMb2Nrcz1mdW5jdGlvbigpe2Q/KGMuZm9yRWFjaChmdW5jdGlvbihlKXtlLnRhcmdldEVsZW1lbnQub250b3VjaHN0YXJ0PW51bGwsZS50YXJnZXRFbGVtZW50Lm9udG91Y2htb3ZlPW51bGx9KSx1JiYoZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLG0sbD97cGFzc2l2ZTohMX06dm9pZCAwKSx1PSExKSxjPVtdLGE9LTEpOihvKCksYz1bXSl9LGV4cG9ydHMuZW5hYmxlQm9keVNjcm9sbD1mdW5jdGlvbih0KXtpZihkKXtpZighdClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKFwiZW5hYmxlQm9keVNjcm9sbCB1bnN1Y2Nlc3NmdWwgLSB0YXJnZXRFbGVtZW50IG11c3QgYmUgcHJvdmlkZWQgd2hlbiBjYWxsaW5nIGVuYWJsZUJvZHlTY3JvbGwgb24gSU9TIGRldmljZXMuXCIpO3Qub250b3VjaHN0YXJ0PW51bGwsdC5vbnRvdWNobW92ZT1udWxsLGM9Yy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFyZ2V0RWxlbWVudCE9PXR9KSx1JiYwPT09Yy5sZW5ndGgmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsbSxsP3twYXNzaXZlOiExfTp2b2lkIDApLHU9ITEpfWVsc2UoYz1jLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS50YXJnZXRFbGVtZW50IT09dH0pKS5sZW5ndGh8fG8oKX19KTtcbiIsIi8qISBIYW1tZXIuSlMgLSB2Mi4wLjcgLSAyMDE2LTA0LTIyXG4gKiBodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvL1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNiBKb3JpayBUYW5nZWxkZXI7XG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgKi9cbihmdW5jdGlvbih3aW5kb3csIGRvY3VtZW50LCBleHBvcnROYW1lLCB1bmRlZmluZWQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG52YXIgVkVORE9SX1BSRUZJWEVTID0gWycnLCAnd2Via2l0JywgJ01veicsICdNUycsICdtcycsICdvJ107XG52YXIgVEVTVF9FTEVNRU5UID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbnZhciBUWVBFX0ZVTkNUSU9OID0gJ2Z1bmN0aW9uJztcblxudmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcbnZhciBhYnMgPSBNYXRoLmFicztcbnZhciBub3cgPSBEYXRlLm5vdztcblxuLyoqXG4gKiBzZXQgYSB0aW1lb3V0IHdpdGggYSBnaXZlbiBzY29wZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7TnVtYmVyfSB0aW1lb3V0XG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gc2V0VGltZW91dENvbnRleHQoZm4sIHRpbWVvdXQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChiaW5kRm4oZm4sIGNvbnRleHQpLCB0aW1lb3V0KTtcbn1cblxuLyoqXG4gKiBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYXJyYXksIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgZm4gb24gZWFjaCBlbnRyeVxuICogaWYgaXQgYWludCBhbiBhcnJheSB3ZSBkb24ndCB3YW50IHRvIGRvIGEgdGhpbmcuXG4gKiB0aGlzIGlzIHVzZWQgYnkgYWxsIHRoZSBtZXRob2RzIHRoYXQgYWNjZXB0IGEgc2luZ2xlIGFuZCBhcnJheSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7KnxBcnJheX0gYXJnXG4gKiBAcGFyYW0ge1N0cmluZ30gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF1cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpbnZva2VBcnJheUFyZyhhcmcsIGZuLCBjb250ZXh0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgICBlYWNoKGFyZywgY29udGV4dFtmbl0sIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIHdhbGsgb2JqZWN0cyBhbmQgYXJyYXlzXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRvclxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gZWFjaChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9iai5mb3JFYWNoKSB7XG4gICAgICAgIG9iai5mb3JFYWNoKGl0ZXJhdG9yLCBjb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCBvYmoubGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgIG9iai5oYXNPd25Qcm9wZXJ0eShpKSAmJiBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiB3cmFwIGEgbWV0aG9kIHdpdGggYSBkZXByZWNhdGlvbiB3YXJuaW5nIGFuZCBzdGFjayB0cmFjZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gd3JhcHBpbmcgdGhlIHN1cHBsaWVkIG1ldGhvZC5cbiAqL1xuZnVuY3Rpb24gZGVwcmVjYXRlKG1ldGhvZCwgbmFtZSwgbWVzc2FnZSkge1xuICAgIHZhciBkZXByZWNhdGlvbk1lc3NhZ2UgPSAnREVQUkVDQVRFRCBNRVRIT0Q6ICcgKyBuYW1lICsgJ1xcbicgKyBtZXNzYWdlICsgJyBBVCBcXG4nO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ2dldC1zdGFjay10cmFjZScpO1xuICAgICAgICB2YXIgc3RhY2sgPSBlICYmIGUuc3RhY2sgPyBlLnN0YWNrLnJlcGxhY2UoL15bXlxcKF0rP1tcXG4kXS9nbSwgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXlxccythdFxccysvZ20sICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15PYmplY3QuPGFub255bW91cz5cXHMqXFwoL2dtLCAne2Fub255bW91c30oKUAnKSA6ICdVbmtub3duIFN0YWNrIFRyYWNlJztcblxuICAgICAgICB2YXIgbG9nID0gd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLndhcm4gfHwgd2luZG93LmNvbnNvbGUubG9nKTtcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgICAgbG9nLmNhbGwod2luZG93LmNvbnNvbGUsIGRlcHJlY2F0aW9uTWVzc2FnZSwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIGV4dGVuZCBvYmplY3QuXG4gKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBvYmplY3RzX3RvX2Fzc2lnblxuICogQHJldHVybnMge09iamVjdH0gdGFyZ2V0XG4gKi9cbnZhciBhc3NpZ247XG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0KSB7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG91dHB1dCA9IE9iamVjdCh0YXJnZXQpO1xuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgICAgICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShuZXh0S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25leHRLZXldID0gc291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcbn0gZWxzZSB7XG4gICAgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbn1cblxuLyoqXG4gKiBleHRlbmQgb2JqZWN0LlxuICogbWVhbnMgdGhhdCBwcm9wZXJ0aWVzIGluIGRlc3Qgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgb25lcyBpbiBzcmMuXG4gKiBAcGFyYW0ge09iamVjdH0gZGVzdFxuICogQHBhcmFtIHtPYmplY3R9IHNyY1xuICogQHBhcmFtIHtCb29sZWFufSBbbWVyZ2U9ZmFsc2VdXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBkZXN0XG4gKi9cbnZhciBleHRlbmQgPSBkZXByZWNhdGUoZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYywgbWVyZ2UpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNyYyk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpIDwga2V5cy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCFtZXJnZSB8fCAobWVyZ2UgJiYgZGVzdFtrZXlzW2ldXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgZGVzdFtrZXlzW2ldXSA9IHNyY1trZXlzW2ldXTtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufSwgJ2V4dGVuZCcsICdVc2UgYGFzc2lnbmAuJyk7XG5cbi8qKlxuICogbWVyZ2UgdGhlIHZhbHVlcyBmcm9tIHNyYyBpbiB0aGUgZGVzdC5cbiAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyB0aGF0IGV4aXN0IGluIGRlc3Qgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4gYnkgc3JjXG4gKiBAcGFyYW0ge09iamVjdH0gZGVzdFxuICogQHBhcmFtIHtPYmplY3R9IHNyY1xuICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICovXG52YXIgbWVyZ2UgPSBkZXByZWNhdGUoZnVuY3Rpb24gbWVyZ2UoZGVzdCwgc3JjKSB7XG4gICAgcmV0dXJuIGV4dGVuZChkZXN0LCBzcmMsIHRydWUpO1xufSwgJ21lcmdlJywgJ1VzZSBgYXNzaWduYC4nKTtcblxuLyoqXG4gKiBzaW1wbGUgY2xhc3MgaW5oZXJpdGFuY2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNoaWxkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBiYXNlXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXNdXG4gKi9cbmZ1bmN0aW9uIGluaGVyaXQoY2hpbGQsIGJhc2UsIHByb3BlcnRpZXMpIHtcbiAgICB2YXIgYmFzZVAgPSBiYXNlLnByb3RvdHlwZSxcbiAgICAgICAgY2hpbGRQO1xuXG4gICAgY2hpbGRQID0gY2hpbGQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShiYXNlUCk7XG4gICAgY2hpbGRQLmNvbnN0cnVjdG9yID0gY2hpbGQ7XG4gICAgY2hpbGRQLl9zdXBlciA9IGJhc2VQO1xuXG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgICAgYXNzaWduKGNoaWxkUCwgcHJvcGVydGllcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIHNpbXBsZSBmdW5jdGlvbiBiaW5kXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gYmluZEZuKGZuLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGJvdW5kRm4oKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5cbi8qKlxuICogbGV0IGEgYm9vbGVhbiB2YWx1ZSBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBtdXN0IHJldHVybiBhIGJvb2xlYW5cbiAqIHRoaXMgZmlyc3QgaXRlbSBpbiBhcmdzIHdpbGwgYmUgdXNlZCBhcyB0aGUgY29udGV4dFxuICogQHBhcmFtIHtCb29sZWFufEZ1bmN0aW9ufSB2YWxcbiAqIEBwYXJhbSB7QXJyYXl9IFthcmdzXVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGJvb2xPckZuKHZhbCwgYXJncykge1xuICAgIGlmICh0eXBlb2YgdmFsID09IFRZUEVfRlVOQ1RJT04pIHtcbiAgICAgICAgcmV0dXJuIHZhbC5hcHBseShhcmdzID8gYXJnc1swXSB8fCB1bmRlZmluZWQgOiB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufVxuXG4vKipcbiAqIHVzZSB0aGUgdmFsMiB3aGVuIHZhbDEgaXMgdW5kZWZpbmVkXG4gKiBAcGFyYW0geyp9IHZhbDFcbiAqIEBwYXJhbSB7Kn0gdmFsMlxuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIGlmVW5kZWZpbmVkKHZhbDEsIHZhbDIpIHtcbiAgICByZXR1cm4gKHZhbDEgPT09IHVuZGVmaW5lZCkgPyB2YWwyIDogdmFsMTtcbn1cblxuLyoqXG4gKiBhZGRFdmVudExpc3RlbmVyIHdpdGggbXVsdGlwbGUgZXZlbnRzIGF0IG9uY2VcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJzKHRhcmdldCwgdHlwZXMsIGhhbmRsZXIpIHtcbiAgICBlYWNoKHNwbGl0U3RyKHR5cGVzKSwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogcmVtb3ZlRXZlbnRMaXN0ZW5lciB3aXRoIG11bHRpcGxlIGV2ZW50cyBhdCBvbmNlXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICovXG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gICAgZWFjaChzcGxpdFN0cih0eXBlcyksIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIGZpbmQgaWYgYSBub2RlIGlzIGluIHRoZSBnaXZlbiBwYXJlbnRcbiAqIEBtZXRob2QgaGFzUGFyZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGhhc1BhcmVudChub2RlLCBwYXJlbnQpIHtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBzbWFsbCBpbmRleE9mIHdyYXBwZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gZm91bmRcbiAqL1xuZnVuY3Rpb24gaW5TdHIoc3RyLCBmaW5kKSB7XG4gICAgcmV0dXJuIHN0ci5pbmRleE9mKGZpbmQpID4gLTE7XG59XG5cbi8qKlxuICogc3BsaXQgc3RyaW5nIG9uIHdoaXRlc3BhY2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtBcnJheX0gd29yZHNcbiAqL1xuZnVuY3Rpb24gc3BsaXRTdHIoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCkuc3BsaXQoL1xccysvZyk7XG59XG5cbi8qKlxuICogZmluZCBpZiBhIGFycmF5IGNvbnRhaW5zIHRoZSBvYmplY3QgdXNpbmcgaW5kZXhPZiBvciBhIHNpbXBsZSBwb2x5RmlsbFxuICogQHBhcmFtIHtBcnJheX0gc3JjXG4gKiBAcGFyYW0ge1N0cmluZ30gZmluZFxuICogQHBhcmFtIHtTdHJpbmd9IFtmaW5kQnlLZXldXG4gKiBAcmV0dXJuIHtCb29sZWFufE51bWJlcn0gZmFsc2Ugd2hlbiBub3QgZm91bmQsIG9yIHRoZSBpbmRleFxuICovXG5mdW5jdGlvbiBpbkFycmF5KHNyYywgZmluZCwgZmluZEJ5S2V5KSB7XG4gICAgaWYgKHNyYy5pbmRleE9mICYmICFmaW5kQnlLZXkpIHtcbiAgICAgICAgcmV0dXJuIHNyYy5pbmRleE9mKGZpbmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCBzcmMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoKGZpbmRCeUtleSAmJiBzcmNbaV1bZmluZEJ5S2V5XSA9PSBmaW5kKSB8fCAoIWZpbmRCeUtleSAmJiBzcmNbaV0gPT09IGZpbmQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbn1cblxuLyoqXG4gKiBjb252ZXJ0IGFycmF5LWxpa2Ugb2JqZWN0cyB0byByZWFsIGFycmF5c1xuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybnMge0FycmF5fVxuICovXG5mdW5jdGlvbiB0b0FycmF5KG9iaikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmosIDApO1xufVxuXG4vKipcbiAqIHVuaXF1ZSBhcnJheSB3aXRoIG9iamVjdHMgYmFzZWQgb24gYSBrZXkgKGxpa2UgJ2lkJykgb3IganVzdCBieSB0aGUgYXJyYXkncyB2YWx1ZVxuICogQHBhcmFtIHtBcnJheX0gc3JjIFt7aWQ6MX0se2lkOjJ9LHtpZDoxfV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBba2V5XVxuICogQHBhcmFtIHtCb29sZWFufSBbc29ydD1GYWxzZV1cbiAqIEByZXR1cm5zIHtBcnJheX0gW3tpZDoxfSx7aWQ6Mn1dXG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZUFycmF5KHNyYywga2V5LCBzb3J0KSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBzcmMubGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWwgPSBrZXkgPyBzcmNbaV1ba2V5XSA6IHNyY1tpXTtcbiAgICAgICAgaWYgKGluQXJyYXkodmFsdWVzLCB2YWwpIDwgMCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHNyY1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVzW2ldID0gdmFsO1xuICAgICAgICBpKys7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQpIHtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNvcnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNvcnQoZnVuY3Rpb24gc29ydFVuaXF1ZUFycmF5KGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYVtrZXldID4gYltrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBnZXQgdGhlIHByZWZpeGVkIHByb3BlcnR5XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAqIEByZXR1cm5zIHtTdHJpbmd8VW5kZWZpbmVkfSBwcmVmaXhlZFxuICovXG5mdW5jdGlvbiBwcmVmaXhlZChvYmosIHByb3BlcnR5KSB7XG4gICAgdmFyIHByZWZpeCwgcHJvcDtcbiAgICB2YXIgY2FtZWxQcm9wID0gcHJvcGVydHlbMF0udG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnNsaWNlKDEpO1xuXG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgVkVORE9SX1BSRUZJWEVTLmxlbmd0aCkge1xuICAgICAgICBwcmVmaXggPSBWRU5ET1JfUFJFRklYRVNbaV07XG4gICAgICAgIHByb3AgPSAocHJlZml4KSA/IHByZWZpeCArIGNhbWVsUHJvcCA6IHByb3BlcnR5O1xuXG4gICAgICAgIGlmIChwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGdldCBhIHVuaXF1ZSBpZFxuICogQHJldHVybnMge251bWJlcn0gdW5pcXVlSWRcbiAqL1xudmFyIF91bmlxdWVJZCA9IDE7XG5mdW5jdGlvbiB1bmlxdWVJZCgpIHtcbiAgICByZXR1cm4gX3VuaXF1ZUlkKys7XG59XG5cbi8qKlxuICogZ2V0IHRoZSB3aW5kb3cgb2JqZWN0IG9mIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtEb2N1bWVudFZpZXd8V2luZG93fVxuICovXG5mdW5jdGlvbiBnZXRXaW5kb3dGb3JFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB2YXIgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50IHx8IGVsZW1lbnQ7XG4gICAgcmV0dXJuIChkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdyB8fCB3aW5kb3cpO1xufVxuXG52YXIgTU9CSUxFX1JFR0VYID0gL21vYmlsZXx0YWJsZXR8aXAoYWR8aG9uZXxvZCl8YW5kcm9pZC9pO1xuXG52YXIgU1VQUE9SVF9UT1VDSCA9ICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cpO1xudmFyIFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMgPSBwcmVmaXhlZCh3aW5kb3csICdQb2ludGVyRXZlbnQnKSAhPT0gdW5kZWZpbmVkO1xudmFyIFNVUFBPUlRfT05MWV9UT1VDSCA9IFNVUFBPUlRfVE9VQ0ggJiYgTU9CSUxFX1JFR0VYLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbnZhciBJTlBVVF9UWVBFX1RPVUNIID0gJ3RvdWNoJztcbnZhciBJTlBVVF9UWVBFX1BFTiA9ICdwZW4nO1xudmFyIElOUFVUX1RZUEVfTU9VU0UgPSAnbW91c2UnO1xudmFyIElOUFVUX1RZUEVfS0lORUNUID0gJ2tpbmVjdCc7XG5cbnZhciBDT01QVVRFX0lOVEVSVkFMID0gMjU7XG5cbnZhciBJTlBVVF9TVEFSVCA9IDE7XG52YXIgSU5QVVRfTU9WRSA9IDI7XG52YXIgSU5QVVRfRU5EID0gNDtcbnZhciBJTlBVVF9DQU5DRUwgPSA4O1xuXG52YXIgRElSRUNUSU9OX05PTkUgPSAxO1xudmFyIERJUkVDVElPTl9MRUZUID0gMjtcbnZhciBESVJFQ1RJT05fUklHSFQgPSA0O1xudmFyIERJUkVDVElPTl9VUCA9IDg7XG52YXIgRElSRUNUSU9OX0RPV04gPSAxNjtcblxudmFyIERJUkVDVElPTl9IT1JJWk9OVEFMID0gRElSRUNUSU9OX0xFRlQgfCBESVJFQ1RJT05fUklHSFQ7XG52YXIgRElSRUNUSU9OX1ZFUlRJQ0FMID0gRElSRUNUSU9OX1VQIHwgRElSRUNUSU9OX0RPV047XG52YXIgRElSRUNUSU9OX0FMTCA9IERJUkVDVElPTl9IT1JJWk9OVEFMIHwgRElSRUNUSU9OX1ZFUlRJQ0FMO1xuXG52YXIgUFJPUFNfWFkgPSBbJ3gnLCAneSddO1xudmFyIFBST1BTX0NMSUVOVF9YWSA9IFsnY2xpZW50WCcsICdjbGllbnRZJ107XG5cbi8qKlxuICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtJbnB1dH1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBJbnB1dChtYW5hZ2VyLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLmVsZW1lbnQgPSBtYW5hZ2VyLmVsZW1lbnQ7XG4gICAgdGhpcy50YXJnZXQgPSBtYW5hZ2VyLm9wdGlvbnMuaW5wdXRUYXJnZXQ7XG5cbiAgICAvLyBzbWFsbGVyIHdyYXBwZXIgYXJvdW5kIHRoZSBoYW5kbGVyLCBmb3IgdGhlIHNjb3BlIGFuZCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgbWFuYWdlcixcbiAgICAvLyBzbyB3aGVuIGRpc2FibGVkIHRoZSBpbnB1dCBldmVudHMgYXJlIGNvbXBsZXRlbHkgYnlwYXNzZWQuXG4gICAgdGhpcy5kb21IYW5kbGVyID0gZnVuY3Rpb24oZXYpIHtcbiAgICAgICAgaWYgKGJvb2xPckZuKG1hbmFnZXIub3B0aW9ucy5lbmFibGUsIFttYW5hZ2VyXSkpIHtcbiAgICAgICAgICAgIHNlbGYuaGFuZGxlcihldik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5pbml0KCk7XG5cbn1cblxuSW5wdXQucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNob3VsZCBoYW5kbGUgdGhlIGlucHV0RXZlbnQgZGF0YSBhbmQgdHJpZ2dlciB0aGUgY2FsbGJhY2tcbiAgICAgKiBAdmlydHVhbFxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkgeyB9LFxuXG4gICAgLyoqXG4gICAgICogYmluZCB0aGUgZXZlbnRzXG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZXZFbCAmJiBhZGRFdmVudExpc3RlbmVycyh0aGlzLmVsZW1lbnQsIHRoaXMuZXZFbCwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5ldlRhcmdldCAmJiBhZGRFdmVudExpc3RlbmVycyh0aGlzLnRhcmdldCwgdGhpcy5ldlRhcmdldCwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5ldldpbiAmJiBhZGRFdmVudExpc3RlbmVycyhnZXRXaW5kb3dGb3JFbGVtZW50KHRoaXMuZWxlbWVudCksIHRoaXMuZXZXaW4sIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHVuYmluZCB0aGUgZXZlbnRzXG4gICAgICovXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZXZFbCAmJiByZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLmVsZW1lbnQsIHRoaXMuZXZFbCwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5ldlRhcmdldCAmJiByZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLnRhcmdldCwgdGhpcy5ldlRhcmdldCwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5ldldpbiAmJiByZW1vdmVFdmVudExpc3RlbmVycyhnZXRXaW5kb3dGb3JFbGVtZW50KHRoaXMuZWxlbWVudCksIHRoaXMuZXZXaW4sIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgfVxufTtcblxuLyoqXG4gKiBjcmVhdGUgbmV3IGlucHV0IHR5cGUgbWFuYWdlclxuICogY2FsbGVkIGJ5IHRoZSBNYW5hZ2VyIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0hhbW1lcn0gbWFuYWdlclxuICogQHJldHVybnMge0lucHV0fVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnB1dEluc3RhbmNlKG1hbmFnZXIpIHtcbiAgICB2YXIgVHlwZTtcbiAgICB2YXIgaW5wdXRDbGFzcyA9IG1hbmFnZXIub3B0aW9ucy5pbnB1dENsYXNzO1xuXG4gICAgaWYgKGlucHV0Q2xhc3MpIHtcbiAgICAgICAgVHlwZSA9IGlucHV0Q2xhc3M7XG4gICAgfSBlbHNlIGlmIChTVVBQT1JUX1BPSU5URVJfRVZFTlRTKSB7XG4gICAgICAgIFR5cGUgPSBQb2ludGVyRXZlbnRJbnB1dDtcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfT05MWV9UT1VDSCkge1xuICAgICAgICBUeXBlID0gVG91Y2hJbnB1dDtcbiAgICB9IGVsc2UgaWYgKCFTVVBQT1JUX1RPVUNIKSB7XG4gICAgICAgIFR5cGUgPSBNb3VzZUlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFR5cGUgPSBUb3VjaE1vdXNlSW5wdXQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgKFR5cGUpKG1hbmFnZXIsIGlucHV0SGFuZGxlcik7XG59XG5cbi8qKlxuICogaGFuZGxlIGlucHV0IGV2ZW50c1xuICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAqL1xuZnVuY3Rpb24gaW5wdXRIYW5kbGVyKG1hbmFnZXIsIGV2ZW50VHlwZSwgaW5wdXQpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW4gPSBpbnB1dC5wb2ludGVycy5sZW5ndGg7XG4gICAgdmFyIGNoYW5nZWRQb2ludGVyc0xlbiA9IGlucHV0LmNoYW5nZWRQb2ludGVycy5sZW5ndGg7XG4gICAgdmFyIGlzRmlyc3QgPSAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgKHBvaW50ZXJzTGVuIC0gY2hhbmdlZFBvaW50ZXJzTGVuID09PSAwKSk7XG4gICAgdmFyIGlzRmluYWwgPSAoZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkgJiYgKHBvaW50ZXJzTGVuIC0gY2hhbmdlZFBvaW50ZXJzTGVuID09PSAwKSk7XG5cbiAgICBpbnB1dC5pc0ZpcnN0ID0gISFpc0ZpcnN0O1xuICAgIGlucHV0LmlzRmluYWwgPSAhIWlzRmluYWw7XG5cbiAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICBtYW5hZ2VyLnNlc3Npb24gPSB7fTtcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgZXZlbnQgaXMgdGhlIG5vcm1hbGl6ZWQgdmFsdWUgb2YgdGhlIGRvbUV2ZW50c1xuICAgIC8vIGxpa2UgJ3RvdWNoc3RhcnQsIG1vdXNldXAsIHBvaW50ZXJkb3duJ1xuICAgIGlucHV0LmV2ZW50VHlwZSA9IGV2ZW50VHlwZTtcblxuICAgIC8vIGNvbXB1dGUgc2NhbGUsIHJvdGF0aW9uIGV0Y1xuICAgIGNvbXB1dGVJbnB1dERhdGEobWFuYWdlciwgaW5wdXQpO1xuXG4gICAgLy8gZW1pdCBzZWNyZXQgZXZlbnRcbiAgICBtYW5hZ2VyLmVtaXQoJ2hhbW1lci5pbnB1dCcsIGlucHV0KTtcblxuICAgIG1hbmFnZXIucmVjb2duaXplKGlucHV0KTtcbiAgICBtYW5hZ2VyLnNlc3Npb24ucHJldklucHV0ID0gaW5wdXQ7XG59XG5cbi8qKlxuICogZXh0ZW5kIHRoZSBkYXRhIHdpdGggc29tZSB1c2FibGUgcHJvcGVydGllcyBsaWtlIHNjYWxlLCByb3RhdGUsIHZlbG9jaXR5IGV0Y1xuICogQHBhcmFtIHtPYmplY3R9IG1hbmFnZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5mdW5jdGlvbiBjb21wdXRlSW5wdXREYXRhKG1hbmFnZXIsIGlucHV0KSB7XG4gICAgdmFyIHNlc3Npb24gPSBtYW5hZ2VyLnNlc3Npb247XG4gICAgdmFyIHBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnM7XG4gICAgdmFyIHBvaW50ZXJzTGVuZ3RoID0gcG9pbnRlcnMubGVuZ3RoO1xuXG4gICAgLy8gc3RvcmUgdGhlIGZpcnN0IGlucHV0IHRvIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYW5kIGRpcmVjdGlvblxuICAgIGlmICghc2Vzc2lvbi5maXJzdElucHV0KSB7XG4gICAgICAgIHNlc3Npb24uZmlyc3RJbnB1dCA9IHNpbXBsZUNsb25lSW5wdXREYXRhKGlucHV0KTtcbiAgICB9XG5cbiAgICAvLyB0byBjb21wdXRlIHNjYWxlIGFuZCByb3RhdGlvbiB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBtdWx0aXBsZSB0b3VjaGVzXG4gICAgaWYgKHBvaW50ZXJzTGVuZ3RoID4gMSAmJiAhc2Vzc2lvbi5maXJzdE11bHRpcGxlKSB7XG4gICAgICAgIHNlc3Npb24uZmlyc3RNdWx0aXBsZSA9IHNpbXBsZUNsb25lSW5wdXREYXRhKGlucHV0KTtcbiAgICB9IGVsc2UgaWYgKHBvaW50ZXJzTGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHNlc3Npb24uZmlyc3RNdWx0aXBsZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBmaXJzdElucHV0ID0gc2Vzc2lvbi5maXJzdElucHV0O1xuICAgIHZhciBmaXJzdE11bHRpcGxlID0gc2Vzc2lvbi5maXJzdE11bHRpcGxlO1xuICAgIHZhciBvZmZzZXRDZW50ZXIgPSBmaXJzdE11bHRpcGxlID8gZmlyc3RNdWx0aXBsZS5jZW50ZXIgOiBmaXJzdElucHV0LmNlbnRlcjtcblxuICAgIHZhciBjZW50ZXIgPSBpbnB1dC5jZW50ZXIgPSBnZXRDZW50ZXIocG9pbnRlcnMpO1xuICAgIGlucHV0LnRpbWVTdGFtcCA9IG5vdygpO1xuICAgIGlucHV0LmRlbHRhVGltZSA9IGlucHV0LnRpbWVTdGFtcCAtIGZpcnN0SW5wdXQudGltZVN0YW1wO1xuXG4gICAgaW5wdXQuYW5nbGUgPSBnZXRBbmdsZShvZmZzZXRDZW50ZXIsIGNlbnRlcik7XG4gICAgaW5wdXQuZGlzdGFuY2UgPSBnZXREaXN0YW5jZShvZmZzZXRDZW50ZXIsIGNlbnRlcik7XG5cbiAgICBjb21wdXRlRGVsdGFYWShzZXNzaW9uLCBpbnB1dCk7XG4gICAgaW5wdXQub2Zmc2V0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKGlucHV0LmRlbHRhWCwgaW5wdXQuZGVsdGFZKTtcblxuICAgIHZhciBvdmVyYWxsVmVsb2NpdHkgPSBnZXRWZWxvY2l0eShpbnB1dC5kZWx0YVRpbWUsIGlucHV0LmRlbHRhWCwgaW5wdXQuZGVsdGFZKTtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHlYID0gb3ZlcmFsbFZlbG9jaXR5Lng7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5WSA9IG92ZXJhbGxWZWxvY2l0eS55O1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eSA9IChhYnMob3ZlcmFsbFZlbG9jaXR5LngpID4gYWJzKG92ZXJhbGxWZWxvY2l0eS55KSkgPyBvdmVyYWxsVmVsb2NpdHkueCA6IG92ZXJhbGxWZWxvY2l0eS55O1xuXG4gICAgaW5wdXQuc2NhbGUgPSBmaXJzdE11bHRpcGxlID8gZ2V0U2NhbGUoZmlyc3RNdWx0aXBsZS5wb2ludGVycywgcG9pbnRlcnMpIDogMTtcbiAgICBpbnB1dC5yb3RhdGlvbiA9IGZpcnN0TXVsdGlwbGUgPyBnZXRSb3RhdGlvbihmaXJzdE11bHRpcGxlLnBvaW50ZXJzLCBwb2ludGVycykgOiAwO1xuXG4gICAgaW5wdXQubWF4UG9pbnRlcnMgPSAhc2Vzc2lvbi5wcmV2SW5wdXQgPyBpbnB1dC5wb2ludGVycy5sZW5ndGggOiAoKGlucHV0LnBvaW50ZXJzLmxlbmd0aCA+XG4gICAgICAgIHNlc3Npb24ucHJldklucHV0Lm1heFBvaW50ZXJzKSA/IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA6IHNlc3Npb24ucHJldklucHV0Lm1heFBvaW50ZXJzKTtcblxuICAgIGNvbXB1dGVJbnRlcnZhbElucHV0RGF0YShzZXNzaW9uLCBpbnB1dCk7XG5cbiAgICAvLyBmaW5kIHRoZSBjb3JyZWN0IHRhcmdldFxuICAgIHZhciB0YXJnZXQgPSBtYW5hZ2VyLmVsZW1lbnQ7XG4gICAgaWYgKGhhc1BhcmVudChpbnB1dC5zcmNFdmVudC50YXJnZXQsIHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gaW5wdXQuc3JjRXZlbnQudGFyZ2V0O1xuICAgIH1cbiAgICBpbnB1dC50YXJnZXQgPSB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVEZWx0YVhZKHNlc3Npb24sIGlucHV0KSB7XG4gICAgdmFyIGNlbnRlciA9IGlucHV0LmNlbnRlcjtcbiAgICB2YXIgb2Zmc2V0ID0gc2Vzc2lvbi5vZmZzZXREZWx0YSB8fCB7fTtcbiAgICB2YXIgcHJldkRlbHRhID0gc2Vzc2lvbi5wcmV2RGVsdGEgfHwge307XG4gICAgdmFyIHByZXZJbnB1dCA9IHNlc3Npb24ucHJldklucHV0IHx8IHt9O1xuXG4gICAgaWYgKGlucHV0LmV2ZW50VHlwZSA9PT0gSU5QVVRfU1RBUlQgfHwgcHJldklucHV0LmV2ZW50VHlwZSA9PT0gSU5QVVRfRU5EKSB7XG4gICAgICAgIHByZXZEZWx0YSA9IHNlc3Npb24ucHJldkRlbHRhID0ge1xuICAgICAgICAgICAgeDogcHJldklucHV0LmRlbHRhWCB8fCAwLFxuICAgICAgICAgICAgeTogcHJldklucHV0LmRlbHRhWSB8fCAwXG4gICAgICAgIH07XG5cbiAgICAgICAgb2Zmc2V0ID0gc2Vzc2lvbi5vZmZzZXREZWx0YSA9IHtcbiAgICAgICAgICAgIHg6IGNlbnRlci54LFxuICAgICAgICAgICAgeTogY2VudGVyLnlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpbnB1dC5kZWx0YVggPSBwcmV2RGVsdGEueCArIChjZW50ZXIueCAtIG9mZnNldC54KTtcbiAgICBpbnB1dC5kZWx0YVkgPSBwcmV2RGVsdGEueSArIChjZW50ZXIueSAtIG9mZnNldC55KTtcbn1cblxuLyoqXG4gKiB2ZWxvY2l0eSBpcyBjYWxjdWxhdGVkIGV2ZXJ5IHggbXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXNzaW9uXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUludGVydmFsSW5wdXREYXRhKHNlc3Npb24sIGlucHV0KSB7XG4gICAgdmFyIGxhc3QgPSBzZXNzaW9uLmxhc3RJbnRlcnZhbCB8fCBpbnB1dCxcbiAgICAgICAgZGVsdGFUaW1lID0gaW5wdXQudGltZVN0YW1wIC0gbGFzdC50aW1lU3RhbXAsXG4gICAgICAgIHZlbG9jaXR5LCB2ZWxvY2l0eVgsIHZlbG9jaXR5WSwgZGlyZWN0aW9uO1xuXG4gICAgaWYgKGlucHV0LmV2ZW50VHlwZSAhPSBJTlBVVF9DQU5DRUwgJiYgKGRlbHRhVGltZSA+IENPTVBVVEVfSU5URVJWQUwgfHwgbGFzdC52ZWxvY2l0eSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB2YXIgZGVsdGFYID0gaW5wdXQuZGVsdGFYIC0gbGFzdC5kZWx0YVg7XG4gICAgICAgIHZhciBkZWx0YVkgPSBpbnB1dC5kZWx0YVkgLSBsYXN0LmRlbHRhWTtcblxuICAgICAgICB2YXIgdiA9IGdldFZlbG9jaXR5KGRlbHRhVGltZSwgZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICB2ZWxvY2l0eVggPSB2Lng7XG4gICAgICAgIHZlbG9jaXR5WSA9IHYueTtcbiAgICAgICAgdmVsb2NpdHkgPSAoYWJzKHYueCkgPiBhYnModi55KSkgPyB2LnggOiB2Lnk7XG4gICAgICAgIGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG5cbiAgICAgICAgc2Vzc2lvbi5sYXN0SW50ZXJ2YWwgPSBpbnB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1c2UgbGF0ZXN0IHZlbG9jaXR5IGluZm8gaWYgaXQgZG9lc24ndCBvdmVydGFrZSBhIG1pbmltdW0gcGVyaW9kXG4gICAgICAgIHZlbG9jaXR5ID0gbGFzdC52ZWxvY2l0eTtcbiAgICAgICAgdmVsb2NpdHlYID0gbGFzdC52ZWxvY2l0eVg7XG4gICAgICAgIHZlbG9jaXR5WSA9IGxhc3QudmVsb2NpdHlZO1xuICAgICAgICBkaXJlY3Rpb24gPSBsYXN0LmRpcmVjdGlvbjtcbiAgICB9XG5cbiAgICBpbnB1dC52ZWxvY2l0eSA9IHZlbG9jaXR5O1xuICAgIGlucHV0LnZlbG9jaXR5WCA9IHZlbG9jaXR5WDtcbiAgICBpbnB1dC52ZWxvY2l0eVkgPSB2ZWxvY2l0eVk7XG4gICAgaW5wdXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xufVxuXG4vKipcbiAqIGNyZWF0ZSBhIHNpbXBsZSBjbG9uZSBmcm9tIHRoZSBpbnB1dCB1c2VkIGZvciBzdG9yYWdlIG9mIGZpcnN0SW5wdXQgYW5kIGZpcnN0TXVsdGlwbGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICogQHJldHVybnMge09iamVjdH0gY2xvbmVkSW5wdXREYXRhXG4gKi9cbmZ1bmN0aW9uIHNpbXBsZUNsb25lSW5wdXREYXRhKGlucHV0KSB7XG4gICAgLy8gbWFrZSBhIHNpbXBsZSBjb3B5IG9mIHRoZSBwb2ludGVycyBiZWNhdXNlIHdlIHdpbGwgZ2V0IGEgcmVmZXJlbmNlIGlmIHdlIGRvbid0XG4gICAgLy8gd2Ugb25seSBuZWVkIGNsaWVudFhZIGZvciB0aGUgY2FsY3VsYXRpb25zXG4gICAgdmFyIHBvaW50ZXJzID0gW107XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgaW5wdXQucG9pbnRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHBvaW50ZXJzW2ldID0ge1xuICAgICAgICAgICAgY2xpZW50WDogcm91bmQoaW5wdXQucG9pbnRlcnNbaV0uY2xpZW50WCksXG4gICAgICAgICAgICBjbGllbnRZOiByb3VuZChpbnB1dC5wb2ludGVyc1tpXS5jbGllbnRZKVxuICAgICAgICB9O1xuICAgICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGltZVN0YW1wOiBub3coKSxcbiAgICAgICAgcG9pbnRlcnM6IHBvaW50ZXJzLFxuICAgICAgICBjZW50ZXI6IGdldENlbnRlcihwb2ludGVycyksXG4gICAgICAgIGRlbHRhWDogaW5wdXQuZGVsdGFYLFxuICAgICAgICBkZWx0YVk6IGlucHV0LmRlbHRhWVxuICAgIH07XG59XG5cbi8qKlxuICogZ2V0IHRoZSBjZW50ZXIgb2YgYWxsIHRoZSBwb2ludGVyc1xuICogQHBhcmFtIHtBcnJheX0gcG9pbnRlcnNcbiAqIEByZXR1cm4ge09iamVjdH0gY2VudGVyIGNvbnRhaW5zIGB4YCBhbmQgYHlgIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gZ2V0Q2VudGVyKHBvaW50ZXJzKSB7XG4gICAgdmFyIHBvaW50ZXJzTGVuZ3RoID0gcG9pbnRlcnMubGVuZ3RoO1xuXG4gICAgLy8gbm8gbmVlZCB0byBsb29wIHdoZW4gb25seSBvbmUgdG91Y2hcbiAgICBpZiAocG9pbnRlcnNMZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHJvdW5kKHBvaW50ZXJzWzBdLmNsaWVudFgpLFxuICAgICAgICAgICAgeTogcm91bmQocG9pbnRlcnNbMF0uY2xpZW50WSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IDAsIHkgPSAwLCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IHBvaW50ZXJzTGVuZ3RoKSB7XG4gICAgICAgIHggKz0gcG9pbnRlcnNbaV0uY2xpZW50WDtcbiAgICAgICAgeSArPSBwb2ludGVyc1tpXS5jbGllbnRZO1xuICAgICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcm91bmQoeCAvIHBvaW50ZXJzTGVuZ3RoKSxcbiAgICAgICAgeTogcm91bmQoeSAvIHBvaW50ZXJzTGVuZ3RoKVxuICAgIH07XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSB2ZWxvY2l0eSBiZXR3ZWVuIHR3byBwb2ludHMuIHVuaXQgaXMgaW4gcHggcGVyIG1zLlxuICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhVGltZVxuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiBAcmV0dXJuIHtPYmplY3R9IHZlbG9jaXR5IGB4YCBhbmQgYHlgXG4gKi9cbmZ1bmN0aW9uIGdldFZlbG9jaXR5KGRlbHRhVGltZSwgeCwgeSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHggLyBkZWx0YVRpbWUgfHwgMCxcbiAgICAgICAgeTogeSAvIGRlbHRhVGltZSB8fCAwXG4gICAgfTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGRpcmVjdGlvbiBiZXR3ZWVuIHR3byBwb2ludHNcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcGFyYW0ge051bWJlcn0geVxuICogQHJldHVybiB7TnVtYmVyfSBkaXJlY3Rpb25cbiAqL1xuZnVuY3Rpb24gZ2V0RGlyZWN0aW9uKHgsIHkpIHtcbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgICByZXR1cm4gRElSRUNUSU9OX05PTkU7XG4gICAgfVxuXG4gICAgaWYgKGFicyh4KSA+PSBhYnMoeSkpIHtcbiAgICAgICAgcmV0dXJuIHggPCAwID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgfVxuICAgIHJldHVybiB5IDwgMCA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xufVxuXG4vKipcbiAqIGNhbGN1bGF0ZSB0aGUgYWJzb2x1dGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gcDEge3gsIHl9XG4gKiBAcGFyYW0ge09iamVjdH0gcDIge3gsIHl9XG4gKiBAcGFyYW0ge0FycmF5fSBbcHJvcHNdIGNvbnRhaW5pbmcgeCBhbmQgeSBrZXlzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGdldERpc3RhbmNlKHAxLCBwMiwgcHJvcHMpIHtcbiAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgIHByb3BzID0gUFJPUFNfWFk7XG4gICAgfVxuICAgIHZhciB4ID0gcDJbcHJvcHNbMF1dIC0gcDFbcHJvcHNbMF1dLFxuICAgICAgICB5ID0gcDJbcHJvcHNbMV1dIC0gcDFbcHJvcHNbMV1dO1xuXG4gICAgcmV0dXJuIE1hdGguc3FydCgoeCAqIHgpICsgKHkgKiB5KSk7XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSBhbmdsZSBiZXR3ZWVuIHR3byBjb29yZGluYXRlc1xuICogQHBhcmFtIHtPYmplY3R9IHAxXG4gKiBAcGFyYW0ge09iamVjdH0gcDJcbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wc10gY29udGFpbmluZyB4IGFuZCB5IGtleXNcbiAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAqL1xuZnVuY3Rpb24gZ2V0QW5nbGUocDEsIHAyLCBwcm9wcykge1xuICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBQUk9QU19YWTtcbiAgICB9XG4gICAgdmFyIHggPSBwMltwcm9wc1swXV0gLSBwMVtwcm9wc1swXV0sXG4gICAgICAgIHkgPSBwMltwcm9wc1sxXV0gLSBwMVtwcm9wc1sxXV07XG4gICAgcmV0dXJuIE1hdGguYXRhbjIoeSwgeCkgKiAxODAgLyBNYXRoLlBJO1xufVxuXG4vKipcbiAqIGNhbGN1bGF0ZSB0aGUgcm90YXRpb24gZGVncmVlcyBiZXR3ZWVuIHR3byBwb2ludGVyc2V0c1xuICogQHBhcmFtIHtBcnJheX0gc3RhcnQgYXJyYXkgb2YgcG9pbnRlcnNcbiAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICogQHJldHVybiB7TnVtYmVyfSByb3RhdGlvblxuICovXG5mdW5jdGlvbiBnZXRSb3RhdGlvbihzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIGdldEFuZ2xlKGVuZFsxXSwgZW5kWzBdLCBQUk9QU19DTElFTlRfWFkpICsgZ2V0QW5nbGUoc3RhcnRbMV0sIHN0YXJ0WzBdLCBQUk9QU19DTElFTlRfWFkpO1xufVxuXG4vKipcbiAqIGNhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9yIGJldHdlZW4gdHdvIHBvaW50ZXJzZXRzXG4gKiBubyBzY2FsZSBpcyAxLCBhbmQgZ29lcyBkb3duIHRvIDAgd2hlbiBwaW5jaGVkIHRvZ2V0aGVyLCBhbmQgYmlnZ2VyIHdoZW4gcGluY2hlZCBvdXRcbiAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBlbmQgYXJyYXkgb2YgcG9pbnRlcnNcbiAqIEByZXR1cm4ge051bWJlcn0gc2NhbGVcbiAqL1xuZnVuY3Rpb24gZ2V0U2NhbGUoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShlbmRbMF0sIGVuZFsxXSwgUFJPUFNfQ0xJRU5UX1hZKSAvIGdldERpc3RhbmNlKHN0YXJ0WzBdLCBzdGFydFsxXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbn1cblxudmFyIE1PVVNFX0lOUFVUX01BUCA9IHtcbiAgICBtb3VzZWRvd246IElOUFVUX1NUQVJULFxuICAgIG1vdXNlbW92ZTogSU5QVVRfTU9WRSxcbiAgICBtb3VzZXVwOiBJTlBVVF9FTkRcbn07XG5cbnZhciBNT1VTRV9FTEVNRU5UX0VWRU5UUyA9ICdtb3VzZWRvd24nO1xudmFyIE1PVVNFX1dJTkRPV19FVkVOVFMgPSAnbW91c2Vtb3ZlIG1vdXNldXAnO1xuXG4vKipcbiAqIE1vdXNlIGV2ZW50cyBpbnB1dFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5mdW5jdGlvbiBNb3VzZUlucHV0KCkge1xuICAgIHRoaXMuZXZFbCA9IE1PVVNFX0VMRU1FTlRfRVZFTlRTO1xuICAgIHRoaXMuZXZXaW4gPSBNT1VTRV9XSU5ET1dfRVZFTlRTO1xuXG4gICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7IC8vIG1vdXNlZG93biBzdGF0ZVxuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChNb3VzZUlucHV0LCBJbnB1dCwge1xuICAgIC8qKlxuICAgICAqIGhhbmRsZSBtb3VzZSBldmVudHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBNRWhhbmRsZXIoZXYpIHtcbiAgICAgICAgdmFyIGV2ZW50VHlwZSA9IE1PVVNFX0lOUFVUX01BUFtldi50eXBlXTtcblxuICAgICAgICAvLyBvbiBzdGFydCB3ZSB3YW50IHRvIGhhdmUgdGhlIGxlZnQgbW91c2UgYnV0dG9uIGRvd25cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIGV2LmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5wcmVzc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9NT1ZFICYmIGV2LndoaWNoICE9PSAxKSB7XG4gICAgICAgICAgICBldmVudFR5cGUgPSBJTlBVVF9FTkQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtb3VzZSBtdXN0IGJlIGRvd25cbiAgICAgICAgaWYgKCF0aGlzLnByZXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9FTkQpIHtcbiAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsIGV2ZW50VHlwZSwge1xuICAgICAgICAgICAgcG9pbnRlcnM6IFtldl0sXG4gICAgICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IFtldl0sXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogSU5QVVRfVFlQRV9NT1VTRSxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgICB9KTtcbiAgICB9XG59KTtcblxudmFyIFBPSU5URVJfSU5QVVRfTUFQID0ge1xuICAgIHBvaW50ZXJkb3duOiBJTlBVVF9TVEFSVCxcbiAgICBwb2ludGVybW92ZTogSU5QVVRfTU9WRSxcbiAgICBwb2ludGVydXA6IElOUFVUX0VORCxcbiAgICBwb2ludGVyY2FuY2VsOiBJTlBVVF9DQU5DRUwsXG4gICAgcG9pbnRlcm91dDogSU5QVVRfQ0FOQ0VMXG59O1xuXG4vLyBpbiBJRTEwIHRoZSBwb2ludGVyIHR5cGVzIGlzIGRlZmluZWQgYXMgYW4gZW51bVxudmFyIElFMTBfUE9JTlRFUl9UWVBFX0VOVU0gPSB7XG4gICAgMjogSU5QVVRfVFlQRV9UT1VDSCxcbiAgICAzOiBJTlBVVF9UWVBFX1BFTixcbiAgICA0OiBJTlBVVF9UWVBFX01PVVNFLFxuICAgIDU6IElOUFVUX1RZUEVfS0lORUNUIC8vIHNlZSBodHRwczovL3R3aXR0ZXIuY29tL2phY29icm9zc2kvc3RhdHVzLzQ4MDU5NjQzODQ4OTg5MDgxNlxufTtcblxudmFyIFBPSU5URVJfRUxFTUVOVF9FVkVOVFMgPSAncG9pbnRlcmRvd24nO1xudmFyIFBPSU5URVJfV0lORE9XX0VWRU5UUyA9ICdwb2ludGVybW92ZSBwb2ludGVydXAgcG9pbnRlcmNhbmNlbCc7XG5cbi8vIElFMTAgaGFzIHByZWZpeGVkIHN1cHBvcnQsIGFuZCBjYXNlLXNlbnNpdGl2ZVxuaWYgKHdpbmRvdy5NU1BvaW50ZXJFdmVudCAmJiAhd2luZG93LlBvaW50ZXJFdmVudCkge1xuICAgIFBPSU5URVJfRUxFTUVOVF9FVkVOVFMgPSAnTVNQb2ludGVyRG93bic7XG4gICAgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ01TUG9pbnRlck1vdmUgTVNQb2ludGVyVXAgTVNQb2ludGVyQ2FuY2VsJztcbn1cblxuLyoqXG4gKiBQb2ludGVyIGV2ZW50cyBpbnB1dFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5mdW5jdGlvbiBQb2ludGVyRXZlbnRJbnB1dCgpIHtcbiAgICB0aGlzLmV2RWwgPSBQT0lOVEVSX0VMRU1FTlRfRVZFTlRTO1xuICAgIHRoaXMuZXZXaW4gPSBQT0lOVEVSX1dJTkRPV19FVkVOVFM7XG5cbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5zdG9yZSA9ICh0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wb2ludGVyRXZlbnRzID0gW10pO1xufVxuXG5pbmhlcml0KFBvaW50ZXJFdmVudElucHV0LCBJbnB1dCwge1xuICAgIC8qKlxuICAgICAqIGhhbmRsZSBtb3VzZSBldmVudHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBQRWhhbmRsZXIoZXYpIHtcbiAgICAgICAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZTtcbiAgICAgICAgdmFyIHJlbW92ZVBvaW50ZXIgPSBmYWxzZTtcblxuICAgICAgICB2YXIgZXZlbnRUeXBlTm9ybWFsaXplZCA9IGV2LnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdtcycsICcnKTtcbiAgICAgICAgdmFyIGV2ZW50VHlwZSA9IFBPSU5URVJfSU5QVVRfTUFQW2V2ZW50VHlwZU5vcm1hbGl6ZWRdO1xuICAgICAgICB2YXIgcG9pbnRlclR5cGUgPSBJRTEwX1BPSU5URVJfVFlQRV9FTlVNW2V2LnBvaW50ZXJUeXBlXSB8fCBldi5wb2ludGVyVHlwZTtcblxuICAgICAgICB2YXIgaXNUb3VjaCA9IChwb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX1RPVUNIKTtcblxuICAgICAgICAvLyBnZXQgaW5kZXggb2YgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuICAgICAgICB2YXIgc3RvcmVJbmRleCA9IGluQXJyYXkoc3RvcmUsIGV2LnBvaW50ZXJJZCwgJ3BvaW50ZXJJZCcpO1xuXG4gICAgICAgIC8vIHN0YXJ0IGFuZCBtb3VzZSBtdXN0IGJlIGRvd25cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIChldi5idXR0b24gPT09IDAgfHwgaXNUb3VjaCkpIHtcbiAgICAgICAgICAgIGlmIChzdG9yZUluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgIHN0b3JlLnB1c2goZXYpO1xuICAgICAgICAgICAgICAgIHN0b3JlSW5kZXggPSBzdG9yZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgICAgICByZW1vdmVQb2ludGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGl0IG5vdCBmb3VuZCwgc28gdGhlIHBvaW50ZXIgaGFzbid0IGJlZW4gZG93biAoc28gaXQncyBwcm9iYWJseSBhIGhvdmVyKVxuICAgICAgICBpZiAoc3RvcmVJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgZXZlbnQgaW4gdGhlIHN0b3JlXG4gICAgICAgIHN0b3JlW3N0b3JlSW5kZXhdID0gZXY7XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsIGV2ZW50VHlwZSwge1xuICAgICAgICAgICAgcG9pbnRlcnM6IHN0b3JlLFxuICAgICAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6IHBvaW50ZXJUeXBlLFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZW1vdmVQb2ludGVyKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgZnJvbSB0aGUgc3RvcmVcbiAgICAgICAgICAgIHN0b3JlLnNwbGljZShzdG9yZUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG52YXIgU0lOR0xFX1RPVUNIX0lOUFVUX01BUCA9IHtcbiAgICB0b3VjaHN0YXJ0OiBJTlBVVF9TVEFSVCxcbiAgICB0b3VjaG1vdmU6IElOUFVUX01PVkUsXG4gICAgdG91Y2hlbmQ6IElOUFVUX0VORCxcbiAgICB0b3VjaGNhbmNlbDogSU5QVVRfQ0FOQ0VMXG59O1xuXG52YXIgU0lOR0xFX1RPVUNIX1RBUkdFVF9FVkVOVFMgPSAndG91Y2hzdGFydCc7XG52YXIgU0lOR0xFX1RPVUNIX1dJTkRPV19FVkVOVFMgPSAndG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwnO1xuXG4vKipcbiAqIFRvdWNoIGV2ZW50cyBpbnB1dFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5mdW5jdGlvbiBTaW5nbGVUb3VjaElucHV0KCkge1xuICAgIHRoaXMuZXZUYXJnZXQgPSBTSU5HTEVfVE9VQ0hfVEFSR0VUX0VWRU5UUztcbiAgICB0aGlzLmV2V2luID0gU0lOR0xFX1RPVUNIX1dJTkRPV19FVkVOVFM7XG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KFNpbmdsZVRvdWNoSW5wdXQsIElucHV0LCB7XG4gICAgaGFuZGxlcjogZnVuY3Rpb24gVEVoYW5kbGVyKGV2KSB7XG4gICAgICAgIHZhciB0eXBlID0gU0lOR0xFX1RPVUNIX0lOUFVUX01BUFtldi50eXBlXTtcblxuICAgICAgICAvLyBzaG91bGQgd2UgaGFuZGxlIHRoZSB0b3VjaCBldmVudHM/XG4gICAgICAgIGlmICh0eXBlID09PSBJTlBVVF9TVEFSVCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG91Y2hlcyA9IG5vcm1hbGl6ZVNpbmdsZVRvdWNoZXMuY2FsbCh0aGlzLCBldiwgdHlwZSk7XG5cbiAgICAgICAgLy8gd2hlbiBkb25lLCByZXNldCB0aGUgc3RhcnRlZCBzdGF0ZVxuICAgICAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmIHRvdWNoZXNbMF0ubGVuZ3RoIC0gdG91Y2hlc1sxXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsIHR5cGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiB0b3VjaGVzWzBdLFxuICAgICAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiB0b3VjaGVzWzFdLFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6IElOUFVUX1RZUEVfVE9VQ0gsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogQHRoaXMge1RvdWNoSW5wdXR9XG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eXBlIGZsYWdcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR8QXJyYXl9IFthbGwsIGNoYW5nZWRdXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNpbmdsZVRvdWNoZXMoZXYsIHR5cGUpIHtcbiAgICB2YXIgYWxsID0gdG9BcnJheShldi50b3VjaGVzKTtcbiAgICB2YXIgY2hhbmdlZCA9IHRvQXJyYXkoZXYuY2hhbmdlZFRvdWNoZXMpO1xuXG4gICAgaWYgKHR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICBhbGwgPSB1bmlxdWVBcnJheShhbGwuY29uY2F0KGNoYW5nZWQpLCAnaWRlbnRpZmllcicsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBbYWxsLCBjaGFuZ2VkXTtcbn1cblxudmFyIFRPVUNIX0lOUFVUX01BUCA9IHtcbiAgICB0b3VjaHN0YXJ0OiBJTlBVVF9TVEFSVCxcbiAgICB0b3VjaG1vdmU6IElOUFVUX01PVkUsXG4gICAgdG91Y2hlbmQ6IElOUFVUX0VORCxcbiAgICB0b3VjaGNhbmNlbDogSU5QVVRfQ0FOQ0VMXG59O1xuXG52YXIgVE9VQ0hfVEFSR0VUX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG5cbi8qKlxuICogTXVsdGktdXNlciB0b3VjaCBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuZnVuY3Rpb24gVG91Y2hJbnB1dCgpIHtcbiAgICB0aGlzLmV2VGFyZ2V0ID0gVE9VQ0hfVEFSR0VUX0VWRU5UUztcbiAgICB0aGlzLnRhcmdldElkcyA9IHt9O1xuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChUb3VjaElucHV0LCBJbnB1dCwge1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIE1URWhhbmRsZXIoZXYpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBUT1VDSF9JTlBVVF9NQVBbZXYudHlwZV07XG4gICAgICAgIHZhciB0b3VjaGVzID0gZ2V0VG91Y2hlcy5jYWxsKHRoaXMsIGV2LCB0eXBlKTtcbiAgICAgICAgaWYgKCF0b3VjaGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgdHlwZSwge1xuICAgICAgICAgICAgcG9pbnRlcnM6IHRvdWNoZXNbMF0sXG4gICAgICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogSU5QVVRfVFlQRV9UT1VDSCxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgICB9KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICogQHBhcmFtIHtOdW1iZXJ9IHR5cGUgZmxhZ1xuICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAqL1xuZnVuY3Rpb24gZ2V0VG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGxUb3VjaGVzID0gdG9BcnJheShldi50b3VjaGVzKTtcbiAgICB2YXIgdGFyZ2V0SWRzID0gdGhpcy50YXJnZXRJZHM7XG5cbiAgICAvLyB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIHRvdWNoLCB0aGUgcHJvY2VzcyBjYW4gYmUgc2ltcGxpZmllZFxuICAgIGlmICh0eXBlICYgKElOUFVUX1NUQVJUIHwgSU5QVVRfTU9WRSkgJiYgYWxsVG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdGFyZ2V0SWRzW2FsbFRvdWNoZXNbMF0uaWRlbnRpZmllcl0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gW2FsbFRvdWNoZXMsIGFsbFRvdWNoZXNdO1xuICAgIH1cblxuICAgIHZhciBpLFxuICAgICAgICB0YXJnZXRUb3VjaGVzLFxuICAgICAgICBjaGFuZ2VkVG91Y2hlcyA9IHRvQXJyYXkoZXYuY2hhbmdlZFRvdWNoZXMpLFxuICAgICAgICBjaGFuZ2VkVGFyZ2V0VG91Y2hlcyA9IFtdLFxuICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldDtcblxuICAgIC8vIGdldCB0YXJnZXQgdG91Y2hlcyBmcm9tIHRvdWNoZXNcbiAgICB0YXJnZXRUb3VjaGVzID0gYWxsVG91Y2hlcy5maWx0ZXIoZnVuY3Rpb24odG91Y2gpIHtcbiAgICAgICAgcmV0dXJuIGhhc1BhcmVudCh0b3VjaC50YXJnZXQsIHRhcmdldCk7XG4gICAgfSk7XG5cbiAgICAvLyBjb2xsZWN0IHRvdWNoZXNcbiAgICBpZiAodHlwZSA9PT0gSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgdGFyZ2V0VG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRhcmdldElkc1t0YXJnZXRUb3VjaGVzW2ldLmlkZW50aWZpZXJdID0gdHJ1ZTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZpbHRlciBjaGFuZ2VkIHRvdWNoZXMgdG8gb25seSBjb250YWluIHRvdWNoZXMgdGhhdCBleGlzdCBpbiB0aGUgY29sbGVjdGVkIHRhcmdldCBpZHNcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGNoYW5nZWRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodGFyZ2V0SWRzW2NoYW5nZWRUb3VjaGVzW2ldLmlkZW50aWZpZXJdKSB7XG4gICAgICAgICAgICBjaGFuZ2VkVGFyZ2V0VG91Y2hlcy5wdXNoKGNoYW5nZWRUb3VjaGVzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFudXAgcmVtb3ZlZCB0b3VjaGVzXG4gICAgICAgIGlmICh0eXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXRJZHNbY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllcl07XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmICghY2hhbmdlZFRhcmdldFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAgICAvLyBtZXJnZSB0YXJnZXRUb3VjaGVzIHdpdGggY2hhbmdlZFRhcmdldFRvdWNoZXMgc28gaXQgY29udGFpbnMgQUxMIHRvdWNoZXMsIGluY2x1ZGluZyAnZW5kJyBhbmQgJ2NhbmNlbCdcbiAgICAgICAgdW5pcXVlQXJyYXkodGFyZ2V0VG91Y2hlcy5jb25jYXQoY2hhbmdlZFRhcmdldFRvdWNoZXMpLCAnaWRlbnRpZmllcicsIHRydWUpLFxuICAgICAgICBjaGFuZ2VkVGFyZ2V0VG91Y2hlc1xuICAgIF07XG59XG5cbi8qKlxuICogQ29tYmluZWQgdG91Y2ggYW5kIG1vdXNlIGlucHV0XG4gKlxuICogVG91Y2ggaGFzIGEgaGlnaGVyIHByaW9yaXR5IHRoZW4gbW91c2UsIGFuZCB3aGlsZSB0b3VjaGluZyBubyBtb3VzZSBldmVudHMgYXJlIGFsbG93ZWQuXG4gKiBUaGlzIGJlY2F1c2UgdG91Y2ggZGV2aWNlcyBhbHNvIGVtaXQgbW91c2UgZXZlbnRzIHdoaWxlIGRvaW5nIGEgdG91Y2guXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5cbnZhciBERURVUF9USU1FT1VUID0gMjUwMDtcbnZhciBERURVUF9ESVNUQU5DRSA9IDI1O1xuXG5mdW5jdGlvbiBUb3VjaE1vdXNlSW5wdXQoKSB7XG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHZhciBoYW5kbGVyID0gYmluZEZuKHRoaXMuaGFuZGxlciwgdGhpcyk7XG4gICAgdGhpcy50b3VjaCA9IG5ldyBUb3VjaElucHV0KHRoaXMubWFuYWdlciwgaGFuZGxlcik7XG4gICAgdGhpcy5tb3VzZSA9IG5ldyBNb3VzZUlucHV0KHRoaXMubWFuYWdlciwgaGFuZGxlcik7XG5cbiAgICB0aGlzLnByaW1hcnlUb3VjaCA9IG51bGw7XG4gICAgdGhpcy5sYXN0VG91Y2hlcyA9IFtdO1xufVxuXG5pbmhlcml0KFRvdWNoTW91c2VJbnB1dCwgSW5wdXQsIHtcbiAgICAvKipcbiAgICAgKiBoYW5kbGUgbW91c2UgYW5kIHRvdWNoIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7SGFtbWVyfSBtYW5hZ2VyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGlucHV0RXZlbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gVE1FaGFuZGxlcihtYW5hZ2VyLCBpbnB1dEV2ZW50LCBpbnB1dERhdGEpIHtcbiAgICAgICAgdmFyIGlzVG91Y2ggPSAoaW5wdXREYXRhLnBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfVE9VQ0gpLFxuICAgICAgICAgICAgaXNNb3VzZSA9IChpbnB1dERhdGEucG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9NT1VTRSk7XG5cbiAgICAgICAgaWYgKGlzTW91c2UgJiYgaW5wdXREYXRhLnNvdXJjZUNhcGFiaWxpdGllcyAmJiBpbnB1dERhdGEuc291cmNlQ2FwYWJpbGl0aWVzLmZpcmVzVG91Y2hFdmVudHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gd2UncmUgaW4gYSB0b3VjaCBldmVudCwgcmVjb3JkIHRvdWNoZXMgdG8gIGRlLWR1cGUgc3ludGhldGljIG1vdXNlIGV2ZW50XG4gICAgICAgIGlmIChpc1RvdWNoKSB7XG4gICAgICAgICAgICByZWNvcmRUb3VjaGVzLmNhbGwodGhpcywgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc01vdXNlICYmIGlzU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBpbnB1dERhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrKG1hbmFnZXIsIGlucHV0RXZlbnQsIGlucHV0RGF0YSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSB0aGUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICovXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy50b3VjaC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMubW91c2UuZGVzdHJveSgpO1xuICAgIH1cbn0pO1xuXG5mdW5jdGlvbiByZWNvcmRUb3VjaGVzKGV2ZW50VHlwZSwgZXZlbnREYXRhKSB7XG4gICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX1NUQVJUKSB7XG4gICAgICAgIHRoaXMucHJpbWFyeVRvdWNoID0gZXZlbnREYXRhLmNoYW5nZWRQb2ludGVyc1swXS5pZGVudGlmaWVyO1xuICAgICAgICBzZXRMYXN0VG91Y2guY2FsbCh0aGlzLCBldmVudERhdGEpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkpIHtcbiAgICAgICAgc2V0TGFzdFRvdWNoLmNhbGwodGhpcywgZXZlbnREYXRhKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldExhc3RUb3VjaChldmVudERhdGEpIHtcbiAgICB2YXIgdG91Y2ggPSBldmVudERhdGEuY2hhbmdlZFBvaW50ZXJzWzBdO1xuXG4gICAgaWYgKHRvdWNoLmlkZW50aWZpZXIgPT09IHRoaXMucHJpbWFyeVRvdWNoKSB7XG4gICAgICAgIHZhciBsYXN0VG91Y2ggPSB7eDogdG91Y2guY2xpZW50WCwgeTogdG91Y2guY2xpZW50WX07XG4gICAgICAgIHRoaXMubGFzdFRvdWNoZXMucHVzaChsYXN0VG91Y2gpO1xuICAgICAgICB2YXIgbHRzID0gdGhpcy5sYXN0VG91Y2hlcztcbiAgICAgICAgdmFyIHJlbW92ZUxhc3RUb3VjaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGkgPSBsdHMuaW5kZXhPZihsYXN0VG91Y2gpO1xuICAgICAgICAgICAgaWYgKGkgPiAtMSkge1xuICAgICAgICAgICAgICAgIGx0cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNldFRpbWVvdXQocmVtb3ZlTGFzdFRvdWNoLCBERURVUF9USU1FT1VUKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzU3ludGhldGljRXZlbnQoZXZlbnREYXRhKSB7XG4gICAgdmFyIHggPSBldmVudERhdGEuc3JjRXZlbnQuY2xpZW50WCwgeSA9IGV2ZW50RGF0YS5zcmNFdmVudC5jbGllbnRZO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sYXN0VG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdCA9IHRoaXMubGFzdFRvdWNoZXNbaV07XG4gICAgICAgIHZhciBkeCA9IE1hdGguYWJzKHggLSB0LngpLCBkeSA9IE1hdGguYWJzKHkgLSB0LnkpO1xuICAgICAgICBpZiAoZHggPD0gREVEVVBfRElTVEFOQ0UgJiYgZHkgPD0gREVEVVBfRElTVEFOQ0UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIFBSRUZJWEVEX1RPVUNIX0FDVElPTiA9IHByZWZpeGVkKFRFU1RfRUxFTUVOVC5zdHlsZSwgJ3RvdWNoQWN0aW9uJyk7XG52YXIgTkFUSVZFX1RPVUNIX0FDVElPTiA9IFBSRUZJWEVEX1RPVUNIX0FDVElPTiAhPT0gdW5kZWZpbmVkO1xuXG4vLyBtYWdpY2FsIHRvdWNoQWN0aW9uIHZhbHVlXG52YXIgVE9VQ0hfQUNUSU9OX0NPTVBVVEUgPSAnY29tcHV0ZSc7XG52YXIgVE9VQ0hfQUNUSU9OX0FVVE8gPSAnYXV0byc7XG52YXIgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTiA9ICdtYW5pcHVsYXRpb24nOyAvLyBub3QgaW1wbGVtZW50ZWRcbnZhciBUT1VDSF9BQ1RJT05fTk9ORSA9ICdub25lJztcbnZhciBUT1VDSF9BQ1RJT05fUEFOX1ggPSAncGFuLXgnO1xudmFyIFRPVUNIX0FDVElPTl9QQU5fWSA9ICdwYW4teSc7XG52YXIgVE9VQ0hfQUNUSU9OX01BUCA9IGdldFRvdWNoQWN0aW9uUHJvcHMoKTtcblxuLyoqXG4gKiBUb3VjaCBBY3Rpb25cbiAqIHNldHMgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5IG9yIHVzZXMgdGhlIGpzIGFsdGVybmF0aXZlXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFRvdWNoQWN0aW9uKG1hbmFnZXIsIHZhbHVlKSB7XG4gICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjtcbiAgICB0aGlzLnNldCh2YWx1ZSk7XG59XG5cblRvdWNoQWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgdGhlIHRvdWNoQWN0aW9uIHZhbHVlIG9uIHRoZSBlbGVtZW50IG9yIGVuYWJsZSB0aGUgcG9seWZpbGxcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIC8vIGZpbmQgb3V0IHRoZSB0b3VjaC1hY3Rpb24gYnkgdGhlIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGlmICh2YWx1ZSA9PSBUT1VDSF9BQ1RJT05fQ09NUFVURSkge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNvbXB1dGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChOQVRJVkVfVE9VQ0hfQUNUSU9OICYmIHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlICYmIFRPVUNIX0FDVElPTl9NQVBbdmFsdWVdKSB7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZVtQUkVGSVhFRF9UT1VDSF9BQ1RJT05dID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3Rpb25zID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGp1c3QgcmUtc2V0IHRoZSB0b3VjaEFjdGlvbiB2YWx1ZVxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2V0KHRoaXMubWFuYWdlci5vcHRpb25zLnRvdWNoQWN0aW9uKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY29tcHV0ZSB0aGUgdmFsdWUgZm9yIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcmVjb2duaXplcidzIHNldHRpbmdzXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICBjb21wdXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICAgICAgZWFjaCh0aGlzLm1hbmFnZXIucmVjb2duaXplcnMsIGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgIGlmIChib29sT3JGbihyZWNvZ25pemVyLm9wdGlvbnMuZW5hYmxlLCBbcmVjb2duaXplcl0pKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9ucyA9IGFjdGlvbnMuY29uY2F0KHJlY29nbml6ZXIuZ2V0VG91Y2hBY3Rpb24oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2xlYW5Ub3VjaEFjdGlvbnMoYWN0aW9ucy5qb2luKCcgJykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gZWFjaCBpbnB1dCBjeWNsZSBhbmQgcHJvdmlkZXMgdGhlIHByZXZlbnRpbmcgb2YgdGhlIGJyb3dzZXIgYmVoYXZpb3JcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdHM6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBzcmNFdmVudCA9IGlucHV0LnNyY0V2ZW50O1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gaW5wdXQub2Zmc2V0RGlyZWN0aW9uO1xuXG4gICAgICAgIC8vIGlmIHRoZSB0b3VjaCBhY3Rpb24gZGlkIHByZXZlbnRlZCBvbmNlIHRoaXMgc2Vzc2lvblxuICAgICAgICBpZiAodGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkKSB7XG4gICAgICAgICAgICBzcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnM7XG4gICAgICAgIHZhciBoYXNOb25lID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX05PTkUpICYmICFUT1VDSF9BQ1RJT05fTUFQW1RPVUNIX0FDVElPTl9OT05FXTtcbiAgICAgICAgdmFyIGhhc1BhblkgPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1kpICYmICFUT1VDSF9BQ1RJT05fTUFQW1RPVUNIX0FDVElPTl9QQU5fWV07XG4gICAgICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fUEFOX1hdO1xuXG4gICAgICAgIGlmIChoYXNOb25lKSB7XG4gICAgICAgICAgICAvL2RvIG5vdCBwcmV2ZW50IGRlZmF1bHRzIGlmIHRoaXMgaXMgYSB0YXAgZ2VzdHVyZVxuXG4gICAgICAgICAgICB2YXIgaXNUYXBQb2ludGVyID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgdmFyIGlzVGFwTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IDI7XG4gICAgICAgICAgICB2YXIgaXNUYXBUb3VjaFRpbWUgPSBpbnB1dC5kZWx0YVRpbWUgPCAyNTA7XG5cbiAgICAgICAgICAgIGlmIChpc1RhcFBvaW50ZXIgJiYgaXNUYXBNb3ZlbWVudCAmJiBpc1RhcFRvdWNoVGltZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNQYW5YICYmIGhhc1BhblkpIHtcbiAgICAgICAgICAgIC8vIGBwYW4teCBwYW4teWAgbWVhbnMgYnJvd3NlciBoYW5kbGVzIGFsbCBzY3JvbGxpbmcvcGFubmluZywgZG8gbm90IHByZXZlbnRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNOb25lIHx8XG4gICAgICAgICAgICAoaGFzUGFuWSAmJiBkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkgfHxcbiAgICAgICAgICAgIChoYXNQYW5YICYmIGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXZlbnRTcmMoc3JjRXZlbnQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNhbGwgcHJldmVudERlZmF1bHQgdG8gcHJldmVudCB0aGUgYnJvd3NlcidzIGRlZmF1bHQgYmVoYXZpb3IgKHNjcm9sbGluZyBpbiBtb3N0IGNhc2VzKVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzcmNFdmVudFxuICAgICAqL1xuICAgIHByZXZlbnRTcmM6IGZ1bmN0aW9uKHNyY0V2ZW50KSB7XG4gICAgICAgIHRoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufTtcblxuLyoqXG4gKiB3aGVuIHRoZSB0b3VjaEFjdGlvbnMgYXJlIGNvbGxlY3RlZCB0aGV5IGFyZSBub3QgYSB2YWxpZCB2YWx1ZSwgc28gd2UgbmVlZCB0byBjbGVhbiB0aGluZ3MgdXAuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25zXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gY2xlYW5Ub3VjaEFjdGlvbnMoYWN0aW9ucykge1xuICAgIC8vIG5vbmVcbiAgICBpZiAoaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX05PTkUpKSB7XG4gICAgICAgIHJldHVybiBUT1VDSF9BQ1RJT05fTk9ORTtcbiAgICB9XG5cbiAgICB2YXIgaGFzUGFuWCA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWCk7XG4gICAgdmFyIGhhc1BhblkgPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1kpO1xuXG4gICAgLy8gaWYgYm90aCBwYW4teCBhbmQgcGFuLXkgYXJlIHNldCAoZGlmZmVyZW50IHJlY29nbml6ZXJzXG4gICAgLy8gZm9yIGRpZmZlcmVudCBkaXJlY3Rpb25zLCBlLmcuIGhvcml6b250YWwgcGFuIGJ1dCB2ZXJ0aWNhbCBzd2lwZT8pXG4gICAgLy8gd2UgbmVlZCBub25lIChhcyBvdGhlcndpc2Ugd2l0aCBwYW4teCBwYW4teSBjb21iaW5lZCBub25lIG9mIHRoZXNlXG4gICAgLy8gcmVjb2duaXplcnMgd2lsbCB3b3JrLCBzaW5jZSB0aGUgYnJvd3NlciB3b3VsZCBoYW5kbGUgYWxsIHBhbm5pbmdcbiAgICBpZiAoaGFzUGFuWCAmJiBoYXNQYW5ZKSB7XG4gICAgICAgIHJldHVybiBUT1VDSF9BQ1RJT05fTk9ORTtcbiAgICB9XG5cbiAgICAvLyBwYW4teCBPUiBwYW4teVxuICAgIGlmIChoYXNQYW5YIHx8IGhhc1BhblkpIHtcbiAgICAgICAgcmV0dXJuIGhhc1BhblggPyBUT1VDSF9BQ1RJT05fUEFOX1ggOiBUT1VDSF9BQ1RJT05fUEFOX1k7XG4gICAgfVxuXG4gICAgLy8gbWFuaXB1bGF0aW9uXG4gICAgaWYgKGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9NQU5JUFVMQVRJT04pKSB7XG4gICAgICAgIHJldHVybiBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OO1xuICAgIH1cblxuICAgIHJldHVybiBUT1VDSF9BQ1RJT05fQVVUTztcbn1cblxuZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb25Qcm9wcygpIHtcbiAgICBpZiAoIU5BVElWRV9UT1VDSF9BQ1RJT04pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgdG91Y2hNYXAgPSB7fTtcbiAgICB2YXIgY3NzU3VwcG9ydHMgPSB3aW5kb3cuQ1NTICYmIHdpbmRvdy5DU1Muc3VwcG9ydHM7XG4gICAgWydhdXRvJywgJ21hbmlwdWxhdGlvbicsICdwYW4teScsICdwYW4teCcsICdwYW4teCBwYW4teScsICdub25lJ10uZm9yRWFjaChmdW5jdGlvbih2YWwpIHtcblxuICAgICAgICAvLyBJZiBjc3Muc3VwcG9ydHMgaXMgbm90IHN1cHBvcnRlZCBidXQgdGhlcmUgaXMgbmF0aXZlIHRvdWNoLWFjdGlvbiBhc3N1bWUgaXQgc3VwcG9ydHNcbiAgICAgICAgLy8gYWxsIHZhbHVlcy4gVGhpcyBpcyB0aGUgY2FzZSBmb3IgSUUgMTAgYW5kIDExLlxuICAgICAgICB0b3VjaE1hcFt2YWxdID0gY3NzU3VwcG9ydHMgPyB3aW5kb3cuQ1NTLnN1cHBvcnRzKCd0b3VjaC1hY3Rpb24nLCB2YWwpIDogdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hNYXA7XG59XG5cbi8qKlxuICogUmVjb2duaXplciBmbG93IGV4cGxhaW5lZDsgKlxuICogQWxsIHJlY29nbml6ZXJzIGhhdmUgdGhlIGluaXRpYWwgc3RhdGUgb2YgUE9TU0lCTEUgd2hlbiBhIGlucHV0IHNlc3Npb24gc3RhcnRzLlxuICogVGhlIGRlZmluaXRpb24gb2YgYSBpbnB1dCBzZXNzaW9uIGlzIGZyb20gdGhlIGZpcnN0IGlucHV0IHVudGlsIHRoZSBsYXN0IGlucHV0LCB3aXRoIGFsbCBpdCdzIG1vdmVtZW50IGluIGl0LiAqXG4gKiBFeGFtcGxlIHNlc3Npb24gZm9yIG1vdXNlLWlucHV0OiBtb3VzZWRvd24gLT4gbW91c2Vtb3ZlIC0+IG1vdXNldXBcbiAqXG4gKiBPbiBlYWNoIHJlY29nbml6aW5nIGN5Y2xlIChzZWUgTWFuYWdlci5yZWNvZ25pemUpIHRoZSAucmVjb2duaXplKCkgbWV0aG9kIGlzIGV4ZWN1dGVkXG4gKiB3aGljaCBkZXRlcm1pbmVzIHdpdGggc3RhdGUgaXQgc2hvdWxkIGJlLlxuICpcbiAqIElmIHRoZSByZWNvZ25pemVyIGhhcyB0aGUgc3RhdGUgRkFJTEVELCBDQU5DRUxMRUQgb3IgUkVDT0dOSVpFRCAoZXF1YWxzIEVOREVEKSwgaXQgaXMgcmVzZXQgdG9cbiAqIFBPU1NJQkxFIHRvIGdpdmUgaXQgYW5vdGhlciBjaGFuZ2Ugb24gdGhlIG5leHQgY3ljbGUuXG4gKlxuICogICAgICAgICAgICAgICBQb3NzaWJsZVxuICogICAgICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rXG4gKiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgICAgICstLS0tLSstLS0tLSsgICAgICAgICAgICAgICB8XG4gKiAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICB8XG4gKiAgIEZhaWxlZCAgICAgIENhbmNlbGxlZCAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rLS0tLS0tK1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgIFJlY29nbml6ZWQgICAgICAgQmVnYW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZGVkL1JlY29nbml6ZWRcbiAqL1xudmFyIFNUQVRFX1BPU1NJQkxFID0gMTtcbnZhciBTVEFURV9CRUdBTiA9IDI7XG52YXIgU1RBVEVfQ0hBTkdFRCA9IDQ7XG52YXIgU1RBVEVfRU5ERUQgPSA4O1xudmFyIFNUQVRFX1JFQ09HTklaRUQgPSBTVEFURV9FTkRFRDtcbnZhciBTVEFURV9DQU5DRUxMRUQgPSAxNjtcbnZhciBTVEFURV9GQUlMRUQgPSAzMjtcblxuLyoqXG4gKiBSZWNvZ25pemVyXG4gKiBFdmVyeSByZWNvZ25pemVyIG5lZWRzIHRvIGV4dGVuZCBmcm9tIHRoaXMgY2xhc3MuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIFJlY29nbml6ZXIob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgdGhpcy5kZWZhdWx0cywgb3B0aW9ucyB8fCB7fSk7XG5cbiAgICB0aGlzLmlkID0gdW5pcXVlSWQoKTtcblxuICAgIHRoaXMubWFuYWdlciA9IG51bGw7XG5cbiAgICAvLyBkZWZhdWx0IGlzIGVuYWJsZSB0cnVlXG4gICAgdGhpcy5vcHRpb25zLmVuYWJsZSA9IGlmVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5lbmFibGUsIHRydWUpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1BPU1NJQkxFO1xuXG4gICAgdGhpcy5zaW11bHRhbmVvdXMgPSB7fTtcbiAgICB0aGlzLnJlcXVpcmVGYWlsID0gW107XG59XG5cblJlY29nbml6ZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICBkZWZhdWx0czoge30sXG5cbiAgICAvKipcbiAgICAgKiBzZXQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybiB7UmVjb2duaXplcn1cbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gYWxzbyB1cGRhdGUgdGhlIHRvdWNoQWN0aW9uLCBpbiBjYXNlIHNvbWV0aGluZyBjaGFuZ2VkIGFib3V0IHRoZSBkaXJlY3Rpb25zL2VuYWJsZWQgc3RhdGVcbiAgICAgICAgdGhpcy5tYW5hZ2VyICYmIHRoaXMubWFuYWdlci50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlY29nbml6ZSBzaW11bHRhbmVvdXMgd2l0aCBhbiBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICByZWNvZ25pemVXaXRoOiBmdW5jdGlvbihvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ3JlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2ltdWx0YW5lb3VzID0gdGhpcy5zaW11bHRhbmVvdXM7XG4gICAgICAgIG90aGVyUmVjb2duaXplciA9IGdldFJlY29nbml6ZXJCeU5hbWVJZk1hbmFnZXIob3RoZXJSZWNvZ25pemVyLCB0aGlzKTtcbiAgICAgICAgaWYgKCFzaW11bHRhbmVvdXNbb3RoZXJSZWNvZ25pemVyLmlkXSkge1xuICAgICAgICAgICAgc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF0gPSBvdGhlclJlY29nbml6ZXI7XG4gICAgICAgICAgICBvdGhlclJlY29nbml6ZXIucmVjb2duaXplV2l0aCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZHJvcCB0aGUgc2ltdWx0YW5lb3VzIGxpbmsuIGl0IGRvZXNudCByZW1vdmUgdGhlIGxpbmsgb24gdGhlIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIGRyb3BSZWNvZ25pemVXaXRoOiBmdW5jdGlvbihvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ2Ryb3BSZWNvZ25pemVXaXRoJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICBkZWxldGUgdGhpcy5zaW11bHRhbmVvdXNbb3RoZXJSZWNvZ25pemVyLmlkXTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlY29nbml6ZXIgY2FuIG9ubHkgcnVuIHdoZW4gYW4gb3RoZXIgaXMgZmFpbGluZ1xuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICByZXF1aXJlRmFpbHVyZTogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdyZXF1aXJlRmFpbHVyZScsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXF1aXJlRmFpbCA9IHRoaXMucmVxdWlyZUZhaWw7XG4gICAgICAgIG90aGVyUmVjb2duaXplciA9IGdldFJlY29nbml6ZXJCeU5hbWVJZk1hbmFnZXIob3RoZXJSZWNvZ25pemVyLCB0aGlzKTtcbiAgICAgICAgaWYgKGluQXJyYXkocmVxdWlyZUZhaWwsIG90aGVyUmVjb2duaXplcikgPT09IC0xKSB7XG4gICAgICAgICAgICByZXF1aXJlRmFpbC5wdXNoKG90aGVyUmVjb2duaXplcik7XG4gICAgICAgICAgICBvdGhlclJlY29nbml6ZXIucmVxdWlyZUZhaWx1cmUodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGRyb3AgdGhlIHJlcXVpcmVGYWlsdXJlIGxpbmsuIGl0IGRvZXMgbm90IHJlbW92ZSB0aGUgbGluayBvbiB0aGUgb3RoZXIgcmVjb2duaXplci5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgZHJvcFJlcXVpcmVGYWlsdXJlOiBmdW5jdGlvbihvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ2Ryb3BSZXF1aXJlRmFpbHVyZScsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyUmVjb2duaXplciA9IGdldFJlY29nbml6ZXJCeU5hbWVJZk1hbmFnZXIob3RoZXJSZWNvZ25pemVyLCB0aGlzKTtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5BcnJheSh0aGlzLnJlcXVpcmVGYWlsLCBvdGhlclJlY29nbml6ZXIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5yZXF1aXJlRmFpbC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBoYXMgcmVxdWlyZSBmYWlsdXJlcyBib29sZWFuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzUmVxdWlyZUZhaWx1cmVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWlyZUZhaWwubGVuZ3RoID4gMDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogaWYgdGhlIHJlY29nbml6ZXIgY2FuIHJlY29nbml6ZSBzaW11bHRhbmVvdXMgd2l0aCBhbiBvdGhlciByZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBjYW5SZWNvZ25pemVXaXRoOiBmdW5jdGlvbihvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zaW11bHRhbmVvdXNbb3RoZXJSZWNvZ25pemVyLmlkXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogWW91IHNob3VsZCB1c2UgYHRyeUVtaXRgIGluc3RlYWQgb2YgYGVtaXRgIGRpcmVjdGx5IHRvIGNoZWNrXG4gICAgICogdGhhdCBhbGwgdGhlIG5lZWRlZCByZWNvZ25pemVycyBoYXMgZmFpbGVkIGJlZm9yZSBlbWl0dGluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKi9cbiAgICBlbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgICAgICAgc2VsZi5tYW5hZ2VyLmVtaXQoZXZlbnQsIGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICdwYW5zdGFydCcgYW5kICdwYW5tb3ZlJ1xuICAgICAgICBpZiAoc3RhdGUgPCBTVEFURV9FTkRFRCkge1xuICAgICAgICAgICAgZW1pdChzZWxmLm9wdGlvbnMuZXZlbnQgKyBzdGF0ZVN0cihzdGF0ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZW1pdChzZWxmLm9wdGlvbnMuZXZlbnQpOyAvLyBzaW1wbGUgJ2V2ZW50TmFtZScgZXZlbnRzXG5cbiAgICAgICAgaWYgKGlucHV0LmFkZGl0aW9uYWxFdmVudCkgeyAvLyBhZGRpdGlvbmFsIGV2ZW50KHBhbmxlZnQsIHBhbnJpZ2h0LCBwaW5jaGluLCBwaW5jaG91dC4uLilcbiAgICAgICAgICAgIGVtaXQoaW5wdXQuYWRkaXRpb25hbEV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhbmVuZCBhbmQgcGFuY2FuY2VsXG4gICAgICAgIGlmIChzdGF0ZSA+PSBTVEFURV9FTkRFRCkge1xuICAgICAgICAgICAgZW1pdChzZWxmLm9wdGlvbnMuZXZlbnQgKyBzdGF0ZVN0cihzdGF0ZSkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgYWxsIHRoZSByZXF1aXJlIGZhaWx1cmUgcmVjb2duaXplcnMgaGFzIGZhaWxlZCxcbiAgICAgKiBpZiB0cnVlLCBpdCBlbWl0cyBhIGdlc3R1cmUgZXZlbnQsXG4gICAgICogb3RoZXJ3aXNlLCBzZXR1cCB0aGUgc3RhdGUgdG8gRkFJTEVELlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIHRyeUVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLmNhbkVtaXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdChpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaXQncyBmYWlsaW5nIGFueXdheVxuICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjYW4gd2UgZW1pdD9cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjYW5FbWl0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHRoaXMucmVxdWlyZUZhaWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLnJlcXVpcmVGYWlsW2ldLnN0YXRlICYgKFNUQVRFX0ZBSUxFRCB8IFNUQVRFX1BPU1NJQkxFKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHVwZGF0ZSB0aGUgcmVjb2duaXplclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICAgKi9cbiAgICByZWNvZ25pemU6IGZ1bmN0aW9uKGlucHV0RGF0YSkge1xuICAgICAgICAvLyBtYWtlIGEgbmV3IGNvcHkgb2YgdGhlIGlucHV0RGF0YVxuICAgICAgICAvLyBzbyB3ZSBjYW4gY2hhbmdlIHRoZSBpbnB1dERhdGEgd2l0aG91dCBtZXNzaW5nIHVwIHRoZSBvdGhlciByZWNvZ25pemVyc1xuICAgICAgICB2YXIgaW5wdXREYXRhQ2xvbmUgPSBhc3NpZ24oe30sIGlucHV0RGF0YSk7XG5cbiAgICAgICAgLy8gaXMgaXMgZW5hYmxlZCBhbmQgYWxsb3cgcmVjb2duaXppbmc/XG4gICAgICAgIGlmICghYm9vbE9yRm4odGhpcy5vcHRpb25zLmVuYWJsZSwgW3RoaXMsIGlucHV0RGF0YUNsb25lXSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9GQUlMRUQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXNldCB3aGVuIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZFxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAmIChTVEFURV9SRUNPR05JWkVEIHwgU1RBVEVfQ0FOQ0VMTEVEIHwgU1RBVEVfRkFJTEVEKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1BPU1NJQkxFO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMucHJvY2VzcyhpbnB1dERhdGFDbG9uZSk7XG5cbiAgICAgICAgLy8gdGhlIHJlY29nbml6ZXIgaGFzIHJlY29nbml6ZWQgYSBnZXN0dXJlXG4gICAgICAgIC8vIHNvIHRyaWdnZXIgYW4gZXZlbnRcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEIHwgU1RBVEVfRU5ERUQgfCBTVEFURV9DQU5DRUxMRUQpKSB7XG4gICAgICAgICAgICB0aGlzLnRyeUVtaXQoaW5wdXREYXRhQ2xvbmUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIHJlY29nbml6ZXJcbiAgICAgKiB0aGUgYWN0dWFsIHJlY29nbml6aW5nIGhhcHBlbnMgaW4gdGhpcyBtZXRob2RcbiAgICAgKiBAdmlydHVhbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICAgKiBAcmV0dXJucyB7Q29uc3R9IFNUQVRFXG4gICAgICovXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXREYXRhKSB7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBwcmVmZXJyZWQgdG91Y2gtYWN0aW9uXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkgeyB9LFxuXG4gICAgLyoqXG4gICAgICogY2FsbGVkIHdoZW4gdGhlIGdlc3R1cmUgaXNuJ3QgYWxsb3dlZCB0byByZWNvZ25pemVcbiAgICAgKiBsaWtlIHdoZW4gYW5vdGhlciBpcyBiZWluZyByZWNvZ25pemVkIG9yIGl0IGlzIGRpc2FibGVkXG4gICAgICogQHZpcnR1YWxcbiAgICAgKi9cbiAgICByZXNldDogZnVuY3Rpb24oKSB7IH1cbn07XG5cbi8qKlxuICogZ2V0IGEgdXNhYmxlIHN0cmluZywgdXNlZCBhcyBldmVudCBwb3N0Zml4XG4gKiBAcGFyYW0ge0NvbnN0fSBzdGF0ZVxuICogQHJldHVybnMge1N0cmluZ30gc3RhdGVcbiAqL1xuZnVuY3Rpb24gc3RhdGVTdHIoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUgJiBTVEFURV9DQU5DRUxMRUQpIHtcbiAgICAgICAgcmV0dXJuICdjYW5jZWwnO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUgJiBTVEFURV9FTkRFRCkge1xuICAgICAgICByZXR1cm4gJ2VuZCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0NIQU5HRUQpIHtcbiAgICAgICAgcmV0dXJuICdtb3ZlJztcbiAgICB9IGVsc2UgaWYgKHN0YXRlICYgU1RBVEVfQkVHQU4pIHtcbiAgICAgICAgcmV0dXJuICdzdGFydCc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBkaXJlY3Rpb24gY29ucyB0byBzdHJpbmdcbiAqIEBwYXJhbSB7Q29uc3R9IGRpcmVjdGlvblxuICogQHJldHVybnMge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZGlyZWN0aW9uU3RyKGRpcmVjdGlvbikge1xuICAgIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX0RPV04pIHtcbiAgICAgICAgcmV0dXJuICdkb3duJztcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fVVApIHtcbiAgICAgICAgcmV0dXJuICd1cCc7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX0xFRlQpIHtcbiAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fUklHSFQpIHtcbiAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBnZXQgYSByZWNvZ25pemVyIGJ5IG5hbWUgaWYgaXQgaXMgYm91bmQgdG8gYSBtYW5hZ2VyXG4gKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSBvdGhlclJlY29nbml6ZXJcbiAqIEBwYXJhbSB7UmVjb2duaXplcn0gcmVjb2duaXplclxuICogQHJldHVybnMge1JlY29nbml6ZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldFJlY29nbml6ZXJCeU5hbWVJZk1hbmFnZXIob3RoZXJSZWNvZ25pemVyLCByZWNvZ25pemVyKSB7XG4gICAgdmFyIG1hbmFnZXIgPSByZWNvZ25pemVyLm1hbmFnZXI7XG4gICAgaWYgKG1hbmFnZXIpIHtcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZ2V0KG90aGVyUmVjb2duaXplcik7XG4gICAgfVxuICAgIHJldHVybiBvdGhlclJlY29nbml6ZXI7XG59XG5cbi8qKlxuICogVGhpcyByZWNvZ25pemVyIGlzIGp1c3QgdXNlZCBhcyBhIGJhc2UgZm9yIHRoZSBzaW1wbGUgYXR0cmlidXRlIHJlY29nbml6ZXJzLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIEF0dHJSZWNvZ25pemVyKCkge1xuICAgIFJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChBdHRyUmVjb2duaXplciwgUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgcG9pbnRlcnM6IDFcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjaGVjayBpZiBpdCB0aGUgcmVjb2duaXplciByZWNlaXZlcyB2YWxpZCBpbnB1dCwgbGlrZSBpbnB1dC5kaXN0YW5jZSA+IDEwLlxuICAgICAqIEBtZW1iZXJvZiBBdHRyUmVjb2duaXplclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSByZWNvZ25pemVkXG4gICAgICovXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBvcHRpb25Qb2ludGVycyA9IHRoaXMub3B0aW9ucy5wb2ludGVycztcbiAgICAgICAgcmV0dXJuIG9wdGlvblBvaW50ZXJzID09PSAwIHx8IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9uUG9pbnRlcnM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIGlucHV0IGFuZCByZXR1cm4gdGhlIHN0YXRlIGZvciB0aGUgcmVjb2duaXplclxuICAgICAqIEBtZW1iZXJvZiBBdHRyUmVjb2duaXplclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqIEByZXR1cm5zIHsqfSBTdGF0ZVxuICAgICAqL1xuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIHZhciBldmVudFR5cGUgPSBpbnB1dC5ldmVudFR5cGU7XG5cbiAgICAgICAgdmFyIGlzUmVjb2duaXplZCA9IHN0YXRlICYgKFNUQVRFX0JFR0FOIHwgU1RBVEVfQ0hBTkdFRCk7XG4gICAgICAgIHZhciBpc1ZhbGlkID0gdGhpcy5hdHRyVGVzdChpbnB1dCk7XG5cbiAgICAgICAgLy8gb24gY2FuY2VsIGlucHV0IGFuZCB3ZSd2ZSByZWNvZ25pemVkIGJlZm9yZSwgcmV0dXJuIFNUQVRFX0NBTkNFTExFRFxuICAgICAgICBpZiAoaXNSZWNvZ25pemVkICYmIChldmVudFR5cGUgJiBJTlBVVF9DQU5DRUwgfHwgIWlzVmFsaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUgfCBTVEFURV9DQU5DRUxMRUQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZWNvZ25pemVkIHx8IGlzVmFsaWQpIHtcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9FTkQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUgfCBTVEFURV9FTkRFRDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIShzdGF0ZSAmIFNUQVRFX0JFR0FOKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9CRUdBTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0NIQU5HRUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBQYW5cbiAqIFJlY29nbml6ZWQgd2hlbiB0aGUgcG9pbnRlciBpcyBkb3duIGFuZCBtb3ZlZCBpbiB0aGUgYWxsb3dlZCBkaXJlY3Rpb24uXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFBhblJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHRoaXMucFggPSBudWxsO1xuICAgIHRoaXMucFkgPSBudWxsO1xufVxuXG5pbmhlcml0KFBhblJlY29nbml6ZXIsIEF0dHJSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQYW5SZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdwYW4nLFxuICAgICAgICB0aHJlc2hvbGQ6IDEwLFxuICAgICAgICBwb2ludGVyczogMSxcbiAgICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fQUxMXG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IHRoaXMub3B0aW9ucy5kaXJlY3Rpb247XG4gICAgICAgIHZhciBhY3Rpb25zID0gW107XG4gICAgICAgIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKFRPVUNIX0FDVElPTl9QQU5fWSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKFRPVUNIX0FDVElPTl9QQU5fWCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjdGlvbnM7XG4gICAgfSxcblxuICAgIGRpcmVjdGlvblRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2YXIgaGFzTW92ZWQgPSB0cnVlO1xuICAgICAgICB2YXIgZGlzdGFuY2UgPSBpbnB1dC5kaXN0YW5jZTtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IGlucHV0LmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIHggPSBpbnB1dC5kZWx0YVg7XG4gICAgICAgIHZhciB5ID0gaW5wdXQuZGVsdGFZO1xuXG4gICAgICAgIC8vIGxvY2sgdG8gYXhpcz9cbiAgICAgICAgaWYgKCEoZGlyZWN0aW9uICYgb3B0aW9ucy5kaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5kaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICh4ID09PSAwKSA/IERJUkVDVElPTl9OT05FIDogKHggPCAwKSA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgICAgICAgICAgICAgIGhhc01vdmVkID0geCAhPSB0aGlzLnBYO1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5hYnMoaW5wdXQuZGVsdGFYKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gKHkgPT09IDApID8gRElSRUNUSU9OX05PTkUgOiAoeSA8IDApID8gRElSRUNUSU9OX1VQIDogRElSRUNUSU9OX0RPV047XG4gICAgICAgICAgICAgICAgaGFzTW92ZWQgPSB5ICE9IHRoaXMucFk7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgICAgcmV0dXJuIGhhc01vdmVkICYmIGRpc3RhbmNlID4gb3B0aW9ucy50aHJlc2hvbGQgJiYgZGlyZWN0aW9uICYgb3B0aW9ucy5kaXJlY3Rpb247XG4gICAgfSxcblxuICAgIGF0dHJUZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gQXR0clJlY29nbml6ZXIucHJvdG90eXBlLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICAodGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOIHx8ICghKHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTikgJiYgdGhpcy5kaXJlY3Rpb25UZXN0KGlucHV0KSkpO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuXG4gICAgICAgIHRoaXMucFggPSBpbnB1dC5kZWx0YVg7XG4gICAgICAgIHRoaXMucFkgPSBpbnB1dC5kZWx0YVk7XG5cbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IGRpcmVjdGlvblN0cihpbnB1dC5kaXJlY3Rpb24pO1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGlucHV0LmFkZGl0aW9uYWxFdmVudCA9IHRoaXMub3B0aW9ucy5ldmVudCArIGRpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcywgaW5wdXQpO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFBpbmNoXG4gKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlcnMgYXJlIG1vdmluZyB0b3dhcmQgKHpvb20taW4pIG9yIGF3YXkgZnJvbSBlYWNoIG90aGVyICh6b29tLW91dCkuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFBpbmNoUmVjb2duaXplcigpIHtcbiAgICBBdHRyUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KFBpbmNoUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFBpbmNoUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAncGluY2gnLFxuICAgICAgICB0aHJlc2hvbGQ6IDAsXG4gICAgICAgIHBvaW50ZXJzOiAyXG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgfSxcblxuICAgIGF0dHJUZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiZcbiAgICAgICAgICAgIChNYXRoLmFicyhpbnB1dC5zY2FsZSAtIDEpID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCB8fCB0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQuc2NhbGUgIT09IDEpIHtcbiAgICAgICAgICAgIHZhciBpbk91dCA9IGlucHV0LnNjYWxlIDwgMSA/ICdpbicgOiAnb3V0JztcbiAgICAgICAgICAgIGlucHV0LmFkZGl0aW9uYWxFdmVudCA9IHRoaXMub3B0aW9ucy5ldmVudCArIGluT3V0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLCBpbnB1dCk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogUHJlc3NcbiAqIFJlY29nbml6ZWQgd2hlbiB0aGUgcG9pbnRlciBpcyBkb3duIGZvciB4IG1zIHdpdGhvdXQgYW55IG1vdmVtZW50LlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFByZXNzUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLl90aW1lciA9IG51bGw7XG4gICAgdGhpcy5faW5wdXQgPSBudWxsO1xufVxuXG5pbmhlcml0KFByZXNzUmVjb2duaXplciwgUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUHJlc3NSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdwcmVzcycsXG4gICAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgICB0aW1lOiAyNTEsIC8vIG1pbmltYWwgdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBwcmVzc2VkXG4gICAgICAgIHRocmVzaG9sZDogOSAvLyBhIG1pbmltYWwgbW92ZW1lbnQgaXMgb2ssIGJ1dCBrZWVwIGl0IGxvd1xuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX0FVVE9dO1xuICAgIH0sXG5cbiAgICBwcm9jZXNzOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgdmFyIHZhbGlkUG9pbnRlcnMgPSBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvbnMucG9pbnRlcnM7XG4gICAgICAgIHZhciB2YWxpZE1vdmVtZW50ID0gaW5wdXQuZGlzdGFuY2UgPCBvcHRpb25zLnRocmVzaG9sZDtcbiAgICAgICAgdmFyIHZhbGlkVGltZSA9IGlucHV0LmRlbHRhVGltZSA+IG9wdGlvbnMudGltZTtcblxuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgbGl0dGxlIG1vdmVtZW50XG4gICAgICAgIC8vIGFuZCB3ZSd2ZSByZWFjaGVkIGFuIGVuZCBldmVudCwgc28gYSB0YXAgaXMgcG9zc2libGVcbiAgICAgICAgaWYgKCF2YWxpZE1vdmVtZW50IHx8ICF2YWxpZFBvaW50ZXJzIHx8IChpbnB1dC5ldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiAhdmFsaWRUaW1lKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX1NUQVJUKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXRDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9SRUNPR05JWkVEO1xuICAgICAgICAgICAgICAgIHRoaXMudHJ5RW1pdCgpO1xuICAgICAgICAgICAgfSwgb3B0aW9ucy50aW1lLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9FTkQpIHtcbiAgICAgICAgICAgIHJldHVybiBTVEFURV9SRUNPR05JWkVEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IFNUQVRFX1JFQ09HTklaRUQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dCAmJiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfRU5EKSkge1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50ICsgJ3VwJywgaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faW5wdXQudGltZVN0YW1wID0gbm93KCk7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsIHRoaXMuX2lucHV0KTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG4vKipcbiAqIFJvdGF0ZVxuICogUmVjb2duaXplZCB3aGVuIHR3byBvciBtb3JlIHBvaW50ZXIgYXJlIG1vdmluZyBpbiBhIGNpcmN1bGFyIG1vdGlvbi5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUm90YXRlUmVjb2duaXplcigpIHtcbiAgICBBdHRyUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KFJvdGF0ZVJlY29nbml6ZXIsIEF0dHJSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBSb3RhdGVSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdyb3RhdGUnLFxuICAgICAgICB0aHJlc2hvbGQ6IDAsXG4gICAgICAgIHBvaW50ZXJzOiAyXG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgfSxcblxuICAgIGF0dHJUZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiZcbiAgICAgICAgICAgIChNYXRoLmFicyhpbnB1dC5yb3RhdGlvbikgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkIHx8IHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTik7XG4gICAgfVxufSk7XG5cbi8qKlxuICogU3dpcGVcbiAqIFJlY29nbml6ZWQgd2hlbiB0aGUgcG9pbnRlciBpcyBtb3ZpbmcgZmFzdCAodmVsb2NpdHkpLCB3aXRoIGVub3VnaCBkaXN0YW5jZSBpbiB0aGUgYWxsb3dlZCBkaXJlY3Rpb24uXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFN3aXBlUmVjb2duaXplcigpIHtcbiAgICBBdHRyUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KFN3aXBlUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFN3aXBlUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAnc3dpcGUnLFxuICAgICAgICB0aHJlc2hvbGQ6IDEwLFxuICAgICAgICB2ZWxvY2l0eTogMC4zLFxuICAgICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMIHwgRElSRUNUSU9OX1ZFUlRJQ0FMLFxuICAgICAgICBwb2ludGVyczogMVxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBQYW5SZWNvZ25pemVyLnByb3RvdHlwZS5nZXRUb3VjaEFjdGlvbi5jYWxsKHRoaXMpO1xuICAgIH0sXG5cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IHRoaXMub3B0aW9ucy5kaXJlY3Rpb247XG4gICAgICAgIHZhciB2ZWxvY2l0eTtcblxuICAgICAgICBpZiAoZGlyZWN0aW9uICYgKERJUkVDVElPTl9IT1JJWk9OVEFMIHwgRElSRUNUSU9OX1ZFUlRJQ0FMKSkge1xuICAgICAgICAgICAgdmVsb2NpdHkgPSBpbnB1dC5vdmVyYWxsVmVsb2NpdHk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHtcbiAgICAgICAgICAgIHZlbG9jaXR5ID0gaW5wdXQub3ZlcmFsbFZlbG9jaXR5WDtcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fVkVSVElDQUwpIHtcbiAgICAgICAgICAgIHZlbG9jaXR5ID0gaW5wdXQub3ZlcmFsbFZlbG9jaXR5WTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgZGlyZWN0aW9uICYgaW5wdXQub2Zmc2V0RGlyZWN0aW9uICYmXG4gICAgICAgICAgICBpbnB1dC5kaXN0YW5jZSA+IHRoaXMub3B0aW9ucy50aHJlc2hvbGQgJiZcbiAgICAgICAgICAgIGlucHV0Lm1heFBvaW50ZXJzID09IHRoaXMub3B0aW9ucy5wb2ludGVycyAmJlxuICAgICAgICAgICAgYWJzKHZlbG9jaXR5KSA+IHRoaXMub3B0aW9ucy52ZWxvY2l0eSAmJiBpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9FTkQ7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TdHIoaW5wdXQub2Zmc2V0RGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50ICsgZGlyZWN0aW9uLCBpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsIGlucHV0KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBBIHRhcCBpcyBlY29nbml6ZWQgd2hlbiB0aGUgcG9pbnRlciBpcyBkb2luZyBhIHNtYWxsIHRhcC9jbGljay4gTXVsdGlwbGUgdGFwcyBhcmUgcmVjb2duaXplZCBpZiB0aGV5IG9jY3VyXG4gKiBiZXR3ZWVuIHRoZSBnaXZlbiBpbnRlcnZhbCBhbmQgcG9zaXRpb24uIFRoZSBkZWxheSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcmVjb2duaXplIG11bHRpLXRhcHMgd2l0aG91dCBmaXJpbmdcbiAqIGEgc2luZ2xlIHRhcC5cbiAqXG4gKiBUaGUgZXZlbnREYXRhIGZyb20gdGhlIGVtaXR0ZWQgZXZlbnQgY29udGFpbnMgdGhlIHByb3BlcnR5IGB0YXBDb3VudGAsIHdoaWNoIGNvbnRhaW5zIHRoZSBhbW91bnQgb2ZcbiAqIG11bHRpLXRhcHMgYmVpbmcgcmVjb2duaXplZC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBUYXBSZWNvZ25pemVyKCkge1xuICAgIFJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIHByZXZpb3VzIHRpbWUgYW5kIGNlbnRlcixcbiAgICAvLyB1c2VkIGZvciB0YXAgY291bnRpbmdcbiAgICB0aGlzLnBUaW1lID0gZmFsc2U7XG4gICAgdGhpcy5wQ2VudGVyID0gZmFsc2U7XG5cbiAgICB0aGlzLl90aW1lciA9IG51bGw7XG4gICAgdGhpcy5faW5wdXQgPSBudWxsO1xuICAgIHRoaXMuY291bnQgPSAwO1xufVxuXG5pbmhlcml0KFRhcFJlY29nbml6ZXIsIFJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFBpbmNoUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAndGFwJyxcbiAgICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICAgIHRhcHM6IDEsXG4gICAgICAgIGludGVydmFsOiAzMDAsIC8vIG1heCB0aW1lIGJldHdlZW4gdGhlIG11bHRpLXRhcCB0YXBzXG4gICAgICAgIHRpbWU6IDI1MCwgLy8gbWF4IHRpbWUgb2YgdGhlIHBvaW50ZXIgdG8gYmUgZG93biAobGlrZSBmaW5nZXIgb24gdGhlIHNjcmVlbilcbiAgICAgICAgdGhyZXNob2xkOiA5LCAvLyBhIG1pbmltYWwgbW92ZW1lbnQgaXMgb2ssIGJ1dCBrZWVwIGl0IGxvd1xuICAgICAgICBwb3NUaHJlc2hvbGQ6IDEwIC8vIGEgbXVsdGktdGFwIGNhbiBiZSBhIGJpdCBvZmYgdGhlIGluaXRpYWwgcG9zaXRpb25cbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9NQU5JUFVMQVRJT05dO1xuICAgIH0sXG5cbiAgICBwcm9jZXNzOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgICB2YXIgdmFsaWRQb2ludGVycyA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9ucy5wb2ludGVycztcbiAgICAgICAgdmFyIHZhbGlkTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IG9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgICB2YXIgdmFsaWRUb3VjaFRpbWUgPSBpbnB1dC5kZWx0YVRpbWUgPCBvcHRpb25zLnRpbWU7XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIGlmICgoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpICYmICh0aGlzLmNvdW50ID09PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgbGl0dGxlIG1vdmVtZW50XG4gICAgICAgIC8vIGFuZCB3ZSd2ZSByZWFjaGVkIGFuIGVuZCBldmVudCwgc28gYSB0YXAgaXMgcG9zc2libGVcbiAgICAgICAgaWYgKHZhbGlkTW92ZW1lbnQgJiYgdmFsaWRUb3VjaFRpbWUgJiYgdmFsaWRQb2ludGVycykge1xuICAgICAgICAgICAgaWYgKGlucHV0LmV2ZW50VHlwZSAhPSBJTlBVVF9FTkQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mYWlsVGltZW91dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdmFsaWRJbnRlcnZhbCA9IHRoaXMucFRpbWUgPyAoaW5wdXQudGltZVN0YW1wIC0gdGhpcy5wVGltZSA8IG9wdGlvbnMuaW50ZXJ2YWwpIDogdHJ1ZTtcbiAgICAgICAgICAgIHZhciB2YWxpZE11bHRpVGFwID0gIXRoaXMucENlbnRlciB8fCBnZXREaXN0YW5jZSh0aGlzLnBDZW50ZXIsIGlucHV0LmNlbnRlcikgPCBvcHRpb25zLnBvc1RocmVzaG9sZDtcblxuICAgICAgICAgICAgdGhpcy5wVGltZSA9IGlucHV0LnRpbWVTdGFtcDtcbiAgICAgICAgICAgIHRoaXMucENlbnRlciA9IGlucHV0LmNlbnRlcjtcblxuICAgICAgICAgICAgaWYgKCF2YWxpZE11bHRpVGFwIHx8ICF2YWxpZEludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY291bnQgKz0gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcblxuICAgICAgICAgICAgLy8gaWYgdGFwIGNvdW50IG1hdGNoZXMgd2UgaGF2ZSByZWNvZ25pemVkIGl0LFxuICAgICAgICAgICAgLy8gZWxzZSBpdCBoYXMgYmVnYW4gcmVjb2duaXppbmcuLi5cbiAgICAgICAgICAgIHZhciB0YXBDb3VudCA9IHRoaXMuY291bnQgJSBvcHRpb25zLnRhcHM7XG4gICAgICAgICAgICBpZiAodGFwQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBubyBmYWlsaW5nIHJlcXVpcmVtZW50cywgaW1tZWRpYXRlbHkgdHJpZ2dlciB0aGUgdGFwIGV2ZW50XG4gICAgICAgICAgICAgICAgLy8gb3Igd2FpdCBhcyBsb25nIGFzIHRoZSBtdWx0aXRhcCBpbnRlcnZhbCB0byB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1JlcXVpcmVGYWlsdXJlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9SRUNPR05JWkVEO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5RW1pdCgpO1xuICAgICAgICAgICAgICAgICAgICB9LCBvcHRpb25zLmludGVydmFsLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0JFR0FOO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH0sXG5cbiAgICBmYWlsVGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgICAgICB9LCB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwsIHRoaXMpO1xuICAgICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH0sXG5cbiAgICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PSBTVEFURV9SRUNPR05JWkVEKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dC50YXBDb3VudCA9IHRoaXMuY291bnQ7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsIHRoaXMuX2lucHV0KTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG4vKipcbiAqIFNpbXBsZSB3YXkgdG8gY3JlYXRlIGEgbWFuYWdlciB3aXRoIGEgZGVmYXVsdCBzZXQgb2YgcmVjb2duaXplcnMuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSGFtbWVyKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLnJlY29nbml6ZXJzID0gaWZVbmRlZmluZWQob3B0aW9ucy5yZWNvZ25pemVycywgSGFtbWVyLmRlZmF1bHRzLnByZXNldCk7XG4gICAgcmV0dXJuIG5ldyBNYW5hZ2VyKGVsZW1lbnQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEBjb25zdCB7c3RyaW5nfVxuICovXG5IYW1tZXIuVkVSU0lPTiA9ICcyLjAuNyc7XG5cbi8qKlxuICogZGVmYXVsdCBzZXR0aW5nc1xuICogQG5hbWVzcGFjZVxuICovXG5IYW1tZXIuZGVmYXVsdHMgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IGlmIERPTSBldmVudHMgYXJlIGJlaW5nIHRyaWdnZXJlZC5cbiAgICAgKiBCdXQgdGhpcyBpcyBzbG93ZXIgYW5kIHVudXNlZCBieSBzaW1wbGUgaW1wbGVtZW50YXRpb25zLCBzbyBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgZG9tRXZlbnRzOiBmYWxzZSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5L2ZhbGxiYWNrLlxuICAgICAqIFdoZW4gc2V0IHRvIGBjb21wdXRlYCBpdCB3aWxsIG1hZ2ljYWxseSBzZXQgdGhlIGNvcnJlY3QgdmFsdWUgYmFzZWQgb24gdGhlIGFkZGVkIHJlY29nbml6ZXJzLlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICogQGRlZmF1bHQgY29tcHV0ZVxuICAgICAqL1xuICAgIHRvdWNoQWN0aW9uOiBUT1VDSF9BQ1RJT05fQ09NUFVURSxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBlbmFibGU6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAtLSBjYW4gYmUgcmVtb3ZlZC9jaGFuZ2VkXG4gICAgICogQ2hhbmdlIHRoZSBwYXJlbnQgaW5wdXQgdGFyZ2V0IGVsZW1lbnQuXG4gICAgICogSWYgTnVsbCwgdGhlbiBpdCBpcyBiZWluZyBzZXQgdGhlIHRvIG1haW4gZWxlbWVudC5cbiAgICAgKiBAdHlwZSB7TnVsbHxFdmVudFRhcmdldH1cbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG4gICAgaW5wdXRUYXJnZXQ6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBmb3JjZSBhbiBpbnB1dCBjbGFzc1xuICAgICAqIEB0eXBlIHtOdWxsfEZ1bmN0aW9ufVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cbiAgICBpbnB1dENsYXNzOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCByZWNvZ25pemVyIHNldHVwIHdoZW4gY2FsbGluZyBgSGFtbWVyKClgXG4gICAgICogV2hlbiBjcmVhdGluZyBhIG5ldyBNYW5hZ2VyIHRoZXNlIHdpbGwgYmUgc2tpcHBlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXl9XG4gICAgICovXG4gICAgcHJlc2V0OiBbXG4gICAgICAgIC8vIFJlY29nbml6ZXJDbGFzcywgb3B0aW9ucywgW3JlY29nbml6ZVdpdGgsIC4uLl0sIFtyZXF1aXJlRmFpbHVyZSwgLi4uXVxuICAgICAgICBbUm90YXRlUmVjb2duaXplciwge2VuYWJsZTogZmFsc2V9XSxcbiAgICAgICAgW1BpbmNoUmVjb2duaXplciwge2VuYWJsZTogZmFsc2V9LCBbJ3JvdGF0ZSddXSxcbiAgICAgICAgW1N3aXBlUmVjb2duaXplciwge2RpcmVjdGlvbjogRElSRUNUSU9OX0hPUklaT05UQUx9XSxcbiAgICAgICAgW1BhblJlY29nbml6ZXIsIHtkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMfSwgWydzd2lwZSddXSxcbiAgICAgICAgW1RhcFJlY29nbml6ZXJdLFxuICAgICAgICBbVGFwUmVjb2duaXplciwge2V2ZW50OiAnZG91YmxldGFwJywgdGFwczogMn0sIFsndGFwJ11dLFxuICAgICAgICBbUHJlc3NSZWNvZ25pemVyXVxuICAgIF0sXG5cbiAgICAvKipcbiAgICAgKiBTb21lIENTUyBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgdGhlIHdvcmtpbmcgb2YgSGFtbWVyLlxuICAgICAqIEFkZCB0aGVtIHRvIHRoaXMgbWV0aG9kIGFuZCB0aGV5IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBuZXcgTWFuYWdlci5cbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICovXG4gICAgY3NzUHJvcHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERpc2FibGVzIHRleHQgc2VsZWN0aW9uIHRvIGltcHJvdmUgdGhlIGRyYWdnaW5nIGdlc3R1cmUuIE1haW5seSBmb3IgZGVza3RvcCBicm93c2Vycy5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERpc2FibGUgdGhlIFdpbmRvd3MgUGhvbmUgZ3JpcHBlcnMgd2hlbiBwcmVzc2luZyBhbiBlbGVtZW50LlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIHRvdWNoU2VsZWN0OiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERpc2FibGVzIHRoZSBkZWZhdWx0IGNhbGxvdXQgc2hvd24gd2hlbiB5b3UgdG91Y2ggYW5kIGhvbGQgYSB0b3VjaCB0YXJnZXQuXG4gICAgICAgICAqIE9uIGlPUywgd2hlbiB5b3UgdG91Y2ggYW5kIGhvbGQgYSB0b3VjaCB0YXJnZXQgc3VjaCBhcyBhIGxpbmssIFNhZmFyaSBkaXNwbGF5c1xuICAgICAgICAgKiBhIGNhbGxvdXQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGluay4gVGhpcyBwcm9wZXJ0eSBhbGxvd3MgeW91IHRvIGRpc2FibGUgdGhhdCBjYWxsb3V0LlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIHRvdWNoQ2FsbG91dDogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB6b29taW5nIGlzIGVuYWJsZWQuIFVzZWQgYnkgSUUxMD5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICBjb250ZW50Wm9vbWluZzogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCBhbiBlbnRpcmUgZWxlbWVudCBzaG91bGQgYmUgZHJhZ2dhYmxlIGluc3RlYWQgb2YgaXRzIGNvbnRlbnRzLiBNYWlubHkgZm9yIGRlc2t0b3AgYnJvd3NlcnMuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdXNlckRyYWc6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogT3ZlcnJpZGVzIHRoZSBoaWdobGlnaHQgY29sb3Igc2hvd24gd2hlbiB0aGUgdXNlciB0YXBzIGEgbGluayBvciBhIEphdmFTY3JpcHRcbiAgICAgICAgICogY2xpY2thYmxlIGVsZW1lbnQgaW4gaU9TLiBUaGlzIHByb3BlcnR5IG9iZXlzIHRoZSBhbHBoYSB2YWx1ZSwgaWYgc3BlY2lmaWVkLlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAncmdiYSgwLDAsMCwwKSdcbiAgICAgICAgICovXG4gICAgICAgIHRhcEhpZ2hsaWdodENvbG9yOiAncmdiYSgwLDAsMCwwKSdcbiAgICB9XG59O1xuXG52YXIgU1RPUCA9IDE7XG52YXIgRk9SQ0VEX1NUT1AgPSAyO1xuXG4vKipcbiAqIE1hbmFnZXJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBNYW5hZ2VyKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIEhhbW1lci5kZWZhdWx0cywgb3B0aW9ucyB8fCB7fSk7XG5cbiAgICB0aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXQgPSB0aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXQgfHwgZWxlbWVudDtcblxuICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICB0aGlzLnNlc3Npb24gPSB7fTtcbiAgICB0aGlzLnJlY29nbml6ZXJzID0gW107XG4gICAgdGhpcy5vbGRDc3NQcm9wcyA9IHt9O1xuXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmlucHV0ID0gY3JlYXRlSW5wdXRJbnN0YW5jZSh0aGlzKTtcbiAgICB0aGlzLnRvdWNoQWN0aW9uID0gbmV3IFRvdWNoQWN0aW9uKHRoaXMsIHRoaXMub3B0aW9ucy50b3VjaEFjdGlvbik7XG5cbiAgICB0b2dnbGVDc3NQcm9wcyh0aGlzLCB0cnVlKTtcblxuICAgIGVhY2godGhpcy5vcHRpb25zLnJlY29nbml6ZXJzLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHZhciByZWNvZ25pemVyID0gdGhpcy5hZGQobmV3IChpdGVtWzBdKShpdGVtWzFdKSk7XG4gICAgICAgIGl0ZW1bMl0gJiYgcmVjb2duaXplci5yZWNvZ25pemVXaXRoKGl0ZW1bMl0pO1xuICAgICAgICBpdGVtWzNdICYmIHJlY29nbml6ZXIucmVxdWlyZUZhaWx1cmUoaXRlbVszXSk7XG4gICAgfSwgdGhpcyk7XG59XG5cbk1hbmFnZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNldCBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7TWFuYWdlcn1cbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gT3B0aW9ucyB0aGF0IG5lZWQgYSBsaXR0bGUgbW9yZSBzZXR1cFxuICAgICAgICBpZiAob3B0aW9ucy50b3VjaEFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbnB1dFRhcmdldCkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZXhpc3RpbmcgZXZlbnQgbGlzdGVuZXJzIGFuZCByZWluaXRpYWxpemVcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dC50YXJnZXQgPSBvcHRpb25zLmlucHV0VGFyZ2V0O1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5pbml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHN0b3AgcmVjb2duaXppbmcgZm9yIHRoaXMgc2Vzc2lvbi5cbiAgICAgKiBUaGlzIHNlc3Npb24gd2lsbCBiZSBkaXNjYXJkZWQsIHdoZW4gYSBuZXcgW2lucHV0XXN0YXJ0IGV2ZW50IGlzIGZpcmVkLlxuICAgICAqIFdoZW4gZm9yY2VkLCB0aGUgcmVjb2duaXplciBjeWNsZSBpcyBzdG9wcGVkIGltbWVkaWF0ZWx5LlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2ZvcmNlXVxuICAgICAqL1xuICAgIHN0b3A6IGZ1bmN0aW9uKGZvcmNlKSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5zdG9wcGVkID0gZm9yY2UgPyBGT1JDRURfU1RPUCA6IFNUT1A7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJ1biB0aGUgcmVjb2duaXplcnMhXG4gICAgICogY2FsbGVkIGJ5IHRoZSBpbnB1dEhhbmRsZXIgZnVuY3Rpb24gb24gZXZlcnkgbW92ZW1lbnQgb2YgdGhlIHBvaW50ZXJzICh0b3VjaGVzKVxuICAgICAqIGl0IHdhbGtzIHRocm91Z2ggYWxsIHRoZSByZWNvZ25pemVycyBhbmQgdHJpZXMgdG8gZGV0ZWN0IHRoZSBnZXN0dXJlIHRoYXQgaXMgYmVpbmcgbWFkZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICAgKi9cbiAgICByZWNvZ25pemU6IGZ1bmN0aW9uKGlucHV0RGF0YSkge1xuICAgICAgICB2YXIgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbjtcbiAgICAgICAgaWYgKHNlc3Npb24uc3RvcHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcnVuIHRoZSB0b3VjaC1hY3Rpb24gcG9seWZpbGxcbiAgICAgICAgdGhpcy50b3VjaEFjdGlvbi5wcmV2ZW50RGVmYXVsdHMoaW5wdXREYXRhKTtcblxuICAgICAgICB2YXIgcmVjb2duaXplcjtcbiAgICAgICAgdmFyIHJlY29nbml6ZXJzID0gdGhpcy5yZWNvZ25pemVycztcblxuICAgICAgICAvLyB0aGlzIGhvbGRzIHRoZSByZWNvZ25pemVyIHRoYXQgaXMgYmVpbmcgcmVjb2duaXplZC5cbiAgICAgICAgLy8gc28gdGhlIHJlY29nbml6ZXIncyBzdGF0ZSBuZWVkcyB0byBiZSBCRUdBTiwgQ0hBTkdFRCwgRU5ERUQgb3IgUkVDT0dOSVpFRFxuICAgICAgICAvLyBpZiBubyByZWNvZ25pemVyIGlzIGRldGVjdGluZyBhIHRoaW5nLCBpdCBpcyBzZXQgdG8gYG51bGxgXG4gICAgICAgIHZhciBjdXJSZWNvZ25pemVyID0gc2Vzc2lvbi5jdXJSZWNvZ25pemVyO1xuXG4gICAgICAgIC8vIHJlc2V0IHdoZW4gdGhlIGxhc3QgcmVjb2duaXplciBpcyByZWNvZ25pemVkXG4gICAgICAgIC8vIG9yIHdoZW4gd2UncmUgaW4gYSBuZXcgc2Vzc2lvblxuICAgICAgICBpZiAoIWN1clJlY29nbml6ZXIgfHwgKGN1clJlY29nbml6ZXIgJiYgY3VyUmVjb2duaXplci5zdGF0ZSAmIFNUQVRFX1JFQ09HTklaRUQpKSB7XG4gICAgICAgICAgICBjdXJSZWNvZ25pemVyID0gc2Vzc2lvbi5jdXJSZWNvZ25pemVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCByZWNvZ25pemVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlY29nbml6ZXIgPSByZWNvZ25pemVyc1tpXTtcblxuICAgICAgICAgICAgLy8gZmluZCBvdXQgaWYgd2UgYXJlIGFsbG93ZWQgdHJ5IHRvIHJlY29nbml6ZSB0aGUgaW5wdXQgZm9yIHRoaXMgb25lLlxuICAgICAgICAgICAgLy8gMS4gICBhbGxvdyBpZiB0aGUgc2Vzc2lvbiBpcyBOT1QgZm9yY2VkIHN0b3BwZWQgKHNlZSB0aGUgLnN0b3AoKSBtZXRob2QpXG4gICAgICAgICAgICAvLyAyLiAgIGFsbG93IGlmIHdlIHN0aWxsIGhhdmVuJ3QgcmVjb2duaXplZCBhIGdlc3R1cmUgaW4gdGhpcyBzZXNzaW9uLCBvciB0aGUgdGhpcyByZWNvZ25pemVyIGlzIHRoZSBvbmVcbiAgICAgICAgICAgIC8vICAgICAgdGhhdCBpcyBiZWluZyByZWNvZ25pemVkLlxuICAgICAgICAgICAgLy8gMy4gICBhbGxvdyBpZiB0aGUgcmVjb2duaXplciBpcyBhbGxvd2VkIHRvIHJ1biBzaW11bHRhbmVvdXMgd2l0aCB0aGUgY3VycmVudCByZWNvZ25pemVkIHJlY29nbml6ZXIuXG4gICAgICAgICAgICAvLyAgICAgIHRoaXMgY2FuIGJlIHNldHVwIHdpdGggdGhlIGByZWNvZ25pemVXaXRoKClgIG1ldGhvZCBvbiB0aGUgcmVjb2duaXplci5cbiAgICAgICAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQgIT09IEZPUkNFRF9TVE9QICYmICggLy8gMVxuICAgICAgICAgICAgICAgICAgICAhY3VyUmVjb2duaXplciB8fCByZWNvZ25pemVyID09IGN1clJlY29nbml6ZXIgfHwgLy8gMlxuICAgICAgICAgICAgICAgICAgICByZWNvZ25pemVyLmNhblJlY29nbml6ZVdpdGgoY3VyUmVjb2duaXplcikpKSB7IC8vIDNcbiAgICAgICAgICAgICAgICByZWNvZ25pemVyLnJlY29nbml6ZShpbnB1dERhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWNvZ25pemVyLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZSByZWNvZ25pemVyIGhhcyBiZWVuIHJlY29nbml6aW5nIHRoZSBpbnB1dCBhcyBhIHZhbGlkIGdlc3R1cmUsIHdlIHdhbnQgdG8gc3RvcmUgdGhpcyBvbmUgYXMgdGhlXG4gICAgICAgICAgICAvLyBjdXJyZW50IGFjdGl2ZSByZWNvZ25pemVyLiBidXQgb25seSBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYW4gYWN0aXZlIHJlY29nbml6ZXJcbiAgICAgICAgICAgIGlmICghY3VyUmVjb2duaXplciAmJiByZWNvZ25pemVyLnN0YXRlICYgKFNUQVRFX0JFR0FOIHwgU1RBVEVfQ0hBTkdFRCB8IFNUQVRFX0VOREVEKSkge1xuICAgICAgICAgICAgICAgIGN1clJlY29nbml6ZXIgPSBzZXNzaW9uLmN1clJlY29nbml6ZXIgPSByZWNvZ25pemVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGdldCBhIHJlY29nbml6ZXIgYnkgaXRzIGV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfFN0cmluZ30gcmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfE51bGx9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbihyZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChyZWNvZ25pemVyIGluc3RhbmNlb2YgUmVjb2duaXplcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlY29nbml6ZXI7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocmVjb2duaXplcnNbaV0ub3B0aW9ucy5ldmVudCA9PSByZWNvZ25pemVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29nbml6ZXJzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBhZGQgYSByZWNvZ25pemVyIHRvIHRoZSBtYW5hZ2VyXG4gICAgICogZXhpc3RpbmcgcmVjb2duaXplcnMgd2l0aCB0aGUgc2FtZSBldmVudCBuYW1lIHdpbGwgYmUgcmVtb3ZlZFxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gcmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfE1hbmFnZXJ9XG4gICAgICovXG4gICAgYWRkOiBmdW5jdGlvbihyZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhyZWNvZ25pemVyLCAnYWRkJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGV4aXN0aW5nXG4gICAgICAgIHZhciBleGlzdGluZyA9IHRoaXMuZ2V0KHJlY29nbml6ZXIub3B0aW9ucy5ldmVudCk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoZXhpc3RpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWNvZ25pemVycy5wdXNoKHJlY29nbml6ZXIpO1xuICAgICAgICByZWNvZ25pemVyLm1hbmFnZXIgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYSByZWNvZ25pemVyIGJ5IG5hbWUgb3IgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge01hbmFnZXJ9XG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbihyZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhyZWNvZ25pemVyLCAncmVtb3ZlJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVjb2duaXplciA9IHRoaXMuZ2V0KHJlY29nbml6ZXIpO1xuXG4gICAgICAgIC8vIGxldCdzIG1ha2Ugc3VyZSB0aGlzIHJlY29nbml6ZXIgZXhpc3RzXG4gICAgICAgIGlmIChyZWNvZ25pemVyKSB7XG4gICAgICAgICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gaW5BcnJheShyZWNvZ25pemVycywgcmVjb2duaXplcik7XG5cbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZWNvZ25pemVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogYmluZCBldmVudFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAgICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gdGhpc1xuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbihldmVudHMsIGhhbmRsZXIpIHtcbiAgICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycztcbiAgICAgICAgZWFjaChzcGxpdFN0cihldmVudHMpLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaGFuZGxlcnNbZXZlbnRdID0gaGFuZGxlcnNbZXZlbnRdIHx8IFtdO1xuICAgICAgICAgICAgaGFuZGxlcnNbZXZlbnRdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdW5iaW5kIGV2ZW50LCBsZWF2ZSBlbWl0IGJsYW5rIHRvIHJlbW92ZSBhbGwgaGFuZGxlcnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hhbmRsZXJdXG4gICAgICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gdGhpc1xuICAgICAqL1xuICAgIG9mZjogZnVuY3Rpb24oZXZlbnRzLCBoYW5kbGVyKSB7XG4gICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycztcbiAgICAgICAgZWFjaChzcGxpdFN0cihldmVudHMpLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGhhbmRsZXJzW2V2ZW50XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbZXZlbnRdICYmIGhhbmRsZXJzW2V2ZW50XS5zcGxpY2UoaW5BcnJheShoYW5kbGVyc1tldmVudF0sIGhhbmRsZXIpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBlbWl0IGV2ZW50IHRvIHRoZSBsaXN0ZW5lcnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgICAqL1xuICAgIGVtaXQ6IGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgIC8vIHdlIGFsc28gd2FudCB0byB0cmlnZ2VyIGRvbSBldmVudHNcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kb21FdmVudHMpIHtcbiAgICAgICAgICAgIHRyaWdnZXJEb21FdmVudChldmVudCwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBubyBoYW5kbGVycywgc28gc2tpcCBpdCBhbGxcbiAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc1tldmVudF0gJiYgdGhpcy5oYW5kbGVyc1tldmVudF0uc2xpY2UoKTtcbiAgICAgICAgaWYgKCFoYW5kbGVycyB8fCAhaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnR5cGUgPSBldmVudDtcbiAgICAgICAgZGF0YS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZGF0YS5zcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhhbmRsZXJzW2ldKGRhdGEpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGRlc3Ryb3kgdGhlIG1hbmFnZXIgYW5kIHVuYmluZHMgYWxsIGV2ZW50c1xuICAgICAqIGl0IGRvZXNuJ3QgdW5iaW5kIGRvbSBldmVudHMsIHRoYXQgaXMgdGhlIHVzZXIgb3duIHJlc3BvbnNpYmlsaXR5XG4gICAgICovXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCAmJiB0b2dnbGVDc3NQcm9wcyh0aGlzLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgICB0aGlzLnNlc3Npb24gPSB7fTtcbiAgICAgICAgdGhpcy5pbnB1dC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgfVxufTtcblxuLyoqXG4gKiBhZGQvcmVtb3ZlIHRoZSBjc3MgcHJvcGVydGllcyBhcyBkZWZpbmVkIGluIG1hbmFnZXIub3B0aW9ucy5jc3NQcm9wc1xuICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFkZFxuICovXG5mdW5jdGlvbiB0b2dnbGVDc3NQcm9wcyhtYW5hZ2VyLCBhZGQpIHtcbiAgICB2YXIgZWxlbWVudCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICBpZiAoIWVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcHJvcDtcbiAgICBlYWNoKG1hbmFnZXIub3B0aW9ucy5jc3NQcm9wcywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgcHJvcCA9IHByZWZpeGVkKGVsZW1lbnQuc3R5bGUsIG5hbWUpO1xuICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICBtYW5hZ2VyLm9sZENzc1Byb3BzW3Byb3BdID0gZWxlbWVudC5zdHlsZVtwcm9wXTtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSBtYW5hZ2VyLm9sZENzc1Byb3BzW3Byb3BdIHx8ICcnO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFhZGQpIHtcbiAgICAgICAgbWFuYWdlci5vbGRDc3NQcm9wcyA9IHt9O1xuICAgIH1cbn1cblxuLyoqXG4gKiB0cmlnZ2VyIGRvbSBldmVudFxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICovXG5mdW5jdGlvbiB0cmlnZ2VyRG9tRXZlbnQoZXZlbnQsIGRhdGEpIHtcbiAgICB2YXIgZ2VzdHVyZUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZ2VzdHVyZUV2ZW50LmluaXRFdmVudChldmVudCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZ2VzdHVyZUV2ZW50Lmdlc3R1cmUgPSBkYXRhO1xuICAgIGRhdGEudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZ2VzdHVyZUV2ZW50KTtcbn1cblxuYXNzaWduKEhhbW1lciwge1xuICAgIElOUFVUX1NUQVJUOiBJTlBVVF9TVEFSVCxcbiAgICBJTlBVVF9NT1ZFOiBJTlBVVF9NT1ZFLFxuICAgIElOUFVUX0VORDogSU5QVVRfRU5ELFxuICAgIElOUFVUX0NBTkNFTDogSU5QVVRfQ0FOQ0VMLFxuXG4gICAgU1RBVEVfUE9TU0lCTEU6IFNUQVRFX1BPU1NJQkxFLFxuICAgIFNUQVRFX0JFR0FOOiBTVEFURV9CRUdBTixcbiAgICBTVEFURV9DSEFOR0VEOiBTVEFURV9DSEFOR0VELFxuICAgIFNUQVRFX0VOREVEOiBTVEFURV9FTkRFRCxcbiAgICBTVEFURV9SRUNPR05JWkVEOiBTVEFURV9SRUNPR05JWkVELFxuICAgIFNUQVRFX0NBTkNFTExFRDogU1RBVEVfQ0FOQ0VMTEVELFxuICAgIFNUQVRFX0ZBSUxFRDogU1RBVEVfRkFJTEVELFxuXG4gICAgRElSRUNUSU9OX05PTkU6IERJUkVDVElPTl9OT05FLFxuICAgIERJUkVDVElPTl9MRUZUOiBESVJFQ1RJT05fTEVGVCxcbiAgICBESVJFQ1RJT05fUklHSFQ6IERJUkVDVElPTl9SSUdIVCxcbiAgICBESVJFQ1RJT05fVVA6IERJUkVDVElPTl9VUCxcbiAgICBESVJFQ1RJT05fRE9XTjogRElSRUNUSU9OX0RPV04sXG4gICAgRElSRUNUSU9OX0hPUklaT05UQUw6IERJUkVDVElPTl9IT1JJWk9OVEFMLFxuICAgIERJUkVDVElPTl9WRVJUSUNBTDogRElSRUNUSU9OX1ZFUlRJQ0FMLFxuICAgIERJUkVDVElPTl9BTEw6IERJUkVDVElPTl9BTEwsXG5cbiAgICBNYW5hZ2VyOiBNYW5hZ2VyLFxuICAgIElucHV0OiBJbnB1dCxcbiAgICBUb3VjaEFjdGlvbjogVG91Y2hBY3Rpb24sXG5cbiAgICBUb3VjaElucHV0OiBUb3VjaElucHV0LFxuICAgIE1vdXNlSW5wdXQ6IE1vdXNlSW5wdXQsXG4gICAgUG9pbnRlckV2ZW50SW5wdXQ6IFBvaW50ZXJFdmVudElucHV0LFxuICAgIFRvdWNoTW91c2VJbnB1dDogVG91Y2hNb3VzZUlucHV0LFxuICAgIFNpbmdsZVRvdWNoSW5wdXQ6IFNpbmdsZVRvdWNoSW5wdXQsXG5cbiAgICBSZWNvZ25pemVyOiBSZWNvZ25pemVyLFxuICAgIEF0dHJSZWNvZ25pemVyOiBBdHRyUmVjb2duaXplcixcbiAgICBUYXA6IFRhcFJlY29nbml6ZXIsXG4gICAgUGFuOiBQYW5SZWNvZ25pemVyLFxuICAgIFN3aXBlOiBTd2lwZVJlY29nbml6ZXIsXG4gICAgUGluY2g6IFBpbmNoUmVjb2duaXplcixcbiAgICBSb3RhdGU6IFJvdGF0ZVJlY29nbml6ZXIsXG4gICAgUHJlc3M6IFByZXNzUmVjb2duaXplcixcblxuICAgIG9uOiBhZGRFdmVudExpc3RlbmVycyxcbiAgICBvZmY6IHJlbW92ZUV2ZW50TGlzdGVuZXJzLFxuICAgIGVhY2g6IGVhY2gsXG4gICAgbWVyZ2U6IG1lcmdlLFxuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIGFzc2lnbjogYXNzaWduLFxuICAgIGluaGVyaXQ6IGluaGVyaXQsXG4gICAgYmluZEZuOiBiaW5kRm4sXG4gICAgcHJlZml4ZWQ6IHByZWZpeGVkXG59KTtcblxuLy8gdGhpcyBwcmV2ZW50cyBlcnJvcnMgd2hlbiBIYW1tZXIgaXMgbG9hZGVkIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTURcbi8vICBzdHlsZSBsb2FkZXIgYnV0IGJ5IHNjcmlwdCB0YWcsIG5vdCBieSB0aGUgbG9hZGVyLlxudmFyIGZyZWVHbG9iYWwgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9KSk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuZnJlZUdsb2JhbC5IYW1tZXIgPSBIYW1tZXI7XG5cbmlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBIYW1tZXI7XG4gICAgfSk7XG59IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEhhbW1lcjtcbn0gZWxzZSB7XG4gICAgd2luZG93W2V4cG9ydE5hbWVdID0gSGFtbWVyO1xufVxuXG59KSh3aW5kb3csIGRvY3VtZW50LCAnSGFtbWVyJyk7XG4iXSwic291cmNlUm9vdCI6IiJ9