{"version":3,"sources":["node_modules/browser-pack/_prelude.js","TypeScripts/Common/saop-common.ts","TypeScripts/Components/saop-checkbox-switch.ts","TypeScripts/Components/saop-floating-label.ts","TypeScripts/Components/saop-grid-edit.ts","TypeScripts/Components/saop-grid-filter.ts","TypeScripts/Components/saop-grid.ts","TypeScripts/Components/saop-input-wfl.ts","TypeScripts/Components/saop-inputmask.ts","TypeScripts/Components/saop-menu-sidebar.ts","TypeScripts/Components/saop-message-dlg.ts","TypeScripts/Components/saop-multiselect.ts","TypeScripts/Components/saop-pdf-preview.ts","TypeScripts/Components/saop-pinch-and-zoom.ts","TypeScripts/Components/saop-popover.ts","TypeScripts/Components/saop-popup-dialog.ts","TypeScripts/Components/saop-right-sidebar.ts","TypeScripts/Components/saop-select-wfl.ts","TypeScripts/Components/saop-selectize-select.ts","TypeScripts/Components/saop-toggle-panel.ts","TypeScripts/Components/saop-treeview.ts","TypeScripts/Components/saop-view-spinner.ts","TypeScripts/Core/saop-services-core.ts","TypeScripts/Core/saop-translate.ts","TypeScripts/Core/saop-utils.ts","TypeScripts/Core/saop-view-form.ts","TypeScripts/main.ts"],"names":[],"mappings":"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","file":"saop_core_bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i\r\n\r\nexport abstract class global {\r\n public static debugMode: boolean;\r\n public static siteBaseUrl: string;\r\n\r\n public static ConsoleLogDegug(message: any): void {\r\n if (this.debugMode) console.log(message);\r\n }\r\n\r\n public static GetClientLogModeStorageKeyValue(): string {\r\n return \"SaopMojInfo.globalClientLogModeVal\";\r\n }\r\n\r\n public static GetClientLogModeStorageValue(): boolean {\r\n let debugModeDefaultValue = false;\r\n\r\n var debugModeStringVal = this.ReadVariableFromStorage(global.GetClientLogModeStorageKeyValue());\r\n\r\n let debugModeVal = debugModeDefaultValue;\r\n if (debugModeStringVal) {\r\n debugModeVal = debugModeStringVal === \"true\" ? true : false;\r\n }\r\n\r\n return debugModeVal;\r\n }\r\n\r\n public static SetClientLogModeStorageValue(): void {\r\n let logMode = this.GetClientLogModeStorageValue();\r\n this.WriteVariableToStorage(global.GetClientLogModeStorageKeyValue(), !logMode);\r\n\r\n alertify.message(\"Client log mode enabled: \" + !logMode);\r\n }\r\n\r\n public static getSiteBaseUrl(): string {\r\n return $(\"#siteBaseUrl\").val() as string;\r\n }\r\n\r\n public static setHelpLink(): void {\r\n //nastavi help link, v odvisnosti od lokalizacije\r\n let _this = this;\r\n let svgHelp: any = document.getElementById('saop-help');\r\n\r\n if(svgHelp != null)\r\n {\r\n let language = svgHelp.getAttribute(\"data-language\");\r\n\r\n //počakamo da se gneszdeni objekt naloži\r\n svgHelp.addEventListener(\"load\", function () {\r\n let svgHelpLink = svgHelp.contentDocument.getElementById(\"saop-help-link\");\r\n if (_this.isUnDefined(svgHelpLink) == false) {\r\n if (language == \"hr\") {\r\n svgHelpLink.setAttribute(\"href\", \"http://help.saop.hr/hr/mojinfo\");\r\n }\r\n else if (language == \"sr\") {\r\n svgHelpLink.setAttribute(\"href\", \"http://www.saop.rs/icenter/100/uputstva-za-upotrebu/\");\r\n }\r\n else {\r\n svgHelpLink.setAttribute(\"href\", \"https://si-icenter.knowledgeowl.com/help/mojinfo-navodila-za-uporabo-prenovljenega-portala\");\r\n }\r\n }\r\n });\r\n\r\n //zaradi braskalnik - mozilla firefox - izgleda, da je object ''loaded'' preden mu dodamo on loaded\r\n if($('#saop-help-link') != null)\r\n {\r\n const event = new Event('load');\r\n svgHelp.dispatchEvent(event);\r\n }\r\n }\r\n }\r\n\r\n public static formatDate(date: Date, format: string): string {\r\n const to2 = (n: number): string => ((Math.abs(n) < 10 ? '0' : '') + Math.abs(n));\r\n return format.replace(/[ydmh]+/gi, (match: string): string => {\r\n switch (match) {\r\n case 'yyyy': return date.getFullYear().toString();\r\n case 'd': return date.getDate().toString();\r\n case 'dd': return to2(date.getDate());\r\n case 'm': return (date.getMonth() + 1).toString();\r\n case 'mm': return to2(date.getMonth() + 1);\r\n case 'H': return date.getHours().toString();\r\n case 'HH': return to2(date.getHours());\r\n case 'MM': return to2(date.getMinutes());\r\n default:\r\n return match;\r\n }\r\n });\r\n }\r\n\r\n public static convertString2Date(stringDate: string, format: string): Date {\r\n global.ConsoleLogDegug(\"convertString2Date\");\r\n\r\n switch (format) {\r\n case \"dd.mm.yyyy\":\r\n let day = stringDate.substring(0, 2);\r\n let month = stringDate.substring(3, 5);\r\n let year = stringDate.substring(6, 10);\r\n\r\n return new Date(+year, +month - 1, +day);\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n public static convertString2Number(stringVal: string): number {\r\n global.ConsoleLogDegug(\"convertString2Number\");\r\n\r\n let numberVal = parseInt(stringVal)\r\n\r\n if (isNaN(numberVal)) {\r\n return null;\r\n }\r\n\r\n return numberVal;\r\n }\r\n\r\n public static setModalFormZIndex(modalFormId: string): void {\r\n global.ConsoleLogDegug(\"setModalFormZIndex\");\r\n global.ConsoleLogDegug(\"modalFormId:\" + modalFormId);\r\n var zIndex = 1050 + (10 * $('.modal:visible').length);\r\n\r\n $(modalFormId).css('z-index', zIndex);\r\n setTimeout(function () {\r\n $('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack');\r\n }, 0);\r\n }\r\n\r\n public static isEmpty(str: string) {\r\n return (!str || str.length === 0);\r\n }\r\n\r\n public static isUnDefined(_obj: any) {\r\n return (!_obj || _obj === null || typeof _obj === \"undefined\");\r\n }\r\n\r\n public static ReadVariableFromStorage(variableName: string): string {\r\n return localStorage.getItem(variableName);\r\n }\r\n\r\n public static WriteVariableToStorage(variableName: string, value: any): void {\r\n localStorage.setItem(variableName, value);\r\n }\r\n\r\n public static filterTableRows(filterVal: string, idTableElement: string): void {\r\n global.ConsoleLogDegug(\"filterTableRows\");\r\n\r\n let val = $.trim(filterVal).replace(/ +/g, ' ').toLowerCase();\r\n let rows = $(idTableElement + \" tr:has(td)\");\r\n\r\n rows.show().filter(function () {\r\n var text = $(this).text().replace(/\\s+/g, ' ').toLowerCase();\r\n return !~text.indexOf(val);\r\n }).hide();\r\n }\r\n\r\n public static setFirstFormControlToFocus(formId: string): void {\r\n global.ConsoleLogDegug(\"setFirstFormControlToFocus\");\r\n\r\n // brez timeout funkcije focus ne dela :(\r\n setTimeout(function () {\r\n var firstFormControl = $(formId + \" .form-control:visible:not(:disabled):first\");\r\n if (firstFormControl) {\r\n firstFormControl.focus();\r\n }\r\n }, 500);\r\n }\r\n\r\n public static getRelativeSiteURL(controller: string): string {\r\n let _url = window.location.href;\r\n let iC = _url.indexOf(controller);\r\n if (iC > 0) {\r\n return _url.substring(0, iC) + controller;\r\n } else {\r\n return window.location.href;\r\n }\r\n }\r\n\r\n public static getSiteAbsoluteURL(relativePath: string): string {\r\n let controller = relativePath.split(\"/\")[0];\r\n let method = relativePath.replace(controller, \"\").replace(\"//\", \"\");\r\n\r\n // če relative path že vsebuje http, ga ne dodamo\r\n if (relativePath.indexOf(\"http\") >= 0) {\r\n return relativePath;\r\n }\r\n\r\n return global.getSiteBaseUrl() + \"/\" + controller + method;\r\n }\r\n\r\n public static relodeCurrentPage(): void {\r\n window.location.reload();\r\n }\r\n\r\n public static getHtmlInputStringValue(parentId: string, elementId: string): string {\r\n let elementSelector = parentId === null ? elementId : parentId + \" \" + elementId;\r\n\r\n let element = $(elementSelector)\r\n return element.val().toString();\r\n }\r\n\r\n public static getHtmlInputNumericValue(parentId: string, elementId: string): number {\r\n return Number(this.getHtmlInputStringValue(parentId, elementId));\r\n }\r\n\r\n public static getHtmlInputBooleanValue(parentId: string, elementId: string): boolean {\r\n return this.getHtmlInputStringValue(parentId, elementId).toLowerCase() == \"true\" ? true : false;\r\n }\r\n\r\n public static getJQueryInputStringValue(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.val().toString();\r\n }\r\n\r\n public static getJQueryInputNumericValue(element: JQuery): number {\r\n let strVal = this.getJQueryInputStringValue(element);\r\n if (strVal == null || this.isEmpty(strVal)) {\r\n return null;\r\n }\r\n return Number(strVal);\r\n }\r\n\r\n public static getJQueryTextAreaStringValue(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.val().toString();\r\n }\r\n\r\n public static getJQuerySelectValue(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.val().toString();\r\n }\r\n\r\n public static isStringValueInStringValueList(stringValue: string, stringValueList: string[]): boolean {\r\n let retVal = false;\r\n\r\n stringValueList.forEach((item) => {\r\n if (item === stringValue) {\r\n retVal = true;\r\n }\r\n });\r\n\r\n return retVal;\r\n }\r\n\r\n public static getJQuerySelectText(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.find(\"option:selected\").text();\r\n }\r\n\r\n static copyToClipboard(copyText: string): void {\r\n navigator.clipboard.writeText(copyText);\r\n }\r\n}\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopCheckboxSwitch {\r\n\r\n init(parentElement: string = \"\") {\r\n this.checkboxSwitchOnClick(parentElement);\r\n this.switchLabelOnClick(parentElement);\r\n }\r\n\r\n checkboxSwitchOnClick(parentElement: string) {\r\n global.ConsoleLogDegug(\"saop-switch-checkbox...\");\r\n global.ConsoleLogDegug(\"saop-switch-checkbox parentElement: \" + parentElement);\r\n\r\n let _frame = $(\"\" + parentElement + \" *>.saop-switch-checkbox\");\r\n _frame.off(\"click\");\r\n _frame.click(function (event: any) {\r\n let _checkBox = event.target;\r\n let _atrParent = \"#\"+$(_checkBox).attr(\"for\");\r\n let _checkBoxP = $(\"\" + parentElement + \" *>\" + _atrParent);\r\n let _label1 = _checkBoxP.find(\"#saop-switch-label1\");\r\n let _label2 = _checkBoxP.find(\"#saop-switch-label2\");\r\n if (_checkBox.checked) {\r\n global.ConsoleLogDegug(\"checked\");\r\n _label1.removeClass('switch-label-on');\r\n _label1.addClass('switch-label-off');\r\n _label2.removeClass('switch-label-off');\r\n _label2.addClass('switch-label-on');\r\n } else {\r\n global.ConsoleLogDegug(\"unchecked\");\r\n _label1.removeClass('switch-label-off');\r\n _label1.addClass('switch-label-on');\r\n _label2.removeClass('switch-label-on');\r\n _label2.addClass('switch-label-off');\r\n }\r\n });\r\n }\r\n\r\n switchLabelOnClick(parentElement: string) {\r\n global.ConsoleLogDegug(\"saop-switch-label...\");\r\n global.ConsoleLogDegug(\"saop-switch-label parentElement: \" + parentElement);\r\n\r\n let _frame = $(\"\" + parentElement + \" *>.saop-switch-label\");\r\n _frame.off(\"click\");\r\n _frame.click(function (event: any) {\r\n let _switchLabel = event.target;\r\n let _atrCheckBox = \"#\"+$(_switchLabel).attr(\"for\");\r\n let _checkBox = $(_atrCheckBox);\r\n $(_checkBox).prop( 'checked', 'flase');\r\n });\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopFloatingLabel {\r\n\r\n init() {\r\n let _this = this;\r\n $('.has-float-label > .form-control:not([readonly=\"readonly\"])').off(\"focus\",_this.saopInputOnFocus);\r\n $('.has-float-label > .form-control:not([readonly=\"readonly\"])').on(\"focus\",_this.saopInputOnFocus);\r\n\r\n $('.has-float-label > .form-control').off(\"blur\",_this.saopInputOnBlur);\r\n $('.has-float-label > .form-control').on(\"blur\",_this.saopInputOnBlur);\r\n \r\n $('.has-float-label > .form-control').off(\"focusout\",_this.saopInputOnChange);\r\n $('.has-float-label > .form-control').on(\"focusout\",_this.saopInputOnChange);\r\n\r\n }\r\n\r\n saopInputOnChange(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...saopInputOnChange\");\r\n let htmlElement = e.target;\r\n let _node = $(\"#\"+htmlElement.id);\r\n if (_node.length > 0){\r\n let _parentN = _node.parent();\r\n if (_parentN.length > 0){\r\n _parentN.removeClass(\"saop-error-input\");\r\n let _label = _parentN.find(\".text-danger\");\r\n if (_label.length > 0){\r\n _label.remove();\r\n }\r\n }\r\n }\r\n } \r\n\r\n saopInputOnFocus(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...\");\r\n //barvanje \"floating label\"\r\n let htmlElement = e.target;\r\n htmlElement.parentElement.querySelector('.saop-floating-label').classList.add(\"saop-txt-primary\");\r\n }\r\n \r\n saopInputOnBlur(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...\");\r\n //barvanje \"floating label\" on input blur (focus lost) nazaj v sivo (remove razred \"saop-txt-primary\")\r\n let htmlElement = e.target;\r\n htmlElement.parentElement.querySelector('.saop-floating-label').classList.remove(\"saop-txt-primary\");\r\n }\r\n\r\n\r\n setCaptionAsRequired(labelId:string,required:boolean):void{\r\n let _element = $(labelId);\r\n let _elementVal = _element.text().toString();\r\n _elementVal = _elementVal.replace(\"*\",\"\");\r\n if (required) {\r\n _element.text(_elementVal+\"*\");\r\n } else {\r\n _element.text(_elementVal);\r\n }\r\n } \r\n\r\n //\r\n}","/// \r\nimport { global } from \"../Common/saop-common\";\r\n\r\nclass selectItem {\r\n value: string;\r\n text: string;\r\n}\r\n\r\nclass EditableColumnData {\r\n tip: string;\r\n selectItems: selectItem[];\r\n numericMinValue: number;\r\n numericMaxValue: number;\r\n}\r\n\r\nexport class SaopWebGridEdit {\r\n public libName: string; \r\n\r\n private _EditableColumnData: EditableColumnData;\r\n private _tdElement: HTMLTableCellElement;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n } \r\n\r\n showWebGridEditableColumnEditControl(tdElement: HTMLTableCellElement): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.showWebGridEditableColumnEditControl\");\r\n\r\n this._tdElement = tdElement;\r\n let tdElementHtml = this._tdElement.innerHTML;\r\n\r\n if (tdElementHtml.toLowerCase().indexOf(\"saop-table-edit-container\") >= 0) {\r\n // edit kontrola ze obstaja\r\n return;\r\n }\r\n\r\n this._EditableColumnData = this.getDataAttribute(this._tdElement);\r\n\r\n this.AddEditableColumnEditHtml(this._EditableColumnData.tip);\r\n }\r\n\r\n onWriteValueToTDElementComplete(tdElement: HTMLTableCellElement): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.onWriteValueToTDElementComplete\");\r\n }\r\n\r\n private getDataAttribute(element: HTMLElement): EditableColumnData {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.getDataAttribute\");\r\n\r\n let data = new EditableColumnData();\r\n\r\n data.tip = element.getAttribute(\"data-edit-type\");\r\n data.selectItems = $.parseJSON(element.getAttribute(\"data-edit-select-items\"));\r\n data.numericMinValue = parseInt(element.getAttribute(\"data-edit-number-min\"));\r\n data.numericMaxValue = parseInt(element.getAttribute(\"data-edit-number-max\"));\r\n\r\n return data;\r\n }\r\n\r\n private AddEditableColumnEditHtml(tip: string): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.AddEditableColumnEditHtml\");\r\n\r\n let tdElementText = this._tdElement.innerText;\r\n\r\n let input = this.getInputElement(tip, tdElementText);\r\n\r\n let containerCellDiv = document.createElement('div');\r\n containerCellDiv.classList.add(\"saop-table-edit-container-cell\");\r\n containerCellDiv.appendChild(input);\r\n\r\n let containerDiv = document.createElement('div');\r\n containerDiv.classList.add(\"saop-table-edit-container\");\r\n containerDiv.appendChild(containerCellDiv);\r\n\r\n this._tdElement.innerHTML = containerDiv.outerHTML;\r\n\r\n this.setInputElementAfterInit(tip, tdElementText);\r\n }\r\n\r\n private getInputElement(tip: string, inputValue: string): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.getInputElement\");\r\n\r\n let input: HTMLElement;\r\n\r\n switch (tip) {\r\n case \"text\":\r\n input = this.generateTextHtml();\r\n break;\r\n case \"textarea\":\r\n input = this.generateTextareaHtml();\r\n break;\r\n case \"select\":\r\n input = this.generateSelectHtml(inputValue);\r\n break;\r\n case \"number\":\r\n input = this.generateNumberHtml();\r\n break;\r\n default:\r\n input = this.generateTextHtml();\r\n }\r\n\r\n return input;\r\n }\r\n\r\n private generateTextHtml(): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateTextHtml\");\r\n\r\n let input: HTMLInputElement;\r\n\r\n input = document.createElement('input');\r\n input.type = \"text\";\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n\r\n return input;\r\n }\r\n\r\n private generateTextareaHtml(): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateTextareaHtml\");\r\n\r\n let input: HTMLTextAreaElement;\r\n\r\n input = document.createElement('textarea');\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n input.classList.add(\"saop-table-edit-container-cell-input-textarea\");\r\n\r\n return input;\r\n } \r\n\r\n private generateSelectHtml(selectValue: string): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateSelectHtml\");\r\n\r\n let input: HTMLSelectElement;\r\n\r\n input = document.createElement(\"select\");\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n\r\n this._EditableColumnData.selectItems.forEach((item) => {\r\n input.options.add(new Option(item.text, item.value, selectValue === item.value));\r\n });\r\n\r\n return input;\r\n }\r\n\r\n private generateNumberHtml(): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateNumberHtml\");\r\n\r\n let input: HTMLInputElement;\r\n\r\n input = document.createElement('input');\r\n input.type = \"number\";\r\n if (this._EditableColumnData.numericMinValue) {\r\n input.min = this._EditableColumnData.numericMinValue.toString();\r\n }\r\n if (this._EditableColumnData.numericMaxValue) {\r\n input.max = this._EditableColumnData.numericMaxValue.toString();\r\n }\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n\r\n return input;\r\n }\r\n\r\n private setInputElementAfterInit(tip: string, tdElementText: string): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.setInputElementAfterInit\");\r\n\r\n if (tip === \"text\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"input\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeInputValueToTDElement.bind(this);\r\n }\r\n else if (tip === \"textarea\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"textarea\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeTextAreaValueToTDElement.bind(this);\r\n }\r\n else if (tip === \"select\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"select\")[0];\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeSelectValueToTDElement.bind(this);\r\n }\r\n else if (tip === \"number\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"input\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeNumberValueToTDElement.bind(this);\r\n }\r\n else {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"input\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeInputValueToTDElement.bind(this);\r\n }\r\n }\r\n\r\n private writeValueToTDElement(element: HTMLElement, inputVal: string): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeValueToTDElement\");\r\n\r\n let tempElement = element;\r\n\r\n // poiscemo parent element, ki ima class saop-table-edit-container. Njegov parent je TD element.\r\n for (var i = 0; i < 10; i++) {\r\n if (tempElement.classList.contains(\"saop-table-edit-container\")) {\r\n let tdElement = tempElement.parentElement;\r\n tdElement.innerHTML = inputVal;\r\n\r\n this.onWriteValueToTDElementComplete(this._tdElement);\r\n break;\r\n }\r\n tempElement = tempElement.parentElement;\r\n }\r\n }\r\n\r\n private writeInputValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeInputValueToTDElement\");\r\n\r\n let target: HTMLInputElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v innerhtml vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n\r\n private writeTextAreaValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeTextAreaValueToTDElement\");\r\n\r\n let target: HTMLTextAreaElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v inner html vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n\r\n private writeSelectValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeSelectValueToTDElement\");\r\n\r\n let target: HTMLSelectElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v inner html vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n\r\n private writeNumberValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeNumberValueToTDElement\");\r\n\r\n let target: HTMLInputElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v inner html vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { SaopInputWFL,SaopInputWFLProperties } from './saop-input-wfl'\r\nimport { SaopselectWFL } from './saop-select-wfl'\r\n\r\nexport class SaopWebGridFilter {\r\n public id:string = \"wgf1\";\r\n public modalFilterArray: any = [];\r\n //This function initializes the content inside the filter modal\r\n configFilter(libName:string,htmlTable: any, colArray: any) {\r\n let _this = this;\r\n setTimeout(function () {\r\n var tableName = htmlTable[0].id;\r\n var columns = htmlTable.api().columns();\r\n $.each(colArray, function (i, arg) {\r\n let _colNo = arg.toString();\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').attr(\"id\",\"column-header-\"+ _colNo +\"\");\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append('');\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append(\"   \");\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append(\"
\");\r\n });\r\n\r\n var template =\r\n '
' +\r\n '
' +\r\n '{0}
' +\r\n '
' +\r\n 'V redu' + \r\n 'Zbriši' +\r\n 'Prekliči' +\r\n '
' +\r\n '
';\r\n\r\n $.each(colArray, function (index: any, value: any) {\r\n columns.every(function (i: any) {\r\n if (value === i) {\r\n var column = this, \r\n content = '';//'
';\r\n var columnName = $(this.header()).text().replace(/\\s+/g, \"_\");\r\n var distinctArray: any[] = [];\r\n column.data().each(function (d: string, j: any) {\r\n if (distinctArray.indexOf(d) == -1) {\r\n var id = tableName + \"_\" + columnName + \"_\" + j; // onchange=\"formatValues(this,' + value + ');\r\n content += '
';\r\n distinctArray.push(d);\r\n }\r\n }); \r\n var newTemplate = $(template.replace('{0}', content).replace('{1}', value).replace('{1}', value).replace('{2}', tableName).replace('{2}', tableName));\r\n $('body').append(newTemplate);\r\n _this.modalFilterArray[tableName + \"_\" + value] = newTemplate;\r\n content = '';\r\n }\r\n });\r\n });\r\n }, 50);\r\n\r\n }\r\n\r\n\r\n //User to show the filter modal\r\n showFilter(e: any, index: any) {\r\n $('.modalFilter').hide();\r\n $(this.modalFilterArray[index]).css({ left: 0, top: 0 });\r\n var th = $(e.target).parent();\r\n var pos = th.offset();\r\n let arrayItem = this.modalFilterArray[index];\r\n //$(this.modalFilterArray[index]).width(th.width() * 0.75);\r\n $(arrayItem).css({ 'left': pos.left, 'top': pos.top, 'min-width':(th.width() * 0.75) });\r\n $(arrayItem).show();\r\n e.stopPropagation();\r\n }\r\n\r\n updateTableHeaderStatus(tableId:string,columnId:string,activeFilter:boolean){\r\n let _colFilterId = columnId+\"-filter\";\r\n let _colFilter = $(tableId).find(_colFilterId)[0];\r\n let _colFilterAtr = _colFilter.getAttribute(\"class\");\r\n if(activeFilter){\r\n _colFilterAtr.replace(\"saop-img-filter\", \"saop-img-filter saop-cl-blue\");\r\n } else {\r\n _colFilterAtr.replace(\"saop-img-filter saop-cl-blue\", \"saop-img-filter\");\r\n \r\n }\r\n }\r\n\r\n //This function is to use the searchbox to filter the checkbox\r\n filterValues(node: any) {\r\n var searchString = $(node).val().toString().toUpperCase().trim();\r\n var rootNode = $(node).parent();\r\n if (searchString == '') {\r\n rootNode.find('div').show();\r\n } else {\r\n rootNode.find(\"div\").hide();\r\n rootNode.find(\"div:contains('\" + searchString + \"')\").show();\r\n }\r\n }\r\n\r\n //Execute the filter on the table for a given column\r\n performFilter(node: any, i: any, tableId: any) {\r\n var rootNode = $(node).parent().parent();\r\n var searchString = '', counter = 0;\r\n\r\n rootNode.find('input:checkbox').each(function (index: any, checkbox: any) {\r\n if (checkbox.checked) {\r\n searchString += (counter == 0) ? checkbox.value : '|' + checkbox.value;\r\n counter++;\r\n }\r\n });\r\n\r\n let _colId = \"#column-header-\"+i.toString();\r\n if(counter > 0){\r\n this.updateTableHeaderStatus('#' +tableId,_colId,true);\r\n } else {\r\n this.updateTableHeaderStatus('#' +tableId,_colId,false);\r\n }\r\n\r\n $('#' + tableId).DataTable().column(i).search(\r\n searchString,\r\n true, false\r\n ).draw();\r\n rootNode.hide();\r\n }\r\n\r\n //Removes the filter from the table for a given column\r\n clearFilter(node: any, i: any, tableId: any) {\r\n var rootNode = $(node).parent().parent();\r\n rootNode.find(\".filterSearchText\").val('');\r\n rootNode.find('input:checkbox').each(function (index: any, checkbox: any) {\r\n checkbox.checked = false;\r\n $(checkbox).parent().show();\r\n });\r\n\r\n let _colId = \"#column-header-\"+i.toString();\r\n this.updateTableHeaderStatus('#' +tableId,_colId,false);\r\n\r\n $('#' + tableId).DataTable().column(i).search(\r\n '',\r\n true, false\r\n ).draw();\r\n rootNode.hide();\r\n }\r\n\r\n hideFilter(node: any, i: any, tableId: any) {\r\n $('.modalFilter').hide();\r\n }\r\n\r\n setResizeEvent(gridId:string){\r\n var _tableDiv = $(\"table\"+gridId+\" th\") as any;\r\n\t var thHeight = $(\"table\"+gridId+\" th:first\").height();\r\n\t _tableDiv.resizable({\r\n\t\t handles: \"e\",\r\n\t\t minHeight: thHeight,\r\n\t\t maxHeight: thHeight,\r\n\t\t minWidth: 40,\r\n\t\t resize: function (event:any, ui:any) {\r\n console.log(\"resize...\");\r\n var sizerid = \"#\" + $(event.target).attr(\"id\") + \"-sizer\";\r\n $(sizerid).width(ui.size.width);\r\n\t\t }\r\n\t }); \r\n }\r\n\r\n setSortElementEvent(gridId: string):void{\r\n let _this = this;\r\n $(gridId).on('click', 'th', function () {\r\n _this.setSortElement(gridId);\r\n });\r\n }\r\n \r\n setSortElement(gridId: string):void {\r\n $(\"\" + gridId + \" thead:first th\").each(function (i, th) {\r\n let _col = $(th);\r\n let _colId = \"#\"+_col.attr('id');\r\n //let _sortType = _col.attr(\"column-sort\");\r\n let _colIconIdUp = _colId+\"-icon-up\";\r\n let _colIconId = _colId+\"-icon\";\r\n let _colIconUpElement = $(gridId+' '+_colIconIdUp);\r\n let _colIconElement = $(gridId+' '+_colIconId);\r\n let cls = $(th).attr('class');\r\n\r\n //if (_sortType != null) {\r\n if (cls != null && cls.indexOf(\"no-sort\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\"); \r\n _colIconElement.removeClass(\"saop-cl-blue\"); \r\n } \r\n else if (cls != null && cls.indexOf(\"sorting_asc\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.addClass(\"saop-img-arrow-up saop-cl-blue\");\r\n } else if (cls != null && cls.indexOf(\"sorting_desc\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.addClass(\"saop-img-arrow-down saop-cl-blue\"); \r\n } else {\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\"); \r\n _colIconElement.removeClass(\"saop-cl-blue\"); \r\n _colIconElement.addClass(\"saop-img-arrow-up\");\r\n _colIconUpElement.addClass(\"saop-img-arrow-down\");\r\n }\r\n //}\r\n });\r\n } \r\n\r\n configSimpleFilter(dataTable: any):void {\r\n let _this = this;\r\n let tableId = \"#\"+dataTable[0].id;\r\n let _iCount = 0;\r\n var _filterEnable = false;\r\n let _th_columns = $(tableId).find('th');\r\n _th_columns.each( \r\n function () {\r\n _iCount = _iCount + 1;\r\n let _element = $(this);\r\n let _filterType = _element.attr(\"column-filter\"); \r\n let _nosort = _element.hasClass(\"no-sort\");\r\n let _actionColumn = _element.hasClass(\"saop-table-th-last\");\r\n _element.attr(\"id\",\"column-header-\"+ _iCount +\"\");\r\n _element.css(\"outline\",\"none\");\r\n let col_title = _element.text();\r\n //let col_max_width = col_title.length * 7;\r\n _element.text(\"\");\r\n\r\n //_element.append(\"
\"+col_title+\"
\");\r\n _element.append(\"
\"+col_title+\"
\");\r\n \r\n if (_filterType != null && _filterType.toLowerCase() == \"text\"){\r\n _filterEnable = true;\r\n } else if (_filterType != null && _filterType.toLowerCase() == \"dropdown\"){\r\n _filterEnable = true;\r\n }\r\n\r\n if (_actionColumn != null && _actionColumn == true){\r\n _nosort = true;\r\n }\r\n\r\n if (_nosort == null ||_nosort == false){\r\n _element.append(\"
\");\r\n _element.append(\"
\"); \r\n }\r\n _element.append(\"
\");\r\n }\r\n );\r\n\r\n if (_filterEnable) {\r\n $(tableId+' thead tr')\r\n .clone(true)\r\n .addClass('filters')\r\n .appendTo(tableId+' thead');\r\n\r\n // Setup - add a text input to each footer cell\r\n let _filters = $(tableId).find('.filters');\r\n let _filters_th = _filters.find('th');\r\n _iCount = 0;\r\n _filters_th.each( \r\n function () {\r\n _iCount = _iCount + 1;\r\n let _element = $(this);\r\n _element.off();\r\n\r\n _element.html(\"\");\r\n\r\n let _filterType = _element.attr(\"column-filter\");\r\n\r\n while(_element[0].attributes.length > 0)\r\n _element[0].removeAttribute(_element[0].attributes[0].name);\r\n\r\n let _colId = \"col_\"+_iCount.toString(); \r\n _element.attr(\"id\",_colId);\r\n let _inputId = _colId+\"_filter\"; \r\n let title = _element.text();\r\n \r\n if (_filterType != null && _filterType.toLowerCase() == \"text\"){\r\n let _inputE = new SaopInputWFL({id:_inputId,caption:title,placeholder:title}).getInnerHtml();\r\n _element.html(_inputE);\r\n } else if (_filterType != null && _filterType.toLowerCase() == \"dropdown\"){\r\n let _selectId = _colId+\"_select\"; \r\n let selectHtml = new SaopselectWFL({id:_selectId,caption:\"\",placeholder:\"\"}).getInnerHtml();\r\n let select = $(selectHtml); \r\n //\r\n\r\n let _index = _iCount;\r\n _index = _index - 1;\r\n\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .data()\r\n .unique()\r\n .sort()\r\n .each(function (d:any, j:any) {\r\n if (d.length > 0){\r\n let _content = d;\r\n let _firstChar = _content[0];\r\n if (_firstChar.charCodeAt(0) > 1000) {_content = _content.replace(_firstChar+\" \",\"\");}\r\n select.find('select').last().append('');\r\n }\r\n });\r\n\r\n _element.append(select);\r\n } \r\n } \r\n );\r\n\r\n // Apply the filter\r\n $(tableId+\" thead input\").on( 'keyup change', function () {\r\n const target = event.target as HTMLInputElement;\r\n let _index = $(this).parent().parent().index();\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .search( target.value )\r\n .draw();\r\n\r\n //var val = $.fn.dataTable.util.escapeRegex(target.value);\r\n //dataTable.DataTable().search(val ? '^' + val + '$' : '', true, false).draw();\r\n\r\n } ); \r\n \r\n // Apply the dropdown filter\r\n $(tableId+\" thead select\").on( 'change', function () {\r\n const target = event.target as HTMLInputElement;\r\n let _index = $(this).parent().parent().index();\r\n var val = $.fn.dataTable.util.escapeRegex(target.value);\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .search(val ? '^' + val + '$' : '', true, false)\r\n .draw();\r\n } ); \r\n\r\n //\r\n }\r\n\r\n\r\n }\r\n\r\n configSimpleSort(gridId: string):void {\r\n this.setSortElement(gridId);\r\n this.setSortElementEvent(gridId);\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopWebGridFilter } from \"../Components/saop-grid-filter\";\r\nimport { DataTables } from \"../@types/data-tables/types\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport { SaopWebGridEdit } from \"../Components/saop-grid-edit\";\r\n\r\n\r\n// function statusFormatter(row: number, cell: number, value: any, columnDef: Slick.Column, dataContext: Slick.SlickData) {\r\n// if (value == null || value === \"\") {\r\n// return \"-\";\r\n// } else if (value < 50) {\r\n// return \"\" + value + \"%\";\r\n// } else {\r\n// return \"\" + value + \"%\";\r\n// }\r\n// }\r\n\r\nexport interface SaopWebGridToolbar {\r\n id?:string,\r\n caption:string,\r\n buttons?:SaopWebGridToolbarButton[]\r\n itemsTemplateId?: string;\r\n} \r\n\r\nexport interface SaopWebGridToolbarButton {\r\n id:string,\r\n caption :string, \r\n class? :string,\r\n attributes?:string,\r\n onClickEvent?:string,\r\n template?: string;\r\n} \r\n\r\nexport interface SaopWebGridTogglePanel {\r\n enabled:boolean\r\n} \r\n\r\nexport interface SaopWebGridProperties {\r\n gridId:string\r\n ,css?:string\r\n ,togglePanel?:SaopWebGridTogglePanel\r\n ,toolbar?:SaopWebGridToolbar \r\n ,dataTable?:SaopWebDataTable\r\n}\r\n\r\nexport interface SaopWebDataTable {\r\n enabled:boolean\r\n ,columnDefsSettings?: DataTables.ColumnDefsSettings[]\r\n ,ordering?:boolean\r\n ,columns?:any[]\r\n ,data?: any\r\n ,order?: Array<(number | string)> | Array>\r\n ,editable?:boolean\r\n}\r\n\r\nexport class SaopWebGrid {\r\n private _properties:SaopWebGridProperties\r\n private _tableDiv:HTMLTableElement;\r\n private _translationService: SaopTranslationService;\r\n private _saopWebGridEdit: SaopWebGridEdit;\r\n //\r\n public libName: string; \r\n public webGridFilter:SaopWebGridFilter;\r\n public dataTable: DataTables.Api;\r\n public markedColumnCheckbox: JQuery;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n this.webGridFilter = new SaopWebGridFilter();\r\n this._translationService = new SaopTranslationService();\r\n this._saopWebGridEdit = new SaopWebGridEdit(\"_saopWebGridEdit\"); \r\n this._saopWebGridEdit.onWriteValueToTDElementComplete = this.onWriteValueToTDElementComplete.bind(this);\r\n } \r\n\r\n setTerminologyList(){\r\n let _terminology: string[] = ['Ni podatkov za prikaz.'];\r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n //\r\n init(gridProp:SaopWebGridProperties) {\r\n this._properties = gridProp;\r\n this._tableDiv = document.querySelector(gridProp.gridId) as HTMLTableElement;\r\n //\r\n let _togglePanelDefault = {enabled:true};\r\n gridProp.togglePanel = {..._togglePanelDefault, ...gridProp.togglePanel}\r\n if (global.isUnDefined(gridProp.togglePanel)){\r\n gridProp.togglePanel = _togglePanelDefault;\r\n } \r\n //\r\n\r\n this.webGridFilter.id = gridProp.gridId+\"filter\";\r\n this.generateHtmlTable();\r\n this.addGridToolbar();\r\n // det defaults\r\n let _Msg_emptyTable = this._translationService.translate(\"Ni podatkov za prikaz.\")\r\n\r\n let _dataTableDef = {enabled:true,ordering:true};\r\n gridProp.dataTable = {..._dataTableDef, ...gridProp.dataTable}\r\n\r\n if (global.isUnDefined(gridProp.dataTable)){\r\n gridProp.dataTable = gridProp.dataTable;\r\n } \r\n\r\n let _columnDefsSettingsDef = [{orderable: true, targets: \"no-sort\"}];\r\n gridProp.dataTable.columnDefsSettings = {..._columnDefsSettingsDef,...gridProp.dataTable.columnDefsSettings}\r\n\r\n if (global.isUnDefined(gridProp.dataTable.columnDefsSettings)){\r\n gridProp.dataTable.columnDefsSettings = _columnDefsSettingsDef;\r\n }\r\n //\r\n if (!global.isUnDefined(this._properties.dataTable) \r\n && this._properties.dataTable.enabled\r\n ){\r\n let _this = this;\r\n this.dataTable = \r\n $(gridProp.gridId).DataTable(\r\n {\r\n \"paging\": false\r\n , \"searching\": true\r\n ,\"autoWidth\": true\r\n ,orderCellsTop: true\r\n //, \"dom\": \"Rlfrtip\"\r\n , initComplete: function () {\r\n if (gridProp.dataTable.ordering){\r\n _this.webGridFilter.configSimpleFilter(this); \r\n _this.webGridFilter.configSimpleSort(_this._properties.gridId); \r\n }\r\n //if(!isUnDefined(_this._properties.dataTable.filters)) {\r\n // _this.webGridFilter.configFilter(_this.libName,this, _this._properties.dataTable.filters);\r\n //}\r\n }\r\n ,order: _this._properties.dataTable.order\r\n // ,ajax: function (data, callback, settings) {\r\n // callback({ data: data }) //reloads data \r\n // } \r\n ,columnDefs: _this._properties.dataTable.columnDefsSettings \r\n ,ordering : gridProp.dataTable.ordering \r\n ,language : {emptyTable:_Msg_emptyTable,zeroRecords:_Msg_emptyTable}\r\n }\r\n ); \r\n //\r\n $(gridProp.gridId+\"_filter\").remove();\r\n $(gridProp.gridId+\"_info\").remove(); \r\n this.webGridFilter.setResizeEvent(this._properties.gridId);\r\n //\r\n }\r\n \r\n //\r\n if (this._properties.dataTable.editable) {\r\n this.initWebGridEditableColumnClickEvents();\r\n }\r\n }\r\n\r\n addToolbarButtons(gridPanel: JQuery,buttons:SaopWebGridToolbarButton[]){\r\n if(global.isUnDefined(buttons) == false){\r\n buttons.forEach(_button => {\r\n var buttonTemplate = \r\n `\r\n
\r\n \r\n
\r\n `;\r\n\r\n if (_button.template != null) {\r\n buttonTemplate = _button.template;\r\n }\r\n\r\n gridPanel.find(\"#toolbarButtons\").append(buttonTemplate); \r\n });\r\n }\r\n }\r\n\r\n generateHtmlTable() {\r\n this.generateTableBody(); \r\n this.generateTableHead();\r\n }\r\n\r\n generateTableHead() {\r\n if (!global.isUnDefined(this._properties.dataTable)){\r\n if(!global.isUnDefined(this._properties.dataTable.columns)){\r\n let thead = this._tableDiv.createTHead();\r\n let row = thead.insertRow();\r\n for (let key of this._properties.dataTable.columns) {\r\n let th = document.createElement(\"th\");\r\n let text = document.createTextNode(key.name);\r\n th.appendChild(text);\r\n row.appendChild(th);\r\n }\r\n }\r\n }\r\n }\r\n \r\n generateTableBody() {\r\n if (!global.isUnDefined(this._properties.dataTable)){\r\n if (!global.isUnDefined(this._properties.dataTable.data)){\r\n for (let element of this._properties.dataTable.data) {\r\n let row = this._tableDiv.insertRow();\r\n for (let key in element) {\r\n let cell = row.insertCell();\r\n let text = document.createTextNode(element[key]);\r\n cell.appendChild(text);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n addGridToolbar() {\r\n let gridPanel: JQuery;\r\n let _css = global.isUnDefined(this._properties.css) == false ? this._properties.css :\"\";\r\n\r\n let gridPanelTemplate = `\r\n
\r\n
\r\n
\r\n `;\r\n if (!global.isUnDefined(this._properties.toolbar)) {\r\n if (global.isUnDefined(this._properties.toolbar.id)) {\r\n this._properties.toolbar.id = this._properties.gridId+\"TB\";\r\n }\r\n let gridTogglePanel = ``;\r\n let gridTogglePanelClass = \"\";\r\n let gridBorderBottom = \"\";\r\n if(this._properties.togglePanel.enabled) {\r\n gridTogglePanelClass = \"collapse show\";\r\n gridBorderBottom = \"saop-border-bottom\";\r\n\r\n gridTogglePanel = \r\n `\r\n
\r\n

\r\n ${this._properties.toolbar.caption} \r\n

\r\n
\r\n `; \r\n }\r\n\r\n let _toolbarItems = ``;\r\n if (!global.isUnDefined(this._properties.toolbar.itemsTemplateId)){\r\n let _toolbarItemsTemplate = $(this._properties.toolbar.itemsTemplateId);\r\n if (_toolbarItemsTemplate.length > 0){\r\n _toolbarItems = _toolbarItemsTemplate.html();\r\n _toolbarItemsTemplate.remove();\r\n }\r\n }\r\n\r\n gridPanelTemplate = `\r\n
\r\n ${gridTogglePanel}\r\n
\r\n
\r\n
\r\n ${_toolbarItems}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n `;\r\n }\r\n gridPanelTemplate = gridPanelTemplate.replace(\"#slickGrid#\",this._properties.gridId.replace(\"#\",\"\"));\r\n gridPanel = $(gridPanelTemplate);\r\n if (!global.isUnDefined(this._properties.toolbar)) {\r\n this.addToolbarButtons(gridPanel,this._properties.toolbar.buttons);\r\n }\r\n\r\n let _tableHtml = this._tableDiv;\r\n\r\n $(this._properties.gridId).replaceWith(gridPanel);\r\n\r\n $(this._properties.gridId).replaceWith(_tableHtml);\r\n }\r\n\r\n refreshData(data:any) {\r\n let _this = this;\r\n this.dataTable.clear();\r\n data.each(function( index:any, tr:string ) {\r\n _this.dataTable.row.add($(tr));\r\n });\r\n this.dataTable.draw(); \r\n }\r\n\r\n replaceGridRows(htmlContent:string) {\r\n let _this = this;\r\n this.dataTable.clear();\r\n $(this._properties.gridId+\" > tbody > tr\", $(htmlContent)).each(\r\n function(index:any,tr:any) {\r\n _this.dataTable.row.add($(tr));\r\n }\r\n );\r\n this.dataTable.draw(); \r\n } \r\n\r\n setTabelFoother():void {\r\n $(this._properties.gridId+' body') \r\n }\r\n\r\n initWebGridColumnCheckboxBindClickEvent() {\r\n let _this = this;\r\n this.markedColumnCheckbox = null;\r\n\r\n if (global.isUnDefined(this._tableDiv)) {\r\n return;\r\n }\r\n\r\n $(\"#\" + this._tableDiv.id + \" .saop-td-input-checkbox\").off(\"change\");\r\n $(\"#\" + this._tableDiv.id + \" .saop-td-input-checkbox\").on('change', function (row) {\r\n _this.markedColumnCheckbox = $(\"#\" + _this._tableDiv.id + \" #\" + row.currentTarget.id);\r\n\r\n // odznacimo vse ostale checkboxe\r\n $(\"#\" + _this._tableDiv.id + \" input.saop-td-input-checkbox:not(#\" + row.currentTarget.id + \")\").each(\r\n function () {\r\n $(\"#\" + _this._tableDiv.id + \" #\" + this.id).prop(\"checked\", false);\r\n }\r\n );\r\n\r\n _this.afterColumnCheckboxChanged();\r\n });\r\n }\r\n\r\n afterColumnCheckboxChanged(): void {\r\n\r\n }\r\n\r\n initWebGridEditableColumnClickEvents(): void {\r\n let _this = this;\r\n\r\n $(this._properties.gridId).off(\"click\", \"tbody td[data-editable='true']\");\r\n $(this._properties.gridId).on(\"click\", \"tbody td[data-editable='true']\", function (e) {\r\n _this._saopWebGridEdit.showWebGridEditableColumnEditControl(this);\r\n });\r\n }\r\n \r\n private onWriteValueToTDElementComplete(tdElement: HTMLTableCellElement): void {\r\n this.onEditTdCellWriteValueToTDElementComplete(tdElement);\r\n }\r\n\r\n onEditTdCellWriteValueToTDElementComplete(tdElement: HTMLTableCellElement): void {\r\n // metoda za externo uporabo\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\nexport interface SaopInputWFLProperties {\r\n id:string;\r\n placeholder:string;\r\n caption:string;\r\n}\r\n\r\nexport class SaopInputWFL {\r\n private _inputTemplate:string;\r\n constructor(properties:SaopInputWFLProperties) {\r\n this._inputTemplate = \r\n `\r\n \r\n \r\n \r\n \r\n `; \r\n // this._inputTemplate = \r\n // `\r\n // \r\n // \r\n // \r\n // \r\n // \r\n // `; \r\n }\r\n\r\n getElement():JQuery{\r\n let _element = $(this._inputTemplate);\r\n return _element;\r\n }\r\n\r\n getInnerHtml():string{\r\n return this._inputTemplate;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","\r\n/// \r\n/// \r\n\r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopSelectizeSelect } from \"./saop-selectize-select\";\r\n\r\nexport class SaopInputMask {\r\n\r\n init() {\r\n global.ConsoleLogDegug(\"SaopInputMask.init...\");\r\n var inputDivs = document.querySelectorAll('input[data-inputmask-alias]');\r\n Inputmask().mask(inputDivs);\r\n\r\n $(\".saop-decimal-2\").inputmask({\r\n 'alias': 'decimal',\r\n 'radixPoint': ',',\r\n 'digits': 2,\r\n 'digitsOptional': false,\r\n 'placeholder': '0,00'\r\n });\r\n\r\n $(\".saop-decimal-3\").inputmask({\r\n 'alias': 'decimal',\r\n 'radixPoint': ',',\r\n 'digits': 3,\r\n 'digitsOptional': false,\r\n 'placeholder': '0,000'\r\n }); \r\n\r\n inputDivs.forEach(element => {\r\n global.ConsoleLogDegug(\"element.init......................\" + element.id);\r\n\r\n let spanDiv:any;\r\n let elementAtrr = $(element).attr(\"data-inputmask-alias\");\r\n if (global.isEmpty(elementAtrr)) {return;};\r\n global.ConsoleLogDegug(elementAtrr);\r\n spanDiv = $(element).parent();\r\n if (spanDiv === null) { return;};\r\n if (spanDiv.hasClass(\"has-float-label\")===false) { return;};\r\n global.ConsoleLogDegug(spanDiv.get(0).id);\r\n\r\n let languageAtrr = (String)($(\"#siteLanguage\").val());\r\n global.ConsoleLogDegug(\"language:\"+languageAtrr);\r\n languageAtrr = global.isEmpty(languageAtrr) ? \"sl\" :languageAtrr;\r\n global.ConsoleLogDegug(\"language:\"+languageAtrr);\r\n\r\n if (elementAtrr === \"hh:mm:ss\") {\r\n let iconBtn = $(spanDiv).find(\"#timeIcon\");\r\n global.ConsoleLogDegug(\"clock...\");\r\n\r\n global.ConsoleLogDegug(\"clock.blur.init:\" + element.id);\r\n $(element).blur(function (event: any) {\r\n global.ConsoleLogDegug(\"call.clock.blur:\" + event.target.id);\r\n var controlValue = event.target.value;\r\n if (controlValue.includes(\"h\")) {\r\n event.target.value = \"\";\r\n return;\r\n }\r\n controlValue = controlValue.replace(\"mm\", \"00\");\r\n controlValue = controlValue.replace(\"m\", \"0\");\r\n controlValue = controlValue.replace(\"ss\", \"00\");\r\n controlValue = controlValue.replace(\"s\", \"0\");\r\n event.target.value = controlValue;\r\n // prozimo input even, ker smo vpisali novo vrednost \r\n const e = new Event(\"input\");\r\n event.target.dispatchEvent(e);\r\n });\r\n\r\n global.ConsoleLogDegug(\"clock.click.init:\" + element.id);\r\n $(iconBtn).click(function (event: any) {\r\n global.ConsoleLogDegug(\"clockIcon.clicked:\" + element.id);\r\n var ctrlInputCtrl = $(element).get(0) as HTMLInputElement;\r\n var ctrlInputCtrlStrLength = ctrlInputCtrl.value.length * 2;\r\n ctrlInputCtrl.focus();\r\n ctrlInputCtrl.setSelectionRange(ctrlInputCtrlStrLength, ctrlInputCtrlStrLength);\r\n });\r\n } else if (elementAtrr === \"dd.mm.yyyy\" \r\n // || elementAtrr === \"dd.mm.yyyy hh:mm\" \r\n // || elementAtrr === \"dd.mm.yyyy hh:mm:ss\"\r\n ) {\r\n\r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n\r\n global.ConsoleLogDegug(\"calendar...\");\r\n\r\n let datepickerStartDate = new Date();\r\n if ($(element).attr(\"data-enable-select-pastdates\") != undefined) {\r\n if (($(element).attr(\"data-enable-select-pastdates\")).toLowerCase() == 'true') {\r\n datepickerStartDate = null;\r\n }\r\n }\r\n\r\n if ($(element).attr(\"data-min-start-date\") != undefined) {\r\n var datepickerStartDate1 = $(element).attr(\"data-min-start-date\");\r\n datepickerStartDate = global.convertString2Date(datepickerStartDate1, \"dd.mm.yyyy\");\r\n }\r\n\r\n let datepickerEndDate = null;\r\n if ($(element).attr(\"data-max-end-date\") != undefined) {\r\n datepickerEndDate = $(element).attr(\"data-max-end-date\"); \r\n datepickerEndDate = global.convertString2Date(datepickerEndDate, \"dd.mm.yyyy\");\r\n }\r\n\r\n $(element).datepicker({\r\n startDate: datepickerStartDate,\r\n endDate: datepickerEndDate,\r\n autoclose: true,\r\n keyboardNavigation: false,\r\n weekStart: 1,\r\n format: \"dd.mm.yyyy\",\r\n language: languageAtrr,\r\n orientation: \"bottom right\",\r\n showOnFocus:false\r\n //forceParse:false,\r\n }); \r\n\r\n $(iconBtn).click(function() \r\n {\r\n global.ConsoleLogDegug(\"calendar...click\");\r\n var datepickerInputCtrl = $(element).get(0) as HTMLInputElement;\r\n var datepickerInputCtrlStrLength = datepickerInputCtrl.value.length * 2;\r\n //datepickerInputCtrl.focus();\r\n $(element).datepicker(\"show\");\r\n datepickerInputCtrl.setSelectionRange(datepickerInputCtrlStrLength, datepickerInputCtrlStrLength)\r\n }); \r\n \r\n } else if (elementAtrr === \"dd.mm.yyyy hh:mm\") {\r\n global.ConsoleLogDegug(\"datetimepicker hh:mm ...\");\r\n \r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n //\r\n $(element)\r\n .bind('keydown',function(e){\r\n\r\n e.stopImmediatePropagation();\r\n }) \r\n .datetimepicker({\r\n format: 'DD.MM.YYYY H:mm',\r\n locale: languageAtrr,\r\n showTodayButton: true,\r\n });\r\n\r\n $(element).off(\"focus\");\r\n\r\n $(iconBtn).click(function() \r\n {\r\n $(element).data(\"DateTimePicker\").show();\r\n }); \r\n \r\n } else if (elementAtrr === \"dd.mm.yyyy hh:mm:ss\") {\r\n global.ConsoleLogDegug(\"datetimepicker hh:mm:ss ...\");\r\n \r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n //\r\n $(element)\r\n .bind('keydown',function(e){\r\n\r\n e.stopImmediatePropagation();\r\n }) \r\n .datetimepicker({\r\n format: 'DD.MM.YYYY H:mm:ss',\r\n locale: languageAtrr,\r\n showTodayButton: true,\r\n });\r\n\r\n $(element).off(\"focus\");\r\n //$(element).off(\"keydown\");\r\n // .on('dp.hide', function(e){\r\n // console.log('dp.hide');\r\n // }) \r\n // .on('dp.show', function(e){\r\n // console.log('dp.show');\r\n // }); \r\n //\r\n $(iconBtn).click(function() \r\n {\r\n // global.ConsoleLogDegug(\"calendar...click\");\r\n // if ($(document).find(\".datepicker-dropdown\").is(\":visible\")) {\r\n $(element).data(\"DateTimePicker\").show();\r\n }); \r\n \r\n // $(element).focus(function (event: any) {\r\n // $(element).data(\"DateTimePicker\").hide(); \r\n // }); \r\n } else {\r\n console.log(\"not implemented...\");\r\n }\r\n\r\n });\r\n\r\n this.initMultiDateSelectDatepicker();\r\n\r\n this.initSelectizeSelect();\r\n\r\n this.initSelectizeMultiselectSelect();\r\n\r\n global.ConsoleLogDegug(\"initInputs...done\");\r\n }\r\n\r\n private initMultiDateSelectDatepicker(): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.initMultiDateSelectDatepicker...\");\r\n\r\n var inputDivs = document.querySelectorAll('input[data-izbor-vec-dni]');\r\n\r\n inputDivs.forEach(element => {\r\n global.ConsoleLogDegug(\"element.init......................\" + element.id);\r\n\r\n let spanDiv: any;\r\n spanDiv = $(element).parent();\r\n if (spanDiv === null) { return; };\r\n if (spanDiv.hasClass(\"has-float-label\") === false) { return; };\r\n global.ConsoleLogDegug(spanDiv.get(0).id);\r\n\r\n let languageAtrr = (String)($(\"#siteLanguage\").val());\r\n global.ConsoleLogDegug(\"language:\" + languageAtrr);\r\n languageAtrr = global.isEmpty(languageAtrr) ? \"sl\" : languageAtrr;\r\n global.ConsoleLogDegug(\"language:\" + languageAtrr);\r\n\r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n\r\n global.ConsoleLogDegug(\"calendar...\");\r\n\r\n let datepickerStartDate = new Date();\r\n if ($(element).attr(\"data-enable-select-pastdates\") != undefined) {\r\n if (($(element).attr(\"data-enable-select-pastdates\")).toLowerCase() == 'true') {\r\n datepickerStartDate = null;\r\n }\r\n }\r\n\r\n if ($(element).attr(\"data-min-start-date\") != undefined) {\r\n var datepickerStartDate1 = $(element).attr(\"data-min-start-date\");\r\n datepickerStartDate = global.convertString2Date(datepickerStartDate1, \"dd.mm.yyyy\");\r\n }\r\n\r\n let datepickerEndDate = null;\r\n if ($(element).attr(\"data-max-end-date\") != undefined) {\r\n datepickerEndDate = $(element).attr(\"data-max-end-date\");\r\n datepickerEndDate = global.convertString2Date(datepickerEndDate, \"dd.mm.yyyy\");\r\n }\r\n\r\n $(element).datepicker({\r\n startDate: datepickerStartDate,\r\n endDate: datepickerEndDate,\r\n autoclose: false,\r\n multidate: true,\r\n keyboardNavigation: false,\r\n weekStart: 1,\r\n format: \"dd.mm.yyyy\",\r\n language: languageAtrr,\r\n orientation: \"bottom right\"\r\n });\r\n\r\n $(iconBtn).click(function () {\r\n global.ConsoleLogDegug(\"calendar...click\");\r\n var datepickerInputCtrl = $(element).get(0) as HTMLInputElement;\r\n var datepickerInputCtrlStrLength = datepickerInputCtrl.value.length * 2;\r\n datepickerInputCtrl.focus();\r\n datepickerInputCtrl.setSelectionRange(datepickerInputCtrlStrLength, datepickerInputCtrlStrLength)\r\n });\r\n\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopInputMask.initMultiDateSelectDatepicker...done\");\r\n }\r\n\r\n private initSelectizeSelect(): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeSelect...\");\r\n\r\n $('.selectizeSelect').each(function () {\r\n let saopSelectelement = new SaopSelectizeSelect();\r\n saopSelectelement.initControlByHtml(this);\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeSelect...done\");\r\n }\r\n\r\n private initSelectizeMultiselectSelect(): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeMultiselectSelect...\");\r\n\r\n $('.selectizeMultiselect').each(function () {\r\n let saopSelectelement = new SaopSelectizeSelect();\r\n saopSelectelement.initMultiselectControlByHtml(this);\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeMultiselectSelect...done\");\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\n\r\nexport class MenuSidebar {\r\n\r\n protected _collElement: HTMLElement;\r\n protected _expElement: HTMLElement;\r\n private _menuSidebarPopover: SaopPopover;\r\n\r\n init(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.init...\");\r\n\r\n this._collElement = document.getElementById(\"collapse-icon-coll\");\r\n this._expElement = document.getElementById(\"collapse-icon-exp\");\r\n if (this._collElement != null) this._collElement.style.display = \"none\";\r\n if (this._expElement != null) this._expElement.style.display = \"block\";\r\n\r\n let _this = this;\r\n\r\n // Expand icon click\r\n $(\"#collapse-icon-exp\").off(\"click\");\r\n $(\"#collapse-icon-exp\").on('click', function () {\r\n global.ConsoleLogDegug(\"MenuSidebar.collapse-icon-exp.click\");\r\n\r\n _this._menuSidebarPopover.enablePopover();\r\n });\r\n\r\n // Collapse icon click\r\n $(\"#collapse-icon-coll\").off(\"click\");\r\n $(\"#collapse-icon-coll\").on('click', function () {\r\n global.ConsoleLogDegug(\"MenuSidebar.collapse-icon-coll.click\");\r\n\r\n _this._menuSidebarPopover.disablePopover();\r\n });\r\n\r\n // Collapse click\r\n $('[data-toggle=sidebar-colapse]').click(\r\n function () {\r\n _this.sidebarCollapse();\r\n }\r\n );\r\n\r\n //menu item click\r\n $(\".saop-bg-item\").click(\r\n function () {\r\n //sessionStorage.setItem(\"saop-menu-previous-item-id\", sessionStorage.getItem(\"saop-menu-item-id\"));\r\n //sessionStorage.setItem(\"saop-menu-item-id\", this.id);\r\n //sessionStorage.setItem(\"saop-menu-subitem-id\", \"0\");\r\n }\r\n )\r\n\r\n //menu sub-item click\r\n //$(\".saop-bg-subitem\").click(\r\n // function(){\r\n // sessionStorage.setItem(\"saop-menu-subitem-id\", this.id);\r\n // }\r\n //)\r\n\r\n if (document.getElementById(\"menu-sidebar\") != null)\r\n this.GetSessionStorageValues();\r\n else\r\n this.DeleteSessionStorageValues();\r\n\r\n this.initMenuSidebarPopover();\r\n }\r\n\r\n protected sidebarCollapse(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.sidebarCollapse\");\r\n $('#menuTopIconLarge').toggleClass('d-none');\r\n $('#menuTopIconSmall').toggleClass('d-none');\r\n $('.sidebar-menu-caption').toggleClass('d-none');\r\n $('#sidebar-container').toggleClass('sidebar-expanded sidebar-collapsed');\r\n $('.saop-bg-subitems').toggleClass('d-none');\r\n $('#menuCloseButton').toggleClass('d-none');\r\n var SeparatorTitle = $('#sidebar-container');\r\n if (SeparatorTitle.hasClass('sidebar-collapsed')) {\r\n sessionStorage.setItem(\"saop-menu-sidebar-expanded\", \"true\")\r\n this._collElement.style.display = \"block\";\r\n this._expElement.style.display = \"none\";\r\n } else {\r\n sessionStorage.setItem(\"saop-menu-sidebar-expanded\", \"false\")\r\n this._collElement.style.display = \"none\";\r\n this._expElement.style.display = \"block\";\r\n }\r\n }\r\n\r\n protected menuItemCollapse(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.menuItemCollapse\");\r\n //var previousItemID = sessionStorage.getItem(\"saop-menu-item-id\");\r\n //var itemID = sessionStorage.getItem(\"saop-menu-item-id\");\r\n //var subitemsID = itemID+\"-collapse\";\r\n //var subitemID = sessionStorage.getItem(\"saop-menu-subitem-id\");\r\n\r\n //var previous = $(\"#\" + previousItemID);\r\n //var item = $('#'+itemID);\r\n //var subitems = $(\"#\" + subitemsID);\r\n //var subitem = $(\"#\"+subitemsID+\">#\"+subitemID);\r\n\r\n //previous.removeClass(\"saop-bg-item-selected\");//'un-color' previous item\r\n //previous[0].setAttribute(\"aria-expanded\", \"false\");\r\n //item[0].setAttribute(\"aria-expanded\", \"true\");\r\n //item.addClass(\"saop-bg-item-selected\");//color item\r\n //subitems.addClass('show');//expand collapse\r\n //subitem.addClass(\"saop-bg-subitem-selected\");//color subitem\r\n }\r\n\r\n protected GetSessionStorageValues(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.GetSessionStorageValues\");\r\n //defaults\r\n //if (sessionStorage.getItem(\"saop-menu-item-id\") == null) {\r\n //sessionStorage.setItem(\"saop-menu-sidebar-expanded\", null);\r\n // sessionStorage.setItem(\"saop-menu-previous-item-id\", null);\r\n // sessionStorage.setItem(\"saop-menu-item-id\", \"namizje\");\r\n // sessionStorage.setItem(\"saop-menu-subitem-id\", \"0\");\r\n //}\r\n\r\n //sidebar expanded/contracted\r\n if (sessionStorage.getItem(\"saop-menu-sidebar-expanded\") == \"true\") {\r\n this.sidebarCollapse();\r\n }\r\n\r\n //selected-menu item\r\n this.menuItemCollapse()\r\n }\r\n\r\n protected DeleteSessionStorageValues(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.DeleteSessionStorageValues\");\r\n\r\n sessionStorage.removeItem(\"saop-menu-sidebar-expanded\");\r\n //sessionStorage.removeItem(\"saop-menu-previous-item-id\");\r\n //sessionStorage.removeItem(\"saop-menu-item-id\");\r\n //sessionStorage.removeItem(\"saop-menu-subitem-id\");\r\n }\r\n\r\n initMenuSidebarPopover() {\r\n global.ConsoleLogDegug(\"MenuSidebar.initMenuSidebarPopover\");\r\n\r\n this._menuSidebarPopover = new SaopPopover(\".menu-popup\");\r\n this._menuSidebarPopover.initSelfContainerPopover();\r\n this._menuSidebarPopover.disablePopover();\r\n\r\n var elementVisible = $(\"#collapse-icon-coll\").is(':visible');\r\n if (elementVisible) {\r\n this._menuSidebarPopover.enablePopover();\r\n } else {\r\n this._menuSidebarPopover.disablePopover();\r\n }\r\n\r\n }\r\n}\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport enum SaopMsgDlgType {\r\n mtInformation = 1\r\n ,mtWarning = 2\r\n ,mtError = 3\r\n //, mtConfirmation, mtCustom\r\n}\r\n\r\nexport enum SaopMsgDlgButton {\r\n mbNone = 0\r\n ,mbOK = 1\r\n ,mbCancel = 2\r\n ,mbYes = 3\r\n ,mbNo = 4\r\n}\r\n\r\nexport interface SaopMsgDlgEvent {\r\n parent:any;\r\n data:any;\r\n}\r\n\r\ntype SaopMsgDlgButtons = Array;\r\n\r\n\r\n\r\nexport class SaopMessageDlg {\r\n private _sender:SaopMsgDlgEvent;\r\n public onOk: (sender:any) => any = null;\r\n public onCancel: (sender:any) => any = null;\r\n public onYes: (sender:any) => any = null;\r\n public onNo: (sender:any) => any = null;\r\n\r\n constructor(sender:SaopMsgDlgEvent){\r\n this._sender = sender;\r\n }\r\n\r\n Show(Msg:string,Title:string,DlgType:SaopMsgDlgType = SaopMsgDlgType.mtInformation,Buttons:SaopMsgDlgButtons = [SaopMsgDlgButton.mbOK]):SaopMsgDlgButton{\r\n console.log(\"message:\"+Msg);\r\n console.log(\"title:\"+Title);\r\n let _this = this;\r\n\r\n let titleDiv = $('#alert-modal-title-div');\r\n let bodyTag = $('#alert-modal-body');\r\n\r\n if (DlgType == SaopMsgDlgType.mtInformation){\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"white\");\r\n } else if (DlgType == SaopMsgDlgType.mtError) {\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"#D82C25\");\r\n } else {\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"silver\"); \r\n }\r\n\r\n if (!global.isEmpty(Title)){\r\n titleDiv.html(Title);\r\n }\r\n \r\n bodyTag.html(Msg);\r\n\r\n if (Buttons !== null) {\r\n let _element_mbOK = Buttons.find(element => element === SaopMsgDlgButton.mbOK);\r\n if (global.isUnDefined(_element_mbOK)) {\r\n $(\"#btnAlertOK\").remove();\r\n } else {\r\n $(\"#btnAlertOK\").off(\"click\");\r\n $(\"#btnAlertOK\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onOk)){\r\n _this.onOk(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbOK;\r\n }\r\n ); \r\n }\r\n //\r\n let _element_mbCancel = Buttons.find(element => element === SaopMsgDlgButton.mbCancel);\r\n if (global.isUnDefined(_element_mbCancel)) {\r\n $(\"#btnAlertCancel\").remove();\r\n } else {\r\n $(\"#btnAlertCancel\").off(\"click\");\r\n $(\"#btnAlertCancel\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onCancel)){\r\n _this.onCancel(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbCancel;\r\n }\r\n ); \r\n }\r\n //\r\n let _element_mbYes = Buttons.find(element => element === SaopMsgDlgButton.mbYes);\r\n if (global.isUnDefined(_element_mbYes)) {\r\n $(\"#btnAlertYes\").remove();\r\n } else {\r\n $(\"#btnAlertYes\").off(\"click\");\r\n $(\"#btnAlertYes\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onYes)){\r\n _this.onYes(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbYes;\r\n }\r\n ); \r\n } \r\n //\r\n let _element_mbNo = Buttons.find(element => element === SaopMsgDlgButton.mbNo);\r\n if (global.isUnDefined(_element_mbNo)) {\r\n $(\"#btnAlertNo\").remove();\r\n } else {\r\n $(\"#btnAlertNo\").off(\"click\");\r\n $(\"#btnAlertNo\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onNo)){\r\n _this.onNo(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbNo;\r\n }\r\n ); \r\n } \r\n } else {\r\n $(\"#btnAlertOK\").remove();\r\n $(\"#btnAlertCancel\").remove();\r\n $(\"#btnAlertYes\").remove();\r\n $(\"#btnAlertNo\").remove();\r\n return SaopMsgDlgButton.mbNone;\r\n }\r\n\r\n $('#alert-modal').on('hidden.bs.modal', function (e) {\r\n $(\"#alert-modal-btn-ok\").unbind(\"click\");\r\n $(this).modal('dispose');\r\n })\r\n \r\n $('#alert-modal').modal('show');\r\n global.setModalFormZIndex('#alert-modal'); \r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\n\r\nimport { global } from \"../Common/saop-common\";\r\n\r\nexport interface SaopMultiselectParams {\r\n target:string,\r\n selectAll?:boolean\r\n}\r\n\r\nexport interface SaopMultiselectOptions {\r\n templatesButton?: string\r\n}\r\n\r\nexport interface SelectOption {\r\n value: string;\r\n text: string;\r\n}\r\n\r\nexport class SaopMultiselect {\r\n private _libName:string;\r\n private _translationService: SaopTranslationService;\r\n private _caption: string = \"Skupina\";\r\n private _multiSelectObject: any;\r\n private _options: SaopMultiselectOptions;\r\n //\r\n public msContainer:JQuery;\r\n public msButton: JQuery;\r\n public msPopupContainer: JQuery;\r\n public msContainerLabel:JQuery;\r\n public selectedCB:any;\r\n\r\n constructor(libName:string = \"\", options:SaopMultiselectOptions = null) {\r\n global.ConsoleLogDegug(\"SaopMultiselect\");\r\n this._translationService = new SaopTranslationService();\r\n this.setOptions(options);\r\n } \r\n\r\n setOptions(options: SaopMultiselectOptions): void {\r\n // first set default options\r\n this._options = {\r\n templatesButton: ''\r\n }\r\n\r\n if (options != null) {\r\n this._options = options;\r\n if (options.templatesButton != null) {\r\n this._options.templatesButton = options.templatesButton;\r\n }\r\n }\r\n }\r\n\r\n setTerminologyList() {\r\n let _terminology: string[] = ['Išči', 'Vsi', 'Izberi prikazane', 'izbranih'];\r\n if (!global.isEmpty(this._caption)) {\r\n _terminology = ['Išči', 'Vsi', 'Izberi prikazane', 'izbranih', this._caption];\r\n } \r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n bindDiv(elemet:any){\r\n this.msContainer = $(elemet.$container);\r\n this.msButton = $(elemet.$button);\r\n this.msContainerLabel = this.msContainer.find(\"#containerLabel\");\r\n this.msPopupContainer = $(elemet.$popupContainer);\r\n //this.selectedCB = elemet.$select;\r\n\r\n if (this.selectedCB.val().length){\r\n this.setMsFloatingLabel(false);\r\n } else {\r\n this.setMsFloatingLabel(true);\r\n } \r\n }\r\n\r\n setMsFloatingLabel(isEmpry:boolean){\r\n if (isEmpry){\r\n this.msContainerLabel.addClass('ms-float-label-empty');\r\n this.msContainerLabel.removeClass('ms-float-label-selected');\r\n } else {\r\n this.msContainerLabel.removeClass('ms-float-label-empty');\r\n this.msContainerLabel.addClass('ms-float-label-selected'); \r\n } \r\n }\r\n\r\n onInitializedControl(element: any) {\r\n global.ConsoleLogDegug(\"SaopMultiselect.onInitializedControl\");\r\n\r\n if (this.selectedCB.hasClass(\"input-validation-error\")) {\r\n this.msButton.addClass(\"saop-error-input\");\r\n this.msContainerLabel.addClass(\"saop-error-input-text\");\r\n }\r\n\r\n // dodamo sticky css za prvi element\r\n this.addStickyClass();\r\n\r\n this.afterInitializedControl(element);\r\n }\r\n\r\n addStickyClass(): void {\r\n global.ConsoleLogDegug(\"SaopMultiselect.addStickyClass\");\r\n\r\n let seznam = this.msContainer.find(\"button.multiselect-option.dropdown-item\").each(function (index: number, elem: any) {\r\n let selectItem = $(elem);\r\n if (selectItem.text() === \"\") {\r\n selectItem.addClass(\"saop-multiselect-item-sticky\");\r\n }\r\n });\r\n }\r\n\r\n init(target: string = \"\", caption = \"\" ){\r\n global.ConsoleLogDegug(\"SaopMultiselect.init\");\r\n\r\n this._caption = caption;\r\n\r\n // poiscemo prevode (tudi za this._caption)\r\n this.setTerminologyList();\r\n\r\n if (global.isEmpty(target)) {target = \".saop-multiselect\";}\r\n\r\n this.selectedCB = $(target);\r\n\r\n // ali ima selectedCB data-caption\r\n let selectCaption = \"\";\r\n if (!global.isEmpty(this._caption)) {\r\n selectCaption = this._translationService.translate(this._caption);\r\n }\r\n let dataCaption = this.selectedCB.attr(\"data-caption\");\r\n if (!global.isEmpty(dataCaption)) {\r\n selectCaption = dataCaption;\r\n }\r\n\r\n let _this = this;\r\n\r\n $(target).multiselect({\r\n maxHeight: 350, \r\n enableFiltering: true,\r\n includeSelectAllOption: true,\r\n enableCaseInsensitiveFiltering: true,\r\n enableFullValueFiltering: false,\r\n filterPlaceholder: this._translationService.translate(\"Išči\"),\r\n nonSelectedText: '',\r\n allSelectedText:this._translationService.translate(\"Vsi\"),\r\n selectAllText:this._translationService.translate(\"Izberi prikazane\"),\r\n nSelectedText:this._translationService.translate(\"izbranih\"),\r\n includeFilterClearBtn: true,\r\n disableIfEmpty: false,\r\n numberDisplayed: 2,\r\n buttonWidth: '200px',\r\n buttonClass :'saop-control form-control shadow-none ms-image-down pr-0',\r\n buttonContainer: '
',\r\n onSelectAll: function (selectedOptions: JQuery) {\r\n _this.bindDiv(this);\r\n _this.afterSelectAll(selectedOptions);\r\n _this.afterChangeCommonEvent(this.$select);\r\n }, \r\n onDeselectAll: function(selectedOptions:JQuery){\r\n _this.bindDiv(this);\r\n _this.afterDeselectAll(selectedOptions);\r\n _this.afterChangeCommonEvent(this.$select);\r\n }, \r\n onChange: function(option: JQuery, checked: boolean){\r\n _this.bindDiv(this);\r\n _this.afterChange(option, checked);\r\n _this.afterChangeCommonEvent(this.$select);\r\n },\r\n onInitialized: function ($select, $container) {\r\n _this._multiSelectObject = this;\r\n _this.bindDiv(this);\r\n _this.onInitializedControl(this);\r\n },\r\n templates: {\r\n button: this._options.templatesButton,\r\n filter: '
  • ',\r\n } \r\n })\r\n .multiselect('selectAll', false, true)\r\n .multiselect('updateButtonText');\r\n ; \r\n }\r\n\r\n rebuild(): void {\r\n this.selectedCB.multiselect('rebuild');\r\n }\r\n\r\n afterSelectAll(selectedOptions: JQuery) {\r\n\r\n }\r\n\r\n afterDeselectAll(selectedOptions:JQuery){\r\n\r\n }\r\n\r\n afterChange(option: JQuery, checked: boolean){\r\n\r\n }\r\n\r\n afterChangeCommonEvent(element:any){\r\n\r\n }\r\n\r\n afterInitializedControl(element: any){\r\n global.ConsoleLogDegug(\"SaopMultiselect.afterInitializedControl\");\r\n }\r\n\r\n // selectValues vrednosti\r\n setSelectValues(selectValues: string[]): void {\r\n // odznacimo vse zaposlene\r\n this.selectedCB.multiselect('deselectAll');\r\n\r\n if (selectValues != null) {\r\n // oznacimo izbrane\r\n this.selectedCB.multiselect('select', selectValues);\r\n }\r\n this.selectedCB.multiselect('refresh');\r\n\r\n if (this._multiSelectObject != null) {\r\n this.bindDiv(this._multiSelectObject);\r\n this.afterChangeCommonEvent(this._multiSelectObject.$select);\r\n } \r\n }\r\n\r\n clearHtmlOptions(): void {\r\n this.selectedCB\r\n .find('option')\r\n .remove()\r\n .end();\r\n }\r\n\r\n refreshHtmlOptions(optionList: SelectOption[], selectAll: boolean = false): void {\r\n let _this = this;\r\n\r\n this.clearHtmlOptions();\r\n if (optionList.length > 0) {\r\n optionList.forEach(element => _this.selectedCB.append(''));\r\n }\r\n this.rebuild();\r\n this.addStickyClass();\r\n\r\n if (selectAll) {\r\n this.selectedCB.multiselect('selectAll');\r\n\r\n if (this.selectedCB.val().length) {\r\n this.setMsFloatingLabel(false);\r\n } else {\r\n this.setMsFloatingLabel(true);\r\n }\r\n }\r\n }\r\n \r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { SaopPinchZoom } from \"../Components/saop-pinch-and-zoom\";\r\nimport { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPdfPreview {\r\n private _pdfjsLib:any;\r\n private _canvas:any;\r\n private _viewer:any;\r\n private _pdf:any;\r\n private _scale = 1;\r\n //\r\n private _documentId:string;\r\n private _url:string;\r\n private _fileName:string;\r\n private _base64:string;\r\n private _type:string;\r\n private _saopPinchZoom:SaopPinchZoom;\r\n\r\n loadpdfjsLib(pdfjsLib:any):void{\r\n this._pdfjsLib = pdfjsLib;\r\n this._saopPinchZoom = new SaopPinchZoom();\r\n }\r\n\r\n renderPage(pageNumber:any, canvas:any):void {\r\n let _this = this;\r\n this._pdf.getPage(pageNumber).then(function(page:any) {\r\n _this._viewer = page.getViewport({ scale: _this._scale });\r\n\r\n // let _viewerOffset = $('.pdf-viewer-inner').offset();\r\n // let _w = Math.max(document.documentElement.clientWidth - _viewerOffset.left, window.innerWidth - _viewerOffset.left -272 || 0)\r\n\r\n // let _w = $('#pdf-viewer').width();\r\n // canvas.height = _this._viewer.height;\r\n // canvas.width = _w - 10;\r\n let _w = (_this._viewer.width as string)+'px'\r\n $('.saop-col-view').css('min-width', _w);\r\n\r\n canvas.height = _this._viewer.height - 10;\r\n canvas.width = _this._viewer.width - 10; \r\n\r\n page.render({canvasContext: canvas.getContext('2d'), viewport: _this._viewer}).promise.then(function() {\r\n console.log('Page rendering complete.');\r\n _this._saopPinchZoom.init(\"pdf-viewer\");\r\n });\r\n });\r\n } \r\n\r\n setDefaultScale(scale:number):void{\r\n this._saopPinchZoom.setDefaultScale(scale);\r\n }\r\n\r\n base64ToUint8Array(base64:string):any{\r\n var raw = atob(base64);\r\n var uint8Array = new Uint8Array(raw.length);\r\n for (var i = 0; i < raw.length; i++) {\r\n uint8Array[i] = raw.charCodeAt(i);\r\n }\r\n return uint8Array;\r\n } \r\n\r\n loadingPdfTask(loadingTask:any):void{\r\n let _this = this;\r\n loadingTask.promise.then(function(pdf:any) {\r\n _this._pdf = pdf;\r\n _this._viewer = document.getElementById('pdf-viewer');\r\n \r\n for(let page = 1; page <= pdf.numPages; page++) {\r\n \r\n \r\n _this._canvas = document.createElement(\"canvas\"); \r\n _this._canvas.className = 'pdf-page-canvas'; \r\n \r\n let _row = document.createElement(\"div\");\r\n _row.className = 'row m-0 p-0'; \r\n\r\n let _col = document.createElement(\"div\");\r\n _col.className = 'col m-0 p-0 saop-col-view'; \r\n\r\n _col.appendChild(_this._canvas); \r\n\r\n _row.appendChild(_col); \r\n\r\n _this._viewer.appendChild(_row);\r\n _this.renderPage(page, _this._canvas);\r\n //\r\n //new SaopPinchZoom().init(\"pdf-viewer\");\r\n \r\n }\r\n\r\n // _this._saopPinchZoom.init(\"pdf-viewer\");\r\n // $('.pdf-page-canvas').attr(\"onload\",\"saopPdfPreview.setDefaultScale(0.6);\");\r\n // $('div[onload]').trigger('onload');\r\n }); \r\n }\r\n\r\n getFileNameByUrl(url:string):void {\r\n let _this = this;\r\n $.ajax({\r\n type: \"HEAD\",\r\n url: url, \r\n success: function(message, text, response){\r\n _this._type = response.getResponseHeader('Content-Type');\r\n _this.documentRender();\r\n },\r\n }); \r\n }\r\n\r\n getFileContentByUrl(url:string):void {\r\n let _this = this;\r\n $.ajax({\r\n type: \"GET\",\r\n url: url, \r\n success: function(message, text, response){\r\n let _container = $('
    ');\r\n _container.html(response.responseText);\r\n _container.append(_container);\r\n $('#pdf-viewer').append(_container);\r\n },\r\n }); \r\n }\r\n\r\n private renderErrorDiv():void{\r\n //$('#pdf-viewer').html('
    Ni dokumentov za prikaz
    ');\r\n }\r\n\r\n documentPreview():void {\r\n let _this = this;\r\n this.renderErrorDiv();\r\n this._documentId = $(\"#myModel_DocumentId\").val() as string;\r\n this._url = $(\"#myModel_FileUrl\").val() as string;\r\n this._fileName = $(\"#myModel_FileName\").val() as string;\r\n this._base64 = $(\"#myModel_Base64String\").val() as string;\r\n\r\n let _w = screen.width;\r\n\r\n if (this._url.length > 0 && this._fileName.length == 0) {\r\n this.getFileNameByUrl(this._url);\r\n }\r\n\r\n if (this._base64.length == 0) {return;}\r\n\r\n let _fileExtension = this._fileName.split('.').pop().toLocaleLowerCase();\r\n\r\n if (_fileExtension.length == 0) {return;}\r\n\r\n this._type = \"image/png\";\r\n if (_fileExtension.toLocaleLowerCase() == 'pdf'){\r\n this._type = \"application/pdf\";\r\n } else {\r\n this._type = \"image/\"+_fileExtension;\r\n }\r\n\r\n this.documentRender();\r\n\r\n } \r\n\r\n documentRender():void {\r\n let _w = screen.width;\r\n\r\n if(_w <= 800 && this._type.includes(\"pdf\") == true){\r\n //\r\n this.preparePdfNodes();\r\n let loadingTask:any;\r\n if (this._base64.length > 0) {\r\n let _array = this.base64ToUint8Array(this._base64);\r\n loadingTask = this._pdfjsLib.getDocument(_array); \r\n } else {\r\n loadingTask = this._pdfjsLib.getDocument(this._url); \r\n }\r\n this.loadingPdfTask(loadingTask);\r\n } else if (this._type.includes(\"text/html\")) { \r\n this.getFileContentByUrl(this._url)\r\n } else {\r\n if (this._base64.length > 0) {\r\n $('#pdf-viewer').html('');\r\n } else {\r\n $('#pdf-viewer').html(''); \r\n } \r\n }\r\n } \r\n\r\n private preparePdfNodes():void{\r\n let _parent = $('#pdf-viewer').parent();\r\n\r\n let _main = document.createElement(\"div\");\r\n _main.className = 'pdf-viewer-main'; \r\n\r\n let _inner = document.createElement(\"div\");\r\n _inner.className = 'pdf-viewer-inner';\r\n\r\n let _viewer = document.createElement(\"div\");\r\n _viewer.id = 'pdf-viewer'; \r\n\r\n _inner.appendChild(_viewer);\r\n\r\n _main.appendChild(_inner);\r\n\r\n _parent.html(_main); \r\n }\r\n\r\n // loadBase64Pdf():void{\r\n // let _base64 = $(\"#myModel_Base64String\").val() as string;\r\n\r\n // if (_base64.length > 0) {\r\n // let _fileName = $(\"#myModel_FileName\").val() as string;\r\n // let _fileExtension = _fileName.split('.').pop().toLocaleLowerCase();\r\n // let _w = screen.width;\r\n\r\n // if(_w <= 800 && _fileExtension.toLocaleLowerCase() == \"pdf\"){\r\n // //\r\n // this.preparePdfNodes();\r\n // let _array = this.base64ToUint8Array(_base64);\r\n // var loadingTask = this._pdfjsLib.getDocument(_array); \r\n // this.loadingPdfTask(loadingTask);\r\n // } else {\r\n // let _type = \"image/png\";\r\n // if (_fileExtension.toLocaleLowerCase() == 'pdf'){\r\n // _type = \"application/pdf\";\r\n // } else {\r\n // _type = \"image/\"+_fileExtension;\r\n // }\r\n\r\n // $('#pdf-viewer').html('');\r\n // }\r\n // }\r\n // }\r\n\r\n //\r\n \r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPinchZoom {\r\n\tprivate _initialized:boolean = false;\r\n\t// private _defaultSet = {x: -60, y: -53,z: 0.6};\r\n\tprivate _defaultSet = {x: 0, y: 0,z: 0.6};\r\n\tprivate _element :any;\r\n\tprivate _hammertime :any;\r\n\r\n\tprivate _fixHammerjsDeltaIssue :any;\r\n\tprivate _pinchStart :any;\r\n\tprivate _lastEvent :any;\r\n\t\r\n\tprivate _originalSize :any;\t\r\n\tprivate _current :any;\r\n\tprivate _last :any;\t\r\n\tprivate _pinchZoomOrigin :any;\r\n\t\r\n\t//\r\n\t\r\n\tsleep(milliseconds:number):void {\r\n\t\tconst date = Date.now();\r\n\t\tlet currentDate = null;\r\n\t\tdo {\r\n\t\t\tcurrentDate = Date.now();\r\n\t\t} while (currentDate - date < milliseconds);\r\n\t}\r\n\r\n\tinit(id:string){\r\n\t\tconsole.log(\"init...\");\r\n\t\tthis._element = document.getElementById(id);\r\n\r\n\t\t// let _w = $( window ).width();//this._element.offsetWidth;\r\n\t\t// //let _pdfW = parseInt($(\".pdf-page-canvas\").width())) * 0.6;\r\n\t\t// let _pdfW = $(\".pdf-page-canvas\").width() * 0.6;\r\n\t\t// this._defaultSet.x = ( _w - _pdfW) / 2;\r\n\t\t//\r\n\r\n\t\tthis._hammertime = new Hammer(this._element, {});\t\t\r\n\t\t\r\n\t\tthis._hammertime.get('pinch').set({ enable: true });\r\n\t\tthis._hammertime.get('pan').set({ threshold: 0 });\r\n\r\n \tthis._pinchStart = { x: 0, y: 0 };\r\n\r\n\t\tthis._originalSize = {width: 200, height: 300};\t\r\n\t\tthis._current = {x: 0, y: 0, z: 0, zooming: false, width: this._originalSize.width * 1, height: this._originalSize.height * 1};\t\r\n\t\tthis._last = {x: this._current.x, y:this._current.y, z:this._current.z}\t\t\r\n\r\n\t\tthis.initEvents();\r\n\r\n\t\tthis._initialized = true;\r\n\t\t\r\n\t\tthis.setDefaultScale(this._defaultSet.z);\r\n\t}\r\n\r\n\tsetDefaultScale(scale:number) {\r\n\t\tconsole.log(\"scale:\"+scale.toString());\r\n\t\tif (this._initialized == false) {return; };\r\n\t\t//this.sleep(500);\r\n\r\n\t\tlet _this = this;\r\n\t\t//\r\n\t\tthis._defaultSet.z = scale;\r\n\t\t//\r\n\t\tthis._current = {x: 0, y: 0, z: this._defaultSet.z, zooming: false, width: this._originalSize.width * 1, height: this._originalSize.height * 1};\t\r\n\t\tthis.update();\r\n\t\t//\r\n\t\tlet _screenWidth = $( window ).width();\r\n \tlet _pdfWidth = parseInt($(\".pdf-page-canvas\").attr(\"width\"));\r\n\t\t_pdfWidth = _pdfWidth * this._defaultSet.z;\r\n\t\tlet _leftCanvas = (_screenWidth - (_screenWidth * this._defaultSet.z)) / 2;\r\n\t\tlet _diffLeft = (_screenWidth - _pdfWidth) / 2;\r\n\t\tthis._defaultSet.x = (_leftCanvas - _diffLeft + 5) * (-1);\r\n\t\t// //\r\n\t\tlet _pdfDocHeight = $(\"#document-preview\").height();\r\n\t\tif (_pdfDocHeight <= 0 ) {\r\n\t\t\t_pdfDocHeight = 280;\r\n\t\t}\r\n\t\tthis._defaultSet.y = ((_pdfDocHeight - (_pdfDocHeight * this._defaultSet.z))/2) * (-1);\t\t\r\n\t\t//\r\n\t\t\r\n\t\tthis._current.x = this._defaultSet.x\r\n\t\tthis._current.y = this._defaultSet.y;\r\n\t\tthis._current.z = this._defaultSet.z;\r\n\r\n\t\tthis._last.x = this._defaultSet.x\r\n\t\tthis._last.y = this._defaultSet.y;\r\n\t\tthis._last.z = this._defaultSet.z;\r\n\r\n\t\tthis.update();\r\n\t}\r\n\r\n\tupdate():void {\r\n\t this._current.height = this._originalSize.height * this._current.z;\r\n\t this._current.width = this._originalSize.width * this._current.z;\r\n\t this._element.style.transform = \"translate3d(\" + this._current.x + \"px, \" + this._current.y + \"px, 0) scale(\" + this._current.z + \")\";\r\n\t}\r\n\r\n\tgetCoords(elem:any):any { // crossbrowser version\r\n\t var box = elem.getBoundingClientRect();\r\n\r\n\t var body = document.body;\r\n\t var docEl = document.documentElement;\r\n\r\n\t var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n\t var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n\r\n\t var clientTop = docEl.clientTop || body.clientTop || 0;\r\n\t var clientLeft = docEl.clientLeft || body.clientLeft || 0;\r\n\r\n\t var top = box.top + scrollTop - clientTop;\r\n\t var left = box.left + scrollLeft - clientLeft;\r\n\r\n\t return { x: Math.round(left), y: Math.round(top) };\r\n\t}\r\n\r\n\r\n\tgetCoordinateShiftDueToScale(size:any, scale:any):any{\r\n\t var newWidth = scale * size.width;\r\n\t var newHeight = scale * size.height;\r\n\t var dx = (newWidth - size.width) / 2;\r\n\t var dy = (newHeight - size.height) / 2;\r\n\t return {\r\n\t\tx: dx,\r\n\t\ty: dy\r\n\t };\r\n\t}\r\n\r\n\tscaleFrom(zoomOrigin:any, currentScale:any, newScale:any):any {\r\n\t var currentShift = this.getCoordinateShiftDueToScale(this._originalSize, currentScale);\r\n\t var newShift = this.getCoordinateShiftDueToScale(this._originalSize, newScale);\r\n\r\n\t var zoomDistance = newScale - currentScale\r\n\t \r\n\t var shift = {\r\n\t\tx: currentShift.x - newShift.x,\r\n\t\ty: currentShift.y - newShift.y,\r\n\t }\r\n\r\n\t var output = {\r\n\t\tx: zoomOrigin.x * shift.x,\r\n\t\ty: zoomOrigin.y * shift.y,\r\n\t\tz: zoomDistance\r\n\t }\r\n\t return output;\r\n\t}\r\n\r\n\tgetRelativePosition(element:any, point:any, originalSize:any, scale:any):any {\r\n\t var domCoords = this.getCoords(element);\r\n\r\n\t var elementX = point.x - domCoords.x;\r\n\t var elementY = point.y - domCoords.y;\r\n\r\n\t var relativeX = elementX / (originalSize.width * scale / 2) - 1;\r\n\t var relativeY = elementY / (originalSize.height * scale / 2) - 1;\r\n\t return { x: relativeX, y: relativeY }\r\n\t}\r\n\r\n\tinitEvents():void {\r\n\t\tlet _this = this;\r\n\r\n\t\tthis._hammertime.on('panend', (function(e:any) {\r\n\t\t\tconsole.log(\"panend\");\r\n\t\t if (this._current.scale != this._last.scale) {\r\n\t\t \tthis._last.x = this._current.x;\r\n\t\t }\r\n\t\t this._last.y = this._current.y;\r\n\t\t this._lastEvent = 'panend';\r\n\t\t}).bind(this));\r\n\r\n\t\tthis._hammertime.on('pinchend', (function(e:any) {\r\n\t\t\tconsole.log(\"pinchend\");\r\n\t\t this._last.x = this._current.x;\r\n\t\t this._last.y = this._current.y;\r\n\t\t this._last.z = this._current.z;\r\n\t\t this._lastEvent = 'pinchend';\r\n\t\t}).bind(this));\t\r\n\r\n\t\tthis._hammertime.on('pinchstart', (function(e:any) {\r\n\t\t this._pinchStart.x = e.center.x;\r\n\t\t this._pinchStart.y = e.center.y;\r\n\t\t this._pinchZoomOrigin = this.getRelativePosition(this._element, { x: this._pinchStart.x, y: this._pinchStart.y }, this._originalSize, this._current.z);\r\n\t\t this._lastEvent = 'pinchstart';\r\n\t\t}).bind(this));\r\n\t\t\r\n\t\tthis._hammertime.on('pinch', (function(e:any) {\r\n\t\t console.log(\"pinch\");\r\n\t\t var d = this.scaleFrom(this._pinchZoomOrigin, this._last.z, this._last.z * e.scale)\r\n\t this._current.x = d.x + this._last.x + e.deltaX;\r\n\t\t this._current.y = d.y + this._last.y + e.deltaY;\r\n\t\t this._current.z = d.z + this._last.z;\r\n\t\t this._lastEvent = 'pinch';\r\n\t\t this.update();\r\n\t\t}).bind(this));\r\n\t\t\r\n\t\tthis._hammertime.on('doubletap', (function(e:any) {\r\n\t\t\tconsole.log(\"doubletap\");\r\n\t\t\tthis.setDefaultScale(this._defaultSet.z);\r\n\r\n\t\t// var _this = this; \r\n\t\t// var scaleFactor = 1;\r\n\t\t// if (this._current.zooming === false) {\r\n\t\t// \tthis._current.zooming = true;\r\n\t\t// } else {\r\n\t\t// \tthis._current.zooming = false;\r\n\t\t// \tscaleFactor = -scaleFactor;\r\n\t\t// }\r\n\r\n\t\t// this._element.style.transition = \"0.3s\";\r\n\t\t// setTimeout(function() {\r\n\t\t// \t_this._element.style.transition = \"none\";\r\n\t\t// }, 300)\r\n\r\n\t\t// var zoomOrigin = this.getRelativePosition(this._element, { x: e.center.x, y: e.center.y }, this._originalSize, this._current.z);\r\n\t\t// var d = this.scaleFrom(zoomOrigin, this._current.z, this._current.z + scaleFactor)\r\n\t\t// this._current.x += d.x;\r\n\t\t// this._current.y += d.y;\r\n\t\t// this._current.z += d.z;\r\n\r\n\t\t// this._last.x = this._current.x;\r\n\t\t// this._last.y = this._current.y;\r\n\t\t// this._last.z = this._current.z;\r\n\r\n\t\t// this.update();\r\n\t\t}).bind(this));\r\n\t\t\r\n\t\t\r\n\t\tthis._hammertime.on('pan', (function(e:any) {\r\n\t\t console.log(\"pan\");\r\n\t\t if (this._lastEvent !== 'pan') {\r\n\t\t\tthis._fixHammerjsDeltaIssue = {\r\n\t\t\t x: e.deltaX,\r\n\t\t\t y: e.deltaY\r\n\t\t\t};\r\n\t\t };\r\n\r\n\t\t if (this._current.z != this._defaultSet.z){\r\n\t\t\tthis._current.x = this._last.x + e.deltaX - this._fixHammerjsDeltaIssue.x;\r\n\t\t }\r\n\t\t \r\n\t\t this._current.y = this._last.y + e.deltaY - this._fixHammerjsDeltaIssue.y;\r\n\t\t this._lastEvent = 'pan';\r\n\t\t this.update();\r\n\t\t}).bind(this)); \r\n\t\t\r\n // $(window).resize(function () {\r\n\t// \t\tProgressEvent;\r\n // _this.setDefaultScale();\r\n // }).resize();\t\t\r\n\r\n\t}\r\n\r\n\t\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPopover {\r\n private _querySelector: string;\r\n\r\n constructor(querySelector: string = \"[data-toggle=popover]\") {\r\n this._querySelector = querySelector;\r\n }\r\n\r\n bindPopoverEvents() {\r\n global.ConsoleLogDegug(\"SaopPopover.bindPopoverEvents\");\r\n let _this = this;\r\n\r\n $(\"[data-toggle=popover]\").popover({\r\n html: true,\r\n sanitize: false,\r\n trigger: 'click',\r\n content: function () {\r\n var content = $(this).attr(\"data-popover-content\");\r\n return $(content).children(\".popover-body\").html();\r\n }\r\n });\r\n\r\n $('html').on('mouseup', function (e) {\r\n global.ConsoleLogDegug(\"mouseup!\");\r\n if (!$(e.target).closest('.popover').length) {\r\n global.ConsoleLogDegug(\"mouseup.popover!\");\r\n $('.popover').each(function () {\r\n global.ConsoleLogDegug(\"mouseup.popover.hide!\");\r\n //$(this.previousSibling).popover('hide');\r\n $(_this._querySelector).popover('hide');\r\n });\r\n }\r\n });\r\n\r\n // when popover's content is shown\r\n $(\"[data-toggle=popover]\").on('shown.bs.popover', function (e: any) {\r\n // set what happens when user clicks on the button\r\n global.ConsoleLogDegug(\"set!\");\r\n\r\n _this.afterPopoverShow(this);\r\n\r\n $(\".popoverLink\").off('click');\r\n $(\".popoverLink\").on('click', function () {\r\n global.ConsoleLogDegug(\"popoverLink clicked!!!\");\r\n $(\"[data-toggle=popover]\").popover('hide');\r\n });\r\n\r\n $(\".popoverClose\").off('click');\r\n $(\".popoverClose\").on('click', function () {\r\n global.ConsoleLogDegug(\"Close popover clicked!!!\");\r\n $(\"[data-toggle=popover]\").popover('hide');\r\n });\r\n });\r\n\r\n }\r\n\r\n afterPopoverShow(element: HTMLElement) {\r\n global.ConsoleLogDegug(\"SaopPopover.afterPopoverShow\");\r\n }\r\n\r\n initSelfContainerPopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.initSelfContainerPopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n let elem = this;\r\n $elem.popover({\r\n container: elem,\r\n sanitize: false\r\n });\r\n });\r\n }\r\n\r\n enablePopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.enablePopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n $elem.popover('enable');\r\n });\r\n }\r\n\r\n disablePopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.disablePopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n $elem.popover('disable');\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPopupDialogOptions {\r\n title: string;\r\n body: string;\r\n showCancelButton: boolean;\r\n confirmButtonCaption: string;\r\n cancelButtonCaption: string;\r\n confirmAction: string;\r\n confirmActiondata: object;\r\n onSuccess: (params:any) => any;\r\n constructor() {\r\n this.title = \"\";\r\n this.body = \"body text\";\r\n this.showCancelButton = true;\r\n this.confirmButtonCaption = \"Ok\";\r\n this.cancelButtonCaption = \"Cancel\";\r\n this.confirmAction = \"\";\r\n this.confirmActiondata = {};\r\n this.onSuccess = null;\r\n }\r\n}\r\n\r\nexport class SaopPopupDialog {\r\n private _options:SaopPopupDialogOptions;\r\n\r\n\r\n constructor(options:SaopPopupDialogOptions) {\r\n this._options = options;\r\n } \r\n \r\n save(callback: (n: number) => any) : void {\r\n callback(42);\r\n }\r\n\r\n ShowLoadingSaop() {\r\n var obj = $(\"#saopLoading\");\r\n if (obj.length)\r\n obj.show();\r\n }\r\n\r\n HideLoadingSaop() {\r\n var obj = $(\"#saopLoading\");\r\n if (obj.length)\r\n obj.hide();\r\n } \r\n\r\n ShowPopupDialog():void {\r\n let _this = this;\r\n // Display info message to the user in a modal\r\n let titleDiv = $('#info-modal-title-div');\r\n let titleH = $('#info-modal-title');\r\n let confirmButton = $('#info-modal-btn-ok');\r\n let cancelButton = $('#info-modal-btn-cancel');\r\n\r\n cancelButton.html(this._options.cancelButtonCaption);\r\n\r\n // show or hide header div based on title property\r\n titleDiv.css(\"display\", \"\");\r\n if (this._options.title) {\r\n titleH.html(this._options.title);\r\n }\r\n else {\r\n titleDiv.css(\"display\", \"none\");\r\n }\r\n\r\n if (this._options.confirmButtonCaption){\r\n confirmButton.html(this._options.confirmButtonCaption);\r\n confirmButton.css(\"display\", \"\"); \r\n } else {\r\n confirmButton.css(\"display\", \"none\");\r\n }\r\n\r\n if (this._options.showCancelButton) {\r\n cancelButton.html(this._options.cancelButtonCaption);\r\n cancelButton.css(\"display\", \"\"); \r\n } else {\r\n cancelButton.css(\"display\", \"none\");\r\n }\r\n\r\n $('#info-modal-body').html(this._options.body);\r\n\r\n $(\"#info-modal-btn-ok\").click(\r\n function () {\r\n _this.popupDialogConfirm();\r\n }\r\n );\r\n\r\n $('#info-modal').on('hidden.bs.modal', function (e) {\r\n $(\"#info-modal-btn-ok\").unbind(\"click\");\r\n $(this).modal('dispose');\r\n })\r\n\r\n $('#info-modal').modal('show');\r\n global.setModalFormZIndex('#info-modal');\r\n } \r\n\r\n popupDialogConfirm() {\r\n let _this = this;\r\n let cancelButton = $('#info-modal-btn-cancel');\r\n\r\n if (this._options.confirmAction !== \"\") {\r\n $.ajax({\r\n url: this._options.confirmAction,\r\n type: \"POST\",\r\n data: this._options.confirmActiondata,\r\n beforeSend: function () { _this.ShowLoadingSaop(); },\r\n complete: function () { _this.HideLoadingSaop(); },\r\n success: function (result) {\r\n // close dialog\r\n cancelButton.trigger(\"click\");\r\n\r\n if(_this._options.onSuccess !== null){\r\n _this._options.onSuccess(result);\r\n }\r\n \r\n },\r\n error: function (response) {\r\n // close dialog\r\n cancelButton.trigger(\"click\");\r\n alert(response.responseJSON.message);\r\n }\r\n });\r\n }\r\n else {\r\n //close dialog\r\n cancelButton.trigger(\"click\");\r\n\r\n if (this._options.onSuccess != null) {\r\n this._options.onSuccess(null);\r\n }\r\n }\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport enum SaopRightSidebarView {\r\n Dashboard = 0\r\n ,Absence = 1\r\n ,AttendanceDay = 2\r\n ,AttendanceMonth = 3 \r\n ,TravelOrders = 4\r\n ,InternalOrders = 5\r\n}\r\n\r\nexport class SaopRightSidebar {\r\n private _saopServicesCore :SaopServicesCore;\r\n\r\n constructor() {\r\n this._saopServicesCore = new SaopServicesCore();\r\n }\r\n\r\n\r\n bindCarouselDiv(contentId:string,view:SaopRightSidebarView){\r\n global.ConsoleLogDegug(\"SaopRightSidebar.bindDiv\"); \r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/GetCarouselView?view=\"+view.toString()\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingSidebarr\"\r\n ,async:false\r\n }); \r\n }\r\n\r\n refreshDopustZaKoriscenjeSummary(contentId: string, spinnerDivId: string = \"#saopLoadingSidebarr\"): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshDopustZaKoriscenjeSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/DopustZaKoriscenjeSummaryPartial\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId: spinnerDivId\r\n }); \r\n }\r\n\r\n refreshUreZaKoriscenjeSummary(contentId: string, spinnerDivId: string = \"#saopLoadingSidebarr\"): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshUreZaKoriscenjeSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/UreZaKoriscenjeSummaryPartial\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId: spinnerDivId\r\n });\r\n }\r\n\r\n refreshRegUraDogodkiSummary(contentId: string, selectedPeriod:string, spinnerDivId:string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshRegUraDogodkiSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/RegUraDogodkiSummaryPartial?selectedPeriod=\"+selectedPeriod\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n refreshRegOPNPotniNalogiSummary(contentId: string, spinnerDivId:string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshRegOPNPotniNalogiSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"TravelOrder/TravelOrdersSummary\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n refreshNdkInternalOrdersSummary(contentId: string, spinnerDivId: string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshNdkInternalOrdersSummary\");\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"RightSideBar/InternalOrdersSummary\"\r\n , data: null\r\n , type: \"GET\"\r\n , spinnerDivId: spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n","\r\nexport interface SaopInputWFLProperties {\r\n id:string;\r\n placeholder:string;\r\n caption:string;\r\n}\r\n\r\nexport class SaopselectWFL {\r\n private _inputTemplate:string;\r\n constructor(properties:SaopInputWFLProperties) {\r\n this._inputTemplate = \r\n `\r\n \r\n \r\n \r\n \r\n \r\n `; \r\n }\r\n\r\n getElement():JQuery{\r\n let _element = $(this._inputTemplate);\r\n return _element;\r\n }\r\n\r\n getInnerHtml():string{\r\n return this._inputTemplate;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","// knjiznica: https://selectize.dev/\r\n\r\n/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SelectOption } from \"./saop-multiselect\";\r\n\r\nexport class SaopSelectizeSelect {\r\n private libName: string;\r\n private _viewId: string;\r\n private _id: string;\r\n private _selectizeControl: HTMLElement;\r\n\r\n constructor(viewId: string = \"\", id: string = \"\", libName: string = \"\") {\r\n this.libName = libName;\r\n this._viewId = viewId;\r\n this._id = id;\r\n\r\n if (this._id != \"\") {\r\n this._selectizeControl = $(this._viewId + \" \" + this._id)[0];\r\n }\r\n }\r\n\r\n init(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.init\");\r\n\r\n this.inicializeBindEvents();\r\n }\r\n\r\n initControlByJQuery(element: JQuery): void {\r\n this.initSelectizeSelect(element);\r\n }\r\n\r\n initControlByHtml(element: HTMLElement): void {\r\n this.initSelectizeSelect($(element));\r\n }\r\n\r\n initMultiselectControlByHtml(element: HTMLElement): void {\r\n this.initSelectizeMultiselect($(element));\r\n }\r\n\r\n getValue(): string {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.getValue\");\r\n\r\n return $(this._viewId + \" \" + this._id).attr(\"data-chosen\");\r\n }\r\n\r\n getMultiselectValues(): string[] {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.getMultiselectValues\");\r\n\r\n let retValue: string[] = []; \r\n\r\n $(this._viewId + \" \" + this._id + \" option:selected\").each(function (val) {\r\n retValue.push($(this).val().toString());\r\n });\r\n\r\n return retValue;\r\n }\r\n\r\n private initSelectizeSelect(element: JQuery): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeSelect...\");\r\n\r\n element.selectize({\r\n sortField: 'text',\r\n allowEmptyOption: true,\r\n render: {\r\n option: function (item: any, escape: any) {\r\n var label = item.text;\r\n var caption = item.value;\r\n return \"
    \" + '' + escape(label) + \"\" + \"
    \";\r\n },\r\n },\r\n onFocus: function () {\r\n if (this.$input.val() === \"?\") {\r\n this.setValue(\"\");\r\n }\r\n },\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeSelect...done\");\r\n }\r\n\r\n private initSelectizeMultiselect(element: JQuery): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeMultiselect...\");\r\n\r\n let _this = this;\r\n\r\n element.selectize({\r\n delimiter: \"|\",\r\n persist: false,\r\n maxItems: null,\r\n create: function (input: any) {\r\n return {\r\n value: input,\r\n text: input,\r\n };\r\n },\r\n onFocus: function () {\r\n let selValues = this.items;\r\n\r\n // ce je samo en element in ta \"?\", zbrisemo seznam, da se floating label umakne iz vvnosne kontrole\r\n if (selValues.length == 1 && selValues[0].trim() === \"?\") {\r\n this.setValue(\"\");\r\n }\r\n } \r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeSelect...done\");\r\n }\r\n\r\n private inicializeBindEvents(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.inicializeBindEvents\");\r\n\r\n let _this = this; \r\n\r\n $(this._viewId + \" \" + this._id).change(function () {\r\n var data = $(this).val().toString();\r\n _this.valueChanged(data);\r\n });\r\n }\r\n\r\n valueChanged(value: string): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.valueChanged\");\r\n }\r\n\r\n setValue(value: string): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.setValue\");\r\n this._selectizeControl.selectize.setValue(value);\r\n }\r\n\r\n setValues(values: string[]): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.setValues\");\r\n this._selectizeControl.selectize.setValue(values);\r\n }\r\n\r\n clearValue(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.clearValue\");\r\n this._selectizeControl.selectize.clear();\r\n }\r\n\r\n refreshOptions(optionList: SelectOption[]): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.refreshOptions\");\r\n\r\n let _this = this;\r\n\r\n // zbrisemo izbrano opcijo, drugace ostane notri kot opcija\r\n this._selectizeControl.selectize.clear();\r\n\r\n this._selectizeControl.selectize.clearOptions();\r\n\r\n if (optionList.length > 0) {\r\n optionList.forEach(element =>\r\n _this._selectizeControl.selectize.addOption({ value: element.value, text: element.text })\r\n );\r\n }\r\n }\r\n\r\n disable(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.disable\");\r\n this._selectizeControl.selectize.disable();\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopTogglePanel {\r\n\r\n init():void{\r\n global.ConsoleLogDegug(\"SaopTogglePanel.init...\");\r\n this.setClickEventOnFrame(\"body\");\r\n }\r\n\r\n setClickEventOnFrame(frameName:string = \"body\"):void {\r\n global.ConsoleLogDegug(\"SaopTogglePanel.setClickEventOnFrame...\");\r\n\r\n let _frame = $(\"\"+frameName+\" *> .saop-toggle-panel\");\r\n _frame.off(\"click\");\r\n _frame.click(function () {\r\n //na klik se puščica obrne gor / dol\r\n var arrowDiv = $(this).find(\".saop-toggle-arrow\");\r\n\r\n for (var i = 0; i < arrowDiv.length; i++) {\r\n if (arrowDiv[i].classList.contains(\"saop-img-down\")) {\r\n arrowDiv[i].classList.remove(\"saop-img-down\");\r\n arrowDiv[i].classList.add(\"saop-img-up\");\r\n } else {\r\n arrowDiv[i].classList.remove(\"saop-img-up\");\r\n arrowDiv[i].classList.add(\"saop-img-down\");\r\n }\r\n }\r\n });\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from \"./saop-message-dlg\";\r\n\r\nexport class SaopTreeview {\r\n private _viewId: string;\r\n private libName: string; \r\n private _translationService: SaopTranslationService;\r\n\r\n constructor(viewId: string, libName: string) {\r\n this._viewId = viewId;\r\n this.libName = libName;\r\n\r\n this._translationService = new SaopTranslationService();\r\n } \r\n\r\n init() {\r\n global.ConsoleLogDegug(\"SaopTreeview.init\");\r\n\r\n // prevajanje\r\n this.setFormTerminologyList();\r\n\r\n this.initEventListners();\r\n }\r\n\r\n private setFormTerminologyList() {\r\n global.ConsoleLogDegug(\"SaopTreeview.setFormTerminologyList\");\r\n\r\n let terminology = [\"Ni podatkov za prikaz.\", \"Brisanje\", \"Ali ste prepričani, da želite izbrisati element?\"];\r\n this._translationService.setTranslationsList(terminology);\r\n }\r\n\r\n private initEventListners() {\r\n global.ConsoleLogDegug(\"SaopTreeview.initEventListners\");\r\n\r\n let _this = this;\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-expand-colapse\"); \r\n $(this._viewId).on(\"click\", \".saop-treeview-expand-colapse\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-expand-colapse.click\");\r\n\r\n event.stopPropagation();\r\n _this.treeviewExpandColapse(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-delete\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-delete\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-delete.click\");\r\n\r\n event.stopPropagation();\r\n _this.deleteTreeviewItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-addSubItem\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-addSubItem\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-addSubItem.click\");\r\n\r\n event.stopPropagation();\r\n _this.addTreeviewSubItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-insertItem\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-insertItem\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-insertItem.click\");\r\n\r\n event.stopPropagation();\r\n _this.insertItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-edit\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-edit\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-edit.click\");\r\n\r\n event.stopPropagation();\r\n _this.editTreeviewItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-add-item-btn\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-add-item-btn\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-add-item-btn.click\");\r\n\r\n event.stopPropagation();\r\n _this.addTreeviewItem(this);\r\n });\r\n }\r\n\r\n private treeviewExpandColapse(elem: any): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.treeviewExpandColapse\");\r\n\r\n let id = $(elem).attr(\"data-toogleelementsid\");\r\n let collapseItems = $(elem).hasClass(\"saop-img-down\");\r\n\r\n $(elem).toggleClass(\"saop-img-down\");\r\n $(elem).toggleClass(\"saop-img-right\");\r\n\r\n // show/hide\r\n $(this._viewId + \" div.saop-treeview-item-container[data-parentid='\" + id + \"']\").each(function (index: number, childElem: any) {\r\n if (collapseItems) {\r\n $(childElem).hide(\"fast\");\r\n }\r\n else {\r\n $(childElem).show(\"fast\");\r\n }\r\n }); \r\n }\r\n\r\n private deleteTreeviewItem(elem: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.deleteTreeviewItem\");\r\n\r\n let _this = this;\r\n let deleteTitle = this._translationService.translate(\"Brisanje\");\r\n let deleteMessage = this._translationService.translate(\"Ali ste prepričani, da želite izbrisati element?\");\r\n\r\n let saopMessageDlg = new SaopMessageDlg(null);\r\n saopMessageDlg.onYes = function () {\r\n // poiscemo parent z klasom saop-treeview-item-container in ga odstranimo ter vse childreen\r\n let tempElement = elem;\r\n let parentid = 0;\r\n for (var i = 0; i < 10; i++) {\r\n if (tempElement.classList.contains(\"saop-treeview-item-container\")) {\r\n parentid = global.convertString2Number(tempElement.getAttribute(\"data-parentid\"));\r\n // odstranimo element\r\n tempElement.innerHTML = \"\"; \r\n tempElement.remove();\r\n break;\r\n }\r\n tempElement = tempElement.parentElement;\r\n }\r\n if (parentid != null && parentid > 0) {\r\n // ali je se kaj ostalih child elementov z istim parentId?\r\n let childreenCount = $(_this._viewId + ' div.saop-treeview-item-container[data-parentid=\"' + parentid + '\"]').length;\r\n if (childreenCount == 0) {\r\n // zbrisali zadnjega child element, skrijemo expand/collapse ikono parent elementa\r\n let parentElement = $(_this._viewId + ' div.saop-treeview-item[data-id=\"' + parentid + '\"]');\r\n if (parentElement != null) {\r\n let expandCollapseElem = $(parentElement).find(\".saop-treeview-expand-colapse\");\r\n if (expandCollapseElem != null) {\r\n expandCollapseElem.hide();\r\n }\r\n }\r\n }\r\n }\r\n };\r\n saopMessageDlg.Show(deleteMessage, deleteTitle, 1, [SaopMsgDlgButton.mbYes, SaopMsgDlgButton.mbNo]);\r\n }\r\n\r\n private addTreeviewSubItem(addSubItemButtonElement: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewSubItem\");\r\n\r\n // prikazemo expand/collapse ikono:\r\n // poiscemo parent, ki ima klas saop-treeview-item-info,\r\n let parentElem = addSubItemButtonElement.parentElement;\r\n for (var i = 0; i < 10; i++) {\r\n if (parentElem.classList.contains(\"saop-treeview-item-info\")) {\r\n // poiscemo njegov child, ki ima klas saop-treeview-expand-colapse\r\n let expandCollapseElem = $(parentElem).find(\".saop-treeview-expand-colapse\");\r\n if (expandCollapseElem != null) {\r\n expandCollapseElem.show();\r\n }\r\n break;\r\n }\r\n parentElem = parentElem.parentElement;\r\n }\r\n\r\n // poisci max Id Treeviews in ga povecamo za 1\r\n let newSubItemId = this.getMaxTreeviewId() + 1;\r\n // parent Id\r\n let newSubItemParentId = global.convertString2Number($(addSubItemButtonElement).attr(\"data-parentid\"));\r\n\r\n this.addTreeviewSubItemExternal(addSubItemButtonElement, newSubItemId, newSubItemParentId);\r\n }\r\n\r\n private getMaxTreeviewId(): number {\r\n global.ConsoleLogDegug(\"SaopTreeview.getMaxTreeviewId\");\r\n\r\n let maxId = 0\r\n\r\n $(this._viewId + \" .saop-treeview-item\").each(function (index, htmlTreeviewItem) {\r\n let id = global.convertString2Number(htmlTreeviewItem.getAttribute(\"data-id\"));\r\n if (id != null && id > maxId) {\r\n maxId = id;\r\n }\r\n });\r\n\r\n return maxId;\r\n }\r\n\r\n public addTreeviewSubItemExternal(addSubItemButtonElement: HTMLElement, newSubItemId: number, newSubItemParentId: number): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewSubItemExternal\");\r\n }\r\n\r\n // metodo uporablja client, vrne content, ki jo dodamo v treeview\r\n public addTreeviewSubItemContent(addSubItemButtonElement: HTMLElement, newSubItemId: number, newSubItemParentId: number, htmlContent: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewSubItemContent\");\r\n\r\n let elemParent = $(this._viewId + ' div.saop-treeview-item[data-id=\"' + newSubItemParentId + '\"]');\r\n elemParent.append(htmlContent);\r\n }\r\n\r\n private addTreeviewItem(addItemButtonElement: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewItem\");\r\n\r\n // poisci max Id Treeviews in ga povecamo za 1\r\n let newItemId = this.getMaxTreeviewId() + 1;\r\n\r\n this.addTreeviewItemExternal(addItemButtonElement, newItemId, null);\r\n }\r\n\r\n public addTreeviewItemExternal(addItemButtonElement: HTMLElement, newItemId: number, newItemParentId: number): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewItemExternal\");\r\n }\r\n\r\n // metodo uporablja client, vrne content, ki jo dodamo v treeview\r\n public addTreeviewItemContent(addItemButtonElement: HTMLElement, newItemId: number, newItemParentId: number, htmlContent: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewItemContent\");\r\n\r\n // odstranimo add item html, ker ga bo ze dodal htmlContent\r\n $(this._viewId + \" .saop-treeview-add-item-container\").each(function (index, htmlTreeviewAddItem) {\r\n htmlTreeviewAddItem.remove();\r\n });\r\n\r\n let elemParent = $(this._viewId);\r\n elemParent.append(htmlContent);\r\n }\r\n\r\n private editTreeviewItem(elem: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.editTreeviewItem\");\r\n\r\n // odstranimo css klas za obrobo vsem elementom in jo dodamo izbranemu\r\n this.clearTreeviewItemsSelectedCss();\r\n $(elem).addClass(\"saop-treeview-item-selected\");\r\n\r\n this.editTreeviewItemExternal(elem);\r\n }\r\n\r\n // za externo uporabo\r\n public editTreeviewItemExternal(elem: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.editTreeviewItemExternal\");\r\n }\r\n\r\n public clearTreeviewItemsSelectedCss(): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.clearTreeviewItemsSelectedCss\");\r\n\r\n $(this._viewId + \" .saop-treeview-item-info\").removeClass(\"saop-treeview-item-selected\");\r\n }\r\n\r\n // elem je isti kot ga ponuja editTreeviewItem oz. editTreeviewItemExternal\r\n public refreshTreeviewItemHeader(elem: HTMLElement, header: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.refreshTreeviewItemHeader\");\r\n\r\n $(elem).find(\".saop-treeview-item-header\").text(header);\r\n }\r\n\r\n private insertItem(insertItemButtonElement: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.insertItem\");\r\n\r\n // poiscemo parent, ki ima klas saop-treeview-item-container,\r\n let parentFound = false\r\n let parentElem = insertItemButtonElement.parentElement;\r\n for (var i = 0; i < 20; i++) {\r\n if (parentElem.classList.contains(\"saop-treeview-item-container\")) {\r\n parentFound = true;\r\n break;\r\n }\r\n parentElem = parentElem.parentElement;\r\n }\r\n\r\n if (parentFound) {\r\n // poisci max Id Treeviews in ga povecamo za 1\r\n let newItemId = this.getMaxTreeviewId() + 1;\r\n // parentId\r\n let newItemParentId = global.convertString2Number($(parentElem).attr(\"data-parentid\"));\r\n\r\n this.insertTreeviewItemExternal(parentElem, newItemId, newItemParentId);\r\n } \r\n }\r\n\r\n public insertTreeviewItemExternal(itemToAppendTo: HTMLElement, newItemId: number, newItemParentId: number): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.insertTreeviewItemExternal\");\r\n }\r\n\r\n public insertTreeviewItemContent(itemToAppendTo: HTMLElement, newItemId: number, newItemParentId: number, htmlContent: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.insertTreeviewItemContent\");\r\n\r\n $(itemToAppendTo).after(htmlContent);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\n\r\nexport class SaopViewSpinner {\r\n\r\n generateSpinnerDiv(spinnerId: string = '#saopLoading'): string {\r\n global.ConsoleLogDegug(\"generateSpinnerDiv \" + spinnerId);\r\n let spinnrDiv =\r\n '
    '\r\n + '\t
    '\r\n + '\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t
    '\r\n + '
    ';\r\n\r\n return spinnrDiv;\r\n }\r\n\r\n showLoadingSaop(elementId: string = \"#saopLoading\") {\r\n global.ConsoleLogDegug(\"showLoadingSaop \" + elementId);\r\n var obj = $(elementId);\r\n if (obj.length) {\r\n global.ConsoleLogDegug(\"Show... \");\r\n obj.show();\r\n //setModalFormZIndex(elementId);\r\n }\r\n }\r\n\r\n hideLoadingSaop(elementId: string = \"#saopLoading\") {\r\n global.ConsoleLogDegug(\"hideLoadingSaop \" + elementId);\r\n var obj = $(elementId);\r\n if (obj.length)\r\n obj.hide();\r\n }\r\n\r\n // showLoadingSaop(elementId: string = \"\") {\r\n // global.ConsoleLogDegug(\"showLoadingSaop \" + elementId);\r\n // if (!isEmpty(elementId)) {\r\n // let elementDiv = $(elementId);\r\n // if (elementDiv.length) {\r\n // let spinnerID = elementId + \"Loading\";\r\n // spinnerID = spinnerID.replace(\"#\",\"\");\r\n // let spinnerDiv = $(spinnerID);\r\n // if (!spinnerDiv.length) {\r\n // let _div = this.generateSpinnerDiv(spinnerID);\r\n // elementDiv.append(_div);\r\n // spinnerDiv = $(spinnerID);\r\n // }\r\n // spinnerDiv.show();\r\n // }\r\n // }\r\n // }\r\n\r\n // hideLoadingSaop(elementId: string = \"\") {\r\n // global.ConsoleLogDegug(\"hideLoadingSaop \" + elementId);\r\n // if (!isEmpty(elementId)) {\r\n // let elementDiv = $(elementId);\r\n // if (elementDiv.length) {\r\n // let spinnerID = elementId + \"Loading\";\r\n // let spinnerDiv = $(spinnerID);\r\n // if (!spinnerDiv.length) {\r\n // elementDiv.append(this.generateSpinnerDiv(spinnerID));\r\n // spinnerDiv = $(spinnerID);\r\n // }\r\n // spinnerDiv.hide();\r\n // }\r\n // }\r\n // }\r\n // //\r\n}\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopViewSpinner } from '../Components/saop-view-spinner'\r\n\r\nexport interface SaopServicesCoreParams {\r\n action:string;\r\n async?:boolean\r\n type?:string;\r\n data?:any;\r\n spinnerDivId?:string;\r\n // contentType?: string | false | undefined;\r\n // dataType?: 'xml' | 'html' | 'script' | 'json' | 'jsonp' | 'text' | string | undefined;\r\n // processData?: boolean | undefined;\r\n}\r\n\r\nexport enum SaopServicesCoreResult {\r\n success = 1\r\n , error = 2\r\n}\r\n\r\nexport enum SaopServicesCoreHTTPResultStatusCode {\r\n ok = 200,\r\n unauthorized = 401,\r\n internalServerError = 500\r\n}\r\n\r\nexport interface SaopServicesCoreResponse {\r\n response: SaopServicesCoreResult;\r\n data: any;\r\n};\r\n\r\n// function syncDelay(milliseconds:any){\r\n// var start = new Date().getTime();\r\n// var end=0;\r\n// while( (end-start) < milliseconds){\r\n// end = new Date().getTime();\r\n// }\r\n// }\r\n\r\nexport class SaopServicesCore {\r\n private _saopViewSpinner:SaopViewSpinner = new SaopViewSpinner();\r\n private _params:SaopServicesCoreParams;\r\n private _defaultParams:SaopServicesCoreParams;\r\n // \r\n //public _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n\r\n constructor(){\r\n this._defaultParams = {\r\n action:\"\"\r\n ,type:\"GET\"\r\n ,async:true\r\n ,data:null\r\n ,spinnerDivId:\"\"\r\n };\r\n }\r\n\r\n private onDone(result:any){\r\n global.ConsoleLogDegug(\"SaopServicesCore.onDone\");\r\n this.afterDone(result);\r\n //this._saopViewSpinner.hideLoadingSaop(this._params.spinnerDivId); \r\n }\r\n\r\n afterDone(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterDone\");\r\n } \r\n\r\n private onSuccess(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.success\");\r\n let _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n if (typeof result.success === \"undefined\" || result.success === null) {\r\n _result.response = SaopServicesCoreResult.success;\r\n } else {\r\n _result.response = result.success == true ? SaopServicesCoreResult.success : SaopServicesCoreResult.error;\r\n }\r\n \r\n _result.data = result;\r\n this.afterSuccess(_result);\r\n }\r\n\r\n afterSuccess(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterSuccess\");\r\n } \r\n\r\n private onError(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.error\");\r\n \r\n if (result.status == SaopServicesCoreHTTPResultStatusCode.unauthorized) {\r\n // redirect to login\r\n this.unAuthorizedRedirectToLoginPage();\r\n return;\r\n }\r\n\r\n if (result.status = SaopServicesCoreHTTPResultStatusCode.internalServerError && !global.isUnDefined(result.responseText)) {\r\n alert(\"Internal error!\");\r\n }\r\n\r\n let _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n _result.response = SaopServicesCoreResult.error;\r\n _result.data = result;\r\n this.afterError(_result);\r\n }\r\n\r\n afterError(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterSuccess\");\r\n } \r\n\r\n ExecuteAction(params:SaopServicesCoreParams):void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.ExecuteAction\");\r\n let options = { ...this._defaultParams, ...params };\r\n params = options;\r\n this._params = params;\r\n let _this = this;\r\n let _ajaxAction = global.getSiteAbsoluteURL(params.action);\r\n\r\n //@Url.Action(\"crearCampManual\", \"DPS\")\r\n\r\n try {\r\n $.ajax({\r\n async: params.async,\r\n url: _ajaxAction,\r\n type: !global.isEmpty(params.type) ? params.type : \"POST\",\r\n data: params.data,\r\n // contentType: params.contentType == null ? 'application/x-www-form-urlencoded; charset=UTF-8' : params.contentType,\r\n // dataType: params.type == null ? 'Intelligent Guess (xml, json, script, or html)' : params.type, \r\n // processData : params.processData == null ? true : params.processData, \r\n beforeSend: function () { _this._saopViewSpinner.showLoadingSaop(params.spinnerDivId); },\r\n complete: function () { _this._saopViewSpinner.hideLoadingSaop(params.spinnerDivId); },\r\n success: this.onSuccess.bind(_this),\r\n error: this.onError.bind(_this)\r\n }).done(function (result) {\r\n global.ConsoleLogDegug(\"Done...\");\r\n _this.onDone(result);\r\n });\r\n }\r\n catch(err) {\r\n alert(\"Internal error!\");\r\n } \r\n\r\n \r\n }\r\n\r\n ExecuteBlobAction(params: SaopServicesCoreParams): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.ExecuteBlobAction\");\r\n let options = { ...this._defaultParams, ...params };\r\n params = options;\r\n this._params = params;\r\n let _this = this;\r\n let _ajaxAction = global.getSiteAbsoluteURL(params.action);\r\n\r\n try {\r\n $.ajax({\r\n type: \"POST\",\r\n url: _ajaxAction,\r\n data: params.data,\r\n xhrFields: {\r\n responseType: 'blob' // to avoid binary data being mangled on charset conversion\r\n },\r\n success: function (blob, status, xhr) {\r\n // check for a filename\r\n var filename = \"\";\r\n var disposition = xhr.getResponseHeader('Content-Disposition');\r\n if (disposition && disposition.indexOf('attachment') !== -1) {\r\n var filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n var matches = filenameRegex.exec(disposition);\r\n if (matches != null && matches[1]) filename = matches[1].replace(/['\"]/g, '');\r\n }\r\n\r\n //if (typeof window.navigator.msSaveBlob !== 'undefined') {\r\n // // IE workaround for \"HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed.\"\r\n // window.navigator.msSaveBlob(blob, filename);\r\n //} else\r\n //{\r\n var URL = window.URL || window.webkitURL;\r\n var downloadUrl = URL.createObjectURL(blob);\r\n\r\n if (filename) {\r\n // use HTML5 a[download] attribute to specify filename\r\n var a = document.createElement(\"a\");\r\n // safari doesn't support this yet\r\n if (typeof a.download === 'undefined') {\r\n window.location.href = downloadUrl;\r\n } else {\r\n a.href = downloadUrl;\r\n a.download = filename;\r\n document.body.appendChild(a);\r\n a.click();\r\n }\r\n } else {\r\n window.location.href = downloadUrl;\r\n }\r\n\r\n setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup\r\n //}\r\n },\r\n error: this.onError.bind(_this)\r\n }).done(function (result) {\r\n global.ConsoleLogDegug(\"Done...\");\r\n _this.onDone(result);\r\n });\r\n }\r\n catch (err) {\r\n alert(\"Internal error!\");\r\n }\r\n }\r\n \r\n public handleSubmitError(response: any): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.HandleSubmitError\");\r\n\r\n if (response.status == SaopServicesCoreHTTPResultStatusCode.unauthorized) {\r\n this.unAuthorizedRedirectToLoginPage();\r\n return;\r\n }\r\n\r\n // display error\r\n console.log(\"response\", response);\r\n alert(response.statusText);\r\n }\r\n\r\n public unAuthorizedRedirectToLoginPage(): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.redirectToLoginPage\");\r\n\r\n window.location.reload();\r\n }\r\n \r\n //\r\n}\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport class SaopTranslation {\r\n public key: string = \"#\";\r\n public translation: string = null;\r\n}\r\n\r\nexport class SaopTranslations {\r\n public translationsList:[SaopTranslation?] = [];\r\n}\r\n\r\n\r\nexport interface SaopTranslationServiceParams {\r\n controller:string,\r\n action:string,\r\n}\r\n\r\n\r\nexport class SaopTranslationService {\r\n private _params:SaopTranslationServiceParams;\r\n private _saopServicesCore: SaopServicesCore;\r\n //\r\n public _terminology:SaopTranslations;\r\n\r\n\r\n constructor(params:SaopTranslationServiceParams = null){\r\n if(!global.isUnDefined(params)){\r\n this._params = params;\r\n } else {\r\n this._params = {controller:\"Translation\",action:\"GetTranslations\"};\r\n }\r\n \r\n this._saopServicesCore = new SaopServicesCore();\r\n this._terminology = new SaopTranslations();\r\n }\r\n \r\n setTranslationsList(translations:string[]):any{\r\n let _this = this;\r\n translations.forEach(function (value) {\r\n _this._terminology.translationsList.push({key:value,translation:value}); \r\n }); \r\n return this.getTranslations(this._terminology);\r\n }\r\n\r\n getTranslations(translations:SaopTranslations):any{\r\n let jsonData = JSON.stringify(translations);\r\n let _data = {jsonInput:jsonData};\r\n let _response:any;\r\n this._saopServicesCore.afterDone = function (response) {\r\n _response = response;\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: this._params.controller+\"/\"+this._params.action+\"\"\r\n , type: \"POST\"\r\n , data: _data\r\n , async: false\r\n });\r\n this._terminology.translationsList = _response.translationsList;\r\n return _response;\r\n }\r\n\r\n translate(key:string):string{\r\n let _tr = this._terminology.translationsList.find(e => e.key == key) as any;\r\n if (global.isUnDefined(_tr)) { \r\n return key;\r\n } else {\r\n return _tr.translation;\r\n }\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\n\r\nexport class SaopUtils {\r\n checkCompatibility():boolean {\r\n return SaopCommon.checkCompatibility();\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore,SaopServicesCoreParams, SaopServicesCoreResponse, SaopServicesCoreResult } from './saop-services-core'\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport {SaopFloatingLabel } from '../Components/saop-floating-label';\r\n\r\nexport class Error {\r\n public Code: string;\r\n public Message: string;\r\n}\r\n\r\nexport enum SaopWfAction {\r\n wfaNone = 0\r\n ,wfaAddRecord = 1\r\n ,wfaEditRecord = 2\r\n ,wfaDeleteRecord = 3\r\n ,wfaRecordDestails = 4\r\n}\r\n\r\nexport interface SaopWfSubmitResult {\r\n success:boolean;\r\n viewContent:string;\r\n redirectTo:string;\r\n alertMessage:string;\r\n}\r\n\r\nexport class SaopViewForm {\r\n private _viewModalFrame:JQuery;\r\n private _viewModalBody:JQuery;\r\n private _view_title:JQuery;\r\n private _view_btnOk:JQuery;\r\n private _view_btnCancel:JQuery;\r\n private _servicesParams:SaopServicesCoreParams = {action:null,data:null,type:\"POST\"};\r\n private _terminology: string[];\r\n //\r\n public _libName:string;\r\n public saopServicesCore:SaopServicesCore = new SaopServicesCore();\r\n public translationService:SaopTranslationService;\r\n public contentElementId = \".saop-modal-body-element\";\r\n public addRecordEndpoint: string = \"\";\r\n public editRecordEndpoint: string = \"\";\r\n public deleteRecordEndpoint: string = \"\";\r\n public manuallySubmitEndpoint: string = \"\";\r\n public saopFloatingLabel: SaopFloatingLabel;\r\n //\r\n public onSucccessCallback: string = \"\";\r\n public onErrorCallback: string = \"\";\r\n public onFailureCallback: string = \"\";\r\n // \r\n public id:string;\r\n public title:string;\r\n public fullScreen:boolean = false;\r\n //\r\n public onClose: (params:any) => any = null;\r\n public onSubmit: (params:any) => any = null;\r\n public onError: (params:any) => any = null;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n global.ConsoleLogDegug(\"SaopViewForm...\");\r\n global.ConsoleLogDegug(\"viewId:\"+viewId);\r\n this.id = viewId;\r\n this._libName = libName;\r\n this.onSucccessCallback = libName+\".onSubmitSuccess(data,\"+libName+\");\";\r\n this.onErrorCallback = libName + \".onSubmitError(data,\" + libName + \");\";\r\n this.onFailureCallback = libName + \".onSubmitFailure(xhr,\" + libName + \");\";\r\n this.translationService = new SaopTranslationService();\r\n this.saopFloatingLabel = new SaopFloatingLabel();\r\n // \r\n }\r\n\r\n public setTerminologyList(dictionary: string[] = null) {\r\n this._terminology = [\"Uredi\",\"Nov vnos\",\"Podrobnosti\",\"Brisanje\"];\r\n if (dictionary != null) {\r\n this._terminology = this._terminology.concat(dictionary);\r\n }\r\n this.translationService.setTranslationsList(this._terminology);\r\n }\r\n\r\n public onBtnOkClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onBtnOkClick...\");\r\n }\r\n\r\n public onBtnCancel(sender:any):void{\r\n global.ConsoleLogDegug(\"onBtnCancel...\");\r\n }\r\n\r\n public beforeViewShow(sender:any):void{\r\n global.ConsoleLogDegug(this.id+\".beforeViewShow()\");\r\n\r\n this._viewModalFrame = $(this.id);\r\n if (this._viewModalFrame == null) { console.log(this.id+\" not found!\");};\r\n //\r\n var contentSel = this.id + \" \" + this.contentElementId;\r\n this._viewModalBody = $(contentSel);\r\n }\r\n\r\n public afterViewShow(sender:any,wfAction:SaopWfAction):void{\r\n global.ConsoleLogDegug(this.id+\".afterViewShow()\");\r\n let _this = this;\r\n this._view_btnOk = $(\"\"+this.id+\" *> #btnOk\");\r\n this._view_btnCancel = $(\"\"+this.id+\" *> #btnCancel\");\r\n this._view_title = $(\"\"+this.id+\" *> #exampleModalLongTitle\");\r\n //\r\n\r\n global.ConsoleLogDegug(\"afterViewShow title:\"+ this.title);\r\n\r\n if (!global.isEmpty(this.title)){\r\n let _title = \"\";\r\n if (wfAction == SaopWfAction.wfaAddRecord){\r\n _title = this.translationService.translate(\"Nov vnos\")+\": \"+this.title;\r\n } else if (wfAction == SaopWfAction.wfaEditRecord){\r\n _title = this.translationService.translate(\"Uredi\")+\": \"+this.title;\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails){\r\n _title = this.translationService.translate(\"Podrobnosti\")+\": \"+this.title;\r\n }\r\n\r\n global.ConsoleLogDegug(\"afterViewShow _title:\"+ _title);\r\n\r\n this._view_title.html(_title);\r\n } else {\r\n if (wfAction == SaopWfAction.wfaAddRecord){\r\n let defaultTitleAdd = $(\"\"+this.id+\" *> #addTitle\").val().toString();\r\n this._view_title.html(defaultTitleAdd);\r\n } else {\r\n let defaultTitleEdit = $(\"\"+this.id+\" *> #editTitle\").val().toString();\r\n this._view_title.html(defaultTitleEdit);\r\n }\r\n }\r\n\r\n this.viewShowComplete(sender, wfAction);\r\n\r\n //\r\n this.bindButtons(sender);\r\n\r\n this.bindViewEvents();\r\n\r\n this._viewModalFrame.modal('show');\r\n global.setModalFormZIndex(this.id);\r\n global.setFirstFormControlToFocus(this.id);\r\n //\r\n this.afterViewShowSuccess(sender);\r\n }\r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n global.ConsoleLogDegug(this.id + \".afterViewShowSuccess()\");\r\n }\r\n\r\n public viewShowComplete(sender: any, wfAction: SaopWfAction): void {\r\n global.ConsoleLogDegug(this.id + \".viewShowComplete()\");\r\n }\r\n\r\n private bindButtons(sender: any): void {\r\n global.ConsoleLogDegug(\"bindButtons\");\r\n let _this = this;\r\n\r\n this._view_btnOk = $(\"\" + this.id + \" *> #btnOk\");\r\n this._view_btnOk.click(\r\n function () {\r\n _this.onBtnOkClick(sender);\r\n }\r\n );\r\n\r\n this._view_btnCancel = $(\"\" + this.id + \" *> #btnCancel\");\r\n this._view_btnCancel.click(\r\n function () {\r\n _this.onBtnCancel(sender);\r\n }\r\n );\r\n }\r\n\r\n public bindViewEvents(): void {\r\n global.ConsoleLogDegug(\"bindViewEvents\");\r\n\r\n let divForm = this._viewModalFrame.find(\"form\");\r\n\r\n if (this.onSucccessCallback !== null) {\r\n divForm.attr(\"data-ajax-success\", this.onSucccessCallback);\r\n }\r\n if (this.onErrorCallback !== null) {\r\n divForm.attr(\"data-ajax-error\", this.onErrorCallback);\r\n }\r\n if (this.onFailureCallback !== null) {\r\n divForm.attr(\"data-ajax-failure\", this.onFailureCallback);\r\n }\r\n \r\n this.saopFloatingLabel.init(); \r\n }\r\n\r\n private renderErrorsBanner(errors:Error[]):SaopServicesCoreResponse {\r\n let result:SaopServicesCoreResponse;\r\n result = {response:SaopServicesCoreResult.error,data:null}; \r\n //\r\n let jsonData = JSON.stringify(errors);\r\n let _data = {jsonInput:jsonData}; \r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterSuccess = function (response:SaopServicesCoreResponse) {\r\n result = response;\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: \"Errors/RenderErrorsBanner\"\r\n , type: \"POST\"\r\n , data: _data\r\n , async: false\r\n });\r\n\r\n return result;\r\n }\r\n\r\n public renderError(errMessage:string):void{\r\n try {\r\n global.ConsoleLogDegug(\"ajax.afterError\");\r\n let _errors:Error[];\r\n _errors = [{Code:\"\",Message:errMessage}];\r\n \r\n let _parentView = $(this.id).parent();\r\n\r\n let _errorBannerId = this.id+\"ErrorBanner\";\r\n //let _view_banner = this._viewModalBody.find(_errorBannerId);\r\n let _view_banner = _parentView.find(_errorBannerId);\r\n if ( global.isUnDefined(_view_banner) || _view_banner.length == 0) {\r\n _view_banner = _parentView.append(\"
    \");\r\n }\r\n let _bannerResult = this.renderErrorsBanner(_errors);\r\n _view_banner.html(_bannerResult.data.viewContent); \r\n }\r\n catch(err) {\r\n alert(err.message);\r\n } \r\n }\r\n //public loadViewBody(wfAction:SaopWfAction,data:any,sender:any):SaopServicesCoreResult{\r\n public loadViewBody(wfAction:SaopWfAction,data:any,sender:any):void{\r\n global.ConsoleLogDegug(\"loadViewBody\");\r\n let _this = this;\r\n this.beforeViewShow(sender);\r\n\r\n let _ajaxAction = wfAction == SaopWfAction.wfaAddRecord ? this.addRecordEndpoint : this.editRecordEndpoint;\r\n //_ajaxAction = getSiteAbsoluteURL(_ajaxAction);\r\n\r\n this._servicesParams = {action:_ajaxAction,data:data,type:\"POST\"};\r\n\r\n this.saopServicesCore.afterSuccess = function(_ajaxResult){\r\n if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n global.ConsoleLogDegug(\"ajax.success\");\r\n _this._viewModalBody.html(_ajaxResult.data);\r\n _this.afterViewShow(sender,wfAction);\r\n } else {\r\n global.ConsoleLogDegug(\"ajax.error\");\r\n if ((global.isUnDefined(_ajaxResult.data) && global.isUnDefined(_ajaxResult.data.alertMessage)) == false){\r\n _this.renderError(_ajaxResult.data.alertMessage);\r\n } else if (_ajaxResult.data.responseJSON && _ajaxResult.data.responseJSON.message){\r\n alertify.error(_ajaxResult.data.responseJSON.message);\r\n } \r\n }\r\n \r\n };\r\n\r\n this.saopServicesCore.afterError = function(_ajaxResult){\r\n//###\r\n if ((global.isUnDefined(_ajaxResult.data) && global.isUnDefined(_ajaxResult.data.alertMessage)) == false){\r\n _this.renderError(_ajaxResult.data.alertMessage);\r\n } else {\r\n alert(\"Internal error!\");\r\n }\r\n };\r\n\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n } \r\n\r\n public afterSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.afterExecuteSuccess\");\r\n }\r\n\r\n public onSubmitSuccessComplete(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitSuccessComplete\");\r\n }\r\n\r\n public onSubmitError(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitError\");\r\n }\r\n\r\n public onSubmitFailure(result: any): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitFailure\");\r\n var saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.handleSubmitError(result);\r\n }\r\n \r\n public onSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onExecuteSuccess\");\r\n if (result.success) {\r\n global.ConsoleLogDegug(\"submit.success\");\r\n\r\n this._viewModalFrame.modal('hide');\r\n\r\n // just in case: odstrani, če je še vedno vidno, avtomatsko se ne zapre vedno :(\r\n $('.modal-backdrop').remove();\r\n $(document.body).removeClass(\"modal-open\");\r\n\r\n if (result.alertMessage) {\r\n alertify.message(result.alertMessage);\r\n } \r\n\r\n if (!global.isUnDefined(this.refreshData)){\r\n this.refreshData(result);\r\n }\r\n\r\n this.onSubmitSuccessComplete(result);\r\n } else {\r\n global.ConsoleLogDegug(\"submit.error\");\r\n global.ConsoleLogDegug(\"reload view form\");\r\n this.refreshContent(result.viewContent);\r\n }\r\n this.afterSubmitSuccess(result);\r\n } \r\n\r\n public refreshContent(viewContent: string): void {\r\n this._viewModalBody.html(viewContent);\r\n this.bindButtons(null);\r\n this.bindViewEvents();\r\n\r\n this.onAfterRefreshContent();\r\n }\r\n\r\n public onAfterRefreshContent(): void {\r\n global.ConsoleLogDegug(\"onAfterRefreshContent\");\r\n }\r\n\r\n public onDeleteRecord(deleteData:any):void {\r\n global.ConsoleLogDegug(\"onDeleteRecord\");\r\n let _this = this;\r\n this._servicesParams = {action:this.deleteRecordEndpoint,data:deleteData,type:\"POST\"};\r\n\r\n this.saopServicesCore.afterSuccess = function(_ajaxResult){\r\n if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n alertify.message(_ajaxResult.data.alertMessage);\r\n if (!global.isUnDefined(_this.refreshData)){\r\n _this.refreshData(deleteData);\r\n }\r\n } else {\r\n alertify.error(_ajaxResult.data.alertMessage);\r\n }\r\n };\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n\r\n // let _ajaxResult = this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n // if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n // alertify.message(_ajaxResult.data.alertMessage);\r\n // if (!global.isUnDefined(this.refreshData)){\r\n // this.refreshData(deleteData);\r\n // }\r\n // } else {\r\n // alertify.error(_ajaxResult.data.alertMessage);\r\n // }\r\n // return _ajaxResult.response;\r\n }\r\n \r\n public refreshData(sender:any):void {\r\n global.ConsoleLogDegug(\"refreshData\");\r\n }\r\n\r\n public deleteRecord(title:string,message:string,deleteData:any):void{\r\n global.ConsoleLogDegug(\"deleteRecord.begin\");\r\n let saopMessageDlg = new SaopMessageDlg(deleteData) \r\n saopMessageDlg.onYes = this.onDeleteRecord.bind(this);\r\n saopMessageDlg.Show(message,title,1,[SaopMsgDlgButton.mbYes,SaopMsgDlgButton.mbNo]);\r\n global.ConsoleLogDegug(\"deleteRecord.end\");\r\n }\r\n\r\n public addRecord(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"addRecord\");\r\n let _result = this.loadViewBody(SaopWfAction.wfaAddRecord,data,sender);\r\n }\r\n\r\n public editRecord(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"editRecord\");\r\n this.loadViewBody(SaopWfAction.wfaEditRecord,data,sender);\r\n }\r\n\r\n public recordDetails(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"editRecord\");\r\n this.loadViewBody(SaopWfAction.wfaRecordDestails,data,sender);\r\n }\r\n\r\n public manuallySubmit(submitData: any, spinnerDivId: string = null): void {\r\n global.ConsoleLogDegug(\"manuallySubmit\");\r\n\r\n let _this = this;\r\n\r\n if (global.isEmpty(spinnerDivId)) {\r\n this._servicesParams = { action: this.manuallySubmitEndpoint, data: submitData, type: \"POST\" };\r\n }\r\n else {\r\n this._servicesParams = { action: this.manuallySubmitEndpoint, data: submitData, type: \"POST\", spinnerDivId: spinnerDivId };\r\n }\r\n\r\n this.saopServicesCore.afterSuccess = function (_ajaxResult) {\r\n _this.onSubmitSuccess(_ajaxResult.data);\r\n };\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n }\r\n\r\n public showViewForm(wfAction:SaopWfAction,data:any,sender:any = null):void{\r\n global.ConsoleLogDegug(\"showViewForm\");\r\n if (wfAction == SaopWfAction.wfaAddRecord) {\r\n this.addRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaEditRecord) {\r\n this.editRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails) { \r\n this.recordDetails(data,sender); \r\n } \r\n this.SetToFullScreen(); \r\n } \r\n\r\n public SetToFullScreen(){\r\n if (this.fullScreen ){\r\n this._viewModalFrame.addClass(\"saop-modal-fullscreen-form\");\r\n let _dialogDiv = this._viewModalFrame.find(\".modal-dialog\");\r\n _dialogDiv.removeClass('modal-dialog-centered');\r\n _dialogDiv.addClass('modal-fullscreen');\r\n _dialogDiv.removeAttr('style');\r\n \r\n let _content = this._viewModalFrame.find(\".modal-content\");\r\n _content.removeAttr('class');\r\n _content.addClass('modal-content');\r\n }\r\n }\r\n\r\n public refreshElementData(htmlContent:string,elementId:string): void {\r\n global.ConsoleLogDegug(\"refreshElementData\");\r\n let _document = $(htmlContent);\r\n let _cell = _document.find(elementId);\r\n $(elementId).replaceWith(_cell);\r\n }\r\n\r\n // \r\n}\r\n","import { global } from \"./Common/saop-common\";\r\nimport { SaopUtils } from \"./Core/saop-utils\";\r\nimport { SaopTogglePanel } from \"./Components/saop-toggle-panel\";\r\nimport { SaopInputMask } from \"./Components/saop-inputmask\";\r\nimport { SaopCheckboxSwitch } from \"./Components/saop-checkbox-switch\";\r\nimport { SaopMultiselect } from \"./Components/saop-multiselect\";\r\nimport { SaopViewSpinner } from './Components/saop-view-spinner';\r\nimport { SaopRightSidebar } from './Components/saop-right-sidebar';\r\nimport { MenuSidebar } from \"./Components/saop-menu-sidebar\";\r\nimport { SaopMessageDlg } from \"./Components/saop-message-dlg\";\r\nimport { SaopPopupDialog } from './Components/saop-popup-dialog'\r\nimport { SaopFloatingLabel } from \"./Components/saop-floating-label\";\r\nimport { SaopServicesCore } from './Core/saop-services-core';\r\nimport { SaopTranslationService } from './Core/saop-translate';\r\nimport { SaopWebGrid } from './Components/saop-grid';\r\nimport { SaopViewForm } from './Core/saop-view-form';\r\nimport { SaopTreeview } from './Components/saop-treeview';\r\nimport { SaopSelectizeSelect } from './Components/saop-selectize-select';\r\nimport { SaopPdfPreview } from \"./Components/saop-pdf-preview\";\r\nimport { SaopPinchZoom } from \"./Components/saop-pinch-and-zoom\";\r\n\r\nexport function echoTest(msg:string): void {\r\n console.log(\"echo: \"+msg);\r\n}\r\n\r\nexport function checkCompatibility(): boolean {\r\n global.ConsoleLogDegug(\"checkCompatibility\");\r\n let utils = new SaopUtils();\r\n return utils.checkCompatibility();\r\n}\r\n\r\nexport function initClientLogModeValue() {\r\n global.debugMode = global.GetClientLogModeStorageValue();\r\n}\r\n\r\nexport function initSiteBaseUrlValue() {\r\n global.siteBaseUrl = global.getSiteBaseUrl()\r\n}\r\n\r\nexport function initializeSiteJS() {\r\n global.ConsoleLogDegug(\"initializeSiteJS\");\r\n new MenuSidebar().init();\r\n new SaopTogglePanel().init();\r\n\r\n document.addEventListener('keydown', function (e) {\r\n if (e.ctrlKey && e.altKey && e.keyCode == 79) {\r\n // CTRL + ALT + O\r\n global.SetClientLogModeStorageValue();\r\n global.debugMode = global.GetClientLogModeStorageValue();\r\n }\r\n });\r\n\r\n global.setHelpLink();\r\n}\r\n\r\nexport function setFirstControlToFocus(formId: string) {\r\n global.setFirstFormControlToFocus(formId);\r\n}\r\n\r\nexport {global};\r\n\r\n\r\n\r\nexport class SaopTogglePanelEx extends SaopTogglePanel{};\r\n\r\nexport class SaopInputMaskEx extends SaopInputMask{};\r\n\r\nexport class SaopCheckboxSwitchEx extends SaopCheckboxSwitch{};\r\n\r\nexport class SaopMultiselectEx extends SaopMultiselect{};\r\n\r\nexport class SaopMessageDlgEx extends SaopMessageDlg{};\r\n\r\nexport class SaopPopupDialogEx extends SaopPopupDialog{};\r\n\r\nexport class SaopViewSpinnerEX extends SaopViewSpinner { };\r\n\r\nexport class SaopRightSidebarEx extends SaopRightSidebar { };\r\n\r\nexport class SaopFloatingLabelEx extends SaopFloatingLabel { };\r\n\r\nexport class SaopServicesCoreEx extends SaopServicesCore { };\r\n\r\nexport class SaopTranslationServiceEx extends SaopTranslationService { };\r\n\r\nexport class SaopWebGridEx extends SaopWebGrid { };\r\n\r\nexport class SaopViewFormEx extends SaopViewForm { };\r\n\r\nexport class SaopUtilsEx extends SaopUtils { };\r\n\r\nexport class SaopTreeviewEx extends SaopTreeview { };\r\n\r\nexport class SaopSelectizeSelectEx extends SaopSelectizeSelect { };\r\n\r\nexport class SaopPdfPreviewEx extends SaopPdfPreview {};\r\n\r\nexport class SaopPinchZoomEx extends SaopPinchZoom {};\r\n//\r\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJUeXBlU2NyaXB0cy9Db21tb24vc2FvcC1jb21tb24udHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtY2hlY2tib3gtc3dpdGNoLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWZsb2F0aW5nLWxhYmVsLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWdyaWQtZWRpdC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1ncmlkLWZpbHRlci50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1ncmlkLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWlucHV0LXdmbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1pbnB1dG1hc2sudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtbWVudS1zaWRlYmFyLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLW1lc3NhZ2UtZGxnLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLW11bHRpc2VsZWN0LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXBkZi1wcmV2aWV3LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXBpbmNoLWFuZC16b29tLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXBvcG92ZXIudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtcG9wdXAtZGlhbG9nLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXJpZ2h0LXNpZGViYXIudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3Atc2VsZWN0LXdmbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1zZWxlY3RpemUtc2VsZWN0LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXRvZ2dsZS1wYW5lbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC10cmVldmlldy50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC12aWV3LXNwaW5uZXIudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3Atc2VydmljZXMtY29yZS50cyIsIlR5cGVTY3JpcHRzL0NvcmUvc2FvcC10cmFuc2xhdGUudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3AtdXRpbHMudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3Atdmlldy1mb3JtLnRzIiwiVHlwZVNjcmlwdHMvbWFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQzs7Ozs7Ozs7O0lBRXFCLE07Ozs7Ozs7d0NBSVksTyxFQUFZO0FBQ3RDLGdCQUFJLEtBQUssU0FBVCxFQUFvQixRQUFRLEdBQVIsQ0FBWSxPQUFaO0FBQ3ZCOzs7MERBRTRDO0FBQ3pDLG1CQUFPLG9DQUFQO0FBQ0g7Ozt1REFFeUM7QUFDdEMsZ0JBQUksd0JBQXdCLEtBQTVCO0FBRUEsZ0JBQUkscUJBQXFCLEtBQUssdUJBQUwsQ0FBNkIsT0FBTywrQkFBUCxFQUE3QixDQUF6QjtBQUVBLGdCQUFJLGVBQWUscUJBQW5CO0FBQ0EsZ0JBQUksa0JBQUosRUFBd0I7QUFDcEIsK0JBQWUsdUJBQXVCLE1BQXZCLEdBQWdDLElBQWhDLEdBQXVDLEtBQXREO0FBQ0g7QUFFRCxtQkFBTyxZQUFQO0FBQ0g7Ozt1REFFeUM7QUFDdEMsZ0JBQUksVUFBVSxLQUFLLDRCQUFMLEVBQWQ7QUFDQSxpQkFBSyxzQkFBTCxDQUE0QixPQUFPLCtCQUFQLEVBQTVCLEVBQXNFLENBQUMsT0FBdkU7QUFFQSxxQkFBUyxPQUFULENBQWlCLDhCQUE4QixDQUFDLE9BQWhEO0FBQ0g7Ozt5Q0FFMkI7QUFDeEIsbUJBQU8sRUFBRSxjQUFGLEVBQWtCLEdBQWxCLEVBQVA7QUFDSDs7O3NDQUV3QjtBQUNyQjtBQUNBLGdCQUFJLFFBQVEsSUFBWjtBQUNBLGdCQUFJLFVBQWUsU0FBUyxjQUFULENB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LFFBQUEsV0FBQSxHQUFBLFdBQUE7QUFBOEM7O0lBRWpDLGM7Ozs7Ozs7Ozs7RUFBdUIsZ0JBQUEsWTs7QUFBcEMsUUFBQSxjQUFBLEdBQUEsY0FBQTtBQUFvRDs7SUFFdkMscUI7Ozs7Ozs7Ozs7RUFBOEIsd0JBQUEsbUI7O0FBQTNDLFFBQUEscUJBQUEsR0FBQSxxQkFBQTtBQUFrRTs7SUFFckQsZ0I7Ozs7Ozs7Ozs7RUFBeUIsbUJBQUEsYzs7QUFBdEMsUUFBQSxnQkFBQSxHQUFBLGdCQUFBO0FBQXVEOztJQUUxQyxlOzs7Ozs7Ozs7O0VBQXdCLHNCQUFBLGE7O0FBQXJDLFFBQUEsZUFBQSxHQUFBLGVBQUE7QUFBcUQ7QUFDckQiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIGdsb2JhbCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlYnVnTW9kZTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBzdGF0aWMgc2l0ZUJhc2VVcmw6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbnNvbGVMb2dEZWd1ZyhtZXNzYWdlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Z01vZGUpIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VLZXlWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcIlNhb3BNb2pJbmZvLmdsb2JhbENsaWVudExvZ01vZGVWYWxcIjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGRlYnVnTW9kZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB2YXIgZGVidWdNb2RlU3RyaW5nVmFsID0gdGhpcy5SZWFkVmFyaWFibGVGcm9tU3RvcmFnZShnbG9iYWwuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VLZXlWYWx1ZSgpKTtcclxuXHJcbiAgICAgICAgbGV0IGRlYnVnTW9kZVZhbCA9IGRlYnVnTW9kZURlZmF1bHRWYWx1ZTtcclxuICAgICAgICBpZiAoZGVidWdNb2RlU3RyaW5nVmFsKSB7XHJcbiAgICAgICAgICAgIGRlYnVnTW9kZVZhbCA9IGRlYnVnTW9kZVN0cmluZ1ZhbCA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGVidWdNb2RlVmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpOiB2b2lkIHtcclxuICAgICAgICBsZXQgbG9nTW9kZSA9IHRoaXMuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMuV3JpdGVWYXJpYWJsZVRvU3RvcmFnZShnbG9iYWwuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VLZXlWYWx1ZSgpLCAhbG9nTW9kZSk7XHJcblxyXG4gICAgICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UoXCJDbGllbnQgbG9nIG1vZGUgZW5hYmxlZDogXCIgKyAhbG9nTW9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaXRlQmFzZVVybCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAkKFwiI3NpdGVCYXNlVXJsXCIpLnZhbCgpIGFzIHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldEhlbHBMaW5rKCk6IHZvaWQge1xyXG4gICAgICAgIC8vbmFzdGF2aSBoZWxwIGxpbmssIHYgb2R2aXNub3N0aSBvZCBsb2thbGl6YWNpamVcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBzdmdIZWxwOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2FvcC1oZWxwJyk7XHJcblxyXG4gICAgICAgIGlmKHN2Z0hlbHAgIT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZSA9IHN2Z0hlbHAuZ2V0QXR0cmlidXRlKFwiZGF0YS1sYW5ndWFnZVwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vcG/EjWFrYW1vIGRhIHNlIGduZXN6ZGVuaSBvYmpla3QgbmFsb8W+aVxyXG4gICAgICAgICAgICBzdmdIZWxwLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzdmdIZWxwTGluayA9IHN2Z0hlbHAuY29udGVudERvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2FvcC1oZWxwLWxpbmtcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuaXNVbkRlZmluZWQoc3ZnSGVscExpbmspID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlID09IFwiaHJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdmdIZWxwTGluay5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIFwiaHR0cDovL2hlbHAuc2FvcC5oci9oci9tb2ppbmZvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsYW5ndWFnZSA9PSBcInNyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ZnSGVscExpbmsuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBcImh0dHA6Ly93d3cuc2FvcC5ycy9pY2VudGVyLzEwMC91cHV0c3R2YS16YS11cG90cmVidS9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdmdIZWxwTGluay5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIFwiaHR0cHM6Ly9zaS1pY2VudGVyLmtub3dsZWRnZW93bC5jb20vaGVscC9tb2ppbmZvLW5hdm9kaWxhLXphLXVwb3JhYm8tcHJlbm92bGplbmVnYS1wb3J0YWxhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL3phcmFkaSBicmFza2FsbmlrIC0gbW96aWxsYSBmaXJlZm94IC0gaXpnbGVkYSwgZGEgamUgb2JqZWN0ICcnbG9hZGVkJycgcHJlZGVuIG11IGRvZGFtbyBvbiBsb2FkZWRcclxuICAgICAgICAgICAgaWYoJCgnI3Nhb3AtaGVscC1saW5rJykgIT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2xvYWQnKTtcclxuICAgICAgICAgICAgICAgIHN2Z0hlbHAuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBmb3JtYXREYXRlKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0bzIgPSAobjogbnVtYmVyKTogc3RyaW5nID0+ICgoTWF0aC5hYnMobikgPCAxMCA/ICcwJyA6ICcnKSArIE1hdGguYWJzKG4pKTtcclxuICAgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoL1t5ZG1oXSsvZ2ksIChtYXRjaDogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoIChtYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAneXl5eSc6IHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOiByZXR1cm4gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2RkJzogcmV0dXJuIHRvMihkYXRlLmdldERhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdtJzogcmV0dXJuIChkYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbW0nOiByZXR1cm4gdG8yKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnSCc6IHJldHVybiBkYXRlLmdldEhvdXJzKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0hIJzogcmV0dXJuIHRvMihkYXRlLmdldEhvdXJzKCkpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnTU0nOiByZXR1cm4gdG8yKGRhdGUuZ2V0TWludXRlcygpKTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjb252ZXJ0U3RyaW5nMkRhdGUoc3RyaW5nRGF0ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IERhdGUge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjb252ZXJ0U3RyaW5nMkRhdGVcIik7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkZC5tbS55eXl5XCI6XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF5ID0gc3RyaW5nRGF0ZS5zdWJzdHJpbmcoMCwgMik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbW9udGggPSBzdHJpbmdEYXRlLnN1YnN0cmluZygzLCA1KTtcclxuICAgICAgICAgICAgICAgIGxldCB5ZWFyID0gc3RyaW5nRGF0ZS5zdWJzdHJpbmcoNiwgMTApO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgreWVhciwgK21vbnRoIC0gMSwgK2RheSk7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY29udmVydFN0cmluZzJOdW1iZXIoc3RyaW5nVmFsOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjb252ZXJ0U3RyaW5nMk51bWJlclwiKTtcclxuXHJcbiAgICAgICAgbGV0IG51bWJlclZhbCA9IHBhcnNlSW50KHN0cmluZ1ZhbClcclxuXHJcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlclZhbCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVtYmVyVmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0TW9kYWxGb3JtWkluZGV4KG1vZGFsRm9ybUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2V0TW9kYWxGb3JtWkluZGV4XCIpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtb2RhbEZvcm1JZDpcIiArIG1vZGFsRm9ybUlkKTtcclxuICAgICAgICB2YXIgekluZGV4ID0gMTA1MCArICgxMCAqICQoJy5tb2RhbDp2aXNpYmxlJykubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgJChtb2RhbEZvcm1JZCkuY3NzKCd6LWluZGV4JywgekluZGV4KTtcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJCgnLm1vZGFsLWJhY2tkcm9wJykubm90KCcubW9kYWwtc3RhY2snKS5jc3MoJ3otaW5kZXgnLCB6SW5kZXggLSAxKS5hZGRDbGFzcygnbW9kYWwtc3RhY2snKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzRW1wdHkoc3RyOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gKCFzdHIgfHwgc3RyLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpc1VuRGVmaW5lZChfb2JqOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gKCFfb2JqIHx8IF9vYmogPT09IG51bGwgfHwgdHlwZW9mIF9vYmogPT09IFwidW5kZWZpbmVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgUmVhZFZhcmlhYmxlRnJvbVN0b3JhZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh2YXJpYWJsZU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgV3JpdGVWYXJpYWJsZVRvU3RvcmFnZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZmlsdGVyVGFibGVSb3dzKGZpbHRlclZhbDogc3RyaW5nLCBpZFRhYmxlRWxlbWVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImZpbHRlclRhYmxlUm93c1wiKTtcclxuXHJcbiAgICAgICAgbGV0IHZhbCA9ICQudHJpbShmaWx0ZXJWYWwpLnJlcGxhY2UoLyArL2csICcgJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBsZXQgcm93cyA9ICQoaWRUYWJsZUVsZW1lbnQgKyBcIiB0cjpoYXModGQpXCIpO1xyXG5cclxuICAgICAgICByb3dzLnNob3coKS5maWx0ZXIoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdGV4dCA9ICQodGhpcykudGV4dCgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gIX50ZXh0LmluZGV4T2YodmFsKTtcclxuICAgICAgICB9KS5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBzZXRGaXJzdEZvcm1Db250cm9sVG9Gb2N1cyhmb3JtSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzZXRGaXJzdEZvcm1Db250cm9sVG9Gb2N1c1wiKTtcclxuXHJcbiAgICAgICAgLy8gYnJleiB0aW1lb3V0IGZ1bmtjaWplIGZvY3VzIG5lIGRlbGEgOihcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGZpcnN0Rm9ybUNvbnRyb2wgPSAkKGZvcm1JZCArIFwiIC5mb3JtLWNvbnRyb2w6dmlzaWJsZTpub3QoOmRpc2FibGVkKTpmaXJzdFwiKTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Rm9ybUNvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZWxhdGl2ZVNpdGVVUkwoY29udHJvbGxlcjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgX3VybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgIGxldCBpQyA9IF91cmwuaW5kZXhPZihjb250cm9sbGVyKTtcclxuICAgICAgICBpZiAoaUMgPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdXJsLnN1YnN0cmluZygwLCBpQykgKyBjb250cm9sbGVyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaXRlQWJzb2x1dGVVUkwocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjb250cm9sbGVyID0gcmVsYXRpdmVQYXRoLnNwbGl0KFwiL1wiKVswXTtcclxuICAgICAgICBsZXQgbWV0aG9kID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoY29udHJvbGxlciwgXCJcIikucmVwbGFjZShcIi8vXCIsIFwiXCIpO1xyXG5cclxuICAgICAgICAvLyDEjWUgcmVsYXRpdmUgcGF0aCDFvmUgdnNlYnVqZSBodHRwLCBnYSBuZSBkb2RhbW9cclxuICAgICAgICBpZiAocmVsYXRpdmVQYXRoLmluZGV4T2YoXCJodHRwXCIpID49IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBnbG9iYWwuZ2V0U2l0ZUJhc2VVcmwoKSArIFwiL1wiICsgY29udHJvbGxlciArIG1ldGhvZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlbG9kZUN1cnJlbnRQYWdlKCk6IHZvaWQge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEh0bWxJbnB1dFN0cmluZ1ZhbHVlKHBhcmVudElkOiBzdHJpbmcsIGVsZW1lbnRJZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgZWxlbWVudFNlbGVjdG9yID0gcGFyZW50SWQgPT09IG51bGwgPyBlbGVtZW50SWQgOiBwYXJlbnRJZCArIFwiIFwiICsgZWxlbWVudElkO1xyXG5cclxuICAgICAgICBsZXQgZWxlbWVudCA9ICQoZWxlbWVudFNlbGVjdG9yKVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRIdG1sSW5wdXROdW1lcmljVmFsdWUocGFyZW50SWQ6IHN0cmluZywgZWxlbWVudElkOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5nZXRIdG1sSW5wdXRTdHJpbmdWYWx1ZShwYXJlbnRJZCwgZWxlbWVudElkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRIdG1sSW5wdXRCb29sZWFuVmFsdWUocGFyZW50SWQ6IHN0cmluZywgZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIdG1sSW5wdXRTdHJpbmdWYWx1ZShwYXJlbnRJZCwgZWxlbWVudElkKS50b0xvd2VyQ2FzZSgpID09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SlF1ZXJ5SW5wdXRTdHJpbmdWYWx1ZShlbGVtZW50OiBKUXVlcnk8SFRNTElucHV0RWxlbWVudD4pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChlbGVtZW50LnZhbCgpID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRKUXVlcnlJbnB1dE51bWVyaWNWYWx1ZShlbGVtZW50OiBKUXVlcnk8SFRNTElucHV0RWxlbWVudD4pOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBzdHJWYWwgPSB0aGlzLmdldEpRdWVyeUlucHV0U3RyaW5nVmFsdWUoZWxlbWVudCk7XHJcbiAgICAgICAgaWYgKHN0clZhbCA9PSBudWxsIHx8IHRoaXMuaXNFbXB0eShzdHJWYWwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTnVtYmVyKHN0clZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRKUXVlcnlUZXh0QXJlYVN0cmluZ1ZhbHVlKGVsZW1lbnQ6IEpRdWVyeTxIVE1MVGV4dEFyZWFFbGVtZW50Pik6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQudmFsKCkgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsKCkudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEpRdWVyeVNlbGVjdFZhbHVlKGVsZW1lbnQ6IEpRdWVyeTxIVE1MU2VsZWN0RWxlbWVudD4pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChlbGVtZW50LnZhbCgpID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpc1N0cmluZ1ZhbHVlSW5TdHJpbmdWYWx1ZUxpc3Qoc3RyaW5nVmFsdWU6IHN0cmluZywgc3RyaW5nVmFsdWVMaXN0OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgc3RyaW5nVmFsdWVMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IHN0cmluZ1ZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXRWYWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRKUXVlcnlTZWxlY3RUZXh0KGVsZW1lbnQ6IEpRdWVyeTxIVE1MU2VsZWN0RWxlbWVudD4pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChlbGVtZW50LnZhbCgpID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmZpbmQoXCJvcHRpb246c2VsZWN0ZWRcIikudGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb3B5VG9DbGlwYm9hcmQoY29weVRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvcHlUZXh0KTtcclxuICAgIH1cclxufVxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BDaGVja2JveFN3aXRjaCB7XHJcblxyXG4gICAgaW5pdChwYXJlbnRFbGVtZW50OiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja2JveFN3aXRjaE9uQ2xpY2socGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5zd2l0Y2hMYWJlbE9uQ2xpY2socGFyZW50RWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tib3hTd2l0Y2hPbkNsaWNrKHBhcmVudEVsZW1lbnQ6IHN0cmluZykge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLXN3aXRjaC1jaGVja2JveC4uLlwiKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1zd2l0Y2gtY2hlY2tib3ggcGFyZW50RWxlbWVudDogXCIgKyBwYXJlbnRFbGVtZW50KTtcclxuXHJcbiAgICAgICAgbGV0IF9mcmFtZSA9ICQoXCJcIiArIHBhcmVudEVsZW1lbnQgKyBcIiAqPi5zYW9wLXN3aXRjaC1jaGVja2JveFwiKTtcclxuICAgICAgICBfZnJhbWUub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgX2ZyYW1lLmNsaWNrKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgIGxldCBfY2hlY2tCb3ggPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgIGxldCBfYXRyUGFyZW50ID0gXCIjXCIrJChfY2hlY2tCb3gpLmF0dHIoXCJmb3JcIik7XHJcbiAgICAgICAgICAgIGxldCBfY2hlY2tCb3hQID0gJChcIlwiICsgcGFyZW50RWxlbWVudCArIFwiICo+XCIgKyBfYXRyUGFyZW50KTtcclxuICAgICAgICAgICAgbGV0IF9sYWJlbDEgPSBfY2hlY2tCb3hQLmZpbmQoXCIjc2FvcC1zd2l0Y2gtbGFiZWwxXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2xhYmVsMiA9IF9jaGVja0JveFAuZmluZChcIiNzYW9wLXN3aXRjaC1sYWJlbDJcIik7XHJcbiAgICAgICAgICAgIGlmIChfY2hlY2tCb3guY2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNoZWNrZWRcIik7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwxLnJlbW92ZUNsYXNzKCdzd2l0Y2gtbGFiZWwtb24nKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDEuYWRkQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vZmYnKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDIucmVtb3ZlQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vZmYnKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDIuYWRkQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vbicpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInVuY2hlY2tlZFwiKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDEucmVtb3ZlQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vZmYnKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDEuYWRkQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vbicpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMi5yZW1vdmVDbGFzcygnc3dpdGNoLWxhYmVsLW9uJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwyLmFkZENsYXNzKCdzd2l0Y2gtbGFiZWwtb2ZmJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2hMYWJlbE9uQ2xpY2socGFyZW50RWxlbWVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3Atc3dpdGNoLWxhYmVsLi4uXCIpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLXN3aXRjaC1sYWJlbCBwYXJlbnRFbGVtZW50OiBcIiArIHBhcmVudEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBsZXQgX2ZyYW1lID0gJChcIlwiICsgcGFyZW50RWxlbWVudCArIFwiICo+LnNhb3Atc3dpdGNoLWxhYmVsXCIpO1xyXG4gICAgICAgIF9mcmFtZS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICBfZnJhbWUuY2xpY2soZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgbGV0IF9zd2l0Y2hMYWJlbCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgbGV0IF9hdHJDaGVja0JveCA9IFwiI1wiKyQoX3N3aXRjaExhYmVsKS5hdHRyKFwiZm9yXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2NoZWNrQm94ID0gJChfYXRyQ2hlY2tCb3gpO1xyXG4gICAgICAgICAgICAkKF9jaGVja0JveCkucHJvcCggJ2NoZWNrZWQnLCAnZmxhc2UnKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wRmxvYXRpbmdMYWJlbCB7XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sOm5vdChbcmVhZG9ubHk9XCJyZWFkb25seVwiXSknKS5vZmYoXCJmb2N1c1wiLF90aGlzLnNhb3BJbnB1dE9uRm9jdXMpO1xyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sOm5vdChbcmVhZG9ubHk9XCJyZWFkb25seVwiXSknKS5vbihcImZvY3VzXCIsX3RoaXMuc2FvcElucHV0T25Gb2N1cyk7XHJcblxyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sJykub2ZmKFwiYmx1clwiLF90aGlzLnNhb3BJbnB1dE9uQmx1cik7XHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vbihcImJsdXJcIixfdGhpcy5zYW9wSW5wdXRPbkJsdXIpO1xyXG4gICAgXHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vZmYoXCJmb2N1c291dFwiLF90aGlzLnNhb3BJbnB1dE9uQ2hhbmdlKTtcclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbCcpLm9uKFwiZm9jdXNvdXRcIixfdGhpcy5zYW9wSW5wdXRPbkNoYW5nZSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHNhb3BJbnB1dE9uQ2hhbmdlKGU6YW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3AtZmxvYXRpbmctbGFiZWwuLi5zYW9wSW5wdXRPbkNoYW5nZVwiKTtcclxuICAgICAgICBsZXQgaHRtbEVsZW1lbnQgPSBlLnRhcmdldDtcclxuICAgICAgICBsZXQgX25vZGUgPSAkKFwiI1wiK2h0bWxFbGVtZW50LmlkKTtcclxuICAgICAgICBpZiAoX25vZGUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGxldCBfcGFyZW50TiA9IF9ub2RlLnBhcmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoX3BhcmVudE4ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICBfcGFyZW50Ti5yZW1vdmVDbGFzcyhcInNhb3AtZXJyb3ItaW5wdXRcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2xhYmVsID0gX3BhcmVudE4uZmluZChcIi50ZXh0LWRhbmdlclwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChfbGFiZWwubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgX2xhYmVsLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSAgICBcclxuXHJcbiAgICBzYW9wSW5wdXRPbkZvY3VzKGU6YW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3AtZmxvYXRpbmctbGFiZWwuLi5cIik7XHJcbiAgICAgICAgLy9iYXJ2YW5qZSBcImZsb2F0aW5nIGxhYmVsXCJcclxuICAgICAgICBsZXQgaHRtbEVsZW1lbnQgPSBlLnRhcmdldDtcclxuICAgICAgICBodG1sRWxlbWVudC5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zYW9wLWZsb2F0aW5nLWxhYmVsJykuY2xhc3NMaXN0LmFkZChcInNhb3AtdHh0LXByaW1hcnlcIik7XHJcbiAgICB9XHJcbiAgICAgICAgXHJcbiAgICBzYW9wSW5wdXRPbkJsdXIoZTphbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1mbG9hdGluZy1sYWJlbC4uLlwiKTtcclxuICAgICAgICAvL2JhcnZhbmplIFwiZmxvYXRpbmcgbGFiZWxcIiBvbiBpbnB1dCBibHVyIChmb2N1cyBsb3N0KSBuYXphaiB2IHNpdm8gKHJlbW92ZSByYXpyZWQgXCJzYW9wLXR4dC1wcmltYXJ5XCIpXHJcbiAgICAgICAgbGV0IGh0bWxFbGVtZW50ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2FvcC1mbG9hdGluZy1sYWJlbCcpLmNsYXNzTGlzdC5yZW1vdmUoXCJzYW9wLXR4dC1wcmltYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzZXRDYXB0aW9uQXNSZXF1aXJlZChsYWJlbElkOnN0cmluZyxyZXF1aXJlZDpib29sZWFuKTp2b2lke1xyXG4gICAgICAgIGxldCBfZWxlbWVudCA9ICQobGFiZWxJZCk7XHJcbiAgICAgICAgbGV0IF9lbGVtZW50VmFsID0gX2VsZW1lbnQudGV4dCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgX2VsZW1lbnRWYWwgPSBfZWxlbWVudFZhbC5yZXBsYWNlKFwiKlwiLFwiXCIpO1xyXG4gICAgICAgIGlmIChyZXF1aXJlZCkge1xyXG4gICAgICAgICAgICBfZWxlbWVudC50ZXh0KF9lbGVtZW50VmFsK1wiKlwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfZWxlbWVudC50ZXh0KF9lbGVtZW50VmFsKTtcclxuICAgICAgICB9XHJcbiAgICB9ICBcclxuXHJcbiAgICAvL1xyXG59Iiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9kYXRhLXRhYmxlcy90eXBlcy5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuY2xhc3Mgc2VsZWN0SXRlbSB7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5jbGFzcyBFZGl0YWJsZUNvbHVtbkRhdGEge1xyXG4gICAgdGlwOiBzdHJpbmc7XHJcbiAgICBzZWxlY3RJdGVtczogc2VsZWN0SXRlbVtdO1xyXG4gICAgbnVtZXJpY01pblZhbHVlOiBudW1iZXI7XHJcbiAgICBudW1lcmljTWF4VmFsdWU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BXZWJHcmlkRWRpdCB7XHJcbiAgICBwdWJsaWMgbGliTmFtZTogc3RyaW5nOyAgXHJcblxyXG4gICAgcHJpdmF0ZSBfRWRpdGFibGVDb2x1bW5EYXRhOiBFZGl0YWJsZUNvbHVtbkRhdGE7XHJcbiAgICBwcml2YXRlIF90ZEVsZW1lbnQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICB9ICBcclxuXHJcbiAgICBzaG93V2ViR3JpZEVkaXRhYmxlQ29sdW1uRWRpdENvbnRyb2wodGRFbGVtZW50OiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuc2hvd1dlYkdyaWRFZGl0YWJsZUNvbHVtbkVkaXRDb250cm9sXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl90ZEVsZW1lbnQgPSB0ZEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHRkRWxlbWVudEh0bWwgPSB0aGlzLl90ZEVsZW1lbnQuaW5uZXJIVE1MO1xyXG5cclxuICAgICAgICBpZiAodGRFbGVtZW50SHRtbC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyXCIpID49IDApIHtcclxuICAgICAgICAgICAgLy8gZWRpdCBrb250cm9sYSB6ZSBvYnN0YWphXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX0VkaXRhYmxlQ29sdW1uRGF0YSA9IHRoaXMuZ2V0RGF0YUF0dHJpYnV0ZSh0aGlzLl90ZEVsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLkFkZEVkaXRhYmxlQ29sdW1uRWRpdEh0bWwodGhpcy5fRWRpdGFibGVDb2x1bW5EYXRhLnRpcCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Xcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZSh0ZEVsZW1lbnQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5vbldyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IEVkaXRhYmxlQ29sdW1uRGF0YSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5nZXREYXRhQXR0cmlidXRlXCIpO1xyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IG5ldyBFZGl0YWJsZUNvbHVtbkRhdGEoKTtcclxuXHJcbiAgICAgICAgZGF0YS50aXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZWRpdC10eXBlXCIpO1xyXG4gICAgICAgIGRhdGEuc2VsZWN0SXRlbXMgPSAkLnBhcnNlSlNPTihlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZWRpdC1zZWxlY3QtaXRlbXNcIikpO1xyXG4gICAgICAgIGRhdGEubnVtZXJpY01pblZhbHVlID0gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXQtbnVtYmVyLW1pblwiKSk7XHJcbiAgICAgICAgZGF0YS5udW1lcmljTWF4VmFsdWUgPSBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZWRpdC1udW1iZXItbWF4XCIpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBBZGRFZGl0YWJsZUNvbHVtbkVkaXRIdG1sKHRpcDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5BZGRFZGl0YWJsZUNvbHVtbkVkaXRIdG1sXCIpO1xyXG5cclxuICAgICAgICBsZXQgdGRFbGVtZW50VGV4dCA9IHRoaXMuX3RkRWxlbWVudC5pbm5lclRleHQ7XHJcblxyXG4gICAgICAgIGxldCBpbnB1dCA9IHRoaXMuZ2V0SW5wdXRFbGVtZW50KHRpcCwgdGRFbGVtZW50VGV4dCk7XHJcblxyXG4gICAgICAgIGxldCBjb250YWluZXJDZWxsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgY29udGFpbmVyQ2VsbERpdi5jbGFzc0xpc3QuYWRkKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lci1jZWxsXCIpO1xyXG4gICAgICAgIGNvbnRhaW5lckNlbGxEaXYuYXBwZW5kQ2hpbGQoaW5wdXQpO1xyXG5cclxuICAgICAgICBsZXQgY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgY29udGFpbmVyRGl2LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChjb250YWluZXJDZWxsRGl2KTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGRFbGVtZW50LmlubmVySFRNTCA9IGNvbnRhaW5lckRpdi5vdXRlckhUTUw7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0SW5wdXRFbGVtZW50QWZ0ZXJJbml0KHRpcCwgdGRFbGVtZW50VGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJbnB1dEVsZW1lbnQodGlwOiBzdHJpbmcsIGlucHV0VmFsdWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LmdldElucHV0RWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGlucHV0OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgc3dpdGNoICh0aXApIHtcclxuICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5nZW5lcmF0ZVRleHRIdG1sKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInRleHRhcmVhXCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMuZ2VuZXJhdGVUZXh0YXJlYUh0bWwoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwic2VsZWN0XCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMuZ2VuZXJhdGVTZWxlY3RIdG1sKGlucHV0VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5nZW5lcmF0ZU51bWJlckh0bWwoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0aGlzLmdlbmVyYXRlVGV4dEh0bWwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlVGV4dEh0bWwoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuZ2VuZXJhdGVUZXh0SHRtbFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGlucHV0OiBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICAgICAgICBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgICAgaW5wdXQudHlwZSA9IFwidGV4dFwiO1xyXG4gICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyLWNlbGwtaW5wdXRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlVGV4dGFyZWFIdG1sKCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LmdlbmVyYXRlVGV4dGFyZWFIdG1sXCIpO1xyXG5cclxuICAgICAgICBsZXQgaW5wdXQ6IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcclxuICAgICAgICBpbnB1dC5jbGFzc0xpc3QuYWRkKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lci1jZWxsLWlucHV0XCIpO1xyXG4gICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyLWNlbGwtaW5wdXQtdGV4dGFyZWFcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH0gXHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVNlbGVjdEh0bWwoc2VsZWN0VmFsdWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LmdlbmVyYXRlU2VsZWN0SHRtbFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGlucHV0OiBIVE1MU2VsZWN0RWxlbWVudDtcclxuXHJcbiAgICAgICAgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xyXG4gICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyLWNlbGwtaW5wdXRcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX0VkaXRhYmxlQ29sdW1uRGF0YS5zZWxlY3RJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlucHV0Lm9wdGlvbnMuYWRkKG5ldyBPcHRpb24oaXRlbS50ZXh0LCBpdGVtLnZhbHVlLCBzZWxlY3RWYWx1ZSA9PT0gaXRlbS52YWx1ZSkpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZU51bWJlckh0bWwoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuZ2VuZXJhdGVOdW1iZXJIdG1sXCIpO1xyXG5cclxuICAgICAgICBsZXQgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgICBpbnB1dC50eXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgICBpZiAodGhpcy5fRWRpdGFibGVDb2x1bW5EYXRhLm51bWVyaWNNaW5WYWx1ZSkge1xyXG4gICAgICAgICAgICBpbnB1dC5taW4gPSB0aGlzLl9FZGl0YWJsZUNvbHVtbkRhdGEubnVtZXJpY01pblZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9FZGl0YWJsZUNvbHVtbkRhdGEubnVtZXJpY01heFZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlucHV0Lm1heCA9IHRoaXMuX0VkaXRhYmxlQ29sdW1uRGF0YS5udW1lcmljTWF4VmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXItY2VsbC1pbnB1dFwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0SW5wdXRFbGVtZW50QWZ0ZXJJbml0KHRpcDogc3RyaW5nLCB0ZEVsZW1lbnRUZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LnNldElucHV0RWxlbWVudEFmdGVySW5pdFwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRpcCA9PT0gXCJ0ZXh0XCIpIHtcclxuICAgICAgICAgICAgbGV0IHRkRWxlbWVudElucHV0ID0gdGhpcy5fdGRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIilbMF07XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LnZhbHVlID0gdGRFbGVtZW50VGV4dDtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQuZm9jdXMoKTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQub25ibHVyID0gdGhpcy53cml0ZUlucHV0VmFsdWVUb1RERWxlbWVudC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aXAgPT09IFwidGV4dGFyZWFcIikge1xyXG4gICAgICAgICAgICBsZXQgdGRFbGVtZW50SW5wdXQgPSB0aGlzLl90ZEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZXh0YXJlYVwiKVswXTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQudmFsdWUgPSB0ZEVsZW1lbnRUZXh0O1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5mb2N1cygpO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5vbmJsdXIgPSB0aGlzLndyaXRlVGV4dEFyZWFWYWx1ZVRvVERFbGVtZW50LmJpbmQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRpcCA9PT0gXCJzZWxlY3RcIikge1xyXG4gICAgICAgICAgICBsZXQgdGRFbGVtZW50SW5wdXQgPSB0aGlzLl90ZEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzZWxlY3RcIilbMF07XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0Lm9uYmx1ciA9IHRoaXMud3JpdGVTZWxlY3RWYWx1ZVRvVERFbGVtZW50LmJpbmQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRpcCA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICBsZXQgdGRFbGVtZW50SW5wdXQgPSB0aGlzLl90ZEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKVswXTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQudmFsdWUgPSB0ZEVsZW1lbnRUZXh0O1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5mb2N1cygpO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5vbmJsdXIgPSB0aGlzLndyaXRlTnVtYmVyVmFsdWVUb1RERWxlbWVudC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRkRWxlbWVudElucHV0ID0gdGhpcy5fdGRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIilbMF07XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LnZhbHVlID0gdGRFbGVtZW50VGV4dDtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQuZm9jdXMoKTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQub25ibHVyID0gdGhpcy53cml0ZUlucHV0VmFsdWVUb1RERWxlbWVudC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHdyaXRlVmFsdWVUb1RERWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgaW5wdXRWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQud3JpdGVWYWx1ZVRvVERFbGVtZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgdGVtcEVsZW1lbnQgPSBlbGVtZW50O1xyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBwYXJlbnQgZWxlbWVudCwga2kgaW1hIGNsYXNzIHNhb3AtdGFibGUtZWRpdC1jb250YWluZXIuIE5qZWdvdiBwYXJlbnQgamUgVEQgZWxlbWVudC5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRlbXBFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXJcIikpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZEVsZW1lbnQgPSB0ZW1wRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgdGRFbGVtZW50LmlubmVySFRNTCA9IGlucHV0VmFsO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub25Xcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZSh0aGlzLl90ZEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGVtcEVsZW1lbnQgPSB0ZW1wRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHdyaXRlSW5wdXRWYWx1ZVRvVERFbGVtZW50KHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC53cml0ZUlucHV0VmFsdWVUb1RERWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHRhcmdldDogSFRNTElucHV0RWxlbWVudCA9IHNlbmRlci50YXJnZXQ7XHJcbiAgICAgICAgbGV0IGlucHV0VmFsID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBwYXJlbnQsIGtpIGplIFREIGVsZW1lbnQgaW4gdiBpbm5lcmh0bWwgdnBpc2VtbyB0ZXh0IHZhbHVlXHJcbiAgICAgICAgbGV0IHBhcmVudCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZVRvVERFbGVtZW50KHBhcmVudCwgaW5wdXRWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd3JpdGVUZXh0QXJlYVZhbHVlVG9UREVsZW1lbnQoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LndyaXRlVGV4dEFyZWFWYWx1ZVRvVERFbGVtZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgdGFyZ2V0OiBIVE1MVGV4dEFyZWFFbGVtZW50ID0gc2VuZGVyLnRhcmdldDtcclxuICAgICAgICBsZXQgaW5wdXRWYWwgPSB0YXJnZXQudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHBhcmVudCwga2kgamUgVEQgZWxlbWVudCBpbiB2IGlubmVyIGh0bWwgdnBpc2VtbyB0ZXh0IHZhbHVlXHJcbiAgICAgICAgbGV0IHBhcmVudCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZVRvVERFbGVtZW50KHBhcmVudCwgaW5wdXRWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd3JpdGVTZWxlY3RWYWx1ZVRvVERFbGVtZW50KHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC53cml0ZVNlbGVjdFZhbHVlVG9UREVsZW1lbnRcIik7XHJcblxyXG4gICAgICAgIGxldCB0YXJnZXQ6IEhUTUxTZWxlY3RFbGVtZW50ID0gc2VuZGVyLnRhcmdldDtcclxuICAgICAgICBsZXQgaW5wdXRWYWwgPSB0YXJnZXQudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHBhcmVudCwga2kgamUgVEQgZWxlbWVudCBpbiB2IGlubmVyIGh0bWwgdnBpc2VtbyB0ZXh0IHZhbHVlXHJcbiAgICAgICAgbGV0IHBhcmVudCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZVRvVERFbGVtZW50KHBhcmVudCwgaW5wdXRWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd3JpdGVOdW1iZXJWYWx1ZVRvVERFbGVtZW50KHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC53cml0ZU51bWJlclZhbHVlVG9UREVsZW1lbnRcIik7XHJcblxyXG4gICAgICAgIGxldCB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBzZW5kZXIudGFyZ2V0O1xyXG4gICAgICAgIGxldCBpbnB1dFZhbCA9IHRhcmdldC52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50LCBraSBqZSBURCBlbGVtZW50IGluIHYgaW5uZXIgaHRtbCB2cGlzZW1vIHRleHQgdmFsdWVcclxuICAgICAgICBsZXQgcGFyZW50ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlVG9UREVsZW1lbnQocGFyZW50LCBpbnB1dFZhbCk7XHJcbiAgICB9XHJcbiAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2RhdGEtdGFibGVzL3R5cGVzLmQudHNcIiAvPlxyXG5pbXBvcnQgeyBTYW9wSW5wdXRXRkwsU2FvcElucHV0V0ZMUHJvcGVydGllcyB9IGZyb20gJy4vc2FvcC1pbnB1dC13ZmwnXHJcbmltcG9ydCB7IFNhb3BzZWxlY3RXRkwgfSBmcm9tICcuL3Nhb3Atc2VsZWN0LXdmbCdcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wV2ViR3JpZEZpbHRlciB7XHJcbiAgcHVibGljIGlkOnN0cmluZyA9IFwid2dmMVwiO1xyXG4gIHB1YmxpYyBtb2RhbEZpbHRlckFycmF5OiBhbnkgPSBbXTtcclxuICAvL1RoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGNvbnRlbnQgaW5zaWRlIHRoZSBmaWx0ZXIgbW9kYWxcclxuICBjb25maWdGaWx0ZXIobGliTmFtZTpzdHJpbmcsaHRtbFRhYmxlOiBhbnksIGNvbEFycmF5OiBhbnkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHRhYmxlTmFtZSA9IGh0bWxUYWJsZVswXS5pZDtcclxuICAgICAgdmFyIGNvbHVtbnMgPSBodG1sVGFibGUuYXBpKCkuY29sdW1ucygpO1xyXG4gICAgICAkLmVhY2goY29sQXJyYXksIGZ1bmN0aW9uIChpLCBhcmcpIHtcclxuICAgICAgICBsZXQgX2NvbE5vID0gYXJnLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgJCgnIycgKyB0YWJsZU5hbWUgKyAnIHRoOmVxKCcgKyBfY29sTm8gKyAnKScpLmF0dHIoXCJpZFwiLFwiY29sdW1uLWhlYWRlci1cIisgX2NvbE5vICtcIlwiKTtcclxuICAgICAgICAkKCcjJyArIHRhYmxlTmFtZSArICcgdGg6ZXEoJyArIF9jb2xObyArICcpJykuYXBwZW5kKCc8c3BhbiBpZD1cImNvbHVtbi1oZWFkZXItJysgX2NvbE5vICsnLWZpbHRlclwiIGNsYXNzPVwic2FvcC1pbWctZmlsdGVyIHNpLXhzXCIgb25jbGljaz1cIicrbGliTmFtZSsnLndlYkdyaWRGaWx0ZXIuc2hvd0ZpbHRlcihldmVudCxcXCcnICsgdGFibGVOYW1lICsgJ18nICsgX2NvbE5vICsgJ1xcJyk7XCI+PC9zcGFuPicpO1xyXG4gICAgICAgICQoJyMnICsgdGFibGVOYW1lICsgJyB0aDplcSgnICsgX2NvbE5vICsgJyknKS5hcHBlbmQoXCI8c3BhbiBpZD0nY29sdW1uLWhlYWRlci1cIisgX2NvbE5vICtcIi1zb3J0JyBjbGFzcz0nJz4mbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+XCIpO1xyXG4gICAgICAgICQoJyMnICsgdGFibGVOYW1lICsgJyB0aDplcSgnICsgX2NvbE5vICsgJyknKS5hcHBlbmQoXCI8ZGl2IGlkPSdjb2x1bW4taGVhZGVyLVwiKyBfY29sTm8gK1wiLXNpemVyJz5cIik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdmFyIHRlbXBsYXRlID1cclxuICAgICAgICAnPGRpdiBjbGFzcz1cIm1vZGFsRmlsdGVyXCI+JyArXHJcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+JyArXHJcbiAgICAgICAgJ3swfTwvZGl2PicgK1xyXG4gICAgICAgICc8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+JyArXHJcbiAgICAgICAgJzxhIGhyZWY9XCIjIVwiIG9uY2xpY2s9XCInK2xpYk5hbWUrJy53ZWJHcmlkRmlsdGVyLnBlcmZvcm1GaWx0ZXIodGhpcywgezF9LCBcXCd7Mn1cXCcpO1wiICBjbGFzcz1cIiBidG4gcmlnaHQgd2F2ZXMtZWZmZWN0IHdhdmVzLWxpZ2h0XCI+ViByZWR1PC9hPicgKyAgICAgICAgXHJcbiAgICAgICAgJzxhIGhyZWY9XCIjIVwiIG9uY2xpY2s9XCInK2xpYk5hbWUrJy53ZWJHcmlkRmlsdGVyLmNsZWFyRmlsdGVyKHRoaXMsIHsxfSwgXFwnezJ9XFwnKTtcIiAgY2xhc3M9XCIgYnRuIGxlZnQgd2F2ZXMtZWZmZWN0IHdhdmVzLWxpZ2h0XCI+WmJyacWhaTwvYT4nICtcclxuICAgICAgICAnPGEgaHJlZj1cIiMhXCIgb25jbGljaz1cIicrbGliTmFtZSsnLndlYkdyaWRGaWx0ZXIuaGlkZUZpbHRlcigpO1wiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgY2xhc3M9XCIgYnRuIGxlZnQgd2F2ZXMtZWZmZWN0IHdhdmVzLWxpZ2h0XCI+UHJla2xpxI1pPC9hPicgK1xyXG4gICAgICAgICc8L2Rpdj4nICtcclxuICAgICAgICAnPC9kaXY+JztcclxuXHJcbiAgICAgICQuZWFjaChjb2xBcnJheSwgZnVuY3Rpb24gKGluZGV4OiBhbnksIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBjb2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChpOiBhbnkpIHtcclxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gaSkge1xyXG4gICAgICAgICAgICB2YXIgY29sdW1uID0gdGhpcywgXHJcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnJzsvLyc8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZpbHRlclNlYXJjaFRleHRcIiBvbmtleXVwPVwiZmlsdGVyVmFsdWVzKHRoaXMpXCIgLz4gPGJyLz4nO1xyXG4gICAgICAgICAgICB2YXIgY29sdW1uTmFtZSA9ICQodGhpcy5oZWFkZXIoKSkudGV4dCgpLnJlcGxhY2UoL1xccysvZywgXCJfXCIpO1xyXG4gICAgICAgICAgICB2YXIgZGlzdGluY3RBcnJheTogYW55W10gPSBbXTtcclxuICAgICAgICAgICAgY29sdW1uLmRhdGEoKS5lYWNoKGZ1bmN0aW9uIChkOiBzdHJpbmcsIGo6IGFueSkge1xyXG4gICAgICAgICAgICAgIGlmIChkaXN0aW5jdEFycmF5LmluZGV4T2YoZCkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpZCA9IHRhYmxlTmFtZSArIFwiX1wiICsgY29sdW1uTmFtZSArIFwiX1wiICsgajsgLy8gb25jaGFuZ2U9XCJmb3JtYXRWYWx1ZXModGhpcywnICsgdmFsdWUgKyAnKTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gJzxkaXY+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwiJyArIGQgKyAnXCIgIGlkPVwiJyArIGlkICsgJ1wiLz48bGFiZWwgZm9yPVwiJyArIGlkICsgJ1wiPiAnICsgZCArICc8L2xhYmVsPjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICBkaXN0aW5jdEFycmF5LnB1c2goZCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTsgXHJcbiAgICAgICAgICAgIHZhciBuZXdUZW1wbGF0ZSA9ICQodGVtcGxhdGUucmVwbGFjZSgnezB9JywgY29udGVudCkucmVwbGFjZSgnezF9JywgdmFsdWUpLnJlcGxhY2UoJ3sxfScsIHZhbHVlKS5yZXBsYWNlKCd7Mn0nLCB0YWJsZU5hbWUpLnJlcGxhY2UoJ3syfScsIHRhYmxlTmFtZSkpO1xyXG4gICAgICAgICAgICAkKCdib2R5JykuYXBwZW5kKG5ld1RlbXBsYXRlKTtcclxuICAgICAgICAgICAgX3RoaXMubW9kYWxGaWx0ZXJBcnJheVt0YWJsZU5hbWUgKyBcIl9cIiArIHZhbHVlXSA9IG5ld1RlbXBsYXRlO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgNTApO1xyXG5cclxuICB9XHJcblxyXG5cclxuICAvL1VzZXIgdG8gc2hvdyB0aGUgZmlsdGVyIG1vZGFsXHJcbiAgc2hvd0ZpbHRlcihlOiBhbnksIGluZGV4OiBhbnkpIHtcclxuICAgICQoJy5tb2RhbEZpbHRlcicpLmhpZGUoKTtcclxuICAgICQodGhpcy5tb2RhbEZpbHRlckFycmF5W2luZGV4XSkuY3NzKHsgbGVmdDogMCwgdG9wOiAwIH0pO1xyXG4gICAgdmFyIHRoID0gJChlLnRhcmdldCkucGFyZW50KCk7XHJcbiAgICB2YXIgcG9zID0gdGgub2Zmc2V0KCk7XHJcbiAgICBsZXQgYXJyYXlJdGVtID0gdGhpcy5tb2RhbEZpbHRlckFycmF5W2luZGV4XTtcclxuICAgIC8vJCh0aGlzLm1vZGFsRmlsdGVyQXJyYXlbaW5kZXhdKS53aWR0aCh0aC53aWR0aCgpICogMC43NSk7XHJcbiAgICAkKGFycmF5SXRlbSkuY3NzKHsgJ2xlZnQnOiBwb3MubGVmdCwgJ3RvcCc6IHBvcy50b3AsICdtaW4td2lkdGgnOih0aC53aWR0aCgpICogMC43NSkgfSk7XHJcbiAgICAkKGFycmF5SXRlbSkuc2hvdygpO1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRhYmxlSGVhZGVyU3RhdHVzKHRhYmxlSWQ6c3RyaW5nLGNvbHVtbklkOnN0cmluZyxhY3RpdmVGaWx0ZXI6Ym9vbGVhbil7XHJcbiAgICBsZXQgX2NvbEZpbHRlcklkID0gY29sdW1uSWQrXCItZmlsdGVyXCI7XHJcbiAgICBsZXQgX2NvbEZpbHRlciA9ICQodGFibGVJZCkuZmluZChfY29sRmlsdGVySWQpWzBdO1xyXG4gICAgbGV0IF9jb2xGaWx0ZXJBdHIgPSBfY29sRmlsdGVyLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO1xyXG4gICAgaWYoYWN0aXZlRmlsdGVyKXtcclxuICAgICAgICBfY29sRmlsdGVyQXRyLnJlcGxhY2UoXCJzYW9wLWltZy1maWx0ZXJcIiwgXCJzYW9wLWltZy1maWx0ZXIgc2FvcC1jbC1ibHVlXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBfY29sRmlsdGVyQXRyLnJlcGxhY2UoXCJzYW9wLWltZy1maWx0ZXIgc2FvcC1jbC1ibHVlXCIsIFwic2FvcC1pbWctZmlsdGVyXCIpO1xyXG4gICBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vVGhpcyBmdW5jdGlvbiBpcyB0byB1c2UgdGhlIHNlYXJjaGJveCB0byBmaWx0ZXIgdGhlIGNoZWNrYm94XHJcbiAgZmlsdGVyVmFsdWVzKG5vZGU6IGFueSkge1xyXG4gICAgdmFyIHNlYXJjaFN0cmluZyA9ICQobm9kZSkudmFsKCkudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLnRyaW0oKTtcclxuICAgIHZhciByb290Tm9kZSA9ICQobm9kZSkucGFyZW50KCk7XHJcbiAgICBpZiAoc2VhcmNoU3RyaW5nID09ICcnKSB7XHJcbiAgICAgIHJvb3ROb2RlLmZpbmQoJ2RpdicpLnNob3coKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJvb3ROb2RlLmZpbmQoXCJkaXZcIikuaGlkZSgpO1xyXG4gICAgICByb290Tm9kZS5maW5kKFwiZGl2OmNvbnRhaW5zKCdcIiArIHNlYXJjaFN0cmluZyArIFwiJylcIikuc2hvdygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9FeGVjdXRlIHRoZSBmaWx0ZXIgb24gdGhlIHRhYmxlIGZvciBhIGdpdmVuIGNvbHVtblxyXG4gIHBlcmZvcm1GaWx0ZXIobm9kZTogYW55LCBpOiBhbnksIHRhYmxlSWQ6IGFueSkge1xyXG4gICAgdmFyIHJvb3ROb2RlID0gJChub2RlKS5wYXJlbnQoKS5wYXJlbnQoKTtcclxuICAgIHZhciBzZWFyY2hTdHJpbmcgPSAnJywgY291bnRlciA9IDA7XHJcblxyXG4gICAgcm9vdE5vZGUuZmluZCgnaW5wdXQ6Y2hlY2tib3gnKS5lYWNoKGZ1bmN0aW9uIChpbmRleDogYW55LCBjaGVja2JveDogYW55KSB7XHJcbiAgICAgIGlmIChjaGVja2JveC5jaGVja2VkKSB7XHJcbiAgICAgICAgc2VhcmNoU3RyaW5nICs9IChjb3VudGVyID09IDApID8gY2hlY2tib3gudmFsdWUgOiAnfCcgKyBjaGVja2JveC52YWx1ZTtcclxuICAgICAgICBjb3VudGVyKys7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBfY29sSWQgPSBcIiNjb2x1bW4taGVhZGVyLVwiK2kudG9TdHJpbmcoKTtcclxuICAgIGlmKGNvdW50ZXIgPiAwKXtcclxuICAgICAgdGhpcy51cGRhdGVUYWJsZUhlYWRlclN0YXR1cygnIycgK3RhYmxlSWQsX2NvbElkLHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51cGRhdGVUYWJsZUhlYWRlclN0YXR1cygnIycgK3RhYmxlSWQsX2NvbElkLGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAkKCcjJyArIHRhYmxlSWQpLkRhdGFUYWJsZSgpLmNvbHVtbihpKS5zZWFyY2goXHJcbiAgICAgIHNlYXJjaFN0cmluZyxcclxuICAgICAgdHJ1ZSwgZmFsc2VcclxuICAgICkuZHJhdygpO1xyXG4gICAgcm9vdE5vZGUuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgLy9SZW1vdmVzIHRoZSBmaWx0ZXIgZnJvbSB0aGUgdGFibGUgZm9yIGEgZ2l2ZW4gY29sdW1uXHJcbiAgY2xlYXJGaWx0ZXIobm9kZTogYW55LCBpOiBhbnksIHRhYmxlSWQ6IGFueSkge1xyXG4gICAgdmFyIHJvb3ROb2RlID0gJChub2RlKS5wYXJlbnQoKS5wYXJlbnQoKTtcclxuICAgIHJvb3ROb2RlLmZpbmQoXCIuZmlsdGVyU2VhcmNoVGV4dFwiKS52YWwoJycpO1xyXG4gICAgcm9vdE5vZGUuZmluZCgnaW5wdXQ6Y2hlY2tib3gnKS5lYWNoKGZ1bmN0aW9uIChpbmRleDogYW55LCBjaGVja2JveDogYW55KSB7XHJcbiAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgJChjaGVja2JveCkucGFyZW50KCkuc2hvdygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IF9jb2xJZCA9IFwiI2NvbHVtbi1oZWFkZXItXCIraS50b1N0cmluZygpO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZUhlYWRlclN0YXR1cygnIycgK3RhYmxlSWQsX2NvbElkLGZhbHNlKTtcclxuXHJcbiAgICAkKCcjJyArIHRhYmxlSWQpLkRhdGFUYWJsZSgpLmNvbHVtbihpKS5zZWFyY2goXHJcbiAgICAgICcnLFxyXG4gICAgICB0cnVlLCBmYWxzZVxyXG4gICAgKS5kcmF3KCk7XHJcbiAgICByb290Tm9kZS5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICBoaWRlRmlsdGVyKG5vZGU6IGFueSwgaTogYW55LCB0YWJsZUlkOiBhbnkpIHtcclxuICAgICQoJy5tb2RhbEZpbHRlcicpLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIHNldFJlc2l6ZUV2ZW50KGdyaWRJZDpzdHJpbmcpe1xyXG4gICAgdmFyIF90YWJsZURpdiA9ICQoXCJ0YWJsZVwiK2dyaWRJZCtcIiB0aFwiKSBhcyBhbnk7XHJcblx0ICB2YXIgdGhIZWlnaHQgPSAkKFwidGFibGVcIitncmlkSWQrXCIgdGg6Zmlyc3RcIikuaGVpZ2h0KCk7XHJcblx0ICBfdGFibGVEaXYucmVzaXphYmxlKHtcclxuXHRcdCAgaGFuZGxlczogXCJlXCIsXHJcblx0XHQgIG1pbkhlaWdodDogdGhIZWlnaHQsXHJcblx0XHQgIG1heEhlaWdodDogdGhIZWlnaHQsXHJcblx0XHQgIG1pbldpZHRoOiA0MCxcclxuXHRcdCAgcmVzaXplOiBmdW5jdGlvbiAoZXZlbnQ6YW55LCB1aTphbnkpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInJlc2l6ZS4uLlwiKTtcclxuICAgICAgICB2YXIgc2l6ZXJpZCA9IFwiI1wiICsgJChldmVudC50YXJnZXQpLmF0dHIoXCJpZFwiKSArIFwiLXNpemVyXCI7XHJcbiAgICAgICAgJChzaXplcmlkKS53aWR0aCh1aS5zaXplLndpZHRoKTtcclxuXHRcdCAgfVxyXG5cdCAgfSk7ICAgIFxyXG4gIH1cclxuXHJcbiAgc2V0U29ydEVsZW1lbnRFdmVudChncmlkSWQ6IHN0cmluZyk6dm9pZHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAkKGdyaWRJZCkub24oJ2NsaWNrJywgJ3RoJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICBfdGhpcy5zZXRTb3J0RWxlbWVudChncmlkSWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIHNldFNvcnRFbGVtZW50KGdyaWRJZDogc3RyaW5nKTp2b2lkIHtcclxuICAgICAgJChcIlwiICsgZ3JpZElkICsgXCIgdGhlYWQ6Zmlyc3QgdGhcIikuZWFjaChmdW5jdGlvbiAoaSwgdGgpIHtcclxuICAgICAgICBsZXQgX2NvbCA9ICQodGgpO1xyXG4gICAgICAgIGxldCBfY29sSWQgPSBcIiNcIitfY29sLmF0dHIoJ2lkJyk7XHJcbiAgICAgICAgLy9sZXQgX3NvcnRUeXBlID0gX2NvbC5hdHRyKFwiY29sdW1uLXNvcnRcIik7XHJcbiAgICAgICAgbGV0IF9jb2xJY29uSWRVcCA9IF9jb2xJZCtcIi1pY29uLXVwXCI7XHJcbiAgICAgICAgbGV0IF9jb2xJY29uSWQgPSBfY29sSWQrXCItaWNvblwiO1xyXG4gICAgICAgIGxldCBfY29sSWNvblVwRWxlbWVudCA9ICQoZ3JpZElkKycgJytfY29sSWNvbklkVXApO1xyXG4gICAgICAgIGxldCBfY29sSWNvbkVsZW1lbnQgPSAkKGdyaWRJZCsnICcrX2NvbEljb25JZCk7XHJcbiAgICAgICAgbGV0IGNscyA9ICQodGgpLmF0dHIoJ2NsYXNzJyk7XHJcblxyXG4gICAgICAgIC8vaWYgKF9zb3J0VHlwZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoY2xzICE9IG51bGwgJiYgY2xzLmluZGV4T2YoXCJuby1zb3J0XCIpID49IDApIHtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTsgICAgICAgICBcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1jbC1ibHVlXCIpOyAgICAgICAgICAgICBcclxuICAgICAgICAgIH0gICAgICAgICAgXHJcbiAgICAgICAgICBlbHNlIGlmIChjbHMgIT0gbnVsbCAmJiBjbHMuaW5kZXhPZihcInNvcnRpbmdfYXNjXCIpID49IDApIHtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cCBzYW9wLWNsLWJsdWVcIik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNscyAhPSBudWxsICYmIGNscy5pbmRleE9mKFwic29ydGluZ19kZXNjXCIpID49IDApIHtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LmFkZENsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93biBzYW9wLWNsLWJsdWVcIik7ICAgICAgICAgICAgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTsgICAgICAgICBcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1jbC1ibHVlXCIpOyAgIFxyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIC8vfVxyXG4gICAgICB9KTtcclxuICB9IFxyXG5cclxuICBjb25maWdTaW1wbGVGaWx0ZXIoZGF0YVRhYmxlOiBhbnkpOnZvaWQge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCB0YWJsZUlkID0gXCIjXCIrZGF0YVRhYmxlWzBdLmlkO1xyXG4gICAgbGV0IF9pQ291bnQgPSAwO1xyXG4gICAgdmFyIF9maWx0ZXJFbmFibGUgPSBmYWxzZTtcclxuICAgIGxldCBfdGhfY29sdW1ucyA9ICQodGFibGVJZCkuZmluZCgndGgnKTtcclxuICAgIF90aF9jb2x1bW5zLmVhY2goIFxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgX2lDb3VudCA9IF9pQ291bnQgKyAxO1xyXG4gICAgICAgIGxldCBfZWxlbWVudCA9ICQodGhpcyk7XHJcbiAgICAgICAgbGV0IF9maWx0ZXJUeXBlID0gX2VsZW1lbnQuYXR0cihcImNvbHVtbi1maWx0ZXJcIik7ICAgXHJcbiAgICAgICAgbGV0IF9ub3NvcnQgPSBfZWxlbWVudC5oYXNDbGFzcyhcIm5vLXNvcnRcIik7XHJcbiAgICAgICAgbGV0IF9hY3Rpb25Db2x1bW4gPSBfZWxlbWVudC5oYXNDbGFzcyhcInNhb3AtdGFibGUtdGgtbGFzdFwiKTtcclxuICAgICAgICBfZWxlbWVudC5hdHRyKFwiaWRcIixcImNvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiXCIpO1xyXG4gICAgICAgIF9lbGVtZW50LmNzcyhcIm91dGxpbmVcIixcIm5vbmVcIik7XHJcbiAgICAgICAgbGV0IGNvbF90aXRsZSA9IF9lbGVtZW50LnRleHQoKTtcclxuICAgICAgICAvL2xldCBjb2xfbWF4X3dpZHRoID0gY29sX3RpdGxlLmxlbmd0aCAqIDc7XHJcbiAgICAgICAgX2VsZW1lbnQudGV4dChcIlwiKTtcclxuXHJcbiAgICAgICAgLy9fZWxlbWVudC5hcHBlbmQoXCI8ZGl2IGNsYXNzPSdzYW9wLXRhYmxlLWhlYWRlci1jYXB0aW9uIHNhb3AtdGFibGUtdGV4dC10cnVuY2F0ZScgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLWNhcHRpb24nIHN0eWxlPSdtYXgtd2lkdGg6XCIrY29sX21heF93aWR0aC50b1N0cmluZygpK1wicHggIWltcG9ydGFudDsnPlwiK2NvbF90aXRsZStcIjwvZGl2PlwiKTtcclxuICAgICAgICBfZWxlbWVudC5hcHBlbmQoXCI8ZGl2IGNsYXNzPSdzYW9wLXRhYmxlLWhlYWRlci1jYXB0aW9uIHNhb3AtdGFibGUtdGV4dC10cnVuY2F0ZScgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLWNhcHRpb24nPlwiK2NvbF90aXRsZStcIjwvZGl2PlwiKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoX2ZpbHRlclR5cGUgIT0gbnVsbCAmJiBfZmlsdGVyVHlwZS50b0xvd2VyQ2FzZSgpID09IFwidGV4dFwiKXtcclxuICAgICAgICAgIF9maWx0ZXJFbmFibGUgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoX2ZpbHRlclR5cGUgIT0gbnVsbCAmJiBfZmlsdGVyVHlwZS50b0xvd2VyQ2FzZSgpID09IFwiZHJvcGRvd25cIil7XHJcbiAgICAgICAgICBfZmlsdGVyRW5hYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfYWN0aW9uQ29sdW1uICE9IG51bGwgJiYgX2FjdGlvbkNvbHVtbiA9PSB0cnVlKXtcclxuICAgICAgICAgIF9ub3NvcnQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF9ub3NvcnQgPT0gbnVsbCB8fF9ub3NvcnQgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgX2VsZW1lbnQuYXBwZW5kKFwiPGRpdiBpZD0nY29sdW1uLWhlYWRlci1cIisgX2lDb3VudCArXCItaWNvbicgc3R5bGU9J2Zsb2F0OiByaWdodDtoZWlnaHQ6IDIwcHg7d2lkdGg6IDIwcHg7ZGlzcGxheTogaW5saW5lLWZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjsnPlwiKTtcclxuICAgICAgICAgIF9lbGVtZW50LmFwcGVuZChcIjxkaXYgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLWljb24tdXAnIHN0eWxlPSdmbG9hdDogcmlnaHQ7aGVpZ2h0OiAyMHB4O3dpZHRoOiA1cHg7ZGlzcGxheTogaW5saW5lLWZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjsnPlwiKTsgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBfZWxlbWVudC5hcHBlbmQoXCI8ZGl2IGlkPSdjb2x1bW4taGVhZGVyLVwiKyBfaUNvdW50ICtcIi1zaXplcic+XCIpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGlmIChfZmlsdGVyRW5hYmxlKSB7XHJcbiAgICAgICQodGFibGVJZCsnIHRoZWFkIHRyJylcclxuICAgICAgLmNsb25lKHRydWUpXHJcbiAgICAgIC5hZGRDbGFzcygnZmlsdGVycycpXHJcbiAgICAgIC5hcHBlbmRUbyh0YWJsZUlkKycgdGhlYWQnKTtcclxuXHJcbiAgICAgIC8vIFNldHVwIC0gYWRkIGEgdGV4dCBpbnB1dCB0byBlYWNoIGZvb3RlciBjZWxsXHJcbiAgICAgIGxldCBfZmlsdGVycyA9ICQodGFibGVJZCkuZmluZCgnLmZpbHRlcnMnKTtcclxuICAgICAgbGV0IF9maWx0ZXJzX3RoID0gX2ZpbHRlcnMuZmluZCgndGgnKTtcclxuICAgICAgX2lDb3VudCA9IDA7XHJcbiAgICAgIF9maWx0ZXJzX3RoLmVhY2goIFxyXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIF9pQ291bnQgPSBfaUNvdW50ICsgMTtcclxuICAgICAgICAgIGxldCBfZWxlbWVudCA9ICQodGhpcyk7XHJcbiAgICAgICAgICBfZWxlbWVudC5vZmYoKTtcclxuXHJcbiAgICAgICAgICBfZWxlbWVudC5odG1sKFwiXCIpO1xyXG5cclxuICAgICAgICAgIGxldCBfZmlsdGVyVHlwZSA9IF9lbGVtZW50LmF0dHIoXCJjb2x1bW4tZmlsdGVyXCIpO1xyXG5cclxuICAgICAgICAgIHdoaWxlKF9lbGVtZW50WzBdLmF0dHJpYnV0ZXMubGVuZ3RoID4gMClcclxuICAgICAgICAgIF9lbGVtZW50WzBdLnJlbW92ZUF0dHJpYnV0ZShfZWxlbWVudFswXS5hdHRyaWJ1dGVzWzBdLm5hbWUpO1xyXG5cclxuICAgICAgICAgIGxldCBfY29sSWQgPSBcImNvbF9cIitfaUNvdW50LnRvU3RyaW5nKCk7ICAgICAgICBcclxuICAgICAgICAgIF9lbGVtZW50LmF0dHIoXCJpZFwiLF9jb2xJZCk7XHJcbiAgICAgICAgICBsZXQgX2lucHV0SWQgPSBfY29sSWQrXCJfZmlsdGVyXCI7ICAgICAgICBcclxuICAgICAgICAgIGxldCB0aXRsZSA9IF9lbGVtZW50LnRleHQoKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgaWYgKF9maWx0ZXJUeXBlICE9IG51bGwgJiYgX2ZpbHRlclR5cGUudG9Mb3dlckNhc2UoKSA9PSBcInRleHRcIil7XHJcbiAgICAgICAgICAgIGxldCBfaW5wdXRFID0gbmV3IFNhb3BJbnB1dFdGTCh7aWQ6X2lucHV0SWQsY2FwdGlvbjp0aXRsZSxwbGFjZWhvbGRlcjp0aXRsZX0pLmdldElubmVySHRtbCgpO1xyXG4gICAgICAgICAgICBfZWxlbWVudC5odG1sKF9pbnB1dEUpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChfZmlsdGVyVHlwZSAhPSBudWxsICYmIF9maWx0ZXJUeXBlLnRvTG93ZXJDYXNlKCkgPT0gXCJkcm9wZG93blwiKXtcclxuICAgICAgICAgICAgbGV0IF9zZWxlY3RJZCA9IF9jb2xJZCtcIl9zZWxlY3RcIjsgICBcclxuICAgICAgICAgICAgbGV0IHNlbGVjdEh0bWwgPSBuZXcgU2FvcHNlbGVjdFdGTCh7aWQ6X3NlbGVjdElkLGNhcHRpb246XCJcIixwbGFjZWhvbGRlcjpcIlwifSkuZ2V0SW5uZXJIdG1sKCk7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3QgPSAkKHNlbGVjdEh0bWwpOyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL1xyXG5cclxuICAgICAgICAgICAgbGV0IF9pbmRleCA9IF9pQ291bnQ7XHJcbiAgICAgICAgICAgIF9pbmRleCA9IF9pbmRleCAtIDE7XHJcblxyXG4gICAgICAgICAgICBkYXRhVGFibGUuRGF0YVRhYmxlKClcclxuICAgICAgICAgICAgLmNvbHVtbihfaW5kZXgrJzp2aXNpYmxlJylcclxuICAgICAgICAgICAgLmRhdGEoKVxyXG4gICAgICAgICAgICAudW5pcXVlKClcclxuICAgICAgICAgICAgLnNvcnQoKVxyXG4gICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoZDphbnksIGo6YW55KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGQubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2NvbnRlbnQgPSBkO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9maXJzdENoYXIgPSBfY29udGVudFswXTtcclxuICAgICAgICAgICAgICAgIGlmIChfZmlyc3RDaGFyLmNoYXJDb2RlQXQoMCkgPiAxMDAwKSB7X2NvbnRlbnQgPSBfY29udGVudC5yZXBsYWNlKF9maXJzdENoYXIrXCIgXCIsXCJcIik7fVxyXG4gICAgICAgICAgICAgICAgc2VsZWN0LmZpbmQoJ3NlbGVjdCcpLmxhc3QoKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9XCInICsgZCArICdcIj4nICsgX2NvbnRlbnQgKyAnPC9vcHRpb24+Jyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIF9lbGVtZW50LmFwcGVuZChzZWxlY3QpO1xyXG4gICAgICAgICAgfSAgICBcclxuICAgICAgICB9IFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gQXBwbHkgdGhlIGZpbHRlclxyXG4gICAgICAkKHRhYmxlSWQrXCIgdGhlYWQgaW5wdXRcIikub24oICdrZXl1cCBjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IF9pbmRleCA9ICQodGhpcykucGFyZW50KCkucGFyZW50KCkuaW5kZXgoKTtcclxuICAgICAgICBkYXRhVGFibGUuRGF0YVRhYmxlKClcclxuICAgICAgICAgICAgLmNvbHVtbihfaW5kZXgrJzp2aXNpYmxlJylcclxuICAgICAgICAgICAgLnNlYXJjaCggdGFyZ2V0LnZhbHVlIClcclxuICAgICAgICAgICAgLmRyYXcoKTtcclxuXHJcbiAgICAgICAgLy92YXIgdmFsID0gJC5mbi5kYXRhVGFibGUudXRpbC5lc2NhcGVSZWdleCh0YXJnZXQudmFsdWUpO1xyXG4gICAgICAgIC8vZGF0YVRhYmxlLkRhdGFUYWJsZSgpLnNlYXJjaCh2YWwgPyAnXicgKyB2YWwgKyAnJCcgOiAnJywgdHJ1ZSwgZmFsc2UpLmRyYXcoKTtcclxuXHJcbiAgICAgIH0gKTsgICAgXHJcbiBcclxuICAgICAgLy8gQXBwbHkgdGhlIGRyb3Bkb3duIGZpbHRlclxyXG4gICAgICAkKHRhYmxlSWQrXCIgdGhlYWQgc2VsZWN0XCIpLm9uKCAnY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGxldCBfaW5kZXggPSAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLmluZGV4KCk7XHJcbiAgICAgICAgdmFyIHZhbCA9ICQuZm4uZGF0YVRhYmxlLnV0aWwuZXNjYXBlUmVnZXgodGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICBkYXRhVGFibGUuRGF0YVRhYmxlKClcclxuICAgICAgICAgICAgLmNvbHVtbihfaW5kZXgrJzp2aXNpYmxlJylcclxuICAgICAgICAgICAgLnNlYXJjaCh2YWwgPyAnXicgKyB2YWwgKyAnJCcgOiAnJywgdHJ1ZSwgZmFsc2UpXHJcbiAgICAgICAgICAgIC5kcmF3KCk7XHJcbiAgICAgIH0gKTsgIFxyXG5cclxuICAgICAgLy9cclxuICAgIH1cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgY29uZmlnU2ltcGxlU29ydChncmlkSWQ6IHN0cmluZyk6dm9pZCB7XHJcbiAgICB0aGlzLnNldFNvcnRFbGVtZW50KGdyaWRJZCk7XHJcbiAgICB0aGlzLnNldFNvcnRFbGVtZW50RXZlbnQoZ3JpZElkKTtcclxuICB9XHJcblxyXG4gIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9kYXRhLXRhYmxlcy90eXBlcy5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wV2ViR3JpZEZpbHRlciB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtZ3JpZC1maWx0ZXJcIjtcclxuaW1wb3J0IHsgRGF0YVRhYmxlcyB9IGZyb20gXCIuLi9AdHlwZXMvZGF0YS10YWJsZXMvdHlwZXNcIjtcclxuaW1wb3J0IHsgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5pbXBvcnQgeyBTYW9wV2ViR3JpZEVkaXQgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWQtZWRpdFwiO1xyXG5cclxuXHJcbi8vIGZ1bmN0aW9uIHN0YXR1c0Zvcm1hdHRlcihyb3c6IG51bWJlciwgY2VsbDogbnVtYmVyLCB2YWx1ZTogYW55LCBjb2x1bW5EZWY6IFNsaWNrLkNvbHVtbjxTbGljay5TbGlja0RhdGE+LCBkYXRhQ29udGV4dDogU2xpY2suU2xpY2tEYXRhKSB7XHJcbi8vICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHtcclxuLy8gICAgIHJldHVybiBcIi1cIjtcclxuLy8gICB9IGVsc2UgaWYgKHZhbHVlIDwgNTApIHtcclxuLy8gICAgIHJldHVybiBcIjxzcGFuIHN0eWxlPSdjb2xvcjpyZWQ7Zm9udC13ZWlnaHQ6Ym9sZDsnPlwiICsgdmFsdWUgKyBcIiU8L3NwYW4+XCI7XHJcbi8vICAgfSBlbHNlIHtcclxuLy8gICAgIHJldHVybiBcIjxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+XCIgKyB2YWx1ZSArIFwiJTwvc3Bhbj5cIjtcclxuLy8gICB9XHJcbi8vIH1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFdlYkdyaWRUb29sYmFyIHtcclxuICBpZD86c3RyaW5nLFxyXG4gIGNhcHRpb246c3RyaW5nLFxyXG4gIGJ1dHRvbnM/OlNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbltdXHJcbiAgaXRlbXNUZW1wbGF0ZUlkPzogc3RyaW5nO1xyXG59IFxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b24ge1xyXG4gIGlkOnN0cmluZyxcclxuICBjYXB0aW9uIDpzdHJpbmcsICBcclxuICBjbGFzcz8gOnN0cmluZyxcclxuICBhdHRyaWJ1dGVzPzpzdHJpbmcsXHJcbiAgb25DbGlja0V2ZW50PzpzdHJpbmcsXHJcbiAgdGVtcGxhdGU/OiBzdHJpbmc7XHJcbn0gXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BXZWJHcmlkVG9nZ2xlUGFuZWwge1xyXG4gIGVuYWJsZWQ6Ym9vbGVhblxyXG59IFxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ViR3JpZFByb3BlcnRpZXMge1xyXG4gIGdyaWRJZDpzdHJpbmdcclxuICAsY3NzPzpzdHJpbmdcclxuICAsdG9nZ2xlUGFuZWw/OlNhb3BXZWJHcmlkVG9nZ2xlUGFuZWxcclxuICAsdG9vbGJhcj86U2FvcFdlYkdyaWRUb29sYmFyICBcclxuICAsZGF0YVRhYmxlPzpTYW9wV2ViRGF0YVRhYmxlXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFdlYkRhdGFUYWJsZSB7XHJcbiAgZW5hYmxlZDpib29sZWFuXHJcbiAgLGNvbHVtbkRlZnNTZXR0aW5ncz86IERhdGFUYWJsZXMuQ29sdW1uRGVmc1NldHRpbmdzW11cclxuICAsb3JkZXJpbmc/OmJvb2xlYW5cclxuICAsY29sdW1ucz86YW55W11cclxuICAsZGF0YT86IGFueVxyXG4gICxvcmRlcj86IEFycmF5PChudW1iZXIgfCBzdHJpbmcpPiB8IEFycmF5PEFycmF5PChudW1iZXIgfCBzdHJpbmcpPj5cclxuICAsZWRpdGFibGU/OmJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BXZWJHcmlkIHtcclxuICBwcml2YXRlIF9wcm9wZXJ0aWVzOlNhb3BXZWJHcmlkUHJvcGVydGllc1xyXG4gIHByaXZhdGUgX3RhYmxlRGl2OkhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfdHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG4gIHByaXZhdGUgX3Nhb3BXZWJHcmlkRWRpdDogU2FvcFdlYkdyaWRFZGl0O1xyXG4gIC8vXHJcbiAgcHVibGljIGxpYk5hbWU6IHN0cmluZzsgIFxyXG4gIHB1YmxpYyB3ZWJHcmlkRmlsdGVyOlNhb3BXZWJHcmlkRmlsdGVyO1xyXG4gIHB1YmxpYyBkYXRhVGFibGU6IERhdGFUYWJsZXMuQXBpPGFueT47XHJcbiAgcHVibGljIG1hcmtlZENvbHVtbkNoZWNrYm94OiBKUXVlcnk8SFRNTElucHV0RWxlbWVudD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTtcclxuICAgIHRoaXMud2ViR3JpZEZpbHRlciA9IG5ldyBTYW9wV2ViR3JpZEZpbHRlcigpO1xyXG4gICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlID0gbmV3IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UoKTtcclxuICAgIHRoaXMuX3Nhb3BXZWJHcmlkRWRpdCA9IG5ldyBTYW9wV2ViR3JpZEVkaXQoXCJfc2FvcFdlYkdyaWRFZGl0XCIpOyAgICBcclxuICAgIHRoaXMuX3Nhb3BXZWJHcmlkRWRpdC5vbldyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlID0gdGhpcy5vbldyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlLmJpbmQodGhpcyk7XHJcbiAgfSAgXHJcblxyXG4gIHNldFRlcm1pbm9sb2d5TGlzdCgpe1xyXG4gICAgbGV0IF90ZXJtaW5vbG9neTogc3RyaW5nW10gPSBbJ05pIHBvZGF0a292IHphIHByaWthei4nXTtcclxuICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS5zZXRUcmFuc2xhdGlvbnNMaXN0KF90ZXJtaW5vbG9neSk7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIGluaXQoZ3JpZFByb3A6U2FvcFdlYkdyaWRQcm9wZXJ0aWVzKSB7XHJcbiAgICB0aGlzLl9wcm9wZXJ0aWVzID0gZ3JpZFByb3A7XHJcbiAgICB0aGlzLl90YWJsZURpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZ3JpZFByb3AuZ3JpZElkKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgLy9cclxuICAgIGxldCBfdG9nZ2xlUGFuZWxEZWZhdWx0ID0ge2VuYWJsZWQ6dHJ1ZX07XHJcbiAgICBncmlkUHJvcC50b2dnbGVQYW5lbCA9IHsuLi5fdG9nZ2xlUGFuZWxEZWZhdWx0LCAuLi5ncmlkUHJvcC50b2dnbGVQYW5lbH1cclxuICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoZ3JpZFByb3AudG9nZ2xlUGFuZWwpKXtcclxuICAgICAgZ3JpZFByb3AudG9nZ2xlUGFuZWwgPSBfdG9nZ2xlUGFuZWxEZWZhdWx0O1xyXG4gICAgfSAgICAgIFxyXG4gICAgLy9cclxuXHJcbiAgICB0aGlzLndlYkdyaWRGaWx0ZXIuaWQgPSBncmlkUHJvcC5ncmlkSWQrXCJmaWx0ZXJcIjtcclxuICAgIHRoaXMuZ2VuZXJhdGVIdG1sVGFibGUoKTtcclxuICAgIHRoaXMuYWRkR3JpZFRvb2xiYXIoKTtcclxuICAgIC8vIGRldCBkZWZhdWx0c1xyXG4gICAgbGV0IF9Nc2dfZW1wdHlUYWJsZSA9IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJOaSBwb2RhdGtvdiB6YSBwcmlrYXouXCIpXHJcblxyXG4gICAgbGV0IF9kYXRhVGFibGVEZWYgPSB7ZW5hYmxlZDp0cnVlLG9yZGVyaW5nOnRydWV9O1xyXG4gICAgZ3JpZFByb3AuZGF0YVRhYmxlID0gey4uLl9kYXRhVGFibGVEZWYsIC4uLmdyaWRQcm9wLmRhdGFUYWJsZX1cclxuXHJcbiAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKGdyaWRQcm9wLmRhdGFUYWJsZSkpe1xyXG4gICAgICBncmlkUHJvcC5kYXRhVGFibGUgPSBncmlkUHJvcC5kYXRhVGFibGU7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGxldCBfY29sdW1uRGVmc1NldHRpbmdzRGVmID0gW3tvcmRlcmFibGU6IHRydWUsIHRhcmdldHM6ICBcIm5vLXNvcnRcIn1dO1xyXG4gICAgZ3JpZFByb3AuZGF0YVRhYmxlLmNvbHVtbkRlZnNTZXR0aW5ncyA9IHsuLi5fY29sdW1uRGVmc1NldHRpbmdzRGVmLC4uLmdyaWRQcm9wLmRhdGFUYWJsZS5jb2x1bW5EZWZzU2V0dGluZ3N9XHJcblxyXG4gICAgaWYgKGdsb2JhbC5pc1VuRGVmaW5lZChncmlkUHJvcC5kYXRhVGFibGUuY29sdW1uRGVmc1NldHRpbmdzKSl7XHJcbiAgICAgIGdyaWRQcm9wLmRhdGFUYWJsZS5jb2x1bW5EZWZzU2V0dGluZ3MgPSBfY29sdW1uRGVmc1NldHRpbmdzRGVmO1xyXG4gICAgfVxyXG4gICAgLy9cclxuICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlKSBcclxuICAgICAgJiYgdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZW5hYmxlZFxyXG4gICAgICApe1xyXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICB0aGlzLmRhdGFUYWJsZSA9IFxyXG4gICAgICAgICQoZ3JpZFByb3AuZ3JpZElkKS5EYXRhVGFibGUoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJwYWdpbmdcIjogZmFsc2VcclxuICAgICAgICAgICAgICAsIFwic2VhcmNoaW5nXCI6IHRydWVcclxuICAgICAgICAgICAgICAsXCJhdXRvV2lkdGhcIjogdHJ1ZVxyXG4gICAgICAgICAgICAgICxvcmRlckNlbGxzVG9wOiB0cnVlXHJcbiAgICAgICAgICAgICAgLy8sIFwiZG9tXCI6IFwiUmxmcnRpcFwiXHJcbiAgICAgICAgICAgICAgLCBpbml0Q29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChncmlkUHJvcC5kYXRhVGFibGUub3JkZXJpbmcpe1xyXG4gICAgICAgICAgICAgICAgICBfdGhpcy53ZWJHcmlkRmlsdGVyLmNvbmZpZ1NpbXBsZUZpbHRlcih0aGlzKTsgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgX3RoaXMud2ViR3JpZEZpbHRlci5jb25maWdTaW1wbGVTb3J0KF90aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCk7ICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL2lmKCFpc1VuRGVmaW5lZChfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZmlsdGVycykpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgX3RoaXMud2ViR3JpZEZpbHRlci5jb25maWdGaWx0ZXIoX3RoaXMubGliTmFtZSx0aGlzLCBfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLG9yZGVyOiBfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUub3JkZXJcclxuICAgICAgICAgICAgICAvLyAsYWpheDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrLCBzZXR0aW5ncykge1xyXG4gICAgICAgICAgICAgIC8vICAgY2FsbGJhY2soeyBkYXRhOiBkYXRhIH0pIC8vcmVsb2FkcyBkYXRhIFxyXG4gICAgICAgICAgICAgIC8vIH0gXHJcbiAgICAgICAgICAgICAgLGNvbHVtbkRlZnM6IF90aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5jb2x1bW5EZWZzU2V0dGluZ3MgXHJcbiAgICAgICAgICAgICAgLG9yZGVyaW5nIDogZ3JpZFByb3AuZGF0YVRhYmxlLm9yZGVyaW5nIFxyXG4gICAgICAgICAgICAgICxsYW5ndWFnZSA6IHtlbXB0eVRhYmxlOl9Nc2dfZW1wdHlUYWJsZSx6ZXJvUmVjb3JkczpfTXNnX2VtcHR5VGFibGV9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTsgICAgXHJcbiAgICAgIC8vXHJcbiAgICAgICQoZ3JpZFByb3AuZ3JpZElkK1wiX2ZpbHRlclwiKS5yZW1vdmUoKTtcclxuICAgICAgJChncmlkUHJvcC5ncmlkSWQrXCJfaW5mb1wiKS5yZW1vdmUoKTsgXHJcbiAgICAgIHRoaXMud2ViR3JpZEZpbHRlci5zZXRSZXNpemVFdmVudCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCk7XHJcbiAgICAgIC8vXHJcbiAgICB9XHJcbiAgIFxyXG4gICAgLy9cclxuICAgIGlmICh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5lZGl0YWJsZSkge1xyXG4gICAgICB0aGlzLmluaXRXZWJHcmlkRWRpdGFibGVDb2x1bW5DbGlja0V2ZW50cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkVG9vbGJhckJ1dHRvbnMoZ3JpZFBhbmVsOiBKUXVlcnk8SFRNTEVsZW1lbnQ+LGJ1dHRvbnM6U2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uW10pe1xyXG4gICAgaWYoZ2xvYmFsLmlzVW5EZWZpbmVkKGJ1dHRvbnMpID09IGZhbHNlKXtcclxuICAgICAgYnV0dG9ucy5mb3JFYWNoKF9idXR0b24gPT4ge1xyXG4gICAgICAgIHZhciBidXR0b25UZW1wbGF0ZSA9IFxyXG4gICAgICAgIGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gbXktYXV0b1wiIHN0eWxlPVwicGFkZGluZy1sZWZ0OjIxcHg7XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHNhb3AtYnV0dG9uLXByaW1hcnkgbXgtYXV0byBkLWJsb2NrXCIgaWQ9XCIke19idXR0b24uaWR9XCIgdHlwZT1cInN1Ym1pdFwiIG9uY2xpY2s9XCIke19idXR0b24ub25DbGlja0V2ZW50fVwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OjEwcHg7XCI+PHNwYW4gY2xhc3M9XCJzYW9wLWltZy1wbHVzXCI+PC9zcGFuPiR7X2J1dHRvbi5jYXB0aW9ufTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PiAgICBcclxuICAgICAgICBgO1xyXG5cclxuICAgICAgICBpZiAoX2J1dHRvbi50ZW1wbGF0ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBidXR0b25UZW1wbGF0ZSA9IF9idXR0b24udGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBncmlkUGFuZWwuZmluZChcIiN0b29sYmFyQnV0dG9uc1wiKS5hcHBlbmQoYnV0dG9uVGVtcGxhdGUpOyAgICAgIFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdlbmVyYXRlSHRtbFRhYmxlKCkge1xyXG4gICAgdGhpcy5nZW5lcmF0ZVRhYmxlQm9keSgpOyAgICAgICAgXHJcbiAgICB0aGlzLmdlbmVyYXRlVGFibGVIZWFkKCk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZVRhYmxlSGVhZCgpIHtcclxuICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlKSl7XHJcbiAgICAgIGlmKCFnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuY29sdW1ucykpe1xyXG4gICAgICAgIGxldCB0aGVhZCA9IHRoaXMuX3RhYmxlRGl2LmNyZWF0ZVRIZWFkKCk7XHJcbiAgICAgICAgbGV0IHJvdyA9IHRoZWFkLmluc2VydFJvdygpO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBvZiB0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5jb2x1bW5zKSB7XHJcbiAgICAgICAgICBsZXQgdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGhcIik7XHJcbiAgICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGtleS5uYW1lKTtcclxuICAgICAgICAgIHRoLmFwcGVuZENoaWxkKHRleHQpO1xyXG4gICAgICAgICAgcm93LmFwcGVuZENoaWxkKHRoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgZ2VuZXJhdGVUYWJsZUJvZHkoKSB7XHJcbiAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZSkpe1xyXG4gICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5kYXRhKSl7XHJcbiAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiB0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5kYXRhKSB7XHJcbiAgICAgICAgICBsZXQgcm93ID0gdGhpcy5fdGFibGVEaXYuaW5zZXJ0Um93KCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gZWxlbWVudCkge1xyXG4gICAgICAgICAgICBsZXQgY2VsbCA9IHJvdy5pbnNlcnRDZWxsKCk7XHJcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZWxlbWVudFtrZXldKTtcclxuICAgICAgICAgICAgY2VsbC5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEdyaWRUb29sYmFyKCkge1xyXG4gICAgbGV0IGdyaWRQYW5lbDogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIGxldCBfY3NzID0gZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMuY3NzKSA9PSBmYWxzZSA/IHRoaXMuX3Byb3BlcnRpZXMuY3NzIDpcIlwiO1xyXG5cclxuICAgIGxldCBncmlkUGFuZWxUZW1wbGF0ZSA9IGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2FvcC10YWJsZS1maXhoZWFkICR7X2Nzc31cIj5cclxuICAgICAgICAgIDx0YWJsZSBpZD1cIiNzbGlja0dyaWQjXCI+PC90YWJsZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIGA7XHJcbiAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIpKSB7XHJcbiAgICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy50b29sYmFyLmlkKSkge1xyXG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pZCA9IHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkK1wiVEJcIjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgZ3JpZFRvZ2dsZVBhbmVsID0gYGA7XHJcbiAgICAgIGxldCBncmlkVG9nZ2xlUGFuZWxDbGFzcyA9IFwiXCI7XHJcbiAgICAgIGxldCBncmlkQm9yZGVyQm90dG9tID0gXCJcIjtcclxuICAgICAgaWYodGhpcy5fcHJvcGVydGllcy50b2dnbGVQYW5lbC5lbmFibGVkKSB7XHJcbiAgICAgICAgZ3JpZFRvZ2dsZVBhbmVsQ2xhc3MgPSBcImNvbGxhcHNlIHNob3dcIjtcclxuICAgICAgICBncmlkQm9yZGVyQm90dG9tID0gXCJzYW9wLWJvcmRlci1ib3R0b21cIjtcclxuXHJcbiAgICAgICAgZ3JpZFRvZ2dsZVBhbmVsID0gXHJcbiAgICAgICAgICBgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2FvcC1mb3JtLXBhbmVsLWhlYWRpbmcgc2FvcC10b2dnbGUtcGFuZWxcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJzYW9wLXR4dC0zIG0tMFwiIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIiBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiIGRhdGEtdGFyZ2V0PVwiI2NvbGxhcHNlJHt0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWR9XCI+XHJcbiAgICAgICAgICAgICR7dGhpcy5fcHJvcGVydGllcy50b29sYmFyLmNhcHRpb259IDxzcGFuIGNsYXNzPVwic2FvcC1pbWctZG93biBzaS1tIHNhb3AtdG9nZ2xlLWFycm93IHJpZ2h0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIGA7ICAgICAgXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBfdG9vbGJhckl0ZW1zID0gYGA7XHJcbiAgICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pdGVtc1RlbXBsYXRlSWQpKXtcclxuICAgICAgICBsZXQgX3Rvb2xiYXJJdGVtc1RlbXBsYXRlID0gJCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaXRlbXNUZW1wbGF0ZUlkKTtcclxuICAgICAgICBpZiAoX3Rvb2xiYXJJdGVtc1RlbXBsYXRlLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgX3Rvb2xiYXJJdGVtcyA9IF90b29sYmFySXRlbXNUZW1wbGF0ZS5odG1sKCk7XHJcbiAgICAgICAgICBfdG9vbGJhckl0ZW1zVGVtcGxhdGUucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBncmlkUGFuZWxUZW1wbGF0ZSA9IGBcclxuICAgICAgICA8ZGl2IGlkPVwiJHt0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWR9XCIgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0ICR7Z3JpZEJvcmRlckJvdHRvbX1cIj5cclxuICAgICAgICAgICR7Z3JpZFRvZ2dsZVBhbmVsfVxyXG4gICAgICAgICAgPGRpdiBpZD1cImNvbGxhcHNlJHt0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWR9XCIgY2xhc3M9XCJzYW9wLWZvcm0tcGFuZWwtYm9keSAke2dyaWRUb2dnbGVQYW5lbENsYXNzfVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwiZ3JpZC10b29sYmFyXCIgY2xhc3M9XCJzYW9wLXRhYmxlLXRvb2xiYXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGlkPVwidG9vbGJhckJ1dHRvbnNcIiBjbGFzcz1cInJvdyBtci0wIG1sLTAganVzdGlmeS1jb250ZW50LXN0YXJ0XCIgc3R5bGU9XCJoZWlnaHQ6MTAwJTtcIj5cclxuICAgICAgICAgICAgICAke190b29sYmFySXRlbXN9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2FvcC10YWJsZS1maXhoZWFkICR7X2Nzc31cIj5cclxuICAgICAgICAgICAgICA8dGFibGUgaWQ9XCIjc2xpY2tHcmlkI1wiPjwvdGFibGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIGA7XHJcbiAgICB9XHJcbiAgICBncmlkUGFuZWxUZW1wbGF0ZSA9IGdyaWRQYW5lbFRlbXBsYXRlLnJlcGxhY2UoXCIjc2xpY2tHcmlkI1wiLHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkLnJlcGxhY2UoXCIjXCIsXCJcIikpO1xyXG4gICAgZ3JpZFBhbmVsID0gJChncmlkUGFuZWxUZW1wbGF0ZSk7XHJcbiAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIpKSB7XHJcbiAgICAgIHRoaXMuYWRkVG9vbGJhckJ1dHRvbnMoZ3JpZFBhbmVsLHRoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5idXR0b25zKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgX3RhYmxlSHRtbCA9IHRoaXMuX3RhYmxlRGl2O1xyXG5cclxuICAgICQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQpLnJlcGxhY2VXaXRoKGdyaWRQYW5lbCk7XHJcblxyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCkucmVwbGFjZVdpdGgoX3RhYmxlSHRtbCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoRGF0YShkYXRhOmFueSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHRoaXMuZGF0YVRhYmxlLmNsZWFyKCk7XHJcbiAgICBkYXRhLmVhY2goZnVuY3Rpb24oIGluZGV4OmFueSwgdHI6c3RyaW5nICkge1xyXG4gICAgICBfdGhpcy5kYXRhVGFibGUucm93LmFkZCgkKHRyKSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGF0YVRhYmxlLmRyYXcoKTsgICAgXHJcbiAgfVxyXG5cclxuICByZXBsYWNlR3JpZFJvd3MoaHRtbENvbnRlbnQ6c3RyaW5nKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgdGhpcy5kYXRhVGFibGUuY2xlYXIoKTtcclxuICAgICQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQrXCIgPiB0Ym9keSA+IHRyXCIsICQoaHRtbENvbnRlbnQpKS5lYWNoKFxyXG4gICAgICBmdW5jdGlvbihpbmRleDphbnksdHI6YW55KSB7XHJcbiAgICAgICAgX3RoaXMuZGF0YVRhYmxlLnJvdy5hZGQoJCh0cikpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5kYXRhVGFibGUuZHJhdygpOyAgICBcclxuICB9ICBcclxuXHJcbiAgc2V0VGFiZWxGb290aGVyKCk6dm9pZCB7XHJcbiAgICAkKHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKycgYm9keScpICBcclxuICB9XHJcblxyXG4gIGluaXRXZWJHcmlkQ29sdW1uQ2hlY2tib3hCaW5kQ2xpY2tFdmVudCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB0aGlzLm1hcmtlZENvbHVtbkNoZWNrYm94ID0gbnVsbDtcclxuXHJcbiAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3RhYmxlRGl2KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgJChcIiNcIiArIHRoaXMuX3RhYmxlRGl2LmlkICsgXCIgLnNhb3AtdGQtaW5wdXQtY2hlY2tib3hcIikub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgJChcIiNcIiArIHRoaXMuX3RhYmxlRGl2LmlkICsgXCIgLnNhb3AtdGQtaW5wdXQtY2hlY2tib3hcIikub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgX3RoaXMubWFya2VkQ29sdW1uQ2hlY2tib3ggPSAkKFwiI1wiICsgX3RoaXMuX3RhYmxlRGl2LmlkICsgXCIgI1wiICsgcm93LmN1cnJlbnRUYXJnZXQuaWQpO1xyXG5cclxuICAgICAgLy8gb2R6bmFjaW1vIHZzZSBvc3RhbGUgY2hlY2tib3hlXHJcbiAgICAgICQoXCIjXCIgKyBfdGhpcy5fdGFibGVEaXYuaWQgKyBcIiBpbnB1dC5zYW9wLXRkLWlucHV0LWNoZWNrYm94Om5vdCgjXCIgKyByb3cuY3VycmVudFRhcmdldC5pZCArIFwiKVwiKS5lYWNoKFxyXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICQoXCIjXCIgKyBfdGhpcy5fdGFibGVEaXYuaWQgKyBcIiAjXCIgKyB0aGlzLmlkKS5wcm9wKFwiY2hlY2tlZFwiLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICBfdGhpcy5hZnRlckNvbHVtbkNoZWNrYm94Q2hhbmdlZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZnRlckNvbHVtbkNoZWNrYm94Q2hhbmdlZCgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBpbml0V2ViR3JpZEVkaXRhYmxlQ29sdW1uQ2xpY2tFdmVudHMoKTogdm9pZCB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQpLm9mZihcImNsaWNrXCIsIFwidGJvZHkgdGRbZGF0YS1lZGl0YWJsZT0ndHJ1ZSddXCIpO1xyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCkub24oXCJjbGlja1wiLCBcInRib2R5IHRkW2RhdGEtZWRpdGFibGU9J3RydWUnXVwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBfdGhpcy5fc2FvcFdlYkdyaWRFZGl0LnNob3dXZWJHcmlkRWRpdGFibGVDb2x1bW5FZGl0Q29udHJvbCh0aGlzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAgIFxyXG4gIHByaXZhdGUgb25Xcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZSh0ZEVsZW1lbnQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMub25FZGl0VGRDZWxsV3JpdGVWYWx1ZVRvVERFbGVtZW50Q29tcGxldGUodGRFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG9uRWRpdFRkQ2VsbFdyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlKHRkRWxlbWVudDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIC8vIG1ldG9kYSB6YSBleHRlcm5vIHVwb3JhYm9cclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/XHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcElucHV0V0ZMUHJvcGVydGllcyB7XHJcbiAgICBpZDpzdHJpbmc7XHJcbiAgICBwbGFjZWhvbGRlcjpzdHJpbmc7XHJcbiAgICBjYXB0aW9uOnN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BJbnB1dFdGTCB7XHJcbiAgICBwcml2YXRlIF9pbnB1dFRlbXBsYXRlOnN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXM6U2FvcElucHV0V0ZMUHJvcGVydGllcykge1xyXG4gICAgICAgIHRoaXMuX2lucHV0VGVtcGxhdGUgPSBcclxuICAgICAgICBgXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYW9wLWNvbC1maWx0ZXItZ3JvdXBcIj5cclxuICAgICAgICAgICAgPGlucHV0IGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNoYWRvdy1ub25lIHNhb3AtY29udHJvbCBzYW9wLWNvbnRyb2wtbGlzdEJveCBzYW9wLWNvbC1maWx0ZXItaW5wdXRcIiBzdHlsZT1cIndpZHRoOjk1JSAhaW1wb3J0YW50O1wiIGlkPVwiJHtwcm9wZXJ0aWVzLmlkfVwiIG5hbWU9XCIke3Byb3BlcnRpZXMuaWR9XCIgcGxhY2Vob2xkZXI9XCIke3Byb3BlcnRpZXMucGxhY2Vob2xkZXJ9XCIgdGFiaW5kZXg9XCIwXCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIlwiPlxyXG4gICAgICAgICAgICA8aSBpZD1cInNlYXJjaEljb25cIiBjbGFzcz1cInNhb3AtaW1nLXNlYXJjaCBzaS1zIGZvcm0tY29udHJvbC1mZWVkYmFja1wiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7dG9wOjVweDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OiBjYWxjKDEwMCUgLSA0MHB4KSAhaW1wb3J0YW50O1wiLz5cclxuICAgICAgICA8L3NwYW4+ICAgICAgICBcclxuICAgICAgICBgOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgLy8gdGhpcy5faW5wdXRUZW1wbGF0ZSA9IFxyXG4gICAgICAgIC8vIGBcclxuICAgICAgICAvLyA8c3BhbiBjbGFzcz1cImhhcy1mbG9hdC1sYWJlbFwiPlxyXG4gICAgICAgIC8vICAgICA8aW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2hhZG93LW5vbmUgc2FvcC1jb250cm9sIHNhb3AtY29udHJvbC1saXN0Qm94XCIgZGF0YS1pbnB1dG1hc2stYWxpYXM9XCJkZC5tbS55eXl5IGhoOm1tXCIgaWQ9XCIke3Byb3BlcnRpZXMuaWR9XCIgbmFtZT1cIiR7cHJvcGVydGllcy5pZH1cIiBwbGFjZWhvbGRlcj1cIiR7cHJvcGVydGllcy5wbGFjZWhvbGRlcn1cIiB0YWJpbmRleD1cIjBcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCIgZGlzYWJsZWQ9XCJcIj5cclxuICAgICAgICAvLyAgICAgPGxhYmVsIGNsYXNzPVwic2FvcC1mbG9hdGluZy1sYWJlbCBzYW9wLXR4dC03XCIgZm9yPVwiJHtwcm9wZXJ0aWVzLmlkfVwiPiR7cHJvcGVydGllcy5jYXB0aW9ufTwvbGFiZWw+XHJcbiAgICAgICAgLy8gICAgIDxpIGlkPVwiY2FsZW5kYXJJY29uXCIgY2xhc3M9XCJzYW9wLWltZy1jYWxlbmRhciBzaS1zIGZvcm0tY29udHJvbC1mZWVkYmFja1wiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7bGVmdDoyMzBweDt0b3A6NXB4O3Bvc2l0aW9uOmFic29sdXRlO1wiLz5cclxuICAgICAgICAvLyA8L3NwYW4+ICAgICAgICBcclxuICAgICAgICAvLyBgOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RWxlbWVudCgpOkpRdWVyeTxIVE1MRWxlbWVudD57XHJcbiAgICAgICAgbGV0IF9lbGVtZW50ID0gJCh0aGlzLl9pbnB1dFRlbXBsYXRlKTtcclxuICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5uZXJIdG1sKCk6c3RyaW5ne1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dFRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v1xyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9pbmRleC5kLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0NvbXBvbmVudHMvc2FvcC1zZWxlY3RpemUtc2VsZWN0LnRzXCIgLz5cclxuXHJcbmltcG9ydCB7ICBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZWxlY3RpemVTZWxlY3QgfSBmcm9tIFwiLi9zYW9wLXNlbGVjdGl6ZS1zZWxlY3RcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wSW5wdXRNYXNrIHtcclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXQuLi5cIik7XHJcbiAgICAgICAgdmFyIGlucHV0RGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdpbnB1dFtkYXRhLWlucHV0bWFzay1hbGlhc10nKTtcclxuICAgICAgICBJbnB1dG1hc2soKS5tYXNrKGlucHV0RGl2cyk7XHJcblxyXG4gICAgICAgICQoXCIuc2FvcC1kZWNpbWFsLTJcIikuaW5wdXRtYXNrKHtcclxuICAgICAgICAgICAgJ2FsaWFzJzogJ2RlY2ltYWwnLFxyXG4gICAgICAgICAgICAncmFkaXhQb2ludCc6ICcsJyxcclxuICAgICAgICAgICAgJ2RpZ2l0cyc6IDIsXHJcbiAgICAgICAgICAgICdkaWdpdHNPcHRpb25hbCc6IGZhbHNlLFxyXG4gICAgICAgICAgICAncGxhY2Vob2xkZXInOiAnMCwwMCdcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChcIi5zYW9wLWRlY2ltYWwtM1wiKS5pbnB1dG1hc2soe1xyXG4gICAgICAgICAgICAnYWxpYXMnOiAnZGVjaW1hbCcsXHJcbiAgICAgICAgICAgICdyYWRpeFBvaW50JzogJywnLFxyXG4gICAgICAgICAgICAnZGlnaXRzJzogMyxcclxuICAgICAgICAgICAgJ2RpZ2l0c09wdGlvbmFsJzogZmFsc2UsXHJcbiAgICAgICAgICAgICdwbGFjZWhvbGRlcic6ICcwLDAwMCdcclxuICAgICAgICB9KTsgIFxyXG5cclxuICAgICAgICBpbnB1dERpdnMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImVsZW1lbnQuaW5pdC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cIiArIGVsZW1lbnQuaWQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNwYW5EaXY6YW55O1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudEF0cnIgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLWlucHV0bWFzay1hbGlhc1wiKTtcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5pc0VtcHR5KGVsZW1lbnRBdHJyKSkge3JldHVybjt9O1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKGVsZW1lbnRBdHJyKTtcclxuICAgICAgICAgICAgc3BhbkRpdiA9ICQoZWxlbWVudCkucGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChzcGFuRGl2ID09PSBudWxsKSB7IHJldHVybjt9O1xyXG4gICAgICAgICAgICBpZiAoc3BhbkRpdi5oYXNDbGFzcyhcImhhcy1mbG9hdC1sYWJlbFwiKT09PWZhbHNlKSB7IHJldHVybjt9O1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHNwYW5EaXYuZ2V0KDApLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZUF0cnIgPSAoU3RyaW5nKSgkKFwiI3NpdGVMYW5ndWFnZVwiKS52YWwoKSk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJsYW5ndWFnZTpcIitsYW5ndWFnZUF0cnIpO1xyXG4gICAgICAgICAgICBsYW5ndWFnZUF0cnIgPSBnbG9iYWwuaXNFbXB0eShsYW5ndWFnZUF0cnIpID8gXCJzbFwiIDpsYW5ndWFnZUF0cnI7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJsYW5ndWFnZTpcIitsYW5ndWFnZUF0cnIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRBdHJyID09PSBcImhoOm1tOnNzXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI3RpbWVJY29uXCIpO1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNsb2NrLi4uXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjbG9jay5ibHVyLmluaXQ6XCIgKyBlbGVtZW50LmlkKTtcclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuYmx1cihmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxsLmNsb2NrLmJsdXI6XCIgKyBldmVudC50YXJnZXQuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250cm9sVmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xWYWx1ZS5pbmNsdWRlcyhcImhcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWUgPSBjb250cm9sVmFsdWUucmVwbGFjZShcIm1tXCIsIFwiMDBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnJlcGxhY2UoXCJtXCIsIFwiMFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWUgPSBjb250cm9sVmFsdWUucmVwbGFjZShcInNzXCIsIFwiMDBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnJlcGxhY2UoXCJzXCIsIFwiMFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBjb250cm9sVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvemltbyBpbnB1dCBldmVuLCBrZXIgc21vIHZwaXNhbGkgbm92byB2cmVkbm9zdCBcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IEV2ZW50KFwiaW5wdXRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2xvY2suY2xpY2suaW5pdDpcIiArIGVsZW1lbnQuaWQpO1xyXG4gICAgICAgICAgICAgICAgJChpY29uQnRuKS5jbGljayhmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjbG9ja0ljb24uY2xpY2tlZDpcIiArIGVsZW1lbnQuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjdHJsSW5wdXRDdHJsID0gJChlbGVtZW50KS5nZXQoMCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY3RybElucHV0Q3RybFN0ckxlbmd0aCA9IGN0cmxJbnB1dEN0cmwudmFsdWUubGVuZ3RoICogMjtcclxuICAgICAgICAgICAgICAgICAgICBjdHJsSW5wdXRDdHJsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3RybElucHV0Q3RybC5zZXRTZWxlY3Rpb25SYW5nZShjdHJsSW5wdXRDdHJsU3RyTGVuZ3RoLCBjdHJsSW5wdXRDdHJsU3RyTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRBdHJyID09PSBcImRkLm1tLnl5eXlcIiBcclxuICAgICAgICAgICAgICAgIC8vIHx8IGVsZW1lbnRBdHJyID09PSBcImRkLm1tLnl5eXkgaGg6bW1cIiBcclxuICAgICAgICAgICAgICAgIC8vIHx8IGVsZW1lbnRBdHJyID09PSBcImRkLm1tLnl5eXkgaGg6bW06c3NcIlxyXG4gICAgICAgICAgICApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgaWNvbkJ0biA9ICQoc3BhbkRpdikuZmluZChcIiNjYWxlbmRhckljb25cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBkYXRlcGlja2VyU3RhcnREYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLWVuYWJsZS1zZWxlY3QtcGFzdGRhdGVzXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1lbmFibGUtc2VsZWN0LXBhc3RkYXRlc1wiKSkudG9Mb3dlckNhc2UoKSA9PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1pbi1zdGFydC1kYXRlXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRlcGlja2VyU3RhcnREYXRlMSA9ICQoZWxlbWVudCkuYXR0cihcImRhdGEtbWluLXN0YXJ0LWRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMkRhdGUoZGF0ZXBpY2tlclN0YXJ0RGF0ZTEsIFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZXBpY2tlckVuZERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWF4LWVuZC1kYXRlXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJFbmREYXRlID0gJChlbGVtZW50KS5hdHRyKFwiZGF0YS1tYXgtZW5kLWRhdGVcIik7ICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlckVuZERhdGUgPSBnbG9iYWwuY29udmVydFN0cmluZzJEYXRlKGRhdGVwaWNrZXJFbmREYXRlLCBcImRkLm1tLnl5eXlcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRlcGlja2VyKHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGU6IGRhdGVwaWNrZXJTdGFydERhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogZGF0ZXBpY2tlckVuZERhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2Nsb3NlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgd2Vla1N0YXJ0OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZC5tbS55eXl5XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlQXRycixcclxuICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjogXCJib3R0b20gcmlnaHRcIixcclxuICAgICAgICAgICAgICAgICAgICBzaG93T25Gb2N1czpmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vZm9yY2VQYXJzZTpmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0pOyAgIFxyXG5cclxuICAgICAgICAgICAgICAgICQoaWNvbkJ0bikuY2xpY2soZnVuY3Rpb24oKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5jbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlcklucHV0Q3RybCA9ICQoZWxlbWVudCkuZ2V0KDApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGggPSBkYXRlcGlja2VySW5wdXRDdHJsLnZhbHVlLmxlbmd0aCAqIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9kYXRlcGlja2VySW5wdXRDdHJsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRlcGlja2VyKFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VySW5wdXRDdHJsLnNldFNlbGVjdGlvblJhbmdlKGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGgsIGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGgpXHJcbiAgICAgICAgICAgICAgICB9KTsgIFxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eSBoaDptbVwiKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGF0ZXRpbWVwaWNrZXIgaGg6bW0gLi4uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgaWNvbkJ0biA9ICQoc3BhbkRpdikuZmluZChcIiNjYWxlbmRhckljb25cIik7XHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgLmJpbmQoJ2tleWRvd24nLGZ1bmN0aW9uKGUpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAuZGF0ZXRpbWVwaWNrZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ0RELk1NLllZWVkgSDptbScsXHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiBsYW5ndWFnZUF0cnIsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd1RvZGF5QnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5vZmYoXCJmb2N1c1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uKCkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRhKFwiRGF0ZVRpbWVQaWNrZXJcIikuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICBcclxuICBcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50QXRyciA9PT0gXCJkZC5tbS55eXl5IGhoOm1tOnNzXCIpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJkYXRldGltZXBpY2tlciBoaDptbTpzcyAuLi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI2NhbGVuZGFySWNvblwiKTtcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICAuYmluZCgna2V5ZG93bicsZnVuY3Rpb24oZSl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC5kYXRldGltZXBpY2tlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiAnREQuTU0uWVlZWSBIOm1tOnNzJyxcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IGxhbmd1YWdlQXRycixcclxuICAgICAgICAgICAgICAgICAgICBzaG93VG9kYXlCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLm9mZihcImZvY3VzXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8kKGVsZW1lbnQpLm9mZihcImtleWRvd25cIik7XHJcbiAgICAgICAgICAgICAgICAvLyAub24oJ2RwLmhpZGUnLCBmdW5jdGlvbihlKXtcclxuICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnZHAuaGlkZScpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB9KSAgIFxyXG4gICAgICAgICAgICAgICAgLy8gLm9uKCdkcC5zaG93JywgZnVuY3Rpb24oZSl7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coJ2RwLnNob3cnKTtcclxuICAgICAgICAgICAgICAgIC8vIH0pOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uKCkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCQoZG9jdW1lbnQpLmZpbmQoXCIuZGF0ZXBpY2tlci1kcm9wZG93blwiKS5pcyhcIjp2aXNpYmxlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRhKFwiRGF0ZVRpbWVQaWNrZXJcIikuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyAkKGVsZW1lbnQpLmZvY3VzKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgJChlbGVtZW50KS5kYXRhKFwiRGF0ZVRpbWVQaWNrZXJcIikuaGlkZSgpOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyB9KTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm5vdCBpbXBsZW1lbnRlZC4uLlwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0TXVsdGlEYXRlU2VsZWN0RGF0ZXBpY2tlcigpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRTZWxlY3RpemVTZWxlY3QoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0aXplTXVsdGlzZWxlY3RTZWxlY3QoKTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImluaXRJbnB1dHMuLi5kb25lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdE11bHRpRGF0ZVNlbGVjdERhdGVwaWNrZXIoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5pdE11bHRpRGF0ZVNlbGVjdERhdGVwaWNrZXIuLi5cIik7XHJcblxyXG4gICAgICAgIHZhciBpbnB1dERpdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignaW5wdXRbZGF0YS1pemJvci12ZWMtZG5pXScpO1xyXG5cclxuICAgICAgICBpbnB1dERpdnMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImVsZW1lbnQuaW5pdC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cIiArIGVsZW1lbnQuaWQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNwYW5EaXY6IGFueTtcclxuICAgICAgICAgICAgc3BhbkRpdiA9ICQoZWxlbWVudCkucGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChzcGFuRGl2ID09PSBudWxsKSB7IHJldHVybjsgfTtcclxuICAgICAgICAgICAgaWYgKHNwYW5EaXYuaGFzQ2xhc3MoXCJoYXMtZmxvYXQtbGFiZWxcIikgPT09IGZhbHNlKSB7IHJldHVybjsgfTtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhzcGFuRGl2LmdldCgwKS5pZCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgbGFuZ3VhZ2VBdHJyID0gKFN0cmluZykoJChcIiNzaXRlTGFuZ3VhZ2VcIikudmFsKCkpO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibGFuZ3VhZ2U6XCIgKyBsYW5ndWFnZUF0cnIpO1xyXG4gICAgICAgICAgICBsYW5ndWFnZUF0cnIgPSBnbG9iYWwuaXNFbXB0eShsYW5ndWFnZUF0cnIpID8gXCJzbFwiIDogbGFuZ3VhZ2VBdHJyO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibGFuZ3VhZ2U6XCIgKyBsYW5ndWFnZUF0cnIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGljb25CdG4gPSAkKHNwYW5EaXYpLmZpbmQoXCIjY2FsZW5kYXJJY29uXCIpO1xyXG5cclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uXCIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJTdGFydERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1lbmFibGUtc2VsZWN0LXBhc3RkYXRlc1wiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICgoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1lbmFibGUtc2VsZWN0LXBhc3RkYXRlc1wiKSkudG9Mb3dlckNhc2UoKSA9PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyU3RhcnREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWluLXN0YXJ0LWRhdGVcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlclN0YXJ0RGF0ZTEgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1pbi1zdGFydC1kYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMkRhdGUoZGF0ZXBpY2tlclN0YXJ0RGF0ZTEsIFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJFbmREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWF4LWVuZC1kYXRlXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlckVuZERhdGUgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1heC1lbmQtZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJFbmREYXRlID0gZ2xvYmFsLmNvbnZlcnRTdHJpbmcyRGF0ZShkYXRlcGlja2VyRW5kRGF0ZSwgXCJkZC5tbS55eXl5XCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGVwaWNrZXIoe1xyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlOiBkYXRlcGlja2VyU3RhcnREYXRlLFxyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZTogZGF0ZXBpY2tlckVuZERhdGUsXHJcbiAgICAgICAgICAgICAgICBhdXRvY2xvc2U6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgbXVsdGlkYXRlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHdlZWtTdGFydDogMSxcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZC5tbS55eXl5XCIsXHJcbiAgICAgICAgICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VBdHJyLFxyXG4gICAgICAgICAgICAgICAgb3JpZW50YXRpb246IFwiYm90dG9tIHJpZ2h0XCJcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxlbmRhci4uLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmwgPSAkKGVsZW1lbnQpLmdldCgwKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGggPSBkYXRlcGlja2VySW5wdXRDdHJsLnZhbHVlLmxlbmd0aCAqIDI7XHJcbiAgICAgICAgICAgICAgICBkYXRlcGlja2VySW5wdXRDdHJsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBkYXRlcGlja2VySW5wdXRDdHJsLnNldFNlbGVjdGlvblJhbmdlKGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGgsIGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGgpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5pdE11bHRpRGF0ZVNlbGVjdERhdGVwaWNrZXIuLi5kb25lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNlbGVjdGl6ZVNlbGVjdCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0U2VsZWN0aXplU2VsZWN0Li4uXCIpO1xyXG5cclxuICAgICAgICAkKCcuc2VsZWN0aXplU2VsZWN0JykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBzYW9wU2VsZWN0ZWxlbWVudCA9IG5ldyBTYW9wU2VsZWN0aXplU2VsZWN0KCk7XHJcbiAgICAgICAgICAgIHNhb3BTZWxlY3RlbGVtZW50LmluaXRDb250cm9sQnlIdG1sKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0U2VsZWN0aXplU2VsZWN0Li4uZG9uZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRTZWxlY3RpemVNdWx0aXNlbGVjdFNlbGVjdCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0U2VsZWN0aXplTXVsdGlzZWxlY3RTZWxlY3QuLi5cIik7XHJcblxyXG4gICAgICAgICQoJy5zZWxlY3RpemVNdWx0aXNlbGVjdCcpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgc2FvcFNlbGVjdGVsZW1lbnQgPSBuZXcgU2FvcFNlbGVjdGl6ZVNlbGVjdCgpO1xyXG4gICAgICAgICAgICBzYW9wU2VsZWN0ZWxlbWVudC5pbml0TXVsdGlzZWxlY3RDb250cm9sQnlIdG1sKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0U2VsZWN0aXplTXVsdGlzZWxlY3RTZWxlY3QuLi5kb25lXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wUG9wb3ZlciB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtcG9wb3ZlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTaWRlYmFyIHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NvbGxFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByb3RlY3RlZCBfZXhwRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9tZW51U2lkZWJhclBvcG92ZXI6IFNhb3BQb3BvdmVyO1xyXG5cclxuICAgIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLmluaXQuLi5cIik7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbGxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb2xsYXBzZS1pY29uLWNvbGxcIik7XHJcbiAgICAgICAgdGhpcy5fZXhwRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29sbGFwc2UtaWNvbi1leHBcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbGxFbGVtZW50ICE9IG51bGwpIHRoaXMuX2NvbGxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBpZiAodGhpcy5fZXhwRWxlbWVudCAhPSBudWxsKSB0aGlzLl9leHBFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIEV4cGFuZCBpY29uIGNsaWNrXHJcbiAgICAgICAgJChcIiNjb2xsYXBzZS1pY29uLWV4cFwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiI2NvbGxhcHNlLWljb24tZXhwXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLmNvbGxhcHNlLWljb24tZXhwLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5lbmFibGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENvbGxhcHNlIGljb24gY2xpY2tcclxuICAgICAgICAkKFwiI2NvbGxhcHNlLWljb24tY29sbFwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiI2NvbGxhcHNlLWljb24tY29sbFwiKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5jb2xsYXBzZS1pY29uLWNvbGwuY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyLmRpc2FibGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENvbGxhcHNlIGNsaWNrXHJcbiAgICAgICAgJCgnW2RhdGEtdG9nZ2xlPXNpZGViYXItY29sYXBzZV0nKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2lkZWJhckNvbGxhcHNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvL21lbnUgaXRlbSBjbGlja1xyXG4gICAgICAgICQoXCIuc2FvcC1iZy1pdGVtXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAvL3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtcHJldmlvdXMtaXRlbS1pZFwiLCBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIikpO1xyXG4gICAgICAgICAgICAgICAgLy9zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIiwgdGhpcy5pZCk7XHJcbiAgICAgICAgICAgICAgICAvL3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtc3ViaXRlbS1pZFwiLCBcIjBcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApXHJcblxyXG4gICAgICAgIC8vbWVudSBzdWItaXRlbSBjbGlja1xyXG4gICAgICAgIC8vJChcIi5zYW9wLWJnLXN1Yml0ZW1cIikuY2xpY2soXHJcbiAgICAgICAgLy8gICAgZnVuY3Rpb24oKXtcclxuICAgICAgICAvLyAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIsIHRoaXMuaWQpO1xyXG4gICAgICAgIC8vICAgIH1cclxuICAgICAgICAvLylcclxuXHJcbiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWVudS1zaWRlYmFyXCIpICE9IG51bGwpXHJcbiAgICAgICAgICAgIHRoaXMuR2V0U2Vzc2lvblN0b3JhZ2VWYWx1ZXMoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuRGVsZXRlU2Vzc2lvblN0b3JhZ2VWYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0TWVudVNpZGViYXJQb3BvdmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNpZGViYXJDb2xsYXBzZSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIuc2lkZWJhckNvbGxhcHNlXCIpO1xyXG4gICAgICAgICQoJyNtZW51VG9wSWNvbkxhcmdlJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xyXG4gICAgICAgICQoJyNtZW51VG9wSWNvblNtYWxsJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xyXG4gICAgICAgICQoJy5zaWRlYmFyLW1lbnUtY2FwdGlvbicpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnKTtcclxuICAgICAgICAkKCcjc2lkZWJhci1jb250YWluZXInKS50b2dnbGVDbGFzcygnc2lkZWJhci1leHBhbmRlZCBzaWRlYmFyLWNvbGxhcHNlZCcpO1xyXG4gICAgICAgICQoJy5zYW9wLWJnLXN1Yml0ZW1zJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xyXG4gICAgICAgICQoJyNtZW51Q2xvc2VCdXR0b24nKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgdmFyIFNlcGFyYXRvclRpdGxlID0gJCgnI3NpZGViYXItY29udGFpbmVyJyk7XHJcbiAgICAgICAgaWYgKFNlcGFyYXRvclRpdGxlLmhhc0NsYXNzKCdzaWRlYmFyLWNvbGxhcHNlZCcpKSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtc2lkZWJhci1leHBhbmRlZFwiLCBcInRydWVcIilcclxuICAgICAgICAgICAgdGhpcy5fY29sbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuICAgICAgICAgICAgdGhpcy5fZXhwRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zaWRlYmFyLWV4cGFuZGVkXCIsIFwiZmFsc2VcIilcclxuICAgICAgICAgICAgdGhpcy5fY29sbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICB0aGlzLl9leHBFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBtZW51SXRlbUNvbGxhcHNlKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5tZW51SXRlbUNvbGxhcHNlXCIpO1xyXG4gICAgICAgIC8vdmFyIHByZXZpb3VzSXRlbUlEID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIpO1xyXG4gICAgICAgIC8vdmFyIGl0ZW1JRCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiKTtcclxuICAgICAgICAvL3ZhciBzdWJpdGVtc0lEID0gaXRlbUlEK1wiLWNvbGxhcHNlXCI7XHJcbiAgICAgICAgLy92YXIgc3ViaXRlbUlEID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIpO1xyXG5cclxuICAgICAgICAvL3ZhciBwcmV2aW91cyA9ICQoXCIjXCIgKyBwcmV2aW91c0l0ZW1JRCk7XHJcbiAgICAgICAgLy92YXIgaXRlbSA9ICQoJyMnK2l0ZW1JRCk7XHJcbiAgICAgICAgLy92YXIgc3ViaXRlbXMgPSAkKFwiI1wiICsgc3ViaXRlbXNJRCk7XHJcbiAgICAgICAgLy92YXIgc3ViaXRlbSA9ICQoXCIjXCIrc3ViaXRlbXNJRCtcIj4jXCIrc3ViaXRlbUlEKTtcclxuXHJcbiAgICAgICAgLy9wcmV2aW91cy5yZW1vdmVDbGFzcyhcInNhb3AtYmctaXRlbS1zZWxlY3RlZFwiKTsvLyd1bi1jb2xvcicgcHJldmlvdXMgaXRlbVxyXG4gICAgICAgIC8vcHJldmlvdXNbMF0uc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBcImZhbHNlXCIpO1xyXG4gICAgICAgIC8vaXRlbVswXS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIsIFwidHJ1ZVwiKTtcclxuICAgICAgICAvL2l0ZW0uYWRkQ2xhc3MoXCJzYW9wLWJnLWl0ZW0tc2VsZWN0ZWRcIik7Ly9jb2xvciBpdGVtXHJcbiAgICAgICAgLy9zdWJpdGVtcy5hZGRDbGFzcygnc2hvdycpOy8vZXhwYW5kIGNvbGxhcHNlXHJcbiAgICAgICAgLy9zdWJpdGVtLmFkZENsYXNzKFwic2FvcC1iZy1zdWJpdGVtLXNlbGVjdGVkXCIpOy8vY29sb3Igc3ViaXRlbVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBHZXRTZXNzaW9uU3RvcmFnZVZhbHVlcygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIuR2V0U2Vzc2lvblN0b3JhZ2VWYWx1ZXNcIik7XHJcbiAgICAgICAgLy9kZWZhdWx0c1xyXG4gICAgICAgIC8vaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiKSA9PSBudWxsKSB7XHJcbiAgICAgICAgLy9zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXNpZGViYXItZXhwYW5kZWRcIiwgbnVsbCk7XHJcbiAgICAgICAgLy8gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1wcmV2aW91cy1pdGVtLWlkXCIsIG51bGwpO1xyXG4gICAgICAgIC8vICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiLCBcIm5hbWl6amVcIik7XHJcbiAgICAgICAgLy8gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIsIFwiMFwiKTtcclxuICAgICAgICAvL31cclxuXHJcbiAgICAgICAgLy9zaWRlYmFyIGV4cGFuZGVkL2NvbnRyYWN0ZWRcclxuICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1zaWRlYmFyLWV4cGFuZGVkXCIpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2lkZWJhckNvbGxhcHNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3NlbGVjdGVkLW1lbnUgaXRlbVxyXG4gICAgICAgIHRoaXMubWVudUl0ZW1Db2xsYXBzZSgpXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIERlbGV0ZVNlc3Npb25TdG9yYWdlVmFsdWVzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5EZWxldGVTZXNzaW9uU3RvcmFnZVZhbHVlc1wiKTtcclxuXHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInNhb3AtbWVudS1zaWRlYmFyLWV4cGFuZGVkXCIpO1xyXG4gICAgICAgIC8vc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInNhb3AtbWVudS1wcmV2aW91cy1pdGVtLWlkXCIpO1xyXG4gICAgICAgIC8vc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIpO1xyXG4gICAgICAgIC8vc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRNZW51U2lkZWJhclBvcG92ZXIoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLmluaXRNZW51U2lkZWJhclBvcG92ZXJcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3ZlciA9IG5ldyBTYW9wUG9wb3ZlcihcIi5tZW51LXBvcHVwXCIpO1xyXG4gICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5pbml0U2VsZkNvbnRhaW5lclBvcG92ZXIoKTtcclxuICAgICAgICB0aGlzLl9tZW51U2lkZWJhclBvcG92ZXIuZGlzYWJsZVBvcG92ZXIoKTtcclxuXHJcbiAgICAgICAgdmFyIGVsZW1lbnRWaXNpYmxlID0gJChcIiNjb2xsYXBzZS1pY29uLWNvbGxcIikuaXMoJzp2aXNpYmxlJyk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnRWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5lbmFibGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyLmRpc2FibGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgZW51bSBTYW9wTXNnRGxnVHlwZSB7XHJcbiAgICBtdEluZm9ybWF0aW9uID0gMVxyXG4gICAgLG10V2FybmluZyA9IDJcclxuICAgICxtdEVycm9yID0gM1xyXG4gICAgLy8sIG10Q29uZmlybWF0aW9uLCBtdEN1c3RvbVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wTXNnRGxnQnV0dG9uIHtcclxuICAgIG1iTm9uZSA9IDBcclxuICAgICxtYk9LID0gMVxyXG4gICAgLG1iQ2FuY2VsID0gMlxyXG4gICAgLG1iWWVzID0gM1xyXG4gICAgLG1iTm8gPSA0XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcE1zZ0RsZ0V2ZW50IHtcclxuICAgIHBhcmVudDphbnk7XHJcbiAgICBkYXRhOmFueTtcclxufVxyXG5cclxudHlwZSBTYW9wTXNnRGxnQnV0dG9ucyA9IEFycmF5PFNhb3BNc2dEbGdCdXR0b24+O1xyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE1lc3NhZ2VEbGcge1xyXG4gICAgcHJpdmF0ZSBfc2VuZGVyOlNhb3BNc2dEbGdFdmVudDtcclxuICAgIHB1YmxpYyBvbk9rOiAoc2VuZGVyOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvbkNhbmNlbDogKHNlbmRlcjphbnkpID0+IGFueSA9IG51bGw7XHJcbiAgICBwdWJsaWMgb25ZZXM6IChzZW5kZXI6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uTm86IChzZW5kZXI6YW55KSA9PiBhbnkgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHNlbmRlcjpTYW9wTXNnRGxnRXZlbnQpe1xyXG4gICAgICAgIHRoaXMuX3NlbmRlciA9IHNlbmRlcjtcclxuICAgIH1cclxuXHJcbiAgICBTaG93KE1zZzpzdHJpbmcsVGl0bGU6c3RyaW5nLERsZ1R5cGU6U2FvcE1zZ0RsZ1R5cGUgPSBTYW9wTXNnRGxnVHlwZS5tdEluZm9ybWF0aW9uLEJ1dHRvbnM6U2FvcE1zZ0RsZ0J1dHRvbnMgPSBbU2FvcE1zZ0RsZ0J1dHRvbi5tYk9LXSk6U2FvcE1zZ0RsZ0J1dHRvbntcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm1lc3NhZ2U6XCIrTXNnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInRpdGxlOlwiK1RpdGxlKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBsZXQgdGl0bGVEaXYgPSAkKCcjYWxlcnQtbW9kYWwtdGl0bGUtZGl2Jyk7XHJcbiAgICAgICAgbGV0IGJvZHlUYWcgPSAkKCcjYWxlcnQtbW9kYWwtYm9keScpO1xyXG5cclxuICAgICAgICBpZiAoRGxnVHlwZSA9PSBTYW9wTXNnRGxnVHlwZS5tdEluZm9ybWF0aW9uKXtcclxuICAgICAgICAgICAgJChcIiNhbGVydC1tb2RhbC10aXRsZS1kaXZcIikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLFwid2hpdGVcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChEbGdUeXBlID09IFNhb3BNc2dEbGdUeXBlLm10RXJyb3IpIHtcclxuICAgICAgICAgICAgJChcIiNhbGVydC1tb2RhbC10aXRsZS1kaXZcIikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLFwiI0Q4MkMyNVwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKFwiI2FsZXJ0LW1vZGFsLXRpdGxlLWRpdlwiKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsXCJzaWx2ZXJcIik7ICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWdsb2JhbC5pc0VtcHR5KFRpdGxlKSl7XHJcbiAgICAgICAgICAgIHRpdGxlRGl2Lmh0bWwoVGl0bGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBib2R5VGFnLmh0bWwoTXNnKTtcclxuXHJcbiAgICAgICAgaWYgKEJ1dHRvbnMgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IF9lbGVtZW50X21iT0sgPSBCdXR0b25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50ID09PSBTYW9wTXNnRGxnQnV0dG9uLm1iT0spO1xyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKF9lbGVtZW50X21iT0spKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZChfdGhpcy5vbk9rKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbk9rKF90aGlzLl9zZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTYW9wTXNnRGxnQnV0dG9uLm1iT0s7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgbGV0IF9lbGVtZW50X21iQ2FuY2VsID0gQnV0dG9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudCA9PT0gU2FvcE1zZ0RsZ0J1dHRvbi5tYkNhbmNlbCk7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoX2VsZW1lbnRfbWJDYW5jZWwpKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Q2FuY2VsXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydENhbmNlbFwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRDYW5jZWxcIikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZChfdGhpcy5vbkNhbmNlbCkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25DYW5jZWwoX3RoaXMuX3NlbmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNhb3BNc2dEbGdCdXR0b24ubWJDYW5jZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTsgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIGxldCBfZWxlbWVudF9tYlllcyA9IEJ1dHRvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQgPT09IFNhb3BNc2dEbGdCdXR0b24ubWJZZXMpO1xyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKF9lbGVtZW50X21iWWVzKSkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydFllc1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0WWVzXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQoX3RoaXMub25ZZXMpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm9uWWVzKF90aGlzLl9zZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTYW9wTXNnRGxnQnV0dG9uLm1iWWVzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICBsZXQgX2VsZW1lbnRfbWJObyA9IEJ1dHRvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQgPT09IFNhb3BNc2dEbGdCdXR0b24ubWJObyk7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoX2VsZW1lbnRfbWJObykpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5jbGljayhcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKF90aGlzLm9uTm8pKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTm8oX3RoaXMuX3NlbmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNhb3BNc2dEbGdCdXR0b24ubWJObztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJChcIiNidG5BbGVydE9LXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Q2FuY2VsXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKFwiI2J0bkFsZXJ0WWVzXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Tm9cIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBTYW9wTXNnRGxnQnV0dG9uLm1iTm9uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICQoJyNhbGVydC1tb2RhbCcpLm9uKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAkKFwiI2FsZXJ0LW1vZGFsLWJ0bi1va1wiKS51bmJpbmQoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgJCh0aGlzKS5tb2RhbCgnZGlzcG9zZScpO1xyXG4gICAgICAgIH0pXHJcbiAgICBcclxuICAgICAgICAkKCcjYWxlcnQtbW9kYWwnKS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgIGdsb2JhbC5zZXRNb2RhbEZvcm1aSW5kZXgoJyNhbGVydC1tb2RhbCcpOyBcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9ib290c3RyYXAtbXVsdGlzZWxlY3QvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuXHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcE11bHRpc2VsZWN0UGFyYW1zIHtcclxuICAgIHRhcmdldDpzdHJpbmcsXHJcbiAgICBzZWxlY3RBbGw/OmJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wTXVsdGlzZWxlY3RPcHRpb25zIHtcclxuICAgIHRlbXBsYXRlc0J1dHRvbj86IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE11bHRpc2VsZWN0IHtcclxuICAgIHByaXZhdGUgX2xpYk5hbWU6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfdHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBfY2FwdGlvbjogc3RyaW5nID0gXCJTa3VwaW5hXCI7XHJcbiAgICBwcml2YXRlIF9tdWx0aVNlbGVjdE9iamVjdDogYW55O1xyXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogU2FvcE11bHRpc2VsZWN0T3B0aW9ucztcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgbXNDb250YWluZXI6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHB1YmxpYyBtc0J1dHRvbjogSlF1ZXJ5PEhUTUxCdXR0b25FbGVtZW50PjtcclxuICAgIHB1YmxpYyBtc1BvcHVwQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHVibGljIG1zQ29udGFpbmVyTGFiZWw6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHB1YmxpYyBzZWxlY3RlZENCOmFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOnN0cmluZyA9IFwiXCIsIG9wdGlvbnM6U2FvcE11bHRpc2VsZWN0T3B0aW9ucyA9IG51bGwpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0XCIpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpO1xyXG4gICAgfSBcclxuXHJcbiAgICBzZXRPcHRpb25zKG9wdGlvbnM6IFNhb3BNdWx0aXNlbGVjdE9wdGlvbnMpOiB2b2lkIHtcclxuICAgICAgICAvLyBmaXJzdCBzZXQgZGVmYXVsdCBvcHRpb25zXHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdGVtcGxhdGVzQnV0dG9uOiAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtdWx0aXNlbGVjdCBkcm9wZG93bi10b2dnbGUgcHItMFwiIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIj48c3BhbiBjbGFzcz1cIm11bHRpc2VsZWN0LXNlbGVjdGVkLXRleHRcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJzYW9wLWltZy1kb3duIHNpLXMgZmxvYXQtcmlnaHRcIj48L3NwYW4+PC9idXR0b24+J1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGVtcGxhdGVzQnV0dG9uICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMudGVtcGxhdGVzQnV0dG9uID0gb3B0aW9ucy50ZW1wbGF0ZXNCdXR0b247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGVybWlub2xvZ3lMaXN0KCkge1xyXG4gICAgICAgIGxldCBfdGVybWlub2xvZ3k6IHN0cmluZ1tdID0gWydJxaHEjWknLCAnVnNpJywgJ0l6YmVyaSBwcmlrYXphbmUnLCAnaXpicmFuaWgnXTtcclxuICAgICAgICBpZiAoIWdsb2JhbC5pc0VtcHR5KHRoaXMuX2NhcHRpb24pKSB7XHJcbiAgICAgICAgICAgIF90ZXJtaW5vbG9neSA9IFsnScWhxI1pJywgJ1ZzaScsICdJemJlcmkgcHJpa2F6YW5lJywgJ2l6YnJhbmloJywgdGhpcy5fY2FwdGlvbl07XHJcbiAgICAgICAgfSBcclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdChfdGVybWlub2xvZ3kpO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmREaXYoZWxlbWV0OmFueSl7XHJcbiAgICAgICAgdGhpcy5tc0NvbnRhaW5lciA9ICQoZWxlbWV0LiRjb250YWluZXIpO1xyXG4gICAgICAgIHRoaXMubXNCdXR0b24gPSAkKGVsZW1ldC4kYnV0dG9uKTtcclxuICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwgPSB0aGlzLm1zQ29udGFpbmVyLmZpbmQoXCIjY29udGFpbmVyTGFiZWxcIik7XHJcbiAgICAgICAgdGhpcy5tc1BvcHVwQ29udGFpbmVyID0gJChlbGVtZXQuJHBvcHVwQ29udGFpbmVyKTtcclxuICAgICAgICAvL3RoaXMuc2VsZWN0ZWRDQiA9IGVsZW1ldC4kc2VsZWN0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENCLnZhbCgpLmxlbmd0aCl7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TXNGbG9hdGluZ0xhYmVsKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldE1zRmxvYXRpbmdMYWJlbCh0cnVlKTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBzZXRNc0Zsb2F0aW5nTGFiZWwoaXNFbXByeTpib29sZWFuKXtcclxuICAgICAgICBpZiAoaXNFbXByeSl7XHJcbiAgICAgICAgICAgIHRoaXMubXNDb250YWluZXJMYWJlbC5hZGRDbGFzcygnbXMtZmxvYXQtbGFiZWwtZW1wdHknKTtcclxuICAgICAgICAgICAgdGhpcy5tc0NvbnRhaW5lckxhYmVsLnJlbW92ZUNsYXNzKCdtcy1mbG9hdC1sYWJlbC1zZWxlY3RlZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubXNDb250YWluZXJMYWJlbC5yZW1vdmVDbGFzcygnbXMtZmxvYXQtbGFiZWwtZW1wdHknKTtcclxuICAgICAgICAgICAgdGhpcy5tc0NvbnRhaW5lckxhYmVsLmFkZENsYXNzKCdtcy1mbG9hdC1sYWJlbC1zZWxlY3RlZCcpOyAgICAgICAgICAgIFxyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIG9uSW5pdGlhbGl6ZWRDb250cm9sKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTXVsdGlzZWxlY3Qub25Jbml0aWFsaXplZENvbnRyb2xcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ0IuaGFzQ2xhc3MoXCJpbnB1dC12YWxpZGF0aW9uLWVycm9yXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXNCdXR0b24uYWRkQ2xhc3MoXCJzYW9wLWVycm9yLWlucHV0XCIpO1xyXG4gICAgICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwuYWRkQ2xhc3MoXCJzYW9wLWVycm9yLWlucHV0LXRleHRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkb2RhbW8gc3RpY2t5IGNzcyB6YSBwcnZpIGVsZW1lbnRcclxuICAgICAgICB0aGlzLmFkZFN0aWNreUNsYXNzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuYWZ0ZXJJbml0aWFsaXplZENvbnRyb2woZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkU3RpY2t5Q2xhc3MoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNdWx0aXNlbGVjdC5hZGRTdGlja3lDbGFzc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IHNlem5hbSA9IHRoaXMubXNDb250YWluZXIuZmluZChcImJ1dHRvbi5tdWx0aXNlbGVjdC1vcHRpb24uZHJvcGRvd24taXRlbVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleDogbnVtYmVyLCBlbGVtOiBhbnkpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdEl0ZW0gPSAkKGVsZW0pO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0SXRlbS50ZXh0KCkgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdEl0ZW0uYWRkQ2xhc3MoXCJzYW9wLW11bHRpc2VsZWN0LWl0ZW0tc3RpY2t5XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCh0YXJnZXQ6IHN0cmluZyA9IFwiXCIsIGNhcHRpb24gPSBcIlwiICl7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNdWx0aXNlbGVjdC5pbml0XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9jYXB0aW9uID0gY2FwdGlvbjtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcHJldm9kZSAodHVkaSB6YSB0aGlzLl9jYXB0aW9uKVxyXG4gICAgICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KCk7XHJcblxyXG4gICAgICAgIGlmIChnbG9iYWwuaXNFbXB0eSh0YXJnZXQpKSB7dGFyZ2V0ID0gXCIuc2FvcC1tdWx0aXNlbGVjdFwiO31cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCID0gJCh0YXJnZXQpO1xyXG5cclxuICAgICAgICAvLyBhbGkgaW1hIHNlbGVjdGVkQ0IgZGF0YS1jYXB0aW9uXHJcbiAgICAgICAgbGV0IHNlbGVjdENhcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGlmICghZ2xvYmFsLmlzRW1wdHkodGhpcy5fY2FwdGlvbikpIHtcclxuICAgICAgICAgICAgc2VsZWN0Q2FwdGlvbiA9IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUodGhpcy5fY2FwdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkYXRhQ2FwdGlvbiA9IHRoaXMuc2VsZWN0ZWRDQi5hdHRyKFwiZGF0YS1jYXB0aW9uXCIpO1xyXG4gICAgICAgIGlmICghZ2xvYmFsLmlzRW1wdHkoZGF0YUNhcHRpb24pKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdENhcHRpb24gPSBkYXRhQ2FwdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICQodGFyZ2V0KS5tdWx0aXNlbGVjdCh7XHJcbiAgICAgICAgICAgIG1heEhlaWdodDogMzUwLCAgXHJcbiAgICAgICAgICAgIGVuYWJsZUZpbHRlcmluZzogdHJ1ZSxcclxuICAgICAgICAgICAgaW5jbHVkZVNlbGVjdEFsbE9wdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgZW5hYmxlQ2FzZUluc2Vuc2l0aXZlRmlsdGVyaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBlbmFibGVGdWxsVmFsdWVGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICBmaWx0ZXJQbGFjZWhvbGRlcjogdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIknFocSNaVwiKSxcclxuICAgICAgICAgICAgbm9uU2VsZWN0ZWRUZXh0OiAnJyxcclxuICAgICAgICAgICAgYWxsU2VsZWN0ZWRUZXh0OnRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJWc2lcIiksXHJcbiAgICAgICAgICAgIHNlbGVjdEFsbFRleHQ6dGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkl6YmVyaSBwcmlrYXphbmVcIiksXHJcbiAgICAgICAgICAgIG5TZWxlY3RlZFRleHQ6dGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIml6YnJhbmloXCIpLFxyXG4gICAgICAgICAgICBpbmNsdWRlRmlsdGVyQ2xlYXJCdG46IHRydWUsXHJcbiAgICAgICAgICAgIGRpc2FibGVJZkVtcHR5OiBmYWxzZSxcclxuICAgICAgICAgICAgbnVtYmVyRGlzcGxheWVkOiAyLFxyXG4gICAgICAgICAgICBidXR0b25XaWR0aDogJzIwMHB4JyxcclxuICAgICAgICAgICAgYnV0dG9uQ2xhc3MgOidzYW9wLWNvbnRyb2wgZm9ybS1jb250cm9sIHNoYWRvdy1ub25lIG1zLWltYWdlLWRvd24gcHItMCcsXHJcbiAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lcjogJzxkaXYgaWQ9XCJzZWxlY3RlZC1wYXJlbnRzLWNvbnRhaW5lclwiPjxsYWJlbCBpZCA9XCJjb250YWluZXJMYWJlbFwiIGNsYXNzPVwibXMtZmxvYXQtbGFiZWwgbXMtZmxvYXQtbGFiZWwtc2VsZWN0ZWQgc2FvcC10eHQtN1wiIGZvcj1cIk5hbWVcIj4nK3NlbGVjdENhcHRpb24rJzwvbGFiZWw+PC9kaXY+JyxcclxuICAgICAgICAgICAgb25TZWxlY3RBbGw6IGZ1bmN0aW9uIChzZWxlY3RlZE9wdGlvbnM6IEpRdWVyeSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmluZERpdih0aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyU2VsZWN0QWxsKHNlbGVjdGVkT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlckNoYW5nZUNvbW1vbkV2ZW50KHRoaXMuJHNlbGVjdCk7XHJcbiAgICAgICAgICAgIH0sICAgICAgICBcclxuICAgICAgICAgICAgb25EZXNlbGVjdEFsbDogZnVuY3Rpb24oc2VsZWN0ZWRPcHRpb25zOkpRdWVyeSl7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5iaW5kRGl2KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJEZXNlbGVjdEFsbChzZWxlY3RlZE9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCh0aGlzLiRzZWxlY3QpO1xyXG4gICAgICAgICAgICB9LCAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24ob3B0aW9uOiBKUXVlcnksIGNoZWNrZWQ6IGJvb2xlYW4pe1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmluZERpdih0aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyQ2hhbmdlKG9wdGlvbiwgY2hlY2tlZCk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlckNoYW5nZUNvbW1vbkV2ZW50KHRoaXMuJHNlbGVjdCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IGZ1bmN0aW9uICgkc2VsZWN0LCAkY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fbXVsdGlTZWxlY3RPYmplY3QgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmluZERpdih0aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uSW5pdGlhbGl6ZWRDb250cm9sKHRoaXMpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZXM6IHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbjogdGhpcy5fb3B0aW9ucy50ZW1wbGF0ZXNCdXR0b24sXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXI6ICc8bGkgY2xhc3M9XCJtdWx0aXNlbGVjdC1pdGVtIG11bHRpc2VsZWN0LWZpbHRlclwiPjxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBtYi0zXCI+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIG11bHRpc2VsZWN0LXNlYXJjaFwiIHR5cGU9XCJ0ZXh0XCIgLz48ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtcHJlcGVuZFwiPjxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dCBzYW9wLWltZy1zZWFyY2ggc2kteHNcIj48L3NwYW4+PC9kaXY+PC9kaXY+PC9saT4nLFxyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgfSlcclxuICAgICAgICAubXVsdGlzZWxlY3QoJ3NlbGVjdEFsbCcsIGZhbHNlLCB0cnVlKVxyXG4gICAgICAgIC5tdWx0aXNlbGVjdCgndXBkYXRlQnV0dG9uVGV4dCcpO1xyXG4gICAgICAgIDsgIFxyXG4gICAgfVxyXG5cclxuICAgIHJlYnVpbGQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCLm11bHRpc2VsZWN0KCdyZWJ1aWxkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJTZWxlY3RBbGwoc2VsZWN0ZWRPcHRpb25zOiBKUXVlcnkpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJEZXNlbGVjdEFsbChzZWxlY3RlZE9wdGlvbnM6SlF1ZXJ5KXtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJDaGFuZ2Uob3B0aW9uOiBKUXVlcnksIGNoZWNrZWQ6IGJvb2xlYW4pe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhZnRlckNoYW5nZUNvbW1vbkV2ZW50KGVsZW1lbnQ6YW55KXtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJJbml0aWFsaXplZENvbnRyb2woZWxlbWVudDogYW55KXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0LmFmdGVySW5pdGlhbGl6ZWRDb250cm9sXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNlbGVjdFZhbHVlcyB2cmVkbm9zdGlcclxuICAgIHNldFNlbGVjdFZhbHVlcyhzZWxlY3RWYWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgICAgLy8gb2R6bmFjaW1vIHZzZSB6YXBvc2xlbmVcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ0IubXVsdGlzZWxlY3QoJ2Rlc2VsZWN0QWxsJyk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RWYWx1ZXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBvem5hY2ltbyBpemJyYW5lXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDQi5tdWx0aXNlbGVjdCgnc2VsZWN0Jywgc2VsZWN0VmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCLm11bHRpc2VsZWN0KCdyZWZyZXNoJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9tdWx0aVNlbGVjdE9iamVjdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmluZERpdih0aGlzLl9tdWx0aVNlbGVjdE9iamVjdCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCh0aGlzLl9tdWx0aVNlbGVjdE9iamVjdC4kc2VsZWN0KTtcclxuICAgICAgICB9IFxyXG4gICAgfVxyXG5cclxuICAgIGNsZWFySHRtbE9wdGlvbnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCXHJcbiAgICAgICAgICAgIC5maW5kKCdvcHRpb24nKVxyXG4gICAgICAgICAgICAucmVtb3ZlKClcclxuICAgICAgICAgICAgLmVuZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hIdG1sT3B0aW9ucyhvcHRpb25MaXN0OiBTZWxlY3RPcHRpb25bXSwgc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLmNsZWFySHRtbE9wdGlvbnMoKTtcclxuICAgICAgICBpZiAob3B0aW9uTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbkxpc3QuZm9yRWFjaChlbGVtZW50ID0+IF90aGlzLnNlbGVjdGVkQ0IuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPVwiJyArIGVsZW1lbnQudmFsdWUgKyAnXCI+JyArIGVsZW1lbnQudGV4dCArICc8L29wdGlvbj4nKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVidWlsZCgpO1xyXG4gICAgICAgIHRoaXMuYWRkU3RpY2t5Q2xhc3MoKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdEFsbCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ0IubXVsdGlzZWxlY3QoJ3NlbGVjdEFsbCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDQi52YWwoKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TXNGbG9hdGluZ0xhYmVsKGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TXNGbG9hdGluZ0xhYmVsKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IFNhb3BQaW5jaFpvb20gfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXBpbmNoLWFuZC16b29tXCI7XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUGRmUHJldmlldyB7XHJcbiAgICBwcml2YXRlIF9wZGZqc0xpYjphbnk7XHJcbiAgICBwcml2YXRlIF9jYW52YXM6YW55O1xyXG4gICAgcHJpdmF0ZSBfdmlld2VyOmFueTtcclxuICAgIHByaXZhdGUgX3BkZjphbnk7XHJcbiAgICBwcml2YXRlIF9zY2FsZSA9IDE7XHJcbiAgICAvL1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRJZDpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF91cmw6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfZmlsZU5hbWU6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfYmFzZTY0OnN0cmluZztcclxuICAgIHByaXZhdGUgX3R5cGU6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2FvcFBpbmNoWm9vbTpTYW9wUGluY2hab29tO1xyXG5cclxuICAgIGxvYWRwZGZqc0xpYihwZGZqc0xpYjphbnkpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5fcGRmanNMaWIgPSBwZGZqc0xpYjtcclxuICAgICAgICB0aGlzLl9zYW9wUGluY2hab29tID0gIG5ldyBTYW9wUGluY2hab29tKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyUGFnZShwYWdlTnVtYmVyOmFueSwgY2FudmFzOmFueSk6dm9pZCB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9wZGYuZ2V0UGFnZShwYWdlTnVtYmVyKS50aGVuKGZ1bmN0aW9uKHBhZ2U6YW55KSB7XHJcbiAgICAgICAgX3RoaXMuX3ZpZXdlciA9IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZTogX3RoaXMuX3NjYWxlIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gICBsZXQgX3ZpZXdlck9mZnNldCA9ICQoJy5wZGYtdmlld2VyLWlubmVyJykub2Zmc2V0KCk7XHJcbiAgICAgICAgICAgIC8vICAgbGV0IF93ID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gX3ZpZXdlck9mZnNldC5sZWZ0LCB3aW5kb3cuaW5uZXJXaWR0aCAtIF92aWV3ZXJPZmZzZXQubGVmdCAtMjcyIHx8IDApXHJcblxyXG4gICAgICAgICAgICAvLyBsZXQgX3cgPSAkKCcjcGRmLXZpZXdlcicpLndpZHRoKCk7XHJcbiAgICAgICAgICAgIC8vIGNhbnZhcy5oZWlnaHQgPSBfdGhpcy5fdmlld2VyLmhlaWdodDtcclxuICAgICAgICAgICAgLy8gY2FudmFzLndpZHRoID0gX3cgLSAxMDtcclxuICAgICAgICAgICAgbGV0IF93ID0gKF90aGlzLl92aWV3ZXIud2lkdGggYXMgc3RyaW5nKSsncHgnXHJcbiAgICAgICAgICAgICQoJy5zYW9wLWNvbC12aWV3JykuY3NzKCdtaW4td2lkdGgnLCBfdyk7XHJcblxyXG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gX3RoaXMuX3ZpZXdlci5oZWlnaHQgLSAxMDtcclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gX3RoaXMuX3ZpZXdlci53aWR0aCAtIDEwOyAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIHBhZ2UucmVuZGVyKHtjYW52YXNDb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSwgdmlld3BvcnQ6IF90aGlzLl92aWV3ZXJ9KS5wcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUGFnZSByZW5kZXJpbmcgY29tcGxldGUuJyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fc2FvcFBpbmNoWm9vbS5pbml0KFwicGRmLXZpZXdlclwiKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHNldERlZmF1bHRTY2FsZShzY2FsZTpudW1iZXIpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5fc2FvcFBpbmNoWm9vbS5zZXREZWZhdWx0U2NhbGUoc2NhbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGJhc2U2NFRvVWludDhBcnJheShiYXNlNjQ6c3RyaW5nKTphbnl7XHJcbiAgICAgICAgdmFyIHJhdyA9IGF0b2IoYmFzZTY0KTtcclxuICAgICAgICB2YXIgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHJhdy5sZW5ndGgpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHVpbnQ4QXJyYXlbaV0gPSByYXcuY2hhckNvZGVBdChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVpbnQ4QXJyYXk7XHJcbiAgICB9ICAgXHJcblxyXG4gICAgbG9hZGluZ1BkZlRhc2sobG9hZGluZ1Rhc2s6YW55KTp2b2lke1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uKHBkZjphbnkpIHtcclxuICAgICAgICAgICAgX3RoaXMuX3BkZiA9IHBkZjtcclxuICAgICAgICAgICAgX3RoaXMuX3ZpZXdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZGYtdmlld2VyJyk7XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZvcihsZXQgcGFnZSA9IDE7IHBhZ2UgPD0gcGRmLm51bVBhZ2VzOyBwYWdlKyspIHtcclxuICAgICAgICAgICAgICAgIFxyXG4gXHJcbiAgICAgICAgICAgICAgX3RoaXMuX2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7ICAgIFxyXG4gICAgICAgICAgICAgIF90aGlzLl9jYW52YXMuY2xhc3NOYW1lID0gJ3BkZi1wYWdlLWNhbnZhcyc7IFxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIGxldCBfcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgICBfcm93LmNsYXNzTmFtZSA9ICdyb3cgbS0wIHAtMCc7IFxyXG5cclxuICAgICAgICAgICAgICBsZXQgX2NvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgICAgX2NvbC5jbGFzc05hbWUgPSAnY29sIG0tMCBwLTAgc2FvcC1jb2wtdmlldyc7IFxyXG5cclxuICAgICAgICAgICAgICBfY29sLmFwcGVuZENoaWxkKF90aGlzLl9jYW52YXMpOyBcclxuXHJcbiAgICAgICAgICAgICAgX3Jvdy5hcHBlbmRDaGlsZChfY29sKTsgXHJcblxyXG4gICAgICAgICAgICAgIF90aGlzLl92aWV3ZXIuYXBwZW5kQ2hpbGQoX3Jvdyk7XHJcbiAgICAgICAgICAgICAgX3RoaXMucmVuZGVyUGFnZShwYWdlLCBfdGhpcy5fY2FudmFzKTtcclxuICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgIC8vbmV3IFNhb3BQaW5jaFpvb20oKS5pbml0KFwicGRmLXZpZXdlclwiKTtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gX3RoaXMuX3Nhb3BQaW5jaFpvb20uaW5pdChcInBkZi12aWV3ZXJcIik7XHJcbiAgICAgICAgICAgIC8vICQoJy5wZGYtcGFnZS1jYW52YXMnKS5hdHRyKFwib25sb2FkXCIsXCJzYW9wUGRmUHJldmlldy5zZXREZWZhdWx0U2NhbGUoMC42KTtcIik7XHJcbiAgICAgICAgICAgIC8vICQoJ2RpdltvbmxvYWRdJykudHJpZ2dlcignb25sb2FkJyk7XHJcbiAgICAgICAgfSk7ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWxlTmFtZUJ5VXJsKHVybDpzdHJpbmcpOnZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgdHlwZTogXCJIRUFEXCIsXHJcbiAgICAgICAgICAgIHVybDogdXJsLCAgICAgICAgIFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihtZXNzYWdlLCB0ZXh0LCByZXNwb25zZSl7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fdHlwZSA9IHJlc3BvbnNlLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGUnKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmRvY3VtZW50UmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7ICAgXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsZUNvbnRlbnRCeVVybCh1cmw6c3RyaW5nKTp2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiR0VUXCIsXHJcbiAgICAgICAgICAgIHVybDogdXJsLCAgICAgICAgIFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihtZXNzYWdlLCB0ZXh0LCByZXNwb25zZSl7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2NvbnRhaW5lciA9ICQoJzxkaXYgY2xhc3M9XCJwZGYtdmlldy1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6MTAwJTtvdmVyZmxvdy15OiBhdXRvO1wiPjwvZGl2PicpO1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lci5odG1sKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICBfY29udGFpbmVyLmFwcGVuZChfY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICQoJyNwZGYtdmlld2VyJykuYXBwZW5kKF9jb250YWluZXIpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pOyAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVuZGVyRXJyb3JEaXYoKTp2b2lke1xyXG4gICAgICAgIC8vJCgnI3BkZi12aWV3ZXInKS5odG1sKCc8ZGl2Pk5pIGRva3VtZW50b3YgemEgcHJpa2F6PC9kaXY+Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgZG9jdW1lbnRQcmV2aWV3KCk6dm9pZCB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLnJlbmRlckVycm9yRGl2KCk7XHJcbiAgICAgICAgdGhpcy5fZG9jdW1lbnRJZCA9ICQoXCIjbXlNb2RlbF9Eb2N1bWVudElkXCIpLnZhbCgpIGFzIHN0cmluZztcclxuICAgICAgICB0aGlzLl91cmwgPSAkKFwiI215TW9kZWxfRmlsZVVybFwiKS52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICAgICAgdGhpcy5fZmlsZU5hbWUgPSAkKFwiI215TW9kZWxfRmlsZU5hbWVcIikudmFsKCkgYXMgc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuX2Jhc2U2NCA9ICQoXCIjbXlNb2RlbF9CYXNlNjRTdHJpbmdcIikudmFsKCkgYXMgc3RyaW5nO1xyXG5cclxuICAgICAgICBsZXQgX3cgPSBzY3JlZW4ud2lkdGg7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl91cmwubGVuZ3RoID4gMCAmJiB0aGlzLl9maWxlTmFtZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldEZpbGVOYW1lQnlVcmwodGhpcy5fdXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9iYXNlNjQubGVuZ3RoID09IDApIHtyZXR1cm47fVxyXG5cclxuICAgICAgICBsZXQgX2ZpbGVFeHRlbnNpb24gPSB0aGlzLl9maWxlTmFtZS5zcGxpdCgnLicpLnBvcCgpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIGlmIChfZmlsZUV4dGVuc2lvbi5sZW5ndGggPT0gMCkge3JldHVybjt9XHJcblxyXG4gICAgICAgIHRoaXMuX3R5cGUgPSBcImltYWdlL3BuZ1wiO1xyXG4gICAgICAgIGlmIChfZmlsZUV4dGVuc2lvbi50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICdwZGYnKXtcclxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IFwiYXBwbGljYXRpb24vcGRmXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IFwiaW1hZ2UvXCIrX2ZpbGVFeHRlbnNpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRvY3VtZW50UmVuZGVyKCk7XHJcblxyXG4gICAgfSAgICBcclxuXHJcbiAgICBkb2N1bWVudFJlbmRlcigpOnZvaWQge1xyXG4gICAgICAgbGV0IF93ID0gc2NyZWVuLndpZHRoO1xyXG5cclxuICAgICAgICBpZihfdyA8PSA4MDAgJiYgdGhpcy5fdHlwZS5pbmNsdWRlcyhcInBkZlwiKSA9PSB0cnVlKXtcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgdGhpcy5wcmVwYXJlUGRmTm9kZXMoKTtcclxuICAgICAgICAgICAgbGV0IGxvYWRpbmdUYXNrOmFueTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2U2NC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2FycmF5ID0gdGhpcy5iYXNlNjRUb1VpbnQ4QXJyYXkodGhpcy5fYmFzZTY0KTtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmdUYXNrID0gdGhpcy5fcGRmanNMaWIuZ2V0RG9jdW1lbnQoX2FycmF5KTsgICBcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmdUYXNrID0gdGhpcy5fcGRmanNMaWIuZ2V0RG9jdW1lbnQodGhpcy5fdXJsKTsgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nUGRmVGFzayhsb2FkaW5nVGFzayk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90eXBlLmluY2x1ZGVzKFwidGV4dC9odG1sXCIpKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RmlsZUNvbnRlbnRCeVVybCh0aGlzLl91cmwpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2U2NC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcjcGRmLXZpZXdlcicpLmh0bWwoJzxlbWJlZCBTcmM9XCJkYXRhOicrdGhpcy5fdHlwZSsnO2Jhc2U2NCwnK3RoaXMuX2Jhc2U2NCsnXCIgY2xhc3M9XCJteC1hdXRvIGQtZmxleCBoLTEwMCB3LTEwMFwiIHR5cGU9XCInK3RoaXMuX3R5cGUrJ1wiPjwvZW1iZWQ+Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKCcjcGRmLXZpZXdlcicpLmh0bWwoJzxlbWJlZCBTcmM9XCInK3RoaXMuX3VybCsnXCIgY2xhc3M9XCJteC1hdXRvIGQtZmxleCBoLTEwMCB3LTEwMFwiIHR5cGU9XCInK3RoaXMuX3R5cGUrJ1wiXCI+PC9lbWJlZD4nKTsgICAgICAgIFxyXG4gICAgICAgICAgICB9ICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgIH0gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBwcmVwYXJlUGRmTm9kZXMoKTp2b2lke1xyXG4gICAgICAgIGxldCBfcGFyZW50ID0gJCgnI3BkZi12aWV3ZXInKS5wYXJlbnQoKTtcclxuXHJcbiAgICAgICAgbGV0IF9tYWluID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBfbWFpbi5jbGFzc05hbWUgPSAncGRmLXZpZXdlci1tYWluJzsgXHJcblxyXG4gICAgICAgIGxldCBfaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIF9pbm5lci5jbGFzc05hbWUgPSAncGRmLXZpZXdlci1pbm5lcic7XHJcblxyXG4gICAgICAgIGxldCBfdmlld2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBfdmlld2VyLmlkID0gJ3BkZi12aWV3ZXInOyAgICAgICAgICAgIFxyXG5cclxuICAgICAgICBfaW5uZXIuYXBwZW5kQ2hpbGQoX3ZpZXdlcik7XHJcblxyXG4gICAgICAgIF9tYWluLmFwcGVuZENoaWxkKF9pbm5lcik7XHJcblxyXG4gICAgICAgIF9wYXJlbnQuaHRtbChfbWFpbik7ICBcclxuICAgIH1cclxuXHJcbiAgICAvLyBsb2FkQmFzZTY0UGRmKCk6dm9pZHtcclxuICAgIC8vICAgICBsZXQgX2Jhc2U2NCA9ICQoXCIjbXlNb2RlbF9CYXNlNjRTdHJpbmdcIikudmFsKCkgYXMgc3RyaW5nO1xyXG5cclxuICAgIC8vICAgICBpZiAoX2Jhc2U2NC5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIGxldCBfZmlsZU5hbWUgPSAkKFwiI215TW9kZWxfRmlsZU5hbWVcIikudmFsKCkgYXMgc3RyaW5nO1xyXG4gICAgLy8gICAgICAgICBsZXQgX2ZpbGVFeHRlbnNpb24gPSBfZmlsZU5hbWUuc3BsaXQoJy4nKS5wb3AoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICBsZXQgX3cgPSBzY3JlZW4ud2lkdGg7XHJcblxyXG4gICAgLy8gICAgICAgICBpZihfdyA8PSA4MDAgJiYgX2ZpbGVFeHRlbnNpb24udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSBcInBkZlwiKXtcclxuICAgIC8vICAgICAgICAgICAgIC8vXHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnByZXBhcmVQZGZOb2RlcygpO1xyXG4gICAgLy8gICAgICAgICAgICAgbGV0IF9hcnJheSA9IHRoaXMuYmFzZTY0VG9VaW50OEFycmF5KF9iYXNlNjQpO1xyXG4gICAgLy8gICAgICAgICAgICAgdmFyIGxvYWRpbmdUYXNrID0gdGhpcy5fcGRmanNMaWIuZ2V0RG9jdW1lbnQoX2FycmF5KTsgICBcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMubG9hZGluZ1BkZlRhc2sobG9hZGluZ1Rhc2spO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgbGV0IF90eXBlID0gXCJpbWFnZS9wbmdcIjtcclxuICAgIC8vICAgICAgICAgICAgIGlmIChfZmlsZUV4dGVuc2lvbi50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICdwZGYnKXtcclxuICAgIC8vICAgICAgICAgICAgICAgICBfdHlwZSA9IFwiYXBwbGljYXRpb24vcGRmXCI7XHJcbiAgICAvLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIF90eXBlID0gXCJpbWFnZS9cIitfZmlsZUV4dGVuc2lvbjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICAkKCcjcGRmLXZpZXdlcicpLmh0bWwoJzxlbWJlZCBTcmM9XCJkYXRhOicrX3R5cGUrJztiYXNlNjQsJytfYmFzZTY0KydcIiBjbGFzcz1cIm14LWF1dG8gZC1mbGV4IGgtMTAwIHctMTAwXCIgdHlwZT1cIicrX3R5cGUrJ1wiPjwvZW1iZWQ+Jyk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy9cclxuICBcclxuXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2hhbW1lcmpzL2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBpbmNoWm9vbSB7XHJcblx0cHJpdmF0ZSBfaW5pdGlhbGl6ZWQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cdC8vIHByaXZhdGUgX2RlZmF1bHRTZXQgPSB7eDogLTYwLCB5OiAtNTMsejogMC42fTtcclxuXHRwcml2YXRlIF9kZWZhdWx0U2V0ID0ge3g6IDAsIHk6IDAsejogMC42fTtcclxuXHRwcml2YXRlIF9lbGVtZW50IDphbnk7XHJcblx0cHJpdmF0ZSBfaGFtbWVydGltZSA6YW55O1xyXG5cclxuXHRwcml2YXRlIF9maXhIYW1tZXJqc0RlbHRhSXNzdWUgOmFueTtcclxuXHRwcml2YXRlIF9waW5jaFN0YXJ0IDphbnk7XHJcblx0cHJpdmF0ZSBfbGFzdEV2ZW50IDphbnk7XHJcblx0XHJcblx0cHJpdmF0ZSBfb3JpZ2luYWxTaXplIDphbnk7XHRcclxuXHRwcml2YXRlIF9jdXJyZW50IDphbnk7XHJcblx0cHJpdmF0ZSBfbGFzdCA6YW55O1x0XHJcblx0cHJpdmF0ZSBfcGluY2hab29tT3JpZ2luIDphbnk7XHJcblx0XHJcblx0Ly9cclxuXHRcclxuXHRzbGVlcChtaWxsaXNlY29uZHM6bnVtYmVyKTp2b2lkIHtcclxuXHRcdGNvbnN0IGRhdGUgPSBEYXRlLm5vdygpO1xyXG5cdFx0bGV0IGN1cnJlbnREYXRlID0gbnVsbDtcclxuXHRcdGRvIHtcclxuXHRcdFx0Y3VycmVudERhdGUgPSBEYXRlLm5vdygpO1xyXG5cdFx0fSB3aGlsZSAoY3VycmVudERhdGUgLSBkYXRlIDwgbWlsbGlzZWNvbmRzKTtcclxuXHR9XHJcblxyXG5cdGluaXQoaWQ6c3RyaW5nKXtcclxuXHRcdGNvbnNvbGUubG9nKFwiaW5pdC4uLlwiKTtcclxuXHRcdHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcblxyXG5cdFx0Ly8gbGV0IF93ID0gJCggd2luZG93ICkud2lkdGgoKTsvL3RoaXMuX2VsZW1lbnQub2Zmc2V0V2lkdGg7XHJcblx0XHQvLyAvL2xldCBfcGRmVyA9IHBhcnNlSW50KCQoXCIucGRmLXBhZ2UtY2FudmFzXCIpLndpZHRoKCkpKSAqIDAuNjtcclxuXHRcdC8vIGxldCBfcGRmVyA9ICQoXCIucGRmLXBhZ2UtY2FudmFzXCIpLndpZHRoKCkgKiAwLjY7XHJcblx0XHQvLyB0aGlzLl9kZWZhdWx0U2V0LnggPSAoIF93IC0gX3BkZlcpIC8gMjtcclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5faGFtbWVydGltZSA9IG5ldyBIYW1tZXIodGhpcy5fZWxlbWVudCwge30pO1x0XHRcclxuXHRcdFxyXG5cdFx0dGhpcy5faGFtbWVydGltZS5nZXQoJ3BpbmNoJykuc2V0KHsgZW5hYmxlOiB0cnVlIH0pO1xyXG5cdFx0dGhpcy5faGFtbWVydGltZS5nZXQoJ3BhbicpLnNldCh7IHRocmVzaG9sZDogMCB9KTtcclxuXHJcbiAgICBcdHRoaXMuX3BpbmNoU3RhcnQgPSB7IHg6IDAsIHk6IDAgfTtcclxuXHJcblx0XHR0aGlzLl9vcmlnaW5hbFNpemUgPSB7d2lkdGg6IDIwMCwgaGVpZ2h0OiAzMDB9O1x0XHJcblx0XHR0aGlzLl9jdXJyZW50ID0ge3g6IDAsIHk6IDAsIHo6IDAsIHpvb21pbmc6IGZhbHNlLCB3aWR0aDogdGhpcy5fb3JpZ2luYWxTaXplLndpZHRoICogMSwgaGVpZ2h0OiB0aGlzLl9vcmlnaW5hbFNpemUuaGVpZ2h0ICogMX07XHRcclxuXHRcdHRoaXMuX2xhc3QgPSB7eDogdGhpcy5fY3VycmVudC54LCB5OnRoaXMuX2N1cnJlbnQueSwgejp0aGlzLl9jdXJyZW50Lnp9XHRcdFxyXG5cclxuXHRcdHRoaXMuaW5pdEV2ZW50cygpO1xyXG5cclxuXHRcdHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuXHRcdFxyXG5cdFx0dGhpcy5zZXREZWZhdWx0U2NhbGUodGhpcy5fZGVmYXVsdFNldC56KTtcclxuXHR9XHJcblxyXG5cdHNldERlZmF1bHRTY2FsZShzY2FsZTpudW1iZXIpIHtcclxuXHRcdGNvbnNvbGUubG9nKFwic2NhbGU6XCIrc2NhbGUudG9TdHJpbmcoKSk7XHJcblx0XHRpZiAodGhpcy5faW5pdGlhbGl6ZWQgPT0gZmFsc2UpIHtyZXR1cm47IH07XHJcblx0XHQvL3RoaXMuc2xlZXAoNTAwKTtcclxuXHJcblx0XHRsZXQgX3RoaXMgPSB0aGlzO1xyXG5cdFx0Ly9cclxuXHRcdHRoaXMuX2RlZmF1bHRTZXQueiA9IHNjYWxlO1xyXG5cdFx0Ly9cclxuXHRcdHRoaXMuX2N1cnJlbnQgPSB7eDogMCwgeTogMCwgejogdGhpcy5fZGVmYXVsdFNldC56LCB6b29taW5nOiBmYWxzZSwgd2lkdGg6IHRoaXMuX29yaWdpbmFsU2l6ZS53aWR0aCAqIDEsIGhlaWdodDogdGhpcy5fb3JpZ2luYWxTaXplLmhlaWdodCAqIDF9O1x0XHJcblx0XHR0aGlzLnVwZGF0ZSgpO1xyXG5cdFx0Ly9cclxuXHRcdGxldCBfc2NyZWVuV2lkdGggPSAkKCB3aW5kb3cgKS53aWR0aCgpO1xyXG4gICAgXHRsZXQgX3BkZldpZHRoID0gcGFyc2VJbnQoJChcIi5wZGYtcGFnZS1jYW52YXNcIikuYXR0cihcIndpZHRoXCIpKTtcclxuXHRcdF9wZGZXaWR0aCA9IF9wZGZXaWR0aCAqIHRoaXMuX2RlZmF1bHRTZXQuejtcclxuXHRcdGxldCBfbGVmdENhbnZhcyA9IChfc2NyZWVuV2lkdGggLSAoX3NjcmVlbldpZHRoICogdGhpcy5fZGVmYXVsdFNldC56KSkgLyAyO1xyXG5cdFx0bGV0IF9kaWZmTGVmdCA9IChfc2NyZWVuV2lkdGggLSBfcGRmV2lkdGgpIC8gMjtcclxuXHRcdHRoaXMuX2RlZmF1bHRTZXQueCA9IChfbGVmdENhbnZhcyAtIF9kaWZmTGVmdCArIDUpICogKC0xKTtcclxuXHRcdC8vIC8vXHJcblx0XHRsZXQgX3BkZkRvY0hlaWdodCA9ICQoXCIjZG9jdW1lbnQtcHJldmlld1wiKS5oZWlnaHQoKTtcclxuXHRcdGlmIChfcGRmRG9jSGVpZ2h0IDw9IDAgKSB7XHJcblx0XHRcdF9wZGZEb2NIZWlnaHQgPSAyODA7XHJcblx0XHR9XHJcblx0XHR0aGlzLl9kZWZhdWx0U2V0LnkgPSAoKF9wZGZEb2NIZWlnaHQgLSAoX3BkZkRvY0hlaWdodCAqIHRoaXMuX2RlZmF1bHRTZXQueikpLzIpICogKC0xKTtcdFx0XHJcblx0XHQvL1xyXG5cdFx0XHJcblx0XHR0aGlzLl9jdXJyZW50LnggPSB0aGlzLl9kZWZhdWx0U2V0LnhcclxuXHRcdHRoaXMuX2N1cnJlbnQueSA9IHRoaXMuX2RlZmF1bHRTZXQueTtcclxuXHRcdHRoaXMuX2N1cnJlbnQueiA9IHRoaXMuX2RlZmF1bHRTZXQuejtcclxuXHJcblx0XHR0aGlzLl9sYXN0LnggPSB0aGlzLl9kZWZhdWx0U2V0LnhcclxuXHRcdHRoaXMuX2xhc3QueSA9IHRoaXMuX2RlZmF1bHRTZXQueTtcclxuXHRcdHRoaXMuX2xhc3QueiA9IHRoaXMuX2RlZmF1bHRTZXQuejtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0dXBkYXRlKCk6dm9pZCB7XHJcblx0ICB0aGlzLl9jdXJyZW50LmhlaWdodCA9IHRoaXMuX29yaWdpbmFsU2l6ZS5oZWlnaHQgKiB0aGlzLl9jdXJyZW50Lno7XHJcblx0ICB0aGlzLl9jdXJyZW50LndpZHRoID0gdGhpcy5fb3JpZ2luYWxTaXplLndpZHRoICogdGhpcy5fY3VycmVudC56O1xyXG5cdCAgdGhpcy5fZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZTNkKFwiICsgdGhpcy5fY3VycmVudC54ICsgXCJweCwgXCIgKyB0aGlzLl9jdXJyZW50LnkgKyBcInB4LCAwKSBzY2FsZShcIiArIHRoaXMuX2N1cnJlbnQueiArIFwiKVwiO1xyXG5cdH1cclxuXHJcblx0Z2V0Q29vcmRzKGVsZW06YW55KTphbnkgeyAvLyBjcm9zc2Jyb3dzZXIgdmVyc2lvblxyXG5cdCAgdmFyIGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG5cdCAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xyXG5cdCAgdmFyIGRvY0VsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG5cclxuXHQgIHZhciBzY3JvbGxUb3AgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jRWwuc2Nyb2xsVG9wIHx8IGJvZHkuc2Nyb2xsVG9wO1xyXG5cdCAgdmFyIHNjcm9sbExlZnQgPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jRWwuc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQ7XHJcblxyXG5cdCAgdmFyIGNsaWVudFRvcCA9IGRvY0VsLmNsaWVudFRvcCB8fCBib2R5LmNsaWVudFRvcCB8fCAwO1xyXG5cdCAgdmFyIGNsaWVudExlZnQgPSBkb2NFbC5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwO1xyXG5cclxuXHQgIHZhciB0b3AgID0gYm94LnRvcCArICBzY3JvbGxUb3AgLSBjbGllbnRUb3A7XHJcblx0ICB2YXIgbGVmdCA9IGJveC5sZWZ0ICsgc2Nyb2xsTGVmdCAtIGNsaWVudExlZnQ7XHJcblxyXG5cdCAgcmV0dXJuIHsgeDogTWF0aC5yb3VuZChsZWZ0KSwgeTogTWF0aC5yb3VuZCh0b3ApIH07XHJcblx0fVxyXG5cclxuXHJcblx0Z2V0Q29vcmRpbmF0ZVNoaWZ0RHVlVG9TY2FsZShzaXplOmFueSwgc2NhbGU6YW55KTphbnl7XHJcblx0ICB2YXIgbmV3V2lkdGggPSBzY2FsZSAqIHNpemUud2lkdGg7XHJcblx0ICB2YXIgbmV3SGVpZ2h0ID0gc2NhbGUgKiBzaXplLmhlaWdodDtcclxuXHQgIHZhciBkeCA9IChuZXdXaWR0aCAtIHNpemUud2lkdGgpIC8gMjtcclxuXHQgIHZhciBkeSA9IChuZXdIZWlnaHQgLSBzaXplLmhlaWdodCkgLyAyO1xyXG5cdCAgcmV0dXJuIHtcclxuXHRcdHg6IGR4LFxyXG5cdFx0eTogZHlcclxuXHQgIH07XHJcblx0fVxyXG5cclxuXHRzY2FsZUZyb20oem9vbU9yaWdpbjphbnksIGN1cnJlbnRTY2FsZTphbnksIG5ld1NjYWxlOmFueSk6YW55IHtcclxuXHQgIHZhciBjdXJyZW50U2hpZnQgPSB0aGlzLmdldENvb3JkaW5hdGVTaGlmdER1ZVRvU2NhbGUodGhpcy5fb3JpZ2luYWxTaXplLCBjdXJyZW50U2NhbGUpO1xyXG5cdCAgdmFyIG5ld1NoaWZ0ID0gdGhpcy5nZXRDb29yZGluYXRlU2hpZnREdWVUb1NjYWxlKHRoaXMuX29yaWdpbmFsU2l6ZSwgbmV3U2NhbGUpO1xyXG5cclxuXHQgIHZhciB6b29tRGlzdGFuY2UgPSBuZXdTY2FsZSAtIGN1cnJlbnRTY2FsZVxyXG5cdCAgXHJcblx0ICB2YXIgc2hpZnQgPSB7XHJcblx0XHR4OiBjdXJyZW50U2hpZnQueCAtIG5ld1NoaWZ0LngsXHJcblx0XHR5OiBjdXJyZW50U2hpZnQueSAtIG5ld1NoaWZ0LnksXHJcblx0ICB9XHJcblxyXG5cdCAgdmFyIG91dHB1dCA9IHtcclxuXHRcdHg6IHpvb21PcmlnaW4ueCAqIHNoaWZ0LngsXHJcblx0XHR5OiB6b29tT3JpZ2luLnkgKiBzaGlmdC55LFxyXG5cdFx0ejogem9vbURpc3RhbmNlXHJcblx0ICB9XHJcblx0ICByZXR1cm4gb3V0cHV0O1xyXG5cdH1cclxuXHJcblx0Z2V0UmVsYXRpdmVQb3NpdGlvbihlbGVtZW50OmFueSwgcG9pbnQ6YW55LCBvcmlnaW5hbFNpemU6YW55LCBzY2FsZTphbnkpOmFueSB7XHJcblx0ICB2YXIgZG9tQ29vcmRzID0gdGhpcy5nZXRDb29yZHMoZWxlbWVudCk7XHJcblxyXG5cdCAgdmFyIGVsZW1lbnRYID0gcG9pbnQueCAtIGRvbUNvb3Jkcy54O1xyXG5cdCAgdmFyIGVsZW1lbnRZID0gcG9pbnQueSAtIGRvbUNvb3Jkcy55O1xyXG5cclxuXHQgIHZhciByZWxhdGl2ZVggPSBlbGVtZW50WCAvIChvcmlnaW5hbFNpemUud2lkdGggKiBzY2FsZSAvIDIpIC0gMTtcclxuXHQgIHZhciByZWxhdGl2ZVkgPSBlbGVtZW50WSAvIChvcmlnaW5hbFNpemUuaGVpZ2h0ICogc2NhbGUgLyAyKSAtIDE7XHJcblx0ICByZXR1cm4geyB4OiByZWxhdGl2ZVgsIHk6IHJlbGF0aXZlWSB9XHJcblx0fVxyXG5cclxuXHRpbml0RXZlbnRzKCk6dm9pZCB7XHJcblx0XHRsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuXHRcdHRoaXMuX2hhbW1lcnRpbWUub24oJ3BhbmVuZCcsIChmdW5jdGlvbihlOmFueSkge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcInBhbmVuZFwiKTtcclxuXHRcdCAgaWYgKHRoaXMuX2N1cnJlbnQuc2NhbGUgIT0gdGhpcy5fbGFzdC5zY2FsZSkge1xyXG5cdFx0ICBcdHRoaXMuX2xhc3QueCA9IHRoaXMuX2N1cnJlbnQueDtcclxuXHRcdCAgfVxyXG5cdFx0ICB0aGlzLl9sYXN0LnkgPSB0aGlzLl9jdXJyZW50Lnk7XHJcblx0XHQgIHRoaXMuX2xhc3RFdmVudCA9ICdwYW5lbmQnO1xyXG5cdFx0fSkuYmluZCh0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5faGFtbWVydGltZS5vbigncGluY2hlbmQnLCAoZnVuY3Rpb24oZTphbnkpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coXCJwaW5jaGVuZFwiKTtcclxuXHRcdCAgdGhpcy5fbGFzdC54ID0gdGhpcy5fY3VycmVudC54O1xyXG5cdFx0ICB0aGlzLl9sYXN0LnkgPSB0aGlzLl9jdXJyZW50Lnk7XHJcblx0XHQgIHRoaXMuX2xhc3QueiA9IHRoaXMuX2N1cnJlbnQuejtcclxuXHRcdCAgdGhpcy5fbGFzdEV2ZW50ID0gJ3BpbmNoZW5kJztcclxuXHRcdH0pLmJpbmQodGhpcykpO1x0XHJcblxyXG5cdFx0dGhpcy5faGFtbWVydGltZS5vbigncGluY2hzdGFydCcsIChmdW5jdGlvbihlOmFueSkge1xyXG5cdFx0ICB0aGlzLl9waW5jaFN0YXJ0LnggPSBlLmNlbnRlci54O1xyXG5cdFx0ICB0aGlzLl9waW5jaFN0YXJ0LnkgPSBlLmNlbnRlci55O1xyXG5cdFx0ICB0aGlzLl9waW5jaFpvb21PcmlnaW4gPSB0aGlzLmdldFJlbGF0aXZlUG9zaXRpb24odGhpcy5fZWxlbWVudCwgeyB4OiB0aGlzLl9waW5jaFN0YXJ0LngsIHk6IHRoaXMuX3BpbmNoU3RhcnQueSB9LCB0aGlzLl9vcmlnaW5hbFNpemUsIHRoaXMuX2N1cnJlbnQueik7XHJcblx0XHQgIHRoaXMuX2xhc3RFdmVudCA9ICdwaW5jaHN0YXJ0JztcclxuXHRcdH0pLmJpbmQodGhpcykpO1xyXG5cdFx0XHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLm9uKCdwaW5jaCcsIChmdW5jdGlvbihlOmFueSkge1xyXG5cdFx0ICBjb25zb2xlLmxvZyhcInBpbmNoXCIpO1xyXG5cdFx0ICB2YXIgZCA9IHRoaXMuc2NhbGVGcm9tKHRoaXMuX3BpbmNoWm9vbU9yaWdpbiwgdGhpcy5fbGFzdC56LCB0aGlzLl9sYXN0LnogKiBlLnNjYWxlKVxyXG5cdCAgICAgIHRoaXMuX2N1cnJlbnQueCA9IGQueCArIHRoaXMuX2xhc3QueCArIGUuZGVsdGFYO1xyXG5cdFx0ICB0aGlzLl9jdXJyZW50LnkgPSBkLnkgKyB0aGlzLl9sYXN0LnkgKyBlLmRlbHRhWTtcclxuXHRcdCAgdGhpcy5fY3VycmVudC56ID0gZC56ICsgdGhpcy5fbGFzdC56O1xyXG5cdFx0ICB0aGlzLl9sYXN0RXZlbnQgPSAncGluY2gnO1xyXG5cdFx0ICB0aGlzLnVwZGF0ZSgpO1xyXG5cdFx0fSkuYmluZCh0aGlzKSk7XHJcblx0XHRcclxuXHRcdHRoaXMuX2hhbW1lcnRpbWUub24oJ2RvdWJsZXRhcCcsIChmdW5jdGlvbihlOmFueSkge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcImRvdWJsZXRhcFwiKTtcclxuXHRcdFx0dGhpcy5zZXREZWZhdWx0U2NhbGUodGhpcy5fZGVmYXVsdFNldC56KTtcclxuXHJcblx0XHQvLyAgIHZhciBfdGhpcyA9IHRoaXM7IFxyXG5cdFx0Ly8gICB2YXIgc2NhbGVGYWN0b3IgPSAxO1xyXG5cdFx0Ly8gICBpZiAodGhpcy5fY3VycmVudC56b29taW5nID09PSBmYWxzZSkge1xyXG5cdFx0Ly8gXHR0aGlzLl9jdXJyZW50Lnpvb21pbmcgPSB0cnVlO1xyXG5cdFx0Ly8gICB9IGVsc2Uge1xyXG5cdFx0Ly8gXHR0aGlzLl9jdXJyZW50Lnpvb21pbmcgPSBmYWxzZTtcclxuXHRcdC8vIFx0c2NhbGVGYWN0b3IgPSAtc2NhbGVGYWN0b3I7XHJcblx0XHQvLyAgIH1cclxuXHJcblx0XHQvLyAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IFwiMC4zc1wiO1xyXG5cdFx0Ly8gICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG5cdFx0Ly8gXHRfdGhpcy5fZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uID0gXCJub25lXCI7XHJcblx0XHQvLyAgIH0sIDMwMClcclxuXHJcblx0XHQvLyAgIHZhciB6b29tT3JpZ2luID0gdGhpcy5nZXRSZWxhdGl2ZVBvc2l0aW9uKHRoaXMuX2VsZW1lbnQsIHsgeDogZS5jZW50ZXIueCwgeTogZS5jZW50ZXIueSB9LCB0aGlzLl9vcmlnaW5hbFNpemUsIHRoaXMuX2N1cnJlbnQueik7XHJcblx0XHQvLyAgIHZhciBkID0gdGhpcy5zY2FsZUZyb20oem9vbU9yaWdpbiwgdGhpcy5fY3VycmVudC56LCB0aGlzLl9jdXJyZW50LnogKyBzY2FsZUZhY3RvcilcclxuXHRcdC8vICAgdGhpcy5fY3VycmVudC54ICs9IGQueDtcclxuXHRcdC8vICAgdGhpcy5fY3VycmVudC55ICs9IGQueTtcclxuXHRcdC8vICAgdGhpcy5fY3VycmVudC56ICs9IGQuejtcclxuXHJcblx0XHQvLyAgIHRoaXMuX2xhc3QueCA9IHRoaXMuX2N1cnJlbnQueDtcclxuXHRcdC8vICAgdGhpcy5fbGFzdC55ID0gdGhpcy5fY3VycmVudC55O1xyXG5cdFx0Ly8gICB0aGlzLl9sYXN0LnogPSB0aGlzLl9jdXJyZW50Lno7XHJcblxyXG5cdFx0Ly8gICB0aGlzLnVwZGF0ZSgpO1xyXG5cdFx0fSkuYmluZCh0aGlzKSk7XHJcblx0XHRcclxuXHRcdFxyXG5cdFx0dGhpcy5faGFtbWVydGltZS5vbigncGFuJywgKGZ1bmN0aW9uKGU6YW55KSB7XHJcblx0XHQgIGNvbnNvbGUubG9nKFwicGFuXCIpO1xyXG5cdFx0ICBpZiAodGhpcy5fbGFzdEV2ZW50ICE9PSAncGFuJykge1xyXG5cdFx0XHR0aGlzLl9maXhIYW1tZXJqc0RlbHRhSXNzdWUgPSB7XHJcblx0XHRcdCAgeDogZS5kZWx0YVgsXHJcblx0XHRcdCAgeTogZS5kZWx0YVlcclxuXHRcdFx0fTtcclxuXHRcdCAgfTtcclxuXHJcblx0XHQgIGlmICh0aGlzLl9jdXJyZW50LnogIT0gdGhpcy5fZGVmYXVsdFNldC56KXtcclxuXHRcdFx0dGhpcy5fY3VycmVudC54ID0gdGhpcy5fbGFzdC54ICsgZS5kZWx0YVggLSB0aGlzLl9maXhIYW1tZXJqc0RlbHRhSXNzdWUueDtcclxuXHRcdCAgfVxyXG5cdFx0ICBcclxuXHRcdCAgdGhpcy5fY3VycmVudC55ID0gdGhpcy5fbGFzdC55ICsgZS5kZWx0YVkgLSB0aGlzLl9maXhIYW1tZXJqc0RlbHRhSXNzdWUueTtcclxuXHRcdCAgdGhpcy5fbGFzdEV2ZW50ID0gJ3Bhbic7XHJcblx0XHQgIHRoaXMudXBkYXRlKCk7XHJcblx0XHR9KS5iaW5kKHRoaXMpKTsgXHJcblx0XHRcclxuICAgIC8vICAgICQod2luZG93KS5yZXNpemUoZnVuY3Rpb24gKCkge1xyXG5cdC8vIFx0XHRQcm9ncmVzc0V2ZW50O1xyXG4gICAgLy8gICAgICAgIF90aGlzLnNldERlZmF1bHRTY2FsZSgpO1xyXG4gICAgLy8gICAgfSkucmVzaXplKCk7XHRcdFxyXG5cclxuXHR9XHJcblxyXG5cdFxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQb3BvdmVyIHtcclxuICAgIHByaXZhdGUgX3F1ZXJ5U2VsZWN0b3I6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihxdWVyeVNlbGVjdG9yOiBzdHJpbmcgPSBcIltkYXRhLXRvZ2dsZT1wb3BvdmVyXVwiKSB7XHJcbiAgICAgICAgdGhpcy5fcXVlcnlTZWxlY3RvciA9IHF1ZXJ5U2VsZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgYmluZFBvcG92ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BQb3BvdmVyLmJpbmRQb3BvdmVyRXZlbnRzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICQoXCJbZGF0YS10b2dnbGU9cG9wb3Zlcl1cIikucG9wb3Zlcih7XHJcbiAgICAgICAgICAgIGh0bWw6IHRydWUsXHJcbiAgICAgICAgICAgIHNhbml0aXplOiBmYWxzZSxcclxuICAgICAgICAgICAgdHJpZ2dlcjogJ2NsaWNrJyxcclxuICAgICAgICAgICAgY29udGVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSAkKHRoaXMpLmF0dHIoXCJkYXRhLXBvcG92ZXItY29udGVudFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAkKGNvbnRlbnQpLmNoaWxkcmVuKFwiLnBvcG92ZXItYm9keVwiKS5odG1sKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCgnaHRtbCcpLm9uKCdtb3VzZXVwJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm1vdXNldXAhXCIpO1xyXG4gICAgICAgICAgICBpZiAoISQoZS50YXJnZXQpLmNsb3Nlc3QoJy5wb3BvdmVyJykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibW91c2V1cC5wb3BvdmVyIVwiKTtcclxuICAgICAgICAgICAgICAgICQoJy5wb3BvdmVyJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm1vdXNldXAucG9wb3Zlci5oaWRlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyQodGhpcy5wcmV2aW91c1NpYmxpbmcpLnBvcG92ZXIoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAkKF90aGlzLl9xdWVyeVNlbGVjdG9yKS5wb3BvdmVyKCdoaWRlJyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyB3aGVuIHBvcG92ZXIncyBjb250ZW50IGlzIHNob3duXHJcbiAgICAgICAgJChcIltkYXRhLXRvZ2dsZT1wb3BvdmVyXVwiKS5vbignc2hvd24uYnMucG9wb3ZlcicsIGZ1bmN0aW9uIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgLy8gc2V0IHdoYXQgaGFwcGVucyB3aGVuIHVzZXIgY2xpY2tzIG9uIHRoZSBidXR0b25cclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNldCFcIik7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5hZnRlclBvcG92ZXJTaG93KHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgJChcIi5wb3BvdmVyTGlua1wiKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICQoXCIucG9wb3ZlckxpbmtcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInBvcG92ZXJMaW5rIGNsaWNrZWQhISFcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiW2RhdGEtdG9nZ2xlPXBvcG92ZXJdXCIpLnBvcG92ZXIoJ2hpZGUnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkKFwiLnBvcG92ZXJDbG9zZVwiKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICQoXCIucG9wb3ZlckNsb3NlXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJDbG9zZSBwb3BvdmVyIGNsaWNrZWQhISFcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiW2RhdGEtdG9nZ2xlPXBvcG92ZXJdXCIpLnBvcG92ZXIoJ2hpZGUnKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUG9wb3ZlclNob3coZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFBvcG92ZXIuYWZ0ZXJQb3BvdmVyU2hvd1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0U2VsZkNvbnRhaW5lclBvcG92ZXIoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BQb3BvdmVyLmluaXRTZWxmQ29udGFpbmVyUG9wb3ZlclwiKTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl9xdWVyeVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0ICRlbGVtID0gJCh0aGlzKTtcclxuICAgICAgICAgICAgbGV0IGVsZW0gPSB0aGlzO1xyXG4gICAgICAgICAgICAkZWxlbS5wb3BvdmVyKHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogZWxlbSxcclxuICAgICAgICAgICAgICAgIHNhbml0aXplOiBmYWxzZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGVQb3BvdmVyKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUG9wb3Zlci5lbmFibGVQb3BvdmVyXCIpO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3F1ZXJ5U2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgJGVsZW0gPSAkKHRoaXMpO1xyXG4gICAgICAgICAgICAkZWxlbS5wb3BvdmVyKCdlbmFibGUnKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlUG9wb3ZlcigpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFBvcG92ZXIuZGlzYWJsZVBvcG92ZXJcIik7XHJcblxyXG4gICAgICAgICQodGhpcy5fcXVlcnlTZWxlY3RvcikuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCAkZWxlbSA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgICRlbGVtLnBvcG92ZXIoJ2Rpc2FibGUnKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBvcHVwRGlhbG9nT3B0aW9ucyB7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgYm9keTogc3RyaW5nO1xyXG4gICAgc2hvd0NhbmNlbEJ1dHRvbjogYm9vbGVhbjtcclxuICAgIGNvbmZpcm1CdXR0b25DYXB0aW9uOiBzdHJpbmc7XHJcbiAgICBjYW5jZWxCdXR0b25DYXB0aW9uOiBzdHJpbmc7XHJcbiAgICBjb25maXJtQWN0aW9uOiBzdHJpbmc7XHJcbiAgICBjb25maXJtQWN0aW9uZGF0YTogb2JqZWN0O1xyXG4gICAgb25TdWNjZXNzOiAocGFyYW1zOmFueSkgPT4gYW55O1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5ib2R5ID0gXCJib2R5IHRleHRcIjtcclxuICAgICAgICB0aGlzLnNob3dDYW5jZWxCdXR0b24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY29uZmlybUJ1dHRvbkNhcHRpb24gPSBcIk9rXCI7XHJcbiAgICAgICAgdGhpcy5jYW5jZWxCdXR0b25DYXB0aW9uID0gXCJDYW5jZWxcIjtcclxuICAgICAgICB0aGlzLmNvbmZpcm1BY3Rpb24gPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuY29uZmlybUFjdGlvbmRhdGEgPSB7fTtcclxuICAgICAgICB0aGlzLm9uU3VjY2VzcyA9IG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUG9wdXBEaWFsb2cge1xyXG4gICAgcHJpdmF0ZSBfb3B0aW9uczpTYW9wUG9wdXBEaWFsb2dPcHRpb25zO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOlNhb3BQb3B1cERpYWxvZ09wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgIH0gICAgXHJcbiAgICBcclxuICAgIHNhdmUoY2FsbGJhY2s6IChuOiBudW1iZXIpID0+IGFueSkgOiB2b2lkIHtcclxuICAgICAgICBjYWxsYmFjayg0Mik7XHJcbiAgICB9XHJcblxyXG4gICAgU2hvd0xvYWRpbmdTYW9wKCkge1xyXG4gICAgICAgIHZhciBvYmogPSAkKFwiI3Nhb3BMb2FkaW5nXCIpO1xyXG4gICAgICAgIGlmIChvYmoubGVuZ3RoKVxyXG4gICAgICAgICAgICBvYmouc2hvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIEhpZGVMb2FkaW5nU2FvcCgpIHtcclxuICAgICAgICB2YXIgb2JqID0gJChcIiNzYW9wTG9hZGluZ1wiKTtcclxuICAgICAgICBpZiAob2JqLmxlbmd0aClcclxuICAgICAgICAgICAgb2JqLmhpZGUoKTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgU2hvd1BvcHVwRGlhbG9nKCk6dm9pZCB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAvLyBEaXNwbGF5IGluZm8gbWVzc2FnZSB0byB0aGUgdXNlciBpbiBhIG1vZGFsXHJcbiAgICAgICAgbGV0IHRpdGxlRGl2ID0gJCgnI2luZm8tbW9kYWwtdGl0bGUtZGl2Jyk7XHJcbiAgICAgICAgbGV0IHRpdGxlSCA9ICQoJyNpbmZvLW1vZGFsLXRpdGxlJyk7XHJcbiAgICAgICAgbGV0IGNvbmZpcm1CdXR0b24gPSAkKCcjaW5mby1tb2RhbC1idG4tb2snKTtcclxuICAgICAgICBsZXQgY2FuY2VsQnV0dG9uID0gJCgnI2luZm8tbW9kYWwtYnRuLWNhbmNlbCcpO1xyXG5cclxuICAgICAgICBjYW5jZWxCdXR0b24uaHRtbCh0aGlzLl9vcHRpb25zLmNhbmNlbEJ1dHRvbkNhcHRpb24pO1xyXG5cclxuICAgICAgICAvLyBzaG93IG9yIGhpZGUgaGVhZGVyIGRpdiBiYXNlZCBvbiB0aXRsZSBwcm9wZXJ0eVxyXG4gICAgICAgIHRpdGxlRGl2LmNzcyhcImRpc3BsYXlcIiwgXCJcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMudGl0bGUpIHtcclxuICAgICAgICAgICAgdGl0bGVILmh0bWwodGhpcy5fb3B0aW9ucy50aXRsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aXRsZURpdi5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmNvbmZpcm1CdXR0b25DYXB0aW9uKXtcclxuICAgICAgICAgICAgY29uZmlybUJ1dHRvbi5odG1sKHRoaXMuX29wdGlvbnMuY29uZmlybUJ1dHRvbkNhcHRpb24pO1xyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uLmNzcyhcImRpc3BsYXlcIiwgXCJcIik7ICAgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZmlybUJ1dHRvbi5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnNob3dDYW5jZWxCdXR0b24pIHtcclxuICAgICAgICAgICAgY2FuY2VsQnV0dG9uLmh0bWwodGhpcy5fb3B0aW9ucy5jYW5jZWxCdXR0b25DYXB0aW9uKTtcclxuICAgICAgICAgICAgY2FuY2VsQnV0dG9uLmNzcyhcImRpc3BsYXlcIiwgXCJcIik7ICAgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2FuY2VsQnV0dG9uLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCgnI2luZm8tbW9kYWwtYm9keScpLmh0bWwodGhpcy5fb3B0aW9ucy5ib2R5KTtcclxuXHJcbiAgICAgICAgJChcIiNpbmZvLW1vZGFsLWJ0bi1va1wiKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMucG9wdXBEaWFsb2dDb25maXJtKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAkKCcjaW5mby1tb2RhbCcpLm9uKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAkKFwiI2luZm8tbW9kYWwtYnRuLW9rXCIpLnVuYmluZChcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMpLm1vZGFsKCdkaXNwb3NlJyk7XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgJCgnI2luZm8tbW9kYWwnKS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgIGdsb2JhbC5zZXRNb2RhbEZvcm1aSW5kZXgoJyNpbmZvLW1vZGFsJyk7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHBvcHVwRGlhbG9nQ29uZmlybSgpIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBjYW5jZWxCdXR0b24gPSAkKCcjaW5mby1tb2RhbC1idG4tY2FuY2VsJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmNvbmZpcm1BY3Rpb24gIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogdGhpcy5fb3B0aW9ucy5jb25maXJtQWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLl9vcHRpb25zLmNvbmZpcm1BY3Rpb25kYXRhLFxyXG4gICAgICAgICAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24gKCkgeyBfdGhpcy5TaG93TG9hZGluZ1Nhb3AoKTsgfSxcclxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7IF90aGlzLkhpZGVMb2FkaW5nU2FvcCgpOyB9LFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi50cmlnZ2VyKFwiY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKF90aGlzLl9vcHRpb25zLm9uU3VjY2VzcyAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9vcHRpb25zLm9uU3VjY2VzcyhyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi50cmlnZ2VyKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQocmVzcG9uc2UucmVzcG9uc2VKU09OLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vY2xvc2UgZGlhbG9nXHJcbiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi50cmlnZ2VyKFwiY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5vblN1Y2Nlc3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vblN1Y2Nlc3MobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5cclxuZXhwb3J0IGVudW0gU2FvcFJpZ2h0U2lkZWJhclZpZXcge1xyXG4gICAgRGFzaGJvYXJkID0gMFxyXG4gICAgLEFic2VuY2UgPSAxXHJcbiAgICAsQXR0ZW5kYW5jZURheSA9IDJcclxuICAgICxBdHRlbmRhbmNlTW9udGggPSAzICAgIFxyXG4gICAgLFRyYXZlbE9yZGVycyA9IDRcclxuICAgICxJbnRlcm5hbE9yZGVycyA9IDVcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSaWdodFNpZGViYXIge1xyXG4gICAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZSA6U2FvcFNlcnZpY2VzQ29yZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYmluZENhcm91c2VsRGl2KGNvbnRlbnRJZDpzdHJpbmcsdmlldzpTYW9wUmlnaHRTaWRlYmFyVmlldyl7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSaWdodFNpZGViYXIuYmluZERpdlwiKTsgXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoY29udGVudElkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIlJpZ2h0U2lkZUJhci9HZXRDYXJvdXNlbFZpZXc/dmlldz1cIit2aWV3LnRvU3RyaW5nKClcclxuICAgICAgICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdTaWRlYmFyclwiXHJcbiAgICAgICAgICAgICxhc3luYzpmYWxzZVxyXG4gICAgICAgIH0pOyAgICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaERvcHVzdFphS29yaXNjZW5qZVN1bW1hcnkoY29udGVudElkOiBzdHJpbmcsIHNwaW5uZXJEaXZJZDogc3RyaW5nID0gXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSaWdodFNpZGViYXIucmVmcmVzaERvcHVzdFphS29yaXNjZW5qZVN1bW1hcnlcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAkKGNvbnRlbnRJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJSaWdodFNpZGVCYXIvRG9wdXN0WmFLb3Jpc2NlbmplU3VtbWFyeVBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDogc3Bpbm5lckRpdklkXHJcbiAgICAgICAgfSk7ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoVXJlWmFLb3Jpc2NlbmplU3VtbWFyeShjb250ZW50SWQ6IHN0cmluZywgc3Bpbm5lckRpdklkOiBzdHJpbmcgPSBcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoVXJlWmFLb3Jpc2NlbmplU3VtbWFyeVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoY29udGVudElkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIlJpZ2h0U2lkZUJhci9VcmVaYUtvcmlzY2VuamVTdW1tYXJ5UGFydGlhbFwiXHJcbiAgICAgICAgICAgICxkYXRhOm51bGxcclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgICAgICAsc3Bpbm5lckRpdklkOiBzcGlubmVyRGl2SWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoUmVnVXJhRG9nb2RraVN1bW1hcnkoY29udGVudElkOiBzdHJpbmcsIHNlbGVjdGVkUGVyaW9kOnN0cmluZywgc3Bpbm5lckRpdklkOnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmlnaHRTaWRlYmFyLnJlZnJlc2hSZWdVcmFEb2dvZGtpU3VtbWFyeVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoY29udGVudElkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIlJpZ2h0U2lkZUJhci9SZWdVcmFEb2dvZGtpU3VtbWFyeVBhcnRpYWw/c2VsZWN0ZWRQZXJpb2Q9XCIrc2VsZWN0ZWRQZXJpb2RcclxuICAgICAgICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6c3Bpbm5lckRpdklkXHJcbiAgICAgICAgICAgIC8vLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoUmVnT1BOUG90bmlOYWxvZ2lTdW1tYXJ5KGNvbnRlbnRJZDogc3RyaW5nLCBzcGlubmVyRGl2SWQ6c3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSaWdodFNpZGViYXIucmVmcmVzaFJlZ09QTlBvdG5pTmFsb2dpU3VtbWFyeVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoY29udGVudElkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIlRyYXZlbE9yZGVyL1RyYXZlbE9yZGVyc1N1bW1hcnlcIlxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpzcGlubmVyRGl2SWRcclxuICAgICAgICAgICAgLy8sc3Bpbm5lckRpdklkOlwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hOZGtJbnRlcm5hbE9yZGVyc1N1bW1hcnkoY29udGVudElkOiBzdHJpbmcsIHNwaW5uZXJEaXZJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSaWdodFNpZGViYXIucmVmcmVzaE5ka0ludGVybmFsT3JkZXJzU3VtbWFyeVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIlJpZ2h0U2lkZUJhci9JbnRlcm5hbE9yZGVyc1N1bW1hcnlcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IG51bGxcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBzcGlubmVyRGl2SWRcclxuICAgICAgICAgICAgLy8sc3Bpbm5lckRpdklkOlwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v1xyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BJbnB1dFdGTFByb3BlcnRpZXMge1xyXG4gICAgaWQ6c3RyaW5nO1xyXG4gICAgcGxhY2Vob2xkZXI6c3RyaW5nO1xyXG4gICAgY2FwdGlvbjpzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wc2VsZWN0V0ZMIHtcclxuICAgIHByaXZhdGUgX2lucHV0VGVtcGxhdGU6c3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczpTYW9wSW5wdXRXRkxQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgdGhpcy5faW5wdXRUZW1wbGF0ZSA9IFxyXG4gICAgICAgIGBcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImhhcy1mbG9hdC1sYWJlbCBzYW9wLWRyb3Bkb3duIHNlbGVjdEVsZW1lbnRcIj5cclxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBzaGFkb3ctbm9uZSBzYW9wLWNvbnRyb2wgc2FvcC1jaGlsZC1zZWxlY3RcIiBkYXRhLWNob3Nlbj1cIlRcIiBpZD1cIiR7cHJvcGVydGllcy5pZH1cIiBuYW1lPVwiJHtwcm9wZXJ0aWVzLmlkfVwiIHRhYmluZGV4PVwiMFwiIHN0eWxlPVwiaGVpZ2h0OiAzMHB4O3BhZGRpbmc6IDAuMDc1cmVtIDAuNzVyZW07XCI+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIvPlxyXG4gICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic2FvcC1mbG9hdGluZy1sYWJlbFwiIGZvcj1cIiR7cHJvcGVydGllcy5pZH1cIj4ke3Byb3BlcnRpZXMuY2FwdGlvbn08L2xhYmVsPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInNlbGVjdC1kcm9wZG93biBzYW9wLWltZy1kb3duIHNpLXNcIi8+XHJcbiAgICAgICAgPC9zcGFuPiAgICAgXHJcbiAgICAgICAgYDsgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGdldEVsZW1lbnQoKTpKUXVlcnk8SFRNTEVsZW1lbnQ+e1xyXG4gICAgICAgIGxldCBfZWxlbWVudCA9ICQodGhpcy5faW5wdXRUZW1wbGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldElubmVySHRtbCgpOnN0cmluZ3tcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRUZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLyBrbmppem5pY2E6IGh0dHBzOi8vc2VsZWN0aXplLmRldi9cclxuXHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvc2VsZWN0aXplLXNlbGVjdC9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgIGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2VsZWN0T3B0aW9uIH0gZnJvbSBcIi4vc2FvcC1tdWx0aXNlbGVjdFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BTZWxlY3RpemVTZWxlY3Qge1xyXG4gICAgcHJpdmF0ZSBsaWJOYW1lOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF92aWV3SWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RpemVDb250cm9sOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZyA9IFwiXCIsIGlkOiBzdHJpbmcgPSBcIlwiLCBsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLl92aWV3SWQgPSB2aWV3SWQ7XHJcbiAgICAgICAgdGhpcy5faWQgPSBpZDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lkICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aXplQ29udHJvbCA9ICQodGhpcy5fdmlld0lkICsgXCIgXCIgKyB0aGlzLl9pZClbMF07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuaW5pdFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbmljaWFsaXplQmluZEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb250cm9sQnlKUXVlcnkoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5pdFNlbGVjdGl6ZVNlbGVjdChlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0Q29udHJvbEJ5SHRtbChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5pdFNlbGVjdGl6ZVNlbGVjdCgkKGVsZW1lbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0TXVsdGlzZWxlY3RDb250cm9sQnlIdG1sKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0aXplTXVsdGlzZWxlY3QoJChlbGVtZW50KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFsdWUoKTogc3RyaW5nIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5nZXRWYWx1ZVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuICQodGhpcy5fdmlld0lkICsgXCIgXCIgKyB0aGlzLl9pZCkuYXR0cihcImRhdGEtY2hvc2VuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE11bHRpc2VsZWN0VmFsdWVzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5nZXRNdWx0aXNlbGVjdFZhbHVlc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IHJldFZhbHVlOiBzdHJpbmdbXSA9IFtdOyBcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX2lkICsgXCIgb3B0aW9uOnNlbGVjdGVkXCIpLmVhY2goZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgICAgICByZXRWYWx1ZS5wdXNoKCQodGhpcykudmFsKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXRWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRTZWxlY3RpemVTZWxlY3QoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmluaXRTZWxlY3RpemVTZWxlY3QuLi5cIik7XHJcblxyXG4gICAgICAgIGVsZW1lbnQuc2VsZWN0aXplKHtcclxuICAgICAgICAgICAgc29ydEZpZWxkOiAndGV4dCcsXHJcbiAgICAgICAgICAgIGFsbG93RW1wdHlPcHRpb246IHRydWUsXHJcbiAgICAgICAgICAgIHJlbmRlcjoge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9uOiBmdW5jdGlvbiAoaXRlbTogYW55LCBlc2NhcGU6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IGl0ZW0udGV4dDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FwdGlvbiA9IGl0ZW0udmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiPGRpdj5cIiArICc8c3BhbiBjbGFzcz1cImxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6MTNweFwiPicgKyBlc2NhcGUobGFiZWwpICsgXCI8L3NwYW4+XCIgKyBcIjwvZGl2PlwiO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25Gb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJGlucHV0LnZhbCgpID09PSBcIj9cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmluaXRTZWxlY3RpemVTZWxlY3QuLi5kb25lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNlbGVjdGl6ZU11bHRpc2VsZWN0KGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5pbml0U2VsZWN0aXplTXVsdGlzZWxlY3QuLi5cIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGVsZW1lbnQuc2VsZWN0aXplKHtcclxuICAgICAgICAgICAgZGVsaW1pdGVyOiBcInxcIixcclxuICAgICAgICAgICAgcGVyc2lzdDogZmFsc2UsXHJcbiAgICAgICAgICAgIG1heEl0ZW1zOiBudWxsLFxyXG4gICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uIChpbnB1dDogYW55KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpbnB1dCxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBpbnB1dCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzZWxWYWx1ZXMgPSB0aGlzLml0ZW1zO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNlIGplIHNhbW8gZW4gZWxlbWVudCBpbiB0YSBcIj9cIiwgemJyaXNlbW8gc2V6bmFtLCBkYSBzZSBmbG9hdGluZyBsYWJlbCB1bWFrbmUgaXogdnZub3NuZSBrb250cm9sZVxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbFZhbHVlcy5sZW5ndGggPT0gMSAmJiBzZWxWYWx1ZXNbMF0udHJpbSgpID09PSBcIj9cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gICAgICAgICAgIFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5pbml0U2VsZWN0aXplU2VsZWN0Li4uZG9uZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaWNpYWxpemVCaW5kRXZlbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmluaWNpYWxpemVCaW5kRXZlbnRzXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzOyBcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX2lkKS5jaGFuZ2UoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9ICQodGhpcykudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgX3RoaXMudmFsdWVDaGFuZ2VkKGRhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbHVlQ2hhbmdlZCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QudmFsdWVDaGFuZ2VkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5zZXRWYWx1ZVwiKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VmFsdWVzKHZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5zZXRWYWx1ZXNcIik7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aXplQ29udHJvbC5zZWxlY3RpemUuc2V0VmFsdWUodmFsdWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhclZhbHVlKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmNsZWFyVmFsdWVcIik7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aXplQ29udHJvbC5zZWxlY3RpemUuY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoT3B0aW9ucyhvcHRpb25MaXN0OiBTZWxlY3RPcHRpb25bXSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LnJlZnJlc2hPcHRpb25zXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyB6YnJpc2VtbyBpemJyYW5vIG9wY2lqbywgZHJ1Z2FjZSBvc3RhbmUgbm90cmkga290IG9wY2lqYVxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGl6ZUNvbnRyb2wuc2VsZWN0aXplLmNsZWFyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGl6ZUNvbnRyb2wuc2VsZWN0aXplLmNsZWFyT3B0aW9ucygpO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9uTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbkxpc3QuZm9yRWFjaChlbGVtZW50ID0+XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fc2VsZWN0aXplQ29udHJvbC5zZWxlY3RpemUuYWRkT3B0aW9uKHsgdmFsdWU6IGVsZW1lbnQudmFsdWUsIHRleHQ6IGVsZW1lbnQudGV4dCB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmRpc2FibGVcIik7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aXplQ29udHJvbC5zZWxlY3RpemUuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUb2dnbGVQYW5lbCB7XHJcblxyXG4gICAgaW5pdCgpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUb2dnbGVQYW5lbC5pbml0Li4uXCIpO1xyXG4gICAgICAgIHRoaXMuc2V0Q2xpY2tFdmVudE9uRnJhbWUoXCJib2R5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldENsaWNrRXZlbnRPbkZyYW1lKGZyYW1lTmFtZTpzdHJpbmcgPSBcImJvZHlcIik6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUb2dnbGVQYW5lbC5zZXRDbGlja0V2ZW50T25GcmFtZS4uLlwiKTtcclxuXHJcbiAgICAgICAgbGV0IF9mcmFtZSA9ICQoXCJcIitmcmFtZU5hbWUrXCIgKj4gLnNhb3AtdG9nZ2xlLXBhbmVsXCIpO1xyXG4gICAgICAgIF9mcmFtZS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICBfZnJhbWUuY2xpY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvL25hIGtsaWsgc2UgcHXFocSNaWNhIG9icm5lIGdvciAvIGRvbFxyXG4gICAgICAgICAgICB2YXIgYXJyb3dEaXYgPSAkKHRoaXMpLmZpbmQoXCIuc2FvcC10b2dnbGUtYXJyb3dcIik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycm93RGl2Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXJyb3dEaXZbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKFwic2FvcC1pbWctZG93blwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFycm93RGl2W2ldLmNsYXNzTGlzdC5yZW1vdmUoXCJzYW9wLWltZy1kb3duXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFycm93RGl2W2ldLmNsYXNzTGlzdC5hZGQoXCJzYW9wLWltZy11cFwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dEaXZbaV0uY2xhc3NMaXN0LnJlbW92ZShcInNhb3AtaW1nLXVwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFycm93RGl2W2ldLmNsYXNzTGlzdC5hZGQoXCJzYW9wLWltZy1kb3duXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2RhdGEtdGFibGVzL3R5cGVzLmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuaW1wb3J0IHsgU2FvcE1lc3NhZ2VEbGcsIFNhb3BNc2dEbGdCdXR0b24gfSBmcm9tIFwiLi9zYW9wLW1lc3NhZ2UtZGxnXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyZWV2aWV3IHtcclxuICAgIHByaXZhdGUgX3ZpZXdJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBsaWJOYW1lOiBzdHJpbmc7ICBcclxuICAgIHByaXZhdGUgX3RyYW5zbGF0aW9uU2VydmljZTogU2FvcFRyYW5zbGF0aW9uU2VydmljZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fdmlld0lkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuaW5pdFwiKTtcclxuXHJcbiAgICAgICAgLy8gcHJldmFqYW5qZVxyXG4gICAgICAgIHRoaXMuc2V0Rm9ybVRlcm1pbm9sb2d5TGlzdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRFdmVudExpc3RuZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRGb3JtVGVybWlub2xvZ3lMaXN0KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuc2V0Rm9ybVRlcm1pbm9sb2d5TGlzdFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHRlcm1pbm9sb2d5ID0gW1wiTmkgcG9kYXRrb3YgemEgcHJpa2F6LlwiLCBcIkJyaXNhbmplXCIsIFwiQWxpIHN0ZSBwcmVwcmnEjWFuaSwgZGEgxb5lbGl0ZSBpemJyaXNhdGkgZWxlbWVudD9cIl07XHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QodGVybWlub2xvZ3kpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEV2ZW50TGlzdG5lcnMoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5pbml0RXZlbnRMaXN0bmVyc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9mZihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctZXhwYW5kLWNvbGFwc2VcIik7IFxyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vbihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctZXhwYW5kLWNvbGFwc2VcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuc2FvcC10cmVldmlldy1leHBhbmQtY29sYXBzZS5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBfdGhpcy50cmVldmlld0V4cGFuZENvbGFwc2UodGhpcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vZmYoXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWl0ZW0tZGVsZXRlXCIpO1xyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vbihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1kZWxldGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuc2FvcC10cmVldmlldy1pdGVtLWRlbGV0ZS5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBfdGhpcy5kZWxldGVUcmVldmlld0l0ZW0odGhpcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vZmYoXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWl0ZW0tYWRkU3ViSXRlbVwiKTtcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub24oXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWl0ZW0tYWRkU3ViSXRlbVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zYW9wLXRyZWV2aWV3LWl0ZW0tYWRkU3ViSXRlbS5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBfdGhpcy5hZGRUcmVldmlld1N1Ykl0ZW0odGhpcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vZmYoXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWl0ZW0taW5zZXJ0SXRlbVwiKTtcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub24oXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWl0ZW0taW5zZXJ0SXRlbVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zYW9wLXRyZWV2aWV3LWl0ZW0taW5zZXJ0SXRlbS5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBfdGhpcy5pbnNlcnRJdGVtKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub2ZmKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1pdGVtLWVkaXRcIik7XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9uKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1pdGVtLWVkaXRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuc2FvcC10cmVldmlldy1pdGVtLWVkaXQuY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgX3RoaXMuZWRpdFRyZWV2aWV3SXRlbSh0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9mZihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctYWRkLWl0ZW0tYnRuXCIpO1xyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vbihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctYWRkLWl0ZW0tYnRuXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnNhb3AtdHJlZXZpZXctYWRkLWl0ZW0tYnRuLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIF90aGlzLmFkZFRyZWV2aWV3SXRlbSh0aGlzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyZWV2aWV3RXhwYW5kQ29sYXBzZShlbGVtOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnRyZWV2aWV3RXhwYW5kQ29sYXBzZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IGlkID0gJChlbGVtKS5hdHRyKFwiZGF0YS10b29nbGVlbGVtZW50c2lkXCIpO1xyXG4gICAgICAgIGxldCBjb2xsYXBzZUl0ZW1zID0gJChlbGVtKS5oYXNDbGFzcyhcInNhb3AtaW1nLWRvd25cIik7XHJcblxyXG4gICAgICAgICQoZWxlbSkudG9nZ2xlQ2xhc3MoXCJzYW9wLWltZy1kb3duXCIpO1xyXG4gICAgICAgICQoZWxlbSkudG9nZ2xlQ2xhc3MoXCJzYW9wLWltZy1yaWdodFwiKTtcclxuXHJcbiAgICAgICAgLy8gc2hvdy9oaWRlXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyBcIiBkaXYuc2FvcC10cmVldmlldy1pdGVtLWNvbnRhaW5lcltkYXRhLXBhcmVudGlkPSdcIiArIGlkICsgXCInXVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleDogbnVtYmVyLCBjaGlsZEVsZW06IGFueSkge1xyXG4gICAgICAgICAgICBpZiAoY29sbGFwc2VJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgJChjaGlsZEVsZW0pLmhpZGUoXCJmYXN0XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChjaGlsZEVsZW0pLnNob3coXCJmYXN0XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7ICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVsZXRlVHJlZXZpZXdJdGVtKGVsZW06IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5kZWxldGVUcmVldmlld0l0ZW1cIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IGRlbGV0ZVRpdGxlID0gdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkJyaXNhbmplXCIpO1xyXG4gICAgICAgIGxldCBkZWxldGVNZXNzYWdlID0gdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkFsaSBzdGUgcHJlcHJpxI1hbmksIGRhIMW+ZWxpdGUgaXpicmlzYXRpIGVsZW1lbnQ/XCIpO1xyXG5cclxuICAgICAgICBsZXQgc2FvcE1lc3NhZ2VEbGcgPSBuZXcgU2FvcE1lc3NhZ2VEbGcobnVsbCk7XHJcbiAgICAgICAgc2FvcE1lc3NhZ2VEbGcub25ZZXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIHBvaXNjZW1vIHBhcmVudCB6IGtsYXNvbSBzYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyIGluIGdhIG9kc3RyYW5pbW8gdGVyIHZzZSBjaGlsZHJlZW5cclxuICAgICAgICAgICAgbGV0IHRlbXBFbGVtZW50ID0gZWxlbTtcclxuICAgICAgICAgICAgbGV0IHBhcmVudGlkID0gMDtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVtcEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2FvcC10cmVldmlldy1pdGVtLWNvbnRhaW5lclwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudGlkID0gZ2xvYmFsLmNvbnZlcnRTdHJpbmcyTnVtYmVyKHRlbXBFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtcGFyZW50aWRcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG9kc3RyYW5pbW8gZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBFbGVtZW50LmlubmVySFRNTCA9IFwiXCI7IFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGVtcEVsZW1lbnQgPSB0ZW1wRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRpZCAhPSBudWxsICYmIHBhcmVudGlkID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gYWxpIGplIHNlIGthaiBvc3RhbGloIGNoaWxkIGVsZW1lbnRvdiB6IGlzdGltIHBhcmVudElkP1xyXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVlbkNvdW50ID0gJChfdGhpcy5fdmlld0lkICsgJyBkaXYuc2FvcC10cmVldmlldy1pdGVtLWNvbnRhaW5lcltkYXRhLXBhcmVudGlkPVwiJyArIHBhcmVudGlkICsgJ1wiXScpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlZW5Db3VudCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gemJyaXNhbGkgemFkbmplZ2EgY2hpbGQgZWxlbWVudCwgc2tyaWplbW8gZXhwYW5kL2NvbGxhcHNlIGlrb25vIHBhcmVudCBlbGVtZW50YVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRFbGVtZW50ID0gJChfdGhpcy5fdmlld0lkICsgJyBkaXYuc2FvcC10cmVldmlldy1pdGVtW2RhdGEtaWQ9XCInICsgcGFyZW50aWQgKyAnXCJdJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXhwYW5kQ29sbGFwc2VFbGVtID0gJChwYXJlbnRFbGVtZW50KS5maW5kKFwiLnNhb3AtdHJlZXZpZXctZXhwYW5kLWNvbGFwc2VcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBhbmRDb2xsYXBzZUVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kQ29sbGFwc2VFbGVtLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcE1lc3NhZ2VEbGcuU2hvdyhkZWxldGVNZXNzYWdlLCBkZWxldGVUaXRsZSwgMSwgW1Nhb3BNc2dEbGdCdXR0b24ubWJZZXMsIFNhb3BNc2dEbGdCdXR0b24ubWJOb10pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkVHJlZXZpZXdTdWJJdGVtKGFkZFN1Ykl0ZW1CdXR0b25FbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuYWRkVHJlZXZpZXdTdWJJdGVtXCIpO1xyXG5cclxuICAgICAgICAvLyBwcmlrYXplbW8gZXhwYW5kL2NvbGxhcHNlIGlrb25vOlxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHBhcmVudCwga2kgaW1hIGtsYXMgc2FvcC10cmVldmlldy1pdGVtLWluZm8sXHJcbiAgICAgICAgbGV0IHBhcmVudEVsZW0gPSBhZGRTdWJJdGVtQnV0dG9uRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50RWxlbS5jbGFzc0xpc3QuY29udGFpbnMoXCJzYW9wLXRyZWV2aWV3LWl0ZW0taW5mb1wiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gcG9pc2NlbW8gbmplZ292IGNoaWxkLCBraSBpbWEga2xhcyBzYW9wLXRyZWV2aWV3LWV4cGFuZC1jb2xhcHNlXHJcbiAgICAgICAgICAgICAgICBsZXQgZXhwYW5kQ29sbGFwc2VFbGVtID0gJChwYXJlbnRFbGVtKS5maW5kKFwiLnNhb3AtdHJlZXZpZXctZXhwYW5kLWNvbGFwc2VcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhwYW5kQ29sbGFwc2VFbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBleHBhbmRDb2xsYXBzZUVsZW0uc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyZW50RWxlbSA9IHBhcmVudEVsZW0ucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHBvaXNjaSBtYXggSWQgVHJlZXZpZXdzIGluIGdhIHBvdmVjYW1vIHphIDFcclxuICAgICAgICBsZXQgbmV3U3ViSXRlbUlkID0gdGhpcy5nZXRNYXhUcmVldmlld0lkKCkgKyAxO1xyXG4gICAgICAgIC8vIHBhcmVudCBJZFxyXG4gICAgICAgIGxldCBuZXdTdWJJdGVtUGFyZW50SWQgPSBnbG9iYWwuY29udmVydFN0cmluZzJOdW1iZXIoJChhZGRTdWJJdGVtQnV0dG9uRWxlbWVudCkuYXR0cihcImRhdGEtcGFyZW50aWRcIikpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZFRyZWV2aWV3U3ViSXRlbUV4dGVybmFsKGFkZFN1Ykl0ZW1CdXR0b25FbGVtZW50LCBuZXdTdWJJdGVtSWQsIG5ld1N1Ykl0ZW1QYXJlbnRJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNYXhUcmVldmlld0lkKCk6IG51bWJlciB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5nZXRNYXhUcmVldmlld0lkXCIpO1xyXG5cclxuICAgICAgICBsZXQgbWF4SWQgPSAwXHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgLnNhb3AtdHJlZXZpZXctaXRlbVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgaHRtbFRyZWV2aWV3SXRlbSkge1xyXG4gICAgICAgICAgICBsZXQgaWQgPSBnbG9iYWwuY29udmVydFN0cmluZzJOdW1iZXIoaHRtbFRyZWV2aWV3SXRlbS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpKTtcclxuICAgICAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQgPiBtYXhJZCkge1xyXG4gICAgICAgICAgICAgICAgbWF4SWQgPSBpZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbWF4SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFRyZWV2aWV3U3ViSXRlbUV4dGVybmFsKGFkZFN1Ykl0ZW1CdXR0b25FbGVtZW50OiBIVE1MRWxlbWVudCwgbmV3U3ViSXRlbUlkOiBudW1iZXIsIG5ld1N1Ykl0ZW1QYXJlbnRJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5hZGRUcmVldmlld1N1Ykl0ZW1FeHRlcm5hbFwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBtZXRvZG8gdXBvcmFibGphIGNsaWVudCwgdnJuZSBjb250ZW50LCBraSBqbyBkb2RhbW8gdiB0cmVldmlld1xyXG4gICAgcHVibGljIGFkZFRyZWV2aWV3U3ViSXRlbUNvbnRlbnQoYWRkU3ViSXRlbUJ1dHRvbkVsZW1lbnQ6IEhUTUxFbGVtZW50LCBuZXdTdWJJdGVtSWQ6IG51bWJlciwgbmV3U3ViSXRlbVBhcmVudElkOiBudW1iZXIsIGh0bWxDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmFkZFRyZWV2aWV3U3ViSXRlbUNvbnRlbnRcIik7XHJcblxyXG4gICAgICAgIGxldCBlbGVtUGFyZW50ID0gJCh0aGlzLl92aWV3SWQgKyAnIGRpdi5zYW9wLXRyZWV2aWV3LWl0ZW1bZGF0YS1pZD1cIicgKyBuZXdTdWJJdGVtUGFyZW50SWQgKyAnXCJdJyk7XHJcbiAgICAgICAgZWxlbVBhcmVudC5hcHBlbmQoaHRtbENvbnRlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkVHJlZXZpZXdJdGVtKGFkZEl0ZW1CdXR0b25FbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuYWRkVHJlZXZpZXdJdGVtXCIpO1xyXG5cclxuICAgICAgICAvLyBwb2lzY2kgbWF4IElkIFRyZWV2aWV3cyBpbiBnYSBwb3ZlY2FtbyB6YSAxXHJcbiAgICAgICAgbGV0IG5ld0l0ZW1JZCA9IHRoaXMuZ2V0TWF4VHJlZXZpZXdJZCgpICsgMTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRUcmVldmlld0l0ZW1FeHRlcm5hbChhZGRJdGVtQnV0dG9uRWxlbWVudCwgbmV3SXRlbUlkLCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkVHJlZXZpZXdJdGVtRXh0ZXJuYWwoYWRkSXRlbUJ1dHRvbkVsZW1lbnQ6IEhUTUxFbGVtZW50LCBuZXdJdGVtSWQ6IG51bWJlciwgbmV3SXRlbVBhcmVudElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmFkZFRyZWV2aWV3SXRlbUV4dGVybmFsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG1ldG9kbyB1cG9yYWJsamEgY2xpZW50LCB2cm5lIGNvbnRlbnQsIGtpIGpvIGRvZGFtbyB2IHRyZWV2aWV3XHJcbiAgICBwdWJsaWMgYWRkVHJlZXZpZXdJdGVtQ29udGVudChhZGRJdGVtQnV0dG9uRWxlbWVudDogSFRNTEVsZW1lbnQsIG5ld0l0ZW1JZDogbnVtYmVyLCBuZXdJdGVtUGFyZW50SWQ6IG51bWJlciwgaHRtbENvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuYWRkVHJlZXZpZXdJdGVtQ29udGVudFwiKTtcclxuXHJcbiAgICAgICAgLy8gb2RzdHJhbmltbyBhZGQgaXRlbSBodG1sLCBrZXIgZ2EgYm8gemUgZG9kYWwgaHRtbENvbnRlbnRcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIC5zYW9wLXRyZWV2aWV3LWFkZC1pdGVtLWNvbnRhaW5lclwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgaHRtbFRyZWV2aWV3QWRkSXRlbSkge1xyXG4gICAgICAgICAgICBodG1sVHJlZXZpZXdBZGRJdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgZWxlbVBhcmVudCA9ICQodGhpcy5fdmlld0lkKTtcclxuICAgICAgICBlbGVtUGFyZW50LmFwcGVuZChodG1sQ29udGVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlZGl0VHJlZXZpZXdJdGVtKGVsZW06IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5lZGl0VHJlZXZpZXdJdGVtXCIpO1xyXG5cclxuICAgICAgICAvLyBvZHN0cmFuaW1vIGNzcyBrbGFzIHphIG9icm9ibyB2c2VtIGVsZW1lbnRvbSBpbiBqbyBkb2RhbW8gaXpicmFuZW11XHJcbiAgICAgICAgdGhpcy5jbGVhclRyZWV2aWV3SXRlbXNTZWxlY3RlZENzcygpO1xyXG4gICAgICAgICQoZWxlbSkuYWRkQ2xhc3MoXCJzYW9wLXRyZWV2aWV3LWl0ZW0tc2VsZWN0ZWRcIik7XHJcblxyXG4gICAgICAgIHRoaXMuZWRpdFRyZWV2aWV3SXRlbUV4dGVybmFsKGVsZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHphIGV4dGVybm8gdXBvcmFib1xyXG4gICAgcHVibGljIGVkaXRUcmVldmlld0l0ZW1FeHRlcm5hbChlbGVtOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuZWRpdFRyZWV2aWV3SXRlbUV4dGVybmFsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhclRyZWV2aWV3SXRlbXNTZWxlY3RlZENzcygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmNsZWFyVHJlZXZpZXdJdGVtc1NlbGVjdGVkQ3NzXCIpO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIC5zYW9wLXRyZWV2aWV3LWl0ZW0taW5mb1wiKS5yZW1vdmVDbGFzcyhcInNhb3AtdHJlZXZpZXctaXRlbS1zZWxlY3RlZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlbGVtIGplIGlzdGkga290IGdhIHBvbnVqYSBlZGl0VHJlZXZpZXdJdGVtIG96LiBlZGl0VHJlZXZpZXdJdGVtRXh0ZXJuYWxcclxuICAgIHB1YmxpYyByZWZyZXNoVHJlZXZpZXdJdGVtSGVhZGVyKGVsZW06IEhUTUxFbGVtZW50LCBoZWFkZXI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcucmVmcmVzaFRyZWV2aWV3SXRlbUhlYWRlclwiKTtcclxuXHJcbiAgICAgICAgJChlbGVtKS5maW5kKFwiLnNhb3AtdHJlZXZpZXctaXRlbS1oZWFkZXJcIikudGV4dChoZWFkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5zZXJ0SXRlbShpbnNlcnRJdGVtQnV0dG9uRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3Lmluc2VydEl0ZW1cIik7XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHBhcmVudCwga2kgaW1hIGtsYXMgc2FvcC10cmVldmlldy1pdGVtLWNvbnRhaW5lcixcclxuICAgICAgICBsZXQgcGFyZW50Rm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGxldCBwYXJlbnRFbGVtID0gaW5zZXJ0SXRlbUJ1dHRvbkVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDIwOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudEVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFwic2FvcC10cmVldmlldy1pdGVtLWNvbnRhaW5lclwiKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Rm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyZW50RWxlbSA9IHBhcmVudEVsZW0ucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnRGb3VuZCkge1xyXG4gICAgICAgICAgICAvLyBwb2lzY2kgbWF4IElkIFRyZWV2aWV3cyBpbiBnYSBwb3ZlY2FtbyB6YSAxXHJcbiAgICAgICAgICAgIGxldCBuZXdJdGVtSWQgPSB0aGlzLmdldE1heFRyZWV2aWV3SWQoKSArIDE7XHJcbiAgICAgICAgICAgIC8vIHBhcmVudElkXHJcbiAgICAgICAgICAgIGxldCBuZXdJdGVtUGFyZW50SWQgPSBnbG9iYWwuY29udmVydFN0cmluZzJOdW1iZXIoJChwYXJlbnRFbGVtKS5hdHRyKFwiZGF0YS1wYXJlbnRpZFwiKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmluc2VydFRyZWV2aWV3SXRlbUV4dGVybmFsKHBhcmVudEVsZW0sIG5ld0l0ZW1JZCwgbmV3SXRlbVBhcmVudElkKTtcclxuICAgICAgICB9ICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluc2VydFRyZWV2aWV3SXRlbUV4dGVybmFsKGl0ZW1Ub0FwcGVuZFRvOiBIVE1MRWxlbWVudCwgbmV3SXRlbUlkOiBudW1iZXIsIG5ld0l0ZW1QYXJlbnRJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5pbnNlcnRUcmVldmlld0l0ZW1FeHRlcm5hbFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5zZXJ0VHJlZXZpZXdJdGVtQ29udGVudChpdGVtVG9BcHBlbmRUbzogSFRNTEVsZW1lbnQsIG5ld0l0ZW1JZDogbnVtYmVyLCBuZXdJdGVtUGFyZW50SWQ6IG51bWJlciwgaHRtbENvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuaW5zZXJ0VHJlZXZpZXdJdGVtQ29udGVudFwiKTtcclxuXHJcbiAgICAgICAgJChpdGVtVG9BcHBlbmRUbykuYWZ0ZXIoaHRtbENvbnRlbnQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFZpZXdTcGlubmVyIHtcclxuXHJcbiAgZ2VuZXJhdGVTcGlubmVyRGl2KHNwaW5uZXJJZDogc3RyaW5nID0gJyNzYW9wTG9hZGluZycpOiBzdHJpbmcge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImdlbmVyYXRlU3Bpbm5lckRpdiBcIiArIHNwaW5uZXJJZCk7XHJcbiAgICBsZXQgc3Bpbm5yRGl2ID1cclxuICAgICAgJzxkaXYgaWQ9XCInICsgc3Bpbm5lcklkICsgJ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBjbGFzcz1cIlwiPiAnXHJcbiAgICAgICsgJ1x0PGRpdiBpZD1cIicgKyBzcGlubmVySWQgKyAnU3Bpbm5lckJhY2tncm91bmdcIiBjbGFzcz1cInNwaW5uZXItYmFja2dyb3VuZCBcIi8+ICdcclxuICAgICAgKyAnXHQ8ZGl2IGlkPVwiJyArIHNwaW5uZXJJZCArICdTcGlubmVyXCIgY2xhc3M9XCJzcGlubmVyIHNwaW5uZXItY2VudGVyLWRhc2hib2FyZFNpZGViYXJyXCI+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHQ8L2Rpdj4gJ1xyXG4gICAgICArICc8L2Rpdj4gJztcclxuXHJcbiAgICByZXR1cm4gc3Bpbm5yRGl2O1xyXG4gIH1cclxuXHJcbiAgc2hvd0xvYWRpbmdTYW9wKGVsZW1lbnRJZDogc3RyaW5nID0gXCIjc2FvcExvYWRpbmdcIikge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNob3dMb2FkaW5nU2FvcCBcIiArIGVsZW1lbnRJZCk7XHJcbiAgICB2YXIgb2JqID0gJChlbGVtZW50SWQpO1xyXG4gICAgaWYgKG9iai5sZW5ndGgpIHtcclxuICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNob3cuLi4gXCIpO1xyXG4gICAgICBvYmouc2hvdygpO1xyXG4gICAgICAvL3NldE1vZGFsRm9ybVpJbmRleChlbGVtZW50SWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZUxvYWRpbmdTYW9wKGVsZW1lbnRJZDogc3RyaW5nID0gXCIjc2FvcExvYWRpbmdcIikge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImhpZGVMb2FkaW5nU2FvcCBcIiArIGVsZW1lbnRJZCk7XHJcbiAgICB2YXIgb2JqID0gJChlbGVtZW50SWQpO1xyXG4gICAgaWYgKG9iai5sZW5ndGgpXHJcbiAgICAgIG9iai5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBzaG93TG9hZGluZ1Nhb3AoZWxlbWVudElkOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgLy8gICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2hvd0xvYWRpbmdTYW9wIFwiICsgZWxlbWVudElkKTtcclxuICAvLyAgIGlmICghaXNFbXB0eShlbGVtZW50SWQpKSB7XHJcbiAgLy8gICAgIGxldCBlbGVtZW50RGl2ID0gJChlbGVtZW50SWQpO1xyXG4gIC8vICAgICBpZiAoZWxlbWVudERpdi5sZW5ndGgpIHtcclxuICAvLyAgICAgICBsZXQgc3Bpbm5lcklEID0gZWxlbWVudElkICsgXCJMb2FkaW5nXCI7XHJcbiAgLy8gICAgICAgc3Bpbm5lcklEID0gc3Bpbm5lcklELnJlcGxhY2UoXCIjXCIsXCJcIik7XHJcbiAgLy8gICAgICAgbGV0IHNwaW5uZXJEaXYgPSAkKHNwaW5uZXJJRCk7XHJcbiAgLy8gICAgICAgaWYgKCFzcGlubmVyRGl2Lmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgbGV0IF9kaXYgPSB0aGlzLmdlbmVyYXRlU3Bpbm5lckRpdihzcGlubmVySUQpO1xyXG4gIC8vICAgICAgICAgZWxlbWVudERpdi5hcHBlbmQoX2Rpdik7XHJcbiAgLy8gICAgICAgICBzcGlubmVyRGl2ID0gJChzcGlubmVySUQpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBzcGlubmVyRGl2LnNob3coKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gaGlkZUxvYWRpbmdTYW9wKGVsZW1lbnRJZDogc3RyaW5nID0gXCJcIikge1xyXG4gIC8vICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImhpZGVMb2FkaW5nU2FvcCBcIiArIGVsZW1lbnRJZCk7XHJcbiAgLy8gICBpZiAoIWlzRW1wdHkoZWxlbWVudElkKSkge1xyXG4gIC8vICAgICBsZXQgZWxlbWVudERpdiA9ICQoZWxlbWVudElkKTtcclxuICAvLyAgICAgaWYgKGVsZW1lbnREaXYubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgbGV0IHNwaW5uZXJJRCA9IGVsZW1lbnRJZCArIFwiTG9hZGluZ1wiO1xyXG4gIC8vICAgICAgIGxldCBzcGlubmVyRGl2ID0gJChzcGlubmVySUQpO1xyXG4gIC8vICAgICAgIGlmICghc3Bpbm5lckRpdi5sZW5ndGgpIHtcclxuICAvLyAgICAgICAgIGVsZW1lbnREaXYuYXBwZW5kKHRoaXMuZ2VuZXJhdGVTcGlubmVyRGl2KHNwaW5uZXJJRCkpO1xyXG4gIC8vICAgICAgICAgc3Bpbm5lckRpdiA9ICQoc3Bpbm5lcklEKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgc3Bpbm5lckRpdi5oaWRlKCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgLy8gLy9cclxufVxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BWaWV3U3Bpbm5lciB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC12aWV3LXNwaW5uZXInXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BTZXJ2aWNlc0NvcmVQYXJhbXMge1xyXG4gIGFjdGlvbjpzdHJpbmc7XHJcbiAgYXN5bmM/OmJvb2xlYW5cclxuICB0eXBlPzpzdHJpbmc7XHJcbiAgZGF0YT86YW55O1xyXG4gIHNwaW5uZXJEaXZJZD86c3RyaW5nO1xyXG4gIC8vIGNvbnRlbnRUeXBlPzogc3RyaW5nIHwgZmFsc2UgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZGF0YVR5cGU/OiAneG1sJyB8ICdodG1sJyB8ICdzY3JpcHQnIHwgJ2pzb24nIHwgJ2pzb25wJyB8ICd0ZXh0JyB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAvLyBwcm9jZXNzRGF0YT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQge1xyXG4gIHN1Y2Nlc3MgPSAxXHJcbiAgLCBlcnJvciA9IDJcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU2FvcFNlcnZpY2VzQ29yZUhUVFBSZXN1bHRTdGF0dXNDb2RlIHtcclxuICBvayA9IDIwMCxcclxuICB1bmF1dGhvcml6ZWQgPSA0MDEsXHJcbiAgaW50ZXJuYWxTZXJ2ZXJFcnJvciA9IDUwMFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSB7XHJcbiAgcmVzcG9uc2U6IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQ7XHJcbiAgZGF0YTogYW55O1xyXG59O1xyXG5cclxuLy8gZnVuY3Rpb24gc3luY0RlbGF5KG1pbGxpc2Vjb25kczphbnkpe1xyXG4vLyAgIHZhciBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4vLyAgIHZhciBlbmQ9MDtcclxuLy8gICB3aGlsZSggKGVuZC1zdGFydCkgPCBtaWxsaXNlY29uZHMpe1xyXG4vLyAgICAgICBlbmQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuLy8gICB9XHJcbi8vICB9XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNlcnZpY2VzQ29yZSB7XHJcbiAgcHJpdmF0ZSBfc2FvcFZpZXdTcGlubmVyOlNhb3BWaWV3U3Bpbm5lciA9IG5ldyBTYW9wVmlld1NwaW5uZXIoKTtcclxuICBwcml2YXRlIF9wYXJhbXM6U2FvcFNlcnZpY2VzQ29yZVBhcmFtcztcclxuICBwcml2YXRlIF9kZWZhdWx0UGFyYW1zOlNhb3BTZXJ2aWNlc0NvcmVQYXJhbXM7XHJcbiAgLy8gIFxyXG4gIC8vcHVibGljIF9yZXN1bHQ6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlID0ge3Jlc3BvbnNlOm51bGwsZGF0YTpudWxsfTsgIFxyXG5cclxuICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgdGhpcy5fZGVmYXVsdFBhcmFtcyA9IHtcclxuICAgICAgYWN0aW9uOlwiXCJcclxuICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAsYXN5bmM6dHJ1ZVxyXG4gICAgICAsZGF0YTpudWxsXHJcbiAgICAgICxzcGlubmVyRGl2SWQ6XCJcIlxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Eb25lKHJlc3VsdDphbnkpe1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUub25Eb25lXCIpO1xyXG4gICAgdGhpcy5hZnRlckRvbmUocmVzdWx0KTtcclxuICAgIC8vdGhpcy5fc2FvcFZpZXdTcGlubmVyLmhpZGVMb2FkaW5nU2FvcCh0aGlzLl9wYXJhbXMuc3Bpbm5lckRpdklkKTsgICAgICBcclxuICB9XHJcblxyXG4gIGFmdGVyRG9uZShyZXN1bHQ6YW55KTp2b2lke1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lXCIpO1xyXG4gIH0gIFxyXG5cclxuICBwcml2YXRlIG9uU3VjY2VzcyhyZXN1bHQ6YW55KTp2b2lke1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuc3VjY2Vzc1wiKTtcclxuICAgIGxldCBfcmVzdWx0OlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSA9IHtyZXNwb25zZTpudWxsLGRhdGE6bnVsbH07IFxyXG4gICAgaWYgKHR5cGVvZiByZXN1bHQuc3VjY2VzcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZXN1bHQuc3VjY2VzcyA9PT0gbnVsbCkge1xyXG4gICAgICBfcmVzdWx0LnJlc3BvbnNlID0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgX3Jlc3VsdC5yZXNwb25zZSA9IHJlc3VsdC5zdWNjZXNzID09IHRydWUgPyBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3MgOiBTYW9wU2VydmljZXNDb3JlUmVzdWx0LmVycm9yO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBfcmVzdWx0LmRhdGEgPSByZXN1bHQ7XHJcbiAgICB0aGlzLmFmdGVyU3VjY2VzcyhfcmVzdWx0KTtcclxuICB9XHJcblxyXG4gIGFmdGVyU3VjY2VzcyhyZXN1bHQ6YW55KTp2b2lke1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzXCIpO1xyXG4gIH0gIFxyXG5cclxuICBwcml2YXRlIG9uRXJyb3IocmVzdWx0OmFueSk6dm9pZHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLmVycm9yXCIpO1xyXG4gICAgXHJcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PSBTYW9wU2VydmljZXNDb3JlSFRUUFJlc3VsdFN0YXR1c0NvZGUudW5hdXRob3JpemVkKSB7XHJcbiAgICAgIC8vIHJlZGlyZWN0IHRvIGxvZ2luXHJcbiAgICAgIHRoaXMudW5BdXRob3JpemVkUmVkaXJlY3RUb0xvZ2luUGFnZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPSBTYW9wU2VydmljZXNDb3JlSFRUUFJlc3VsdFN0YXR1c0NvZGUuaW50ZXJuYWxTZXJ2ZXJFcnJvciAmJiAhZ2xvYmFsLmlzVW5EZWZpbmVkKHJlc3VsdC5yZXNwb25zZVRleHQpKSB7XHJcbiAgICAgIGFsZXJ0KFwiSW50ZXJuYWwgZXJyb3IhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBfcmVzdWx0OlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSA9IHtyZXNwb25zZTpudWxsLGRhdGE6bnVsbH07IFxyXG4gICAgX3Jlc3VsdC5yZXNwb25zZSA9IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuZXJyb3I7XHJcbiAgICBfcmVzdWx0LmRhdGEgPSByZXN1bHQ7XHJcbiAgICB0aGlzLmFmdGVyRXJyb3IoX3Jlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBhZnRlckVycm9yKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3NcIik7XHJcbiAgfSBcclxuXHJcbiAgRXhlY3V0ZUFjdGlvbihwYXJhbXM6U2FvcFNlcnZpY2VzQ29yZVBhcmFtcyk6dm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uXCIpO1xyXG4gICAgbGV0IG9wdGlvbnMgPSB7IC4uLnRoaXMuX2RlZmF1bHRQYXJhbXMsIC4uLnBhcmFtcyB9O1xyXG4gICAgcGFyYW1zID0gb3B0aW9ucztcclxuICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgX2FqYXhBY3Rpb24gPSBnbG9iYWwuZ2V0U2l0ZUFic29sdXRlVVJMKHBhcmFtcy5hY3Rpb24pO1xyXG5cclxuICAgIC8vQFVybC5BY3Rpb24oXCJjcmVhckNhbXBNYW51YWxcIiwgXCJEUFNcIilcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAkLmFqYXgoe1xyXG4gICAgICAgIGFzeW5jOiBwYXJhbXMuYXN5bmMsXHJcbiAgICAgICAgdXJsOiBfYWpheEFjdGlvbixcclxuICAgICAgICB0eXBlOiAhZ2xvYmFsLmlzRW1wdHkocGFyYW1zLnR5cGUpID8gcGFyYW1zLnR5cGUgOiBcIlBPU1RcIixcclxuICAgICAgICBkYXRhOiBwYXJhbXMuZGF0YSxcclxuICAgICAgICAvLyBjb250ZW50VHlwZTogcGFyYW1zLmNvbnRlbnRUeXBlID09IG51bGwgPyAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04JyA6IHBhcmFtcy5jb250ZW50VHlwZSxcclxuICAgICAgICAvLyBkYXRhVHlwZTogcGFyYW1zLnR5cGUgPT0gbnVsbCA/ICdJbnRlbGxpZ2VudCBHdWVzcyAoeG1sLCBqc29uLCBzY3JpcHQsIG9yIGh0bWwpJyA6IHBhcmFtcy50eXBlLCAgXHJcbiAgICAgICAgLy8gcHJvY2Vzc0RhdGEgOiBwYXJhbXMucHJvY2Vzc0RhdGEgPT0gbnVsbCA/IHRydWUgOiBwYXJhbXMucHJvY2Vzc0RhdGEsIFxyXG4gICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uICgpIHsgX3RoaXMuX3Nhb3BWaWV3U3Bpbm5lci5zaG93TG9hZGluZ1Nhb3AocGFyYW1zLnNwaW5uZXJEaXZJZCk7IH0sXHJcbiAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHsgX3RoaXMuX3Nhb3BWaWV3U3Bpbm5lci5oaWRlTG9hZGluZ1Nhb3AocGFyYW1zLnNwaW5uZXJEaXZJZCk7IH0sXHJcbiAgICAgICAgc3VjY2VzczogdGhpcy5vblN1Y2Nlc3MuYmluZChfdGhpcyksXHJcbiAgICAgICAgZXJyb3I6IHRoaXMub25FcnJvci5iaW5kKF90aGlzKVxyXG4gICAgICB9KS5kb25lKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiRG9uZS4uLlwiKTtcclxuICAgICAgICBfdGhpcy5vbkRvbmUocmVzdWx0KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaChlcnIpIHtcclxuICAgICAgYWxlcnQoXCJJbnRlcm5hbCBlcnJvciFcIik7XHJcbiAgICB9ICAgIFxyXG5cclxuICBcclxuICB9XHJcblxyXG4gIEV4ZWN1dGVCbG9iQWN0aW9uKHBhcmFtczogU2FvcFNlcnZpY2VzQ29yZVBhcmFtcyk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUJsb2JBY3Rpb25cIik7XHJcbiAgICBsZXQgb3B0aW9ucyA9IHsgLi4udGhpcy5fZGVmYXVsdFBhcmFtcywgLi4ucGFyYW1zIH07XHJcbiAgICBwYXJhbXMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBfYWpheEFjdGlvbiA9IGdsb2JhbC5nZXRTaXRlQWJzb2x1dGVVUkwocGFyYW1zLmFjdGlvbik7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgJC5hamF4KHtcclxuICAgICAgICB0eXBlOiBcIlBPU1RcIixcclxuICAgICAgICB1cmw6IF9hamF4QWN0aW9uLFxyXG4gICAgICAgIGRhdGE6IHBhcmFtcy5kYXRhLFxyXG4gICAgICAgIHhockZpZWxkczoge1xyXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicgLy8gdG8gYXZvaWQgYmluYXJ5IGRhdGEgYmVpbmcgbWFuZ2xlZCBvbiBjaGFyc2V0IGNvbnZlcnNpb25cclxuICAgICAgICB9LFxyXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChibG9iLCBzdGF0dXMsIHhocikge1xyXG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgYSBmaWxlbmFtZVxyXG4gICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBcIlwiO1xyXG4gICAgICAgICAgICB2YXIgZGlzcG9zaXRpb24gPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgaWYgKGRpc3Bvc2l0aW9uICYmIGRpc3Bvc2l0aW9uLmluZGV4T2YoJ2F0dGFjaG1lbnQnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlbmFtZVJlZ2V4ID0gL2ZpbGVuYW1lW147PVxcbl0qPSgoWydcIl0pLio/XFwyfFteO1xcbl0qKS87XHJcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGZpbGVuYW1lUmVnZXguZXhlYyhkaXNwb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyAhPSBudWxsICYmIG1hdGNoZXNbMV0pIGZpbGVuYW1lID0gbWF0Y2hlc1sxXS5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vaWYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIC8vICAgIC8vIElFIHdvcmthcm91bmQgZm9yIFwiSFRNTDcwMDc6IE9uZSBvciBtb3JlIGJsb2IgVVJMcyB3ZXJlIHJldm9rZWQgYnkgY2xvc2luZyB0aGUgYmxvYiBmb3Igd2hpY2ggdGhleSB3ZXJlIGNyZWF0ZWQuIFRoZXNlIFVSTHMgd2lsbCBubyBsb25nZXIgcmVzb2x2ZSBhcyB0aGUgZGF0YSBiYWNraW5nIHRoZSBVUkwgaGFzIGJlZW4gZnJlZWQuXCJcclxuICAgICAgICAgICAgLy8gICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgLy99IGVsc2VcclxuICAgICAgICAgICAgLy97XHJcbiAgICAgICAgICAgIHZhciBVUkwgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkw7XHJcbiAgICAgICAgICAgIHZhciBkb3dubG9hZFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmlsZW5hbWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHVzZSBIVE1MNSBhW2Rvd25sb2FkXSBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBmaWxlbmFtZVxyXG4gICAgICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICAgICAgICAgIC8vIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXRcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYS5kb3dubG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRvd25sb2FkVXJsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhLmhyZWYgPSBkb3dubG9hZFVybDtcclxuICAgICAgICAgICAgICAgICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgICAgICAgICAgICAgICBhLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRvd25sb2FkVXJsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChkb3dubG9hZFVybCk7IH0sIDEwMCk7IC8vIGNsZWFudXBcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogdGhpcy5vbkVycm9yLmJpbmQoX3RoaXMpXHJcbiAgICAgICAgfSkuZG9uZShmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiRG9uZS4uLlwiKTtcclxuICAgICAgICAgIF90aGlzLm9uRG9uZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgYWxlcnQoXCJJbnRlcm5hbCBlcnJvciFcIik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIHB1YmxpYyBoYW5kbGVTdWJtaXRFcnJvcihyZXNwb25zZTogYW55KTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5IYW5kbGVTdWJtaXRFcnJvclwiKTtcclxuXHJcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS51bmF1dGhvcml6ZWQpIHtcclxuICAgICAgICB0aGlzLnVuQXV0aG9yaXplZFJlZGlyZWN0VG9Mb2dpblBhZ2UoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGlzcGxheSBlcnJvclxyXG4gICAgY29uc29sZS5sb2coXCJyZXNwb25zZVwiLCByZXNwb25zZSk7XHJcbiAgICBhbGVydChyZXNwb25zZS5zdGF0dXNUZXh0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1bkF1dGhvcml6ZWRSZWRpcmVjdFRvTG9naW5QYWdlKCk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUucmVkaXJlY3RUb0xvZ2luUGFnZVwiKTtcclxuXHJcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgfVxyXG4gXHJcbiAgLy9cclxufVxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVHJhbnNsYXRpb24ge1xyXG4gIHB1YmxpYyBrZXk6IHN0cmluZyA9IFwiI1wiO1xyXG4gIHB1YmxpYyB0cmFuc2xhdGlvbjogc3RyaW5nID0gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmFuc2xhdGlvbnMge1xyXG4gIHB1YmxpYyB0cmFuc2xhdGlvbnNMaXN0OltTYW9wVHJhbnNsYXRpb24/XSA9IFtdO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlUGFyYW1zIHtcclxuICBjb250cm9sbGVyOnN0cmluZyxcclxuICBhY3Rpb246c3RyaW5nLFxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmFuc2xhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgX3BhcmFtczpTYW9wVHJhbnNsYXRpb25TZXJ2aWNlUGFyYW1zO1xyXG4gIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgLy9cclxuICBwdWJsaWMgX3Rlcm1pbm9sb2d5OlNhb3BUcmFuc2xhdGlvbnM7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihwYXJhbXM6U2FvcFRyYW5zbGF0aW9uU2VydmljZVBhcmFtcyA9IG51bGwpe1xyXG4gICAgaWYoIWdsb2JhbC5pc1VuRGVmaW5lZChwYXJhbXMpKXtcclxuICAgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fcGFyYW1zID0ge2NvbnRyb2xsZXI6XCJUcmFuc2xhdGlvblwiLGFjdGlvbjpcIkdldFRyYW5zbGF0aW9uc1wifTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICB0aGlzLl90ZXJtaW5vbG9neSA9IG5ldyBTYW9wVHJhbnNsYXRpb25zKCk7XHJcbiAgfVxyXG4gIFxyXG4gIHNldFRyYW5zbGF0aW9uc0xpc3QodHJhbnNsYXRpb25zOnN0cmluZ1tdKTphbnl7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgdHJhbnNsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgIF90aGlzLl90ZXJtaW5vbG9neS50cmFuc2xhdGlvbnNMaXN0LnB1c2goe2tleTp2YWx1ZSx0cmFuc2xhdGlvbjp2YWx1ZX0pOyAgXHJcbiAgICB9KTsgICBcclxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zbGF0aW9ucyh0aGlzLl90ZXJtaW5vbG9neSk7XHJcbiAgfVxyXG5cclxuICBnZXRUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zOlNhb3BUcmFuc2xhdGlvbnMpOmFueXtcclxuICAgIGxldCBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRyYW5zbGF0aW9ucyk7XHJcbiAgICBsZXQgX2RhdGEgPSB7anNvbklucHV0Ompzb25EYXRhfTtcclxuICAgIGxldCBfcmVzcG9uc2U6YW55O1xyXG4gICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgX3Jlc3BvbnNlID0gcmVzcG9uc2U7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICBhY3Rpb246IHRoaXMuX3BhcmFtcy5jb250cm9sbGVyK1wiL1wiK3RoaXMuX3BhcmFtcy5hY3Rpb24rXCJcIlxyXG4gICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICAsIGRhdGE6IF9kYXRhXHJcbiAgICAgICAgLCBhc3luYzogZmFsc2VcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fdGVybWlub2xvZ3kudHJhbnNsYXRpb25zTGlzdCA9IF9yZXNwb25zZS50cmFuc2xhdGlvbnNMaXN0O1xyXG4gICAgcmV0dXJuIF9yZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHRyYW5zbGF0ZShrZXk6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICBsZXQgX3RyID0gdGhpcy5fdGVybWlub2xvZ3kudHJhbnNsYXRpb25zTGlzdC5maW5kKGUgPT4gZS5rZXkgPT0ga2V5KSBhcyBhbnk7XHJcbiAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKF90cikpIHsgXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gX3RyLnRyYW5zbGF0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL3R5cGluZ3MuZC50c1wiIC8+XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFV0aWxzIHtcclxuICAgIGNoZWNrQ29tcGF0aWJpbGl0eSgpOmJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBTYW9wQ29tbW9uLmNoZWNrQ29tcGF0aWJpbGl0eSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlLFNhb3BTZXJ2aWNlc0NvcmVQYXJhbXMsIFNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSwgU2FvcFNlcnZpY2VzQ29yZVJlc3VsdCB9IGZyb20gJy4vc2FvcC1zZXJ2aWNlcy1jb3JlJ1xyXG5pbXBvcnQgeyBTYW9wTWVzc2FnZURsZywgU2FvcE1zZ0RsZ0J1dHRvbiB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1tZXNzYWdlLWRsZyc7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuaW1wb3J0IHtTYW9wRmxvYXRpbmdMYWJlbCB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1mbG9hdGluZy1sYWJlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgRXJyb3Ige1xyXG4gICAgcHVibGljIENvZGU6IHN0cmluZztcclxuICAgIHB1YmxpYyBNZXNzYWdlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFNhb3BXZkFjdGlvbiB7XHJcbiAgICB3ZmFOb25lID0gMFxyXG4gICAgLHdmYUFkZFJlY29yZCA9IDFcclxuICAgICx3ZmFFZGl0UmVjb3JkID0gMlxyXG4gICAgLHdmYURlbGV0ZVJlY29yZCA9IDNcclxuICAgICx3ZmFSZWNvcmREZXN0YWlscyA9IDRcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ZTdWJtaXRSZXN1bHQge1xyXG4gICAgc3VjY2Vzczpib29sZWFuO1xyXG4gICAgdmlld0NvbnRlbnQ6c3RyaW5nO1xyXG4gICAgcmVkaXJlY3RUbzpzdHJpbmc7XHJcbiAgICBhbGVydE1lc3NhZ2U6c3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFZpZXdGb3JtIHtcclxuICAgIHByaXZhdGUgX3ZpZXdNb2RhbEZyYW1lOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92aWV3TW9kYWxCb2R5OkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92aWV3X3RpdGxlOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92aWV3X2J0bk9rOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92aWV3X2J0bkNhbmNlbDpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfc2VydmljZXNQYXJhbXM6U2FvcFNlcnZpY2VzQ29yZVBhcmFtcyA9IHthY3Rpb246bnVsbCxkYXRhOm51bGwsdHlwZTpcIlBPU1RcIn07XHJcbiAgICBwcml2YXRlIF90ZXJtaW5vbG9neTogc3RyaW5nW107XHJcbiAgICAvL1xyXG4gICAgcHVibGljIF9saWJOYW1lOnN0cmluZztcclxuICAgIHB1YmxpYyBzYW9wU2VydmljZXNDb3JlOlNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgcHVibGljIHRyYW5zbGF0aW9uU2VydmljZTpTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG4gICAgcHVibGljIGNvbnRlbnRFbGVtZW50SWQgPSBcIi5zYW9wLW1vZGFsLWJvZHktZWxlbWVudFwiO1xyXG4gICAgcHVibGljIGFkZFJlY29yZEVuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGVkaXRSZWNvcmRFbmRwb2ludDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBkZWxldGVSZWNvcmRFbmRwb2ludDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBtYW51YWxseVN1Ym1pdEVuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIHNhb3BGbG9hdGluZ0xhYmVsOiBTYW9wRmxvYXRpbmdMYWJlbDtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgb25TdWNjY2Vzc0NhbGxiYWNrOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG9uRXJyb3JDYWxsYmFjazogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBvbkZhaWx1cmVDYWxsYmFjazogc3RyaW5nID0gXCJcIjtcclxuICAgIC8vICAgIFxyXG4gICAgcHVibGljIGlkOnN0cmluZztcclxuICAgIHB1YmxpYyB0aXRsZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgZnVsbFNjcmVlbjpib29sZWFuID0gZmFsc2U7XHJcbiAgICAvL1xyXG4gICAgcHVibGljIG9uQ2xvc2U6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uU3VibWl0OiAocGFyYW1zOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvbkVycm9yOiAocGFyYW1zOmFueSkgPT4gYW55ID0gbnVsbDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIil7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BWaWV3Rm9ybS4uLlwiKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwidmlld0lkOlwiK3ZpZXdJZCk7XHJcbiAgICAgICAgdGhpcy5pZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLm9uU3VjY2Nlc3NDYWxsYmFjayA9IGxpYk5hbWUrXCIub25TdWJtaXRTdWNjZXNzKGRhdGEsXCIrbGliTmFtZStcIik7XCI7XHJcbiAgICAgICAgdGhpcy5vbkVycm9yQ2FsbGJhY2sgPSBsaWJOYW1lICsgXCIub25TdWJtaXRFcnJvcihkYXRhLFwiICsgbGliTmFtZSArIFwiKTtcIjtcclxuICAgICAgICB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrID0gbGliTmFtZSArIFwiLm9uU3VibWl0RmFpbHVyZSh4aHIsXCIgKyBsaWJOYW1lICsgXCIpO1wiO1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlID0gbmV3IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UoKTtcclxuICAgICAgICB0aGlzLnNhb3BGbG9hdGluZ0xhYmVsID0gbmV3IFNhb3BGbG9hdGluZ0xhYmVsKCk7XHJcbiAgICAgICAgLy8gIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRUZXJtaW5vbG9neUxpc3QoZGljdGlvbmFyeTogc3RyaW5nW10gPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdGVybWlub2xvZ3kgPSBbXCJVcmVkaVwiLFwiTm92IHZub3NcIixcIlBvZHJvYm5vc3RpXCIsXCJCcmlzYW5qZVwiXTtcclxuICAgICAgICBpZiAoZGljdGlvbmFyeSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbm9sb2d5ID0gdGhpcy5fdGVybWlub2xvZ3kuY29uY2F0KGRpY3Rpb25hcnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5zZXRUcmFuc2xhdGlvbnNMaXN0KHRoaXMuX3Rlcm1pbm9sb2d5KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25CdG5Pa0NsaWNrKHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uQnRuT2tDbGljay4uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25CdG5DYW5jZWwoc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25CdG5DYW5jZWwuLi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJlZm9yZVZpZXdTaG93KHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkK1wiLmJlZm9yZVZpZXdTaG93KClcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lID0gJCh0aGlzLmlkKTtcclxuICAgICAgICBpZiAodGhpcy5fdmlld01vZGFsRnJhbWUgPT0gbnVsbCkgeyBjb25zb2xlLmxvZyh0aGlzLmlkK1wiIG5vdCBmb3VuZCFcIik7fTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHZhciBjb250ZW50U2VsID0gdGhpcy5pZCArIFwiIFwiICsgdGhpcy5jb250ZW50RWxlbWVudElkO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkgPSAkKGNvbnRlbnRTZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZnRlclZpZXdTaG93KHNlbmRlcjphbnksd2ZBY3Rpb246U2FvcFdmQWN0aW9uKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCtcIi5hZnRlclZpZXdTaG93KClcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl92aWV3X2J0bk9rID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bk9rXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuQ2FuY2VsID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bkNhbmNlbFwiKTtcclxuICAgICAgICB0aGlzLl92aWV3X3RpdGxlID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2V4YW1wbGVNb2RhbExvbmdUaXRsZVwiKTtcclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWZ0ZXJWaWV3U2hvdyB0aXRsZTpcIisgdGhpcy50aXRsZSk7XHJcblxyXG4gICAgICAgIGlmICghZ2xvYmFsLmlzRW1wdHkodGhpcy50aXRsZSkpe1xyXG4gICAgICAgICAgICBsZXQgX3RpdGxlID0gXCJcIjtcclxuICAgICAgICAgICAgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpe1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiTm92IHZub3NcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQpe1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiVXJlZGlcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzKXtcclxuICAgICAgICAgICAgICAgIF90aXRsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlBvZHJvYm5vc3RpXCIpK1wiOiBcIit0aGlzLnRpdGxlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWZ0ZXJWaWV3U2hvdyBfdGl0bGU6XCIrIF90aXRsZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92aWV3X3RpdGxlLmh0bWwoX3RpdGxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGVmYXVsdFRpdGxlQWRkID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2FkZFRpdGxlXCIpLnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3X3RpdGxlLmh0bWwoZGVmYXVsdFRpdGxlQWRkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBkZWZhdWx0VGl0bGVFZGl0ID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2VkaXRUaXRsZVwiKS52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld190aXRsZS5odG1sKGRlZmF1bHRUaXRsZUVkaXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnZpZXdTaG93Q29tcGxldGUoc2VuZGVyLCB3ZkFjdGlvbik7XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5iaW5kQnV0dG9ucyhzZW5kZXIpO1xyXG5cclxuICAgICAgICB0aGlzLmJpbmRWaWV3RXZlbnRzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgZ2xvYmFsLnNldE1vZGFsRm9ybVpJbmRleCh0aGlzLmlkKTtcclxuICAgICAgICBnbG9iYWwuc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXModGhpcy5pZCk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLmFmdGVyVmlld1Nob3dTdWNjZXNzKHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFmdGVyVmlld1Nob3dTdWNjZXNzKHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkICsgXCIuYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3MoKVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmlld1Nob3dDb21wbGV0ZShzZW5kZXI6IGFueSwgd2ZBY3Rpb246IFNhb3BXZkFjdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCArIFwiLnZpZXdTaG93Q29tcGxldGUoKVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJpbmRCdXR0b25zKHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJpbmRCdXR0b25zXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuT2sgPSAkKFwiXCIgKyB0aGlzLmlkICsgXCIgKj4gI2J0bk9rXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuT2suY2xpY2soXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uQnRuT2tDbGljayhzZW5kZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld19idG5DYW5jZWwgPSAkKFwiXCIgKyB0aGlzLmlkICsgXCIgKj4gI2J0bkNhbmNlbFwiKTtcclxuICAgICAgICB0aGlzLl92aWV3X2J0bkNhbmNlbC5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25CdG5DYW5jZWwoc2VuZGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJpbmRWaWV3RXZlbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJiaW5kVmlld0V2ZW50c1wiKTtcclxuXHJcbiAgICAgICAgbGV0IGRpdkZvcm0gPSB0aGlzLl92aWV3TW9kYWxGcmFtZS5maW5kKFwiZm9ybVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRpdkZvcm0uYXR0cihcImRhdGEtYWpheC1zdWNjZXNzXCIsIHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub25FcnJvckNhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRpdkZvcm0uYXR0cihcImRhdGEtYWpheC1lcnJvclwiLCB0aGlzLm9uRXJyb3JDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9uRmFpbHVyZUNhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRpdkZvcm0uYXR0cihcImRhdGEtYWpheC1mYWlsdXJlXCIsIHRoaXMub25GYWlsdXJlQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnNhb3BGbG9hdGluZ0xhYmVsLmluaXQoKTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVuZGVyRXJyb3JzQmFubmVyKGVycm9yczpFcnJvcltdKTpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2Uge1xyXG4gICAgICAgIGxldCByZXN1bHQ6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlO1xyXG4gICAgICAgIHJlc3VsdCA9IHtyZXNwb25zZTpTYW9wU2VydmljZXNDb3JlUmVzdWx0LmVycm9yLGRhdGE6bnVsbH07IFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IGpzb25EYXRhID0gSlNPTi5zdHJpbmdpZnkoZXJyb3JzKTtcclxuICAgICAgICBsZXQgX2RhdGEgPSB7anNvbklucHV0Ompzb25EYXRhfTsgICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3MgPSBmdW5jdGlvbiAocmVzcG9uc2U6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJFcnJvcnMvUmVuZGVyRXJyb3JzQmFubmVyXCJcclxuICAgICAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IF9kYXRhXHJcbiAgICAgICAgICAgICwgYXN5bmM6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbmRlckVycm9yKGVyck1lc3NhZ2U6c3RyaW5nKTp2b2lke1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhamF4LmFmdGVyRXJyb3JcIik7XHJcbiAgICAgICAgICAgIGxldCBfZXJyb3JzOkVycm9yW107XHJcbiAgICAgICAgICAgIF9lcnJvcnMgPSBbe0NvZGU6XCJcIixNZXNzYWdlOmVyck1lc3NhZ2V9XTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBfcGFyZW50VmlldyA9ICQodGhpcy5pZCkucGFyZW50KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgX2Vycm9yQmFubmVySWQgPSB0aGlzLmlkK1wiRXJyb3JCYW5uZXJcIjtcclxuICAgICAgICAgICAgLy9sZXQgX3ZpZXdfYmFubmVyID0gdGhpcy5fdmlld01vZGFsQm9keS5maW5kKF9lcnJvckJhbm5lcklkKTtcclxuICAgICAgICAgICAgbGV0IF92aWV3X2Jhbm5lciA9IF9wYXJlbnRWaWV3LmZpbmQoX2Vycm9yQmFubmVySWQpO1xyXG4gICAgICAgICAgICBpZiAoIGdsb2JhbC5pc1VuRGVmaW5lZChfdmlld19iYW5uZXIpIHx8IF92aWV3X2Jhbm5lci5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgX3ZpZXdfYmFubmVyID0gX3BhcmVudFZpZXcuYXBwZW5kKFwiPGRpdiBpZD1cIitfZXJyb3JCYW5uZXJJZCtcIj48L2Rpdj5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IF9iYW5uZXJSZXN1bHQgPSB0aGlzLnJlbmRlckVycm9yc0Jhbm5lcihfZXJyb3JzKTtcclxuICAgICAgICAgICAgX3ZpZXdfYmFubmVyLmh0bWwoX2Jhbm5lclJlc3VsdC5kYXRhLnZpZXdDb250ZW50KTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoKGVycikge1xyXG4gICAgICAgICAgICBhbGVydChlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgfSAgXHJcbiAgICB9XHJcbiAgICAvL3B1YmxpYyBsb2FkVmlld0JvZHkod2ZBY3Rpb246U2FvcFdmQWN0aW9uLGRhdGE6YW55LHNlbmRlcjphbnkpOlNhb3BTZXJ2aWNlc0NvcmVSZXN1bHR7XHJcbiAgICBwdWJsaWMgbG9hZFZpZXdCb2R5KHdmQWN0aW9uOlNhb3BXZkFjdGlvbixkYXRhOmFueSxzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJsb2FkVmlld0JvZHlcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLmJlZm9yZVZpZXdTaG93KHNlbmRlcik7XHJcblxyXG4gICAgICAgIGxldCBfYWpheEFjdGlvbiA9IHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQgPyB0aGlzLmFkZFJlY29yZEVuZHBvaW50IDogdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQ7XHJcbiAgICAgICAgLy9fYWpheEFjdGlvbiA9IGdldFNpdGVBYnNvbHV0ZVVSTChfYWpheEFjdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlcnZpY2VzUGFyYW1zID0ge2FjdGlvbjpfYWpheEFjdGlvbixkYXRhOmRhdGEsdHlwZTpcIlBPU1RcIn07XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3MgPSBmdW5jdGlvbihfYWpheFJlc3VsdCl7XHJcbiAgICAgICAgICAgIGlmIChfYWpheFJlc3VsdC5yZXNwb25zZSA9PSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3Mpe1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFqYXguc3VjY2Vzc1wiKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl92aWV3TW9kYWxCb2R5Lmh0bWwoX2FqYXhSZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlclZpZXdTaG93KHNlbmRlcix3ZkFjdGlvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWpheC5lcnJvclwiKTtcclxuICAgICAgICAgICAgICAgIGlmICgoZ2xvYmFsLmlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEpICYmIGdsb2JhbC5pc1VuRGVmaW5lZChfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSkpID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJFcnJvcihfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9hamF4UmVzdWx0LmRhdGEucmVzcG9uc2VKU09OICYmIF9hamF4UmVzdWx0LmRhdGEucmVzcG9uc2VKU09OLm1lc3NhZ2Upe1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0aWZ5LmVycm9yKF9hamF4UmVzdWx0LmRhdGEucmVzcG9uc2VKU09OLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5hZnRlckVycm9yID0gZnVuY3Rpb24oX2FqYXhSZXN1bHQpe1xyXG4vLyMjI1xyXG4gICAgICAgICAgICBpZiAoKGdsb2JhbC5pc1VuRGVmaW5lZChfYWpheFJlc3VsdC5kYXRhKSAmJiBnbG9iYWwuaXNVbkRlZmluZWQoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpKSA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJFcnJvcihfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHRoaXMuX3NlcnZpY2VzUGFyYW1zKTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgcHVibGljIGFmdGVyU3VibWl0U3VjY2VzcyhyZXN1bHQ6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuYWZ0ZXJFeGVjdXRlU3VjY2Vzc1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TdWJtaXRTdWNjZXNzQ29tcGxldGUocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uU3VibWl0U3VjY2Vzc0NvbXBsZXRlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdEVycm9yKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5vblN1Ym1pdEVycm9yXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdEZhaWx1cmUocmVzdWx0OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uU3VibWl0RmFpbHVyZVwiKTtcclxuICAgICAgICB2YXIgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5oYW5kbGVTdWJtaXRFcnJvcihyZXN1bHQpO1xyXG4gICAgfVxyXG4gXHJcbiAgICBwdWJsaWMgb25TdWJtaXRTdWNjZXNzKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5vbkV4ZWN1dGVTdWNjZXNzXCIpO1xyXG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0LnN1Y2Nlc3NcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5tb2RhbCgnaGlkZScpO1xyXG5cclxuICAgICAgICAgICAgLy8ganVzdCBpbiBjYXNlOiBvZHN0cmFuaSwgxI1lIGplIMWhZSB2ZWRubyB2aWRubywgYXZ0b21hdHNrbyBzZSBuZSB6YXByZSB2ZWRubyA6KFxyXG4gICAgICAgICAgICAkKCcubW9kYWwtYmFja2Ryb3AnKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJChkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcyhcIm1vZGFsLW9wZW5cIik7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmFsZXJ0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXN1bHQuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgfSAgXHJcblxyXG4gICAgICAgICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLnJlZnJlc2hEYXRhKSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMub25TdWJtaXRTdWNjZXNzQ29tcGxldGUocmVzdWx0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0LmVycm9yXCIpO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVsb2FkIHZpZXcgZm9ybVwiKTtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29udGVudChyZXN1bHQudmlld0NvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFmdGVyU3VibWl0U3VjY2VzcyhyZXN1bHQpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaENvbnRlbnQodmlld0NvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbCh2aWV3Q29udGVudCk7XHJcbiAgICAgICAgdGhpcy5iaW5kQnV0dG9ucyhudWxsKTtcclxuICAgICAgICB0aGlzLmJpbmRWaWV3RXZlbnRzKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25BZnRlclJlZnJlc2hDb250ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQWZ0ZXJSZWZyZXNoQ29udGVudCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25BZnRlclJlZnJlc2hDb250ZW50XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkRlbGV0ZVJlY29yZChkZWxldGVEYXRhOmFueSk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uRGVsZXRlUmVjb3JkXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7YWN0aW9uOnRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQsZGF0YTpkZWxldGVEYXRhLHR5cGU6XCJQT1NUXCJ9O1xyXG5cclxuICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzID0gZnVuY3Rpb24oX2FqYXhSZXN1bHQpe1xyXG4gICAgICAgICAgICBpZiAoX2FqYXhSZXN1bHQucmVzcG9uc2UgPT0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzKXtcclxuICAgICAgICAgICAgICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQoX3RoaXMucmVmcmVzaERhdGEpKXtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWZyZXNoRGF0YShkZWxldGVEYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0aWZ5LmVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24odGhpcy5fc2VydmljZXNQYXJhbXMpO1xyXG5cclxuICAgICAgICAvLyBsZXQgX2FqYXhSZXN1bHQgPSB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih0aGlzLl9zZXJ2aWNlc1BhcmFtcyk7XHJcbiAgICAgICAgLy8gaWYgKF9hamF4UmVzdWx0LnJlc3BvbnNlID09IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2Vzcyl7XHJcbiAgICAgICAgLy8gICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLnJlZnJlc2hEYXRhKSl7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKGRlbGV0ZURhdGEpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgYWxlcnRpZnkuZXJyb3IoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyByZXR1cm4gX2FqYXhSZXN1bHQucmVzcG9uc2U7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyByZWZyZXNoRGF0YShzZW5kZXI6YW55KTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVmcmVzaERhdGFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZVJlY29yZCh0aXRsZTpzdHJpbmcsbWVzc2FnZTpzdHJpbmcsZGVsZXRlRGF0YTphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImRlbGV0ZVJlY29yZC5iZWdpblwiKTtcclxuICAgICAgICBsZXQgc2FvcE1lc3NhZ2VEbGcgPSBuZXcgU2FvcE1lc3NhZ2VEbGcoZGVsZXRlRGF0YSkgIFxyXG4gICAgICAgIHNhb3BNZXNzYWdlRGxnLm9uWWVzID0gdGhpcy5vbkRlbGV0ZVJlY29yZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHNhb3BNZXNzYWdlRGxnLlNob3cobWVzc2FnZSx0aXRsZSwxLFtTYW9wTXNnRGxnQnV0dG9uLm1iWWVzLFNhb3BNc2dEbGdCdXR0b24ubWJOb10pO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJkZWxldGVSZWNvcmQuZW5kXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRSZWNvcmQoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhZGRSZWNvcmRcIik7XHJcbiAgICAgICAgbGV0IF9yZXN1bHQgPSB0aGlzLmxvYWRWaWV3Qm9keShTYW9wV2ZBY3Rpb24ud2ZhQWRkUmVjb3JkLGRhdGEsc2VuZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZWRpdFJlY29yZChkYXRhOmFueSxzZW5kZXI6YW55ID0gbnVsbCk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImVkaXRSZWNvcmRcIik7XHJcbiAgICAgICAgdGhpcy5sb2FkVmlld0JvZHkoU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQsZGF0YSxzZW5kZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWNvcmREZXRhaWxzKGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZWRpdFJlY29yZFwiKTtcclxuICAgICAgICB0aGlzLmxvYWRWaWV3Qm9keShTYW9wV2ZBY3Rpb24ud2ZhUmVjb3JkRGVzdGFpbHMsZGF0YSxzZW5kZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtYW51YWxseVN1Ym1pdChzdWJtaXREYXRhOiBhbnksIHNwaW5uZXJEaXZJZDogc3RyaW5nID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtYW51YWxseVN1Ym1pdFwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKGdsb2JhbC5pc0VtcHR5KHNwaW5uZXJEaXZJZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7IGFjdGlvbjogdGhpcy5tYW51YWxseVN1Ym1pdEVuZHBvaW50LCBkYXRhOiBzdWJtaXREYXRhLCB0eXBlOiBcIlBPU1RcIiB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7IGFjdGlvbjogdGhpcy5tYW51YWxseVN1Ym1pdEVuZHBvaW50LCBkYXRhOiBzdWJtaXREYXRhLCB0eXBlOiBcIlBPU1RcIiwgc3Bpbm5lckRpdklkOiBzcGlubmVyRGl2SWQgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3MgPSBmdW5jdGlvbiAoX2FqYXhSZXN1bHQpIHtcclxuICAgICAgICAgICAgX3RoaXMub25TdWJtaXRTdWNjZXNzKF9hamF4UmVzdWx0LmRhdGEpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24odGhpcy5fc2VydmljZXNQYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93Vmlld0Zvcm0od2ZBY3Rpb246U2FvcFdmQWN0aW9uLGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93Vmlld0Zvcm1cIik7XHJcbiAgICAgICAgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRSZWNvcmQoZGF0YSxzZW5kZXIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0UmVjb3JkKGRhdGEsc2VuZGVyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFSZWNvcmREZXN0YWlscykgeyAgXHJcbiAgICAgICAgICAgIHRoaXMucmVjb3JkRGV0YWlscyhkYXRhLHNlbmRlcik7ICAgICAgICAgIFxyXG4gICAgICAgIH0gICBcclxuICAgICAgICB0aGlzLlNldFRvRnVsbFNjcmVlbigpOyAgICAgIFxyXG4gICAgfSAgXHJcblxyXG4gICAgcHVibGljIFNldFRvRnVsbFNjcmVlbigpe1xyXG4gICAgICAgIGlmICh0aGlzLmZ1bGxTY3JlZW4gKXtcclxuICAgICAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUuYWRkQ2xhc3MoXCJzYW9wLW1vZGFsLWZ1bGxzY3JlZW4tZm9ybVwiKTtcclxuICAgICAgICAgICAgbGV0IF9kaWFsb2dEaXYgPSB0aGlzLl92aWV3TW9kYWxGcmFtZS5maW5kKFwiLm1vZGFsLWRpYWxvZ1wiKTtcclxuICAgICAgICAgICAgX2RpYWxvZ0Rpdi5yZW1vdmVDbGFzcygnbW9kYWwtZGlhbG9nLWNlbnRlcmVkJyk7XHJcbiAgICAgICAgICAgIF9kaWFsb2dEaXYuYWRkQ2xhc3MoJ21vZGFsLWZ1bGxzY3JlZW4nKTtcclxuICAgICAgICAgICAgX2RpYWxvZ0Rpdi5yZW1vdmVBdHRyKCdzdHlsZScpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGxldCBfY29udGVudCA9IHRoaXMuX3ZpZXdNb2RhbEZyYW1lLmZpbmQoXCIubW9kYWwtY29udGVudFwiKTtcclxuICAgICAgICAgICAgX2NvbnRlbnQucmVtb3ZlQXR0cignY2xhc3MnKTtcclxuICAgICAgICAgICAgX2NvbnRlbnQuYWRkQ2xhc3MoJ21vZGFsLWNvbnRlbnQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZnJlc2hFbGVtZW50RGF0YShodG1sQ29udGVudDpzdHJpbmcsZWxlbWVudElkOnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWZyZXNoRWxlbWVudERhdGFcIik7XHJcbiAgICAgICAgbGV0IF9kb2N1bWVudCA9ICQoaHRtbENvbnRlbnQpO1xyXG4gICAgICAgIGxldCBfY2VsbCA9IF9kb2N1bWVudC5maW5kKGVsZW1lbnRJZCk7XHJcbiAgICAgICAgJChlbGVtZW50SWQpLnJlcGxhY2VXaXRoKF9jZWxsKTtcclxuICAgICAgfVxyXG5cclxuICAgIC8vICBcclxufVxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFV0aWxzIH0gZnJvbSBcIi4vQ29yZS9zYW9wLXV0aWxzXCI7XHJcbmltcG9ydCB7IFNhb3BUb2dnbGVQYW5lbCB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC10b2dnbGUtcGFuZWxcIjtcclxuaW1wb3J0IHsgU2FvcElucHV0TWFzayB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1pbnB1dG1hc2tcIjtcclxuaW1wb3J0IHsgU2FvcENoZWNrYm94U3dpdGNoIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLWNoZWNrYm94LXN3aXRjaFwiO1xyXG5pbXBvcnQgeyBTYW9wTXVsdGlzZWxlY3QgIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLW11bHRpc2VsZWN0XCI7XHJcbmltcG9ydCB7IFNhb3BWaWV3U3Bpbm5lciB9IGZyb20gJy4vQ29tcG9uZW50cy9zYW9wLXZpZXctc3Bpbm5lcic7XHJcbmltcG9ydCB7IFNhb3BSaWdodFNpZGViYXIgfSBmcm9tICcuL0NvbXBvbmVudHMvc2FvcC1yaWdodC1zaWRlYmFyJztcclxuaW1wb3J0IHsgTWVudVNpZGViYXIgfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtbWVudS1zaWRlYmFyXCI7XHJcbmltcG9ydCB7IFNhb3BNZXNzYWdlRGxnIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLW1lc3NhZ2UtZGxnXCI7XHJcbmltcG9ydCB7IFNhb3BQb3B1cERpYWxvZyB9IGZyb20gJy4vQ29tcG9uZW50cy9zYW9wLXBvcHVwLWRpYWxvZydcclxuaW1wb3J0IHsgU2FvcEZsb2F0aW5nTGFiZWwgfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtZmxvYXRpbmctbGFiZWxcIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gJy4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmUnO1xyXG5pbXBvcnQgeyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWQgfSBmcm9tICcuL0NvbXBvbmVudHMvc2FvcC1ncmlkJztcclxuaW1wb3J0IHsgU2FvcFZpZXdGb3JtIH0gZnJvbSAnLi9Db3JlL3Nhb3Atdmlldy1mb3JtJztcclxuaW1wb3J0IHsgU2FvcFRyZWV2aWV3IH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3AtdHJlZXZpZXcnO1xyXG5pbXBvcnQgeyBTYW9wU2VsZWN0aXplU2VsZWN0IH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3Atc2VsZWN0aXplLXNlbGVjdCc7XHJcbmltcG9ydCB7IFNhb3BQZGZQcmV2aWV3ICB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1wZGYtcHJldmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wUGluY2hab29tICB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1waW5jaC1hbmQtem9vbVwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVjaG9UZXN0KG1zZzpzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKFwiZWNobzogXCIrbXNnKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ29tcGF0aWJpbGl0eSgpOiBib29sZWFuIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjaGVja0NvbXBhdGliaWxpdHlcIik7XHJcbiAgICBsZXQgdXRpbHMgPSBuZXcgU2FvcFV0aWxzKCk7XHJcbiAgICByZXR1cm4gdXRpbHMuY2hlY2tDb21wYXRpYmlsaXR5KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0Q2xpZW50TG9nTW9kZVZhbHVlKCkge1xyXG4gICAgZ2xvYmFsLmRlYnVnTW9kZSA9IGdsb2JhbC5HZXRDbGllbnRMb2dNb2RlU3RvcmFnZVZhbHVlKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0U2l0ZUJhc2VVcmxWYWx1ZSgpIHtcclxuICAgIGdsb2JhbC5zaXRlQmFzZVVybCA9IGdsb2JhbC5nZXRTaXRlQmFzZVVybCgpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplU2l0ZUpTKCkge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImluaXRpYWxpemVTaXRlSlNcIik7XHJcbiAgICBuZXcgTWVudVNpZGViYXIoKS5pbml0KCk7XHJcbiAgICBuZXcgU2FvcFRvZ2dsZVBhbmVsKCkuaW5pdCgpO1xyXG5cclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmIChlLmN0cmxLZXkgJiYgZS5hbHRLZXkgJiYgZS5rZXlDb2RlID09IDc5KSB7XHJcbiAgICAgICAgICAgIC8vIENUUkwgKyBBTFQgKyBPXHJcbiAgICAgICAgICAgIGdsb2JhbC5TZXRDbGllbnRMb2dNb2RlU3RvcmFnZVZhbHVlKCk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5kZWJ1Z01vZGUgPSBnbG9iYWwuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGdsb2JhbC5zZXRIZWxwTGluaygpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0Rmlyc3RDb250cm9sVG9Gb2N1cyhmb3JtSWQ6IHN0cmluZykge1xyXG4gICAgZ2xvYmFsLnNldEZpcnN0Rm9ybUNvbnRyb2xUb0ZvY3VzKGZvcm1JZCk7XHJcbn1cclxuXHJcbmV4cG9ydCB7Z2xvYmFsfTtcclxuXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUb2dnbGVQYW5lbEV4IGV4dGVuZHMgU2FvcFRvZ2dsZVBhbmVse307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcElucHV0TWFza0V4IGV4dGVuZHMgU2FvcElucHV0TWFza3t9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BDaGVja2JveFN3aXRjaEV4IGV4dGVuZHMgU2FvcENoZWNrYm94U3dpdGNoe307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE11bHRpc2VsZWN0RXggZXh0ZW5kcyBTYW9wTXVsdGlzZWxlY3R7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wTWVzc2FnZURsZ0V4IGV4dGVuZHMgU2FvcE1lc3NhZ2VEbGd7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUG9wdXBEaWFsb2dFeCBleHRlbmRzIFNhb3BQb3B1cERpYWxvZ3t9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BWaWV3U3Bpbm5lckVYIGV4dGVuZHMgU2FvcFZpZXdTcGlubmVyIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmlnaHRTaWRlYmFyRXggZXh0ZW5kcyBTYW9wUmlnaHRTaWRlYmFyIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wRmxvYXRpbmdMYWJlbEV4IGV4dGVuZHMgU2FvcEZsb2F0aW5nTGFiZWwgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BTZXJ2aWNlc0NvcmVFeCBleHRlbmRzIFNhb3BTZXJ2aWNlc0NvcmUgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmFuc2xhdGlvblNlcnZpY2VFeCBleHRlbmRzIFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BXZWJHcmlkRXggZXh0ZW5kcyBTYW9wV2ViR3JpZCB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFZpZXdGb3JtRXggZXh0ZW5kcyBTYW9wVmlld0Zvcm0geyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BVdGlsc0V4IGV4dGVuZHMgU2FvcFV0aWxzIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVHJlZXZpZXdFeCBleHRlbmRzIFNhb3BUcmVldmlldyB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNlbGVjdGl6ZVNlbGVjdEV4IGV4dGVuZHMgU2FvcFNlbGVjdGl6ZVNlbGVjdCB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBkZlByZXZpZXdFeCBleHRlbmRzIFNhb3BQZGZQcmV2aWV3IHt9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQaW5jaFpvb21FeCBleHRlbmRzIFNhb3BQaW5jaFpvb20ge307XHJcbi8vXHJcbiJdfQ=="}