"use strict";function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(t,e){"object"===("undefined"==typeof exports?"undefined":_typeof(exports))&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(void 0,function(t,g,u){function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(I,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ot,popperConfig:null},Vt="show",zt={HIDE:"hide"+qt,HIDDEN:"hidden"+qt,SHOW:"show"+qt,SHOWN:"shown"+qt,INSERTED:"inserted"+qt,CLICK:"click"+qt,FOCUSIN:"focusin"+qt,FOCUSOUT:"focusout"+qt,MOUSEENTER:"mouseenter"+qt,MOUSELEAVE:"mouseleave"+qt},Kt="fade",Xt="show",Yt="hover",$t="focus",Jt=function(){function i(t,e){if(void 0===u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Xt))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=m.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(Kt);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,this._getPopperConfig(a)),g(o).addClass(Xt),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),"out"===t&&e._leave(null,e)};if(g(this.tip).hasClass(Kt)){var h=m.getTransitionDurationFromElement(this.tip);g(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){function e(){n._hoverState!==Vt&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),g(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()}var n=this,i=this.getTipElement(),o=g.Event(this.constructor.Event.HIDE);if(g(this.element).trigger(o),!o.isDefaultPrevented()){if(g(i).removeClass(Xt),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger.click=!1,this._activeTrigger[$t]=!1,this._activeTrigger[Yt]=!1,g(this.tip).hasClass(Kt)){var r=m.getTransitionDurationFromElement(i);g(i).one(m.TRANSITION_END,e).emulateTransitionEnd(r)}else e();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Qt+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(".tooltip-inner")),this.getTitle()),g(t).removeClass(Kt+" "+Xt)},t.setElementContent=function(t,e){"object"!==_typeof(e)||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=xt(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t=t||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},t._getPopperConfig=function(t){var e=this;return l(l({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),this.config.popperConfig)},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l(l({},t.offsets),e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Mt[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if("manual"!==t){var e=t===Yt?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Yt?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),this._hideModalHandler=function(){i.element&&i.hide()},g(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l(l({},this.config),{},{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=_typeof(this.element.getAttribute("data-original-title"));!this.element.getAttribute("title")&&"string"===t||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?$t:Yt]=!0),g(e.getTipElement()).hasClass(Xt)||e._hoverState===Vt?e._hoverState=Vt:(clearTimeout(e._timeout),e._hoverState=Vt,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Vt&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?$t:Yt]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){"out"===e._hoverState&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Ht.indexOf(t)&&delete e[t]}),"number"==typeof(t=l(l(l({},this.constructor.Default),e),"object"===_typeof(t)&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),m.typeCheckConfig(Lt,t,this.constructor.DefaultType),t.sanitize&&(t.template=xt(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Bt);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(Kt),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Rt),e="object"===_typeof(n)&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Rt,t)),"string"==typeof n)){if(void 0===t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"Default",get:function(){return Wt}},{key:"NAME",get:function(){return Lt}},{key:"DATA_KEY",get:function(){return Rt}},{key:"Event",get:function(){return zt}},{key:"EVENT_KEY",get:function(){return qt}},{key:"DefaultType",get:function(){return Ut}}]),i}();g.fn[Lt]=Jt._jQueryInterface,g.fn[Lt].Constructor=Jt,g.fn[Lt].noConflict=function(){return g.fn[Lt]=Ft,Jt._jQueryInterface};var Gt="popover",Zt="bs.popover",te="."+Zt,ee=g.fn[Gt],ne="bs-popover",ie=new RegExp("(^|\\s)"+ne+"\\S+","g"),oe=l(l({},Jt.Default),{},{placement:"right",trigger:"click",content:"",template:''}),re=l(l({},Jt.DefaultType),{},{content:"(string|element|function)"}),se={HIDE:"hide"+te,HIDDEN:"hidden"+te,SHOW:"show"+te,SHOWN:"shown"+te,INSERTED:"inserted"+te,CLICK:"click"+te,FOCUSIN:"focusin"+te,FOCUSOUT:"focusout"+te,MOUSEENTER:"mouseenter"+te,MOUSELEAVE:"mouseleave"+te},ae=function(t){function i(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),(t.prototype.constructor=t).__proto__=e}(i,t);var e=i.prototype;return e.isWithContent=function(){return this.getTitle()||this._getContent()},e.addAttachmentClass=function(t){g(this.getTipElement()).addClass(ne+"-"+t)},e.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},e.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},e._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},e._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(ie);null!==e&&0=this._offsets[o]&&(void 0===this._offsets[o+1]||t li > .active",Se=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&g(this._element).hasClass(we)||g(this._element).hasClass("disabled"))){var t,i,e=g(this._element).closest(".nav, .list-group")[0],o=m.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?Ce:Te;i=(i=g.makeArray(g(e).find(r)))[i.length-1]}var s=g.Event("hide.bs.tab",{relatedTarget:this._element}),a=g.Event("show.bs.tab",{relatedTarget:i});if(i&&g(i).trigger(s),g(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=g.Event("hidden.bs.tab",{relatedTarget:n._element}),e=g.Event("shown.bs.tab",{relatedTarget:i});g(i).trigger(t),g(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){g.removeData(this._element,be),this._element=null},t._activate=function(t,e,n){function i(){return o._transitionComplete(t,r,n)}var o=this,r=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?g(e).children(Te):g(e).find(Ce))[0],s=n&&r&&g(r).hasClass("fade");if(r&&s){var a=m.getTransitionDurationFromElement(r);g(r).removeClass("show").one(m.TRANSITION_END,i).emulateTransitionEnd(a)}else i()},t._transitionComplete=function(t,e,n){if(e){g(e).removeClass(we);var i=g(e.parentNode).find("> .dropdown-menu .active")[0];i&&g(i).removeClass(we),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(g(t).addClass(we),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),m.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&g(t.parentNode).hasClass("dropdown-menu")){var o=g(t).closest(".dropdown")[0];if(o){var r=[].slice.call(o.querySelectorAll(".dropdown-toggle"));g(r).addClass(we)}t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(be);if(e||(e=new i(this),t.data(be,e)),"string"==typeof n){if(void 0===e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.5.0"}}]),i}();g(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',function(t){t.preventDefault(),Se._jQueryInterface.call(g(this),"show")}),g.fn.tab=Se._jQueryInterface,g.fn.tab.Constructor=Se,g.fn.tab.noConflict=function(){return g.fn.tab=Ee,Se._jQueryInterface};var De="toast",Ne="bs.toast",ke="."+Ne,Ae=g.fn[De],Ie="click.dismiss"+ke,Oe="show",je="showing",Pe={animation:"boolean",autohide:"boolean",delay:"number"},xe={animation:!0,autohide:!0,delay:500},Le=function(){function o(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=o.prototype;return t.show=function(){var t=this,e=g.Event("show.bs.toast");if(g(this._element).trigger(e),!e.isDefaultPrevented()){this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove(je),t._element.classList.add(Oe),g(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout(function(){t.hide()},t._config.delay))};if(this._element.classList.remove("hide"),m.reflow(this._element),this._element.classList.add(je),this._config.animation){var i=m.getTransitionDurationFromElement(this._element);g(this._element).one(m.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},t.hide=function(){if(this._element.classList.contains(Oe)){var t=g.Event("hide.bs.toast");g(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(Oe)&&this._element.classList.remove(Oe),g(this._element).off(Ie),g.removeData(this._element,Ne),this._element=null,this._config=null},t._getConfig=function(t){return t=l(l(l({},xe),g(this._element).data()),"object"===_typeof(t)&&t?t:{}),m.typeCheckConfig(De,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;g(this._element).on(Ie,'[data-dismiss="toast"]',function(){return t.hide()})},t._close=function(){function t(){e._element.classList.add("hide"),g(e._element).trigger("hidden.bs.toast")}var e=this;if(this._element.classList.remove(Oe),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);g(this._element).one(m.TRANSITION_END,t).emulateTransitionEnd(n)}else t()},o._jQueryInterface=function(i){return this.each(function(){var t=g(this),e=t.data(Ne),n="object"===_typeof(i)&&i;if(e||(e=new o(this,n),t.data(Ne,e)),"string"==typeof i){if(void 0===e[i])throw new TypeError('No method named "'+i+'"');e[i](this)}})},s(o,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"DefaultType",get:function(){return Pe}},{key:"Default",get:function(){return xe}}]),o}();g.fn[De]=Le._jQueryInterface,g.fn[De].Constructor=Le,g.fn[De].noConflict=function(){return g.fn[De]=Ae,Le._jQueryInterface},t.Alert=h,t.Button=E,t.Carousel=x,t.Collapse=V,t.Dropdown=ct,t.Modal=At,t.Popover=ae,t.Scrollspy=ye,t.Tab=Se,t.Toast=Le,t.Tooltip=Jt,t.Util=m,Object.defineProperty(t,"__esModule",{value:!0})}); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb3RzdHJhcC5qcyJdLCJuYW1lcyI6WyJnbG9iYWwiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIl90eXBlb2YiLCJtb2R1bGUiLCJyZXF1aXJlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsImJvb3RzdHJhcCIsImpRdWVyeSIsIlBvcHBlciIsIiQiLCJfZGVmaW5lUHJvcGVydGllcyIsInRhcmdldCIsInByb3BzIiwiaSIsImxlbmd0aCIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImtleSIsIl9jcmVhdGVDbGFzcyIsIkNvbnN0cnVjdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwicHJvdG90eXBlIiwib3duS2V5cyIsIm9iamVjdCIsImVudW1lcmFibGVPbmx5Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsInN5bWJvbHMiLCJmaWx0ZXIiLCJzeW0iLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkMiIsImFyZ3VtZW50cyIsInNvdXJjZSIsImZvckVhY2giLCJvYmoiLCJ2YWx1ZSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiVFJBTlNJVElPTl9FTkQiLCJ0cmFuc2l0aW9uRW5kRW11bGF0b3IiLCJkdXJhdGlvbiIsIl90aGlzIiwidGhpcyIsImNhbGxlZCIsIm9uZSIsIlV0aWwiLCJzZXRUaW1lb3V0IiwidHJpZ2dlclRyYW5zaXRpb25FbmQiLCJnZXRVSUQiLCJwcmVmaXgiLCJNYXRoIiwicmFuZG9tIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldFNlbGVjdG9yRnJvbUVsZW1lbnQiLCJlbGVtZW50Iiwic2VsZWN0b3IiLCJnZXRBdHRyaWJ1dGUiLCJocmVmQXR0ciIsInRyaW0iLCJxdWVyeVNlbGVjdG9yIiwiZXJyIiwiZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJjc3MiLCJ0cmFuc2l0aW9uRGVsYXkiLCJmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiIsInBhcnNlRmxvYXQiLCJmbG9hdFRyYW5zaXRpb25EZWxheSIsInNwbGl0IiwicmVmbG93Iiwib2Zmc2V0SGVpZ2h0IiwidHJpZ2dlciIsInN1cHBvcnRzVHJhbnNpdGlvbkVuZCIsIkJvb2xlYW4iLCJpc0VsZW1lbnQiLCJub2RlVHlwZSIsInR5cGVDaGVja0NvbmZpZyIsImNvbXBvbmVudE5hbWUiLCJjb25maWciLCJjb25maWdUeXBlcyIsInByb3BlcnR5IiwiZXhwZWN0ZWRUeXBlcyIsInZhbHVlVHlwZSIsInRvU3RyaW5nIiwibWF0Y2giLCJ0b0xvd2VyQ2FzZSIsIlJlZ0V4cCIsInRlc3QiLCJFcnJvciIsInRvVXBwZXJDYXNlIiwiZmluZFNoYWRvd1Jvb3QiLCJkb2N1bWVudEVsZW1lbnQiLCJhdHRhY2hTaGFkb3ciLCJnZXRSb290Tm9kZSIsIlNoYWRvd1Jvb3QiLCJwYXJlbnROb2RlIiwicm9vdCIsImpRdWVyeURldGVjdGlvbiIsIlR5cGVFcnJvciIsInZlcnNpb24iLCJmbiIsImpxdWVyeSIsImVtdWxhdGVUcmFuc2l0aW9uRW5kIiwiZXZlbnQiLCJzcGVjaWFsIiwiYmluZFR5cGUiLCJkZWxlZ2F0ZVR5cGUiLCJoYW5kbGUiLCJpcyIsImhhbmRsZU9iaiIsImhhbmRsZXIiLCJOQU1FIiwiREFUQV9LRVkiLCJKUVVFUllfTk9fQ09ORkxJQ1QiLCJBbGVydCIsIl9lbGVtZW50IiwiX3Byb3RvIiwiY2xvc2UiLCJyb290RWxlbWVudCIsIl9nZXRSb290RWxlbWVudCIsIl90cmlnZ2VyQ2xvc2VFdmVudCIsImlzRGVmYXVsdFByZXZlbnRlZCIsIl9yZW1vdmVFbGVtZW50IiwiZGlzcG9zZSIsInJlbW92ZURhdGEiLCJwYXJlbnQiLCJjbG9zZXN0IiwiY2xvc2VFdmVudCIsIkV2ZW50IiwicmVtb3ZlQ2xhc3MiLCJoYXNDbGFzcyIsIl9kZXN0cm95RWxlbWVudCIsImRldGFjaCIsInJlbW92ZSIsIl9qUXVlcnlJbnRlcmZhY2UiLCJlYWNoIiwiJGVsZW1lbnQiLCJkYXRhIiwiX2hhbmRsZURpc21pc3MiLCJhbGVydEluc3RhbmNlIiwicHJldmVudERlZmF1bHQiLCJnZXQiLCJvbiIsIm5vQ29uZmxpY3QiLCJOQU1FJDEiLCJEQVRBX0tFWSQxIiwiSlFVRVJZX05PX0NPTkZMSUNUJDEiLCJDTEFTU19OQU1FX0FDVElWRSIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFX0NBUlJPVCIsIlNFTEVDVE9SX0lOUFVUIiwiU0VMRUNUT1JfQlVUVE9OIiwiQnV0dG9uIiwidG9nZ2xlIiwidHJpZ2dlckNoYW5nZUV2ZW50IiwiYWRkQXJpYVByZXNzZWQiLCJpbnB1dCIsInR5cGUiLCJjaGVja2VkIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJhY3RpdmVFbGVtZW50IiwiZm9jdXMiLCJoYXNBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJ0b2dnbGVDbGFzcyIsImJ1dHRvbiIsImluaXRpYWxCdXR0b24iLCJpbnB1dEJ0biIsInRhZ05hbWUiLCJ3aW5kb3ciLCJidXR0b25zIiwic2xpY2UiLCJxdWVyeVNlbGVjdG9yQWxsIiwibGVuIiwiYWRkIiwiX2kiLCJfbGVuIiwiX2J1dHRvbiIsIk5BTUUkMiIsIkRBVEFfS0VZJDIiLCJFVkVOVF9LRVkkMiIsIkpRVUVSWV9OT19DT05GTElDVCQyIiwiRGVmYXVsdCIsImludGVydmFsIiwia2V5Ym9hcmQiLCJzbGlkZSIsInBhdXNlIiwid3JhcCIsInRvdWNoIiwiRGVmYXVsdFR5cGUiLCJESVJFQ1RJT05fTkVYVCIsIkRJUkVDVElPTl9QUkVWIiwiRVZFTlRfU0xJRCIsIkNMQVNTX05BTUVfQUNUSVZFJDEiLCJTRUxFQ1RPUl9BQ1RJVkVfSVRFTSIsIlBvaW50ZXJUeXBlIiwiVE9VQ0giLCJQRU4iLCJDYXJvdXNlbCIsIl9pdGVtcyIsIl9pbnRlcnZhbCIsIl9hY3RpdmVFbGVtZW50IiwiX2lzUGF1c2VkIiwiX2lzU2xpZGluZyIsInRvdWNoVGltZW91dCIsInRvdWNoU3RhcnRYIiwidG91Y2hEZWx0YVgiLCJfY29uZmlnIiwiX2dldENvbmZpZyIsIl9pbmRpY2F0b3JzRWxlbWVudCIsIl90b3VjaFN1cHBvcnRlZCIsIm5hdmlnYXRvciIsIm1heFRvdWNoUG9pbnRzIiwiX3BvaW50ZXJFdmVudCIsIlBvaW50ZXJFdmVudCIsIk1TUG9pbnRlckV2ZW50IiwiX2FkZEV2ZW50TGlzdGVuZXJzIiwibmV4dCIsIl9zbGlkZSIsIm5leHRXaGVuVmlzaWJsZSIsImhpZGRlbiIsInByZXYiLCJjeWNsZSIsImNsZWFySW50ZXJ2YWwiLCJzZXRJbnRlcnZhbCIsInZpc2liaWxpdHlTdGF0ZSIsImJpbmQiLCJ0byIsImluZGV4IiwiYWN0aXZlSW5kZXgiLCJfZ2V0SXRlbUluZGV4IiwiZGlyZWN0aW9uIiwib2ZmIiwiX2hhbmRsZVN3aXBlIiwiYWJzRGVsdGF4IiwiYWJzIiwiX3RoaXMyIiwiX2tleWRvd24iLCJfYWRkVG91Y2hFdmVudExpc3RlbmVycyIsIl90aGlzMyIsInN0YXJ0Iiwib3JpZ2luYWxFdmVudCIsInBvaW50ZXJUeXBlIiwiY2xpZW50WCIsInRvdWNoZXMiLCJlbmQiLCJjbGVhclRpbWVvdXQiLCJlIiwibW92ZSIsIndoaWNoIiwiaW5kZXhPZiIsIl9nZXRJdGVtQnlEaXJlY3Rpb24iLCJpc05leHREaXJlY3Rpb24iLCJpc1ByZXZEaXJlY3Rpb24iLCJsYXN0SXRlbUluZGV4IiwiaXRlbUluZGV4IiwiX3RyaWdnZXJTbGlkZUV2ZW50IiwicmVsYXRlZFRhcmdldCIsImV2ZW50RGlyZWN0aW9uTmFtZSIsInRhcmdldEluZGV4IiwiZnJvbUluZGV4Iiwic2xpZGVFdmVudCIsImZyb20iLCJfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudCIsImluZGljYXRvcnMiLCJuZXh0SW5kaWNhdG9yIiwiY2hpbGRyZW4iLCJhZGRDbGFzcyIsImRpcmVjdGlvbmFsQ2xhc3NOYW1lIiwib3JkZXJDbGFzc05hbWUiLCJfdGhpczQiLCJhY3RpdmVFbGVtZW50SW5kZXgiLCJuZXh0RWxlbWVudCIsIm5leHRFbGVtZW50SW5kZXgiLCJpc0N5Y2xpbmciLCJzbGlkRXZlbnQiLCJuZXh0RWxlbWVudEludGVydmFsIiwicGFyc2VJbnQiLCJkZWZhdWx0SW50ZXJ2YWwiLCJhY3Rpb24iLCJyaWRlIiwiX2RhdGFBcGlDbGlja0hhbmRsZXIiLCJzbGlkZUluZGV4IiwiY2Fyb3VzZWxzIiwiJGNhcm91c2VsIiwiTkFNRSQzIiwiREFUQV9LRVkkMyIsIkpRVUVSWV9OT19DT05GTElDVCQzIiwiRGVmYXVsdCQxIiwiRGVmYXVsdFR5cGUkMSIsIkNMQVNTX05BTUVfU0hPVyQxIiwiQ0xBU1NfTkFNRV9DT0xMQVBTRSIsIkNMQVNTX05BTUVfQ09MTEFQU0lORyIsIkNMQVNTX05BTUVfQ09MTEFQU0VEIiwiU0VMRUNUT1JfREFUQV9UT0dHTEUkMSIsIkNvbGxhcHNlIiwiX2lzVHJhbnNpdGlvbmluZyIsIl90cmlnZ2VyQXJyYXkiLCJpZCIsInRvZ2dsZUxpc3QiLCJlbGVtIiwiZmlsdGVyRWxlbWVudCIsImZvdW5kRWxlbSIsIl9zZWxlY3RvciIsIl9wYXJlbnQiLCJfZ2V0UGFyZW50IiwiX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyIsImhpZGUiLCJzaG93IiwiYWN0aXZlcyIsImFjdGl2ZXNEYXRhIiwibm90Iiwic3RhcnRFdmVudCIsImRpbWVuc2lvbiIsIl9nZXREaW1lbnNpb24iLCJzdHlsZSIsImF0dHIiLCJzZXRUcmFuc2l0aW9uaW5nIiwic2Nyb2xsU2l6ZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInRyaWdnZXJBcnJheUxlbmd0aCIsImlzVHJhbnNpdGlvbmluZyIsIl9nZXRUYXJnZXRGcm9tRWxlbWVudCIsInRyaWdnZXJBcnJheSIsImlzT3BlbiIsIiR0aGlzIiwiY3VycmVudFRhcmdldCIsIiR0cmlnZ2VyIiwic2VsZWN0b3JzIiwiJHRhcmdldCIsIk5BTUUkNCIsIkRBVEFfS0VZJDQiLCJFVkVOVF9LRVkkNCIsIkRBVEFfQVBJX0tFWSQ0IiwiSlFVRVJZX05PX0NPTkZMSUNUJDQiLCJSRUdFWFBfS0VZRE9XTiIsIkFSUk9XX1VQX0tFWUNPREUiLCJFVkVOVF9ISURFJDEiLCJFVkVOVF9ISURERU4kMSIsIkVWRU5UX0NMSUNLX0RBVEFfQVBJJDQiLCJFVkVOVF9LRVlET1dOX0RBVEFfQVBJIiwiQ0xBU1NfTkFNRV9ESVNBQkxFRCIsIkNMQVNTX05BTUVfU0hPVyQyIiwiQ0xBU1NfTkFNRV9NRU5VUklHSFQiLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyIiwiU0VMRUNUT1JfTUVOVSIsIkRlZmF1bHQkMiIsIm9mZnNldCIsImZsaXAiLCJib3VuZGFyeSIsInJlZmVyZW5jZSIsImRpc3BsYXkiLCJwb3BwZXJDb25maWciLCJEZWZhdWx0VHlwZSQyIiwiRHJvcGRvd24iLCJfcG9wcGVyIiwiX21lbnUiLCJfZ2V0TWVudUVsZW1lbnQiLCJfaW5OYXZiYXIiLCJfZGV0ZWN0TmF2YmFyIiwiZGlzYWJsZWQiLCJpc0FjdGl2ZSIsIl9jbGVhck1lbnVzIiwidXNlUG9wcGVyIiwic2hvd0V2ZW50IiwiX2dldFBhcmVudEZyb21FbGVtZW50IiwicmVmZXJlbmNlRWxlbWVudCIsIl9nZXRQb3BwZXJDb25maWciLCJib2R5Iiwibm9vcCIsImhpZGVFdmVudCIsImRlc3Ryb3kiLCJ1cGRhdGUiLCJzY2hlZHVsZVVwZGF0ZSIsInN0b3BQcm9wYWdhdGlvbiIsImNvbnN0cnVjdG9yIiwiX2dldFBsYWNlbWVudCIsIiRwYXJlbnREcm9wZG93biIsInBsYWNlbWVudCIsIl9nZXRPZmZzZXQiLCJvZmZzZXRzIiwibW9kaWZpZXJzIiwiZW5hYmxlZCIsInByZXZlbnRPdmVyZmxvdyIsImJvdW5kYXJpZXNFbGVtZW50IiwiYXBwbHlTdHlsZSIsInRvZ2dsZXMiLCJjb250ZXh0IiwiY2xpY2tFdmVudCIsImRyb3Bkb3duTWVudSIsIl9kYXRhQXBpS2V5ZG93bkhhbmRsZXIiLCJpdGVtcyIsIml0ZW0iLCJOQU1FJDUiLCJEQVRBX0tFWSQ1IiwiRVZFTlRfS0VZJDUiLCJKUVVFUllfTk9fQ09ORkxJQ1QkNSIsIkRlZmF1bHQkMyIsImJhY2tkcm9wIiwiRGVmYXVsdFR5cGUkMyIsIkVWRU5UX0hJRERFTiQyIiwiRVZFTlRfU0hPVyQyIiwiRVZFTlRfRk9DVVNJTiIsIkVWRU5UX1JFU0laRSIsIkVWRU5UX0NMSUNLX0RJU01JU1MiLCJFVkVOVF9LRVlET1dOX0RJU01JU1MiLCJFVkVOVF9NT1VTRURPV05fRElTTUlTUyIsIkNMQVNTX05BTUVfT1BFTiIsIkNMQVNTX05BTUVfRkFERSQxIiwiQ0xBU1NfTkFNRV9TSE9XJDMiLCJDTEFTU19OQU1FX1NUQVRJQyIsIlNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQiLCJTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCIsIk1vZGFsIiwiX2RpYWxvZyIsIl9iYWNrZHJvcCIsIl9pc1Nob3duIiwiX2lzQm9keU92ZXJmbG93aW5nIiwiX2lnbm9yZUJhY2tkcm9wQ2xpY2siLCJfc2Nyb2xsYmFyV2lkdGgiLCJfY2hlY2tTY3JvbGxiYXIiLCJfc2V0U2Nyb2xsYmFyIiwiX2FkanVzdERpYWxvZyIsIl9zZXRFc2NhcGVFdmVudCIsIl9zZXRSZXNpemVFdmVudCIsIl9zaG93QmFja2Ryb3AiLCJfc2hvd0VsZW1lbnQiLCJ0cmFuc2l0aW9uIiwiX2hpZGVNb2RhbCIsImh0bWxFbGVtZW50IiwiaGFuZGxlVXBkYXRlIiwiX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24iLCJoaWRlRXZlbnRQcmV2ZW50ZWQiLCJkZWZhdWx0UHJldmVudGVkIiwibW9kYWxUcmFuc2l0aW9uRHVyYXRpb24iLCJtb2RhbEJvZHkiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwiYXBwZW5kQ2hpbGQiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzY3JvbGxUb3AiLCJfZW5mb3JjZUZvY3VzIiwidHJhbnNpdGlvbkNvbXBsZXRlIiwic2hvd25FdmVudCIsIl90aGlzNSIsImhhcyIsIl90aGlzNiIsIl90aGlzNyIsIl90aGlzOCIsIl9yZXNldEFkanVzdG1lbnRzIiwiX3Jlc2V0U2Nyb2xsYmFyIiwiX3JlbW92ZUJhY2tkcm9wIiwiY2FsbGJhY2siLCJfdGhpczkiLCJhbmltYXRlIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImFwcGVuZFRvIiwiYmFja2Ryb3BUcmFuc2l0aW9uRHVyYXRpb24iLCJjYWxsYmFja1JlbW92ZSIsIl9iYWNrZHJvcFRyYW5zaXRpb25EdXJhdGlvbiIsImlzTW9kYWxPdmVyZmxvd2luZyIsInNjcm9sbEhlaWdodCIsImNsaWVudEhlaWdodCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwicmVjdCIsInJvdW5kIiwibGVmdCIsInJpZ2h0IiwiaW5uZXJXaWR0aCIsIl9nZXRTY3JvbGxiYXJXaWR0aCIsIl90aGlzMTAiLCJmaXhlZENvbnRlbnQiLCJzdGlja3lDb250ZW50IiwiYWN0dWFsUGFkZGluZyIsImNhbGN1bGF0ZWRQYWRkaW5nIiwiYWN0dWFsTWFyZ2luIiwibWFyZ2luUmlnaHQiLCJjYWxjdWxhdGVkTWFyZ2luIiwicGFkZGluZyIsImVsZW1lbnRzIiwibWFyZ2luIiwic2Nyb2xsRGl2Iiwic2Nyb2xsYmFyV2lkdGgiLCJ3aWR0aCIsImNsaWVudFdpZHRoIiwicmVtb3ZlQ2hpbGQiLCJfdGhpczExIiwidXJpQXR0cnMiLCJEZWZhdWx0V2hpdGVsaXN0IiwiKiIsImEiLCJhcmVhIiwiYiIsImJyIiwiY29sIiwiY29kZSIsImRpdiIsImVtIiwiaHIiLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJpbWciLCJsaSIsIm9sIiwicCIsInByZSIsInMiLCJzbWFsbCIsInNwYW4iLCJzdWIiLCJzdXAiLCJzdHJvbmciLCJ1IiwidWwiLCJTQUZFX1VSTF9QQVRURVJOIiwiREFUQV9VUkxfUEFUVEVSTiIsInNhbml0aXplSHRtbCIsInVuc2FmZUh0bWwiLCJ3aGl0ZUxpc3QiLCJzYW5pdGl6ZUZuIiwiY3JlYXRlZERvY3VtZW50IiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwid2hpdGVsaXN0S2V5cyIsIl9sb29wIiwiZWwiLCJlbE5hbWUiLCJub2RlTmFtZSIsImF0dHJpYnV0ZUxpc3QiLCJhdHRyaWJ1dGVzIiwid2hpdGVsaXN0ZWRBdHRyaWJ1dGVzIiwiY29uY2F0IiwiYWxsb3dlZEF0dHJpYnV0ZUxpc3QiLCJhdHRyTmFtZSIsIm5vZGVWYWx1ZSIsInJlZ0V4cCIsImF0dHJSZWdleCIsImFsbG93ZWRBdHRyaWJ1dGUiLCJpbm5lckhUTUwiLCJOQU1FJDYiLCJEQVRBX0tFWSQ2IiwiRVZFTlRfS0VZJDYiLCJKUVVFUllfTk9fQ09ORkxJQ1QkNiIsIkNMQVNTX1BSRUZJWCIsIkJTQ0xTX1BSRUZJWF9SRUdFWCIsIkRJU0FMTE9XRURfQVRUUklCVVRFUyIsIkRlZmF1bHRUeXBlJDQiLCJhbmltYXRpb24iLCJ0ZW1wbGF0ZSIsInRpdGxlIiwiZGVsYXkiLCJodG1sIiwiY29udGFpbmVyIiwiZmFsbGJhY2tQbGFjZW1lbnQiLCJzYW5pdGl6ZSIsIkF0dGFjaG1lbnRNYXAiLCJBVVRPIiwiVE9QIiwiUklHSFQiLCJCT1RUT00iLCJMRUZUIiwiRGVmYXVsdCQ0IiwiSE9WRVJfU1RBVEVfU0hPVyIsIkhJREUiLCJISURERU4iLCJTSE9XIiwiU0hPV04iLCJJTlNFUlRFRCIsIkNMSUNLIiwiRk9DVVNJTiIsIkZPQ1VTT1VUIiwiTU9VU0VFTlRFUiIsIk1PVVNFTEVBVkUiLCJDTEFTU19OQU1FX0ZBREUkMiIsIkNMQVNTX05BTUVfU0hPVyQ0IiwiVFJJR0dFUl9IT1ZFUiIsIlRSSUdHRVJfRk9DVVMiLCJUb29sdGlwIiwiX2lzRW5hYmxlZCIsIl90aW1lb3V0IiwiX2hvdmVyU3RhdGUiLCJfYWN0aXZlVHJpZ2dlciIsInRpcCIsIl9zZXRMaXN0ZW5lcnMiLCJlbmFibGUiLCJkaXNhYmxlIiwidG9nZ2xlRW5hYmxlZCIsImRhdGFLZXkiLCJfZ2V0RGVsZWdhdGVDb25maWciLCJjbGljayIsIl9pc1dpdGhBY3RpdmVUcmlnZ2VyIiwiX2VudGVyIiwiX2xlYXZlIiwiZ2V0VGlwRWxlbWVudCIsIkVWRU5UX0tFWSIsIl9oaWRlTW9kYWxIYW5kbGVyIiwiaXNXaXRoQ29udGVudCIsInNoYWRvd1Jvb3QiLCJpc0luVGhlRG9tIiwib3duZXJEb2N1bWVudCIsInRpcElkIiwic2V0Q29udGVudCIsImF0dGFjaG1lbnQiLCJfZ2V0QXR0YWNobWVudCIsImFkZEF0dGFjaG1lbnRDbGFzcyIsIl9nZXRDb250YWluZXIiLCJjb21wbGV0ZSIsIl9maXhUcmFuc2l0aW9uIiwicHJldkhvdmVyU3RhdGUiLCJfY2xlYW5UaXBDbGFzcyIsImdldFRpdGxlIiwic2V0RWxlbWVudENvbnRlbnQiLCJjb250ZW50IiwidGV4dCIsImVtcHR5IiwiYXBwZW5kIiwiYmVoYXZpb3IiLCJhcnJvdyIsIm9uQ3JlYXRlIiwib3JpZ2luYWxQbGFjZW1lbnQiLCJfaGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlIiwib25VcGRhdGUiLCJmaW5kIiwiZXZlbnRJbiIsImV2ZW50T3V0IiwiX2ZpeFRpdGxlIiwidGl0bGVUeXBlIiwiZGF0YUF0dHJpYnV0ZXMiLCJkYXRhQXR0ciIsIiR0aXAiLCJ0YWJDbGFzcyIsImpvaW4iLCJwb3BwZXJEYXRhIiwiaW5zdGFuY2UiLCJwb3BwZXIiLCJpbml0Q29uZmlnQW5pbWF0aW9uIiwiTkFNRSQ3IiwiREFUQV9LRVkkNyIsIkVWRU5UX0tFWSQ3IiwiSlFVRVJZX05PX0NPTkZMSUNUJDciLCJDTEFTU19QUkVGSVgkMSIsIkJTQ0xTX1BSRUZJWF9SRUdFWCQxIiwiRGVmYXVsdCQ1IiwiRGVmYXVsdFR5cGUkNSIsIkV2ZW50JDEiLCJQb3BvdmVyIiwiX1Rvb2x0aXAiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJfX3Byb3RvX18iLCJfaW5oZXJpdHNMb29zZSIsIl9nZXRDb250ZW50IiwiQ0xBU1NfTkFNRV9GQURFJDMiLCJOQU1FJDgiLCJEQVRBX0tFWSQ4IiwiRVZFTlRfS0VZJDgiLCJKUVVFUllfTk9fQ09ORkxJQ1QkOCIsIkRlZmF1bHQkNiIsIm1ldGhvZCIsIkRlZmF1bHRUeXBlJDYiLCJDTEFTU19OQU1FX0FDVElWRSQyIiwiU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVAiLCJTRUxFQ1RPUl9OQVZfTElOS1MiLCJTRUxFQ1RPUl9MSVNUX0lURU1TIiwiTUVUSE9EX1BPU0lUSU9OIiwiU2Nyb2xsU3B5IiwiX3Njcm9sbEVsZW1lbnQiLCJfb2Zmc2V0cyIsIl90YXJnZXRzIiwiX2FjdGl2ZVRhcmdldCIsIl9zY3JvbGxIZWlnaHQiLCJfcHJvY2VzcyIsInJlZnJlc2giLCJhdXRvTWV0aG9kIiwib2Zmc2V0TWV0aG9kIiwib2Zmc2V0QmFzZSIsIl9nZXRTY3JvbGxUb3AiLCJfZ2V0U2Nyb2xsSGVpZ2h0IiwibWFwIiwidGFyZ2V0U2VsZWN0b3IiLCJ0YXJnZXRCQ1IiLCJoZWlnaHQiLCJ0b3AiLCJzb3J0IiwicGFnZVlPZmZzZXQiLCJtYXgiLCJfZ2V0T2Zmc2V0SGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJtYXhTY3JvbGwiLCJfYWN0aXZhdGUiLCJfY2xlYXIiLCJxdWVyaWVzIiwiJGxpbmsiLCJwYXJlbnRzIiwibm9kZSIsInNjcm9sbFNweXMiLCIkc3B5IiwiREFUQV9LRVkkOSIsIkpRVUVSWV9OT19DT05GTElDVCQ5IiwiQ0xBU1NfTkFNRV9BQ1RJVkUkMyIsIlNFTEVDVE9SX0FDVElWRSQyIiwiU0VMRUNUT1JfQUNUSVZFX1VMIiwiVGFiIiwicHJldmlvdXMiLCJsaXN0RWxlbWVudCIsIml0ZW1TZWxlY3RvciIsIm1ha2VBcnJheSIsImhpZGRlbkV2ZW50IiwiX3RyYW5zaXRpb25Db21wbGV0ZSIsImFjdGl2ZSIsImRyb3Bkb3duQ2hpbGQiLCJkcm9wZG93bkVsZW1lbnQiLCJkcm9wZG93blRvZ2dsZUxpc3QiLCJOQU1FJGEiLCJEQVRBX0tFWSRhIiwiRVZFTlRfS0VZJGEiLCJKUVVFUllfTk9fQ09ORkxJQ1QkYSIsIkVWRU5UX0NMSUNLX0RJU01JU1MkMSIsIkNMQVNTX05BTUVfU0hPVyQ3IiwiQ0xBU1NfTkFNRV9TSE9XSU5HIiwiRGVmYXVsdFR5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dCI6WyIvKiFcbiAgKiBCb290c3RyYXAgdjQuNS4wIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjAgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdqcXVlcnknKSwgcmVxdWlyZSgncG9wcGVyLmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdqcXVlcnknLCAncG9wcGVyLmpzJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbC5ib290c3RyYXAgPSB7fSwgZ2xvYmFsLmpRdWVyeSwgZ2xvYmFsLlBvcHBlcikpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsICQsIFBvcHBlcikgeyAndXNlIHN0cmljdCc7XG5cbiAgJCA9ICQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCQsICdkZWZhdWx0JykgPyAkWydkZWZhdWx0J10gOiAkO1xuICBQb3BwZXIgPSBQb3BwZXIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFBvcHBlciwgJ2RlZmF1bHQnKSA/IFBvcHBlclsnZGVmYXVsdCddIDogUG9wcGVyO1xuXG4gIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KTtcbiAgICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgICAgaWYgKGkgJSAyKSB7XG4gICAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuNS4wKTogdXRpbC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBQcml2YXRlIFRyYW5zaXRpb25FbmQgSGVscGVyc1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnO1xuICB2YXIgTUFYX1VJRCA9IDEwMDAwMDA7XG4gIHZhciBNSUxMSVNFQ09ORFNfTVVMVElQTElFUiA9IDEwMDA7IC8vIFNob3V0b3V0IEFuZ3VzQ3JvbGwgKGh0dHBzOi8vZ29vLmdsL3B4d1FHcClcblxuICBmdW5jdGlvbiB0b1R5cGUob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIFwiXCIgKyBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9LnRvU3RyaW5nLmNhbGwob2JqKS5tYXRjaCgvXFxzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNwZWNpYWxUcmFuc2l0aW9uRW5kRXZlbnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJpbmRUeXBlOiBUUkFOU0lUSU9OX0VORCxcbiAgICAgIGRlbGVnYXRlVHlwZTogVFJBTlNJVElPTl9FTkQsXG4gICAgICBoYW5kbGU6IGZ1bmN0aW9uIGhhbmRsZShldmVudCkge1xuICAgICAgICBpZiAoJChldmVudC50YXJnZXQpLmlzKHRoaXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kRW11bGF0b3IoZHVyYXRpb24pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICAgICQodGhpcykub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgICBVdGlsLnRyaWdnZXJUcmFuc2l0aW9uRW5kKF90aGlzKTtcbiAgICAgIH1cbiAgICB9LCBkdXJhdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uRW5kU3VwcG9ydCgpIHtcbiAgICAkLmZuLmVtdWxhdGVUcmFuc2l0aW9uRW5kID0gdHJhbnNpdGlvbkVuZEVtdWxhdG9yO1xuICAgICQuZXZlbnQuc3BlY2lhbFtVdGlsLlRSQU5TSVRJT05fRU5EXSA9IGdldFNwZWNpYWxUcmFuc2l0aW9uRW5kRXZlbnQoKTtcbiAgfVxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogUHVibGljIFV0aWwgQXBpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgdmFyIFV0aWwgPSB7XG4gICAgVFJBTlNJVElPTl9FTkQ6ICdic1RyYW5zaXRpb25FbmQnLFxuICAgIGdldFVJRDogZnVuY3Rpb24gZ2V0VUlEKHByZWZpeCkge1xuICAgICAgZG8ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICBwcmVmaXggKz0gfn4oTWF0aC5yYW5kb20oKSAqIE1BWF9VSUQpOyAvLyBcIn5+XCIgYWN0cyBsaWtlIGEgZmFzdGVyIE1hdGguZmxvb3IoKSBoZXJlXG4gICAgICB9IHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmVmaXgpKTtcblxuICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQ6IGZ1bmN0aW9uIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0Jyk7XG5cbiAgICAgIGlmICghc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICcjJykge1xuICAgICAgICB2YXIgaHJlZkF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgICBzZWxlY3RvciA9IGhyZWZBdHRyICYmIGhyZWZBdHRyICE9PSAnIycgPyBocmVmQXR0ci50cmltKCkgOiAnJztcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpID8gc2VsZWN0b3IgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQ6IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcblxuXG4gICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gJChlbGVtZW50KS5jc3MoJ3RyYW5zaXRpb24tZHVyYXRpb24nKTtcbiAgICAgIHZhciB0cmFuc2l0aW9uRGVsYXkgPSAkKGVsZW1lbnQpLmNzcygndHJhbnNpdGlvbi1kZWxheScpO1xuICAgICAgdmFyIGZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uID0gcGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgdmFyIGZsb2F0VHJhbnNpdGlvbkRlbGF5ID0gcGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpOyAvLyBSZXR1cm4gMCBpZiBlbGVtZW50IG9yIHRyYW5zaXRpb24gZHVyYXRpb24gaXMgbm90IGZvdW5kXG5cbiAgICAgIGlmICghZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gJiYgIWZsb2F0VHJhbnNpdGlvbkRlbGF5KSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSAvLyBJZiBtdWx0aXBsZSBkdXJhdGlvbnMgYXJlIGRlZmluZWQsIHRha2UgdGhlIGZpcnN0XG5cblxuICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uLnNwbGl0KCcsJylbMF07XG4gICAgICB0cmFuc2l0aW9uRGVsYXkgPSB0cmFuc2l0aW9uRGVsYXkuc3BsaXQoJywnKVswXTtcbiAgICAgIHJldHVybiAocGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pICsgcGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpKSAqIE1JTExJU0VDT05EU19NVUxUSVBMSUVSO1xuICAgIH0sXG4gICAgcmVmbG93OiBmdW5jdGlvbiByZWZsb3coZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH0sXG4gICAgdHJpZ2dlclRyYW5zaXRpb25FbmQ6IGZ1bmN0aW9uIHRyaWdnZXJUcmFuc2l0aW9uRW5kKGVsZW1lbnQpIHtcbiAgICAgICQoZWxlbWVudCkudHJpZ2dlcihUUkFOU0lUSU9OX0VORCk7XG4gICAgfSxcbiAgICAvLyBUT0RPOiBSZW1vdmUgaW4gdjVcbiAgICBzdXBwb3J0c1RyYW5zaXRpb25FbmQ6IGZ1bmN0aW9uIHN1cHBvcnRzVHJhbnNpdGlvbkVuZCgpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKFRSQU5TSVRJT05fRU5EKTtcbiAgICB9LFxuICAgIGlzRWxlbWVudDogZnVuY3Rpb24gaXNFbGVtZW50KG9iaikge1xuICAgICAgcmV0dXJuIChvYmpbMF0gfHwgb2JqKS5ub2RlVHlwZTtcbiAgICB9LFxuICAgIHR5cGVDaGVja0NvbmZpZzogZnVuY3Rpb24gdHlwZUNoZWNrQ29uZmlnKGNvbXBvbmVudE5hbWUsIGNvbmZpZywgY29uZmlnVHlwZXMpIHtcbiAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGNvbmZpZ1R5cGVzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnVHlwZXMsIHByb3BlcnR5KSkge1xuICAgICAgICAgIHZhciBleHBlY3RlZFR5cGVzID0gY29uZmlnVHlwZXNbcHJvcGVydHldO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV07XG4gICAgICAgICAgdmFyIHZhbHVlVHlwZSA9IHZhbHVlICYmIFV0aWwuaXNFbGVtZW50KHZhbHVlKSA/ICdlbGVtZW50JyA6IHRvVHlwZSh2YWx1ZSk7XG5cbiAgICAgICAgICBpZiAoIW5ldyBSZWdFeHAoZXhwZWN0ZWRUeXBlcykudGVzdCh2YWx1ZVR5cGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29tcG9uZW50TmFtZS50b1VwcGVyQ2FzZSgpICsgXCI6IFwiICsgKFwiT3B0aW9uIFxcXCJcIiArIHByb3BlcnR5ICsgXCJcXFwiIHByb3ZpZGVkIHR5cGUgXFxcIlwiICsgdmFsdWVUeXBlICsgXCJcXFwiIFwiKSArIChcImJ1dCBleHBlY3RlZCB0eXBlIFxcXCJcIiArIGV4cGVjdGVkVHlwZXMgKyBcIlxcXCIuXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbmRTaGFkb3dSb290OiBmdW5jdGlvbiBmaW5kU2hhZG93Um9vdChlbGVtZW50KSB7XG4gICAgICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hdHRhY2hTaGFkb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IC8vIENhbiBmaW5kIHRoZSBzaGFkb3cgcm9vdCBvdGhlcndpc2UgaXQnbGwgcmV0dXJuIHRoZSBkb2N1bWVudFxuXG5cbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5nZXRSb290Tm9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgcmV0dXJuIHJvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290ID8gcm9vdCA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgIH0gLy8gd2hlbiB3ZSBkb24ndCBmaW5kIGEgc2hhZG93IHJvb3RcblxuXG4gICAgICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFV0aWwuZmluZFNoYWRvd1Jvb3QoZWxlbWVudC5wYXJlbnROb2RlKTtcbiAgICB9LFxuICAgIGpRdWVyeURldGVjdGlvbjogZnVuY3Rpb24galF1ZXJ5RGV0ZWN0aW9uKCkge1xuICAgICAgaWYgKHR5cGVvZiAkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5LiBqUXVlcnkgbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0LicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmVyc2lvbiA9ICQuZm4uanF1ZXJ5LnNwbGl0KCcgJylbMF0uc3BsaXQoJy4nKTtcbiAgICAgIHZhciBtaW5NYWpvciA9IDE7XG4gICAgICB2YXIgbHRNYWpvciA9IDI7XG4gICAgICB2YXIgbWluTWlub3IgPSA5O1xuICAgICAgdmFyIG1pblBhdGNoID0gMTtcbiAgICAgIHZhciBtYXhNYWpvciA9IDQ7XG5cbiAgICAgIGlmICh2ZXJzaW9uWzBdIDwgbHRNYWpvciAmJiB2ZXJzaW9uWzFdIDwgbWluTWlub3IgfHwgdmVyc2lvblswXSA9PT0gbWluTWFqb3IgJiYgdmVyc2lvblsxXSA9PT0gbWluTWlub3IgJiYgdmVyc2lvblsyXSA8IG1pblBhdGNoIHx8IHZlcnNpb25bMF0gPj0gbWF4TWFqb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb290c3RyYXBcXCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgYXQgbGVhc3QgalF1ZXJ5IHYxLjkuMSBidXQgbGVzcyB0aGFuIHY0LjAuMCcpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgVXRpbC5qUXVlcnlEZXRlY3Rpb24oKTtcbiAgc2V0VHJhbnNpdGlvbkVuZFN1cHBvcnQoKTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUgPSAnYWxlcnQnO1xuICB2YXIgVkVSU0lPTiA9ICc0LjUuMCc7XG4gIHZhciBEQVRBX0tFWSA9ICdicy5hbGVydCc7XG4gIHZhciBFVkVOVF9LRVkgPSBcIi5cIiArIERBVEFfS0VZO1xuICB2YXIgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkLmZuW05BTUVdO1xuICB2YXIgU0VMRUNUT1JfRElTTUlTUyA9ICdbZGF0YS1kaXNtaXNzPVwiYWxlcnRcIl0nO1xuICB2YXIgRVZFTlRfQ0xPU0UgPSBcImNsb3NlXCIgKyBFVkVOVF9LRVk7XG4gIHZhciBFVkVOVF9DTE9TRUQgPSBcImNsb3NlZFwiICsgRVZFTlRfS0VZO1xuICB2YXIgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVk7XG4gIHZhciBDTEFTU19OQU1FX0FMRVJUID0gJ2FsZXJ0JztcbiAgdmFyIENMQVNTX05BTUVfRkFERSA9ICdmYWRlJztcbiAgdmFyIENMQVNTX05BTUVfU0hPVyA9ICdzaG93JztcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgQWxlcnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFsZXJ0KGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gQWxlcnQucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLmNsb3NlID0gZnVuY3Rpb24gY2xvc2UoZWxlbWVudCkge1xuICAgICAgdmFyIHJvb3RFbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcblxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSB0aGlzLl9nZXRSb290RWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1c3RvbUV2ZW50ID0gdGhpcy5fdHJpZ2dlckNsb3NlRXZlbnQocm9vdEVsZW1lbnQpO1xuXG4gICAgICBpZiAoY3VzdG9tRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZW1vdmVFbGVtZW50KHJvb3RFbGVtZW50KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Um9vdEVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0Um9vdEVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgdmFyIHBhcmVudCA9IGZhbHNlO1xuXG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgIHBhcmVudCA9ICQoZWxlbWVudCkuY2xvc2VzdChcIi5cIiArIENMQVNTX05BTUVfQUxFUlQpWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3RyaWdnZXJDbG9zZUV2ZW50ID0gZnVuY3Rpb24gX3RyaWdnZXJDbG9zZUV2ZW50KGVsZW1lbnQpIHtcbiAgICAgIHZhciBjbG9zZUV2ZW50ID0gJC5FdmVudChFVkVOVF9DTE9TRSk7XG4gICAgICAkKGVsZW1lbnQpLnRyaWdnZXIoY2xvc2VFdmVudCk7XG4gICAgICByZXR1cm4gY2xvc2VFdmVudDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZW1vdmVFbGVtZW50ID0gZnVuY3Rpb24gX3JlbW92ZUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgJChlbGVtZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1cpO1xuXG4gICAgICBpZiAoISQoZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFKSkge1xuICAgICAgICB0aGlzLl9kZXN0cm95RWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgJChlbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5fZGVzdHJveUVsZW1lbnQoZWxlbWVudCwgZXZlbnQpO1xuICAgICAgfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9kZXN0cm95RWxlbWVudCA9IGZ1bmN0aW9uIF9kZXN0cm95RWxlbWVudChlbGVtZW50KSB7XG4gICAgICAkKGVsZW1lbnQpLmRldGFjaCgpLnRyaWdnZXIoRVZFTlRfQ0xPU0VEKS5yZW1vdmUoKTtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIEFsZXJ0Ll9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkZWxlbWVudCA9ICQodGhpcyk7XG4gICAgICAgIHZhciBkYXRhID0gJGVsZW1lbnQuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBBbGVydCh0aGlzKTtcbiAgICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfS0VZLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcgPT09ICdjbG9zZScpIHtcbiAgICAgICAgICBkYXRhW2NvbmZpZ10odGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBBbGVydC5faGFuZGxlRGlzbWlzcyA9IGZ1bmN0aW9uIF9oYW5kbGVEaXNtaXNzKGFsZXJ0SW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFsZXJ0SW5zdGFuY2UuY2xvc2UodGhpcyk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoQWxlcnQsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBBbGVydDtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICQoZG9jdW1lbnQpLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9ESVNNSVNTLCBBbGVydC5faGFuZGxlRGlzbWlzcyhuZXcgQWxlcnQoKSkpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJC5mbltOQU1FXSA9IEFsZXJ0Ll9qUXVlcnlJbnRlcmZhY2U7XG4gICQuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBBbGVydDtcblxuICAkLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbltOQU1FXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICByZXR1cm4gQWxlcnQuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkMSA9ICdidXR0b24nO1xuICB2YXIgVkVSU0lPTiQxID0gJzQuNS4wJztcbiAgdmFyIERBVEFfS0VZJDEgPSAnYnMuYnV0dG9uJztcbiAgdmFyIEVWRU5UX0tFWSQxID0gXCIuXCIgKyBEQVRBX0tFWSQxO1xuICB2YXIgREFUQV9BUElfS0VZJDEgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQxID0gJC5mbltOQU1FJDFdO1xuICB2YXIgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJztcbiAgdmFyIENMQVNTX05BTUVfQlVUVE9OID0gJ2J0bic7XG4gIHZhciBDTEFTU19OQU1FX0ZPQ1VTID0gJ2ZvY3VzJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFX0NBUlJPVCA9ICdbZGF0YS10b2dnbGVePVwiYnV0dG9uXCJdJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFUyA9ICdbZGF0YS10b2dnbGU9XCJidXR0b25zXCJdJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLXRvZ2dsZT1cImJ1dHRvblwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRVNfQlVUVE9OUyA9ICdbZGF0YS10b2dnbGU9XCJidXR0b25zXCJdIC5idG4nO1xuICB2YXIgU0VMRUNUT1JfSU5QVVQgPSAnaW5wdXQ6bm90KFt0eXBlPVwiaGlkZGVuXCJdKSc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkUgPSAnLmFjdGl2ZSc7XG4gIHZhciBTRUxFQ1RPUl9CVVRUT04gPSAnLmJ0bic7XG4gIHZhciBFVkVOVF9DTElDS19EQVRBX0FQSSQxID0gXCJjbGlja1wiICsgRVZFTlRfS0VZJDEgKyBEQVRBX0FQSV9LRVkkMTtcbiAgdmFyIEVWRU5UX0ZPQ1VTX0JMVVJfREFUQV9BUEkgPSBcImZvY3VzXCIgKyBFVkVOVF9LRVkkMSArIERBVEFfQVBJX0tFWSQxICsgXCIgXCIgKyAoXCJibHVyXCIgKyBFVkVOVF9LRVkkMSArIERBVEFfQVBJX0tFWSQxKTtcbiAgdmFyIEVWRU5UX0xPQURfREFUQV9BUEkgPSBcImxvYWRcIiArIEVWRU5UX0tFWSQxICsgREFUQV9BUElfS0VZJDE7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnV0dG9uKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gQnV0dG9uLnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoKSB7XG4gICAgICB2YXIgdHJpZ2dlckNoYW5nZUV2ZW50ID0gdHJ1ZTtcbiAgICAgIHZhciBhZGRBcmlhUHJlc3NlZCA9IHRydWU7XG4gICAgICB2YXIgcm9vdEVsZW1lbnQgPSAkKHRoaXMuX2VsZW1lbnQpLmNsb3Nlc3QoU0VMRUNUT1JfREFUQV9UT0dHTEVTKVswXTtcblxuICAgICAgaWYgKHJvb3RFbGVtZW50KSB7XG4gICAgICAgIHZhciBpbnB1dCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9JTlBVVCk7XG5cbiAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICYmIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyQ2hhbmdlRXZlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBhY3RpdmVFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9BQ1RJVkUpO1xuXG4gICAgICAgICAgICAgIGlmIChhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgJChhY3RpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgICAvLyBpZiBpdCdzIG5vdCBhIHJhZGlvIGJ1dHRvbiBvciBjaGVja2JveCBkb24ndCBhZGQgYSBwb2ludGxlc3MvaW52YWxpZCBjaGVja2VkIHByb3BlcnR5IHRvIHRoZSBpbnB1dFxuICAgICAgICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgaW5wdXQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gIXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJChpbnB1dCkudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICBhZGRBcmlhUHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghKHRoaXMuX2VsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSkge1xuICAgICAgICBpZiAoYWRkQXJpYVByZXNzZWQpIHtcbiAgICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgIXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgJCh0aGlzLl9lbGVtZW50KS50b2dnbGVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDEpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBCdXR0b24uX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoREFUQV9LRVkkMSk7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBCdXR0b24odGhpcyk7XG4gICAgICAgICAgJCh0aGlzKS5kYXRhKERBVEFfS0VZJDEsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhCdXR0b24sIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDE7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIEJ1dHRvbjtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICQoZG9jdW1lbnQpLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJJDEsIFNFTEVDVE9SX0RBVEFfVE9HR0xFX0NBUlJPVCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIGJ1dHRvbiA9IGV2ZW50LnRhcmdldDtcbiAgICB2YXIgaW5pdGlhbEJ1dHRvbiA9IGJ1dHRvbjtcblxuICAgIGlmICghJChidXR0b24pLmhhc0NsYXNzKENMQVNTX05BTUVfQlVUVE9OKSkge1xuICAgICAgYnV0dG9uID0gJChidXR0b24pLmNsb3Nlc3QoU0VMRUNUT1JfQlVUVE9OKVswXTtcbiAgICB9XG5cbiAgICBpZiAoIWJ1dHRvbiB8fCBidXR0b24uaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IGJ1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHdvcmsgYXJvdW5kIEZpcmVmb3ggYnVnICMxNTQwOTk1XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbnB1dEJ0biA9IGJ1dHRvbi5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX0lOUFVUKTtcblxuICAgICAgaWYgKGlucHV0QnRuICYmIChpbnB1dEJ0bi5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgaW5wdXRCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyB3b3JrIGFyb3VuZCBGaXJlZm94IGJ1ZyAjMTU0MDk5NVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXRpYWxCdXR0b24udGFnTmFtZSA9PT0gJ0xBQkVMJyAmJiBpbnB1dEJ0biAmJiBpbnB1dEJ0bi50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHdvcmsgYXJvdW5kIGV2ZW50IHNlbnQgdG8gbGFiZWwgYW5kIGlucHV0XG4gICAgICB9XG5cbiAgICAgIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJChidXR0b24pLCAndG9nZ2xlJyk7XG4gICAgfVxuICB9KS5vbihFVkVOVF9GT0NVU19CTFVSX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9DQVJST1QsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBidXR0b24gPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChTRUxFQ1RPUl9CVVRUT04pWzBdO1xuICAgICQoYnV0dG9uKS50b2dnbGVDbGFzcyhDTEFTU19OQU1FX0ZPQ1VTLCAvXmZvY3VzKGluKT8kLy50ZXN0KGV2ZW50LnR5cGUpKTtcbiAgfSk7XG4gICQod2luZG93KS5vbihFVkVOVF9MT0FEX0RBVEFfQVBJLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gZW5zdXJlIGNvcnJlY3QgYWN0aXZlIGNsYXNzIGlzIHNldCB0byBtYXRjaCB0aGUgY29udHJvbHMnIGFjdHVhbCB2YWx1ZXMvc3RhdGVzXG4gICAgLy8gZmluZCBhbGwgY2hlY2tib3hlcy9yZWFkaW8gYnV0dG9ucyBpbnNpZGUgZGF0YS10b2dnbGUgZ3JvdXBzXG4gICAgdmFyIGJ1dHRvbnMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfREFUQV9UT0dHTEVTX0JVVFRPTlMpKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidXR0b25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgYnV0dG9uID0gYnV0dG9uc1tpXTtcbiAgICAgIHZhciBpbnB1dCA9IGJ1dHRvbi5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX0lOUFVUKTtcblxuICAgICAgaWYgKGlucHV0LmNoZWNrZWQgfHwgaW5wdXQuaGFzQXR0cmlidXRlKCdjaGVja2VkJykpIHtcbiAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpO1xuICAgICAgfVxuICAgIH0gLy8gZmluZCBhbGwgYnV0dG9uIHRvZ2dsZXNcblxuXG4gICAgYnV0dG9ucyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9EQVRBX1RPR0dMRSkpO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwLCBfbGVuID0gYnV0dG9ucy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgdmFyIF9idXR0b24gPSBidXR0b25zW19pXTtcblxuICAgICAgaWYgKF9idXR0b24uZ2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIF9idXR0b24uY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkLmZuW05BTUUkMV0gPSBCdXR0b24uX2pRdWVyeUludGVyZmFjZTtcbiAgJC5mbltOQU1FJDFdLkNvbnN0cnVjdG9yID0gQnV0dG9uO1xuXG4gICQuZm5bTkFNRSQxXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm5bTkFNRSQxXSA9IEpRVUVSWV9OT19DT05GTElDVCQxO1xuICAgIHJldHVybiBCdXR0b24uX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkMiA9ICdjYXJvdXNlbCc7XG4gIHZhciBWRVJTSU9OJDIgPSAnNC41LjAnO1xuICB2YXIgREFUQV9LRVkkMiA9ICdicy5jYXJvdXNlbCc7XG4gIHZhciBFVkVOVF9LRVkkMiA9IFwiLlwiICsgREFUQV9LRVkkMjtcbiAgdmFyIERBVEFfQVBJX0tFWSQyID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkMiA9ICQuZm5bTkFNRSQyXTtcbiAgdmFyIEFSUk9XX0xFRlRfS0VZQ09ERSA9IDM3OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciBsZWZ0IGFycm93IGtleVxuXG4gIHZhciBBUlJPV19SSUdIVF9LRVlDT0RFID0gMzk7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIHJpZ2h0IGFycm93IGtleVxuXG4gIHZhciBUT1VDSEVWRU5UX0NPTVBBVF9XQUlUID0gNTAwOyAvLyBUaW1lIGZvciBtb3VzZSBjb21wYXQgZXZlbnRzIHRvIGZpcmUgYWZ0ZXIgdG91Y2hcblxuICB2YXIgU1dJUEVfVEhSRVNIT0xEID0gNDA7XG4gIHZhciBEZWZhdWx0ID0ge1xuICAgIGludGVydmFsOiA1MDAwLFxuICAgIGtleWJvYXJkOiB0cnVlLFxuICAgIHNsaWRlOiBmYWxzZSxcbiAgICBwYXVzZTogJ2hvdmVyJyxcbiAgICB3cmFwOiB0cnVlLFxuICAgIHRvdWNoOiB0cnVlXG4gIH07XG4gIHZhciBEZWZhdWx0VHlwZSA9IHtcbiAgICBpbnRlcnZhbDogJyhudW1iZXJ8Ym9vbGVhbiknLFxuICAgIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gICAgc2xpZGU6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICAgIHdyYXA6ICdib29sZWFuJyxcbiAgICB0b3VjaDogJ2Jvb2xlYW4nXG4gIH07XG4gIHZhciBESVJFQ1RJT05fTkVYVCA9ICduZXh0JztcbiAgdmFyIERJUkVDVElPTl9QUkVWID0gJ3ByZXYnO1xuICB2YXIgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCc7XG4gIHZhciBESVJFQ1RJT05fUklHSFQgPSAncmlnaHQnO1xuICB2YXIgRVZFTlRfU0xJREUgPSBcInNsaWRlXCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX1NMSUQgPSBcInNsaWRcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfS0VZRE9XTiA9IFwia2V5ZG93blwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9NT1VTRUVOVEVSID0gXCJtb3VzZWVudGVyXCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX01PVVNFTEVBVkUgPSBcIm1vdXNlbGVhdmVcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfVE9VQ0hTVEFSVCA9IFwidG91Y2hzdGFydFwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9UT1VDSE1PVkUgPSBcInRvdWNobW92ZVwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9UT1VDSEVORCA9IFwidG91Y2hlbmRcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfUE9JTlRFUkRPV04gPSBcInBvaW50ZXJkb3duXCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX1BPSU5URVJVUCA9IFwicG9pbnRlcnVwXCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX0RSQUdfU1RBUlQgPSBcImRyYWdzdGFydFwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9MT0FEX0RBVEFfQVBJJDEgPSBcImxvYWRcIiArIEVWRU5UX0tFWSQyICsgREFUQV9BUElfS0VZJDI7XG4gIHZhciBFVkVOVF9DTElDS19EQVRBX0FQSSQyID0gXCJjbGlja1wiICsgRVZFTlRfS0VZJDIgKyBEQVRBX0FQSV9LRVkkMjtcbiAgdmFyIENMQVNTX05BTUVfQ0FST1VTRUwgPSAnY2Fyb3VzZWwnO1xuICB2YXIgQ0xBU1NfTkFNRV9BQ1RJVkUkMSA9ICdhY3RpdmUnO1xuICB2YXIgQ0xBU1NfTkFNRV9TTElERSA9ICdzbGlkZSc7XG4gIHZhciBDTEFTU19OQU1FX1JJR0hUID0gJ2Nhcm91c2VsLWl0ZW0tcmlnaHQnO1xuICB2YXIgQ0xBU1NfTkFNRV9MRUZUID0gJ2Nhcm91c2VsLWl0ZW0tbGVmdCc7XG4gIHZhciBDTEFTU19OQU1FX05FWFQgPSAnY2Fyb3VzZWwtaXRlbS1uZXh0JztcbiAgdmFyIENMQVNTX05BTUVfUFJFViA9ICdjYXJvdXNlbC1pdGVtLXByZXYnO1xuICB2YXIgQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UID0gJ3BvaW50ZXItZXZlbnQnO1xuICB2YXIgU0VMRUNUT1JfQUNUSVZFJDEgPSAnLmFjdGl2ZSc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkVfSVRFTSA9ICcuYWN0aXZlLmNhcm91c2VsLWl0ZW0nO1xuICB2YXIgU0VMRUNUT1JfSVRFTSA9ICcuY2Fyb3VzZWwtaXRlbSc7XG4gIHZhciBTRUxFQ1RPUl9JVEVNX0lNRyA9ICcuY2Fyb3VzZWwtaXRlbSBpbWcnO1xuICB2YXIgU0VMRUNUT1JfTkVYVF9QUkVWID0gJy5jYXJvdXNlbC1pdGVtLW5leHQsIC5jYXJvdXNlbC1pdGVtLXByZXYnO1xuICB2YXIgU0VMRUNUT1JfSU5ESUNBVE9SUyA9ICcuY2Fyb3VzZWwtaW5kaWNhdG9ycyc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1NMSURFID0gJ1tkYXRhLXNsaWRlXSwgW2RhdGEtc2xpZGUtdG9dJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfUklERSA9ICdbZGF0YS1yaWRlPVwiY2Fyb3VzZWxcIl0nO1xuICB2YXIgUG9pbnRlclR5cGUgPSB7XG4gICAgVE9VQ0g6ICd0b3VjaCcsXG4gICAgUEVOOiAncGVuJ1xuICB9O1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBDYXJvdXNlbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2Fyb3VzZWwoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9pdGVtcyA9IG51bGw7XG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudG91Y2hUaW1lb3V0ID0gbnVsbDtcbiAgICAgIHRoaXMudG91Y2hTdGFydFggPSAwO1xuICAgICAgdGhpcy50b3VjaERlbHRhWCA9IDA7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfSU5ESUNBVE9SUyk7XG4gICAgICB0aGlzLl90b3VjaFN1cHBvcnRlZCA9ICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwO1xuICAgICAgdGhpcy5fcG9pbnRlckV2ZW50ID0gQm9vbGVhbih3aW5kb3cuUG9pbnRlckV2ZW50IHx8IHdpbmRvdy5NU1BvaW50ZXJFdmVudCk7XG5cbiAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBDYXJvdXNlbC5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8ubmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzU2xpZGluZykge1xuICAgICAgICB0aGlzLl9zbGlkZShESVJFQ1RJT05fTkVYVCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5uZXh0V2hlblZpc2libGUgPSBmdW5jdGlvbiBuZXh0V2hlblZpc2libGUoKSB7XG4gICAgICAvLyBEb24ndCBjYWxsIG5leHQgd2hlbiB0aGUgcGFnZSBpc24ndCB2aXNpYmxlXG4gICAgICAvLyBvciB0aGUgY2Fyb3VzZWwgb3IgaXRzIHBhcmVudCBpc24ndCB2aXNpYmxlXG4gICAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiAkKHRoaXMuX2VsZW1lbnQpLmlzKCc6dmlzaWJsZScpICYmICQodGhpcy5fZWxlbWVudCkuY3NzKCd2aXNpYmlsaXR5JykgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8ucHJldiA9IGZ1bmN0aW9uIHByZXYoKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzU2xpZGluZykge1xuICAgICAgICB0aGlzLl9zbGlkZShESVJFQ1RJT05fUFJFVik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5wYXVzZSA9IGZ1bmN0aW9uIHBhdXNlKGV2ZW50KSB7XG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9ORVhUX1BSRVYpKSB7XG4gICAgICAgIFV0aWwudHJpZ2dlclRyYW5zaXRpb25FbmQodGhpcy5fZWxlbWVudCk7XG4gICAgICAgIHRoaXMuY3ljbGUodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWwpO1xuICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuICAgIH07XG5cbiAgICBfcHJvdG8uY3ljbGUgPSBmdW5jdGlvbiBjeWNsZShldmVudCkge1xuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICB0aGlzLl9pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faW50ZXJ2YWwpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICAgIHRoaXMuX2ludGVydmFsID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pbnRlcnZhbCAmJiAhdGhpcy5faXNQYXVzZWQpIHtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID8gdGhpcy5uZXh0V2hlblZpc2libGUgOiB0aGlzLm5leHQpLmJpbmQodGhpcyksIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by50byA9IGZ1bmN0aW9uIHRvKGluZGV4KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX0FDVElWRV9JVEVNKTtcblxuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2FjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICBpZiAoaW5kZXggPiB0aGlzLl9pdGVtcy5sZW5ndGggLSAxIHx8IGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbmUoRVZFTlRfU0xJRCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy50byhpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgICB0aGlzLmN5Y2xlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpcmVjdGlvbiA9IGluZGV4ID4gYWN0aXZlSW5kZXggPyBESVJFQ1RJT05fTkVYVCA6IERJUkVDVElPTl9QUkVWO1xuXG4gICAgICB0aGlzLl9zbGlkZShkaXJlY3Rpb24sIHRoaXMuX2l0ZW1zW2luZGV4XSk7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICQodGhpcy5fZWxlbWVudCkub2ZmKEVWRU5UX0tFWSQyKTtcbiAgICAgICQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSQyKTtcbiAgICAgIHRoaXMuX2l0ZW1zID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2ludGVydmFsID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzUGF1c2VkID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzU2xpZGluZyA9IG51bGw7XG4gICAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2luZGljYXRvcnNFbGVtZW50ID0gbnVsbDtcbiAgICB9IC8vIFByaXZhdGVcbiAgICA7XG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgRGVmYXVsdCksIGNvbmZpZyk7XG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FJDIsIGNvbmZpZywgRGVmYXVsdFR5cGUpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9oYW5kbGVTd2lwZSA9IGZ1bmN0aW9uIF9oYW5kbGVTd2lwZSgpIHtcbiAgICAgIHZhciBhYnNEZWx0YXggPSBNYXRoLmFicyh0aGlzLnRvdWNoRGVsdGFYKTtcblxuICAgICAgaWYgKGFic0RlbHRheCA8PSBTV0lQRV9USFJFU0hPTEQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGlyZWN0aW9uID0gYWJzRGVsdGF4IC8gdGhpcy50b3VjaERlbHRhWDtcbiAgICAgIHRoaXMudG91Y2hEZWx0YVggPSAwOyAvLyBzd2lwZSBsZWZ0XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPiAwKSB7XG4gICAgICAgIHRoaXMucHJldigpO1xuICAgICAgfSAvLyBzd2lwZSByaWdodFxuXG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2FkZEV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9LRVlET1dOLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLl9rZXlkb3duKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcucGF1c2UgPT09ICdob3ZlcicpIHtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9NT1VTRUVOVEVSLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLnBhdXNlKGV2ZW50KTtcbiAgICAgICAgfSkub24oRVZFTlRfTU9VU0VMRUFWRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5jeWNsZShldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnRvdWNoKSB7XG4gICAgICAgIHRoaXMuX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLl90b3VjaFN1cHBvcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KGV2ZW50KSB7XG4gICAgICAgIGlmIChfdGhpczMuX3BvaW50ZXJFdmVudCAmJiBQb2ludGVyVHlwZVtldmVudC5vcmlnaW5hbEV2ZW50LnBvaW50ZXJUeXBlLnRvVXBwZXJDYXNlKCldKSB7XG4gICAgICAgICAgX3RoaXMzLnRvdWNoU3RhcnRYID0gZXZlbnQub3JpZ2luYWxFdmVudC5jbGllbnRYO1xuICAgICAgICB9IGVsc2UgaWYgKCFfdGhpczMuX3BvaW50ZXJFdmVudCkge1xuICAgICAgICAgIF90aGlzMy50b3VjaFN0YXJ0WCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgbW92ZSA9IGZ1bmN0aW9uIG1vdmUoZXZlbnQpIHtcbiAgICAgICAgLy8gZW5zdXJlIHN3aXBpbmcgd2l0aCBvbmUgdG91Y2ggYW5kIG5vdCBwaW5jaGluZ1xuICAgICAgICBpZiAoZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgX3RoaXMzLnRvdWNoRGVsdGFYID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczMudG91Y2hEZWx0YVggPSBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIF90aGlzMy50b3VjaFN0YXJ0WDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmFyIGVuZCA9IGZ1bmN0aW9uIGVuZChldmVudCkge1xuICAgICAgICBpZiAoX3RoaXMzLl9wb2ludGVyRXZlbnQgJiYgUG9pbnRlclR5cGVbZXZlbnQub3JpZ2luYWxFdmVudC5wb2ludGVyVHlwZS50b1VwcGVyQ2FzZSgpXSkge1xuICAgICAgICAgIF90aGlzMy50b3VjaERlbHRhWCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpZW50WCAtIF90aGlzMy50b3VjaFN0YXJ0WDtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMy5faGFuZGxlU3dpcGUoKTtcblxuICAgICAgICBpZiAoX3RoaXMzLl9jb25maWcucGF1c2UgPT09ICdob3ZlcicpIHtcbiAgICAgICAgICAvLyBJZiBpdCdzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2UsIG1vdXNlZW50ZXIvbGVhdmUgYXJlIGZpcmVkIGFzXG4gICAgICAgICAgLy8gcGFydCBvZiB0aGUgbW91c2UgY29tcGF0aWJpbGl0eSBldmVudHMgb24gZmlyc3QgdGFwIC0gdGhlIGNhcm91c2VsXG4gICAgICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgICAgICAvLyBoZXJlLCB3ZSBsaXN0ZW4gZm9yIHRvdWNoZW5kLCBleHBsaWNpdGx5IHBhdXNlIHRoZSBjYXJvdXNlbFxuICAgICAgICAgIC8vIChhcyBpZiBpdCdzIHRoZSBzZWNvbmQgdGltZSB3ZSB0YXAgb24gaXQsIG1vdXNlZW50ZXIgY29tcGF0IGV2ZW50XG4gICAgICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIC8vIGV2ZW50cyB0byBmaXJlKSB3ZSBleHBsaWNpdGx5IHJlc3RhcnQgY3ljbGluZ1xuICAgICAgICAgIF90aGlzMy5wYXVzZSgpO1xuXG4gICAgICAgICAgaWYgKF90aGlzMy50b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpczMudG91Y2hUaW1lb3V0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczMudG91Y2hUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMuY3ljbGUoZXZlbnQpO1xuICAgICAgICAgIH0sIFRPVUNIRVZFTlRfQ09NUEFUX1dBSVQgKyBfdGhpczMuX2NvbmZpZy5pbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgICQodGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0lURU1fSU1HKSkub24oRVZFTlRfRFJBR19TVEFSVCwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5fcG9pbnRlckV2ZW50KSB7XG4gICAgICAgICQodGhpcy5fZWxlbWVudCkub24oRVZFTlRfUE9JTlRFUkRPV04sIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBzdGFydChldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX1BPSU5URVJVUCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVuZChldmVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9UT1VDSFNUQVJULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gc3RhcnQoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9UT1VDSE1PVkUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBtb3ZlKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgICQodGhpcy5fZWxlbWVudCkub24oRVZFTlRfVE9VQ0hFTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBlbmQoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9rZXlkb3duID0gZnVuY3Rpb24gX2tleWRvd24oZXZlbnQpIHtcbiAgICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgICAgY2FzZSBBUlJPV19MRUZUX0tFWUNPREU6XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLnByZXYoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEFSUk9XX1JJR0hUX0tFWUNPREU6XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRJdGVtSW5kZXggPSBmdW5jdGlvbiBfZ2V0SXRlbUluZGV4KGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gZWxlbWVudCAmJiBlbGVtZW50LnBhcmVudE5vZGUgPyBbXS5zbGljZS5jYWxsKGVsZW1lbnQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0lURU0pKSA6IFtdO1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmluZGV4T2YoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0SXRlbUJ5RGlyZWN0aW9uID0gZnVuY3Rpb24gX2dldEl0ZW1CeURpcmVjdGlvbihkaXJlY3Rpb24sIGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHZhciBpc05leHREaXJlY3Rpb24gPSBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9ORVhUO1xuICAgICAgdmFyIGlzUHJldkRpcmVjdGlvbiA9IGRpcmVjdGlvbiA9PT0gRElSRUNUSU9OX1BSRVY7XG5cbiAgICAgIHZhciBhY3RpdmVJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChhY3RpdmVFbGVtZW50KTtcblxuICAgICAgdmFyIGxhc3RJdGVtSW5kZXggPSB0aGlzLl9pdGVtcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGlzR29pbmdUb1dyYXAgPSBpc1ByZXZEaXJlY3Rpb24gJiYgYWN0aXZlSW5kZXggPT09IDAgfHwgaXNOZXh0RGlyZWN0aW9uICYmIGFjdGl2ZUluZGV4ID09PSBsYXN0SXRlbUluZGV4O1xuXG4gICAgICBpZiAoaXNHb2luZ1RvV3JhcCAmJiAhdGhpcy5fY29uZmlnLndyYXApIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBkZWx0YSA9IGRpcmVjdGlvbiA9PT0gRElSRUNUSU9OX1BSRVYgPyAtMSA6IDE7XG4gICAgICB2YXIgaXRlbUluZGV4ID0gKGFjdGl2ZUluZGV4ICsgZGVsdGEpICUgdGhpcy5faXRlbXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGl0ZW1JbmRleCA9PT0gLTEgPyB0aGlzLl9pdGVtc1t0aGlzLl9pdGVtcy5sZW5ndGggLSAxXSA6IHRoaXMuX2l0ZW1zW2l0ZW1JbmRleF07XG4gICAgfTtcblxuICAgIF9wcm90by5fdHJpZ2dlclNsaWRlRXZlbnQgPSBmdW5jdGlvbiBfdHJpZ2dlclNsaWRlRXZlbnQocmVsYXRlZFRhcmdldCwgZXZlbnREaXJlY3Rpb25OYW1lKSB7XG4gICAgICB2YXIgdGFyZ2V0SW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgocmVsYXRlZFRhcmdldCk7XG5cbiAgICAgIHZhciBmcm9tSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgodGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX0FDVElWRV9JVEVNKSk7XG5cbiAgICAgIHZhciBzbGlkZUV2ZW50ID0gJC5FdmVudChFVkVOVF9TTElERSwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkVGFyZ2V0LFxuICAgICAgICBkaXJlY3Rpb246IGV2ZW50RGlyZWN0aW9uTmFtZSxcbiAgICAgICAgZnJvbTogZnJvbUluZGV4LFxuICAgICAgICB0bzogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNsaWRlRXZlbnQpO1xuICAgICAgcmV0dXJuIHNsaWRlRXZlbnQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudCA9IGZ1bmN0aW9uIF9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCkge1xuICAgICAgICB2YXIgaW5kaWNhdG9ycyA9IFtdLnNsaWNlLmNhbGwodGhpcy5faW5kaWNhdG9yc0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9BQ1RJVkUkMSkpO1xuICAgICAgICAkKGluZGljYXRvcnMpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuXG4gICAgICAgIHZhciBuZXh0SW5kaWNhdG9yID0gdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQuY2hpbGRyZW5bdGhpcy5fZ2V0SXRlbUluZGV4KGVsZW1lbnQpXTtcblxuICAgICAgICBpZiAobmV4dEluZGljYXRvcikge1xuICAgICAgICAgICQobmV4dEluZGljYXRvcikuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zbGlkZSA9IGZ1bmN0aW9uIF9zbGlkZShkaXJlY3Rpb24sIGVsZW1lbnQpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9BQ1RJVkVfSVRFTSk7XG5cbiAgICAgIHZhciBhY3RpdmVFbGVtZW50SW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgoYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgIHZhciBuZXh0RWxlbWVudCA9IGVsZW1lbnQgfHwgYWN0aXZlRWxlbWVudCAmJiB0aGlzLl9nZXRJdGVtQnlEaXJlY3Rpb24oZGlyZWN0aW9uLCBhY3RpdmVFbGVtZW50KTtcblxuICAgICAgdmFyIG5leHRFbGVtZW50SW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgobmV4dEVsZW1lbnQpO1xuXG4gICAgICB2YXIgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbCk7XG4gICAgICB2YXIgZGlyZWN0aW9uYWxDbGFzc05hbWU7XG4gICAgICB2YXIgb3JkZXJDbGFzc05hbWU7XG4gICAgICB2YXIgZXZlbnREaXJlY3Rpb25OYW1lO1xuXG4gICAgICBpZiAoZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTkVYVCkge1xuICAgICAgICBkaXJlY3Rpb25hbENsYXNzTmFtZSA9IENMQVNTX05BTUVfTEVGVDtcbiAgICAgICAgb3JkZXJDbGFzc05hbWUgPSBDTEFTU19OQU1FX05FWFQ7XG4gICAgICAgIGV2ZW50RGlyZWN0aW9uTmFtZSA9IERJUkVDVElPTl9MRUZUO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyZWN0aW9uYWxDbGFzc05hbWUgPSBDTEFTU19OQU1FX1JJR0hUO1xuICAgICAgICBvcmRlckNsYXNzTmFtZSA9IENMQVNTX05BTUVfUFJFVjtcbiAgICAgICAgZXZlbnREaXJlY3Rpb25OYW1lID0gRElSRUNUSU9OX1JJR0hUO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dEVsZW1lbnQgJiYgJChuZXh0RWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSkpIHtcbiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNsaWRlRXZlbnQgPSB0aGlzLl90cmlnZ2VyU2xpZGVFdmVudChuZXh0RWxlbWVudCwgZXZlbnREaXJlY3Rpb25OYW1lKTtcblxuICAgICAgaWYgKHNsaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgIW5leHRFbGVtZW50KSB7XG4gICAgICAgIC8vIFNvbWUgd2VpcmRuZXNzIGlzIGhhcHBlbmluZywgc28gd2UgYmFpbFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWU7XG5cbiAgICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KG5leHRFbGVtZW50KTtcblxuICAgICAgdmFyIHNsaWRFdmVudCA9ICQuRXZlbnQoRVZFTlRfU0xJRCwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiBuZXh0RWxlbWVudCxcbiAgICAgICAgZGlyZWN0aW9uOiBldmVudERpcmVjdGlvbk5hbWUsXG4gICAgICAgIGZyb206IGFjdGl2ZUVsZW1lbnRJbmRleCxcbiAgICAgICAgdG86IG5leHRFbGVtZW50SW5kZXhcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NMSURFKSkge1xuICAgICAgICAkKG5leHRFbGVtZW50KS5hZGRDbGFzcyhvcmRlckNsYXNzTmFtZSk7XG4gICAgICAgIFV0aWwucmVmbG93KG5leHRFbGVtZW50KTtcbiAgICAgICAgJChhY3RpdmVFbGVtZW50KS5hZGRDbGFzcyhkaXJlY3Rpb25hbENsYXNzTmFtZSk7XG4gICAgICAgICQobmV4dEVsZW1lbnQpLmFkZENsYXNzKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICAgICAgdmFyIG5leHRFbGVtZW50SW50ZXJ2YWwgPSBwYXJzZUludChuZXh0RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW50ZXJ2YWwnKSwgMTApO1xuXG4gICAgICAgIGlmIChuZXh0RWxlbWVudEludGVydmFsKSB7XG4gICAgICAgICAgdGhpcy5fY29uZmlnLmRlZmF1bHRJbnRlcnZhbCA9IHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWwgfHwgdGhpcy5fY29uZmlnLmludGVydmFsO1xuICAgICAgICAgIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCA9IG5leHRFbGVtZW50SW50ZXJ2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gdGhpcy5fY29uZmlnLmRlZmF1bHRJbnRlcnZhbCB8fCB0aGlzLl9jb25maWcuaW50ZXJ2YWw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChhY3RpdmVFbGVtZW50KTtcbiAgICAgICAgJChhY3RpdmVFbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICQobmV4dEVsZW1lbnQpLnJlbW92ZUNsYXNzKGRpcmVjdGlvbmFsQ2xhc3NOYW1lICsgXCIgXCIgKyBvcmRlckNsYXNzTmFtZSkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSk7XG4gICAgICAgICAgJChhY3RpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQxICsgXCIgXCIgKyBvcmRlckNsYXNzTmFtZSArIFwiIFwiICsgZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgICAgICAgIF90aGlzNC5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gJChfdGhpczQuX2VsZW1lbnQpLnRyaWdnZXIoc2xpZEV2ZW50KTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoYWN0aXZlRWxlbWVudCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSk7XG4gICAgICAgICQobmV4dEVsZW1lbnQpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNsaWRFdmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgICAgdGhpcy5jeWNsZSgpO1xuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgQ2Fyb3VzZWwuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoREFUQV9LRVkkMik7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgRGVmYXVsdCksICQodGhpcykuZGF0YSgpKTtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBfY29uZmlnID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIF9jb25maWcpLCBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFjdGlvbiA9IHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnID8gY29uZmlnIDogX2NvbmZpZy5zbGlkZTtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IENhcm91c2VsKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICQodGhpcykuZGF0YShEQVRBX0tFWSQyLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGRhdGEudG8oY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVthY3Rpb25dID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBhY3Rpb24gKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVthY3Rpb25dKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoX2NvbmZpZy5pbnRlcnZhbCAmJiBfY29uZmlnLnJpZGUpIHtcbiAgICAgICAgICBkYXRhLnBhdXNlKCk7XG4gICAgICAgICAgZGF0YS5jeWNsZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgQ2Fyb3VzZWwuX2RhdGFBcGlDbGlja0hhbmRsZXIgPSBmdW5jdGlvbiBfZGF0YUFwaUNsaWNrSGFuZGxlcihldmVudCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpO1xuXG4gICAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhcmdldCA9ICQoc2VsZWN0b3IpWzBdO1xuXG4gICAgICBpZiAoIXRhcmdldCB8fCAhJCh0YXJnZXQpLmhhc0NsYXNzKENMQVNTX05BTUVfQ0FST1VTRUwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCAkKHRhcmdldCkuZGF0YSgpKSwgJCh0aGlzKS5kYXRhKCkpO1xuXG4gICAgICB2YXIgc2xpZGVJbmRleCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLXNsaWRlLXRvJyk7XG5cbiAgICAgIGlmIChzbGlkZUluZGV4KSB7XG4gICAgICAgIGNvbmZpZy5pbnRlcnZhbCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBDYXJvdXNlbC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJCh0YXJnZXQpLCBjb25maWcpO1xuXG4gICAgICBpZiAoc2xpZGVJbmRleCkge1xuICAgICAgICAkKHRhcmdldCkuZGF0YShEQVRBX0tFWSQyKS50byhzbGlkZUluZGV4KTtcbiAgICAgIH1cblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKENhcm91c2VsLCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiQyO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIENhcm91c2VsO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJChkb2N1bWVudCkub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMiwgU0VMRUNUT1JfREFUQV9TTElERSwgQ2Fyb3VzZWwuX2RhdGFBcGlDbGlja0hhbmRsZXIpO1xuICAkKHdpbmRvdykub24oRVZFTlRfTE9BRF9EQVRBX0FQSSQxLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNhcm91c2VscyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9EQVRBX1JJREUpKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjYXJvdXNlbHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciAkY2Fyb3VzZWwgPSAkKGNhcm91c2Vsc1tpXSk7XG5cbiAgICAgIENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkY2Fyb3VzZWwsICRjYXJvdXNlbC5kYXRhKCkpO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkLmZuW05BTUUkMl0gPSBDYXJvdXNlbC5falF1ZXJ5SW50ZXJmYWNlO1xuICAkLmZuW05BTUUkMl0uQ29uc3RydWN0b3IgPSBDYXJvdXNlbDtcblxuICAkLmZuW05BTUUkMl0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuW05BTUUkMl0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkMjtcbiAgICByZXR1cm4gQ2Fyb3VzZWwuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkMyA9ICdjb2xsYXBzZSc7XG4gIHZhciBWRVJTSU9OJDMgPSAnNC41LjAnO1xuICB2YXIgREFUQV9LRVkkMyA9ICdicy5jb2xsYXBzZSc7XG4gIHZhciBFVkVOVF9LRVkkMyA9IFwiLlwiICsgREFUQV9LRVkkMztcbiAgdmFyIERBVEFfQVBJX0tFWSQzID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkMyA9ICQuZm5bTkFNRSQzXTtcbiAgdmFyIERlZmF1bHQkMSA9IHtcbiAgICB0b2dnbGU6IHRydWUsXG4gICAgcGFyZW50OiAnJ1xuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUkMSA9IHtcbiAgICB0b2dnbGU6ICdib29sZWFuJyxcbiAgICBwYXJlbnQ6ICcoc3RyaW5nfGVsZW1lbnQpJ1xuICB9O1xuICB2YXIgRVZFTlRfU0hPVyA9IFwic2hvd1wiICsgRVZFTlRfS0VZJDM7XG4gIHZhciBFVkVOVF9TSE9XTiA9IFwic2hvd25cIiArIEVWRU5UX0tFWSQzO1xuICB2YXIgRVZFTlRfSElERSA9IFwiaGlkZVwiICsgRVZFTlRfS0VZJDM7XG4gIHZhciBFVkVOVF9ISURERU4gPSBcImhpZGRlblwiICsgRVZFTlRfS0VZJDM7XG4gIHZhciBFVkVOVF9DTElDS19EQVRBX0FQSSQzID0gXCJjbGlja1wiICsgRVZFTlRfS0VZJDMgKyBEQVRBX0FQSV9LRVkkMztcbiAgdmFyIENMQVNTX05BTUVfU0hPVyQxID0gJ3Nob3cnO1xuICB2YXIgQ0xBU1NfTkFNRV9DT0xMQVBTRSA9ICdjb2xsYXBzZSc7XG4gIHZhciBDTEFTU19OQU1FX0NPTExBUFNJTkcgPSAnY29sbGFwc2luZyc7XG4gIHZhciBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQnO1xuICB2YXIgRElNRU5TSU9OX1dJRFRIID0gJ3dpZHRoJztcbiAgdmFyIERJTUVOU0lPTl9IRUlHSFQgPSAnaGVpZ2h0JztcbiAgdmFyIFNFTEVDVE9SX0FDVElWRVMgPSAnLnNob3csIC5jb2xsYXBzaW5nJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEgPSAnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBDb2xsYXBzZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29sbGFwc2UoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl90cmlnZ2VyQXJyYXkgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS10b2dnbGU9XFxcImNvbGxhcHNlXFxcIl1baHJlZj1cXFwiI1wiICsgZWxlbWVudC5pZCArIFwiXFxcIl0sXCIgKyAoXCJbZGF0YS10b2dnbGU9XFxcImNvbGxhcHNlXFxcIl1bZGF0YS10YXJnZXQ9XFxcIiNcIiArIGVsZW1lbnQuaWQgKyBcIlxcXCJdXCIpKSk7XG4gICAgICB2YXIgdG9nZ2xlTGlzdCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9EQVRBX1RPR0dMRSQxKSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0b2dnbGVMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBlbGVtID0gdG9nZ2xlTGlzdFtpXTtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW0pO1xuICAgICAgICB2YXIgZmlsdGVyRWxlbWVudCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpLmZpbHRlcihmdW5jdGlvbiAoZm91bmRFbGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kRWxlbSA9PT0gZWxlbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yICE9PSBudWxsICYmIGZpbHRlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG5cbiAgICAgICAgICB0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChlbGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9wYXJlbnQgPSB0aGlzLl9jb25maWcucGFyZW50ID8gdGhpcy5fZ2V0UGFyZW50KCkgOiBudWxsO1xuXG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX2VsZW1lbnQsIHRoaXMuX3RyaWdnZXJBcnJheSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcudG9nZ2xlKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICB9XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBDb2xsYXBzZS5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgaWYgKCQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDEpKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWN0aXZlcztcbiAgICAgIHZhciBhY3RpdmVzRGF0YTtcblxuICAgICAgaWYgKHRoaXMuX3BhcmVudCkge1xuICAgICAgICBhY3RpdmVzID0gW10uc2xpY2UuY2FsbCh0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9BQ1RJVkVTKSkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBfdGhpcy5fY29uZmlnLnBhcmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1wYXJlbnQnKSA9PT0gX3RoaXMuX2NvbmZpZy5wYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQ09MTEFQU0UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYWN0aXZlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhY3RpdmVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlcykge1xuICAgICAgICBhY3RpdmVzRGF0YSA9ICQoYWN0aXZlcykubm90KHRoaXMuX3NlbGVjdG9yKS5kYXRhKERBVEFfS0VZJDMpO1xuXG4gICAgICAgIGlmIChhY3RpdmVzRGF0YSAmJiBhY3RpdmVzRGF0YS5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydEV2ZW50ID0gJC5FdmVudChFVkVOVF9TSE9XKTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkudHJpZ2dlcihzdGFydEV2ZW50KTtcblxuICAgICAgaWYgKHN0YXJ0RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlcykge1xuICAgICAgICBDb2xsYXBzZS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJChhY3RpdmVzKS5ub3QodGhpcy5fc2VsZWN0b3IpLCAnaGlkZScpO1xuXG4gICAgICAgIGlmICghYWN0aXZlc0RhdGEpIHtcbiAgICAgICAgICAkKGFjdGl2ZXMpLmRhdGEoREFUQV9LRVkkMywgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpO1xuXG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0UpLmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAwO1xuXG4gICAgICBpZiAodGhpcy5fdHJpZ2dlckFycmF5Lmxlbmd0aCkge1xuICAgICAgICAkKHRoaXMuX3RyaWdnZXJBcnJheSkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgJChfdGhpcy5fZWxlbWVudCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKS5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFICsgXCIgXCIgKyBDTEFTU19OQU1FX1NIT1ckMSk7XG4gICAgICAgIF90aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJztcblxuICAgICAgICBfdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcblxuICAgICAgICAkKF90aGlzLl9lbGVtZW50KS50cmlnZ2VyKEVWRU5UX1NIT1dOKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBjYXBpdGFsaXplZERpbWVuc2lvbiA9IGRpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKDEpO1xuICAgICAgdmFyIHNjcm9sbFNpemUgPSBcInNjcm9sbFwiICsgY2FwaXRhbGl6ZWREaW1lbnNpb247XG4gICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gdGhpcy5fZWxlbWVudFtzY3JvbGxTaXplXSArIFwicHhcIjtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgISQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXJ0RXZlbnQgPSAkLkV2ZW50KEVWRU5UX0hJREUpO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHN0YXJ0RXZlbnQpO1xuXG4gICAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gdGhpcy5fZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkaW1lbnNpb25dICsgXCJweFwiO1xuICAgICAgVXRpbC5yZWZsb3codGhpcy5fZWxlbWVudCk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0lORykucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRSArIFwiIFwiICsgQ0xBU1NfTkFNRV9TSE9XJDEpO1xuICAgICAgdmFyIHRyaWdnZXJBcnJheUxlbmd0aCA9IHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh0cmlnZ2VyQXJyYXlMZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpZ2dlckFycmF5TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgdHJpZ2dlciA9IHRoaXMuX3RyaWdnZXJBcnJheVtpXTtcbiAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodHJpZ2dlcik7XG5cbiAgICAgICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciAkZWxlbSA9ICQoW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkpO1xuXG4gICAgICAgICAgICBpZiAoISRlbGVtLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQxKSkge1xuICAgICAgICAgICAgICAkKHRyaWdnZXIpLmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICBfdGhpczIuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG5cbiAgICAgICAgJChfdGhpczIuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0lORykuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRSkudHJpZ2dlcihFVkVOVF9ISURERU4pO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJyc7XG4gICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2V0VHJhbnNpdGlvbmluZyA9IGZ1bmN0aW9uIHNldFRyYW5zaXRpb25pbmcoaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBpc1RyYW5zaXRpb25pbmc7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSQzKTtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl90cmlnZ2VyQXJyYXkgPSBudWxsO1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gbnVsbDtcbiAgICB9IC8vIFByaXZhdGVcbiAgICA7XG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgRGVmYXVsdCQxKSwgY29uZmlnKTtcbiAgICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpOyAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuXG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FJDMsIGNvbmZpZywgRGVmYXVsdFR5cGUkMSk7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldERpbWVuc2lvbiA9IGZ1bmN0aW9uIF9nZXREaW1lbnNpb24oKSB7XG4gICAgICB2YXIgaGFzV2lkdGggPSAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKERJTUVOU0lPTl9XSURUSCk7XG4gICAgICByZXR1cm4gaGFzV2lkdGggPyBESU1FTlNJT05fV0lEVEggOiBESU1FTlNJT05fSEVJR0hUO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldFBhcmVudCA9IGZ1bmN0aW9uIF9nZXRQYXJlbnQoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIHBhcmVudDtcblxuICAgICAgaWYgKFV0aWwuaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5wYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnQ7IC8vIEl0J3MgYSBqUXVlcnkgb2JqZWN0XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcucGFyZW50LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzLl9jb25maWcucGFyZW50WzBdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuX2NvbmZpZy5wYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VsZWN0b3IgPSBcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtkYXRhLXBhcmVudD1cXFwiXCIgKyB0aGlzLl9jb25maWcucGFyZW50ICsgXCJcXFwiXVwiO1xuICAgICAgdmFyIGNoaWxkcmVuID0gW10uc2xpY2UuY2FsbChwYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xuICAgICAgJChjaGlsZHJlbikuZWFjaChmdW5jdGlvbiAoaSwgZWxlbWVudCkge1xuICAgICAgICBfdGhpczMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhDb2xsYXBzZS5fZ2V0VGFyZ2V0RnJvbUVsZW1lbnQoZWxlbWVudCksIFtlbGVtZW50XSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzID0gZnVuY3Rpb24gX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhlbGVtZW50LCB0cmlnZ2VyQXJyYXkpIHtcbiAgICAgIHZhciBpc09wZW4gPSAkKGVsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQxKTtcblxuICAgICAgaWYgKHRyaWdnZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgJCh0cmlnZ2VyQXJyYXkpLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VELCAhaXNPcGVuKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKTtcbiAgICAgIH1cbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIENvbGxhcHNlLl9nZXRUYXJnZXRGcm9tRWxlbWVudCA9IGZ1bmN0aW9uIF9nZXRUYXJnZXRGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICByZXR1cm4gc2VsZWN0b3IgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSA6IG51bGw7XG4gICAgfTtcblxuICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG4gICAgICAgIHZhciBkYXRhID0gJHRoaXMuZGF0YShEQVRBX0tFWSQzKTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBEZWZhdWx0JDEpLCAkdGhpcy5kYXRhKCkpLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSk7XG5cbiAgICAgICAgaWYgKCFkYXRhICYmIF9jb25maWcudG9nZ2xlICYmIHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnICYmIC9zaG93fGhpZGUvLnRlc3QoY29uZmlnKSkge1xuICAgICAgICAgIF9jb25maWcudG9nZ2xlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IENvbGxhcHNlKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICR0aGlzLmRhdGEoREFUQV9LRVkkMywgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKENvbGxhcHNlLCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiQzO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQkMTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gQ29sbGFwc2U7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkKGRvY3VtZW50KS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSQzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQxLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHZhciAkdHJpZ2dlciA9ICQodGhpcyk7XG4gICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpO1xuICAgIHZhciBzZWxlY3RvcnMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbiAgICAkKHNlbGVjdG9ycykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRhcmdldCA9ICQodGhpcyk7XG4gICAgICB2YXIgZGF0YSA9ICR0YXJnZXQuZGF0YShEQVRBX0tFWSQzKTtcbiAgICAgIHZhciBjb25maWcgPSBkYXRhID8gJ3RvZ2dsZScgOiAkdHJpZ2dlci5kYXRhKCk7XG5cbiAgICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkdGFyZ2V0LCBjb25maWcpO1xuICAgIH0pO1xuICB9KTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gICQuZm5bTkFNRSQzXSA9IENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2U7XG4gICQuZm5bTkFNRSQzXS5Db25zdHJ1Y3RvciA9IENvbGxhcHNlO1xuXG4gICQuZm5bTkFNRSQzXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm5bTkFNRSQzXSA9IEpRVUVSWV9OT19DT05GTElDVCQzO1xuICAgIHJldHVybiBDb2xsYXBzZS5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSQ0ID0gJ2Ryb3Bkb3duJztcbiAgdmFyIFZFUlNJT04kNCA9ICc0LjUuMCc7XG4gIHZhciBEQVRBX0tFWSQ0ID0gJ2JzLmRyb3Bkb3duJztcbiAgdmFyIEVWRU5UX0tFWSQ0ID0gXCIuXCIgKyBEQVRBX0tFWSQ0O1xuICB2YXIgREFUQV9BUElfS0VZJDQgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ0ID0gJC5mbltOQU1FJDRdO1xuICB2YXIgRVNDQVBFX0tFWUNPREUgPSAyNzsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgRXNjYXBlIChFc2MpIGtleVxuXG4gIHZhciBTUEFDRV9LRVlDT0RFID0gMzI7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIHNwYWNlIGtleVxuXG4gIHZhciBUQUJfS0VZQ09ERSA9IDk7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIHRhYiBrZXlcblxuICB2YXIgQVJST1dfVVBfS0VZQ09ERSA9IDM4OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciB1cCBhcnJvdyBrZXlcblxuICB2YXIgQVJST1dfRE9XTl9LRVlDT0RFID0gNDA7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIGRvd24gYXJyb3cga2V5XG5cbiAgdmFyIFJJR0hUX01PVVNFX0JVVFRPTl9XSElDSCA9IDM7IC8vIE1vdXNlRXZlbnQud2hpY2ggdmFsdWUgZm9yIHRoZSByaWdodCBidXR0b24gKGFzc3VtaW5nIGEgcmlnaHQtaGFuZGVkIG1vdXNlKVxuXG4gIHZhciBSRUdFWFBfS0VZRE9XTiA9IG5ldyBSZWdFeHAoQVJST1dfVVBfS0VZQ09ERSArIFwifFwiICsgQVJST1dfRE9XTl9LRVlDT0RFICsgXCJ8XCIgKyBFU0NBUEVfS0VZQ09ERSk7XG4gIHZhciBFVkVOVF9ISURFJDEgPSBcImhpZGVcIiArIEVWRU5UX0tFWSQ0O1xuICB2YXIgRVZFTlRfSElEREVOJDEgPSBcImhpZGRlblwiICsgRVZFTlRfS0VZJDQ7XG4gIHZhciBFVkVOVF9TSE9XJDEgPSBcInNob3dcIiArIEVWRU5UX0tFWSQ0O1xuICB2YXIgRVZFTlRfU0hPV04kMSA9IFwic2hvd25cIiArIEVWRU5UX0tFWSQ0O1xuICB2YXIgRVZFTlRfQ0xJQ0sgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkNDtcbiAgdmFyIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDQgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkNCArIERBVEFfQVBJX0tFWSQ0O1xuICB2YXIgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSA9IFwia2V5ZG93blwiICsgRVZFTlRfS0VZJDQgKyBEQVRBX0FQSV9LRVkkNDtcbiAgdmFyIEVWRU5UX0tFWVVQX0RBVEFfQVBJID0gXCJrZXl1cFwiICsgRVZFTlRfS0VZJDQgKyBEQVRBX0FQSV9LRVkkNDtcbiAgdmFyIENMQVNTX05BTUVfRElTQUJMRUQgPSAnZGlzYWJsZWQnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDIgPSAnc2hvdyc7XG4gIHZhciBDTEFTU19OQU1FX0RST1BVUCA9ICdkcm9wdXAnO1xuICB2YXIgQ0xBU1NfTkFNRV9EUk9QUklHSFQgPSAnZHJvcHJpZ2h0JztcbiAgdmFyIENMQVNTX05BTUVfRFJPUExFRlQgPSAnZHJvcGxlZnQnO1xuICB2YXIgQ0xBU1NfTkFNRV9NRU5VUklHSFQgPSAnZHJvcGRvd24tbWVudS1yaWdodCc7XG4gIHZhciBDTEFTU19OQU1FX1BPU0lUSU9OX1NUQVRJQyA9ICdwb3NpdGlvbi1zdGF0aWMnO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEUkMiA9ICdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXSc7XG4gIHZhciBTRUxFQ1RPUl9GT1JNX0NISUxEID0gJy5kcm9wZG93biBmb3JtJztcbiAgdmFyIFNFTEVDVE9SX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnO1xuICB2YXIgU0VMRUNUT1JfTkFWQkFSX05BViA9ICcubmF2YmFyLW5hdic7XG4gIHZhciBTRUxFQ1RPUl9WSVNJQkxFX0lURU1TID0gJy5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpJztcbiAgdmFyIFBMQUNFTUVOVF9UT1AgPSAndG9wLXN0YXJ0JztcbiAgdmFyIFBMQUNFTUVOVF9UT1BFTkQgPSAndG9wLWVuZCc7XG4gIHZhciBQTEFDRU1FTlRfQk9UVE9NID0gJ2JvdHRvbS1zdGFydCc7XG4gIHZhciBQTEFDRU1FTlRfQk9UVE9NRU5EID0gJ2JvdHRvbS1lbmQnO1xuICB2YXIgUExBQ0VNRU5UX1JJR0hUID0gJ3JpZ2h0LXN0YXJ0JztcbiAgdmFyIFBMQUNFTUVOVF9MRUZUID0gJ2xlZnQtc3RhcnQnO1xuICB2YXIgRGVmYXVsdCQyID0ge1xuICAgIG9mZnNldDogMCxcbiAgICBmbGlwOiB0cnVlLFxuICAgIGJvdW5kYXJ5OiAnc2Nyb2xsUGFyZW50JyxcbiAgICByZWZlcmVuY2U6ICd0b2dnbGUnLFxuICAgIGRpc3BsYXk6ICdkeW5hbWljJyxcbiAgICBwb3BwZXJDb25maWc6IG51bGxcbiAgfTtcbiAgdmFyIERlZmF1bHRUeXBlJDIgPSB7XG4gICAgb2Zmc2V0OiAnKG51bWJlcnxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgICBmbGlwOiAnYm9vbGVhbicsXG4gICAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgICByZWZlcmVuY2U6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgICBkaXNwbGF5OiAnc3RyaW5nJyxcbiAgICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3QpJ1xuICB9O1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBEcm9wZG93biA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRHJvcGRvd24oZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX21lbnUgPSB0aGlzLl9nZXRNZW51RWxlbWVudCgpO1xuICAgICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKTtcblxuICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IERyb3Bkb3duLnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoKSB7XG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5kaXNhYmxlZCB8fCAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRElTQUJMRUQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGlzQWN0aXZlID0gJCh0aGlzLl9tZW51KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMik7XG5cbiAgICAgIERyb3Bkb3duLl9jbGVhck1lbnVzKCk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2hvdyh0cnVlKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KHVzZVBvcHBlcikge1xuICAgICAgaWYgKHVzZVBvcHBlciA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHVzZVBvcHBlciA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5kaXNhYmxlZCB8fCAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRElTQUJMRUQpIHx8ICQodGhpcy5fbWVudSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICAgIH07XG4gICAgICB2YXIgc2hvd0V2ZW50ID0gJC5FdmVudChFVkVOVF9TSE9XJDEsIHJlbGF0ZWRUYXJnZXQpO1xuXG4gICAgICB2YXIgcGFyZW50ID0gRHJvcGRvd24uX2dldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuXG4gICAgICAkKHBhcmVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuXG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gRGlzYWJsZSB0b3RhbGx5IFBvcHBlci5qcyBmb3IgRHJvcGRvd24gaW4gTmF2YmFyXG5cblxuICAgICAgaWYgKCF0aGlzLl9pbk5hdmJhciAmJiB1c2VQb3BwZXIpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIGZvciBQb3BwZXIgZGVwZW5kZW5jeVxuICAgICAgICAgKiBQb3BwZXIgLSBodHRwczovL3BvcHBlci5qcy5vcmdcbiAgICAgICAgICovXG4gICAgICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgZHJvcGRvd25zIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcvKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcucmVmZXJlbmNlID09PSAncGFyZW50Jykge1xuICAgICAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSBwYXJlbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoVXRpbC5pc0VsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fY29uZmlnLnJlZmVyZW5jZTsgLy8gQ2hlY2sgaWYgaXQncyBqUXVlcnkgZWxlbWVudFxuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcucmVmZXJlbmNlLmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBJZiBib3VuZGFyeSBpcyBub3QgYHNjcm9sbFBhcmVudGAsIHRoZW4gc2V0IHBvc2l0aW9uIHRvIGBzdGF0aWNgXG4gICAgICAgIC8vIHRvIGFsbG93IHRoZSBtZW51IHRvIFwiZXNjYXBlXCIgdGhlIHNjcm9sbCBwYXJlbnQncyBib3VuZGFyaWVzXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMjQyNTFcblxuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYm91bmRhcnkgIT09ICdzY3JvbGxQYXJlbnQnKSB7XG4gICAgICAgICAgJChwYXJlbnQpLmFkZENsYXNzKENMQVNTX05BTUVfUE9TSVRJT05fU1RBVElDKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG5ldyBQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgdGhpcy5fbWVudSwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKCkpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuXG5cbiAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgJChwYXJlbnQpLmNsb3Nlc3QoU0VMRUNUT1JfTkFWQkFSX05BVikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICQoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbignbW91c2VvdmVyJywgbnVsbCwgJC5ub29wKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuXG4gICAgICAkKHRoaXMuX21lbnUpLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfU0hPVyQyKTtcbiAgICAgICQocGFyZW50KS50b2dnbGVDbGFzcyhDTEFTU19OQU1FX1NIT1ckMikudHJpZ2dlcigkLkV2ZW50KEVWRU5UX1NIT1dOJDEsIHJlbGF0ZWRUYXJnZXQpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKCkge1xuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuZGlzYWJsZWQgfHwgJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0RJU0FCTEVEKSB8fCAhJCh0aGlzLl9tZW51KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgICAgfTtcbiAgICAgIHZhciBoaWRlRXZlbnQgPSAkLkV2ZW50KEVWRU5UX0hJREUkMSwgcmVsYXRlZFRhcmdldCk7XG5cbiAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG5cbiAgICAgICQocGFyZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgICQodGhpcy5fbWVudSkudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuICAgICAgJChwYXJlbnQpLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfU0hPVyQyKS50cmlnZ2VyKCQuRXZlbnQoRVZFTlRfSElEREVOJDEsIHJlbGF0ZWRUYXJnZXQpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDQpO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS5vZmYoRVZFTlRfS0VZJDQpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9tZW51ID0gbnVsbDtcblxuICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuXG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpO1xuXG4gICAgICBpZiAodGhpcy5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fYWRkRXZlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX0NMSUNLLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgX3RoaXMudG9nZ2xlKCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCksICQodGhpcy5fZWxlbWVudCkuZGF0YSgpKSwgY29uZmlnKTtcbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkNCwgY29uZmlnLCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0TWVudUVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0TWVudUVsZW1lbnQoKSB7XG4gICAgICBpZiAoIXRoaXMuX21lbnUpIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgdGhpcy5fbWVudSA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX01FTlUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9tZW51O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldFBsYWNlbWVudCA9IGZ1bmN0aW9uIF9nZXRQbGFjZW1lbnQoKSB7XG4gICAgICB2YXIgJHBhcmVudERyb3Bkb3duID0gJCh0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUpO1xuICAgICAgdmFyIHBsYWNlbWVudCA9IFBMQUNFTUVOVF9CT1RUT007IC8vIEhhbmRsZSBkcm9wdXBcblxuICAgICAgaWYgKCRwYXJlbnREcm9wZG93bi5oYXNDbGFzcyhDTEFTU19OQU1FX0RST1BVUCkpIHtcbiAgICAgICAgcGxhY2VtZW50ID0gJCh0aGlzLl9tZW51KS5oYXNDbGFzcyhDTEFTU19OQU1FX01FTlVSSUdIVCkgPyBQTEFDRU1FTlRfVE9QRU5EIDogUExBQ0VNRU5UX1RPUDtcbiAgICAgIH0gZWxzZSBpZiAoJHBhcmVudERyb3Bkb3duLmhhc0NsYXNzKENMQVNTX05BTUVfRFJPUFJJR0hUKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBQTEFDRU1FTlRfUklHSFQ7XG4gICAgICB9IGVsc2UgaWYgKCRwYXJlbnREcm9wZG93bi5oYXNDbGFzcyhDTEFTU19OQU1FX0RST1BMRUZUKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBQTEFDRU1FTlRfTEVGVDtcbiAgICAgIH0gZWxzZSBpZiAoJCh0aGlzLl9tZW51KS5oYXNDbGFzcyhDTEFTU19OQU1FX01FTlVSSUdIVCkpIHtcbiAgICAgICAgcGxhY2VtZW50ID0gUExBQ0VNRU5UX0JPVFRPTUVORDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9kZXRlY3ROYXZiYXIgPSBmdW5jdGlvbiBfZGV0ZWN0TmF2YmFyKCkge1xuICAgICAgcmV0dXJuICQodGhpcy5fZWxlbWVudCkuY2xvc2VzdCgnLm5hdmJhcicpLmxlbmd0aCA+IDA7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0T2Zmc2V0ID0gZnVuY3Rpb24gX2dldE9mZnNldCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgb2Zmc2V0ID0ge307XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLm9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvZmZzZXQuZm4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEub2Zmc2V0cyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBkYXRhLm9mZnNldHMpLCBfdGhpczIuX2NvbmZpZy5vZmZzZXQoZGF0YS5vZmZzZXRzLCBfdGhpczIuX2VsZW1lbnQpIHx8IHt9KTtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZnNldC5vZmZzZXQgPSB0aGlzLl9jb25maWcub2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldFBvcHBlckNvbmZpZyA9IGZ1bmN0aW9uIF9nZXRQb3BwZXJDb25maWcoKSB7XG4gICAgICB2YXIgcG9wcGVyQ29uZmlnID0ge1xuICAgICAgICBwbGFjZW1lbnQ6IHRoaXMuX2dldFBsYWNlbWVudCgpLFxuICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpLFxuICAgICAgICAgIGZsaXA6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuX2NvbmZpZy5mbGlwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcmV2ZW50T3ZlcmZsb3c6IHtcbiAgICAgICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07IC8vIERpc2FibGUgUG9wcGVyLmpzIGlmIHdlIGhhdmUgYSBzdGF0aWMgZGlzcGxheVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmRpc3BsYXkgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIHBvcHBlckNvbmZpZy5tb2RpZmllcnMuYXBwbHlTdHlsZSA9IHtcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIHBvcHBlckNvbmZpZyksIHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcpO1xuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoREFUQV9LRVkkNCk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGw7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBEcm9wZG93bih0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoREFUQV9LRVkkNCwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgRHJvcGRvd24uX2NsZWFyTWVudXMgPSBmdW5jdGlvbiBfY2xlYXJNZW51cyhldmVudCkge1xuICAgICAgaWYgKGV2ZW50ICYmIChldmVudC53aGljaCA9PT0gUklHSFRfTU9VU0VfQlVUVE9OX1dISUNIIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQud2hpY2ggIT09IFRBQl9LRVlDT0RFKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0b2dnbGVzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIpKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRvZ2dsZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0b2dnbGVzW2ldKTtcblxuICAgICAgICB2YXIgY29udGV4dCA9ICQodG9nZ2xlc1tpXSkuZGF0YShEQVRBX0tFWSQ0KTtcbiAgICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogdG9nZ2xlc1tpXVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldC5jbGlja0V2ZW50ID0gZXZlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkcm9wZG93bk1lbnUgPSBjb250ZXh0Ll9tZW51O1xuXG4gICAgICAgIGlmICghJChwYXJlbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQyKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50ICYmIChldmVudC50eXBlID09PSAnY2xpY2snICYmIC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQud2hpY2ggPT09IFRBQl9LRVlDT0RFKSAmJiAkLmNvbnRhaW5zKHBhcmVudCwgZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhpZGVFdmVudCA9ICQuRXZlbnQoRVZFTlRfSElERSQxLCByZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgJChwYXJlbnQpLnRyaWdnZXIoaGlkZUV2ZW50KTtcblxuICAgICAgICBpZiAoaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIHJlbW92ZSB0aGUgZXh0cmFcbiAgICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcblxuXG4gICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAkKGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub2ZmKCdtb3VzZW92ZXInLCBudWxsLCAkLm5vb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlc1tpXS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcblxuICAgICAgICBpZiAoY29udGV4dC5fcG9wcGVyKSB7XG4gICAgICAgICAgY29udGV4dC5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgICQoZHJvcGRvd25NZW51KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1ckMik7XG4gICAgICAgICQocGFyZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1ckMikudHJpZ2dlcigkLkV2ZW50KEVWRU5UX0hJRERFTiQxLCByZWxhdGVkVGFyZ2V0KSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCA9IGZ1bmN0aW9uIF9nZXRQYXJlbnRGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICB2YXIgcGFyZW50O1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnQgfHwgZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICA7XG5cbiAgICBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyID0gZnVuY3Rpb24gX2RhdGFBcGlLZXlkb3duSGFuZGxlcihldmVudCkge1xuICAgICAgLy8gSWYgbm90IGlucHV0L3RleHRhcmVhOlxuICAgICAgLy8gIC0gQW5kIG5vdCBhIGtleSBpbiBSRUdFWFBfS0VZRE9XTiA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAvLyBJZiBpbnB1dC90ZXh0YXJlYTpcbiAgICAgIC8vICAtIElmIHNwYWNlIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAvLyAgLSBJZiBrZXkgaXMgb3RoZXIgdGhhbiBlc2NhcGVcbiAgICAgIC8vICAgIC0gSWYga2V5IGlzIG5vdCB1cCBvciBkb3duID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAgIC8vICAgIC0gSWYgdHJpZ2dlciBpbnNpZGUgdGhlIG1lbnUgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpID8gZXZlbnQud2hpY2ggPT09IFNQQUNFX0tFWUNPREUgfHwgZXZlbnQud2hpY2ggIT09IEVTQ0FQRV9LRVlDT0RFICYmIChldmVudC53aGljaCAhPT0gQVJST1dfRE9XTl9LRVlDT0RFICYmIGV2ZW50LndoaWNoICE9PSBBUlJPV19VUF9LRVlDT0RFIHx8ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFNFTEVDVE9SX01FTlUpLmxlbmd0aCkgOiAhUkVHRVhQX0tFWURPV04udGVzdChldmVudC53aGljaCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAkKHRoaXMpLmhhc0NsYXNzKENMQVNTX05BTUVfRElTQUJMRUQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzKTtcblxuICAgICAgdmFyIGlzQWN0aXZlID0gJChwYXJlbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQyKTtcblxuICAgICAgaWYgKCFpc0FjdGl2ZSAmJiBldmVudC53aGljaCA9PT0gRVNDQVBFX0tFWUNPREUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICghaXNBY3RpdmUgfHwgaXNBY3RpdmUgJiYgKGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSB8fCBldmVudC53aGljaCA9PT0gU1BBQ0VfS0VZQ09ERSkpIHtcbiAgICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSkge1xuICAgICAgICAgICQocGFyZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfREFUQV9UT0dHTEUkMikpLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgICAgIH1cblxuICAgICAgICAkKHRoaXMpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZW1zID0gW10uc2xpY2UuY2FsbChwYXJlbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9WSVNJQkxFX0lURU1TKSkuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiAkKGl0ZW0pLmlzKCc6dmlzaWJsZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSBpdGVtcy5pbmRleE9mKGV2ZW50LnRhcmdldCk7XG5cbiAgICAgIGlmIChldmVudC53aGljaCA9PT0gQVJST1dfVVBfS0VZQ09ERSAmJiBpbmRleCA+IDApIHtcbiAgICAgICAgLy8gVXBcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBBUlJPV19ET1dOX0tFWUNPREUgJiYgaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIERvd25cbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zW2luZGV4XS5mb2N1cygpO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoRHJvcGRvd24sIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQyO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0VHlwZVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0VHlwZSQyO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBEcm9wZG93bjtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICQoZG9jdW1lbnQpLm9uKEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIsIERyb3Bkb3duLl9kYXRhQXBpS2V5ZG93bkhhbmRsZXIpLm9uKEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX01FTlUsIERyb3Bkb3duLl9kYXRhQXBpS2V5ZG93bkhhbmRsZXIpLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJJDQgKyBcIiBcIiArIEVWRU5UX0tFWVVQX0RBVEFfQVBJLCBEcm9wZG93bi5fY2xlYXJNZW51cykub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNCwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIERyb3Bkb3duLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkKHRoaXMpLCAndG9nZ2xlJyk7XG4gIH0pLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJJDQsIFNFTEVDVE9SX0ZPUk1fQ0hJTEQsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkLmZuW05BTUUkNF0gPSBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlO1xuICAkLmZuW05BTUUkNF0uQ29uc3RydWN0b3IgPSBEcm9wZG93bjtcblxuICAkLmZuW05BTUUkNF0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuW05BTUUkNF0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkNDtcbiAgICByZXR1cm4gRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkNSA9ICdtb2RhbCc7XG4gIHZhciBWRVJTSU9OJDUgPSAnNC41LjAnO1xuICB2YXIgREFUQV9LRVkkNSA9ICdicy5tb2RhbCc7XG4gIHZhciBFVkVOVF9LRVkkNSA9IFwiLlwiICsgREFUQV9LRVkkNTtcbiAgdmFyIERBVEFfQVBJX0tFWSQ1ID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkNSA9ICQuZm5bTkFNRSQ1XTtcbiAgdmFyIEVTQ0FQRV9LRVlDT0RFJDEgPSAyNzsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgRXNjYXBlIChFc2MpIGtleVxuXG4gIHZhciBEZWZhdWx0JDMgPSB7XG4gICAgYmFja2Ryb3A6IHRydWUsXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgZm9jdXM6IHRydWUsXG4gICAgc2hvdzogdHJ1ZVxuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUkMyA9IHtcbiAgICBiYWNrZHJvcDogJyhib29sZWFufHN0cmluZyknLFxuICAgIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gICAgZm9jdXM6ICdib29sZWFuJyxcbiAgICBzaG93OiAnYm9vbGVhbidcbiAgfTtcbiAgdmFyIEVWRU5UX0hJREUkMiA9IFwiaGlkZVwiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9ISURFX1BSRVZFTlRFRCA9IFwiaGlkZVByZXZlbnRlZFwiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9ISURERU4kMiA9IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX1NIT1ckMiA9IFwic2hvd1wiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9TSE9XTiQyID0gXCJzaG93blwiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9GT0NVU0lOID0gXCJmb2N1c2luXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX1JFU0laRSA9IFwicmVzaXplXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX0NMSUNLX0RJU01JU1MgPSBcImNsaWNrLmRpc21pc3NcIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gXCJrZXlkb3duLmRpc21pc3NcIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfTU9VU0VVUF9ESVNNSVNTID0gXCJtb3VzZXVwLmRpc21pc3NcIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MgPSBcIm1vdXNlZG93bi5kaXNtaXNzXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDUgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkNSArIERBVEFfQVBJX0tFWSQ1O1xuICB2YXIgQ0xBU1NfTkFNRV9TQ1JPTExBQkxFID0gJ21vZGFsLWRpYWxvZy1zY3JvbGxhYmxlJztcbiAgdmFyIENMQVNTX05BTUVfU0NST0xMQkFSX01FQVNVUkVSID0gJ21vZGFsLXNjcm9sbGJhci1tZWFzdXJlJztcbiAgdmFyIENMQVNTX05BTUVfQkFDS0RST1AgPSAnbW9kYWwtYmFja2Ryb3AnO1xuICB2YXIgQ0xBU1NfTkFNRV9PUEVOID0gJ21vZGFsLW9wZW4nO1xuICB2YXIgQ0xBU1NfTkFNRV9GQURFJDEgPSAnZmFkZSc7XG4gIHZhciBDTEFTU19OQU1FX1NIT1ckMyA9ICdzaG93JztcbiAgdmFyIENMQVNTX05BTUVfU1RBVElDID0gJ21vZGFsLXN0YXRpYyc7XG4gIHZhciBTRUxFQ1RPUl9ESUFMT0cgPSAnLm1vZGFsLWRpYWxvZyc7XG4gIHZhciBTRUxFQ1RPUl9NT0RBTF9CT0RZID0gJy5tb2RhbC1ib2R5JztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMgPSAnW2RhdGEtdG9nZ2xlPVwibW9kYWxcIl0nO1xuICB2YXIgU0VMRUNUT1JfREFUQV9ESVNNSVNTID0gJ1tkYXRhLWRpc21pc3M9XCJtb2RhbFwiXSc7XG4gIHZhciBTRUxFQ1RPUl9GSVhFRF9DT05URU5UID0gJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnO1xuICB2YXIgU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQgPSAnLnN0aWNreS10b3AnO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBNb2RhbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTW9kYWwoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fZGlhbG9nID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX0RJQUxPRyk7XG4gICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGw7XG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IGZhbHNlO1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9zY3JvbGxiYXJXaWR0aCA9IDA7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBNb2RhbC5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gICAgfTtcblxuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZBREUkMSkpIHtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3dFdmVudCA9ICQuRXZlbnQoRVZFTlRfU0hPVyQyLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG5cbiAgICAgIGlmICh0aGlzLl9pc1Nob3duIHx8IHNob3dFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlO1xuXG4gICAgICB0aGlzLl9jaGVja1Njcm9sbGJhcigpO1xuXG4gICAgICB0aGlzLl9zZXRTY3JvbGxiYXIoKTtcblxuICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG5cbiAgICAgIHRoaXMuX3NldEVzY2FwZUV2ZW50KCk7XG5cbiAgICAgIHRoaXMuX3NldFJlc2l6ZUV2ZW50KCk7XG5cbiAgICAgICQodGhpcy5fZWxlbWVudCkub24oRVZFTlRfQ0xJQ0tfRElTTUlTUywgU0VMRUNUT1JfREFUQV9ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmhpZGUoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgICAkKHRoaXMuX2RpYWxvZykub24oRVZFTlRfTU9VU0VET1dOX0RJU01JU1MsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJChfdGhpcy5fZWxlbWVudCkub25lKEVWRU5UX01PVVNFVVBfRElTTUlTUywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKCQoZXZlbnQudGFyZ2V0KS5pcyhfdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgICAgICAgIF90aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3Nob3dCYWNrZHJvcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKGV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGlkZUV2ZW50ID0gJC5FdmVudChFVkVOVF9ISURFJDIpO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgIGlmICghdGhpcy5faXNTaG93biB8fCBoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9ICQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDEpO1xuXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXRFc2NhcGVFdmVudCgpO1xuXG4gICAgICB0aGlzLl9zZXRSZXNpemVFdmVudCgpO1xuXG4gICAgICAkKGRvY3VtZW50KS5vZmYoRVZFTlRfRk9DVVNJTik7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfU0hPVyQzKTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkub2ZmKEVWRU5UX0NMSUNLX0RJU01JU1MpO1xuICAgICAgJCh0aGlzLl9kaWFsb2cpLm9mZihFVkVOVF9NT1VTRURPV05fRElTTUlTUyk7XG5cbiAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAkKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLl9oaWRlTW9kYWwoZXZlbnQpO1xuICAgICAgICB9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faGlkZU1vZGFsKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgIFt3aW5kb3csIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2RpYWxvZ10uZm9yRWFjaChmdW5jdGlvbiAoaHRtbEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICQoaHRtbEVsZW1lbnQpLm9mZihFVkVOVF9LRVkkNSk7XG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogYGRvY3VtZW50YCBoYXMgMiBldmVudHMgYEVWRU5UX0ZPQ1VTSU5gIGFuZCBgRVZFTlRfQ0xJQ0tfREFUQV9BUElgXG4gICAgICAgKiBEbyBub3QgbW92ZSBgZG9jdW1lbnRgIGluIGBodG1sRWxlbWVudHNgIGFycmF5XG4gICAgICAgKiBJdCB3aWxsIHJlbW92ZSBgRVZFTlRfQ0xJQ0tfREFUQV9BUElgIGV2ZW50IHRoYXQgc2hvdWxkIHJlbWFpblxuICAgICAgICovXG5cbiAgICAgICQoZG9jdW1lbnQpLm9mZihFVkVOVF9GT0NVU0lOKTtcbiAgICAgICQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSQ1KTtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2RpYWxvZyA9IG51bGw7XG4gICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGw7XG4gICAgICB0aGlzLl9pc1Nob3duID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzQm9keU92ZXJmbG93aW5nID0gbnVsbDtcbiAgICAgIHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSBudWxsO1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gbnVsbDtcbiAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gbnVsbDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmhhbmRsZVVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuX2FkanVzdERpYWxvZygpO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBEZWZhdWx0JDMpLCBjb25maWcpO1xuICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSQ1LCBjb25maWcsIERlZmF1bHRUeXBlJDMpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uID0gZnVuY3Rpb24gX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgdmFyIGhpZGVFdmVudFByZXZlbnRlZCA9ICQuRXZlbnQoRVZFTlRfSElERV9QUkVWRU5URUQpO1xuICAgICAgICAkKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoaGlkZUV2ZW50UHJldmVudGVkKTtcblxuICAgICAgICBpZiAoaGlkZUV2ZW50UHJldmVudGVkLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuXG4gICAgICAgIHZhciBtb2RhbFRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG4gICAgICAgICQodGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NUQVRJQyk7XG4gICAgICAgIH0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKG1vZGFsVHJhbnNpdGlvbkR1cmF0aW9uKTtcblxuICAgICAgICB0aGlzLl9lbGVtZW50LmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zaG93RWxlbWVudCA9IGZ1bmN0aW9uIF9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIHRyYW5zaXRpb24gPSAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQxKTtcbiAgICAgIHZhciBtb2RhbEJvZHkgPSB0aGlzLl9kaWFsb2cgPyB0aGlzLl9kaWFsb2cucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9NT0RBTF9CT0RZKSA6IG51bGw7XG5cbiAgICAgIGlmICghdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlIHx8IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgLy8gRG9uJ3QgbW92ZSBtb2RhbCdzIERPTSBwb3NpdGlvblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKTtcblxuICAgICAgaWYgKCQodGhpcy5fZGlhbG9nKS5oYXNDbGFzcyhDTEFTU19OQU1FX1NDUk9MTEFCTEUpICYmIG1vZGFsQm9keSkge1xuICAgICAgICBtb2RhbEJvZHkuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgVXRpbC5yZWZsb3codGhpcy5fZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgICQodGhpcy5fZWxlbWVudCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDMpO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgIHRoaXMuX2VuZm9yY2VGb2N1cygpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2hvd25FdmVudCA9ICQuRXZlbnQoRVZFTlRfU0hPV04kMiwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcblxuICAgICAgdmFyIHRyYW5zaXRpb25Db21wbGV0ZSA9IGZ1bmN0aW9uIHRyYW5zaXRpb25Db21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKF90aGlzNC5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgICAgX3RoaXM0Ll9lbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczQuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgICAkKF90aGlzNC5fZWxlbWVudCkudHJpZ2dlcihzaG93bkV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2RpYWxvZyk7XG4gICAgICAgICQodGhpcy5fZGlhbG9nKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgdHJhbnNpdGlvbkNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNpdGlvbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fZW5mb3JjZUZvY3VzID0gZnVuY3Rpb24gX2VuZm9yY2VGb2N1cygpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICAkKGRvY3VtZW50KS5vZmYoRVZFTlRfRk9DVVNJTikgLy8gR3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBmb2N1cyBsb29wXG4gICAgICAub24oRVZFTlRfRk9DVVNJTiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChkb2N1bWVudCAhPT0gZXZlbnQudGFyZ2V0ICYmIF90aGlzNS5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0ICYmICQoX3RoaXM1Ll9lbGVtZW50KS5oYXMoZXZlbnQudGFyZ2V0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBfdGhpczUuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0RXNjYXBlRXZlbnQgPSBmdW5jdGlvbiBfc2V0RXNjYXBlRXZlbnQoKSB7XG4gICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9LRVlET1dOX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmIChfdGhpczYuX2NvbmZpZy5rZXlib2FyZCAmJiBldmVudC53aGljaCA9PT0gRVNDQVBFX0tFWUNPREUkMSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgX3RoaXM2LmhpZGUoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFfdGhpczYuX2NvbmZpZy5rZXlib2FyZCAmJiBldmVudC53aGljaCA9PT0gRVNDQVBFX0tFWUNPREUkMSkge1xuICAgICAgICAgICAgX3RoaXM2Ll90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2hvd24pIHtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS5vZmYoRVZFTlRfS0VZRE9XTl9ESVNNSVNTKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zZXRSZXNpemVFdmVudCA9IGZ1bmN0aW9uIF9zZXRSZXNpemVFdmVudCgpIHtcbiAgICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNTaG93bikge1xuICAgICAgICAkKHdpbmRvdykub24oRVZFTlRfUkVTSVpFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXM3LmhhbmRsZVVwZGF0ZShldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJCh3aW5kb3cpLm9mZihFVkVOVF9SRVNJWkUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2hpZGVNb2RhbCA9IGZ1bmN0aW9uIF9oaWRlTW9kYWwoKSB7XG4gICAgICB2YXIgX3RoaXM4ID0gdGhpcztcblxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKTtcblxuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuX3Nob3dCYWNrZHJvcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoZG9jdW1lbnQuYm9keSkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOKTtcblxuICAgICAgICBfdGhpczguX3Jlc2V0QWRqdXN0bWVudHMoKTtcblxuICAgICAgICBfdGhpczguX3Jlc2V0U2Nyb2xsYmFyKCk7XG5cbiAgICAgICAgJChfdGhpczguX2VsZW1lbnQpLnRyaWdnZXIoRVZFTlRfSElEREVOJDIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fcmVtb3ZlQmFja2Ryb3AgPSBmdW5jdGlvbiBfcmVtb3ZlQmFja2Ryb3AoKSB7XG4gICAgICBpZiAodGhpcy5fYmFja2Ryb3ApIHtcbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuX2JhY2tkcm9wID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zaG93QmFja2Ryb3AgPSBmdW5jdGlvbiBfc2hvd0JhY2tkcm9wKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgICAgdmFyIGFuaW1hdGUgPSAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQxKSA/IENMQVNTX05BTUVfRkFERSQxIDogJyc7XG5cbiAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmIHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSBDTEFTU19OQU1FX0JBQ0tEUk9QO1xuXG4gICAgICAgIGlmIChhbmltYXRlKSB7XG4gICAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChhbmltYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpO1xuICAgICAgICAkKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX0NMSUNLX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmIChfdGhpczkuX2lnbm9yZUJhY2tkcm9wQ2xpY2spIHtcbiAgICAgICAgICAgIF90aGlzOS5faWdub3JlQmFja2Ryb3BDbGljayA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudC50YXJnZXQgIT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczkuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFuaW1hdGUpIHtcbiAgICAgICAgICBVdGlsLnJlZmxvdyh0aGlzLl9iYWNrZHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5hZGRDbGFzcyhDTEFTU19OQU1FX1NIT1ckMyk7XG5cbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYW5pbWF0ZSkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9iYWNrZHJvcCk7XG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjYWxsYmFjaykuZW11bGF0ZVRyYW5zaXRpb25FbmQoYmFja2Ryb3BUcmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5faXNTaG93biAmJiB0aGlzLl9iYWNrZHJvcCkge1xuICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1ckMyk7XG5cbiAgICAgICAgdmFyIGNhbGxiYWNrUmVtb3ZlID0gZnVuY3Rpb24gY2FsbGJhY2tSZW1vdmUoKSB7XG4gICAgICAgICAgX3RoaXM5Ll9yZW1vdmVCYWNrZHJvcCgpO1xuXG4gICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZBREUkMSkpIHtcbiAgICAgICAgICB2YXIgX2JhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9iYWNrZHJvcCk7XG5cbiAgICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY2FsbGJhY2tSZW1vdmUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKF9iYWNrZHJvcFRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2tSZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXG4gICAgLy8gdG9kbyAoZmF0KTogdGhlc2Ugc2hvdWxkIHByb2JhYmx5IGJlIHJlZmFjdG9yZWQgb3V0IG9mIG1vZGFsLmpzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIDtcblxuICAgIF9wcm90by5fYWRqdXN0RGlhbG9nID0gZnVuY3Rpb24gX2FkanVzdERpYWxvZygpIHtcbiAgICAgIHZhciBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICAgIGlmICghdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSB0aGlzLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2lzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZXNldEFkanVzdG1lbnRzID0gZnVuY3Rpb24gX3Jlc2V0QWRqdXN0bWVudHMoKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gJyc7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2NoZWNrU2Nyb2xsYmFyID0gZnVuY3Rpb24gX2NoZWNrU2Nyb2xsYmFyKCkge1xuICAgICAgdmFyIHJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSBNYXRoLnJvdW5kKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIDwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgICB0aGlzLl9zY3JvbGxiYXJXaWR0aCA9IHRoaXMuX2dldFNjcm9sbGJhcldpZHRoKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24gX3NldFNjcm9sbGJhcigpIHtcbiAgICAgIHZhciBfdGhpczEwID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzQm9keU92ZXJmbG93aW5nKSB7XG4gICAgICAgIC8vIE5vdGU6IERPTU5vZGUuc3R5bGUucGFkZGluZ1JpZ2h0IHJldHVybnMgdGhlIGFjdHVhbCB2YWx1ZSBvciAnJyBpZiBub3Qgc2V0XG4gICAgICAgIC8vICAgd2hpbGUgJChET01Ob2RlKS5jc3MoJ3BhZGRpbmctcmlnaHQnKSByZXR1cm5zIHRoZSBjYWxjdWxhdGVkIHZhbHVlIG9yIDAgaWYgbm90IHNldFxuICAgICAgICB2YXIgZml4ZWRDb250ZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQpKTtcbiAgICAgICAgdmFyIHN0aWNreUNvbnRlbnQgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQpKTsgLy8gQWRqdXN0IGZpeGVkIGNvbnRlbnQgcGFkZGluZ1xuXG4gICAgICAgICQoZml4ZWRDb250ZW50KS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgIHZhciBhY3R1YWxQYWRkaW5nID0gZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRQYWRkaW5nID0gJChlbGVtZW50KS5jc3MoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgICAkKGVsZW1lbnQpLmRhdGEoJ3BhZGRpbmctcmlnaHQnLCBhY3R1YWxQYWRkaW5nKS5jc3MoJ3BhZGRpbmctcmlnaHQnLCBwYXJzZUZsb2F0KGNhbGN1bGF0ZWRQYWRkaW5nKSArIF90aGlzMTAuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgICAgfSk7IC8vIEFkanVzdCBzdGlja3kgY29udGVudCBtYXJnaW5cblxuICAgICAgICAkKHN0aWNreUNvbnRlbnQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGFjdHVhbE1hcmdpbiA9IGVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQ7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRNYXJnaW4gPSAkKGVsZW1lbnQpLmNzcygnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgICAgJChlbGVtZW50KS5kYXRhKCdtYXJnaW4tcmlnaHQnLCBhY3R1YWxNYXJnaW4pLmNzcygnbWFyZ2luLXJpZ2h0JywgcGFyc2VGbG9hdChjYWxjdWxhdGVkTWFyZ2luKSAtIF90aGlzMTAuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgICAgfSk7IC8vIEFkanVzdCBib2R5IHBhZGRpbmdcblxuICAgICAgICB2YXIgYWN0dWFsUGFkZGluZyA9IGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0O1xuICAgICAgICB2YXIgY2FsY3VsYXRlZFBhZGRpbmcgPSAkKGRvY3VtZW50LmJvZHkpLmNzcygncGFkZGluZy1yaWdodCcpO1xuICAgICAgICAkKGRvY3VtZW50LmJvZHkpLmRhdGEoJ3BhZGRpbmctcmlnaHQnLCBhY3R1YWxQYWRkaW5nKS5jc3MoJ3BhZGRpbmctcmlnaHQnLCBwYXJzZUZsb2F0KGNhbGN1bGF0ZWRQYWRkaW5nKSArIHRoaXMuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgIH1cblxuICAgICAgJChkb2N1bWVudC5ib2R5KS5hZGRDbGFzcyhDTEFTU19OQU1FX09QRU4pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3Jlc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24gX3Jlc2V0U2Nyb2xsYmFyKCkge1xuICAgICAgLy8gUmVzdG9yZSBmaXhlZCBjb250ZW50IHBhZGRpbmdcbiAgICAgIHZhciBmaXhlZENvbnRlbnQgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfRklYRURfQ09OVEVOVCkpO1xuICAgICAgJChmaXhlZENvbnRlbnQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBwYWRkaW5nID0gJChlbGVtZW50KS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG4gICAgICAgICQoZWxlbWVudCkucmVtb3ZlRGF0YSgncGFkZGluZy1yaWdodCcpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IHBhZGRpbmcgPyBwYWRkaW5nIDogJyc7XG4gICAgICB9KTsgLy8gUmVzdG9yZSBzdGlja3kgY29udGVudFxuXG4gICAgICB2YXIgZWxlbWVudHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJcIiArIFNFTEVDVE9SX1NUSUNLWV9DT05URU5UKSk7XG4gICAgICAkKGVsZW1lbnRzKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICB2YXIgbWFyZ2luID0gJChlbGVtZW50KS5kYXRhKCdtYXJnaW4tcmlnaHQnKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1hcmdpbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAkKGVsZW1lbnQpLmNzcygnbWFyZ2luLXJpZ2h0JywgbWFyZ2luKS5yZW1vdmVEYXRhKCdtYXJnaW4tcmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7IC8vIFJlc3RvcmUgYm9keSBwYWRkaW5nXG5cbiAgICAgIHZhciBwYWRkaW5nID0gJChkb2N1bWVudC5ib2R5KS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG4gICAgICAkKGRvY3VtZW50LmJvZHkpLnJlbW92ZURhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gcGFkZGluZyA/IHBhZGRpbmcgOiAnJztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRTY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uIF9nZXRTY3JvbGxiYXJXaWR0aCgpIHtcbiAgICAgIC8vIHRoeCBkLndhbHNoXG4gICAgICB2YXIgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzY3JvbGxEaXYuY2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9TQ1JPTExCQVJfTUVBU1VSRVI7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7XG4gICAgICB2YXIgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGg7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcm9sbERpdik7XG4gICAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBNb2RhbC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9ICQodGhpcykuZGF0YShEQVRBX0tFWSQ1KTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBEZWZhdWx0JDMpLCAkKHRoaXMpLmRhdGEoKSksIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IE1vZGFsKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICQodGhpcykuZGF0YShEQVRBX0tFWSQ1LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKF9jb25maWcuc2hvdykge1xuICAgICAgICAgIGRhdGEuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhNb2RhbCwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kNTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0JDM7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIE1vZGFsO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJChkb2N1bWVudCkub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNSwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIF90aGlzMTEgPSB0aGlzO1xuXG4gICAgdmFyIHRhcmdldDtcbiAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIHZhciBjb25maWcgPSAkKHRhcmdldCkuZGF0YShEQVRBX0tFWSQ1KSA/ICd0b2dnbGUnIDogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sICQodGFyZ2V0KS5kYXRhKCkpLCAkKHRoaXMpLmRhdGEoKSk7XG5cbiAgICBpZiAodGhpcy50YWdOYW1lID09PSAnQScgfHwgdGhpcy50YWdOYW1lID09PSAnQVJFQScpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdmFyICR0YXJnZXQgPSAkKHRhcmdldCkub25lKEVWRU5UX1NIT1ckMiwgZnVuY3Rpb24gKHNob3dFdmVudCkge1xuICAgICAgaWYgKHNob3dFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAvLyBPbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgJHRhcmdldC5vbmUoRVZFTlRfSElEREVOJDIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQoX3RoaXMxMSkuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICBfdGhpczExLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTW9kYWwuX2pRdWVyeUludGVyZmFjZS5jYWxsKCQodGFyZ2V0KSwgY29uZmlnLCB0aGlzKTtcbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkLmZuW05BTUUkNV0gPSBNb2RhbC5falF1ZXJ5SW50ZXJmYWNlO1xuICAkLmZuW05BTUUkNV0uQ29uc3RydWN0b3IgPSBNb2RhbDtcblxuICAkLmZuW05BTUUkNV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuW05BTUUkNV0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkNTtcbiAgICByZXR1cm4gTW9kYWwuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwICh2NC41LjApOiB0b29scy9zYW5pdGl6ZXIuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG4gIHZhciB1cmlBdHRycyA9IFsnYmFja2dyb3VuZCcsICdjaXRlJywgJ2hyZWYnLCAnaXRlbXR5cGUnLCAnbG9uZ2Rlc2MnLCAncG9zdGVyJywgJ3NyYycsICd4bGluazpocmVmJ107XG4gIHZhciBBUklBX0FUVFJJQlVURV9QQVRURVJOID0gL15hcmlhLVtcXHctXSokL2k7XG4gIHZhciBEZWZhdWx0V2hpdGVsaXN0ID0ge1xuICAgIC8vIEdsb2JhbCBhdHRyaWJ1dGVzIGFsbG93ZWQgb24gYW55IHN1cHBsaWVkIGVsZW1lbnQgYmVsb3cuXG4gICAgJyonOiBbJ2NsYXNzJywgJ2RpcicsICdpZCcsICdsYW5nJywgJ3JvbGUnLCBBUklBX0FUVFJJQlVURV9QQVRURVJOXSxcbiAgICBhOiBbJ3RhcmdldCcsICdocmVmJywgJ3RpdGxlJywgJ3JlbCddLFxuICAgIGFyZWE6IFtdLFxuICAgIGI6IFtdLFxuICAgIGJyOiBbXSxcbiAgICBjb2w6IFtdLFxuICAgIGNvZGU6IFtdLFxuICAgIGRpdjogW10sXG4gICAgZW06IFtdLFxuICAgIGhyOiBbXSxcbiAgICBoMTogW10sXG4gICAgaDI6IFtdLFxuICAgIGgzOiBbXSxcbiAgICBoNDogW10sXG4gICAgaDU6IFtdLFxuICAgIGg2OiBbXSxcbiAgICBpOiBbXSxcbiAgICBpbWc6IFsnc3JjJywgJ3NyY3NldCcsICdhbHQnLCAndGl0bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgbGk6IFtdLFxuICAgIG9sOiBbXSxcbiAgICBwOiBbXSxcbiAgICBwcmU6IFtdLFxuICAgIHM6IFtdLFxuICAgIHNtYWxsOiBbXSxcbiAgICBzcGFuOiBbXSxcbiAgICBzdWI6IFtdLFxuICAgIHN1cDogW10sXG4gICAgc3Ryb25nOiBbXSxcbiAgICB1OiBbXSxcbiAgICB1bDogW11cbiAgfTtcbiAgLyoqXG4gICAqIEEgcGF0dGVybiB0aGF0IHJlY29nbml6ZXMgYSBjb21tb25seSB1c2VmdWwgc3Vic2V0IG9mIFVSTHMgdGhhdCBhcmUgc2FmZS5cbiAgICpcbiAgICogU2hvdXRvdXQgdG8gQW5ndWxhciA3IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi83LjIuNC9wYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vdXJsX3Nhbml0aXplci50c1xuICAgKi9cblxuICB2YXIgU0FGRV9VUkxfUEFUVEVSTiA9IC9eKD86KD86aHR0cHM/fG1haWx0b3xmdHB8dGVsfGZpbGUpOnxbXiMmLzo/XSooPzpbIy8/XXwkKSkvZ2k7XG4gIC8qKlxuICAgKiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHNhZmUgZGF0YSBVUkxzLiBPbmx5IG1hdGNoZXMgaW1hZ2UsIHZpZGVvIGFuZCBhdWRpbyB0eXBlcy5cbiAgICpcbiAgICogU2hvdXRvdXQgdG8gQW5ndWxhciA3IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi83LjIuNC9wYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vdXJsX3Nhbml0aXplci50c1xuICAgKi9cblxuICB2YXIgREFUQV9VUkxfUEFUVEVSTiA9IC9eZGF0YTooPzppbWFnZVxcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cXC8oPzptcDN8b2dhfG9nZ3xvcHVzKSk7YmFzZTY0LFtcXGQrL2Etel0rPSokL2k7XG5cbiAgZnVuY3Rpb24gYWxsb3dlZEF0dHJpYnV0ZShhdHRyLCBhbGxvd2VkQXR0cmlidXRlTGlzdCkge1xuICAgIHZhciBhdHRyTmFtZSA9IGF0dHIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChhbGxvd2VkQXR0cmlidXRlTGlzdC5pbmRleE9mKGF0dHJOYW1lKSAhPT0gLTEpIHtcbiAgICAgIGlmICh1cmlBdHRycy5pbmRleE9mKGF0dHJOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oYXR0ci5ub2RlVmFsdWUubWF0Y2goU0FGRV9VUkxfUEFUVEVSTikgfHwgYXR0ci5ub2RlVmFsdWUubWF0Y2goREFUQV9VUkxfUEFUVEVSTikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgcmVnRXhwID0gYWxsb3dlZEF0dHJpYnV0ZUxpc3QuZmlsdGVyKGZ1bmN0aW9uIChhdHRyUmVnZXgpIHtcbiAgICAgIHJldHVybiBhdHRyUmVnZXggaW5zdGFuY2VvZiBSZWdFeHA7XG4gICAgfSk7IC8vIENoZWNrIGlmIGEgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRlcyB0aGUgYXR0cmlidXRlLlxuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJlZ0V4cC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKGF0dHJOYW1lLm1hdGNoKHJlZ0V4cFtpXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2FuaXRpemVIdG1sKHVuc2FmZUh0bWwsIHdoaXRlTGlzdCwgc2FuaXRpemVGbikge1xuICAgIGlmICh1bnNhZmVIdG1sLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuc2FmZUh0bWw7XG4gICAgfVxuXG4gICAgaWYgKHNhbml0aXplRm4gJiYgdHlwZW9mIHNhbml0aXplRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzYW5pdGl6ZUZuKHVuc2FmZUh0bWwpO1xuICAgIH1cblxuICAgIHZhciBkb21QYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuICAgIHZhciBjcmVhdGVkRG9jdW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHVuc2FmZUh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICB2YXIgd2hpdGVsaXN0S2V5cyA9IE9iamVjdC5rZXlzKHdoaXRlTGlzdCk7XG4gICAgdmFyIGVsZW1lbnRzID0gW10uc2xpY2UuY2FsbChjcmVhdGVkRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpO1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSwgbGVuKSB7XG4gICAgICB2YXIgZWwgPSBlbGVtZW50c1tpXTtcbiAgICAgIHZhciBlbE5hbWUgPSBlbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAod2hpdGVsaXN0S2V5cy5pbmRleE9mKGVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgIH1cblxuICAgICAgdmFyIGF0dHJpYnV0ZUxpc3QgPSBbXS5zbGljZS5jYWxsKGVsLmF0dHJpYnV0ZXMpO1xuICAgICAgdmFyIHdoaXRlbGlzdGVkQXR0cmlidXRlcyA9IFtdLmNvbmNhdCh3aGl0ZUxpc3RbJyonXSB8fCBbXSwgd2hpdGVMaXN0W2VsTmFtZV0gfHwgW10pO1xuICAgICAgYXR0cmlidXRlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZShhdHRyLCB3aGl0ZWxpc3RlZEF0dHJpYnV0ZXMpKSB7XG4gICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHIubm9kZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKGkpO1xuXG4gICAgICBpZiAoX3JldCA9PT0gXCJjb250aW51ZVwiKSBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlZERvY3VtZW50LmJvZHkuaW5uZXJIVE1MO1xuICB9XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBOQU1FJDYgPSAndG9vbHRpcCc7XG4gIHZhciBWRVJTSU9OJDYgPSAnNC41LjAnO1xuICB2YXIgREFUQV9LRVkkNiA9ICdicy50b29sdGlwJztcbiAgdmFyIEVWRU5UX0tFWSQ2ID0gXCIuXCIgKyBEQVRBX0tFWSQ2O1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDYgPSAkLmZuW05BTUUkNl07XG4gIHZhciBDTEFTU19QUkVGSVggPSAnYnMtdG9vbHRpcCc7XG4gIHZhciBCU0NMU19QUkVGSVhfUkVHRVggPSBuZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIgKyBDTEFTU19QUkVGSVggKyBcIlxcXFxTK1wiLCAnZycpO1xuICB2YXIgRElTQUxMT1dFRF9BVFRSSUJVVEVTID0gWydzYW5pdGl6ZScsICd3aGl0ZUxpc3QnLCAnc2FuaXRpemVGbiddO1xuICB2YXIgRGVmYXVsdFR5cGUkNCA9IHtcbiAgICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgICB0ZW1wbGF0ZTogJ3N0cmluZycsXG4gICAgdGl0bGU6ICcoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJyxcbiAgICB0cmlnZ2VyOiAnc3RyaW5nJyxcbiAgICBkZWxheTogJyhudW1iZXJ8b2JqZWN0KScsXG4gICAgaHRtbDogJ2Jvb2xlYW4nLFxuICAgIHNlbGVjdG9yOiAnKHN0cmluZ3xib29sZWFuKScsXG4gICAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICAgIG9mZnNldDogJyhudW1iZXJ8c3RyaW5nfGZ1bmN0aW9uKScsXG4gICAgY29udGFpbmVyOiAnKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pJyxcbiAgICBmYWxsYmFja1BsYWNlbWVudDogJyhzdHJpbmd8YXJyYXkpJyxcbiAgICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICAgIHNhbml0aXplOiAnYm9vbGVhbicsXG4gICAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gICAgd2hpdGVMaXN0OiAnb2JqZWN0JyxcbiAgICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3QpJ1xuICB9O1xuICB2YXIgQXR0YWNobWVudE1hcCA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgVE9QOiAndG9wJyxcbiAgICBSSUdIVDogJ3JpZ2h0JyxcbiAgICBCT1RUT006ICdib3R0b20nLFxuICAgIExFRlQ6ICdsZWZ0J1xuICB9O1xuICB2YXIgRGVmYXVsdCQ0ID0ge1xuICAgIGFuaW1hdGlvbjogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJ0b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj4nICsgJzxkaXYgY2xhc3M9XCJhcnJvd1wiPjwvZGl2PicgKyAnPGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj48L2Rpdj4nLFxuICAgIHRyaWdnZXI6ICdob3ZlciBmb2N1cycsXG4gICAgdGl0bGU6ICcnLFxuICAgIGRlbGF5OiAwLFxuICAgIGh0bWw6IGZhbHNlLFxuICAgIHNlbGVjdG9yOiBmYWxzZSxcbiAgICBwbGFjZW1lbnQ6ICd0b3AnLFxuICAgIG9mZnNldDogMCxcbiAgICBjb250YWluZXI6IGZhbHNlLFxuICAgIGZhbGxiYWNrUGxhY2VtZW50OiAnZmxpcCcsXG4gICAgYm91bmRhcnk6ICdzY3JvbGxQYXJlbnQnLFxuICAgIHNhbml0aXplOiB0cnVlLFxuICAgIHNhbml0aXplRm46IG51bGwsXG4gICAgd2hpdGVMaXN0OiBEZWZhdWx0V2hpdGVsaXN0LFxuICAgIHBvcHBlckNvbmZpZzogbnVsbFxuICB9O1xuICB2YXIgSE9WRVJfU1RBVEVfU0hPVyA9ICdzaG93JztcbiAgdmFyIEhPVkVSX1NUQVRFX09VVCA9ICdvdXQnO1xuICB2YXIgRXZlbnQgPSB7XG4gICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVkkNixcbiAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVkkNixcbiAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSQ2LFxuICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVkkNixcbiAgICBJTlNFUlRFRDogXCJpbnNlcnRlZFwiICsgRVZFTlRfS0VZJDYsXG4gICAgQ0xJQ0s6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQ2LFxuICAgIEZPQ1VTSU46IFwiZm9jdXNpblwiICsgRVZFTlRfS0VZJDYsXG4gICAgRk9DVVNPVVQ6IFwiZm9jdXNvdXRcIiArIEVWRU5UX0tFWSQ2LFxuICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZJDYsXG4gICAgTU9VU0VMRUFWRTogXCJtb3VzZWxlYXZlXCIgKyBFVkVOVF9LRVkkNlxuICB9O1xuICB2YXIgQ0xBU1NfTkFNRV9GQURFJDIgPSAnZmFkZSc7XG4gIHZhciBDTEFTU19OQU1FX1NIT1ckNCA9ICdzaG93JztcbiAgdmFyIFNFTEVDVE9SX1RPT0xUSVBfSU5ORVIgPSAnLnRvb2x0aXAtaW5uZXInO1xuICB2YXIgU0VMRUNUT1JfQVJST1cgPSAnLmFycm93JztcbiAgdmFyIFRSSUdHRVJfSE9WRVIgPSAnaG92ZXInO1xuICB2YXIgVFJJR0dFUl9GT0NVUyA9ICdmb2N1cyc7XG4gIHZhciBUUklHR0VSX0NMSUNLID0gJ2NsaWNrJztcbiAgdmFyIFRSSUdHRVJfTUFOVUFMID0gJ21hbnVhbCc7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIFRvb2x0aXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRvb2x0aXAoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICBpZiAodHlwZW9mIFBvcHBlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyB0b29sdGlwcyByZXF1aXJlIFBvcHBlci5qcyAoaHR0cHM6Ly9wb3BwZXIuanMub3JnLyknKTtcbiAgICAgIH0gLy8gcHJpdmF0ZVxuXG5cbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLl90aW1lb3V0ID0gMDtcbiAgICAgIHRoaXMuX2hvdmVyU3RhdGUgPSAnJztcbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSB7fTtcbiAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7IC8vIFByb3RlY3RlZFxuXG4gICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMudGlwID0gbnVsbDtcblxuICAgICAgdGhpcy5fc2V0TGlzdGVuZXJzKCk7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBUb29sdGlwLnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by5lbmFibGUgPSBmdW5jdGlvbiBlbmFibGUoKSB7XG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnRvZ2dsZUVuYWJsZWQgPSBmdW5jdGlvbiB0b2dnbGVFbmFibGVkKCkge1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gIXRoaXMuX2lzRW5hYmxlZDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZShldmVudCkge1xuICAgICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGRhdGFLZXkgPSB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZO1xuICAgICAgICB2YXIgY29udGV4dCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5KTtcblxuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZXZlbnQuY3VycmVudFRhcmdldCwgdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSk7XG4gICAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlci5jbGljayA9ICFjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyLmNsaWNrO1xuXG4gICAgICAgIGlmIChjb250ZXh0Ll9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgICBjb250ZXh0Ll9lbnRlcihudWxsLCBjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZShudWxsLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCQodGhpcy5nZXRUaXBFbGVtZW50KCkpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQ0KSkge1xuICAgICAgICAgIHRoaXMuX2xlYXZlKG51bGwsIHRoaXMpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZW50ZXIobnVsbCwgdGhpcyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgICQucmVtb3ZlRGF0YSh0aGlzLmVsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpO1xuICAgICAgJCh0aGlzLmVsZW1lbnQpLm9mZih0aGlzLmNvbnN0cnVjdG9yLkVWRU5UX0tFWSk7XG4gICAgICAkKHRoaXMuZWxlbWVudCkuY2xvc2VzdCgnLm1vZGFsJykub2ZmKCdoaWRlLmJzLm1vZGFsJywgdGhpcy5faGlkZU1vZGFsSGFuZGxlcik7XG5cbiAgICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgICAkKHRoaXMudGlwKS5yZW1vdmUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNFbmFibGVkID0gbnVsbDtcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgICAgdGhpcy5faG92ZXJTdGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyID0gbnVsbDtcblxuICAgICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9wb3BwZXIgPSBudWxsO1xuICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuY29uZmlnID0gbnVsbDtcbiAgICAgIHRoaXMudGlwID0gbnVsbDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCQodGhpcy5lbGVtZW50KS5jc3MoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3dFdmVudCA9ICQuRXZlbnQodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5TSE9XKTtcblxuICAgICAgaWYgKHRoaXMuaXNXaXRoQ29udGVudCgpICYmIHRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgICAkKHRoaXMuZWxlbWVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuICAgICAgICB2YXIgc2hhZG93Um9vdCA9IFV0aWwuZmluZFNoYWRvd1Jvb3QodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdmFyIGlzSW5UaGVEb20gPSAkLmNvbnRhaW5zKHNoYWRvd1Jvb3QgIT09IG51bGwgPyBzaGFkb3dSb290IDogdGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgIWlzSW5UaGVEb20pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICAgIHZhciB0aXBJZCA9IFV0aWwuZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSk7XG4gICAgICAgIHRpcC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGlwSWQpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGlwSWQpO1xuICAgICAgICB0aGlzLnNldENvbnRlbnQoKTtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgJCh0aXApLmFkZENsYXNzKENMQVNTX05BTUVfRkFERSQyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwbGFjZW1lbnQgPSB0eXBlb2YgdGhpcy5jb25maWcucGxhY2VtZW50ID09PSAnZnVuY3Rpb24nID8gdGhpcy5jb25maWcucGxhY2VtZW50LmNhbGwodGhpcywgdGlwLCB0aGlzLmVsZW1lbnQpIDogdGhpcy5jb25maWcucGxhY2VtZW50O1xuXG4gICAgICAgIHZhciBhdHRhY2htZW50ID0gdGhpcy5fZ2V0QXR0YWNobWVudChwbGFjZW1lbnQpO1xuXG4gICAgICAgIHRoaXMuYWRkQXR0YWNobWVudENsYXNzKGF0dGFjaG1lbnQpO1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9nZXRDb250YWluZXIoKTtcblxuICAgICAgICAkKHRpcCkuZGF0YSh0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLCB0aGlzKTtcblxuICAgICAgICBpZiAoISQuY29udGFpbnModGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLnRpcCkpIHtcbiAgICAgICAgICAkKHRpcCkuYXBwZW5kVG8oY29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5lbGVtZW50KS50cmlnZ2VyKHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSU5TRVJURUQpO1xuICAgICAgICB0aGlzLl9wb3BwZXIgPSBuZXcgUG9wcGVyKHRoaXMuZWxlbWVudCwgdGlwLCB0aGlzLl9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkpO1xuICAgICAgICAkKHRpcCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDQpOyAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuXG4gICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAkKGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub24oJ21vdXNlb3ZlcicsIG51bGwsICQubm9vcCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBpZiAoX3RoaXMuY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgICAgICAgX3RoaXMuX2ZpeFRyYW5zaXRpb24oKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcHJldkhvdmVyU3RhdGUgPSBfdGhpcy5faG92ZXJTdGF0ZTtcbiAgICAgICAgICBfdGhpcy5faG92ZXJTdGF0ZSA9IG51bGw7XG4gICAgICAgICAgJChfdGhpcy5lbGVtZW50KS50cmlnZ2VyKF90aGlzLmNvbnN0cnVjdG9yLkV2ZW50LlNIT1dOKTtcblxuICAgICAgICAgIGlmIChwcmV2SG92ZXJTdGF0ZSA9PT0gSE9WRVJfU1RBVEVfT1VUKSB7XG4gICAgICAgICAgICBfdGhpcy5fbGVhdmUobnVsbCwgX3RoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoJCh0aGlzLnRpcCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDIpKSB7XG4gICAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy50aXApO1xuICAgICAgICAgICQodGhpcy50aXApLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZShjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciB0aXAgPSB0aGlzLmdldFRpcEVsZW1lbnQoKTtcbiAgICAgIHZhciBoaWRlRXZlbnQgPSAkLkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSElERSk7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoX3RoaXMyLl9ob3ZlclN0YXRlICE9PSBIT1ZFUl9TVEFURV9TSE9XICYmIHRpcC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgdGlwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGlwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMi5fY2xlYW5UaXBDbGFzcygpO1xuXG4gICAgICAgIF90aGlzMi5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpO1xuXG4gICAgICAgICQoX3RoaXMyLmVsZW1lbnQpLnRyaWdnZXIoX3RoaXMyLmNvbnN0cnVjdG9yLkV2ZW50LkhJRERFTik7XG5cbiAgICAgICAgaWYgKF90aGlzMi5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgX3RoaXMyLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgJCh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoaGlkZUV2ZW50KTtcblxuICAgICAgaWYgKGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgICQodGlwKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1ckNCk7IC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHdlIGFkZGVkIGZvciBpT1Mgc3VwcG9ydFxuXG4gICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICQoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vZmYoJ21vdXNlb3ZlcicsIG51bGwsICQubm9vcCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9DTElDS10gPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9IT1ZFUl0gPSBmYWxzZTtcblxuICAgICAgaWYgKCQodGhpcy50aXApLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQyKSkge1xuICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aXApO1xuICAgICAgICAkKHRpcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faG92ZXJTdGF0ZSA9ICcnO1xuICAgIH07XG5cbiAgICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9IC8vIFByb3RlY3RlZFxuICAgIDtcblxuICAgIF9wcm90by5pc1dpdGhDb250ZW50ID0gZnVuY3Rpb24gaXNXaXRoQ29udGVudCgpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgfTtcblxuICAgIF9wcm90by5hZGRBdHRhY2htZW50Q2xhc3MgPSBmdW5jdGlvbiBhZGRBdHRhY2htZW50Q2xhc3MoYXR0YWNobWVudCkge1xuICAgICAgJCh0aGlzLmdldFRpcEVsZW1lbnQoKSkuYWRkQ2xhc3MoQ0xBU1NfUFJFRklYICsgXCItXCIgKyBhdHRhY2htZW50KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmdldFRpcEVsZW1lbnQgPSBmdW5jdGlvbiBnZXRUaXBFbGVtZW50KCkge1xuICAgICAgdGhpcy50aXAgPSB0aGlzLnRpcCB8fCAkKHRoaXMuY29uZmlnLnRlbXBsYXRlKVswXTtcbiAgICAgIHJldHVybiB0aGlzLnRpcDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNldENvbnRlbnQgPSBmdW5jdGlvbiBzZXRDb250ZW50KCkge1xuICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgdGhpcy5zZXRFbGVtZW50Q29udGVudCgkKHRpcC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX1RPT0xUSVBfSU5ORVIpKSwgdGhpcy5nZXRUaXRsZSgpKTtcbiAgICAgICQodGlwKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0ZBREUkMiArIFwiIFwiICsgQ0xBU1NfTkFNRV9TSE9XJDQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2V0RWxlbWVudENvbnRlbnQgPSBmdW5jdGlvbiBzZXRFbGVtZW50Q29udGVudCgkZWxlbWVudCwgY29udGVudCkge1xuICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnb2JqZWN0JyAmJiAoY29udGVudC5ub2RlVHlwZSB8fCBjb250ZW50LmpxdWVyeSkpIHtcbiAgICAgICAgLy8gQ29udGVudCBpcyBhIERPTSBub2RlIG9yIGEgalF1ZXJ5XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5odG1sKSB7XG4gICAgICAgICAgaWYgKCEkKGNvbnRlbnQpLnBhcmVudCgpLmlzKCRlbGVtZW50KSkge1xuICAgICAgICAgICAgJGVsZW1lbnQuZW1wdHkoKS5hcHBlbmQoY29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRlbGVtZW50LnRleHQoJChjb250ZW50KS50ZXh0KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25maWcuaHRtbCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuc2FuaXRpemUpIHtcbiAgICAgICAgICBjb250ZW50ID0gc2FuaXRpemVIdG1sKGNvbnRlbnQsIHRoaXMuY29uZmlnLndoaXRlTGlzdCwgdGhpcy5jb25maWcuc2FuaXRpemVGbik7XG4gICAgICAgIH1cblxuICAgICAgICAkZWxlbWVudC5odG1sKGNvbnRlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGVsZW1lbnQudGV4dChjb250ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmdldFRpdGxlID0gZnVuY3Rpb24gZ2V0VGl0bGUoKSB7XG4gICAgICB2YXIgdGl0bGUgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsLXRpdGxlJyk7XG5cbiAgICAgIGlmICghdGl0bGUpIHtcbiAgICAgICAgdGl0bGUgPSB0eXBlb2YgdGhpcy5jb25maWcudGl0bGUgPT09ICdmdW5jdGlvbicgPyB0aGlzLmNvbmZpZy50aXRsZS5jYWxsKHRoaXMuZWxlbWVudCkgOiB0aGlzLmNvbmZpZy50aXRsZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRpdGxlO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0UG9wcGVyQ29uZmlnID0gZnVuY3Rpb24gX2dldFBvcHBlckNvbmZpZyhhdHRhY2htZW50KSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIGRlZmF1bHRCc0NvbmZpZyA9IHtcbiAgICAgICAgcGxhY2VtZW50OiBhdHRhY2htZW50LFxuICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpLFxuICAgICAgICAgIGZsaXA6IHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiB0aGlzLmNvbmZpZy5mYWxsYmFja1BsYWNlbWVudFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXJyb3c6IHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IFNFTEVDVE9SX0FSUk9XXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcmV2ZW50T3ZlcmZsb3c6IHtcbiAgICAgICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiB0aGlzLmNvbmZpZy5ib3VuZGFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25DcmVhdGU6IGZ1bmN0aW9uIG9uQ3JlYXRlKGRhdGEpIHtcbiAgICAgICAgICBpZiAoZGF0YS5vcmlnaW5hbFBsYWNlbWVudCAhPT0gZGF0YS5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIF90aGlzMy5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25VcGRhdGU6IGZ1bmN0aW9uIG9uVXBkYXRlKGRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGRlZmF1bHRCc0NvbmZpZyksIHRoaXMuY29uZmlnLnBvcHBlckNvbmZpZyk7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0T2Zmc2V0ID0gZnVuY3Rpb24gX2dldE9mZnNldCgpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICB2YXIgb2Zmc2V0ID0ge307XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcub2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9mZnNldC5mbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgZGF0YS5vZmZzZXRzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGRhdGEub2Zmc2V0cyksIF90aGlzNC5jb25maWcub2Zmc2V0KGRhdGEub2Zmc2V0cywgX3RoaXM0LmVsZW1lbnQpIHx8IHt9KTtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZnNldC5vZmZzZXQgPSB0aGlzLmNvbmZpZy5vZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0Q29udGFpbmVyID0gZnVuY3Rpb24gX2dldENvbnRhaW5lcigpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5jb250YWluZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICAgICAgfVxuXG4gICAgICBpZiAoVXRpbC5pc0VsZW1lbnQodGhpcy5jb25maWcuY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm4gJCh0aGlzLmNvbmZpZy5jb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJChkb2N1bWVudCkuZmluZCh0aGlzLmNvbmZpZy5jb250YWluZXIpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldEF0dGFjaG1lbnQgPSBmdW5jdGlvbiBfZ2V0QXR0YWNobWVudChwbGFjZW1lbnQpIHtcbiAgICAgIHJldHVybiBBdHRhY2htZW50TWFwW3BsYWNlbWVudC50b1VwcGVyQ2FzZSgpXTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zZXRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfc2V0TGlzdGVuZXJzKCkge1xuICAgICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICAgIHZhciB0cmlnZ2VycyA9IHRoaXMuY29uZmlnLnRyaWdnZXIuc3BsaXQoJyAnKTtcbiAgICAgIHRyaWdnZXJzLmZvckVhY2goZnVuY3Rpb24gKHRyaWdnZXIpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdjbGljaycpIHtcbiAgICAgICAgICAkKF90aGlzNS5lbGVtZW50KS5vbihfdGhpczUuY29uc3RydWN0b3IuRXZlbnQuQ0xJQ0ssIF90aGlzNS5jb25maWcuc2VsZWN0b3IsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzNS50b2dnbGUoZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXIgIT09IFRSSUdHRVJfTUFOVUFMKSB7XG4gICAgICAgICAgdmFyIGV2ZW50SW4gPSB0cmlnZ2VyID09PSBUUklHR0VSX0hPVkVSID8gX3RoaXM1LmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFRU5URVIgOiBfdGhpczUuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNJTjtcbiAgICAgICAgICB2YXIgZXZlbnRPdXQgPSB0cmlnZ2VyID09PSBUUklHR0VSX0hPVkVSID8gX3RoaXM1LmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFTEVBVkUgOiBfdGhpczUuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNPVVQ7XG4gICAgICAgICAgJChfdGhpczUuZWxlbWVudCkub24oZXZlbnRJbiwgX3RoaXM1LmNvbmZpZy5zZWxlY3RvciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM1Ll9lbnRlcihldmVudCk7XG4gICAgICAgICAgfSkub24oZXZlbnRPdXQsIF90aGlzNS5jb25maWcuc2VsZWN0b3IsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzNS5fbGVhdmUoZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzNS5lbGVtZW50KSB7XG4gICAgICAgICAgX3RoaXM1LmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgJCh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoJy5tb2RhbCcpLm9uKCdoaWRlLmJzLm1vZGFsJywgdGhpcy5faGlkZU1vZGFsSGFuZGxlcik7XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zZWxlY3Rvcikge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCB0aGlzLmNvbmZpZyksIHt9LCB7XG4gICAgICAgICAgdHJpZ2dlcjogJ21hbnVhbCcsXG4gICAgICAgICAgc2VsZWN0b3I6ICcnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZml4VGl0bGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9maXhUaXRsZSA9IGZ1bmN0aW9uIF9maXhUaXRsZSgpIHtcbiAgICAgIHZhciB0aXRsZVR5cGUgPSB0eXBlb2YgdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW5hbC10aXRsZScpO1xuXG4gICAgICBpZiAodGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgndGl0bGUnKSB8fCB0aXRsZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnLCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpIHx8ICcnKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fZW50ZXIgPSBmdW5jdGlvbiBfZW50ZXIoZXZlbnQsIGNvbnRleHQpIHtcbiAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5KTtcblxuICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNpbicgPyBUUklHR0VSX0ZPQ1VTIDogVFJJR0dFUl9IT1ZFUl0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoJChjb250ZXh0LmdldFRpcEVsZW1lbnQoKSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDQpIHx8IGNvbnRleHQuX2hvdmVyU3RhdGUgPT09IEhPVkVSX1NUQVRFX1NIT1cpIHtcbiAgICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhPVkVSX1NUQVRFX1NIT1c7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2xlYXJUaW1lb3V0KGNvbnRleHQuX3RpbWVvdXQpO1xuICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhPVkVSX1NUQVRFX1NIT1c7XG5cbiAgICAgIGlmICghY29udGV4dC5jb25maWcuZGVsYXkgfHwgIWNvbnRleHQuY29uZmlnLmRlbGF5LnNob3cpIHtcbiAgICAgICAgY29udGV4dC5zaG93KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGV4dC5faG92ZXJTdGF0ZSA9PT0gSE9WRVJfU1RBVEVfU0hPVykge1xuICAgICAgICAgIGNvbnRleHQuc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9LCBjb250ZXh0LmNvbmZpZy5kZWxheS5zaG93KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9sZWF2ZSA9IGZ1bmN0aW9uIF9sZWF2ZShldmVudCwgY29udGV4dCkge1xuICAgICAgdmFyIGRhdGFLZXkgPSB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZO1xuICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXkpO1xuXG4gICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGV2ZW50LmN1cnJlbnRUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpO1xuICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c291dCcgPyBUUklHR0VSX0ZPQ1VTIDogVFJJR0dFUl9IT1ZFUl0gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRleHQuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNsZWFyVGltZW91dChjb250ZXh0Ll90aW1lb3V0KTtcbiAgICAgIGNvbnRleHQuX2hvdmVyU3RhdGUgPSBIT1ZFUl9TVEFURV9PVVQ7XG5cbiAgICAgIGlmICghY29udGV4dC5jb25maWcuZGVsYXkgfHwgIWNvbnRleHQuY29uZmlnLmRlbGF5LmhpZGUpIHtcbiAgICAgICAgY29udGV4dC5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGV4dC5faG92ZXJTdGF0ZSA9PT0gSE9WRVJfU1RBVEVfT1VUKSB7XG4gICAgICAgICAgY29udGV4dC5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQuY29uZmlnLmRlbGF5LmhpZGUpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2lzV2l0aEFjdGl2ZVRyaWdnZXIgPSBmdW5jdGlvbiBfaXNXaXRoQWN0aXZlVHJpZ2dlcigpIHtcbiAgICAgIGZvciAodmFyIHRyaWdnZXIgaW4gdGhpcy5fYWN0aXZlVHJpZ2dlcikge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlVHJpZ2dlclt0cmlnZ2VyXSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgdmFyIGRhdGFBdHRyaWJ1dGVzID0gJCh0aGlzLmVsZW1lbnQpLmRhdGEoKTtcbiAgICAgIE9iamVjdC5rZXlzKGRhdGFBdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhQXR0cikge1xuICAgICAgICBpZiAoRElTQUxMT1dFRF9BVFRSSUJVVEVTLmluZGV4T2YoZGF0YUF0dHIpICE9PSAtMSkge1xuICAgICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cl07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uZmlnID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCksIGRhdGFBdHRyaWJ1dGVzKSwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uZmlnLmRlbGF5ID0ge1xuICAgICAgICAgIHNob3c6IGNvbmZpZy5kZWxheSxcbiAgICAgICAgICBoaWRlOiBjb25maWcuZGVsYXlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbmZpZy50aXRsZSA9IGNvbmZpZy50aXRsZS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5jb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25maWcuY29udGVudCA9IGNvbmZpZy5jb250ZW50LnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkNiwgY29uZmlnLCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKTtcblxuICAgICAgaWYgKGNvbmZpZy5zYW5pdGl6ZSkge1xuICAgICAgICBjb25maWcudGVtcGxhdGUgPSBzYW5pdGl6ZUh0bWwoY29uZmlnLnRlbXBsYXRlLCBjb25maWcud2hpdGVMaXN0LCBjb25maWcuc2FuaXRpemVGbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0RGVsZWdhdGVDb25maWcgPSBmdW5jdGlvbiBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgICB2YXIgY29uZmlnID0ge307XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jb25maWcpIHtcbiAgICAgICAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0W2tleV0gIT09IHRoaXMuY29uZmlnW2tleV0pIHtcbiAgICAgICAgICAgIGNvbmZpZ1trZXldID0gdGhpcy5jb25maWdba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9jbGVhblRpcENsYXNzID0gZnVuY3Rpb24gX2NsZWFuVGlwQ2xhc3MoKSB7XG4gICAgICB2YXIgJHRpcCA9ICQodGhpcy5nZXRUaXBFbGVtZW50KCkpO1xuICAgICAgdmFyIHRhYkNsYXNzID0gJHRpcC5hdHRyKCdjbGFzcycpLm1hdGNoKEJTQ0xTX1BSRUZJWF9SRUdFWCk7XG5cbiAgICAgIGlmICh0YWJDbGFzcyAhPT0gbnVsbCAmJiB0YWJDbGFzcy5sZW5ndGgpIHtcbiAgICAgICAgJHRpcC5yZW1vdmVDbGFzcyh0YWJDbGFzcy5qb2luKCcnKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlID0gZnVuY3Rpb24gX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShwb3BwZXJEYXRhKSB7XG4gICAgICB0aGlzLnRpcCA9IHBvcHBlckRhdGEuaW5zdGFuY2UucG9wcGVyO1xuXG4gICAgICB0aGlzLl9jbGVhblRpcENsYXNzKCk7XG5cbiAgICAgIHRoaXMuYWRkQXR0YWNobWVudENsYXNzKHRoaXMuX2dldEF0dGFjaG1lbnQocG9wcGVyRGF0YS5wbGFjZW1lbnQpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9maXhUcmFuc2l0aW9uID0gZnVuY3Rpb24gX2ZpeFRyYW5zaXRpb24oKSB7XG4gICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICB2YXIgaW5pdENvbmZpZ0FuaW1hdGlvbiA9IHRoaXMuY29uZmlnLmFuaW1hdGlvbjtcblxuICAgICAgaWYgKHRpcC5nZXRBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50JykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkKHRpcCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDIpO1xuICAgICAgdGhpcy5jb25maWcuYW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgdGhpcy5jb25maWcuYW5pbWF0aW9uID0gaW5pdENvbmZpZ0FuaW1hdGlvbjtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIFRvb2x0aXAuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoREFUQV9LRVkkNik7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWc7XG5cbiAgICAgICAgaWYgKCFkYXRhICYmIC9kaXNwb3NlfGhpZGUvLnRlc3QoY29uZmlnKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgVG9vbHRpcCh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoREFUQV9LRVkkNiwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFRvb2x0aXAsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDY7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQ0O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJOQU1FXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE5BTUUkNjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiREFUQV9LRVlcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gREFUQV9LRVkkNjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRXZlbnRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRXZlbnQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkVWRU5UX0tFWVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFVkVOVF9LRVkkNjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFR5cGVcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGUkNDtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVG9vbHRpcDtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkLmZuW05BTUUkNl0gPSBUb29sdGlwLl9qUXVlcnlJbnRlcmZhY2U7XG4gICQuZm5bTkFNRSQ2XS5Db25zdHJ1Y3RvciA9IFRvb2x0aXA7XG5cbiAgJC5mbltOQU1FJDZdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbltOQU1FJDZdID0gSlFVRVJZX05PX0NPTkZMSUNUJDY7XG4gICAgcmV0dXJuIFRvb2x0aXAuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkNyA9ICdwb3BvdmVyJztcbiAgdmFyIFZFUlNJT04kNyA9ICc0LjUuMCc7XG4gIHZhciBEQVRBX0tFWSQ3ID0gJ2JzLnBvcG92ZXInO1xuICB2YXIgRVZFTlRfS0VZJDcgPSBcIi5cIiArIERBVEFfS0VZJDc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkNyA9ICQuZm5bTkFNRSQ3XTtcbiAgdmFyIENMQVNTX1BSRUZJWCQxID0gJ2JzLXBvcG92ZXInO1xuICB2YXIgQlNDTFNfUFJFRklYX1JFR0VYJDEgPSBuZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIgKyBDTEFTU19QUkVGSVgkMSArIFwiXFxcXFMrXCIsICdnJyk7XG5cbiAgdmFyIERlZmF1bHQkNSA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBUb29sdGlwLkRlZmF1bHQpLCB7fSwge1xuICAgIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgICB0cmlnZ2VyOiAnY2xpY2snLFxuICAgIGNvbnRlbnQ6ICcnLFxuICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInBvcG92ZXJcIiByb2xlPVwidG9vbHRpcFwiPicgKyAnPGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+JyArICc8aDMgY2xhc3M9XCJwb3BvdmVyLWhlYWRlclwiPjwvaDM+JyArICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1ib2R5XCI+PC9kaXY+PC9kaXY+J1xuICB9KTtcblxuICB2YXIgRGVmYXVsdFR5cGUkNSA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBUb29sdGlwLkRlZmF1bHRUeXBlKSwge30sIHtcbiAgICBjb250ZW50OiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSdcbiAgfSk7XG5cbiAgdmFyIENMQVNTX05BTUVfRkFERSQzID0gJ2ZhZGUnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDUgPSAnc2hvdyc7XG4gIHZhciBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInO1xuICB2YXIgU0VMRUNUT1JfQ09OVEVOVCA9ICcucG9wb3Zlci1ib2R5JztcbiAgdmFyIEV2ZW50JDEgPSB7XG4gICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVkkNyxcbiAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVkkNyxcbiAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSQ3LFxuICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVkkNyxcbiAgICBJTlNFUlRFRDogXCJpbnNlcnRlZFwiICsgRVZFTlRfS0VZJDcsXG4gICAgQ0xJQ0s6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQ3LFxuICAgIEZPQ1VTSU46IFwiZm9jdXNpblwiICsgRVZFTlRfS0VZJDcsXG4gICAgRk9DVVNPVVQ6IFwiZm9jdXNvdXRcIiArIEVWRU5UX0tFWSQ3LFxuICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZJDcsXG4gICAgTU9VU0VMRUFWRTogXCJtb3VzZWxlYXZlXCIgKyBFVkVOVF9LRVkkN1xuICB9O1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBQb3BvdmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfVG9vbHRpcCkge1xuICAgIF9pbmhlcml0c0xvb3NlKFBvcG92ZXIsIF9Ub29sdGlwKTtcblxuICAgIGZ1bmN0aW9uIFBvcG92ZXIoKSB7XG4gICAgICByZXR1cm4gX1Rvb2x0aXAuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBQb3BvdmVyLnByb3RvdHlwZTtcblxuICAgIC8vIE92ZXJyaWRlc1xuICAgIF9wcm90by5pc1dpdGhDb250ZW50ID0gZnVuY3Rpb24gaXNXaXRoQ29udGVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRpdGxlKCkgfHwgdGhpcy5fZ2V0Q29udGVudCgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uYWRkQXR0YWNobWVudENsYXNzID0gZnVuY3Rpb24gYWRkQXR0YWNobWVudENsYXNzKGF0dGFjaG1lbnQpIHtcbiAgICAgICQodGhpcy5nZXRUaXBFbGVtZW50KCkpLmFkZENsYXNzKENMQVNTX1BSRUZJWCQxICsgXCItXCIgKyBhdHRhY2htZW50KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmdldFRpcEVsZW1lbnQgPSBmdW5jdGlvbiBnZXRUaXBFbGVtZW50KCkge1xuICAgICAgdGhpcy50aXAgPSB0aGlzLnRpcCB8fCAkKHRoaXMuY29uZmlnLnRlbXBsYXRlKVswXTtcbiAgICAgIHJldHVybiB0aGlzLnRpcDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNldENvbnRlbnQgPSBmdW5jdGlvbiBzZXRDb250ZW50KCkge1xuICAgICAgdmFyICR0aXAgPSAkKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTsgLy8gV2UgdXNlIGFwcGVuZCBmb3IgaHRtbCBvYmplY3RzIHRvIG1haW50YWluIGpzIGV2ZW50c1xuXG4gICAgICB0aGlzLnNldEVsZW1lbnRDb250ZW50KCR0aXAuZmluZChTRUxFQ1RPUl9USVRMRSksIHRoaXMuZ2V0VGl0bGUoKSk7XG5cbiAgICAgIHZhciBjb250ZW50ID0gdGhpcy5fZ2V0Q29udGVudCgpO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuY2FsbCh0aGlzLmVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldEVsZW1lbnRDb250ZW50KCR0aXAuZmluZChTRUxFQ1RPUl9DT05URU5UKSwgY29udGVudCk7XG4gICAgICAkdGlwLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfRkFERSQzICsgXCIgXCIgKyBDTEFTU19OQU1FX1NIT1ckNSk7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRDb250ZW50ID0gZnVuY3Rpb24gX2dldENvbnRlbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jb250ZW50JykgfHwgdGhpcy5jb25maWcuY29udGVudDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9jbGVhblRpcENsYXNzID0gZnVuY3Rpb24gX2NsZWFuVGlwQ2xhc3MoKSB7XG4gICAgICB2YXIgJHRpcCA9ICQodGhpcy5nZXRUaXBFbGVtZW50KCkpO1xuICAgICAgdmFyIHRhYkNsYXNzID0gJHRpcC5hdHRyKCdjbGFzcycpLm1hdGNoKEJTQ0xTX1BSRUZJWF9SRUdFWCQxKTtcblxuICAgICAgaWYgKHRhYkNsYXNzICE9PSBudWxsICYmIHRhYkNsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgJHRpcC5yZW1vdmVDbGFzcyh0YWJDbGFzcy5qb2luKCcnKSk7XG4gICAgICB9XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBQb3BvdmVyLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRhID0gJCh0aGlzKS5kYXRhKERBVEFfS0VZJDcpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiBudWxsO1xuXG4gICAgICAgIGlmICghZGF0YSAmJiAvZGlzcG9zZXxoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IFBvcG92ZXIodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJCh0aGlzKS5kYXRhKERBVEFfS0VZJDcsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhQb3BvdmVyLCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIC8vIEdldHRlcnNcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiQ3O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQkNTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiTkFNRVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBOQU1FJDc7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRBVEFfS0VZXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERBVEFfS0VZJDc7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkV2ZW50XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50JDE7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkVWRU5UX0tFWVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFVkVOVF9LRVkkNztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFR5cGVcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGUkNTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gUG9wb3ZlcjtcbiAgfShUb29sdGlwKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJC5mbltOQU1FJDddID0gUG9wb3Zlci5falF1ZXJ5SW50ZXJmYWNlO1xuICAkLmZuW05BTUUkN10uQ29uc3RydWN0b3IgPSBQb3BvdmVyO1xuXG4gICQuZm5bTkFNRSQ3XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm5bTkFNRSQ3XSA9IEpRVUVSWV9OT19DT05GTElDVCQ3O1xuICAgIHJldHVybiBQb3BvdmVyLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBOQU1FJDggPSAnc2Nyb2xsc3B5JztcbiAgdmFyIFZFUlNJT04kOCA9ICc0LjUuMCc7XG4gIHZhciBEQVRBX0tFWSQ4ID0gJ2JzLnNjcm9sbHNweSc7XG4gIHZhciBFVkVOVF9LRVkkOCA9IFwiLlwiICsgREFUQV9LRVkkODtcbiAgdmFyIERBVEFfQVBJX0tFWSQ2ID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkOCA9ICQuZm5bTkFNRSQ4XTtcbiAgdmFyIERlZmF1bHQkNiA9IHtcbiAgICBvZmZzZXQ6IDEwLFxuICAgIG1ldGhvZDogJ2F1dG8nLFxuICAgIHRhcmdldDogJydcbiAgfTtcbiAgdmFyIERlZmF1bHRUeXBlJDYgPSB7XG4gICAgb2Zmc2V0OiAnbnVtYmVyJyxcbiAgICBtZXRob2Q6ICdzdHJpbmcnLFxuICAgIHRhcmdldDogJyhzdHJpbmd8ZWxlbWVudCknXG4gIH07XG4gIHZhciBFVkVOVF9BQ1RJVkFURSA9IFwiYWN0aXZhdGVcIiArIEVWRU5UX0tFWSQ4O1xuICB2YXIgRVZFTlRfU0NST0xMID0gXCJzY3JvbGxcIiArIEVWRU5UX0tFWSQ4O1xuICB2YXIgRVZFTlRfTE9BRF9EQVRBX0FQSSQyID0gXCJsb2FkXCIgKyBFVkVOVF9LRVkkOCArIERBVEFfQVBJX0tFWSQ2O1xuICB2YXIgQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNID0gJ2Ryb3Bkb3duLWl0ZW0nO1xuICB2YXIgQ0xBU1NfTkFNRV9BQ1RJVkUkMiA9ICdhY3RpdmUnO1xuICB2YXIgU0VMRUNUT1JfREFUQV9TUFkgPSAnW2RhdGEtc3B5PVwic2Nyb2xsXCJdJztcbiAgdmFyIFNFTEVDVE9SX05BVl9MSVNUX0dST1VQID0gJy5uYXYsIC5saXN0LWdyb3VwJztcbiAgdmFyIFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnO1xuICB2YXIgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSc7XG4gIHZhciBTRUxFQ1RPUl9MSVNUX0lURU1TID0gJy5saXN0LWdyb3VwLWl0ZW0nO1xuICB2YXIgU0VMRUNUT1JfRFJPUERPV04gPSAnLmRyb3Bkb3duJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX0lURU1TID0gJy5kcm9wZG93bi1pdGVtJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJztcbiAgdmFyIE1FVEhPRF9PRkZTRVQgPSAnb2Zmc2V0JztcbiAgdmFyIE1FVEhPRF9QT1NJVElPTiA9ICdwb3NpdGlvbic7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIFNjcm9sbFNweSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2Nyb2xsU3B5KGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9zY3JvbGxFbGVtZW50ID0gZWxlbWVudC50YWdOYW1lID09PSAnQk9EWScgPyB3aW5kb3cgOiBlbGVtZW50O1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9zZWxlY3RvciA9IHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNFTEVDVE9SX05BVl9MSU5LUyArIFwiLFwiICsgKHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNFTEVDVE9SX0xJU1RfSVRFTVMgKyBcIixcIikgKyAodGhpcy5fY29uZmlnLnRhcmdldCArIFwiIFwiICsgU0VMRUNUT1JfRFJPUERPV05fSVRFTVMpO1xuICAgICAgdGhpcy5fb2Zmc2V0cyA9IFtdO1xuICAgICAgdGhpcy5fdGFyZ2V0cyA9IFtdO1xuICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuX3Njcm9sbEhlaWdodCA9IDA7XG4gICAgICAkKHRoaXMuX3Njcm9sbEVsZW1lbnQpLm9uKEVWRU5UX1NDUk9MTCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5fcHJvY2VzcyhldmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuXG4gICAgICB0aGlzLl9wcm9jZXNzKCk7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBTY3JvbGxTcHkucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnJlZnJlc2ggPSBmdW5jdGlvbiByZWZyZXNoKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBhdXRvTWV0aG9kID0gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gdGhpcy5fc2Nyb2xsRWxlbWVudC53aW5kb3cgPyBNRVRIT0RfT0ZGU0VUIDogTUVUSE9EX1BPU0lUSU9OO1xuICAgICAgdmFyIG9mZnNldE1ldGhvZCA9IHRoaXMuX2NvbmZpZy5tZXRob2QgPT09ICdhdXRvJyA/IGF1dG9NZXRob2QgOiB0aGlzLl9jb25maWcubWV0aG9kO1xuICAgICAgdmFyIG9mZnNldEJhc2UgPSBvZmZzZXRNZXRob2QgPT09IE1FVEhPRF9QT1NJVElPTiA/IHRoaXMuX2dldFNjcm9sbFRvcCgpIDogMDtcbiAgICAgIHRoaXMuX29mZnNldHMgPSBbXTtcbiAgICAgIHRoaXMuX3RhcmdldHMgPSBbXTtcbiAgICAgIHRoaXMuX3Njcm9sbEhlaWdodCA9IHRoaXMuX2dldFNjcm9sbEhlaWdodCgpO1xuICAgICAgdmFyIHRhcmdldHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKTtcbiAgICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciB0YXJnZXQ7XG4gICAgICAgIHZhciB0YXJnZXRTZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICBpZiAodGFyZ2V0U2VsZWN0b3IpIHtcbiAgICAgICAgICB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldFNlbGVjdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICB2YXIgdGFyZ2V0QkNSID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgaWYgKHRhcmdldEJDUi53aWR0aCB8fCB0YXJnZXRCQ1IuaGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyBUT0RPIChmYXQpOiByZW1vdmUgc2tldGNoIHJlbGlhbmNlIG9uIGpRdWVyeSBwb3NpdGlvbi9vZmZzZXRcbiAgICAgICAgICAgIHJldHVybiBbJCh0YXJnZXQpW29mZnNldE1ldGhvZF0oKS50b3AgKyBvZmZzZXRCYXNlLCB0YXJnZXRTZWxlY3Rvcl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhWzBdIC0gYlswXTtcbiAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgX3RoaXMyLl9vZmZzZXRzLnB1c2goaXRlbVswXSk7XG5cbiAgICAgICAgX3RoaXMyLl90YXJnZXRzLnB1c2goaXRlbVsxXSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDgpO1xuICAgICAgJCh0aGlzLl9zY3JvbGxFbGVtZW50KS5vZmYoRVZFTlRfS0VZJDgpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9zY3JvbGxFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICB0aGlzLl9zZWxlY3RvciA9IG51bGw7XG4gICAgICB0aGlzLl9vZmZzZXRzID0gbnVsbDtcbiAgICAgIHRoaXMuX3RhcmdldHMgPSBudWxsO1xuICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuX3Njcm9sbEhlaWdodCA9IG51bGw7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERlZmF1bHQkNiksIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcudGFyZ2V0ICE9PSAnc3RyaW5nJyAmJiBVdGlsLmlzRWxlbWVudChjb25maWcudGFyZ2V0KSkge1xuICAgICAgICB2YXIgaWQgPSAkKGNvbmZpZy50YXJnZXQpLmF0dHIoJ2lkJyk7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgIGlkID0gVXRpbC5nZXRVSUQoTkFNRSQ4KTtcbiAgICAgICAgICAkKGNvbmZpZy50YXJnZXQpLmF0dHIoJ2lkJywgaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLnRhcmdldCA9IFwiI1wiICsgaWQ7XG4gICAgICB9XG5cbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkOCwgY29uZmlnLCBEZWZhdWx0VHlwZSQ2KTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gX2dldFNjcm9sbFRvcCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50ID09PSB3aW5kb3cgPyB0aGlzLl9zY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0IDogdGhpcy5fc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0U2Nyb2xsSGVpZ2h0ID0gZnVuY3Rpb24gX2dldFNjcm9sbEhlaWdodCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbEhlaWdodCB8fCBNYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCk7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0T2Zmc2V0SGVpZ2h0ID0gZnVuY3Rpb24gX2dldE9mZnNldEhlaWdodCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50ID09PSB3aW5kb3cgPyB3aW5kb3cuaW5uZXJIZWlnaHQgOiB0aGlzLl9zY3JvbGxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9wcm9jZXNzID0gZnVuY3Rpb24gX3Byb2Nlc3MoKSB7XG4gICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5fZ2V0U2Nyb2xsVG9wKCkgKyB0aGlzLl9jb25maWcub2Zmc2V0O1xuXG4gICAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5fZ2V0U2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgIHZhciBtYXhTY3JvbGwgPSB0aGlzLl9jb25maWcub2Zmc2V0ICsgc2Nyb2xsSGVpZ2h0IC0gdGhpcy5fZ2V0T2Zmc2V0SGVpZ2h0KCk7XG5cbiAgICAgIGlmICh0aGlzLl9zY3JvbGxIZWlnaHQgIT09IHNjcm9sbEhlaWdodCkge1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbFRvcCA+PSBtYXhTY3JvbGwpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlVGFyZ2V0ICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYWN0aXZlVGFyZ2V0ICYmIHNjcm9sbFRvcCA8IHRoaXMuX29mZnNldHNbMF0gJiYgdGhpcy5fb2Zmc2V0c1swXSA+IDApIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9jbGVhcigpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX29mZnNldHMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgIHZhciBpc0FjdGl2ZVRhcmdldCA9IHRoaXMuX2FjdGl2ZVRhcmdldCAhPT0gdGhpcy5fdGFyZ2V0c1tpXSAmJiBzY3JvbGxUb3AgPj0gdGhpcy5fb2Zmc2V0c1tpXSAmJiAodHlwZW9mIHRoaXMuX29mZnNldHNbaSArIDFdID09PSAndW5kZWZpbmVkJyB8fCBzY3JvbGxUb3AgPCB0aGlzLl9vZmZzZXRzW2kgKyAxXSk7XG5cbiAgICAgICAgaWYgKGlzQWN0aXZlVGFyZ2V0KSB7XG4gICAgICAgICAgdGhpcy5fYWN0aXZhdGUodGhpcy5fdGFyZ2V0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9hY3RpdmF0ZSA9IGZ1bmN0aW9uIF9hY3RpdmF0ZSh0YXJnZXQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldDtcblxuICAgICAgdGhpcy5fY2xlYXIoKTtcblxuICAgICAgdmFyIHF1ZXJpZXMgPSB0aGlzLl9zZWxlY3Rvci5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yICsgXCJbZGF0YS10YXJnZXQ9XFxcIlwiICsgdGFyZ2V0ICsgXCJcXFwiXSxcIiArIHNlbGVjdG9yICsgXCJbaHJlZj1cXFwiXCIgKyB0YXJnZXQgKyBcIlxcXCJdXCI7XG4gICAgICB9KTtcblxuICAgICAgdmFyICRsaW5rID0gJChbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcmllcy5qb2luKCcsJykpKSk7XG5cbiAgICAgIGlmICgkbGluay5oYXNDbGFzcyhDTEFTU19OQU1FX0RST1BET1dOX0lURU0pKSB7XG4gICAgICAgICRsaW5rLmNsb3Nlc3QoU0VMRUNUT1JfRFJPUERPV04pLmZpbmQoU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFKS5hZGRDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQyKTtcbiAgICAgICAgJGxpbmsuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmsgYXMgYWN0aXZlXG4gICAgICAgICRsaW5rLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDIpOyAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAgIC8vIFdpdGggYm90aCA8dWw+IGFuZCA8bmF2PiBtYXJrdXAgYSBwYXJlbnQgaXMgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2YgYW55IG5hdiBhbmNlc3RvclxuXG4gICAgICAgICRsaW5rLnBhcmVudHMoU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApLnByZXYoU0VMRUNUT1JfTkFWX0xJTktTICsgXCIsIFwiICsgU0VMRUNUT1JfTElTVF9JVEVNUykuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7IC8vIEhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlbiAubmF2LWxpbmsgaXMgaW5zaWRlIC5uYXYtaXRlbVxuXG4gICAgICAgICRsaW5rLnBhcmVudHMoU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApLnByZXYoU0VMRUNUT1JfTkFWX0lURU1TKS5jaGlsZHJlbihTRUxFQ1RPUl9OQVZfTElOS1MpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgfVxuXG4gICAgICAkKHRoaXMuX3Njcm9sbEVsZW1lbnQpLnRyaWdnZXIoRVZFTlRfQUNUSVZBVEUsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogdGFyZ2V0XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9jbGVhciA9IGZ1bmN0aW9uIF9jbGVhcigpIHtcbiAgICAgIFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9zZWxlY3RvcikpLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICB9KTtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIFNjcm9sbFNweS5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9ICQodGhpcykuZGF0YShEQVRBX0tFWSQ4KTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9IHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZztcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IFNjcm9sbFNweSh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoREFUQV9LRVkkOCwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFNjcm9sbFNweSwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kODtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0JDY7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFNjcm9sbFNweTtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICQod2luZG93KS5vbihFVkVOVF9MT0FEX0RBVEFfQVBJJDIsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2Nyb2xsU3B5cyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9EQVRBX1NQWSkpO1xuICAgIHZhciBzY3JvbGxTcHlzTGVuZ3RoID0gc2Nyb2xsU3B5cy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gc2Nyb2xsU3B5c0xlbmd0aDsgaS0tOykge1xuICAgICAgdmFyICRzcHkgPSAkKHNjcm9sbFNweXNbaV0pO1xuXG4gICAgICBTY3JvbGxTcHkuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRzcHksICRzcHkuZGF0YSgpKTtcbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJC5mbltOQU1FJDhdID0gU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2U7XG4gICQuZm5bTkFNRSQ4XS5Db25zdHJ1Y3RvciA9IFNjcm9sbFNweTtcblxuICAkLmZuW05BTUUkOF0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuW05BTUUkOF0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkODtcbiAgICByZXR1cm4gU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBOQU1FJDkgPSAndGFiJztcbiAgdmFyIFZFUlNJT04kOSA9ICc0LjUuMCc7XG4gIHZhciBEQVRBX0tFWSQ5ID0gJ2JzLnRhYic7XG4gIHZhciBFVkVOVF9LRVkkOSA9IFwiLlwiICsgREFUQV9LRVkkOTtcbiAgdmFyIERBVEFfQVBJX0tFWSQ3ID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkOSA9ICQuZm5bTkFNRSQ5XTtcbiAgdmFyIEVWRU5UX0hJREUkMyA9IFwiaGlkZVwiICsgRVZFTlRfS0VZJDk7XG4gIHZhciBFVkVOVF9ISURERU4kMyA9IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVkkOTtcbiAgdmFyIEVWRU5UX1NIT1ckMyA9IFwic2hvd1wiICsgRVZFTlRfS0VZJDk7XG4gIHZhciBFVkVOVF9TSE9XTiQzID0gXCJzaG93blwiICsgRVZFTlRfS0VZJDk7XG4gIHZhciBFVkVOVF9DTElDS19EQVRBX0FQSSQ2ID0gXCJjbGlja1wiICsgRVZFTlRfS0VZJDkgKyBEQVRBX0FQSV9LRVkkNztcbiAgdmFyIENMQVNTX05BTUVfRFJPUERPV05fTUVOVSA9ICdkcm9wZG93bi1tZW51JztcbiAgdmFyIENMQVNTX05BTUVfQUNUSVZFJDMgPSAnYWN0aXZlJztcbiAgdmFyIENMQVNTX05BTUVfRElTQUJMRUQkMSA9ICdkaXNhYmxlZCc7XG4gIHZhciBDTEFTU19OQU1FX0ZBREUkNCA9ICdmYWRlJztcbiAgdmFyIENMQVNTX05BTUVfU0hPVyQ2ID0gJ3Nob3cnO1xuICB2YXIgU0VMRUNUT1JfRFJPUERPV04kMSA9ICcuZHJvcGRvd24nO1xuICB2YXIgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVAkMSA9ICcubmF2LCAubGlzdC1ncm91cCc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkUkMiA9ICcuYWN0aXZlJztcbiAgdmFyIFNFTEVDVE9SX0FDVElWRV9VTCA9ICc+IGxpID4gLmFjdGl2ZSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ0ID0gJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXSwgW2RhdGEtdG9nZ2xlPVwicGlsbFwiXSwgW2RhdGEtdG9nZ2xlPVwibGlzdFwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUkMSA9ICcuZHJvcGRvd24tdG9nZ2xlJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX0FDVElWRV9DSElMRCA9ICc+IC5kcm9wZG93bi1tZW51IC5hY3RpdmUnO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUYWIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhYihlbGVtZW50KSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IFRhYi5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlICYmIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQzKSB8fCAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRElTQUJMRUQkMSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdGFyZ2V0O1xuICAgICAgdmFyIHByZXZpb3VzO1xuICAgICAgdmFyIGxpc3RFbGVtZW50ID0gJCh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KFNFTEVDVE9SX05BVl9MSVNUX0dST1VQJDEpWzBdO1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuXG4gICAgICBpZiAobGlzdEVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGl0ZW1TZWxlY3RvciA9IGxpc3RFbGVtZW50Lm5vZGVOYW1lID09PSAnVUwnIHx8IGxpc3RFbGVtZW50Lm5vZGVOYW1lID09PSAnT0wnID8gU0VMRUNUT1JfQUNUSVZFX1VMIDogU0VMRUNUT1JfQUNUSVZFJDI7XG4gICAgICAgIHByZXZpb3VzID0gJC5tYWtlQXJyYXkoJChsaXN0RWxlbWVudCkuZmluZChpdGVtU2VsZWN0b3IpKTtcbiAgICAgICAgcHJldmlvdXMgPSBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGhpZGVFdmVudCA9ICQuRXZlbnQoRVZFTlRfSElERSQzLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICAgIH0pO1xuICAgICAgdmFyIHNob3dFdmVudCA9ICQuRXZlbnQoRVZFTlRfU0hPVyQzLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXG4gICAgICB9KTtcblxuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgICQocHJldmlvdXMpLnRyaWdnZXIoaGlkZUV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG5cbiAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9hY3RpdmF0ZSh0aGlzLl9lbGVtZW50LCBsaXN0RWxlbWVudCk7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICB2YXIgaGlkZGVuRXZlbnQgPSAkLkV2ZW50KEVWRU5UX0hJRERFTiQzLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogX3RoaXMuX2VsZW1lbnRcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzaG93bkV2ZW50ID0gJC5FdmVudChFVkVOVF9TSE9XTiQzLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogcHJldmlvdXNcbiAgICAgICAgfSk7XG4gICAgICAgICQocHJldmlvdXMpLnRyaWdnZXIoaGlkZGVuRXZlbnQpO1xuICAgICAgICAkKF90aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3duRXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0YXJnZXQsIHRhcmdldC5wYXJlbnROb2RlLCBjb21wbGV0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAkLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkkOSk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICB9IC8vIFByaXZhdGVcbiAgICA7XG5cbiAgICBfcHJvdG8uX2FjdGl2YXRlID0gZnVuY3Rpb24gX2FjdGl2YXRlKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgYWN0aXZlRWxlbWVudHMgPSBjb250YWluZXIgJiYgKGNvbnRhaW5lci5ub2RlTmFtZSA9PT0gJ1VMJyB8fCBjb250YWluZXIubm9kZU5hbWUgPT09ICdPTCcpID8gJChjb250YWluZXIpLmZpbmQoU0VMRUNUT1JfQUNUSVZFX1VMKSA6ICQoY29udGFpbmVyKS5jaGlsZHJlbihTRUxFQ1RPUl9BQ1RJVkUkMik7XG4gICAgICB2YXIgYWN0aXZlID0gYWN0aXZlRWxlbWVudHNbMF07XG4gICAgICB2YXIgaXNUcmFuc2l0aW9uaW5nID0gY2FsbGJhY2sgJiYgYWN0aXZlICYmICQoYWN0aXZlKS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZBREUkNCk7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLl90cmFuc2l0aW9uQ29tcGxldGUoZWxlbWVudCwgYWN0aXZlLCBjYWxsYmFjayk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoYWN0aXZlICYmIGlzVHJhbnNpdGlvbmluZykge1xuICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChhY3RpdmUpO1xuICAgICAgICAkKGFjdGl2ZSkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDYpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fdHJhbnNpdGlvbkNvbXBsZXRlID0gZnVuY3Rpb24gX3RyYW5zaXRpb25Db21wbGV0ZShlbGVtZW50LCBhY3RpdmUsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICQoYWN0aXZlKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQzKTtcbiAgICAgICAgdmFyIGRyb3Bkb3duQ2hpbGQgPSAkKGFjdGl2ZS5wYXJlbnROb2RlKS5maW5kKFNFTEVDVE9SX0RST1BET1dOX0FDVElWRV9DSElMRClbMF07XG5cbiAgICAgICAgaWYgKGRyb3Bkb3duQ2hpbGQpIHtcbiAgICAgICAgICAkKGRyb3Bkb3duQ2hpbGQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQUNUSVZFJDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGl2ZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ3RhYicpIHtcbiAgICAgICAgICBhY3RpdmUuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICQoZWxlbWVudCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMyk7XG5cbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAndGFiJykge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBVdGlsLnJlZmxvdyhlbGVtZW50KTtcblxuICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSQ0KSkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlICYmICQoZWxlbWVudC5wYXJlbnROb2RlKS5oYXNDbGFzcyhDTEFTU19OQU1FX0RST1BET1dOX01FTlUpKSB7XG4gICAgICAgIHZhciBkcm9wZG93bkVsZW1lbnQgPSAkKGVsZW1lbnQpLmNsb3Nlc3QoU0VMRUNUT1JfRFJPUERPV04kMSlbMF07XG5cbiAgICAgICAgaWYgKGRyb3Bkb3duRWxlbWVudCkge1xuICAgICAgICAgIHZhciBkcm9wZG93blRvZ2dsZUxpc3QgPSBbXS5zbGljZS5jYWxsKGRyb3Bkb3duRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSQxKSk7XG4gICAgICAgICAgJChkcm9wZG93blRvZ2dsZUxpc3QpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBUYWIuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKTtcbiAgICAgICAgdmFyIGRhdGEgPSAkdGhpcy5kYXRhKERBVEFfS0VZJDkpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgVGFiKHRoaXMpO1xuICAgICAgICAgICR0aGlzLmRhdGEoREFUQV9LRVkkOSwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFRhYiwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kOTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVGFiO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJChkb2N1bWVudCkub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNiwgU0VMRUNUT1JfREFUQV9UT0dHTEUkNCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIFRhYi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJCh0aGlzKSwgJ3Nob3cnKTtcbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkLmZuW05BTUUkOV0gPSBUYWIuX2pRdWVyeUludGVyZmFjZTtcbiAgJC5mbltOQU1FJDldLkNvbnN0cnVjdG9yID0gVGFiO1xuXG4gICQuZm5bTkFNRSQ5XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm5bTkFNRSQ5XSA9IEpRVUVSWV9OT19DT05GTElDVCQ5O1xuICAgIHJldHVybiBUYWIuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkYSA9ICd0b2FzdCc7XG4gIHZhciBWRVJTSU9OJGEgPSAnNC41LjAnO1xuICB2YXIgREFUQV9LRVkkYSA9ICdicy50b2FzdCc7XG4gIHZhciBFVkVOVF9LRVkkYSA9IFwiLlwiICsgREFUQV9LRVkkYTtcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCRhID0gJC5mbltOQU1FJGFdO1xuICB2YXIgRVZFTlRfQ0xJQ0tfRElTTUlTUyQxID0gXCJjbGljay5kaXNtaXNzXCIgKyBFVkVOVF9LRVkkYTtcbiAgdmFyIEVWRU5UX0hJREUkNCA9IFwiaGlkZVwiICsgRVZFTlRfS0VZJGE7XG4gIHZhciBFVkVOVF9ISURERU4kNCA9IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVkkYTtcbiAgdmFyIEVWRU5UX1NIT1ckNCA9IFwic2hvd1wiICsgRVZFTlRfS0VZJGE7XG4gIHZhciBFVkVOVF9TSE9XTiQ0ID0gXCJzaG93blwiICsgRVZFTlRfS0VZJGE7XG4gIHZhciBDTEFTU19OQU1FX0ZBREUkNSA9ICdmYWRlJztcbiAgdmFyIENMQVNTX05BTUVfSElERSA9ICdoaWRlJztcbiAgdmFyIENMQVNTX05BTUVfU0hPVyQ3ID0gJ3Nob3cnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XSU5HID0gJ3Nob3dpbmcnO1xuICB2YXIgRGVmYXVsdFR5cGUkNyA9IHtcbiAgICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgICBhdXRvaGlkZTogJ2Jvb2xlYW4nLFxuICAgIGRlbGF5OiAnbnVtYmVyJ1xuICB9O1xuICB2YXIgRGVmYXVsdCQ3ID0ge1xuICAgIGFuaW1hdGlvbjogdHJ1ZSxcbiAgICBhdXRvaGlkZTogdHJ1ZSxcbiAgICBkZWxheTogNTAwXG4gIH07XG4gIHZhciBTRUxFQ1RPUl9EQVRBX0RJU01JU1MkMSA9ICdbZGF0YS1kaXNtaXNzPVwidG9hc3RcIl0nO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUb2FzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVG9hc3QoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG5cbiAgICAgIHRoaXMuX3NldExpc3RlbmVycygpO1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gVG9hc3QucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHNob3dFdmVudCA9ICQuRXZlbnQoRVZFTlRfU0hPVyQ0KTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuXG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSQ1KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIF90aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XSU5HKTtcblxuICAgICAgICBfdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQ3KTtcblxuICAgICAgICAkKF90aGlzLl9lbGVtZW50KS50cmlnZ2VyKEVWRU5UX1NIT1dOJDQpO1xuXG4gICAgICAgIGlmIChfdGhpcy5fY29uZmlnLmF1dG9oaWRlKSB7XG4gICAgICAgICAgX3RoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLmhpZGUoKTtcbiAgICAgICAgICB9LCBfdGhpcy5fY29uZmlnLmRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfSElERSk7XG5cbiAgICAgIFV0aWwucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XSU5HKTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG4gICAgICAgICQodGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKCkge1xuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1ckNykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGlkZUV2ZW50ID0gJC5FdmVudChFVkVOVF9ISURFJDQpO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jbG9zZSgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcblxuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVyQ3KSkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XJDcpO1xuICAgICAgfVxuXG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9DTElDS19ESVNNSVNTJDEpO1xuICAgICAgJC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJGEpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBEZWZhdWx0JDcpLCAkKHRoaXMuX2VsZW1lbnQpLmRhdGEoKSksIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkYSwgY29uZmlnLCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0TGlzdGVuZXJzID0gZnVuY3Rpb24gX3NldExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX0NMSUNLX0RJU01JU1MkMSwgU0VMRUNUT1JfREFUQV9ESVNNSVNTJDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5oaWRlKCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9jbG9zZSA9IGZ1bmN0aW9uIF9jbG9zZSgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgX3RoaXMzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURFKTtcblxuICAgICAgICAkKF90aGlzMy5fZWxlbWVudCkudHJpZ2dlcihFVkVOVF9ISURERU4kNCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XJDcpO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgVG9hc3QuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJCh0aGlzKTtcbiAgICAgICAgdmFyIGRhdGEgPSAkZWxlbWVudC5kYXRhKERBVEFfS0VZJGEpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgVG9hc3QodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0tFWSRhLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFRvYXN0LCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiRhO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0VHlwZVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0VHlwZSQ3O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQkNztcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVG9hc3Q7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJC5mbltOQU1FJGFdID0gVG9hc3QuX2pRdWVyeUludGVyZmFjZTtcbiAgJC5mbltOQU1FJGFdLkNvbnN0cnVjdG9yID0gVG9hc3Q7XG5cbiAgJC5mbltOQU1FJGFdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbltOQU1FJGFdID0gSlFVRVJZX05PX0NPTkZMSUNUJGE7XG4gICAgcmV0dXJuIFRvYXN0Ll9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgZXhwb3J0cy5BbGVydCA9IEFsZXJ0O1xuICBleHBvcnRzLkJ1dHRvbiA9IEJ1dHRvbjtcbiAgZXhwb3J0cy5DYXJvdXNlbCA9IENhcm91c2VsO1xuICBleHBvcnRzLkNvbGxhcHNlID0gQ29sbGFwc2U7XG4gIGV4cG9ydHMuRHJvcGRvd24gPSBEcm9wZG93bjtcbiAgZXhwb3J0cy5Nb2RhbCA9IE1vZGFsO1xuICBleHBvcnRzLlBvcG92ZXIgPSBQb3BvdmVyO1xuICBleHBvcnRzLlNjcm9sbHNweSA9IFNjcm9sbFNweTtcbiAgZXhwb3J0cy5UYWIgPSBUYWI7XG4gIGV4cG9ydHMuVG9hc3QgPSBUb2FzdDtcbiAgZXhwb3J0cy5Ub29sdGlwID0gVG9vbHRpcDtcbiAgZXhwb3J0cy5VdGlsID0gVXRpbDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuXG4iXX0=