Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
META-INF.resources.butterfaces-dist-bundle-js.butterfaces-js-bundle.min.js Maven / Gradle / Ivy
!function(){var t=!1,e=/xyz/.test(function(){xyz})?/\b_super\b/:/.*/;this.Class=function(){},Class.extend=function(n){function i(){!t&&this.init&&this.init.apply(this,arguments)}var o=this.prototype;t=!0;var s=new this;t=!1;for(var r in n)s[r]="function"==typeof n[r]&&"function"==typeof o[r]&&e.test(n[r])?function(t,e){return function(){var n=this._super;this._super=o[t];var i=e.apply(this,arguments);return this._super=n,i}}(r,n[r]):n[r];return i.prototype=s,i.prototype.constructor=i,i.extend=arguments.callee,i}}(),function(t){t.fn._butterAutoCompleteInit=function(){return this.each(function(){new e(this)})};var e=Class.extend({init:function(e){this.SEARCH_REQUEST_DELAY=300;var n=t(e);this.$input=n.prev(),this.$input.parent().css({position:"relative"}),this.autocompleteId=n.attr("id"),this.$selectedOption=null,this.ignoreKeyupEvent=!1,this.requestDelayTimerId=null,this.isRequestRunning=!1,this.areChangesMadeWhileRequestWasRunning=!1,this._keyCodes={tab:9,enter:13,shift:16,ctrl:17,alt:18,pause:19,caps_lock:20,escape:27,page_up:33,page_down:34,end:35,home:36,arrow_left:37,arrow_up:38,arrow_right:39,arrow_down:40,insert:45,delete_key:46,left_window_key:91,right_window_key:92,select_key:93,num_lock:144,scroll_lock:145};var i=this;i.$input.on("keydown",function(t){t.which===i._keyCodes.enter?i._handleEnterKeyDown(t):t.which===i._keyCodes.arrow_up||t.which===i._keyCodes.arrow_down?i._handleArrowUpAndDownKeyDown(t):t.which===i._keyCodes.escape&&i._handleEscapeKeyDown(t)}).on("keyup",function(t){for(keyName in i._keyCodes)if(i._keyCodes[keyName]===t.which)return void i._stopEvent(t);return i.ignoreKeyupEvent?(i._stopEvent(t),void(i.ignoreKeyupEvent=!1)):0===i.$input.val().length?(i._stopEvent(t),void i._hideAutocompleteResultList()):void i._trySendJsfAjaxRequest()}).on("blur",function(t){window.setTimeout(function(){i._hideAutocompleteResultList()},100)})},_handleEnterKeyDown:function(t){null!==this.$selectedOption&&(this._stopEvent(t),this._setSelectedValue())},_handleArrowUpAndDownKeyDown:function(t){this._stopEvent(t);var e=this._getAutocompleteElement();!e.is(":visible")&&this.$input.val().length>0?this._trySendJsfAjaxRequest():e.is(":visible")&&e.find("li").length>0&&(null===this.$selectedOption?this._selectResultOptionElement(e.find("li")[0]):this._moveResultOptionElementSelectionCursor(e,t.which===this._keyCodes.arrow_up?-1:1))},_handleEscapeKeyDown:function(t){this._stopEvent(t),this._hideAutocompleteResultList()},_trySendJsfAjaxRequest:function(){var t=this;t.isRequestRunning&&(t.areChangesMadeWhileRequestWasRunning=!0),null!==t.requestDelayTimerId&&window.clearTimeout(t.requestDelayTimerId),t.requestDelayTimerId=window.setTimeout(function(){t.requestDelayTimerId=null,t._sendJsfAjaxRequest()},t.SEARCH_REQUEST_DELAY)},_sendJsfAjaxRequest:function(){var t=this;if(!t.isRequestRunning){t.isRequestRunning=!0,t.areChangesMadeWhileRequestWasRunning=!1,t._showLoadingSpinner();var e=t.$input.parent().parent().attr("id"),n=t.$input.val();jsf.ajax.request(e,"autocomplete",{"javax.faces.behavior.event":"autocomplete",render:t.autocompleteId,params:n,"butterfaces.params":n,onevent:function(e){"success"===e.status&&(t.$input.is(":focus")&&t._handleAutocompleteResultListVisibility(),t._hideLoadingSpinner(),t.isRequestRunning=!1,t.areChangesMadeWhileRequestWasRunning&&t._sendJsfAjaxRequest())}})}},_handleAutocompleteResultListVisibility:function(){var t=this;t._getAutocompleteElement().find("li").length>0?t._initAndShowAutocompleteResultList():t._hideAutocompleteResultList()},_showLoadingSpinner:function(){t('').appendTo(this.$input.parent())},_hideLoadingSpinner:function(){this.$input.parent().find(".butter-dropdownlist-spinner").remove()},_initAndShowAutocompleteResultList:function(){var t=this,e=t._getAutocompleteElement();e.show().css({width:t.$input.innerWidth()}).highlight(t.$input.val()),e.find("ul").on("mouseleave",function(){t._clearResultOptionSelection()}),e.find("li").on("mousedown",function(){t._setSelectedValue()}).on("mouseenter",function(){t._selectResultOptionElement(this)})},_selectResultOptionElement:function(e){this._clearResultOptionSelection();var n=t(e);n.addClass("butter-dropdownlist-resultItem-selected"),this.$selectedOption=n},_clearResultOptionSelection:function(){this.$selectedOption=null,this._getAutocompleteElement().find(".butter-dropdownlist-resultItem-selected").removeClass("butter-dropdownlist-resultItem-selected")},_moveResultOptionElementSelectionCursor:function(t,e){if(e>0){var n=this.$selectedOption.next();n.length>0?this._selectResultOptionElement(n[0]):this._selectResultOptionElement(t.find("li")[0])}else{var i=this.$selectedOption.prev();if(i.length>0)this._selectResultOptionElement(i[0]);else{var o=t.find("li");this._selectResultOptionElement(o[o.length-1])}}},_setSelectedValue:function(){null!==this.$selectedOption&&(this.ignoreKeyupEvent=!0,this.$input.val(this.$selectedOption.attr("data-select-value")).change().focus().keyup(),this._hideAutocompleteResultList())},_hideAutocompleteResultList:function(){null!==this.requestDelayTimerId&&window.clearTimeout(this.requestDelayTimerId),this.$selectedOption=null,this._getAutocompleteElement().hide()},_getAutocompleteElement:function(){return t(document.getElementById(this.autocompleteId))},_stopEvent:function(t){t.stopPropagation(),t.preventDefault()}})}(jQuery),function(t){t.fn.fixBootstrapDropDown=function(){return this.each(function(){t(".dropdown-menu").on("click",function(e){t(this).hasClass("dropdown-menu-form")&&e.stopPropagation()})})}}(jQuery),function(t){var e=function(){var t=0;return function(e,n){clearTimeout(t),t=setTimeout(e,n)}}();t.fn.butterItemFilterField=function(n){return this.each(function(){var i=t(this);i.keyup(function(){e(function(){var e,o=i.val();if(n)e=t(n);else{var s=i.attr("data-filterable-item-container");e=t(s)}e.find(".filterable-item").each(function(e,n){var i=t(n);i.is(":containsIgnoreCase("+o+")")?(i.removeAttr("hidden"),i.highlight(o)):i.attr("hidden","hidden")})},300)})})}}(jQuery),function(t){t.expr[":"].containsIgnoreCase=t.expr.createPseudo(function(e){return function(n){return!e||t(n).text().toUpperCase().indexOf(e.toUpperCase())>=0}})}(jQuery),function(t){var e=null;t.fn.startDots=function(){return this.each(function(){var n=t(this);n.html(""),e=setInterval(function(){n.append("."),n.html().length>5&&n.html("")},200)})},t.fn.stopDots=function(){return this.each(function(){t(this).html(""),window.clearInterval(e)})}}(jQuery),function(t){t.fn.highlight=function(e){var n=new RegExp(e,"gi"),i=this.find("*");return this.each(function(){i.push(this),t(this).find(".search-highlighted").contents().unwrap(),this.normalize()}),i.each(function(){var i=t(this);e&&""!==e&&i.contents().filter(function(){return 3===this.nodeType&&n.test(this.nodeValue)}).replaceWith(function(){return(this.nodeValue||"").replace(n,function(t){return''+t+" "})})})}}(jQuery),function(t){t.fn.markdownReadonly=function(){var e=t(this).find(".butter-component-value-readonly-wrapper"),n=e.html().replace("&","&").replace("<","<").replace(">",">"),i=(new showdown.Converter).makeHtml(n);e.empty(),e.append(i)}}(jQuery),"undefined"==typeof butter&&(butter={}),butter.modal={},butter.modal.open=function(t){$(".butter-modal[data-modal-id="+t+"]").modal({show:!0,keyboard:!1,backdrop:"static"})},butter.modal.close=function(t){$(".butter-modal[data-modal-id="+t+"]").modal("hide")},function(t){t.fn.butterNumberSpinner=function(t){return this.each(function(){new e(this,t)})};var e=Class.extend({init:function(e,n){this.$input=t(e).find("input"),this._initInput(),this._initOptions(n),this._initCounter(),this._initButtons(),this._initArrowKeys(),this._initMouseWheel()},_initInput:function(){var t=this;this.$input.addClass("butter-component-number-input").blur(function(){t._setValueOnBlur()}).parent().addClass("input-group")},_initOptions:function(e){var n={step:1,disabled:!1};this._options=t.extend({},n,e),void 0!==this._options.step&&(this._options.step=1*this._options.step),void 0!==this._options.min&&(this._options.min=1*this._options.min),void 0!==this._options.max&&(this._options.max=1*this._options.max)},_initButtons:function(){var e=t("").addClass("input-group-append").insertAfter(this.$input),n=t("
").addClass("input-group-text").addClass("butter-component-number-buttons").appendTo(e),i=this;t("").addClass("glyphicon glyphicon-chevron-up").addClass("butter-component-number-button").addClass(function(){return i._options.disabled?"disabled":""}).click(function(){i._options.disabled||i.increaseCounter()}).appendTo(n),t("").addClass("glyphicon glyphicon-chevron-down").addClass("butter-component-number-button").addClass(function(){return i._options.disabled?"disabled":""}).click(function(){i._options.disabled||i.decreaseCounter()}).appendTo(n)},_initArrowKeys:function(){var t=this;this.$input.keydown(function(e){38===e.which?(e.stopPropagation(),e.preventDefault(),t.increaseCounter()):40===e.which&&(e.stopPropagation(),e.preventDefault(),t.decreaseCounter())})},_initMouseWheel:function(){var t=this;this.$input.on("mousewheel DOMMouseScroll",function(e){if(t.$input.is(":focus")){var n=e.originalEvent.wheelDelta||-e.originalEvent.deltaY||-e.originalEvent.detail;e.stopPropagation(),e.preventDefault(),n<0?t.decreaseCounter():t.increaseCounter()}})},_initCounter:function(){this._counter=null,this._isValueSet=!1;var t=this.$input.val();if(!this._isStringEmpty(t)){var e=parseInt(t);isNaN(e)||(this.setCounter(e),this._isValueSet=!0)}this._isValueSet||this.setCounter(0)},_setValueOnBlur:function(){var t=this.$input.val();if(this._isStringEmpty(t))this.$input.val(""),this.setCounter(0),this._isValueSet=!1;else{var e=parseInt(t);isNaN(e)?this._isValueSet?this.$input.val(this._counter):(this.$input.val(""),this.setCounter(0),this._isValueSet=!1):(this.setCounter(e),this.$input.val(this._counter),this._isValueSet=!0)}},increaseCounter:function(){this._isValueSet?this.setCounter(this._counter+this._options.step):this._isValueSet=!0,this.$input.val(this._counter),this.$input.change()},decreaseCounter:function(){this._isValueSet?this.setCounter(this._counter-this._options.step):this._isValueSet=!0,this.$input.val(this._counter),this.$input.change()},_isStringEmpty:function(t){return 0===t.length||!t.trim()},setCounter:function(t){void 0!==this._options.min&&tthis._options.max?this._counter=this._options.max:this._counter=t}})}(jQuery),"undefined"==typeof butter&&(butter={}),butter.prettyprint={},butter.prettyprint.cleanup=function(){prettyPrint(),jQuery(".butter-component-prettyprint").each(function(){var t=jQuery(this).find("pre span").first(),e=jQuery(this).find("pre span").last();void 0!==t.html()&&(t.html().trim()||t.remove()),void 0!==e.html()&&(e.html().trim()||e.remove())})},function(t){t.fn.butterScrollToFirst=function(e){var n=void 0===e?t(this).first().offset().top:t(this).first().offset().top+e;t("html, body").animate({scrollTop:n+"px"},"fast")},t.fn.butterScrollToLast=function(e){var n=void 0===e?t(this).last().offset().top:t(this).last().offset().top+e;t("html, body").animate({scrollTop:n+"px"},"fast")}}(jQuery),function(t){t.fn.toggleColumnVisibilty=function(e,n){function i(e){var n=[];return e.find(".butter-table-toolbar-column-option input[type=checkbox]").each(function(e,i){var o=t(i).parent(".butter-table-toolbar-column-option");n.push({identifier:o.attr("data-column-model-identifier"),visible:o.find("input[type=checkbox]").is(":checked")})}),n}return this.each(function(){var o=t(this),s=JSON.stringify(i(o));ButterFaces.Ajax.sendRequest(o.attr("id"),"toggle",e,s,n)})},t.fn.orderColumn=function(e,n,i,o){function s(e){var n=[];return e.find(".butter-table-toolbar-column-option input[type=checkbox]").each(function(e,i){var o=t(i).parent(".butter-table-toolbar-column-option");n.push({identifier:o.attr("data-column-model-identifier"),position:e})}),n}function r(t,e){var n=t.find('li[data-original-column="'+e+'"]'),i=n.prev(),o=n.detach();i.before(o)}function u(t,e){var n=t.find('li[data-original-column="'+e+'"]'),i=n.next(),o=n.detach();i.after(o)}return this.each(function(){var a=t(this);i?r(a,o):u(a,o);var l=JSON.stringify(s(a));ButterFaces.Ajax.sendRequest(a.attr("id"),"order",e,l,n)})}}(jQuery),function(t){t.fn._closePopoverOnBlur=function(e){return this.each(function(){var e=t(this);e.find(".butter-input-component").on("blur",function(){e.popover("hide")})})},t.fn._butterTooltip=function(e){var n=t(this),i=jQuery("[name="+e.contentByName+"]"),o={trigger:e.trigger,title:e.title,placement:e.placement,placementFunction:e.placementFunction,minVerticalOffset:e.minVerticalOffset,minHorizontalOffset:e.minHorizontalOffset,content:i.html().trim()};i.remove(),n.butterTooltip(o)},t.fn.butterTooltip=function(e){return this.each(function(){var n=t(this),i=e.trigger?e.trigger:"hover";e.minVerticalOffset&&n.attr("data-tooltip-min-vertical-offset",e.minVerticalOffset),e.minHorizontalOffset&&n.attr("data-tooltip-min-horizontal-offset",e.minHorizontalOffset),n.next().hasClass("popover")&&n.next().remove(),n.popover({trigger:i,placement:function(t,n){return e.placement?e.placement:e.placementFunction?e.placementFunction:(new ButterFaces.Tooltip).calculateTooltipPosition(t,n)},title:e.title,html:!0,content:e.content,viewport:e.viewport})})}}(jQuery);
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1dHRlcmZhY2VzLTAxLWJhc2VDbGFzcy5qcyIsImJ1dHRlcmZhY2VzLWF1dG9jb21wbGV0ZS5qcXVlcnkuanMiLCJidXR0ZXJmYWNlcy1ib290c3RyYXAtZml4ZXMuanF1ZXJ5LmpzIiwiYnV0dGVyZmFjZXMtY2xpZW50U2lkZUZpbHRlci5qcXVlcnkuanMiLCJidXR0ZXJmYWNlcy1kb3RzLmpxdWVyeS5qcyIsImJ1dHRlcmZhY2VzLWhpZ2hsaWdodC5qcXVlcnkuanMiLCJidXR0ZXJmYWNlcy1tYXJrZG93bi5qcXVlcnkuanMiLCJidXR0ZXJmYWNlcy1tb2RhbC5qcyIsImJ1dHRlcmZhY2VzLW51bWJlclNwaW5uZXIuanF1ZXJ5LmpzIiwiYnV0dGVyZmFjZXMtcHJldHR5cHJpbnQuanMiLCJidXR0ZXJmYWNlcy1zY3JvbGwuanF1ZXJ5LmpzIiwiYnV0dGVyZmFjZXMtdGFibGUtdG9vbGJhci5qcXVlcnkuanMiLCJidXR0ZXJmYWNlcy10b29sdGlwLmpxdWVyeS5qcyJdLCJuYW1lcyI6WyJpbml0aWFsaXppbmciLCJmblRlc3QiLCJ0ZXN0IiwieHl6IiwidGhpcyIsIkNsYXNzIiwiZXh0ZW5kIiwicHJvcCIsImluaXQiLCJhcHBseSIsImFyZ3VtZW50cyIsIl9zdXBlciIsInByb3RvdHlwZSIsIm5hbWUiLCJmbiIsInRtcCIsInJldCIsImNvbnN0cnVjdG9yIiwiY2FsbGVlIiwiJCIsIl9idXR0ZXJBdXRvQ29tcGxldGVJbml0IiwiZWFjaCIsIkF1dG9jb21wbGV0ZUxpc3QiLCJyb290RWxlbWVudCIsIlNFQVJDSF9SRVFVRVNUX0RFTEFZIiwiJGF1dG9jb21wbGV0ZVRtcCIsIiRpbnB1dCIsInByZXYiLCJwYXJlbnQiLCJjc3MiLCJwb3NpdGlvbiIsImF1dG9jb21wbGV0ZUlkIiwiYXR0ciIsIiRzZWxlY3RlZE9wdGlvbiIsImlnbm9yZUtleXVwRXZlbnQiLCJyZXF1ZXN0RGVsYXlUaW1lcklkIiwiaXNSZXF1ZXN0UnVubmluZyIsImFyZUNoYW5nZXNNYWRlV2hpbGVSZXF1ZXN0V2FzUnVubmluZyIsIl9rZXlDb2RlcyIsInRhYiIsImVudGVyIiwic2hpZnQiLCJjdHJsIiwiYWx0IiwicGF1c2UiLCJjYXBzX2xvY2siLCJlc2NhcGUiLCJwYWdlX3VwIiwicGFnZV9kb3duIiwiZW5kIiwiaG9tZSIsImFycm93X2xlZnQiLCJhcnJvd191cCIsImFycm93X3JpZ2h0IiwiYXJyb3dfZG93biIsImluc2VydCIsImRlbGV0ZV9rZXkiLCJsZWZ0X3dpbmRvd19rZXkiLCJyaWdodF93aW5kb3dfa2V5Iiwic2VsZWN0X2tleSIsIm51bV9sb2NrIiwic2Nyb2xsX2xvY2siLCJzZWxmIiwib24iLCJldmVudCIsIndoaWNoIiwiX2hhbmRsZUVudGVyS2V5RG93biIsIl9oYW5kbGVBcnJvd1VwQW5kRG93bktleURvd24iLCJfaGFuZGxlRXNjYXBlS2V5RG93biIsImtleU5hbWUiLCJfc3RvcEV2ZW50IiwidmFsIiwibGVuZ3RoIiwiX2hpZGVBdXRvY29tcGxldGVSZXN1bHRMaXN0IiwiX3RyeVNlbmRKc2ZBamF4UmVxdWVzdCIsIndpbmRvdyIsInNldFRpbWVvdXQiLCJfc2V0U2VsZWN0ZWRWYWx1ZSIsIiRhdXRvY29tcGxldGUiLCJfZ2V0QXV0b2NvbXBsZXRlRWxlbWVudCIsImlzIiwiZmluZCIsIl9zZWxlY3RSZXN1bHRPcHRpb25FbGVtZW50IiwiX21vdmVSZXN1bHRPcHRpb25FbGVtZW50U2VsZWN0aW9uQ3Vyc29yIiwiY2xlYXJUaW1lb3V0IiwiX3NlbmRKc2ZBamF4UmVxdWVzdCIsIl9zaG93TG9hZGluZ1NwaW5uZXIiLCJpZCIsInBhcmFtcyIsImpzZiIsImFqYXgiLCJyZXF1ZXN0IiwiamF2YXguZmFjZXMuYmVoYXZpb3IuZXZlbnQiLCJyZW5kZXIiLCJidXR0ZXJmYWNlcy5wYXJhbXMiLCJvbmV2ZW50IiwiZGF0YSIsInN0YXR1cyIsIl9oYW5kbGVBdXRvY29tcGxldGVSZXN1bHRMaXN0VmlzaWJpbGl0eSIsIl9oaWRlTG9hZGluZ1NwaW5uZXIiLCJfaW5pdEFuZFNob3dBdXRvY29tcGxldGVSZXN1bHRMaXN0IiwiYXBwZW5kVG8iLCJyZW1vdmUiLCJzaG93Iiwid2lkdGgiLCJpbm5lcldpZHRoIiwiaGlnaGxpZ2h0IiwiX2NsZWFyUmVzdWx0T3B0aW9uU2VsZWN0aW9uIiwib3B0aW9uRWxlbWVudCIsIiRzZWxlY3RlZE9wdGlvbkVsZW1lbnQiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiZGlyZWN0aW9uIiwiJG5leHQiLCJuZXh0IiwiJHByZXYiLCJyZXN1bHRMaXN0T3B0aW9ucyIsImNoYW5nZSIsImZvY3VzIiwia2V5dXAiLCJoaWRlIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwialF1ZXJ5IiwiZml4Qm9vdHN0cmFwRHJvcERvd24iLCJlIiwiaGFzQ2xhc3MiLCJkZWxheSIsInRpbWVyIiwiY2FsbGJhY2siLCJtcyIsImJ1dHRlckl0ZW1GaWx0ZXJGaWVsZCIsImZpbHRlcmFibGVJdGVtQ29udGFpbmVyU2VsZWN0b3IiLCIkdGhpcyIsIiRmaWx0ZXJhYmxlSXRlbUNvbnRhaW5lciIsImZpbHRlclZhbHVlIiwiY29udGFpbmVyU2VsZWN0b3IiLCJpIiwiZWxlbSIsIiRmaWx0ZXJhYmxlSXRlbSIsInJlbW92ZUF0dHIiLCJleHByIiwiY29udGFpbnNJZ25vcmVDYXNlIiwiY3JlYXRlUHNldWRvIiwiYXJnIiwidGV4dCIsInRvVXBwZXJDYXNlIiwiaW5kZXhPZiIsImludGVydmFsVHJpZ2dlciIsInN0YXJ0RG90cyIsIiRvcmlnaW5hbEVsZW1lbnQiLCJodG1sIiwic2V0SW50ZXJ2YWwiLCJhcHBlbmQiLCJzdG9wRG90cyIsImNsZWFySW50ZXJ2YWwiLCJzZWFyY2hTdHJpbmciLCJyZWdleCIsIlJlZ0V4cCIsImVsZW1lbnRzIiwicHVzaCIsImNvbnRlbnRzIiwidW53cmFwIiwibm9ybWFsaXplIiwiZmlsdGVyIiwibm9kZVR5cGUiLCJub2RlVmFsdWUiLCJyZXBsYWNlV2l0aCIsInJlcGxhY2UiLCJtYXRjaCIsIm1hcmtkb3duUmVhZG9ubHkiLCIkcmVhZG9ubHlNYXJrZG93biIsIm1hcmtkb3duVGV4dCIsIm1hcmtkb3duVGV4dFRvSHRtbCIsInNob3dkb3duIiwiQ29udmVydGVyIiwibWFrZUh0bWwiLCJlbXB0eSIsImJ1dHRlciIsIm1vZGFsIiwib3BlbiIsIm1vZGFsUGFuZWxJZCIsImtleWJvYXJkIiwiYmFja2Ryb3AiLCJjbG9zZSIsImJ1dHRlck51bWJlclNwaW5uZXIiLCJvcHRpb25zIiwiTnVtYmVyU3Bpbm5lciIsImVsZW1lbnQiLCJfaW5pdElucHV0IiwiX2luaXRPcHRpb25zIiwiX2luaXRDb3VudGVyIiwiX2luaXRCdXR0b25zIiwiX2luaXRBcnJvd0tleXMiLCJfaW5pdE1vdXNlV2hlZWwiLCJibHVyIiwiX3NldFZhbHVlT25CbHVyIiwiZGVmYXVsdE9wdGlvbnMiLCJzdGVwIiwiZGlzYWJsZWQiLCJfb3B0aW9ucyIsInVuZGVmaW5lZCIsIm1pbiIsIm1heCIsIiRvdXRlckFkZG9uIiwiaW5zZXJ0QWZ0ZXIiLCIkYWRkb24iLCJjbGljayIsImluY3JlYXNlQ291bnRlciIsImRlY3JlYXNlQ291bnRlciIsImtleWRvd24iLCJkZWx0YSIsIm9yaWdpbmFsRXZlbnQiLCJ3aGVlbERlbHRhIiwiZGVsdGFZIiwiZGV0YWlsIiwiX2NvdW50ZXIiLCJfaXNWYWx1ZVNldCIsInZhbHVlIiwiX2lzU3RyaW5nRW1wdHkiLCJwYXJzZWRJbnQiLCJwYXJzZUludCIsImlzTmFOIiwic2V0Q291bnRlciIsInRyaW0iLCJwcmV0dHlwcmludCIsImNsZWFudXAiLCJwcmV0dHlQcmludCIsIiRmaXJzdFByZUNoaWxkIiwiZmlyc3QiLCIkbGFzdFByZUNoaWxkIiwibGFzdCIsImJ1dHRlclNjcm9sbFRvRmlyc3QiLCJvZmZzZXQiLCJfb2Zmc2V0IiwidG9wIiwiYW5pbWF0ZSIsInNjcm9sbFRvcCIsImJ1dHRlclNjcm9sbFRvTGFzdCIsInRvZ2dsZUNvbHVtblZpc2liaWx0eSIsInJlbmRlcklkcyIsImRpc2FibGVSZW5kZXJJZHMiLCJjcmVhdGVDb2x1bW5WaXNpYmlsdHkiLCIkdG9vbGJhciIsImNvbHVtbnMiLCJpbmRleCIsImNoZWNrYm94IiwiJGNoZWNrYm94IiwiaWRlbnRpZmllciIsInZpc2libGUiLCJqc29uIiwiSlNPTiIsInN0cmluZ2lmeSIsIkJ1dHRlckZhY2VzIiwiQWpheCIsInNlbmRSZXF1ZXN0Iiwib3JkZXJDb2x1bW4iLCJ0b0xlZnQiLCJjb2x1bW5OdW1iZXIiLCJjcmVhdGVDb2x1bW5PcmRlciIsIm9yZGVyQ29sdW1uTGVmdCIsIiRjb2x1bW4iLCIkbmV4dENvbHVtbiIsIiRkZXRhY2h0ZWRDb2x1bW4iLCJkZXRhY2giLCJiZWZvcmUiLCJvcmRlckNvbHVtblJpZ2h0IiwiYWZ0ZXIiLCJfY2xvc2VQb3BvdmVyT25CbHVyIiwicm9vdCIsInBvcG92ZXIiLCJfYnV0dGVyVG9vbHRpcCIsImNvbnRlbnQiLCJjb250ZW50QnlOYW1lIiwibmV3RGF0YSIsInRyaWdnZXIiLCJ0aXRsZSIsInBsYWNlbWVudCIsInBsYWNlbWVudEZ1bmN0aW9uIiwibWluVmVydGljYWxPZmZzZXQiLCJtaW5Ib3Jpem9udGFsT2Zmc2V0IiwiYnV0dGVyVG9vbHRpcCIsInNvdXJjZSIsIlRvb2x0aXAiLCJjYWxjdWxhdGVUb29sdGlwUG9zaXRpb24iLCJ2aWV3cG9ydCJdLCJtYXBwaW5ncyI6IkNBS0EsV0FDQSxJQUFBQSxHQUFBLEVBQUFDLEVBQUEsTUFBQUMsS0FBQSxXQUFBQyxNQUFBLGFBQUEsS0FHQUMsS0FBQUMsTUFBQSxhQUdBQSxNQUFBQyxPQUFBLFNBQUFDLEdBa0NBLFNBQUFGLEtBRUFMLEdBQUFJLEtBQUFJLE1BQ0FKLEtBQUFJLEtBQUFDLE1BQUFMLEtBQUFNLFdBcENBLElBQUFDLEVBQUFQLEtBQUFRLFVBSUFaLEdBQUEsRUFDQSxJQUFBWSxFQUFBLElBQUFSLEtBQ0FKLEdBQUEsRUFHQSxJQUFBLElBQUFhLEtBQUFOLEVBRUFLLEVBQUFDLEdBQUEsbUJBQUFOLEVBQUFNLElBQ0EsbUJBQUFGLEVBQUFFLElBQUFaLEVBQUFDLEtBQUFLLEVBQUFNLElBQ0EsU0FBQUEsRUFBQUMsR0FDQSxPQUFBLFdBQ0EsSUFBQUMsRUFBQVgsS0FBQU8sT0FJQVAsS0FBQU8sT0FBQUEsRUFBQUUsR0FJQSxJQUFBRyxFQUFBRixFQUFBTCxNQUFBTCxLQUFBTSxXQUdBLE9BRkFOLEtBQUFPLE9BQUFJLEVBRUFDLEdBYkEsQ0FlQUgsRUFBQU4sRUFBQU0sSUFDQU4sRUFBQU0sR0FtQkEsT0FSQVIsRUFBQU8sVUFBQUEsRUFHQVAsRUFBQU8sVUFBQUssWUFBQVosRUFHQUEsRUFBQUMsT0FBQUksVUFBQVEsT0FFQWIsR0F4REEsR0NFQSxTQUFBYyxHQUdBQSxFQUFBTCxHQUFBTSx3QkFBQSxXQUNBLE9BQUFoQixLQUFBaUIsS0FBQSxXQUNBLElBQUFDLEVBQUFsQixTQU1BLElBQUFrQixFQUFBakIsTUFBQUMsUUFDQUUsS0FBQSxTQUFBZSxHQUNBbkIsS0FBQW9CLHFCQUFBLElBRUEsSUFBQUMsRUFBQU4sRUFBQUksR0FDQW5CLEtBQUFzQixPQUFBRCxFQUFBRSxPQUNBdkIsS0FBQXNCLE9BQUFFLFNBQUFDLEtBQUFDLFNBQUEsYUFDQTFCLEtBQUEyQixlQUFBTixFQUFBTyxLQUFBLE1BQ0E1QixLQUFBNkIsZ0JBQUEsS0FDQTdCLEtBQUE4QixrQkFBQSxFQUNBOUIsS0FBQStCLG9CQUFBLEtBQ0EvQixLQUFBZ0Msa0JBQUEsRUFDQWhDLEtBQUFpQyxzQ0FBQSxFQUVBakMsS0FBQWtDLFdBRUFDLElBQUEsRUFDQUMsTUFBQSxHQUNBQyxNQUFBLEdBQ0FDLEtBQUEsR0FDQUMsSUFBQSxHQUNBQyxNQUFBLEdBQ0FDLFVBQUEsR0FDQUMsT0FBQSxHQUNBQyxRQUFBLEdBQ0FDLFVBQUEsR0FDQUMsSUFBQSxHQUNBQyxLQUFBLEdBQ0FDLFdBQUEsR0FDQUMsU0FBQSxHQUNBQyxZQUFBLEdBQ0FDLFdBQUEsR0FDQUMsT0FBQSxHQUVBQyxXQUFBLEdBQ0FDLGdCQUFBLEdBQ0FDLGlCQUFBLEdBQ0FDLFdBQUEsR0FDQUMsU0FBQSxJQUNBQyxZQUFBLEtBR0EsSUFBQUMsRUFBQTFELEtBQ0EwRCxFQUFBcEMsT0FDQXFDLEdBQUEsVUFBQSxTQUFBQyxHQUNBQSxFQUFBQyxRQUFBSCxFQUFBeEIsVUFBQUUsTUFDQXNCLEVBQUFJLG9CQUFBRixHQUNBQSxFQUFBQyxRQUFBSCxFQUFBeEIsVUFBQWMsVUFDQVksRUFBQUMsUUFBQUgsRUFBQXhCLFVBQUFnQixXQUNBUSxFQUFBSyw2QkFBQUgsR0FDQUEsRUFBQUMsUUFBQUgsRUFBQXhCLFVBQUFRLFFBQ0FnQixFQUFBTSxxQkFBQUosS0FHQUQsR0FBQSxRQUFBLFNBQUFDLEdBRUEsSUFBQUssV0FBQVAsRUFBQXhCLFVBQ0EsR0FBQXdCLEVBQUF4QixVQUFBK0IsV0FBQUwsRUFBQUMsTUFFQSxZQURBSCxFQUFBUSxXQUFBTixHQUtBLE9BQUFGLEVBQUE1QixrQkFDQTRCLEVBQUFRLFdBQUFOLFFBQ0FGLEVBQUE1QixrQkFBQSxJQUlBLElBQUE0QixFQUFBcEMsT0FBQTZDLE1BQUFDLFFBQ0FWLEVBQUFRLFdBQUFOLFFBQ0FGLEVBQUFXLG9DQUlBWCxFQUFBWSwyQkFFQVgsR0FBQSxPQUFBLFNBQUFDLEdBQ0FXLE9BQUFDLFdBQUEsV0FDQWQsRUFBQVcsK0JBQ0EsUUFJQVAsb0JBQUEsU0FBQUYsR0FDQSxPQUFBNUQsS0FBQTZCLGtCQUNBN0IsS0FBQWtFLFdBQUFOLEdBQ0E1RCxLQUFBeUUsc0JBSUFWLDZCQUFBLFNBQUFILEdBQ0E1RCxLQUFBa0UsV0FBQU4sR0FDQSxJQUFBYyxFQUFBMUUsS0FBQTJFLDJCQUNBRCxFQUFBRSxHQUFBLGFBQUE1RSxLQUFBc0IsT0FBQTZDLE1BQUFDLE9BQUEsRUFDQXBFLEtBQUFzRSx5QkFDQUksRUFBQUUsR0FBQSxhQUFBRixFQUFBRyxLQUFBLE1BQUFULE9BQUEsSUFDQSxPQUFBcEUsS0FBQTZCLGdCQUNBN0IsS0FBQThFLDJCQUFBSixFQUFBRyxLQUFBLE1BQUEsSUFFQTdFLEtBQUErRSx3Q0FDQUwsRUFBQWQsRUFBQUMsUUFBQTdELEtBQUFrQyxVQUFBYyxVQUFBLEVBQUEsS0FLQWdCLHFCQUFBLFNBQUFKLEdBQ0E1RCxLQUFBa0UsV0FBQU4sR0FDQTVELEtBQUFxRSwrQkFHQUMsdUJBQUEsV0FDQSxJQUFBWixFQUFBMUQsS0FFQTBELEVBQUExQixtQkFFQTBCLEVBQUF6QixzQ0FBQSxHQUdBLE9BQUF5QixFQUFBM0IscUJBQ0F3QyxPQUFBUyxhQUFBdEIsRUFBQTNCLHFCQUdBMkIsRUFBQTNCLG9CQUFBd0MsT0FBQUMsV0FBQSxXQUNBZCxFQUFBM0Isb0JBQUEsS0FDQTJCLEVBQUF1Qix1QkFDQXZCLEVBQUF0Qyx1QkFHQTZELG9CQUFBLFdBQ0EsSUFBQXZCLEVBQUExRCxLQUVBLElBQUEwRCxFQUFBMUIsaUJBQUEsQ0FJQTBCLEVBQUExQixrQkFBQSxFQUVBMEIsRUFBQXpCLHNDQUFBLEVBQ0F5QixFQUFBd0Isc0JBSUEsSUFBQUMsRUFBQXpCLEVBQUFwQyxPQUFBRSxTQUFBQSxTQUFBSSxLQUFBLE1BQ0F3RCxFQUFBMUIsRUFBQXBDLE9BQUE2QyxNQUVBa0IsSUFBQUMsS0FBQUMsUUFBQUosRUFBQSxnQkFDQUssNkJBQUEsZUFDQUMsT0FBQS9CLEVBQUEvQixlQUNBeUQsT0FBQUEsRUFDQU0scUJBQUFOLEVBQ0FPLFFBQUEsU0FBQUMsR0FDQSxZQUFBQSxFQUFBQyxTQUlBbkMsRUFBQXBDLE9BQUFzRCxHQUFBLFdBQ0FsQixFQUFBb0MsMENBRUFwQyxFQUFBcUMsc0JBQ0FyQyxFQUFBMUIsa0JBQUEsRUFFQTBCLEVBQUF6QixzQ0FFQXlCLEVBQUF1Qiw0QkFPQWEsd0NBQUEsV0FDQSxJQUFBcEMsRUFBQTFELEtBQ0EwRCxFQUFBaUIsMEJBRUFFLEtBQUEsTUFBQVQsT0FBQSxFQUNBVixFQUFBc0MscUNBRUF0QyxFQUFBVywrQkFJQWEsb0JBQUEsV0FDQW5FLEVBQUEsNEdBQ0FrRixTQUFBakcsS0FBQXNCLE9BQUFFLFdBR0F1RSxvQkFBQSxXQUNBL0YsS0FBQXNCLE9BQUFFLFNBQUFxRCxLQUFBLGdDQUFBcUIsVUFHQUYsbUNBQUEsV0FDQSxJQUFBdEMsRUFBQTFELEtBQ0EwRSxFQUFBaEIsRUFBQWlCLDBCQUNBRCxFQUNBeUIsT0FDQTFFLEtBQ0EyRSxNQUFBMUMsRUFBQXBDLE9BQUErRSxlQUVBQyxVQUFBNUMsRUFBQXBDLE9BQUE2QyxPQUVBTyxFQUFBRyxLQUFBLE1BQ0FsQixHQUFBLGFBQUEsV0FDQUQsRUFBQTZDLGdDQUdBN0IsRUFBQUcsS0FBQSxNQUNBbEIsR0FBQSxZQUFBLFdBQ0FELEVBQUFlLHNCQUVBZCxHQUFBLGFBQUEsV0FDQUQsRUFBQW9CLDJCQUFBOUUsU0FJQThFLDJCQUFBLFNBQUEwQixHQUNBeEcsS0FBQXVHLDhCQUNBLElBQUFFLEVBQUExRixFQUFBeUYsR0FDQUMsRUFBQUMsU0FBQSwyQ0FDQTFHLEtBQUE2QixnQkFBQTRFLEdBR0FGLDRCQUFBLFdBQ0F2RyxLQUFBNkIsZ0JBQUEsS0FDQTdCLEtBQUEyRSwwQkFDQUUsS0FBQSw0Q0FDQThCLFlBQUEsNENBR0E1Qix3Q0FBQSxTQUFBTCxFQUFBa0MsR0FDQSxHQUFBQSxFQUFBLEVBQUEsQ0FDQSxJQUFBQyxFQUFBN0csS0FBQTZCLGdCQUFBaUYsT0FDQUQsRUFBQXpDLE9BQUEsRUFDQXBFLEtBQUE4RSwyQkFBQStCLEVBQUEsSUFHQTdHLEtBQUE4RSwyQkFBQUosRUFBQUcsS0FBQSxNQUFBLFFBRUEsQ0FDQSxJQUFBa0MsRUFBQS9HLEtBQUE2QixnQkFBQU4sT0FDQSxHQUFBd0YsRUFBQTNDLE9BQUEsRUFDQXBFLEtBQUE4RSwyQkFBQWlDLEVBQUEsUUFDQSxDQUVBLElBQUFDLEVBQUF0QyxFQUFBRyxLQUFBLE1BQ0E3RSxLQUFBOEUsMkJBQUFrQyxFQUFBQSxFQUFBNUMsT0FBQSxPQUtBSyxrQkFBQSxXQUNBLE9BQUF6RSxLQUFBNkIsa0JBQ0E3QixLQUFBOEIsa0JBQUEsRUFDQTlCLEtBQUFzQixPQUNBNkMsSUFBQW5FLEtBQUE2QixnQkFBQUQsS0FBQSxzQkFDQXFGLFNBQ0FDLFFBQ0FDLFFBQ0FuSCxLQUFBcUUsZ0NBSUFBLDRCQUFBLFdBQ0EsT0FBQXJFLEtBQUErQixxQkFDQXdDLE9BQUFTLGFBQUFoRixLQUFBK0IscUJBRUEvQixLQUFBNkIsZ0JBQUEsS0FDQTdCLEtBQUEyRSwwQkFBQXlDLFFBR0F6Qyx3QkFBQSxXQUNBLE9BQUE1RCxFQUFBc0csU0FBQUMsZUFBQXRILEtBQUEyQixrQkFHQXVDLFdBQUEsU0FBQU4sR0FDQUEsRUFBQTJELGtCQUNBM0QsRUFBQTRELG9CQS9SQSxDQW1TQUMsUUNuU0EsU0FBQTFHLEdBQ0FBLEVBQUFMLEdBQUFnSCxxQkFBQSxXQUVBLE9BQUExSCxLQUFBaUIsS0FBQSxXQUNBRixFQUFBLGtCQUFBNEMsR0FBQSxRQUFBLFNBQUFnRSxHQUNBNUcsRUFBQWYsTUFBQTRILFNBQUEsdUJBQ0FELEVBQUFKLHVCQU5BLENBWUFFLFFDVEEsU0FBQTFHLEdBQ0EsSUFBQThHLEVBQUEsV0FDQSxJQUFBQyxFQUFBLEVBQ0EsT0FBQSxTQUFBQyxFQUFBQyxHQUNBaEQsYUFBQThDLEdBQ0FBLEVBQUF0RCxXQUFBdUQsRUFBQUMsSUFKQSxHQVNBakgsRUFBQUwsR0FBQXVILHNCQUFBLFNBQUFDLEdBQ0EsT0FBQWxJLEtBQUFpQixLQUFBLFdBQ0EsSUFBQWtILEVBQUFwSCxFQUFBZixNQUNBbUksRUFBQWhCLE1BQUEsV0FDQVUsRUFBQSxXQUNBLElBR0FPLEVBSEFDLEVBQUFGLEVBQUFoRSxNQUlBLEdBQUErRCxFQUNBRSxFQUFBckgsRUFBQW1ILE9BQ0EsQ0FDQSxJQUFBSSxFQUFBSCxFQUFBdkcsS0FBQSxrQ0FDQXdHLEVBQUFySCxFQUFBdUgsR0FHQUYsRUFBQXZELEtBQUEsb0JBRUE1RCxLQUFBLFNBQUFzSCxFQUFBQyxHQUNBLElBQUFDLEVBQUExSCxFQUFBeUgsR0FDQUMsRUFBQTdELEdBQUEsdUJBQUF5RCxFQUFBLE1BQ0FJLEVBQUFDLFdBQUEsVUFDQUQsRUFBQW5DLFVBQUErQixJQUVBSSxFQUFBN0csS0FBQSxTQUFBLGFBSUEsVUF0Q0EsQ0EwQ0E2RixRQUVBLFNBQUExRyxHQUNBQSxFQUFBNEgsS0FBQSxLQUFBQyxtQkFBQTdILEVBQUE0SCxLQUFBRSxhQUFBLFNBQUFDLEdBQ0EsT0FBQSxTQUFBTixHQUNBLE9BQUFNLEdBQUEvSCxFQUFBeUgsR0FBQU8sT0FBQUMsY0FBQUMsUUFBQUgsRUFBQUUsZ0JBQUEsS0FIQSxDQU1BdkIsUUNuREEsU0FBQTFHLEdBR0EsSUFBQW1JLEVBQUEsS0FFQW5JLEVBQUFMLEdBQUF5SSxVQUFBLFdBQ0EsT0FBQW5KLEtBQUFpQixLQUFBLFdBQ0EsSUFBQW1JLEVBQUFySSxFQUFBZixNQUVBb0osRUFBQUMsS0FBQSxJQUVBSCxFQUFBSSxZQUFBLFdBQ0FGLEVBQUFHLE9BQUEsS0FFQUgsRUFBQUMsT0FBQWpGLE9BQUEsR0FDQWdGLEVBQUFDLEtBQUEsS0FFQSxRQUlBdEksRUFBQUwsR0FBQThJLFNBQUEsV0FDQSxPQUFBeEosS0FBQWlCLEtBQUEsV0FDQUYsRUFBQWYsTUFFQXFKLEtBQUEsSUFDQTlFLE9BQUFrRixjQUFBUCxNQTFCQSxDQThCQXpCLFFDdkNBLFNBQUExRyxHQUNBQSxFQUFBTCxHQUFBNEYsVUFBQSxTQUFBb0QsR0FDQSxJQUNBQyxFQUFBLElBQUFDLE9BQUFGLEVBQUEsTUFFQUcsRUFBQTdKLEtBQUE2RSxLQUFBLEtBT0EsT0FOQTdFLEtBQUFpQixLQUFBLFdBQ0E0SSxFQUFBQyxLQUFBOUosTUFDQWUsRUFBQWYsTUFBQTZFLEtBQUEsdUJBQUFrRixXQUFBQyxTQUNBaEssS0FBQWlLLGNBR0FKLEVBQUE1SSxLQUFBLFdBQ0EsSUFBQWtILEVBQUFwSCxFQUFBZixNQUVBMEosR0FBQSxLQUFBQSxHQUNBdkIsRUFBQTRCLFdBQ0FHLE9BQUEsV0FDQSxPQUFBLElBQUFsSyxLQUFBbUssVUFBQVIsRUFBQTdKLEtBQUFFLEtBQUFvSyxhQUVBQyxZQUFBLFdBQ0EsT0FBQXJLLEtBQUFvSyxXQUFBLElBQUFFLFFBQUFYLEVBQUEsU0FBQVksR0FDQSxNQUFBLG9DQUFBQSxFQUFBLGlCQXRCQSxDQTRCQTlDLFFDNUJBLFNBQUExRyxHQUVBQSxFQUFBTCxHQUFBOEosaUJBQUEsV0FDQSxJQUVBQyxFQUZBMUosRUFBQWYsTUFFQTZFLEtBQUEsNENBQ0E2RixFQUFBRCxFQUFBcEIsT0FDQWlCLFFBQUEsUUFBQSxLQUNBQSxRQUFBLE9BQUEsS0FDQUEsUUFBQSxPQUFBLEtBQ0FLLEdBQUEsSUFBQUMsU0FBQUMsV0FBQUMsU0FBQUosR0FFQUQsRUFBQU0sUUFDQU4sRUFBQWxCLE9BQUFvQixJQWJBLENBZUFsRCxRQ2ZBLG9CQUFBdUQsU0FDQUEsV0FFQUEsT0FBQUMsU0FFQUQsT0FBQUMsTUFBQUMsS0FBQSxTQUFBQyxHQUVBcEssRUFBQSwrQkFBQW9LLEVBQUEsS0FBQUYsT0FBQTlFLE1BQUEsRUFBQWlGLFVBQUEsRUFBQUMsU0FBQSxZQUdBTCxPQUFBQyxNQUFBSyxNQUFBLFNBQUFILEdBRUFwSyxFQUFBLCtCQUFBb0ssRUFBQSxLQUFBRixNQUFBLFNDTEEsU0FBQWxLLEdBRUFBLEVBQUFMLEdBQUE2SyxvQkFBQSxTQUFBQyxHQUNBLE9BQUF4TCxLQUFBaUIsS0FBQSxXQUNBLElBQUF3SyxFQUFBekwsS0FBQXdMLE1BS0EsSUFBQUMsRUFBQXhMLE1BQUFDLFFBQ0FFLEtBQUEsU0FBQXNMLEVBQUFGLEdBQ0F4TCxLQUFBc0IsT0FBQVAsRUFBQTJLLEdBQUE3RyxLQUFBLFNBQ0E3RSxLQUFBMkwsYUFDQTNMLEtBQUE0TCxhQUFBSixHQUNBeEwsS0FBQTZMLGVBQ0E3TCxLQUFBOEwsZUFDQTlMLEtBQUErTCxpQkFDQS9MLEtBQUFnTSxtQkFHQUwsV0FBQSxXQUNBLElBQUFqSSxFQUFBMUQsS0FDQUEsS0FBQXNCLE9BQ0FvRixTQUFBLGlDQUNBdUYsS0FBQSxXQUNBdkksRUFBQXdJLG9CQUVBMUssU0FBQWtGLFNBQUEsZ0JBR0FrRixhQUFBLFNBQUFKLEdBQ0EsSUFBQVcsR0FDQUMsS0FBQSxFQUNBQyxVQUFBLEdBRUFyTSxLQUFBc00sU0FBQXZMLEVBQUFiLFVBQUFpTSxFQUFBWCxRQUdBZSxJQUFBdk0sS0FBQXNNLFNBQUFGLE9BQ0FwTSxLQUFBc00sU0FBQUYsS0FBQSxFQUFBcE0sS0FBQXNNLFNBQUFGLFdBRUFHLElBQUF2TSxLQUFBc00sU0FBQUUsTUFDQXhNLEtBQUFzTSxTQUFBRSxJQUFBLEVBQUF4TSxLQUFBc00sU0FBQUUsVUFFQUQsSUFBQXZNLEtBQUFzTSxTQUFBRyxNQUNBek0sS0FBQXNNLFNBQUFHLElBQUEsRUFBQXpNLEtBQUFzTSxTQUFBRyxNQUlBWCxhQUFBLFdBQ0EsSUFBQVksRUFBQTNMLEVBQUEsU0FDQTJGLFNBQUEsc0JBQ0FpRyxZQUFBM00sS0FBQXNCLFFBRUFzTCxFQUFBN0wsRUFBQSxVQUNBMkYsU0FBQSxvQkFDQUEsU0FBQSxtQ0FDQVQsU0FBQXlHLEdBRUFoSixFQUFBMUQsS0FDQWUsRUFBQSxVQUNBMkYsU0FBQSxrQ0FDQUEsU0FBQSxrQ0FDQUEsU0FBQSxXQUNBLE9BQUFoRCxFQUFBNEksU0FBQUQsU0FBQSxXQUFBLEtBRUFRLE1BQUEsV0FDQW5KLEVBQUE0SSxTQUFBRCxVQUNBM0ksRUFBQW9KLG9CQUdBN0csU0FBQTJHLEdBRUE3TCxFQUFBLFVBQ0EyRixTQUFBLG9DQUNBQSxTQUFBLGtDQUNBQSxTQUFBLFdBQ0EsT0FBQWhELEVBQUE0SSxTQUFBRCxTQUFBLFdBQUEsS0FFQVEsTUFBQSxXQUNBbkosRUFBQTRJLFNBQUFELFVBQ0EzSSxFQUFBcUosb0JBR0E5RyxTQUFBMkcsSUFHQWIsZUFBQSxXQUNBLElBQUFySSxFQUFBMUQsS0FDQUEsS0FBQXNCLE9BQUEwTCxRQUFBLFNBQUFwSixHQUNBLEtBQUFBLEVBQUFDLE9BQ0FELEVBQUEyRCxrQkFDQTNELEVBQUE0RCxpQkFDQTlELEVBQUFvSixtQkFDQSxLQUFBbEosRUFBQUMsUUFDQUQsRUFBQTJELGtCQUNBM0QsRUFBQTRELGlCQUNBOUQsRUFBQXFKLHNCQUtBZixnQkFBQSxXQUNBLElBQUF0SSxFQUFBMUQsS0FDQUEsS0FBQXNCLE9BQUFxQyxHQUFBLDRCQUFBLFNBQUFDLEdBQ0EsR0FBQUYsRUFBQXBDLE9BQUFzRCxHQUFBLFVBQUEsQ0FJQSxJQUFBcUksRUFBQXJKLEVBQUFzSixjQUFBQyxhQUFBdkosRUFBQXNKLGNBQUFFLFNBQUF4SixFQUFBc0osY0FBQUcsT0FFQXpKLEVBQUEyRCxrQkFDQTNELEVBQUE0RCxpQkFFQXlGLEVBQUEsRUFDQXZKLEVBQUFxSixrQkFFQXJKLEVBQUFvSixzQkFLQWpCLGFBQUEsV0FDQTdMLEtBQUFzTixTQUFBLEtBQ0F0TixLQUFBdU4sYUFBQSxFQUVBLElBQUFDLEVBQUF4TixLQUFBc0IsT0FBQTZDLE1BQ0EsSUFBQW5FLEtBQUF5TixlQUFBRCxHQUFBLENBQ0EsSUFBQUUsRUFBQUMsU0FBQUgsR0FDQUksTUFBQUYsS0FDQTFOLEtBQUE2TixXQUFBSCxHQUNBMU4sS0FBQXVOLGFBQUEsR0FJQXZOLEtBQUF1TixhQUNBdk4sS0FBQTZOLFdBQUEsSUFJQTNCLGdCQUFBLFdBQ0EsSUFBQXNCLEVBQUF4TixLQUFBc0IsT0FBQTZDLE1BQ0EsR0FBQW5FLEtBQUF5TixlQUFBRCxHQUNBeE4sS0FBQXNCLE9BQUE2QyxJQUFBLElBQ0FuRSxLQUFBNk4sV0FBQSxHQUNBN04sS0FBQXVOLGFBQUEsTUFDQSxDQUNBLElBQUFHLEVBQUFDLFNBQUFILEdBQ0FJLE1BQUFGLEdBQ0ExTixLQUFBdU4sWUFDQXZOLEtBQUFzQixPQUFBNkMsSUFBQW5FLEtBQUFzTixXQUVBdE4sS0FBQXNCLE9BQUE2QyxJQUFBLElBQ0FuRSxLQUFBNk4sV0FBQSxHQUNBN04sS0FBQXVOLGFBQUEsSUFHQXZOLEtBQUE2TixXQUFBSCxHQUNBMU4sS0FBQXNCLE9BQUE2QyxJQUFBbkUsS0FBQXNOLFVBQ0F0TixLQUFBdU4sYUFBQSxLQUtBVCxnQkFBQSxXQUNBOU0sS0FBQXVOLFlBQ0F2TixLQUFBNk4sV0FBQTdOLEtBQUFzTixTQUFBdE4sS0FBQXNNLFNBQUFGLE1BRUFwTSxLQUFBdU4sYUFBQSxFQUVBdk4sS0FBQXNCLE9BQUE2QyxJQUFBbkUsS0FBQXNOLFVBQ0F0TixLQUFBc0IsT0FBQTJGLFVBR0E4RixnQkFBQSxXQUNBL00sS0FBQXVOLFlBQ0F2TixLQUFBNk4sV0FBQTdOLEtBQUFzTixTQUFBdE4sS0FBQXNNLFNBQUFGLE1BRUFwTSxLQUFBdU4sYUFBQSxFQUVBdk4sS0FBQXNCLE9BQUE2QyxJQUFBbkUsS0FBQXNOLFVBQ0F0TixLQUFBc0IsT0FBQTJGLFVBR0F3RyxlQUFBLFNBQUFELEdBQ0EsT0FBQSxJQUFBQSxFQUFBcEosU0FBQW9KLEVBQUFNLFFBR0FELFdBQUEsU0FBQUwsUUFDQWpCLElBQUF2TSxLQUFBc00sU0FBQUUsS0FBQWdCLEVBQUF4TixLQUFBc00sU0FBQUUsSUFDQXhNLEtBQUFzTixTQUFBdE4sS0FBQXNNLFNBQUFFLFNBQ0FELElBQUF2TSxLQUFBc00sU0FBQUcsS0FBQWUsRUFBQXhOLEtBQUFzTSxTQUFBRyxJQUNBek0sS0FBQXNOLFNBQUF0TixLQUFBc00sU0FBQUcsSUFFQXpNLEtBQUFzTixTQUFBRSxLQWxNQSxDQXNNQS9GLFFDN01BLG9CQUFBdUQsU0FDQUEsV0FFQUEsT0FBQStDLGVBS0EvQyxPQUFBK0MsWUFBQUMsUUFBQSxXQUNBQyxjQUVBeEcsT0FBQSxpQ0FBQXhHLEtBQUEsV0FDQSxJQUFBaU4sRUFBQXpHLE9BQUF6SCxNQUFBNkUsS0FBQSxZQUFBc0osUUFDQUMsRUFBQTNHLE9BQUF6SCxNQUFBNkUsS0FBQSxZQUFBd0osWUFHQSxJQUFBSCxFQUFBN0UsU0FDQTZFLEVBQUE3RSxPQUFBeUUsUUFDQUksRUFBQWhJLGVBR0EsSUFBQWtJLEVBQUEvRSxTQUNBK0UsRUFBQS9FLE9BQUF5RSxRQUNBTSxFQUFBbEksYUNuQkEsU0FBQW5GLEdBRUFBLEVBQUFMLEdBQUE0TixvQkFBQSxTQUFBQyxHQUVBLElBQUFDLE9BQUFqQyxJQUFBZ0MsRUFBQXhOLEVBQUFmLE1BQUFtTyxRQUFBSSxTQUFBRSxJQUFBMU4sRUFBQWYsTUFBQW1PLFFBQUFJLFNBQUFFLElBQUFGLEVBQ0F4TixFQUFBLGNBQUEyTixTQUFBQyxVQUFBSCxFQUFBLE1BQUEsU0FHQXpOLEVBQUFMLEdBQUFrTyxtQkFBQSxTQUFBTCxHQUVBLElBQUFDLE9BQUFqQyxJQUFBZ0MsRUFBQXhOLEVBQUFmLE1BQUFxTyxPQUFBRSxTQUFBRSxJQUFBMU4sRUFBQWYsTUFBQXFPLE9BQUFFLFNBQUFFLElBQUFGLEVBQ0F4TixFQUFBLGNBQUEyTixTQUFBQyxVQUFBSCxFQUFBLE1BQUEsU0FYQSxDQWFBL0csUUNWQSxTQUFBMUcsR0FFQUEsRUFBQUwsR0FBQW1PLHNCQUFBLFNBQUFDLEVBQUFDLEdBU0EsU0FBQUMsRUFBQUMsR0FDQSxJQUFBQyxLQVVBLE9BUkFELEVBQUFwSyxLQUFBLDREQUFBNUQsS0FBQSxTQUFBa08sRUFBQUMsR0FDQSxJQUFBQyxFQUFBdE8sRUFBQXFPLEdBQUE1TixPQUFBLHVDQUNBME4sRUFBQXBGLE1BQ0F3RixXQUFBRCxFQUFBek4sS0FBQSxnQ0FDQTJOLFFBQUFGLEVBQUF4SyxLQUFBLHdCQUFBRCxHQUFBLGdCQUlBc0ssRUFsQkEsT0FBQWxQLEtBQUFpQixLQUFBLFdBQ0EsSUFBQWdPLEVBQUFsTyxFQUFBZixNQUVBd1AsRUFBQUMsS0FBQUMsVUFBQVYsRUFBQUMsSUFDQVUsWUFBQUMsS0FBQUMsWUFBQVosRUFBQXJOLEtBQUEsTUFBQSxTQUFBa04sRUFBQVUsRUFBQVQsTUFrQkFoTyxFQUFBTCxHQUFBb1AsWUFBQSxTQUFBaEIsRUFBQUMsRUFBQWdCLEVBQUFDLEdBaUJBLFNBQUFDLEVBQUFoQixHQUNBLElBQUFDLEtBVUEsT0FSQUQsRUFBQXBLLEtBQUEsNERBQUE1RCxLQUFBLFNBQUFrTyxFQUFBQyxHQUNBLElBQUFDLEVBQUF0TyxFQUFBcU8sR0FBQTVOLE9BQUEsdUNBQ0EwTixFQUFBcEYsTUFDQXdGLFdBQUFELEVBQUF6TixLQUFBLGdDQUNBRixTQUFBeU4sTUFJQUQsRUFHQSxTQUFBZ0IsRUFBQWpCLEVBQUFlLEdBR0EsSUFBQUcsRUFBQWxCLEVBQUFwSyxLQUFBLDRCQUFBbUwsRUFBQSxNQUNBSSxFQUFBRCxFQUFBNU8sT0FLQThPLEVBQUFGLEVBQUFHLFNBQ0FGLEVBQUFHLE9BQUFGLEdBR0EsU0FBQUcsRUFBQXZCLEVBQUFlLEdBR0EsSUFBQUcsRUFBQWxCLEVBQUFwSyxLQUFBLDRCQUFBbUwsRUFBQSxNQUNBSSxFQUFBRCxFQUFBckosT0FLQXVKLEVBQUFGLEVBQUFHLFNBQ0FGLEVBQUFLLE1BQUFKLEdBcERBLE9BQUFyUSxLQUFBaUIsS0FBQSxXQUNBLElBQUFnTyxFQUFBbE8sRUFBQWYsTUFFQStQLEVBRUFHLEVBQUFqQixFQUFBZSxHQUdBUSxFQUFBdkIsRUFBQWUsR0FHQSxJQUFBUixFQUFBQyxLQUFBQyxVQUFBTyxFQUFBaEIsSUFDQVUsWUFBQUMsS0FBQUMsWUFBQVosRUFBQXJOLEtBQUEsTUFBQSxRQUFBa04sRUFBQVUsRUFBQVQsTUF4Q0EsQ0FtRkF0SCxRQzFGQSxTQUFBMUcsR0FFQUEsRUFBQUwsR0FBQWdRLG9CQUFBLFNBQUE5SyxHQUNBLE9BQUE1RixLQUFBaUIsS0FBQSxXQUNBLElBQUEwUCxFQUFBNVAsRUFBQWYsTUFFQTJRLEVBQUE5TCxLQUFBLDJCQUFBbEIsR0FBQSxPQUFBLFdBQ0FnTixFQUFBQyxRQUFBLGFBS0E3UCxFQUFBTCxHQUFBbVEsZUFBQSxTQUFBakwsR0FDQSxJQUFBK0ssRUFBQTVQLEVBQUFmLE1BSUE4USxFQUFBckosT0FBQSxTQUFBN0IsRUFBQW1MLGNBQUEsS0FFQUMsR0FDQUMsUUFBQXJMLEVBQUFxTCxRQUNBQyxNQUFBdEwsRUFBQXNMLE1BQ0FDLFVBQUF2TCxFQUFBdUwsVUFDQUMsa0JBQUF4TCxFQUFBd0wsa0JBQ0FDLGtCQUFBekwsRUFBQXlMLGtCQUNBQyxvQkFBQTFMLEVBQUEwTCxvQkFDQVIsUUFBQUEsRUFBQXpILE9BQUF5RSxRQUtBZ0QsRUFBQTVLLFNBRUF5SyxFQUFBWSxjQUFBUCxJQUdBalEsRUFBQUwsR0FBQTZRLGNBQUEsU0FBQTNMLEdBQ0EsT0FBQTVGLEtBQUFpQixLQUFBLFdBQ0EsSUFBQTBQLEVBQUE1UCxFQUFBZixNQUNBaVIsRUFBQXJMLEVBQUFxTCxRQUFBckwsRUFBQXFMLFFBQUEsUUFPQXJMLEVBQUF5TCxtQkFDQVYsRUFBQS9PLEtBQUEsbUNBQUFnRSxFQUFBeUwsbUJBRUF6TCxFQUFBMEwscUJBQ0FYLEVBQUEvTyxLQUFBLHFDQUFBZ0UsRUFBQTBMLHFCQUVBWCxFQUFBN0osT0FBQWMsU0FBQSxZQUNBK0ksRUFBQTdKLE9BQUFaLFNBSUF5SyxFQUFBQyxTQUNBSyxRQUFBQSxFQUNBRSxVQUFBLFNBQUFQLEVBQUFZLEdBQ0EsT0FBQTVMLEVBQUF1TCxVQUFBdkwsRUFBQXVMLFVBQUF2TCxFQUFBd0wsa0JBQUF4TCxFQUFBd0wsbUJBQUEsSUFBQXpCLFlBQUE4QixTQUFBQyx5QkFBQWQsRUFBQVksSUFFQU4sTUFBQXRMLEVBQUFzTCxNQUNBN0gsTUFBQSxFQUNBeUgsUUFBQWxMLEVBQUFrTCxRQUNBYSxTQUFBL0wsRUFBQStMLGNBakVBLENBcUVBbEsiLCJmaWxlIjoiYnV0dGVyZmFjZXMtanMtYnVuZGxlLm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIFNpbXBsZSBKYXZhU2NyaXB0IEluaGVyaXRhbmNlXG4gKiBCeSBKb2huIFJlc2lnIGh0dHA6Ly9lam9obi5vcmcvXG4gKiBNSVQgTGljZW5zZWQuXG4gKi9cbi8vIEluc3BpcmVkIGJ5IGJhc2UyIGFuZCBQcm90b3R5cGVcbihmdW5jdGlvbigpe1xuICAgIHZhciBpbml0aWFsaXppbmcgPSBmYWxzZSwgZm5UZXN0ID0gL3h5ei8udGVzdChmdW5jdGlvbigpe3h5ejt9KSA/IC9cXGJfc3VwZXJcXGIvIDogLy4qLztcblxuICAgIC8vIFRoZSBiYXNlIENsYXNzIGltcGxlbWVudGF0aW9uIChkb2VzIG5vdGhpbmcpXG4gICAgdGhpcy5DbGFzcyA9IGZ1bmN0aW9uKCl7fTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBDbGFzcyB0aGF0IGluaGVyaXRzIGZyb20gdGhpcyBjbGFzc1xuICAgIENsYXNzLmV4dGVuZCA9IGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgdmFyIF9zdXBlciA9IHRoaXMucHJvdG90eXBlO1xuXG4gICAgICAgIC8vIEluc3RhbnRpYXRlIGEgYmFzZSBjbGFzcyAoYnV0IG9ubHkgY3JlYXRlIHRoZSBpbnN0YW5jZSxcbiAgICAgICAgLy8gZG9uJ3QgcnVuIHRoZSBpbml0IGNvbnN0cnVjdG9yKVxuICAgICAgICBpbml0aWFsaXppbmcgPSB0cnVlO1xuICAgICAgICB2YXIgcHJvdG90eXBlID0gbmV3IHRoaXMoKTtcbiAgICAgICAgaW5pdGlhbGl6aW5nID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ29weSB0aGUgcHJvcGVydGllcyBvdmVyIG9udG8gdGhlIG5ldyBwcm90b3R5cGVcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBwcm9wKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBmdW5jdGlvblxuICAgICAgICAgICAgcHJvdG90eXBlW25hbWVdID0gdHlwZW9mIHByb3BbbmFtZV0gPT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2YgX3N1cGVyW25hbWVdID09IFwiZnVuY3Rpb25cIiAmJiBmblRlc3QudGVzdChwcm9wW25hbWVdKSA/XG4gICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbihuYW1lLCBmbil7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHRoaXMuX3N1cGVyO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGEgbmV3IC5fc3VwZXIoKSBtZXRob2QgdGhhdCBpcyB0aGUgc2FtZSBtZXRob2RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgb24gdGhlIHN1cGVyLWNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3VwZXIgPSBfc3VwZXJbbmFtZV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbWV0aG9kIG9ubHkgbmVlZCB0byBiZSBib3VuZCB0ZW1wb3JhcmlseSwgc28gd2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXQgd2hlbiB3ZSdyZSBkb25lIGV4ZWN1dGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N1cGVyID0gdG1wO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pKG5hbWUsIHByb3BbbmFtZV0pIDpcbiAgICAgICAgICAgICAgICAgICAgcHJvcFtuYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBkdW1teSBjbGFzcyBjb25zdHJ1Y3RvclxuICAgICAgICBmdW5jdGlvbiBDbGFzcygpIHtcbiAgICAgICAgICAgIC8vIEFsbCBjb25zdHJ1Y3Rpb24gaXMgYWN0dWFsbHkgZG9uZSBpbiB0aGUgaW5pdCBtZXRob2RcbiAgICAgICAgICAgIGlmICggIWluaXRpYWxpemluZyAmJiB0aGlzLmluaXQgKVxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUG9wdWxhdGUgb3VyIGNvbnN0cnVjdGVkIHByb3RvdHlwZSBvYmplY3RcbiAgICAgICAgQ2xhc3MucHJvdG90eXBlID0gcHJvdG90eXBlO1xuXG4gICAgICAgIC8vIEVuZm9yY2UgdGhlIGNvbnN0cnVjdG9yIHRvIGJlIHdoYXQgd2UgZXhwZWN0XG4gICAgICAgIENsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENsYXNzO1xuXG4gICAgICAgIC8vIEFuZCBtYWtlIHRoaXMgY2xhc3MgZXh0ZW5kYWJsZVxuICAgICAgICBDbGFzcy5leHRlbmQgPSBhcmd1bWVudHMuY2FsbGVlO1xuXG4gICAgICAgIHJldHVybiBDbGFzcztcbiAgICB9O1xufSkoKTsiLCIvKipcbiAqIGpRdWVyeS1QbHVnaW4gXCJidXR0ZXJIYW5kbGVBdXRvQ29tcGxldGVcIiBmb3IgdGV4dCBhdXRvY29tcGxldGUgdGFnLiBJbml0aWFsaXplcyBhdXRvIGNvbXBsZXRlIGZ1bmN0aW9uYWxpdHkgdG9cbiAqIHRleHQgY29tcG9uZW50LlxuICpcbiAqIEhvdyB0byB1c2U6XG4gKiBqUXVlcnkoXCIjc2VsZWN0b3JcIikuX2J1dHRlckF1dG9Db21wbGV0ZUluaXQoKTtcbiAqL1xuKGZ1bmN0aW9uICgkKSB7XG4gICAgLy8gZXh0ZW5kIGpRdWVyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgJC5mbi5fYnV0dGVyQXV0b0NvbXBsZXRlSW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBuZXcgQXV0b2NvbXBsZXRlTGlzdCh0aGlzKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIGRlZmluZSBvYmplY3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICB2YXIgQXV0b2NvbXBsZXRlTGlzdCA9IENsYXNzLmV4dGVuZCh7XG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uIChyb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5TRUFSQ0hfUkVRVUVTVF9ERUxBWSA9IDMwMDsvLyBpbiBtc1xuXG4gICAgICAgICAgICB2YXIgJGF1dG9jb21wbGV0ZVRtcCA9ICQocm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy4kaW5wdXQgPSAkYXV0b2NvbXBsZXRlVG1wLnByZXYoKTtcbiAgICAgICAgICAgIHRoaXMuJGlucHV0LnBhcmVudCgpLmNzcyh7cG9zaXRpb246IFwicmVsYXRpdmVcIn0pO1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVJZCA9ICRhdXRvY29tcGxldGVUbXAuYXR0cihcImlkXCIpO1xuICAgICAgICAgICAgdGhpcy4kc2VsZWN0ZWRPcHRpb24gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5pZ25vcmVLZXl1cEV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3REZWxheVRpbWVySWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5pc1JlcXVlc3RSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFyZUNoYW5nZXNNYWRlV2hpbGVSZXF1ZXN0V2FzUnVubmluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLl9rZXlDb2RlcyA9IHtcbiAgICAgICAgICAgICAgICAvL2JhY2tzcGFjZTogOCxcbiAgICAgICAgICAgICAgICB0YWI6IDksXG4gICAgICAgICAgICAgICAgZW50ZXI6IDEzLFxuICAgICAgICAgICAgICAgIHNoaWZ0OiAxNixcbiAgICAgICAgICAgICAgICBjdHJsOiAxNyxcbiAgICAgICAgICAgICAgICBhbHQ6IDE4LFxuICAgICAgICAgICAgICAgIHBhdXNlOiAxOSxcbiAgICAgICAgICAgICAgICBjYXBzX2xvY2s6IDIwLFxuICAgICAgICAgICAgICAgIGVzY2FwZTogMjcsXG4gICAgICAgICAgICAgICAgcGFnZV91cDogMzMsXG4gICAgICAgICAgICAgICAgcGFnZV9kb3duOiAzNCxcbiAgICAgICAgICAgICAgICBlbmQ6IDM1LFxuICAgICAgICAgICAgICAgIGhvbWU6IDM2LFxuICAgICAgICAgICAgICAgIGFycm93X2xlZnQ6IDM3LFxuICAgICAgICAgICAgICAgIGFycm93X3VwOiAzOCxcbiAgICAgICAgICAgICAgICBhcnJvd19yaWdodDogMzksXG4gICAgICAgICAgICAgICAgYXJyb3dfZG93bjogNDAsXG4gICAgICAgICAgICAgICAgaW5zZXJ0OiA0NSxcbiAgICAgICAgICAgICAgICAvLyAnZGVsZXRlJyBpcyBhIHJlc2VydmVkIGtleSB3b3JkXG4gICAgICAgICAgICAgICAgZGVsZXRlX2tleTogNDYsXG4gICAgICAgICAgICAgICAgbGVmdF93aW5kb3dfa2V5OiA5MSxcbiAgICAgICAgICAgICAgICByaWdodF93aW5kb3dfa2V5OiA5MixcbiAgICAgICAgICAgICAgICBzZWxlY3Rfa2V5OiA5MyxcbiAgICAgICAgICAgICAgICBudW1fbG9jazogMTQ0LFxuICAgICAgICAgICAgICAgIHNjcm9sbF9sb2NrOiAxNDVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIHNlbGYuJGlucHV0XG4gICAgICAgICAgICAgICAgICAgIC5vbihcImtleWRvd25cIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IHNlbGYuX2tleUNvZGVzLmVudGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlRW50ZXJLZXlEb3duKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQud2hpY2ggPT09IHNlbGYuX2tleUNvZGVzLmFycm93X3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50LndoaWNoID09PSBzZWxmLl9rZXlDb2Rlcy5hcnJvd19kb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlQXJyb3dVcEFuZERvd25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQud2hpY2ggPT09IHNlbGYuX2tleUNvZGVzLmVzY2FwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZUVzY2FwZUtleURvd24oZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAub24oXCJrZXl1cFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGhhbmRsZSBvdGhlciBrZXlzIHRoYW4gY2hhcmFjdGVyIGtleXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoa2V5TmFtZSBpbiBzZWxmLl9rZXlDb2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9rZXlDb2Rlc1trZXlOYW1lXSA9PT0gZXZlbnQud2hpY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaWdub3JlS2V5dXBFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVLZXl1cEV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi4kaW5wdXQudmFsKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9oaWRlQXV0b2NvbXBsZXRlUmVzdWx0TGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHJ5U2VuZEpzZkFqYXhSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5vbihcImJsdXJcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faGlkZUF1dG9jb21wbGV0ZVJlc3VsdExpc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVFbnRlcktleURvd246IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuJHNlbGVjdGVkT3B0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRTZWxlY3RlZFZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2hhbmRsZUFycm93VXBBbmREb3duS2V5RG93bjogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgdmFyICRhdXRvY29tcGxldGUgPSB0aGlzLl9nZXRBdXRvY29tcGxldGVFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAoISRhdXRvY29tcGxldGUuaXMoXCI6dmlzaWJsZVwiKSAmJiB0aGlzLiRpbnB1dC52YWwoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJ5U2VuZEpzZkFqYXhSZXF1ZXN0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCRhdXRvY29tcGxldGUuaXMoXCI6dmlzaWJsZVwiKSAmJiAkYXV0b2NvbXBsZXRlLmZpbmQoXCJsaVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNlbGVjdGVkT3B0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdFJlc3VsdE9wdGlvbkVsZW1lbnQoJGF1dG9jb21wbGV0ZS5maW5kKFwibGlcIilbMF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVSZXN1bHRPcHRpb25FbGVtZW50U2VsZWN0aW9uQ3Vyc29yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhdXRvY29tcGxldGUsIGV2ZW50LndoaWNoID09PSB0aGlzLl9rZXlDb2Rlcy5hcnJvd191cCA/IC0xIDogMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVFc2NhcGVLZXlEb3duOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgICB0aGlzLl9oaWRlQXV0b2NvbXBsZXRlUmVzdWx0TGlzdCgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIF90cnlTZW5kSnNmQWpheFJlcXVlc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgaWYgKHNlbGYuaXNSZXF1ZXN0UnVubmluZykge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVxdWVzdCBpcyBhY3RpdmUsIHNvIHJlbWVtYmVyIHRoYXQgY2hhbmdlcyBoYXMgYmVlbiBtYWRlIHdoaWxlIHJlcXVlc3Qgd2FzIHJ1bm5pbmdcIik7XG4gICAgICAgICAgICAgICAgc2VsZi5hcmVDaGFuZ2VzTWFkZVdoaWxlUmVxdWVzdFdhc1J1bm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VsZi5yZXF1ZXN0RGVsYXlUaW1lcklkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChzZWxmLnJlcXVlc3REZWxheVRpbWVySWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGYucmVxdWVzdERlbGF5VGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnJlcXVlc3REZWxheVRpbWVySWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRKc2ZBamF4UmVxdWVzdCgpO1xuICAgICAgICAgICAgfSwgc2VsZi5TRUFSQ0hfUkVRVUVTVF9ERUxBWSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3NlbmRKc2ZBamF4UmVxdWVzdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVlc3RSdW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZXF1ZXN0IGlzIHJ1bm5pbmcsIGFib3J0XCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYuaXNSZXF1ZXN0UnVubmluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIHNlbGYuYXJlQ2hhbmdlc01hZGVXaGlsZVJlcXVlc3RXYXNSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBzZWxmLl9zaG93TG9hZGluZ1NwaW5uZXIoKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdGFydGluZyByZXF1ZXN0XCIpO1xuXG4gICAgICAgICAgICB2YXIgaWQgPSBzZWxmLiRpbnB1dC5wYXJlbnQoKS5wYXJlbnQoKS5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHNlbGYuJGlucHV0LnZhbCgpO1xuXG4gICAgICAgICAgICBqc2YuYWpheC5yZXF1ZXN0KGlkLCBcImF1dG9jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgXCJqYXZheC5mYWNlcy5iZWhhdmlvci5ldmVudFwiOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICAgICAgICAgIHJlbmRlcjogc2VsZi5hdXRvY29tcGxldGVJZCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgICAgICBcImJ1dHRlcmZhY2VzLnBhcmFtc1wiOiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgb25ldmVudDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZXF1ZXN0IGZpbmlzaGVkXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHNob3cgcmVzdWx0IGlmIGlucHV0IGZpZWxkIHN0aWxsIGhhcyBmb2N1c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuJGlucHV0LmlzKFwiOmZvY3VzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlQXV0b2NvbXBsZXRlUmVzdWx0TGlzdFZpc2liaWxpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hpZGVMb2FkaW5nU3Bpbm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pc1JlcXVlc3RSdW5uaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmFyZUNoYW5nZXNNYWRlV2hpbGVSZXF1ZXN0V2FzUnVubmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2hhbmdlcyBtYWRlIHdoaWxlIHJlcXVlc3Qgd2FzIHJ1bm5pbmcsIHN0YXJ0IG5ldyByZXF1ZXN0IGF1dG9tYXRpY2FsbHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2VuZEpzZkFqYXhSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaGFuZGxlQXV0b2NvbXBsZXRlUmVzdWx0TGlzdFZpc2liaWxpdHk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIHZhciAkYXV0b2NvbXBsZXRlID0gc2VsZi5fZ2V0QXV0b2NvbXBsZXRlRWxlbWVudCgpO1xuXG4gICAgICAgICAgICBpZiAoJGF1dG9jb21wbGV0ZS5maW5kKFwibGlcIikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlbGYuX2luaXRBbmRTaG93QXV0b2NvbXBsZXRlUmVzdWx0TGlzdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9oaWRlQXV0b2NvbXBsZXRlUmVzdWx0TGlzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9zaG93TG9hZGluZ1NwaW5uZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQoJzxkaXYgY2xhc3M9XCJidXR0ZXItZHJvcGRvd25saXN0LXNwaW5uZXItY29udGFpbmVyXCI+PGRpdiBjbGFzcz1cImJ1dHRlci1kcm9wZG93bmxpc3Qtc3Bpbm5lclwiPjwvZGl2PjwvZGl2PicpXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyh0aGlzLiRpbnB1dC5wYXJlbnQoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2hpZGVMb2FkaW5nU3Bpbm5lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy4kaW5wdXQucGFyZW50KCkuZmluZChcIi5idXR0ZXItZHJvcGRvd25saXN0LXNwaW5uZXJcIikucmVtb3ZlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2luaXRBbmRTaG93QXV0b2NvbXBsZXRlUmVzdWx0TGlzdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdmFyICRhdXRvY29tcGxldGUgPSBzZWxmLl9nZXRBdXRvY29tcGxldGVFbGVtZW50KCk7XG4gICAgICAgICAgICAkYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIC5zaG93KClcbiAgICAgICAgICAgICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2VsZi4kaW5wdXQuaW5uZXJXaWR0aCgpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5oaWdobGlnaHQoc2VsZi4kaW5wdXQudmFsKCkpO1xuXG4gICAgICAgICAgICAkYXV0b2NvbXBsZXRlLmZpbmQoXCJ1bFwiKVxuICAgICAgICAgICAgICAgICAgICAub24oXCJtb3VzZWxlYXZlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NsZWFyUmVzdWx0T3B0aW9uU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkYXV0b2NvbXBsZXRlLmZpbmQoXCJsaVwiKVxuICAgICAgICAgICAgICAgICAgICAub24oXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2V0U2VsZWN0ZWRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAub24oXCJtb3VzZWVudGVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlbGVjdFJlc3VsdE9wdGlvbkVsZW1lbnQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9zZWxlY3RSZXN1bHRPcHRpb25FbGVtZW50OiBmdW5jdGlvbiAob3B0aW9uRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fY2xlYXJSZXN1bHRPcHRpb25TZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHZhciAkc2VsZWN0ZWRPcHRpb25FbGVtZW50ID0gJChvcHRpb25FbGVtZW50KTtcbiAgICAgICAgICAgICRzZWxlY3RlZE9wdGlvbkVsZW1lbnQuYWRkQ2xhc3MoXCJidXR0ZXItZHJvcGRvd25saXN0LXJlc3VsdEl0ZW0tc2VsZWN0ZWRcIik7XG4gICAgICAgICAgICB0aGlzLiRzZWxlY3RlZE9wdGlvbiA9ICRzZWxlY3RlZE9wdGlvbkVsZW1lbnQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2NsZWFyUmVzdWx0T3B0aW9uU2VsZWN0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLiRzZWxlY3RlZE9wdGlvbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9nZXRBdXRvY29tcGxldGVFbGVtZW50KClcbiAgICAgICAgICAgICAgICAgICAgLmZpbmQoXCIuYnV0dGVyLWRyb3Bkb3dubGlzdC1yZXN1bHRJdGVtLXNlbGVjdGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhcImJ1dHRlci1kcm9wZG93bmxpc3QtcmVzdWx0SXRlbS1zZWxlY3RlZFwiKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfbW92ZVJlc3VsdE9wdGlvbkVsZW1lbnRTZWxlY3Rpb25DdXJzb3I6IGZ1bmN0aW9uICgkYXV0b2NvbXBsZXRlLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyICRuZXh0ID0gdGhpcy4kc2VsZWN0ZWRPcHRpb24ubmV4dCgpO1xuICAgICAgICAgICAgICAgIGlmICgkbmV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdFJlc3VsdE9wdGlvbkVsZW1lbnQoJG5leHRbMF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlcmUgaXMgbm8gbmV4dFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RSZXN1bHRPcHRpb25FbGVtZW50KCRhdXRvY29tcGxldGUuZmluZChcImxpXCIpWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciAkcHJldiA9IHRoaXMuJHNlbGVjdGVkT3B0aW9uLnByZXYoKTtcbiAgICAgICAgICAgICAgICBpZiAoJHByZXYubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RSZXN1bHRPcHRpb25FbGVtZW50KCRwcmV2WzBdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZXJlIGlzIG5vIHByZXZpb3VzXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHRMaXN0T3B0aW9ucyA9ICRhdXRvY29tcGxldGUuZmluZChcImxpXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RSZXN1bHRPcHRpb25FbGVtZW50KHJlc3VsdExpc3RPcHRpb25zW3Jlc3VsdExpc3RPcHRpb25zLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3NldFNlbGVjdGVkVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiRzZWxlY3RlZE9wdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlS2V5dXBFdmVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy4kaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC52YWwodGhpcy4kc2VsZWN0ZWRPcHRpb24uYXR0cihcImRhdGEtc2VsZWN0LXZhbHVlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNoYW5nZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZm9jdXMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmtleXVwKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5faGlkZUF1dG9jb21wbGV0ZVJlc3VsdExpc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfaGlkZUF1dG9jb21wbGV0ZVJlc3VsdExpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3REZWxheVRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdERlbGF5VGltZXJJZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuJHNlbGVjdGVkT3B0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2dldEF1dG9jb21wbGV0ZUVsZW1lbnQoKS5oaWRlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2dldEF1dG9jb21wbGV0ZUVsZW1lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuYXV0b2NvbXBsZXRlSWQpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfc3RvcEV2ZW50OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG59KGpRdWVyeSkpOyIsIi8qKlxuICogalF1ZXJ5LVBsdWdpbiB0byBoYW5kbGUgYm9vdHN0cmFwIGZpeGVzLlxuICogV29ya3Mgd2l0aCBhdCBsZWFzdCBqUXVlcnkgMS4zLjIuXG4gKlxuICogSG93IHRvIHVzZTpcbiAqIGpRdWVyeShcIiNzb21lVHJlZVNlbGVjdG9yXCIpLmZpeEJvb3RzdHJhcERyb3BEb3duKCk7XG4gKi9cbihmdW5jdGlvbiAoJCkge1xuICAgICQuZm4uZml4Qm9vdHN0cmFwRHJvcERvd24gPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKCcuZHJvcGRvd24tbWVudScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBpZigkKHRoaXMpLmhhc0NsYXNzKCdkcm9wZG93bi1tZW51LWZvcm0nKSkge1xuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH07XG59KGpRdWVyeSkpOyIsIi8qKlxuICogYnV0dGVySXRlbUZpbHRlckZpZWxkIGlzIGEgalF1ZXJ5IHBsdWdpbiB0aGF0IGZpbHRlcnMgaHRtbCBlbGVtZW50IHdpdGggdGhlIGNzcyBjbGFzcyA8Y29kZT5maWx0ZXJhYmxlLWl0ZW08L2NvZGU+LlxuICogSXQgaXMgYXBwbGllZCB0byB0aGUgc2VhcmNoIGZpZWxkLjxici8+XG4gKiBJZiBubyBmaWx0ZXIgdGV4dCBpcyBlbnRlcmVkLCB0aGVuIGFsbCBmaWx0ZXJhYmxlLWl0ZW1zIGFyZSBkaXNwbGF5ZWQuIEVsc2UgdGhlIHNlYXJjaCBmaWVsZCB2YWx1ZSBpcyBtYXRjaGVkIGFnYWluc3QgPGI+YWxsPC9iPiB0ZXh0IGNvbnRhaW5lZCBieSBhIGZpbHRlcmFibGUtaXRlbS5cbiAqXG4gKiBIb3cgdG8gdXNlOlxuICogalF1ZXJ5KFwiI3NvbWVJbnB1dFNlbGVjdG9yXCIpLmJ1dHRlckl0ZW1GaWx0ZXJGaWVsZCgpO1xuICpcbiAqIEF1dGhvcjogWWFubiBNYXNzYXJkXG4gKi9cbihmdW5jdGlvbiAoJCkge1xuICAgIHZhciBkZWxheSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0aW1lciA9IDA7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2ssIG1zKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCBtcyk7XG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIC8vIGV4dGVuZCBqUXVlcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAkLmZuLmJ1dHRlckl0ZW1GaWx0ZXJGaWVsZCA9IGZ1bmN0aW9uIChmaWx0ZXJhYmxlSXRlbUNvbnRhaW5lclNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKTtcbiAgICAgICAgICAgICR0aGlzLmtleXVwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkZWxheShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJWYWx1ZSA9ICR0aGlzLnZhbCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgY29udGFpbmVyIGFnYWluIGV2ZXJ5IHRpbWUsIGJlY2F1c2UgaXQgY291bGQgaGF2ZSBiZWVuIHJlcmVuZGVyZWQuXG4gICAgICAgICAgICAgICAgICAgIHZhciAkZmlsdGVyYWJsZUl0ZW1Db250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJhYmxlSXRlbUNvbnRhaW5lclNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkZmlsdGVyYWJsZUl0ZW1Db250YWluZXIgPSAkKGZpbHRlcmFibGVJdGVtQ29udGFpbmVyU2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lclNlbGVjdG9yID0gJHRoaXMuYXR0cignZGF0YS1maWx0ZXJhYmxlLWl0ZW0tY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkZmlsdGVyYWJsZUl0ZW1Db250YWluZXIgPSAkKGNvbnRhaW5lclNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJhYmxlSXRlbXMgPSAkZmlsdGVyYWJsZUl0ZW1Db250YWluZXIuZmluZCgnLmZpbHRlcmFibGUtaXRlbScpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmFibGVJdGVtcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGZpbHRlcmFibGVJdGVtID0gJChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZmlsdGVyYWJsZUl0ZW0uaXMoJzpjb250YWluc0lnbm9yZUNhc2UoJyArIGZpbHRlclZhbHVlICsgJyknKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJhYmxlSXRlbS5yZW1vdmVBdHRyKFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJhYmxlSXRlbS5oaWdobGlnaHQoZmlsdGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsdGVyYWJsZUl0ZW0uYXR0cihcImhpZGRlblwiLCBcImhpZGRlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG59KGpRdWVyeSkpO1xuXG4oZnVuY3Rpb24gKCQpIHtcbiAgICAkLmV4cHJbXCI6XCJdLmNvbnRhaW5zSWdub3JlQ2FzZSA9ICQuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24gKGFyZykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICAgIHJldHVybiAhYXJnIHx8ICQoZWxlbSkudGV4dCgpLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihhcmcudG9VcHBlckNhc2UoKSkgPj0gMDtcbiAgICAgICAgfTtcbiAgICB9KTtcbn0oalF1ZXJ5KSk7IiwiLyoqXG4gKiBqUXVlcnktUGx1Z2luIFwiQW5pbWF0ZSBkb3RzXCIgZm9yIHRyZWUgYW5pbWF0aW9uLiBBbmltYXRlcyBhIHdhaXRpbmcgZG90IGxpbmUgKDQgZG90cykgaW4gYW4gaW50ZXJ2YWwgb2YgMjAwIG1pbGxpc1xuICogYXMgaHRtbCBzdHJpbmcgaW4gZ2l2ZW4gY29tcG9uZW50LiBOb3RlOiBleGlzdGluZyBodG1sIGNvZGUgd2lsbCBiZSBjbGVhcmVkLlxuICogV29ya3Mgd2l0aCBhdCBsZWFzdCBqUXVlcnkgMS4zLjIuXG4gKlxuICogSG93IHRvIHVzZTpcbiAqIGpRdWVyeShcIiNzZWxlY3RvclwiKS5zdGFydERvdHMoKTtcbiAqIGpRdWVyeShcIiNzZWxlY3RvclwiKS5zdG9wRG90cygpO1xuICovXG4oZnVuY3Rpb24gKCQpIHtcbiAgICAvLyBleHRlbmQgalF1ZXJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICB2YXIgaW50ZXJ2YWxUcmlnZ2VyID0gbnVsbDtcblxuICAgICQuZm4uc3RhcnREb3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciAkb3JpZ2luYWxFbGVtZW50ID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgJG9yaWdpbmFsRWxlbWVudC5odG1sKCcnKTtcblxuICAgICAgICAgICAgaW50ZXJ2YWxUcmlnZ2VyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICRvcmlnaW5hbEVsZW1lbnQuYXBwZW5kKCcuJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJG9yaWdpbmFsRWxlbWVudC5odG1sKCkubGVuZ3RoID4gNSkge1xuICAgICAgICAgICAgICAgICAgICAkb3JpZ2luYWxFbGVtZW50Lmh0bWwoJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkLmZuLnN0b3BEb3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciAkb3JpZ2luYWxFbGVtZW50ID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgJG9yaWdpbmFsRWxlbWVudC5odG1sKCcnKTtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGludGVydmFsVHJpZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbn0oalF1ZXJ5KSk7IiwiKGZ1bmN0aW9uICgkKSB7XG4gICAgJC5mbi5oaWdobGlnaHQgPSBmdW5jdGlvbiAoc2VhcmNoU3RyaW5nKSB7XG4gICAgICAgIHZhciBoaWdobGlnaHRDbGFzc05hbWUgPSBcInNlYXJjaC1oaWdobGlnaHRlZFwiO1xuICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKHNlYXJjaFN0cmluZywgXCJnaVwiKTtcblxuICAgICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmZpbmQoJyonKTtcbiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLnB1c2godGhpcyk7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy4nICsgaGlnaGxpZ2h0Q2xhc3NOYW1lKS5jb250ZW50cygpLnVud3JhcCgpO1xuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHNlYXJjaFN0cmluZyAmJiBzZWFyY2hTdHJpbmcgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgJHRoaXMuY29udGVudHMoKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGVUeXBlID09PSAzICYmIHJlZ2V4LnRlc3QodGhpcy5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZVdpdGgoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLm5vZGVWYWx1ZSB8fCBcIlwiKS5yZXBsYWNlKHJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCI8c3BhbiBjbGFzcz1cXFwiXCIgKyBoaWdobGlnaHRDbGFzc05hbWUgKyBcIlxcXCI+XCIgKyBtYXRjaCArIFwiPC9zcGFuPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xufShqUXVlcnkpKTsiLCIoZnVuY3Rpb24gKCQpIHtcbiAgICAvLyBleHRlbmQgalF1ZXJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgJC5mbi5tYXJrZG93blJlYWRvbmx5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcm9vdCA9ICQodGhpcyk7XG5cbiAgICAgICAgdmFyICRyZWFkb25seU1hcmtkb3duID0gcm9vdC5maW5kKCcuYnV0dGVyLWNvbXBvbmVudC12YWx1ZS1yZWFkb25seS13cmFwcGVyJyk7XG4gICAgICAgIHZhciBtYXJrZG93blRleHQgPSAkcmVhZG9ubHlNYXJrZG93bi5odG1sKClcbiAgICAgICAgICAgIC5yZXBsYWNlKCcmYW1wOycsICcmJylcbiAgICAgICAgICAgIC5yZXBsYWNlKCcmbHQ7JywgJzwnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJyZndDsnLCAnPicpO1xuICAgICAgICB2YXIgbWFya2Rvd25UZXh0VG9IdG1sID0gbmV3IHNob3dkb3duLkNvbnZlcnRlcigpLm1ha2VIdG1sKG1hcmtkb3duVGV4dCk7XG5cbiAgICAgICAgJHJlYWRvbmx5TWFya2Rvd24uZW1wdHkoKTtcbiAgICAgICAgJHJlYWRvbmx5TWFya2Rvd24uYXBwZW5kKG1hcmtkb3duVGV4dFRvSHRtbCk7XG4gICAgfTtcbn0oalF1ZXJ5KSk7IiwiaWYgKHR5cGVvZiBidXR0ZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgYnV0dGVyID0ge307XG59XG5idXR0ZXIubW9kYWwgPSB7fTtcblxuYnV0dGVyLm1vZGFsLm9wZW4gPSBmdW5jdGlvbiAoLyogc3RyaW5nICovIG1vZGFsUGFuZWxJZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdPcGVuaW5nIG1vZGFsIHBhbmVsIHdpdGggZGF0YS1tb2RhbC1pZCAnICsgbW9kYWxQYW5lbElkKTtcbiAgICAkKCcuYnV0dGVyLW1vZGFsW2RhdGEtbW9kYWwtaWQ9JyArIG1vZGFsUGFuZWxJZCArICddJykubW9kYWwoe3Nob3c6IHRydWUsIGtleWJvYXJkOiBmYWxzZSwgYmFja2Ryb3A6ICdzdGF0aWMnfSlcbn07XG5cbmJ1dHRlci5tb2RhbC5jbG9zZSA9IGZ1bmN0aW9uICgvKiBzdHJpbmcgKi8gbW9kYWxQYW5lbElkKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ0Nsb3NpbmcgbW9kYWwgcGFuZWwgd2l0aCBkYXRhLW1vZGFsLWlkICcgKyBtb2RhbFBhbmVsSWQpO1xuICAgICQoJy5idXR0ZXItbW9kYWxbZGF0YS1tb2RhbC1pZD0nICsgbW9kYWxQYW5lbElkICsgJ10nKS5tb2RhbCgnaGlkZScpO1xufTsiLCIvKipcbiAqIGpRdWVyeS1QbHVnaW4gXCJOdW1iZXIgU3Bpbm5lclwiIGZvciBpbnB1dCBmaWVsZHMuXG4gKiBXb3JrcyB3aXRoIGF0IGxlYXN0IGpRdWVyeSAxLjMuMi5cbiAqXG4gKiBIb3cgdG8gdXNlOlxuICogalF1ZXJ5KFwic29tZUJ1dHRlckNvbXBvbmVudFNlbGVjdG9yXCIpLmJ1dHRlck51bWJlclNwaW5uZXIoKTtcbiAqL1xuKGZ1bmN0aW9uICgkKSB7XG4gICAgLy8gZXh0ZW5kIGpRdWVyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICQuZm4uYnV0dGVyTnVtYmVyU3Bpbm5lciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbmV3IE51bWJlclNwaW5uZXIodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBkZWZpbmUgY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHZhciBOdW1iZXJTcGlubmVyID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuJGlucHV0ID0gJChlbGVtZW50KS5maW5kKFwiaW5wdXRcIik7XG4gICAgICAgICAgICB0aGlzLl9pbml0SW5wdXQoKTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5faW5pdENvdW50ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRCdXR0b25zKCk7XG4gICAgICAgICAgICB0aGlzLl9pbml0QXJyb3dLZXlzKCk7XG4gICAgICAgICAgICB0aGlzLl9pbml0TW91c2VXaGVlbCgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9pbml0SW5wdXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuJGlucHV0XG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKFwiYnV0dGVyLWNvbXBvbmVudC1udW1iZXItaW5wdXRcIilcbiAgICAgICAgICAgICAgICAuYmx1cihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3NldFZhbHVlT25CbHVyKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucGFyZW50KCkuYWRkQ2xhc3MoXCJpbnB1dC1ncm91cFwiKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhpcyB2YWx1ZXMgYXJlIG51bWJlcnNcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnN0ZXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuc3RlcCA9IHRoaXMuX29wdGlvbnMuc3RlcCAqIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMubWluID0gdGhpcy5fb3B0aW9ucy5taW4gKiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLm1heCA9IHRoaXMuX29wdGlvbnMubWF4ICogMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdEJ1dHRvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciAkb3V0ZXJBZGRvbiA9ICQoXCI8ZGl2PlwiKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImlucHV0LWdyb3VwLWFwcGVuZFwiKVxuICAgICAgICAgICAgICAgIC5pbnNlcnRBZnRlcih0aGlzLiRpbnB1dCk7XG5cbiAgICAgICAgICAgIHZhciAkYWRkb24gPSAkKFwiPHNwYW4+XCIpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKFwiaW5wdXQtZ3JvdXAtdGV4dFwiKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImJ1dHRlci1jb21wb25lbnQtbnVtYmVyLWJ1dHRvbnNcIilcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJG91dGVyQWRkb24pO1xuXG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAkKFwiPHNwYW4+XCIpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXVwXCIpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKFwiYnV0dGVyLWNvbXBvbmVudC1udW1iZXItYnV0dG9uXCIpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29wdGlvbnMuZGlzYWJsZWQgPyBcImRpc2FibGVkXCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluY3JlYXNlQ291bnRlcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGFkZG9uKTtcblxuICAgICAgICAgICAgJChcIjxzcGFuPlwiKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1kb3duXCIpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKFwiYnV0dGVyLWNvbXBvbmVudC1udW1iZXItYnV0dG9uXCIpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29wdGlvbnMuZGlzYWJsZWQgPyBcImRpc2FibGVkXCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlY3JlYXNlQ291bnRlcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGFkZG9uKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdEFycm93S2V5czogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy4kaW5wdXQua2V5ZG93bihmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IDM4KSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmluY3JlYXNlQ291bnRlcigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQud2hpY2ggPT09IDQwKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmRlY3JlYXNlQ291bnRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9pbml0TW91c2VXaGVlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy4kaW5wdXQub24oXCJtb3VzZXdoZWVsIERPTU1vdXNlU2Nyb2xsXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VsZi4kaW5wdXQuaXMoJzpmb2N1cycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSBldmVudC5vcmlnaW5hbEV2ZW50LndoZWVsRGVsdGEgfHwgLWV2ZW50Lm9yaWdpbmFsRXZlbnQuZGVsdGFZIHx8IC1ldmVudC5vcmlnaW5hbEV2ZW50LmRldGFpbDtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGVjcmVhc2VDb3VudGVyKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmNyZWFzZUNvdW50ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdENvdW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fY291bnRlciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9pc1ZhbHVlU2V0ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuJGlucHV0LnZhbCgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1N0cmluZ0VtcHR5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhciBwYXJzZWRJbnQgPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihwYXJzZWRJbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q291bnRlcihwYXJzZWRJbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1ZhbHVlU2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5faXNWYWx1ZVNldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q291bnRlcigwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfc2V0VmFsdWVPbkJsdXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuJGlucHV0LnZhbCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzU3RyaW5nRW1wdHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kaW5wdXQudmFsKFwiXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q291bnRlcigwKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1ZhbHVlU2V0ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwYXJzZWRJbnQgPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHBhcnNlZEludCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzVmFsdWVTZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGlucHV0LnZhbCh0aGlzLl9jb3VudGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGlucHV0LnZhbChcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q291bnRlcigwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzVmFsdWVTZXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q291bnRlcihwYXJzZWRJbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRpbnB1dC52YWwodGhpcy5fY291bnRlcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzVmFsdWVTZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBpbmNyZWFzZUNvdW50ZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc1ZhbHVlU2V0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb3VudGVyKHRoaXMuX2NvdW50ZXIgKyB0aGlzLl9vcHRpb25zLnN0ZXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1ZhbHVlU2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuJGlucHV0LnZhbCh0aGlzLl9jb3VudGVyKTtcbiAgICAgICAgICAgIHRoaXMuJGlucHV0LmNoYW5nZSgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRlY3JlYXNlQ291bnRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzVmFsdWVTZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvdW50ZXIodGhpcy5fY291bnRlciAtIHRoaXMuX29wdGlvbnMuc3RlcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzVmFsdWVTZXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4kaW5wdXQudmFsKHRoaXMuX2NvdW50ZXIpO1xuICAgICAgICAgICAgdGhpcy4kaW5wdXQuY2hhbmdlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2lzU3RyaW5nRW1wdHk6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuICh2YWx1ZS5sZW5ndGggPT09IDAgfHwgIXZhbHVlLnRyaW0oKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0Q291bnRlcjogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA8IHRoaXMuX29wdGlvbnMubWluKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY291bnRlciA9IHRoaXMuX29wdGlvbnMubWluO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9vcHRpb25zLm1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID4gdGhpcy5fb3B0aW9ucy5tYXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb3VudGVyID0gdGhpcy5fb3B0aW9ucy5tYXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufShqUXVlcnkpKTsiLCJpZiAodHlwZW9mIGJ1dHRlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBidXR0ZXIgPSB7fTtcbn1cbmJ1dHRlci5wcmV0dHlwcmludCA9IHt9O1xuXG4vKipcbiAqIGNhbGxzIHByZXR0eSBwcmludCBqYXZhc2NyaXB0IGZyYW1ld29yayBhbmQgcmVtb3ZlcyBmaXJzdCBhbmQgbGFzdCBlbXB0eSBjaGlsZHJlbi5cbiAqL1xuYnV0dGVyLnByZXR0eXByaW50LmNsZWFudXAgPSBmdW5jdGlvbigpIHtcbiAgICBwcmV0dHlQcmludCgpO1xuXG4gICAgalF1ZXJ5KCcuYnV0dGVyLWNvbXBvbmVudC1wcmV0dHlwcmludCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJGZpcnN0UHJlQ2hpbGQgPSBqUXVlcnkodGhpcykuZmluZChcInByZSBzcGFuXCIpLmZpcnN0KCk7XG4gICAgICAgIHZhciAkbGFzdFByZUNoaWxkID0galF1ZXJ5KHRoaXMpLmZpbmQoXCJwcmUgc3BhblwiKS5sYXN0KCk7XG5cblxuICAgICAgICBpZiAoISh0eXBlb2YgJGZpcnN0UHJlQ2hpbGQuaHRtbCgpID09PSBcInVuZGVmaW5lZFwiKSkge1xuICAgICAgICAgICAgaWYgKCEkZmlyc3RQcmVDaGlsZC5odG1sKCkudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgJGZpcnN0UHJlQ2hpbGQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodHlwZW9mICRsYXN0UHJlQ2hpbGQuaHRtbCgpID09PSBcInVuZGVmaW5lZFwiKSkge1xuICAgICAgICAgICAgaWYgKCEkbGFzdFByZUNoaWxkLmh0bWwoKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAkbGFzdFByZUNoaWxkLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59OyIsIi8qKlxuICogSG93IHRvIHVzZTpcbiAqIGpRdWVyeShcIiNzb21lU2VsZWN0b3JcIikuc2Nyb2xsVG9GaXJzdCgpIG9yIGpRdWVyeShcIiNzb21lU2VsZWN0b3JcIikuc2Nyb2xsVG9MYXN0KCk7XG4gKi9cbihmdW5jdGlvbiAoJCkge1xuICAgIC8vIGV4dGVuZCBqUXVlcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAkLmZuLmJ1dHRlclNjcm9sbFRvRmlyc3QgPSBmdW5jdGlvbiAoLyogaW50ICovIG9mZnNldCkge1xuICAgICAgICBjb25zb2xlLmxvZyhvZmZzZXQpO1xuICAgICAgICB2YXIgX29mZnNldCA9IG9mZnNldCA9PT0gdW5kZWZpbmVkID8gJCh0aGlzKS5maXJzdCgpLm9mZnNldCgpLnRvcCA6ICQodGhpcykuZmlyc3QoKS5vZmZzZXQoKS50b3AgKyBvZmZzZXQ7XG4gICAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtzY3JvbGxUb3A6IF9vZmZzZXQgKyAncHgnfSwgJ2Zhc3QnKTtcbiAgICB9O1xuXG4gICAgJC5mbi5idXR0ZXJTY3JvbGxUb0xhc3QgPSBmdW5jdGlvbiAoLyogaW50ICovIG9mZnNldCkge1xuICAgICAgICBjb25zb2xlLmxvZyhvZmZzZXQpO1xuICAgICAgICB2YXIgX29mZnNldCA9IG9mZnNldCA9PT0gdW5kZWZpbmVkID8gJCh0aGlzKS5sYXN0KCkub2Zmc2V0KCkudG9wIDogJCh0aGlzKS5sYXN0KCkub2Zmc2V0KCkudG9wICsgb2Zmc2V0O1xuICAgICAgICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOiBfb2Zmc2V0ICsgJ3B4J30sICdmYXN0Jyk7XG4gICAgfTtcbn0oalF1ZXJ5KSk7IiwiLyoqXG4gKiBqUXVlcnktUGx1Z2luIHRvIGhhbmRsZSBzZWxlY3Rpb24gc3R5bGUgY2xhc3NlcyBvbiBKU0YtQ29tcG9uZW50IFwiYjp0YWJsZVwiLlxuICogV29ya3Mgd2l0aCBhdCBsZWFzdCBqUXVlcnkgMS4zLjIuXG4gKlxuICogSG93IHRvIHVzZTpcbiAqIGpRdWVyeShcIiNzb21lVHJlZVNlbGVjdG9yXCIpLnNlbGVjdFJvdygge3Jvd0luZGV4OiAnNid9ICk7XG4gKi9cbihmdW5jdGlvbiAoJCkge1xuICAgIC8vIGV4dGVuZCBqUXVlcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAkLmZuLnRvZ2dsZUNvbHVtblZpc2liaWx0eSA9IGZ1bmN0aW9uIChyZW5kZXJJZHMsIGRpc2FibGVSZW5kZXJJZHMpIHtcblxuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciAkdG9vbGJhciA9ICQodGhpcyk7XG5cbiAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5zdHJpbmdpZnkoY3JlYXRlQ29sdW1uVmlzaWJpbHR5KCR0b29sYmFyKSk7XG4gICAgICAgICAgICBCdXR0ZXJGYWNlcy5BamF4LnNlbmRSZXF1ZXN0KCR0b29sYmFyLmF0dHIoJ2lkJyksICd0b2dnbGUnLCByZW5kZXJJZHMsIGpzb24sIGRpc2FibGVSZW5kZXJJZHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVDb2x1bW5WaXNpYmlsdHkoJHRvb2xiYXIpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW5zID0gW107XG5cbiAgICAgICAgICAgICR0b29sYmFyLmZpbmQoJy5idXR0ZXItdGFibGUtdG9vbGJhci1jb2x1bW4tb3B0aW9uIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGNoZWNrYm94KSB7XG4gICAgICAgICAgICAgICAgdmFyICRjaGVja2JveCA9ICQoY2hlY2tib3gpLnBhcmVudCgnLmJ1dHRlci10YWJsZS10b29sYmFyLWNvbHVtbi1vcHRpb24nKTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAkY2hlY2tib3guYXR0cignZGF0YS1jb2x1bW4tbW9kZWwtaWRlbnRpZmllcicpLFxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiAkY2hlY2tib3guZmluZCgnaW5wdXRbdHlwZT1jaGVja2JveF0nKS5pcygnOmNoZWNrZWQnKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgICQuZm4ub3JkZXJDb2x1bW4gPSBmdW5jdGlvbiAocmVuZGVySWRzLCBkaXNhYmxlUmVuZGVySWRzLCB0b0xlZnQsIGNvbHVtbk51bWJlcikge1xuXG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyICR0b29sYmFyID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHRvTGVmdCkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ29yZGVyIGNvbHVtbiAnICsgY29sdW1uTnVtYmVyICsgJyB0byBsZWZ0Jyk7XG4gICAgICAgICAgICAgICAgb3JkZXJDb2x1bW5MZWZ0KCR0b29sYmFyLCBjb2x1bW5OdW1iZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdvcmRlciBjb2x1bW4gJyArIGNvbHVtbk51bWJlciArICcgdG8gcmlnaHQnKTtcbiAgICAgICAgICAgICAgICBvcmRlckNvbHVtblJpZ2h0KCR0b29sYmFyLCBjb2x1bW5OdW1iZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIganNvbiA9IEpTT04uc3RyaW5naWZ5KGNyZWF0ZUNvbHVtbk9yZGVyKCR0b29sYmFyKSk7XG4gICAgICAgICAgICBCdXR0ZXJGYWNlcy5BamF4LnNlbmRSZXF1ZXN0KCR0b29sYmFyLmF0dHIoJ2lkJyksICdvcmRlcicsIHJlbmRlcklkcywganNvbiwgZGlzYWJsZVJlbmRlcklkcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbHVtbk9yZGVyKCR0b29sYmFyKSB7XG4gICAgICAgICAgICB2YXIgY29sdW1ucyA9IFtdO1xuXG4gICAgICAgICAgICAkdG9vbGJhci5maW5kKCcuYnV0dGVyLXRhYmxlLXRvb2xiYXItY29sdW1uLW9wdGlvbiBpbnB1dFt0eXBlPWNoZWNrYm94XScpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBjaGVja2JveCkge1xuICAgICAgICAgICAgICAgIHZhciAkY2hlY2tib3ggPSAkKGNoZWNrYm94KS5wYXJlbnQoJy5idXR0ZXItdGFibGUtdG9vbGJhci1jb2x1bW4tb3B0aW9uJyk7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJGNoZWNrYm94LmF0dHIoJ2RhdGEtY29sdW1uLW1vZGVsLWlkZW50aWZpZXInKSxcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGluZGV4XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvcmRlckNvbHVtbkxlZnQoLyoganF1ZXJ5IHRvb2xiYXIgKi8gJHRvb2xiYXIsIGNvbHVtbk51bWJlcikge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygkdG9vbGJhcik7XG5cbiAgICAgICAgICAgIHZhciAkY29sdW1uID0gJHRvb2xiYXIuZmluZCgnbGlbZGF0YS1vcmlnaW5hbC1jb2x1bW49XCInICsgY29sdW1uTnVtYmVyICsgJ1wiXScpO1xuICAgICAgICAgICAgdmFyICRuZXh0Q29sdW1uID0gJGNvbHVtbi5wcmV2KCk7XG5cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJGNvbHVtbik7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCRuZXh0Q29sdW1uKTtcblxuICAgICAgICAgICAgdmFyICRkZXRhY2h0ZWRDb2x1bW4gPSAkY29sdW1uLmRldGFjaCgpO1xuICAgICAgICAgICAgJG5leHRDb2x1bW4uYmVmb3JlKCRkZXRhY2h0ZWRDb2x1bW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb3JkZXJDb2x1bW5SaWdodCgvKiBqcXVlcnkgdG9vbGJhciAqLyAkdG9vbGJhciwgY29sdW1uTnVtYmVyKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCR0b29sYmFyKTtcblxuICAgICAgICAgICAgdmFyICRjb2x1bW4gPSAkdG9vbGJhci5maW5kKCdsaVtkYXRhLW9yaWdpbmFsLWNvbHVtbj1cIicgKyBjb2x1bW5OdW1iZXIgKyAnXCJdJyk7XG4gICAgICAgICAgICB2YXIgJG5leHRDb2x1bW4gPSAkY29sdW1uLm5leHQoKTtcblxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygkY29sdW1uKTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJG5leHRDb2x1bW4pO1xuXG4gICAgICAgICAgICB2YXIgJGRldGFjaHRlZENvbHVtbiA9ICRjb2x1bW4uZGV0YWNoKCk7XG4gICAgICAgICAgICAkbmV4dENvbHVtbi5hZnRlcigkZGV0YWNodGVkQ29sdW1uKTtcbiAgICAgICAgfVxuICAgIH07XG59KGpRdWVyeSkpOyIsIihmdW5jdGlvbiAoJCkge1xuXG4gICAgJC5mbi5fY2xvc2VQb3BvdmVyT25CbHVyID0gZnVuY3Rpb24gKC8qIG9iamVjdCAqLyBkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJvb3QgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICByb290LmZpbmQoJy5idXR0ZXItaW5wdXQtY29tcG9uZW50Jykub24oJ2JsdXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcm9vdC5wb3BvdmVyKCdoaWRlJylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJC5mbi5fYnV0dGVyVG9vbHRpcCA9IGZ1bmN0aW9uICgvKiBvYmplY3QgKi8gZGF0YSkge1xuICAgICAgICB2YXIgcm9vdCA9ICQodGhpcyk7XG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKTtcblxuICAgICAgICB2YXIgY29udGVudCA9IGpRdWVyeSgnW25hbWU9JyArIGRhdGEuY29udGVudEJ5TmFtZSArICddJyk7XG5cbiAgICAgICAgdmFyIG5ld0RhdGEgPSB7XG4gICAgICAgICAgICB0cmlnZ2VyOiBkYXRhLnRyaWdnZXIsXG4gICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcbiAgICAgICAgICAgIHBsYWNlbWVudDogZGF0YS5wbGFjZW1lbnQsXG4gICAgICAgICAgICBwbGFjZW1lbnRGdW5jdGlvbjogZGF0YS5wbGFjZW1lbnRGdW5jdGlvbixcbiAgICAgICAgICAgIG1pblZlcnRpY2FsT2Zmc2V0OiBkYXRhLm1pblZlcnRpY2FsT2Zmc2V0LFxuICAgICAgICAgICAgbWluSG9yaXpvbnRhbE9mZnNldDogZGF0YS5taW5Ib3Jpem9udGFsT2Zmc2V0LFxuICAgICAgICAgICAgY29udGVudDogY29udGVudC5odG1sKCkudHJpbSgpXG4gICAgICAgIH07XG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyhuZXdEYXRhKTtcblxuICAgICAgICBjb250ZW50LnJlbW92ZSgpO1xuXG4gICAgICAgIHJvb3QuYnV0dGVyVG9vbHRpcChuZXdEYXRhKTtcbiAgICB9O1xuXG4gICAgJC5mbi5idXR0ZXJUb29sdGlwID0gZnVuY3Rpb24gKC8qIG9iamVjdCAqLyBkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJvb3QgPSAkKHRoaXMpO1xuICAgICAgICAgICAgdmFyIHRyaWdnZXIgPSBkYXRhLnRyaWdnZXIgPyBkYXRhLnRyaWdnZXIgOiAnaG92ZXInO1xuXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncGxhY2VtZW50OiAnICsgcGxhY2VtZW50KTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3RyaWdnZXI6ICcgKyB0cmlnZ2VyKTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3ZpZXdwb3J0OiAnICsgZGF0YS52aWV3cG9ydCk7XG5cbiAgICAgICAgICAgIGlmIChkYXRhLm1pblZlcnRpY2FsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgcm9vdC5hdHRyKCdkYXRhLXRvb2x0aXAtbWluLXZlcnRpY2FsLW9mZnNldCcsIGRhdGEubWluVmVydGljYWxPZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEubWluSG9yaXpvbnRhbE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHJvb3QuYXR0cignZGF0YS10b29sdGlwLW1pbi1ob3Jpem9udGFsLW9mZnNldCcsIGRhdGEubWluSG9yaXpvbnRhbE9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm9vdC5uZXh0KCkuaGFzQ2xhc3MoJ3BvcG92ZXInKSkge1xuICAgICAgICAgICAgICAgIHJvb3QubmV4dCgpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIHJvb3QucG9wb3Zlcih7XG4gICAgICAgICAgICAgICAgdHJpZ2dlcjogdHJpZ2dlcixcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ6IGZ1bmN0aW9uIChwb3BvdmVyLCBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEucGxhY2VtZW50ID8gZGF0YS5wbGFjZW1lbnQgOiAoZGF0YS5wbGFjZW1lbnRGdW5jdGlvbiA/IGRhdGEucGxhY2VtZW50RnVuY3Rpb24gOiBuZXcgQnV0dGVyRmFjZXMuVG9vbHRpcCgpLmNhbGN1bGF0ZVRvb2x0aXBQb3NpdGlvbihwb3BvdmVyLCBzb3VyY2UpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxuICAgICAgICAgICAgICAgIGh0bWw6IHRydWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogZGF0YS5jb250ZW50LFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0OiBkYXRhLnZpZXdwb3J0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn0oalF1ZXJ5KSk7Il19