'},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalWindow=t.ModalWindowView=void 0;const i=n(8),r=n(33),o=n(5);var s,a;!function(e){e[e.ADD_TEXT=0]="ADD_TEXT",e[e.EDIT_TEXT=1]="EDIT_TEXT",e[e.HOTKEYS=2]="HOTKEYS",e[e.ERROR_LOG=3]="ERROR_LOG",e[e.DOCUMENT_UPLOAD=4]="DOCUMENT_UPLOAD",e[e.MOVE_TO=5]="MOVE_TO",e[e.NEW_FOLDER=6]="NEW_FOLDER",e[e.RENAME=7]="RENAME"}(s=t.ModalWindowView||(t.ModalWindowView={})),function(e){e[e.OPEN=0]="OPEN",e[e.CLOSED=1]="CLOSED"}(a||(a={}));t.ModalWindow=class{constructor(e){this.openAddSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-add").removeEventListener("click",this.addSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-add").addEventListener("click",this.addSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.openEditSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-save").removeEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-save").addEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.addSylText=function(){const e={action:"addSyl",param:{elementId:document.getElementsByClassName("syllable selected")[0].id,sylText:document.getElementById("neon-modal-window-edit-text-input").value}};this.neonView.edit(e,this.neonView.view.getCurrentPageURI()).then(e=>{e&&this.neonView.updateForCurrentPage().then(()=>{})}),this.hideModalWindow()},this.updateSylText=function(){const e=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0],t=e.textContent.replace(/\u{25CA}/u,"").trim(),n=document.getElementById("neon-modal-window-edit-text-input").value;if(null!==n&&n!==t){const t={action:"setText",param:{elementId:[...e.classList.entries()].filter(e=>"text-select"!==e[1]&&"selected-to-edit"!==e[1])[0][1],text:n}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(t=>{t&&this.neonView.updateForCurrentPage().then(()=>{this.updateSelectedBBox(e,this.dragHandler,this.neonView)})})}else this.updateSelectedBBox(e,this.dragHandler,this.neonView);this.hideModalWindow()},this.keydownListener=function(e){switch(e.stopImmediatePropagation(),this.modalWindowView){case s.ADD_TEXT:"Enter"===e.key&&this.addSylText(),"Escape"===e.key&&this.hideModalWindow();break;case s.EDIT_TEXT:"Enter"===e.key&&this.updateSylText(),"Escape"===e.key&&this.hideModalWindow();break;default:"Escape"===e.key&&this.hideModalWindow()}},this.focusModalWindow=function(){switch(this.modalWindowView){case s.ADD_TEXT:case s.EDIT_TEXT:document.getElementById("neon-modal-window-edit-text-input").select();break;case s.DOCUMENT_UPLOAD:case s.NEW_FOLDER:case s.RENAME:break;default:document.getElementById("neon-modal-window").focus()}},this.neonView=e,this.modalWindowState=a.CLOSED,this.setupEventListeners()}setupEventListeners(){document.getElementById("neon-modal-window-header-close").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").addEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").addEventListener("click",this.focusModalWindow.bind(this))}removeEventListeners(){document.getElementById("neon-modal-window-header-close").removeEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").removeEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").removeEventListener("click",this.focusModalWindow.bind(this))}setModalWindowView(e,t){this.modalWindowView=e,this.setModalWindowContent(t)}getModalWindowView(){return this.modalWindowView.toString()}openModalWindow(){switch(Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),this.modalWindowView){case s.ADD_TEXT:this.openAddSylTextModalWindow();break;case s.EDIT_TEXT:this.openEditSylTextModalWindow();break;case s.HOTKEYS:document.getElementById("neon-modal-window-content-hotkeys").classList.add("visible");case s.DOCUMENT_UPLOAD:case s.MOVE_TO:case s.NEW_FOLDER:case s.RENAME:default:document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()}document.body.style.overflowX="hidden",document.body.style.overflowY="hidden",this.modalWindowState=a.OPEN}hideModalWindow(){switch(this.modalWindowView){case s.EDIT_TEXT:document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].classList.remove("selected-to-edit");break;case s.DOCUMENT_UPLOAD:case s.MOVE_TO:case s.NEW_FOLDER:case s.RENAME:document.getElementById("neon-modal-window-content-container").innerHTML=""}document.getElementById("neon-modal-window-container").style.display="none",document.body.style.overflowX="hidden",document.body.style.overflowY="scroll",this.modalWindowState=a.CLOSED,this.removeEventListeners()}setModalWindowContent(e){const t=document.getElementById("neon-modal-window-content-container"),n=document.getElementById("neon-modal-window-header-title");switch(this.modalWindowView){case s.ADD_TEXT:t.innerHTML=i.addTextModal,n.innerText="ENTER SYLLABLE TEXT";break;case s.EDIT_TEXT:t.innerHTML=i.editTextModal,n.innerText="EDIT SYLLABLE TEXT";const o=/\u{25CA}/u,a=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].textContent.replace(o,"").trim();document.getElementById("neon-modal-window-edit-text-input").value=a;break;case s.HOTKEYS:t.innerHTML=i.hotkeysModal,n.innerText="HOTKEYS";break;case s.ERROR_LOG:t.innerHTML=`
${e}
\n
`,n.innerText="ERROR LOG";break;case s.DOCUMENT_UPLOAD:n.innerText="DOCUMENT UPLOAD",t.innerHTML=r.uploadAreaHTML;break;case s.MOVE_TO:n.innerText="MOVE TO";break;case s.NEW_FOLDER:n.innerText="NEW FOLDER",t.innerHTML=r.newFolderHTML;break;case s.RENAME:n.innerText="RENAME",t.innerHTML=r.renameHTML;break;default:console.error("Unknown selection type. This should not have occurred.")}}updateSelectedBBox(e,t,n){(0,o.unselect)();const i=Array.from(e.classList).find(e=>"text-select"!==e&&"selected-to-edit"!==e);if(document.getElementById("displayBBox").checked&&document.getElementById(i)){const e=document.getElementById(i).querySelector(".sylTextRect-display");(0,o.selectBBox)(e,t,n)}}}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";for(var i=n(12),r=[],o=0;o<256;++o)r.push((o+256).toString(16).substr(1));t.a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(r[e[t+0]]+r[e[t+1]]+r[e[t+2]]+r[e[t+3]]+"-"+r[e[t+4]]+r[e[t+5]]+"-"+r[e[t+6]]+r[e[t+7]]+"-"+r[e[t+8]]+r[e[t+9]]+"-"+r[e[t+10]]+r[e[t+11]]+r[e[t+12]]+r[e[t+13]]+r[e[t+14]]+r[e[t+15]]).toLowerCase();if(!Object(i.a)(n))throw TypeError("Stringified UUID is invalid");return n}},function(e,t,n){"use strict";var i=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;t.a=function(e){return"string"==typeof e&&i.test(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initDisplayControls=t.loadHighlightSettings=t.updateDisplayAllBtn=t.updateHighlight=t.setHighlightSelectionControls=t.setHighlightControls=t.setHighlightOption=t.getHighlightType=t.setCircleSizeControls=t.setBgOpacityFromSlider=t.setGlyphOpacityFromSlider=t.setZoomControls=void 0;const i=n(18),r=n(4),o=n(7);let s,a,c;function l(e){const t=document.getElementById("opacityOutput");document.getElementById("opacitySlider").value=t.value,(0,r.setSettings)({glyphOpacity:Number(t.value)});const n=document.querySelector("#toggle-glyph-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show glyph")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide glyph"));try{document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=(Number(t.value)/100).toString()})}catch(e){console.warn("Unable to properly set opacity to pages")}}function d(e){const t=document.querySelector("#bgOpacityOutput");(0,r.setSettings)({imageOpacity:Number(t.value)});const n=document.querySelector("#toggle-bg-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show background image")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide background image"));const i=document.querySelector("."+e);i&&(i.style.opacity=String(Number(t.value)/100))}function u(e){const t=document.getElementById("highlight-"+e),n=document.getElementById("highlight-dropdown"),o=document.getElementById("highlight-type");if((0,r.setSettings)({highlightMode:e}),n.classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),"none"===e)return o.textContent=" - Off",void i.unsetGroupingHighlight();t.classList.add("highlight-selected"),o.textContent=" - "+(e[0].toUpperCase()+e.slice(1)),i.setGroupingHighlight(e)}function f(e){document.getElementById("highlight-"+e).addEventListener("click",()=>{u(e)})}function m(){document.body.removeEventListener("click",m),document.getElementById("highlight-dropdown").classList.remove("is-active")}function h(){const e=document.getElementById("highlight-dropdown");document.getElementById("highlight-button").addEventListener("click",t=>{t.stopPropagation(),e.classList.toggle("is-active"),e.classList.contains("is-active")?(document.body.addEventListener("click",m),f("column"),f("staff"),f("syllable"),f("neume"),f("layerElement"),f("none")):document.body.removeEventListener("click",m)})}function p(){const{highlightMode:e}=(0,r.getSettings)();u(e)}t.setZoomControls=function(e){if(void 0===e)return;const t=document.getElementById("zoomSlider"),n=document.getElementById("zoomOutput"),{zoom:i}=(0,r.getSettings)();t.value=String(i),n.value=String(i),e.zoomTo(i/100),document.getElementById("reset-zoom").addEventListener("click",()=>{n.value="100",t.value="100",e.resetZoomAndPan()}),document.querySelector("#set-zoom-easy-edit").addEventListener("click",()=>{n.value="180",t.value="180",e.zoomTo(1.8)}),t.addEventListener("mouseup",(function(){n.value=t.value,e.zoomTo(Number(n.value)/100)})),t.disabled=!1,document.body.addEventListener("keydown",i=>{const r=parseInt(n.value);if("ArrowUp"===i.key||"ArrowDown"===i.key||"ArrowRight"===i.key||"ArrowLeft"===i.key)i.preventDefault();else if("+"===i.key){const i=Math.min(r+20,parseInt(t.getAttribute("max")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else if("_"===i.key){const i=Math.max(r-20,parseInt(t.getAttribute("min")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else"0"===i.key&&(n.value="100",t.value="100",e.resetZoomAndPan())})},t.setGlyphOpacityFromSlider=l,t.setBgOpacityFromSlider=d,t.setCircleSizeControls=function(){const e=document.getElementById("circleSlider"),t=document.getElementById("circleOutput"),{circleSize:n}=(0,r.getSettings)();function i(){t.value=e.value,c=Number(e.value),(0,r.setSettings)({circleSize:Number(c)});const n=o.selectAll(".resizePoint");n.empty()||n.attr("r",c)}c=n,e.value=String(n),t.value=String(n),document.getElementById("reset-circle-size").addEventListener("click",()=>{const n=o.selectAll(".resizePoint");n.empty()||n.attr("r",25),c=Number(25),e.value=String(25),t.value=String(25),(0,r.setSettings)({circleSize:Number(25)}),i()}),e.addEventListener("input",i),e.addEventListener("change",i),e.disabled=!1},t.getHighlightType=function(){return document.getElementById("highlight-type").textContent.slice(3).toLowerCase()},t.setHighlightOption=f,t.setHighlightControls=h,t.setHighlightSelectionControls=function(){const e=document.getElementById("highlight-selection");e.addEventListener("click",()=>{document.getElementById("highlight-dropdown").classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),e.classList.add("highlight-selected"),document.getElementById("highlight-type").textContent=" - Selection",i.setGroupingHighlight("selection")})},t.updateHighlight=function(){let e;try{e=document.querySelector(".highlight-selected").id}catch(t){e=""}switch(e){case"highlight-column":i.setGroupingHighlight("column");break;case"highlight-staff":i.setGroupingHighlight("staff");break;case"highlight-syllable":i.setGroupingHighlight("syllable");break;case"highlight-neume":i.setGroupingHighlight("neume");break;case"highlight-layerElement":i.setGroupingHighlight("layerElement");break;case"highlight-selection":i.setGroupingHighlight("selection");break;default:i.unsetGroupingHighlight()}},t.updateDisplayAllBtn=function(){const e=document.getElementById("display-all-btn"),t=document.getElementById("displayInfo"),n=document.getElementById("displayBBox"),i=document.getElementById("displayText"),r=document.getElementById("display-errors");(null==t?void 0:t.checked)&&(null==n?void 0:n.checked)&&(null==i?void 0:i.checked)&&(null==r?void 0:r.checked)?(e.classList.add("selected"),e.innerHTML="Hide All"):e.classList.contains("selected")&&(e.classList.remove("selected"),e.innerHTML="Display All")},t.loadHighlightSettings=p,t.initDisplayControls=function(e,t){!function(e){const t=document.getElementById("opacitySlider"),n=document.getElementById("opacityOutput"),{glyphOpacity:i}=(0,r.getSettings)();function o(){n.value=t.value,s=Number(t.value),l(e)}s=i,t.value=String(i),n.value=String(i);const a=document.getElementById("toggle-glyph-opacity");100==i&&a.classList.add("hide-icon"),null==a||a.addEventListener("click",()=>{let i;a.classList.contains("hide-icon")?(a.classList.remove("hide-icon"),i=0):(a.classList.add("hide-icon"),i=1),document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=i.toString()}),s=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({glyphOpacity:100*i}),o()}),t.addEventListener("input",o),t.addEventListener("change",o),t.disabled=!1}(e),function(e){const t=document.getElementById("bgOpacitySlider"),n=document.getElementById("bgOpacityOutput"),{imageOpacity:i}=(0,r.getSettings)();function o(){n.value=t.value,a=Number(t.value),d(e)}a=i,t.value=String(i),n.value=String(i);const s=document.getElementById("toggle-bg-opacity");100==i&&s.classList.add("hide-icon"),s.addEventListener("click",()=>{let i;s.classList.contains("hide-icon")?(s.classList.remove("hide-icon"),i=0):(s.classList.add("hide-icon"),i=1),document.getElementsByClassName(e)[0].style.opacity=i.toString(),a=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({imageOpacity:100*i}),o()}),t.addEventListener("input",o),t.addEventListener("change",o),t.disabled=!1}(t),h(),document.getElementById("burgerMenu").addEventListener("click",()=>{document.getElementById("burgerMenu").classList.toggle("is-active"),document.getElementById("navMenu").classList.toggle("is-active")}),document.body.addEventListener("keydown",e=>{if(!e.metaKey)switch(e.key){case"q":u("staff");break;case"w":u("syllable");break;case"e":u("neume");break;case"r":u("layerElement");break;case"t":u("selection");break;case"y":u("none")}}),function(){const e=document.querySelector("#display-all-btn");e.addEventListener("click",()=>{if(e.classList.contains("selected")){e.classList.remove("selected"),e.innerHTML="Display All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked&&e.click()})}else{e.classList.add("selected"),e.innerHTML="Hide All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked||e.click()})}})}(),p();const n=document.getElementById("displayContents"),i=document.getElementById("toggleDisplay");document.getElementById("displayHeader").addEventListener("click",e=>{e.stopPropagation(),n.classList.contains("closed")?(n.classList.remove("closed"),n.style.padding="0.5em 0.75em",setTimeout(()=>{n.style.overflow="visible"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(n.classList.add("closed"),n.style.overflow="hidden",setTimeout(()=>{n.style.padding="0px"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.triggerDefaultActions=t.triggerDefaultSylActions=t.triggerBBoxActions=t.triggerSingleStaffActions=t.triggerStaffSplitMode=t.triggerMultiStaffActions=t.triggerLayerElementActions=t.triggerSyllableActions=t.triggerNeumeActions=t.triggerNcActions=t.addChangeStaffListener=t.addAddSylListener=t.matchHeightHandler=t.moveOutsideSyllableHandler=t.insertToSyllableHandler=t.changeStaffHandler=t.removeHandler=t.endOptionsSelection=t.deleteButtonHandler=t.unsetLiquescentAnticlockwiseAction=t.unsetLiquescentClockwiseAction=t.unsetVirgaReversedAction=t.unsetVirgaAction=t.unsetInclinatumAction=t.initNeonView=void 0;const i=n(8),r=n(24),o=n(3),s=n(35),a=n(36),c=n(5),l=n(9);let d;function u(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function f(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function m(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function h(e){return{action:"set",param:{elementId:e,attrType:"curve",attrValue:""}}}function p(e){return{action:"setLiquescent",param:{elementId:e,curve:""}}}function g(e){"d"!==e.key&&"Backspace"!==e.key||(y(),e.preventDefault())}function v(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden")),document.body.removeEventListener("keydown",g)}function y(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{t.classList.contains("syl")&&(t=t.closest(".syllable")),t.classList.contains("accid")&&(t=t.closest(".accid")),t.classList.contains("divLine")&&(t=t.closest(".divLine")),e.push({action:"remove",param:{elementId:t.id}})});const t={action:"chain",param:e};v(),d.edit(t,d.view.getCurrentPageURI()).then(()=>{d.updateForCurrentPage()})}function b(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"changeStaff",param:{elementId:t.id}})});const t={action:"chain",param:e};v(),d.edit(t,d.view.getCurrentPageURI()).then(()=>{d.updateForCurrentPage()})}function w(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"insertToSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Insert Success","success"):o.default.queueNotification("Insert Failed XoX","error"),v(),d.updateForCurrentPage()})}function _(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"moveOutsideSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Move Success","success"):o.default.queueNotification("Move Failed XoX","error"),v(),d.updateForCurrentPage()})}function E(){const e=Array.from(document.getElementsByClassName("selected"));e.length>1&&o.default.queueNotification("Cannot match height to multiple bbox","error");const t={action:"matchHeight",param:{elementId:e[0].id}};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Height Match Success","success"):o.default.queueNotification("Height Match Failed XoX","error"),v(),d.updateForCurrentPage()})}function S(){const e=d.modal;e.setModalWindowView(l.ModalWindowView.ADD_TEXT),e.openModalWindow()}function k(){const e=document.getElementById("delete");e&&(e.removeEventListener("click",y),e.addEventListener("click",y),document.body.addEventListener("keydown",g))}function L(){const e=document.getElementById("changeStaff");null==e||e.removeEventListener("click",b),null==e||e.addEventListener("click",b)}function A(){const e=document.getElementById("col-input"),t=document.querySelectorAll(".staff.selected");let n;for(const e of t){const t=Array.from(e.classList).join(" ").match(/\bcolumn(\d+)\b/);if(t){const e=parseInt(t[1],10);if(n&&n!=e){document.getElementById("col-warning").innerText="The selected staves are not of the same column!",n=0;break}n=e}}n&&(e.value=n.toString())}function x(){const e=document.getElementById("col-decrement"),t=document.getElementById("col-increment"),n=document.getElementById("col-confirm"),i=document.getElementById("col-input");function r(e){let t=parseInt(i.value,10)||0;t+=e,t=Math.min(Math.max(t,1),5),t.toString()!=i.value&&(n.style.display=""),i.value=t.toString()}e.addEventListener("click",(function(){r(-1)})),t.addEventListener("click",(function(){r(1)})),n.addEventListener("click",(function(){const e=[];document.querySelectorAll(".staff.selected").forEach(t=>{e.push({action:"set",param:{elementId:t.id,attrType:"type",attrValue:"column"+i.value}})});const t={action:"chain",param:e};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Column Value Update Success","success"):o.default.queueNotification("Column Value Update Failed XoX","error"),v(),d.updateForCurrentPage()})}))}function C(e,t,n=!0){const i=document.getElementById(e);i&&(i.parentElement.classList.remove("hidden"),n?i.innerHTML=t:i.innerHTML+=t)}function T(e){d.edit(e,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}function N(){const e=document.querySelector(".staff.selected");if(null!==e){new s.SplitStaffHandler(d,e).startSplit(),v()}else console.error("No staff was selected!"),v()}function O(){document.querySelectorAll(".drop_select").forEach(e=>{const t=()=>{document.body.removeEventListener("click",t),e.classList.remove("is-active")};e.addEventListener("click",n=>{e.classList.toggle("is-active"),Array.from(document.querySelectorAll(".drop_select")).filter(t=>t!==e).forEach(e=>e.classList.remove("is-active")),n.stopPropagation(),e.classList.contains("is-active")?document.body.addEventListener("click",t):document.body.removeEventListener("click",t)})})}t.initNeonView=function(e){d=e,r.initNeonView(e)},t.unsetInclinatumAction=u,t.unsetVirgaAction=f,t.unsetVirgaReversedAction=m,t.unsetLiquescentClockwiseAction=h,t.unsetLiquescentAnticlockwiseAction=p,t.deleteButtonHandler=g,t.endOptionsSelection=v,t.removeHandler=y,t.changeStaffHandler=b,t.insertToSyllableHandler=w,t.moveOutsideSyllableHandler=_,t.matchHeightHandler=E,t.addAddSylListener=function(){const e=document.getElementById("addSyl");null==e||e.removeEventListener("click",S),null==e||e.addEventListener("click",S)},t.addChangeStaffListener=L,t.triggerNcActions=function(e){v(),C("moreEdit",i.defaultActionContents),C("extraEdit",i.ncActionContents),k(),document.querySelector("#Punctum.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=f(e.id),i=m(e.id),r=h(e.id),s=p(e.id);d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#Inclinatum.dropdown-item").addEventListener("click",()=>{const t=f(e.id),n=m(e.id),i=h(e.id),r=p(e.id),s={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"se"}};d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#Virga.dropdown-item").addEventListener("click",()=>{const t=m(e.id),n=u(e.id),i=h(e.id),r=p(e.id),s={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"s"}};d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#VirgaReversed.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=f(e.id),i=h(e.id),r=p(e.id),s={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"n"}};d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#LiquescentClockwise.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=f(e.id),i=m(e.id),r=p(e.id),s={action:"setLiquescent",param:{elementId:e.id,curve:"c"}};d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#LiquescentAnticlockwise.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=f(e.id),i=m(e.id),r=h(e.id),s={action:"setLiquescent",param:{elementId:e.id,curve:"a"}};d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),O()},t.triggerNeumeActions=function(){v(),C("moreEdit",i.defaultNeumeActionContents),C("extraEdit",i.neumeActionContents),k();const e=document.querySelectorAll(".selected");function t(t){const n={action:"changeGroup",param:{elementId:e[0].id,contour:t}};d.edit(n,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Grouping Changed","success"):o.default.queueNotification("Grouping Failed","error"),v(),d.updateForCurrentPage()})}1===e.length?(document.getElementById("split-neume").addEventListener("click",()=>{const e=document.querySelector(".neume.selected");if(null!==e){new a.SplitNeumeHandler(d,e).startSplit(),v()}else console.error("No staff was selected!"),v()}),document.querySelector("#Pes.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#PesSubpunctis.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Clivis.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Scandicus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusFlexus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusSubpunctis.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Climacus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#ClimacusResupinus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Torculus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#TorculusResupinus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Porrectus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusFlexus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusSubpunctis.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Pressus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),O()):console.warn("More than one neume selected! Cannot trigger Neume ClickSelect actions.")},t.triggerSyllableActions=function(e){v(),C("moreEdit",i.syllableActionsContent);let t="";switch(e){case"noSyl":t+='
\n Add Syllable Text \n Delete \n
';break;case"singleSelect":t+='
\n Ungroup \n Re-associate to nearest staff \n Delete \n
';break;case"linkableSelect":t+='
\n Toggle Linked Syllables \n Re-associate to nearest staff \n Delete \n
';break;case"multiSelect":t+='
\n Merge Syllables \n Re-associate to nearest staff \n Delete \n
';break;case"default":t+='
\n Re-associate to nearest staff \n Delete \n
'}C("moreEdit",t,!0),L(),k(),r.initGroupingListeners()},t.triggerLayerElementActions=function(e){var t,n,r,s;if(v(),e.classList.contains("custos"))return C("moreEdit",i.custosActionContents),L(),void k();C("moreEdit",e.parentElement.classList.contains("syllable")?i.layerElementInActionContents:i.layerElementOutActionContents,!1),e.classList.contains("accid")?(C("extraEdit",i.accidActionContents),function(e){document.querySelector("#ChangeToFlat.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"f"}})}),document.querySelector("#ChangeToNatural.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"n"}})}),O()}(e)):e.classList.contains("clef")?(C("extraEdit",i.clefActionContents),function(e){document.querySelector("#increment-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"above"}};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Clef octave incremented.","success"):o.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#decrement-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"below"}};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Clef octave decremented.","success"):o.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#CClef.dropdown-item").addEventListener("click",()=>{T({action:"setClef",param:{elementId:e.id,shape:"C"}})}),document.querySelector("#FClef.dropdown-item").addEventListener("click",()=>{T({action:"setClef",param:{elementId:e.id,shape:"F"}})}),O()}(e)):e.classList.contains("divLine")&&(C("extraEdit",i.divLineActionContents),function(e){document.querySelector("#ChangeToMinima.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"minima"}})}),document.querySelector("#ChangeToMaior.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maior"}})}),document.querySelector("#ChangeToMaxima.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maxima"}})}),document.querySelector("#ChangeToFinalis.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"finalis"}})}),document.querySelector("#ChangeToCaesura.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"caesura"}})}),document.querySelector("#ChangeToVirgula.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"virgula"}})}),O()}(e)),L(),null===(t=document.getElementById("insertToSyllable"))||void 0===t||t.addEventListener("click",w),null===(n=document.getElementById("moveOutsideSyllable"))||void 0===n||n.addEventListener("click",_),k(),L(),null===(r=document.getElementById("insertToSyllable"))||void 0===r||r.addEventListener("click",w),null===(s=document.getElementById("moveOutsideSyllable"))||void 0===s||s.addEventListener("click",_)},t.triggerMultiStaffActions=function(){v(),C("moreEdit",i.staffMergeActionContents),C("extraEdit",i.columnActionContents),k(),A(),x(),document.getElementById("merge-systems").addEventListener("click",()=>{r.mergeStaves()})},t.triggerStaffSplitMode=N,t.triggerSingleStaffActions=function(){v(),C("moreEdit",i.staffSplitActionContents),C("extraEdit",i.columnActionContents),k(),A(),x(),document.getElementById("split-system").addEventListener("click",()=>{N()}),document.getElementById("reset-rotate").addEventListener("click",()=>{const e=document.querySelector(".staff.selected"),t=(0,c.getStaffBBox)(e),n=Math.tan(t.rotate)*(t.lrx-t.ulx);if(null!==e){const i={action:"resizeRotate",param:{elementId:e.id,ulx:t.ulx,uly:t.rotate>0?t.uly+n/2:t.uly-n/2,lrx:t.lrx,lry:t.rotate>0?t.lry-n/2:t.lry+n/2,rotate:0}};d.edit(i,d.view.getCurrentPageURI()).then(async e=>{e&&await d.updateForCurrentPage()}),v()}else console.error("No staff was selected"),v()})},t.triggerBBoxActions=function(){v(),C("moreEdit",i.bboxActionContents),k(),document.getElementById("matchHeight").addEventListener("click",()=>{E()})},t.triggerDefaultSylActions=function(){v(),C("moreEdit",i.defaultSylActionContents),k(),L()},t.triggerDefaultActions=function(){v(),C("moreEdit",i.defaultActionContents),k()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getGlyphBBox=t.isOutOfSVGBounds=t.getStaffByCoords=t.getStaffIdByCoords=t.getSVGRelCoords=void 0;const i=n(5);function r(e,t){const n=new DOMPoint(e,t),i=document.querySelector(".active-page > .definition-scale").querySelector(".page-margin"),{x:r,y:o}=n.matrixTransform(i.getScreenCTM().inverse());return{x:r,y:o}}function o(e,t){const n=Array.from(document.querySelectorAll(".staff")).map(e=>(0,i.getStaffBBox)(e)),{x:o,y:s}=r(e,t),a=n.find(e=>o<=e.lrx&&o>=e.ulx&&s<=e.lry&&s>=e.uly);return a?a.id:null}t.getSVGRelCoords=r,t.getStaffIdByCoords=o,t.getStaffByCoords=function(e,t){const n=o(e,t);return document.querySelector("#"+n)},t.isOutOfSVGBounds=function(e,t){const n=document.querySelector("#bgimg");return e<=0||e>=Number(n.getAttribute("width"))||t<=0||t>=Number(n.getAttribute("height"))},t.getGlyphBBox=function(e){const t="rect"==e.tagName?e.getBBox():e.parentNode.getBBox();return{ulx:t.x,uly:t.y,lrx:t.x+t.width,lry:t.y+t.height}}},function(e,t,n){e.exports=function(e){"use strict";var t=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function n(e,t){var n=e[0],i=e[1],r=e[2],o=e[3];i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[0]-680876936|0)<<7|n>>>25)+i|0)&i|~n&r)+t[1]-389564586|0)<<12|o>>>20)+n|0)&n|~o&i)+t[2]+606105819|0)<<17|r>>>15)+o|0)&o|~r&n)+t[3]-1044525330|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[4]-176418897|0)<<7|n>>>25)+i|0)&i|~n&r)+t[5]+1200080426|0)<<12|o>>>20)+n|0)&n|~o&i)+t[6]-1473231341|0)<<17|r>>>15)+o|0)&o|~r&n)+t[7]-45705983|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[8]+1770035416|0)<<7|n>>>25)+i|0)&i|~n&r)+t[9]-1958414417|0)<<12|o>>>20)+n|0)&n|~o&i)+t[10]-42063|0)<<17|r>>>15)+o|0)&o|~r&n)+t[11]-1990404162|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[12]+1804603682|0)<<7|n>>>25)+i|0)&i|~n&r)+t[13]-40341101|0)<<12|o>>>20)+n|0)&n|~o&i)+t[14]-1502002290|0)<<17|r>>>15)+o|0)&o|~r&n)+t[15]+1236535329|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[1]-165796510|0)<<5|n>>>27)+i|0)&r|i&~r)+t[6]-1069501632|0)<<9|o>>>23)+n|0)&i|n&~i)+t[11]+643717713|0)<<14|r>>>18)+o|0)&n|o&~n)+t[0]-373897302|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[5]-701558691|0)<<5|n>>>27)+i|0)&r|i&~r)+t[10]+38016083|0)<<9|o>>>23)+n|0)&i|n&~i)+t[15]-660478335|0)<<14|r>>>18)+o|0)&n|o&~n)+t[4]-405537848|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[9]+568446438|0)<<5|n>>>27)+i|0)&r|i&~r)+t[14]-1019803690|0)<<9|o>>>23)+n|0)&i|n&~i)+t[3]-187363961|0)<<14|r>>>18)+o|0)&n|o&~n)+t[8]+1163531501|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[13]-1444681467|0)<<5|n>>>27)+i|0)&r|i&~r)+t[2]-51403784|0)<<9|o>>>23)+n|0)&i|n&~i)+t[7]+1735328473|0)<<14|r>>>18)+o|0)&n|o&~n)+t[12]-1926607734|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[5]-378558|0)<<4|n>>>28)+i|0)^i^r)+t[8]-2022574463|0)<<11|o>>>21)+n|0)^n^i)+t[11]+1839030562|0)<<16|r>>>16)+o|0)^o^n)+t[14]-35309556|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[1]-1530992060|0)<<4|n>>>28)+i|0)^i^r)+t[4]+1272893353|0)<<11|o>>>21)+n|0)^n^i)+t[7]-155497632|0)<<16|r>>>16)+o|0)^o^n)+t[10]-1094730640|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[13]+681279174|0)<<4|n>>>28)+i|0)^i^r)+t[0]-358537222|0)<<11|o>>>21)+n|0)^n^i)+t[3]-722521979|0)<<16|r>>>16)+o|0)^o^n)+t[6]+76029189|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[9]-640364487|0)<<4|n>>>28)+i|0)^i^r)+t[12]-421815835|0)<<11|o>>>21)+n|0)^n^i)+t[15]+530742520|0)<<16|r>>>16)+o|0)^o^n)+t[2]-995338651|0)<<23|i>>>9)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[0]-198630844|0)<<6|n>>>26)+i|0)|~r))+t[7]+1126891415|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[14]-1416354905|0)<<15|r>>>17)+o|0)|~n))+t[5]-57434055|0)<<21|i>>>11)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[12]+1700485571|0)<<6|n>>>26)+i|0)|~r))+t[3]-1894986606|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[10]-1051523|0)<<15|r>>>17)+o|0)|~n))+t[1]-2054922799|0)<<21|i>>>11)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[8]+1873313359|0)<<6|n>>>26)+i|0)|~r))+t[15]-30611744|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[6]-1560198380|0)<<15|r>>>17)+o|0)|~n))+t[13]+1309151649|0)<<21|i>>>11)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[4]-145523070|0)<<6|n>>>26)+i|0)|~r))+t[11]-1120210379|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[2]+718787259|0)<<15|r>>>17)+o|0)|~n))+t[9]-343485551|0)<<21|i>>>11)+r|0,e[0]=n+e[0]|0,e[1]=i+e[1]|0,e[2]=r+e[2]|0,e[3]=o+e[3]|0}function i(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return n}function r(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24);return n}function o(e){var t,r,o,s,a,c,l=e.length,d=[1732584193,-271733879,-1732584194,271733878];for(t=64;t<=l;t+=64)n(d,i(e.substring(t-64,t)));for(r=(e=e.substring(t-64)).length,o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;t
>2]|=e.charCodeAt(t)<<(t%4<<3);if(o[t>>2]|=128<<(t%4<<3),t>55)for(n(d,o),t=0;t<16;t+=1)o[t]=0;return s=(s=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(s[2],16),c=parseInt(s[1],16)||0,o[14]=a,o[15]=c,n(d,o),d}function s(e){var n,i="";for(n=0;n<4;n+=1)i+=t[e>>8*n+4&15]+t[e>>8*n&15];return i}function a(e){var t;for(t=0;td?new ArrayBuffer(0):(r=d-l,o=new ArrayBuffer(r),s=new Uint8Array(o),a=new Uint8Array(this,l,r),s.set(a),o)}}(),d.prototype.append=function(e){return this.appendBinary(c(e)),this},d.prototype.appendBinary=function(e){this._buff+=e,this._length+=e.length;var t,r=this._buff.length;for(t=64;t<=r;t+=64)n(this._hash,i(this._buff.substring(t-64,t)));return this._buff=this._buff.substring(t-64),this},d.prototype.end=function(e){var t,n,i=this._buff,r=i.length,o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;t>2]|=i.charCodeAt(t)<<(t%4<<3);return this._finish(o,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},d.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},d.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},d.prototype.setState=function(e){return this._buff=e.buff,this._length=e.length,this._hash=e.hash,this},d.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},d.prototype._finish=function(e,t){var i,r,o,s=t;if(e[s>>2]|=128<<(s%4<<3),s>55)for(n(this._hash,e),s=0;s<16;s+=1)e[s]=0;i=(i=8*this._length).toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(i[2],16),o=parseInt(i[1],16)||0,e[14]=r,e[15]=o,n(this._hash,e)},d.hash=function(e,t){return d.hashBinary(c(e),t)},d.hashBinary=function(e,t){var n=a(o(e));return t?l(n):n},d.ArrayBuffer=function(){this.reset()},d.ArrayBuffer.prototype.append=function(e){var t,i,o,s,a,c=(i=this._buff.buffer,o=e,s=!0,(a=new Uint8Array(i.byteLength+o.byteLength)).set(new Uint8Array(i)),a.set(new Uint8Array(o),i.byteLength),s?a:a.buffer),l=c.length;for(this._length+=e.byteLength,t=64;t<=l;t+=64)n(this._hash,r(c.subarray(t-64,t)));return this._buff=t-64>2]|=i[t]<<(t%4<<3);return this._finish(o,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},d.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},d.ArrayBuffer.prototype.getState=function(){var e,t=d.prototype.getState.call(this);return t.buff=(e=t.buff,String.fromCharCode.apply(null,new Uint8Array(e))),t},d.ArrayBuffer.prototype.setState=function(e){return e.buff=function(e,t){var n,i=e.length,r=new ArrayBuffer(i),o=new Uint8Array(r);for(n=0;n>2]|=e[t]<<(t%4<<3);if(o[t>>2]|=128<<(t%4<<3),t>55)for(n(d,o),t=0;t<16;t+=1)o[t]=0;return s=(s=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(s[2],16),c=parseInt(s[1],16)||0,o[14]=a,o[15]=c,n(d,o),d}(new Uint8Array(e)));return t?l(i):i},d}()},function(e,t,n){"use strict";function i(e){if(16!==e.length)return"";function t(e,t){return e+t.toString(16).padStart(2,"0")}return e.slice(0,4).reduce(t,"")+"-"+e.slice(4,6).reduce(t,"")+"-"+e.slice(6,8).reduce(t,"")+"-"+e.slice(8,10).reduce(t,"")+"-"+e.slice(10).reduce(t,"")}Object.defineProperty(t,"__esModule",{value:!0}),t.uuidv4=void 0,t.uuidv4=function(){if(void 0===window.crypto)return i(new Uint8Array(16));const e=new Uint8Array(16),t=Uint8Array.from([parseInt("01000000",2),parseInt("10000000",2),parseInt("00001111",2),parseInt("00111111",2)]);return window.crypto.getRandomValues(e),e[6]=e[6]&t[2]|t[0],e[8]=e[8]&t[3]|t[1],i(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setGroupingHighlight=t.setStaffHighlight=t.highlight=t.unsetGroupingHighlight=t.unsetStaffHighlight=t.unhighlight=void 0;const i=["rgb(230, 159, 0)","rgb(86, 180, 233)","rgb(0, 158, 115)","rgb(240, 228, 66)","rgb(0, 114, 178)","rgb(213, 94, 0)","rgb(204, 121, 167)"];function r(e){let t;t=e?e.querySelectorAll(":not(.selected) .highlighted"):document.querySelectorAll(":not(.selected) .highlighted"),t.forEach(e=>{if("path"!==e.tagName||e.closest(".staff").classList.contains("selected"))if(e.classList.contains("divLine")&&!e.closest(".staff").classList.contains("selected"))e.setAttribute("stroke","#000000");else{e.removeAttribute("fill");let t=e.querySelectorAll(".sylTextRect-display");if(!t.length)try{t=e.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(e){t=[]}t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")}))}else e.setAttribute("stroke","#000000");e.classList.remove("highlighted")})}function o(){r()}function s(){o();Array.from(document.getElementsByClassName("highlighted")).filter(e=>!e.parentElement.classList.contains("selected")).forEach(e=>{e.setAttribute("#d00",null);let t=e.querySelectorAll(".sylTextRect-display");t.length||null!==e.closest(".syllable")&&(t=e.closest(".syllable").querySelectorAll("sylTextRect-display")),t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")})),e.classList.remove("highlighted"),e.querySelectorAll("sylTextRect-display").forEach(e=>{e.classList.remove("highlighted")})}),Array.from(document.getElementsByClassName("selected")).forEach(e=>{e.setAttribute("fill","")})}function a(e,t){const n=Array.from(e.children);for(let e=0;ee.querySelectorAll(".divLine")).forEach(e=>{n.push(e)});else{if(i.classList.contains("resizePoint")||"resizeRect"===i.id||i.classList.contains("rotatePoint"))return;if(i.classList.contains("layer"))Array.from(i.children).forEach(e=>{n.push(e)});else if(document.getElementsByClassName("highlight-selected").length&&"highlight-neume"===document.getElementsByClassName("highlight-selected")[0].id&&i.classList.contains("syllable"))Array.from(i.children).filter(e=>e.classList.contains("neume")).forEach(e=>{n.push(e)});else{i.setAttribute("fill",t);let e=i.querySelectorAll(".sylTextRect-display");if(!e.length)try{e=i.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(t){e=[]}e.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||(e.style.fill=t,e.classList.add("highlighted"))}))}}i.classList.add("highlighted")}let i;i="30px",e.querySelectorAll(".nc, .custos, .clef, .accid").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width",i)})}function c(){const e=Array.from(document.getElementsByClassName("staff"));for(let t=0;t{const n=Array.from(t.classList).join(" ").match(/\bcolumn(\d+)\b/);let i=0;n&&(i=parseInt(n[1],10)-1),e[i]||(e[i]=[]),e[i].push(t)});for(const[t,n]of Object.entries(e)){const e=i[Number(t)%i.length];for(const t of n)a(t,e)}}();if("selection"===t){switch(document.querySelector(".sel-by.is-active").id){case"selBySyllable":case"selByBBox":t="syllable";break;case"selByColumn":t="column";break;case"selByStaff":t="staff";break;case"selByLayerElement":t="layerElement";break;case"selByNeume":default:t="neume"}return void e(t)}let n;n="layerElement"==t?document.querySelectorAll(".accid, .clef, .custos, .divLine"):document.getElementsByClassName(t),document.querySelectorAll(".nc, .custos, .clef, .accid, .divLine").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width","30px")});for(let e=0;e{e.classList.add("highlighted")})}const r=n[e].querySelectorAll(".divLine");if(r)for(let e=0;e=0;o--)s=0===o?"":",",t.push({obj:i[o],prefix:s});t.push({val:"["})}else{for(c in a=[],i)i.hasOwnProperty(c)&&a.push(c);for(t.push({val:"}"}),o=a.length-1;o>=0;o--)d=i[l=a[o]],u=o>0?",":"",u+=JSON.stringify(l)+":",t.push({obj:d,prefix:u});t.push({val:"{"})}return f},t.parse=function(e){for(var t,n,r,o,s,a,c,l,d,u=[],f=[],m=0;;)if("}"!==(t=e[m++])&&"]"!==t&&void 0!==t)switch(t){case" ":case"\t":case"\n":case":":case",":break;case"n":m+=3,i(null,u,f);break;case"t":m+=3,i(!0,u,f);break;case"f":m+=4,i(!1,u,f);break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"-":for(n="",m--;;){if(r=e[m++],!/[\d\.\-e\+]/.test(r)){m--;break}n+=r}i(parseFloat(n),u,f);break;case'"':for(o="",s=void 0,a=0;'"'!==(c=e[m++])||"\\"===s&&a%2==1;)o+=c,"\\"===(s=c)?a++:a=0;i(JSON.parse('"'+o+'"'),u,f);break;case"[":l={element:[],index:u.length},u.push(l.element),f.push(l);break;case"{":d={element:{},index:u.length},u.push(d.element),f.push(d);break;default:throw new Error("unexpectedly reached end of input: "+t)}else{if(1===u.length)return u.pop();i(u.pop(),u,f)}}},function(e,t,n){"use strict";var i=n(20),r=n(11);t.a=function(e,t,n){var o=(e=e||{}).random||(e.rng||i.a)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t){n=n||0;for(var s=0;s<16;++s)t[n+s]=o[s];return t}return Object(r.a)(o)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(7),r=n(15),o=n(3),s=n(5);t.default=class{constructor(e,t){this.dragStartCoords=[-1,-1],this.neonView=e,this.selector=t}dragInit(){const e=i.drag().on("start",function(){this.dragStartCoords=[i.event.x,i.event.y],this.dx=0,this.dy=0,i.event.sourceEvent.target.classList.contains("staff")&&i.select(this.selector).call(e)}.bind(this)).on("drag",this.dragging.bind(this)).on("end",this.dragEnded.bind(this));i.selectAll(".selected").call(e);let t=Array.from(document.querySelectorAll(".selected"));this.noMovePrecedes=t.filter(e=>e.classList.contains("no-moving")&&e.hasAttribute("mei:precedes")),t=t.filter(e=>!e.classList.contains("no-moving")),this.selection=t.concat(Array.from(document.querySelectorAll(".resizePoint")))}dragging(){this.dx=i.event.x-this.dragStartCoords[0],this.dy=i.event.y-this.dragStartCoords[1],this.moveElements(this.selection,this.dx,this.dy);if(0===this.selection.filter(e=>e.classList.contains("syl")).length&&0===this.noMovePrecedes.length){const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));this.moveElements(e,-this.dx,-this.dy)}}dragEnded(){const e=Math.abs(this.dx),t=Math.abs(this.dy);if(e<=5&&t<=5)return this.reset(),void this.dragInit();const n=this.selection.filter(e=>!e.classList.contains("resizePoint"));if(this.isCursorOutOfBounds()||this.isDragOutOfBounds(n)){this.returnElements(this.selection);const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));return this.returnElements(e),this.reset(),this.dragInit(),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Drag action failed.","error")}const i=[];n.forEach(e=>{const t={action:"drag",param:{elementId:"rect"===e.tagName?e.closest(".syl").id:e.id,x:this.dx,y:-this.dy}};i.push(t)});const r={action:"chain",param:i};this.neonView.edit(r,this.neonView.view.getCurrentPageURI()).then(async()=>{const e=Array.from(document.querySelectorAll(".selected")).filter(e=>!e.classList.contains("no-moving")).map(e=>e.id);await this.neonView.updateForCurrentPage(),this.endOptionsSelection(),this.reset(),await this.reselect(e),this.dragInit()})}async reselect(e){const t=e.map(e=>document.querySelector("#"+e));t.filter(e=>!e.classList.contains("syl")).forEach(async()=>await(0,s.selectAll)(t,this.neonView,this)),t.filter(e=>e.classList.contains("syl")).forEach(e=>(0,s.selectBBox)(e.querySelector(".sylTextRect-display"),this,this.neonView)),t.filter(e=>e.classList.contains("staff")).forEach(e=>(0,s.selectStaff)(e,this))}resetTo(e){this.resetToAction=e}reset(){void 0!==this.resetToAction&&i.select(this.selector).call(this.resetToAction)}endOptionsSelection(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden"))}moveElements(e,t,n){e.filter(e=>null!==e).forEach(e=>{e.setAttribute("transform",`translate(${t},${n})`)})}returnElements(e){e.filter(e=>null!==e).forEach(e=>{e.removeAttribute("transform")})}isCursorOutOfBounds(){const e=this.dragStartCoords[0]+this.dx,t=this.dragStartCoords[1]+this.dy;return(0,r.isOutOfSVGBounds)(e,t)}isDragOutOfBounds(e){let t=document.querySelector("#displayBBox").checked?"use, rect":"use";e[0].classList.contains("staff")&&(t="path");const n=e.reduce((e,n)=>e.concat(...n.querySelectorAll(t)),[]).map(r.getGlyphBBox).reduce((e,t)=>({ulx:Math.min(e.ulx,t.ulx),uly:Math.min(e.uly,t.uly),lrx:Math.max(e.lrx,t.lrx),lry:Math.max(e.lry,t.lry)}),{ulx:Number.MAX_VALUE,uly:Number.MAX_VALUE,lrx:Number.MIN_VALUE,lry:Number.MIN_VALUE}),{ulx:i,uly:o,lrx:s,lry:a}=n;return(0,r.isOutOfSVGBounds)(i+this.dx,o+this.dy)||(0,r.isOutOfSVGBounds)(s+this.dx,a+this.dy)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initGroupingListeners=t.endGroupingSelection=t.triggerGrouping=t.mergeStaves=t.isLinkable=t.canBeLinked=t.isLinked=t.isGroupable=t.initNeonView=void 0;const i=n(8),r=n(34),o=n(3),s=n(5),a=n(14),c=n(14);let l;function d(e,t){if(Array.from(t.values()).length<2)return!1;switch(e){case"selByNeume":if(s.sharedLogicalParent(e,t))return!1;default:return!!s.areAdjacent(e,t)}}function u(e,t){switch(t||(t=Array.from(document.querySelectorAll(".selected"))),e){case"selBySyllable":for(const e of t)if(e.hasAttribute("mei:follows")||e.hasAttribute("mei:precedes"))return o.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNeume":for(const e of t)if(e.parentElement.hasAttribute("mei:follows")||e.parentElement.hasAttribute("mei:precedes"))return o.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNc":for(const e of t)if(e.parentElement.parentElement.hasAttribute("mei:follows")||e.parentElement.parentElement.hasAttribute("mei:precedes"))return o.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1}}function f(e){for(const t of e)if(!t.hasAttribute("mei:precedes")&&!t.hasAttribute("mei:follows"))return!1;return!0}function m(e){e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1});const t=Array.from(document.querySelectorAll(".staff")),n=Array.from(document.querySelectorAll(".syllable"));for(let i=0;i!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));const i=e.filter(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(1!==i.length)return!1;const r=i[0];return 0===e.indexOf(r)||e.indexOf(r)===e.length-1}function h(e,t){return!(t.length<2)&&("selBySyllable"===e&&(function(e){e.sort((e,t)=>e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING?-1:e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING?1:0);for(let t=0;te.id===i&&(r=t,!0));if(!o)return!0;if(!o.hasAttribute("mei:follows"))return!0;if(o.getAttribute("mei:follows")!="#"+n.id)return!0;if(r!==t+1)return!0}if(n.hasAttribute("mei:follows")){const t=n.getAttribute("mei:follows").replace("#",""),i=e.find(e=>e.id===t);if(!i)return!0;if(!i.hasAttribute("mei:precedes"))return!0;if(i.getAttribute("mei:precedes")!="#"+n.id)return!0}return!1}}(t)?(o.queueNotification("The selected syllables include invalid linked syllable(s)!","warning"),!1):!!f(t)||!!m(t)))}function p(){const e=document.querySelectorAll(".staff.selected"),t=[];e.forEach(e=>{t.push(e.id)});const n={action:"merge",param:{elementIds:t}};l.edit(n,l.view.getCurrentPageURI()).then(e=>{e?(o.queueNotification("Staff Merged","success"),a.endOptionsSelection(),l.updateForCurrentPage()):o.queueNotification("Merge Failed","error")})}function g(){const e=document.getElementById("moreEdit");e.innerHTML="",e.parentElement.classList.add("hidden"),document.body.removeEventListener("keydown",c.deleteButtonHandler),document.body.removeEventListener("keydown",y)}function v(){const e=document.getElementById("delete");e.removeEventListener("click",c.removeHandler),e.addEventListener("click",c.removeHandler),document.body.addEventListener("keydown",c.deleteButtonHandler),document.body.addEventListener("keydown",y);try{document.getElementById("mergeSyls").addEventListener("click",()=>{if(u(s.getSelectionType()))return;b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNeumes").addEventListener("click",()=>{if(u(s.getSelectionType()))return;b("group","neume",E().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNcs").addEventListener("click",()=>{b("group","nc",E().filter(e=>document.getElementById(e).classList.contains("nc")))})}catch(e){}try{document.getElementById("ungroupNeumes").addEventListener("click",()=>{b("ungroup","neume",S())})}catch(e){}try{document.getElementById("ungroupNcs").addEventListener("click",()=>{b("ungroup","nc",S())})}catch(e){}try{document.getElementById("toggle-ligature").addEventListener("click",async()=>{const e={action:"toggleLigature",param:{elementIds:E()}};l.edit(e,l.view.getCurrentPageURI()).then(e=>{e?o.queueNotification("Ligature Toggled","success"):o.queueNotification("Ligature Toggle Failed","error"),g(),l.updateForCurrentPage()})})}catch(e){}try{document.getElementById("toggle-link").addEventListener("click",()=>{_()})}catch(e){}}t.initNeonView=function(e){l=e},t.isGroupable=d,t.isLinked=f,t.canBeLinked=m,t.isLinkable=h,t.mergeStaves=p,t.triggerGrouping=function(e){const t=document.getElementById("moreEdit");t.parentElement.classList.remove("hidden"),t.innerHTML+=i.groupingMenu[e],v()},t.endGroupingSelection=g,t.initGroupingListeners=v;const y=function(e){if("g"===e.key){const e=Array.from(document.querySelectorAll(".selected"));if(0==e.length)return;const t=s.getSelectionType();if(u(t,e))return;switch(t){case"selBySyllable":if(h(t,e))_();else if(d(t,e)){b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))}else if(1===e.length){b("ungroup","neume",S())}break;case"selByNeume":if(d(t,e)){b("group","neume",E())}else{b("ungroup","nc",S())}break;case"selByNc":if(d(t,e)){b("group","nc",E())}else{b("ungroup","nc",S())}break;case"selByStaff":d(t,e)?p():a.triggerStaffSplitMode();break;default:return void console.error(`Can't perform grouping/ungrouping action on selection type ${t}.`)}}};function b(e,t,n){const i={action:e,param:{groupType:t,elementIds:n}};l.edit(i,l.view.getCurrentPageURI()).then(i=>{if(i?"group"===e?o.queueNotification("Grouping Success","success"):o.queueNotification("Ungrouping Success","success"):"group"===e?o.queueNotification("Grouping Failed","error"):o.queueNotification("Ungrouping Failed","error"),l.updateForCurrentPage(),"nc"===t){const e=document.getElementById(n[0]).parentElement,t=Array.from(e.children);void 0===l.info.getContour(t)&&r.groupingNotRecognized()}g()})}function w(e){const t=document.getElementById(e);return t instanceof SVGGraphicsElement?t:null}function _(){const e=E(),t={action:"chain",param:[]},n=new Array,i=e.map(w).filter(e=>null!==e);if(f(i))n.push(...function(e){const t=new Array;for(const n of e){const e=document.getElementById(n);e.getAttribute("mei:precedes")&&t.push({action:"set",param:{elementId:n,attrType:"precedes",attrValue:""}}),e.getAttribute("mei:follows")&&(t.push({action:"set",param:{elementId:n,attrType:"follows",attrValue:""}}),t.push({action:"setText",param:{elementId:n,text:""}}))}return t}(e));else{const[e,t]=function(e){if(e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}),2===e.length)return[e[0],e[1]];const t=e.find(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(t){const n=e.indexOf(t);if(0===n)return[e[n],e[n+1]];if(n===e.length-1)return[e[n-1],e[n]]}}(i);console.log(e.id,t.id),n.push({action:"set",param:{elementId:e.id,attrType:"precedes",attrValue:"#"+t.id}}),n.push({action:"set",param:{elementId:t.id,attrType:"follows",attrValue:"#"+e.id}});const r=t.querySelector(".syl");null!==r&&n.push({action:"remove",param:{elementId:r.id}})}t.param=n,l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?o.queueNotification("Toggled Syllable Link","success"):o.queueNotification("Failed to Toggle Syllable Link","error"),g(),l.updateForCurrentPage()})}function E(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push(t.id)}),e}function S(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{if(t.classList.contains("divLine")||t.classList.contains("accid")||t.classList.contains("clef"))return;Array.from(t.children).forEach(t=>{e.push(t.id)})}),e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemManager=t.FileSystemTools=t.EntryType=void 0;var i=n(89);Object.defineProperty(t,"EntryType",{enumerable:!0,get:function(){return i.EntryType}});var r=n(90);Object.defineProperty(t,"FileSystemTools",{enumerable:!0,get:function(){return r.FileSystemTools}});var o=n(91);Object.defineProperty(t,"FileSystemManager",{enumerable:!0,get:function(){return o.FileSystemManager}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateErrorLogVisibility=t.initDisplayListener=t.initErrorLogControls=t.initErrorLog=t.recordNotification=void 0;const i=n(8),r=n(4),o=n(9);function s(e){const t=document.createElement("div");t.classList.add("notification-container"),t.innerHTML=`\n \n\n \n
\n
\n
\n\n
\n
\n
\n
\n `;const n=t.querySelector(".log-remove");if(n.onclick=()=>t.remove(),n.addEventListener("mouseover",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-open.svg")}),n.addEventListener("mouseout",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-closed.svg")}),e.logInfo){const i=t.querySelector(".notif-log-info-icon");i.style.display="",n.style.height="20px",i.addEventListener("mouseover",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-dark.svg")}),i.addEventListener("mouseout",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-light.svg")}),i.addEventListener("click",()=>function(e){const t=new o.ModalWindow;t.setModalWindowView(o.ModalWindowView.ERROR_LOG,e),t.openModalWindow()}(e.logInfo))}return t}function a(){const e=document.querySelector("#error_log"),t=document.querySelector("#errorLogHeading"),n=t.querySelector("svg > use"),i=document.querySelector("#errorLogContents"),{displayErrLog:o}=(0,r.getSettings)();o&&e.classList.add("visible"),t.addEventListener("click",e=>{e.stopPropagation(),i.classList.contains("closed")?(i.classList.remove("closed"),i.style.padding="0.5em 0.75em",setTimeout(()=>{i.style.overflow="visible"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(i.classList.add("closed"),i.style.overflow="hidden",setTimeout(()=>{i.style.padding="0px"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))}),c()}function c(){const e=document.querySelector("#display-single-container"),t=document.createElement("label"),n=document.createElement("input");n.classList.add("checkbox"),t.classList.add("checkbox-container","side-panel-btn"),t.textContent="Errors",n.id="display-errors",n.type="checkbox",n.checked=!1,t.appendChild(n),e.append(t);const{displayErrLog:i}=(0,r.getSettings)();n.checked=i,n.addEventListener("click",()=>{(0,r.setSettings)({displayErrLog:n.checked}),l()})}function l(){const e=document.querySelector("#error_log"),{debugMode:t,displayErrLog:n,displayInfo:i,displayBBox:o,displayText:s}=(0,r.getSettings)(),a=document.getElementById("display-all-btn");t?n?(e.classList.add("visible"),i&&o&&s&&n&&(a.classList.add("selected"),a.innerHTML="Hide All")):(e.classList.remove("visible"),a.classList.contains("selected")&&(a.classList.remove("selected"),a.innerHTML="Display All")):(e.classList.remove("visible"),i&&o&&s?(a.classList.add("selected"),a.innerHTML="Hide All"):(a.classList.remove("selected"),a.innerHTML="Display All"))}t.recordNotification=function(e){document.querySelector("#errorLogContents").prepend(s(e))},t.initErrorLog=function(){document.querySelector("#error_log").innerHTML=i.errorLogsPanelContents,a()},t.initErrorLogControls=a,t.initDisplayListener=c,t.updateErrorLogVisibility=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.resize=void 0;const i=n(5),r=n(7),o=n(15),s=n(3),a=n(4),c={TopLeft:0,Top:1,TopRight:2,Right:3,BottomRight:4,Bottom:5,BottomLeft:6,Left:7};function l(e,t,n,i,r){let o;if(r>=0)o=[{x:e,y:t,name:c.TopLeft},{x:(e+n)/2,y:t+(n-e)/2*Math.sin(r),name:c.Top},{x:n,y:t+(n-e)*Math.sin(r),name:c.TopRight},{x:n,y:(t+i+(n-e)*Math.sin(r))/2,name:c.Right},{x:n,y:i,name:c.BottomRight},{x:(e+n)/2,y:i-(n-e)/2*Math.sin(r),name:c.Bottom},{x:e,y:i-(n-e)*Math.sin(r),name:c.BottomLeft},{x:e,y:(t+i-(n-e)*Math.sin(r))/2,name:c.Left}];else{const s=(n-e)*Math.tan(Math.abs(r)),a=i-t-s;o=[{x:e,y:t+s,name:c.TopLeft},{x:(e+n)/2,y:t+s/2,name:c.Top},{x:n,y:t,name:c.TopRight},{x:n,y:t+a/2,name:c.Right},{x:n,y:t+a,name:c.BottomRight},{x:(e+n)/2,y:i-s/2,name:c.Bottom},{x:e,y:i,name:c.BottomLeft},{x:e,y:i-a/2,name:c.Left}]}return o}t.resize=function(e,t,n){let d,u,f,m,h,p,g,v,y,b,w,_,E,S,k;function L(){const e=l(d,u,f,m,h),t=e.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");document.querySelector("#resizeRect").setAttribute("points",t);const n=document.querySelector(".syl.selected > .sylTextRect-display");n&&(n.setAttribute("x",String(Math.min(d,f))),n.setAttribute("y",String(Math.min(u,m))),n.setAttribute("width",String(Math.abs(f-d))),n.setAttribute("height",String(Math.abs(m-u))));for(const t in c){const n=e[c[t]];r.select("#p-"+t).filter(".resizePoint").attr("cx",n.x).attr("cy",n.y)}let i=e[3].x,o=e[3].y;const s=i+100+","+(o+85)+" "+(i+70)+","+(o+50)+" "+(i+100)+","+(o+15)+" "+(i+130)+","+(o+50);i=e[7].x,o=e[7].y;const a=i-100+","+(o-15)+" "+(i-130)+","+(o-50)+" "+(i-100)+","+(o-85)+" "+(i-70)+","+(o-50);r.select("#rotateLeft").attr("points",a),r.select("#rotateRight").attr("points",s)}!function A(){if(null===e)return;if(r.selectAll(".resizePoint").remove(),r.selectAll("#resizeRect").remove(),r.selectAll(".rotatePoint").remove(),e.classList.contains("syl")){const t=e.querySelector(".sylTextRect-display");if(null===t)return void console.warn("Tried to draw resize rect for a sylTextRect that doesn't exist (or isn't displaying)");d=Number(t.getAttribute("x")),u=Number(t.getAttribute("y")),f=+d+ +t.getAttribute("width"),m=+u+ +t.getAttribute("height"),h=0}if(e.classList.contains("staff")){const t=(0,i.getStaffBBox)(e);d=t.ulx,u=t.uly,f=t.lrx,m=t.lry;const n=e.querySelector("path").getAttribute("d").match(/\d+/g).map(e=>Number(e));h=Math.atan((n[3]-n[1])/(n[2]-n[0]))}let x;p=d,y=u,g=f,b=m;const C=l(d,u,f,m,h);E=C[2].x-C[0].x;const T=C.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");r.select("#"+e.id).append("polygon").attr("points",T).attr("id","resizeRect").attr("stroke","black").attr("stroke-width",10).attr("fill","none").style("cursor","move").style("stroke-dasharray","20 10");const{circleSize:N}=(0,a.getSettings)();for(const t in c){const n=C[c[t]];r.select(e.viewportElement).append("circle").attr("cx",n.x).attr("cy",n.y).attr("r",N).attr("stroke","black").attr("stroke-width",4).attr("fill","#0099ff").attr("class","resizePoint").attr("id","p-"+t)}for(const e in c)r.select("#p-"+e).filter(".resizePoint").call(r.drag().on("start",()=>{O(e)}).on("drag",q).on("end",I.bind(this)));if(e.classList.contains("staff")){let t=C[3].x,n=C[3].y;const i=t+100+","+(n+85)+" "+(t+70)+","+(n+50)+" "+(t+100)+","+(n+15)+" "+(t+130)+","+(n+50);t=C[7].x,n=C[7].y;const o=t-100+","+(n-15)+" "+(t-130)+","+(n-50)+" "+(t-100)+","+(n-85)+" "+(t-70)+","+(n-50);r.select("#"+e.id).append("polygon").attr("points",i).attr("id","rotateRight").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#"+e.id).append("polygon").attr("points",o).attr("id","rotateLeft").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#rotateLeft").call(r.drag().on("start",B).on("drag",(function(){const e=r.mouse(this)[1]-w,t=k-Math.atan(e/E);t>-.2&&t<.2&&(S=e,u=_+S,h=t,h>=0?(u=S+C.filter(e=>e.name===c.TopLeft)[0].y,m=C.filter(e=>e.name===c.BottomRight)[0].y):(u=C.filter(e=>e.name===c.TopRight)[0].y,m=S+C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M)),r.select("#rotateRight").call(r.drag().on("start",B).on("drag",(function(){const e=r.mouse(this)[1]-w,t=k+Math.atan(e/E);t>-.2&&t<.2&&(S=e,h=t,h>=0?(m=S+C.filter(e=>e.name===c.BottomRight)[0].y,u=C.filter(e=>e.name===c.TopLeft)[0].y):(u=S+C.filter(e=>e.name===c.TopRight)[0].y,m=C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M))}function O(e){x=e;const t=C.find(t=>t.name===c[e]);v=[t.x,t.y],y=u,b=m}function q(){const e=r.mouse(this);switch(c[x]){case c.TopLeft:d=e[0],u=e[1];break;case c.Top:u=e[1]-(f-d)*Math.tan(h)/2;break;case c.TopRight:f=e[0],u=e[1]-(f-d)*Math.tan(h);break;case c.Right:f=e[0],m=b+(e[0]-v[0])*Math.tan(h);break;case c.BottomRight:f=e[0],m=e[1];break;case c.Bottom:m=e[1]+(f-d)*Math.tan(h)/2;break;case c.BottomLeft:d=e[0],m=e[1]+(f-d)*Math.tan(h);break;case c.Left:d=e[0],u=y+(e[0]-v[0])*Math.tan(h);break;default:console.error("Something that wasn't a side of the rectangle was dragged. This shouldn't happen.")}L()}function I(){if((0,o.isOutOfSVGBounds)(d,u)||(0,o.isOutOfSVGBounds)(f,m))return d=p,u=y,f=g,m=b,L(),(0,s.queueNotification)("[FAIL] Glyphs were placed out of bounds! Resize action failed.","error");const r={action:"resize",param:{elementId:e.id,ulx:d,uly:u,lrx:f,lry:m}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{if(r&&await t.updateForCurrentPage(),e=document.querySelector("#"+e.id),d=void 0,u=void 0,f=void 0,m=void 0,A(),e.classList.contains("syl"))(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this);else{(0,i.selectAll)([document.querySelector("#"+e.id)],t,n);const r=document.querySelector("moreEdit");r&&(r.innerHTML="",r.parentElement.classList.add("hidden"))}})}function B(){const e=r.event.sourceEvent.target.id;w=r.mouse(this)[1],b=m,y=u,_="rotateRight"===e?m:u,k=h}function M(){if(void 0===S&&(S=0),(0,o.isOutOfSVGBounds)(d,u)||(0,o.isOutOfSVGBounds)(f,m))return document.querySelectorAll(".resizePoint").forEach(e=>e.remove()),document.querySelectorAll("#resizeRect").forEach(e=>e.remove()),document.querySelectorAll(".rotatePoint").forEach(e=>e.remove()),e=document.getElementById(e.id),d=void 0,u=void 0,f=void 0,m=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n),(0,s.queueNotification)("[FAIL] Glyphs were placed out of bounds! Rotate action failed.","error");const r={action:"resizeRotate",param:{elementId:e.id,ulx:d,uly:u,lrx:f,lry:m,rotate:180*h/Math.PI}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{r&&await t.updateForCurrentPage(),e=document.getElementById(e.id),d=void 0,u=void 0,f=void 0,m=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n)})}}()}},function(e,t,n){"use strict";n.r(t),function(e){var i,r,o=n(2),s=n.n(o),a=n(22),c=n(16),l=n.n(c),d=n(21),u=n.n(d),f=n(6),m=n.n(f),h=n(1),p=n.n(h),g=n(0),v=n.n(g);function y(e){return"$"+e}function b(e){return e.substring(1)}function w(){this._store={}}function _(e){if(this._store=new w,e&&Array.isArray(e))for(var t=0,n=e.length;tb(e))},w.prototype.delete=function(e){var t=y(e),n=t in this._store;return delete this._store[t],n},w.prototype.forEach=function(e){for(var t=Object.keys(this._store),n=0,i=t.length;n=d.length)){var n=Math.min(u+6,d.length),i=d.slice(u,n);!function(n,i){n.forEach((function(n,r){var s=i+r,a=o.get(n),d=T(a[0],["atts_since","attachments"]);d.open_revs=a.map((function(e){return e.rev})),d.open_revs=d.open_revs.filter(O);var u=O;0===d.open_revs.length&&(delete d.open_revs,u=q),["revs","attachments","binary","ajax","latest"].forEach((function(e){e in t&&(d[e]=t[e])})),e.get(n,d,(function(e,t){var i,r,o;i=e?[{error:e}]:u(t),r=n,o=i,c[s]={id:r,docs:o},l(),f()}))}))}(i,u),u+=i.length}}f()}try{localStorage.setItem("_pouch_check_localstorage",1),N=!!localStorage.getItem("_pouch_check_localstorage")}catch(e){N=!1}function B(){return N}function M(){v.a.call(this),this._listeners={},function(e){B()&&addEventListener("storage",(function(t){e.emit(t.key)}))}(this)}function P(e){if("undefined"!=typeof console&&"function"==typeof console[e]){var t=Array.prototype.slice.call(arguments,1);console[e].apply(console,t)}}function F(e){var t=0;return e||(t=2e3),function(e,t){return e=parseInt(e,10)||0,(t=parseInt(t,10))!=t||t<=e?t=(e||1)<<1:t+=1,t>6e5&&(e=3e5,t=6e5),~~((t-e)*Math.random()+e)}(e,t)}function D(e,t){P("info","The above "+e+" is totally normal. "+t)}p()(M,v.a),M.prototype.addListener=function(e,t,n,i){if(!this._listeners[t]){var r=this,o=!1;this._listeners[t]=a,this.on(e,a)}function a(){if(r._listeners[t])if(o)o="waiting";else{o=!0;var e=T(i,["style","include_docs","attachments","conflicts","filter","doc_ids","view","since","query_params","binary","return_docs"]);n.changes(e).on("change",(function(e){e.seq>i.since&&!i.cancelled&&(i.since=e.seq,i.onChange(e))})).on("complete",(function(){"waiting"===o&&s()(a),o=!1})).on("error",(function(){o=!1}))}}},M.prototype.removeListener=function(e,t){t in this._listeners&&(v.a.prototype.removeListener.call(this,e,this._listeners[t]),delete this._listeners[t])},M.prototype.notifyLocalWindows=function(e){B()&&(localStorage[e]="a"===localStorage[e]?"b":"a")},M.prototype.notify=function(e){this.emit(e),this.notifyLocalWindows(e)};var j="function"==typeof Object.assign?Object.assign:function(e){for(var t=Object(e),n=1;n0||i0||i>>1],t)<0?r=i+1:o=i;return r}(e,t,n);e.splice(i,0,t)}function Re(e,t){for(var n,i,r=t,o=e.length;r0;){var r=n.pop(),o=r.tree1,s=r.tree2;(o[1].status||s[1].status)&&(o[1].status="available"===o[1].status||"available"===s[1].status?"available":"missing");for(var a=0;a0;){var p=h.pop();if(0!==p.diff)for(var g=p.ids[2],v=0,y=g.length;vt){n||(n={});var d=l.length-t;a={pos:c.pos+d,ids:Re(l,d)};for(var u=0;u0&&i.emit("error",t)):i.emit("complete",n),i.removeAllListeners(),e.removeListener("destroyed",o)}));function o(){i.cancel()}n&&(i.on("complete",(function(e){n(null,e)})),i.on("error",n)),e.once("destroyed",o),t.onChange=function(e,t,n){i.isCancelled||function(e,t,n,i){try{e.emit("change",t,n,i)}catch(e){P("error",'Error in .on("change", function):',e)}}(i,e,t,n)};var s=new Promise((function(e,n){t.complete=function(t,i){t?n(t):e(i)}}));i.once("cancel",(function(){e.removeListener("destroyed",o),t.complete(null,{status:"cancelled"})})),this.then=s.then.bind(s),this.catch=s.catch.bind(s),this.then((function(e){r(null,e)}),r),e.taskqueue.isReady?i.validateChanges(t):e.taskqueue.addTask((function(e){e?t.complete(e):i.isCancelled?i.emit("cancel"):i.validateChanges(t)}))}function Ke(e,t,n){var i=[{rev:e._rev}];"all_docs"===n.style&&(i=Me(t.rev_tree).map((function(e){return{rev:e.rev}})));var r={id:t.id,changes:i,doc:e};return Ge(t,e._rev)&&(r.deleted=!0),n.conflicts&&(r.doc._conflicts=Pe(t),r.doc._conflicts.length||delete r.doc._conflicts),r}function Xe(e,t){return et?1:0}function Ye(e,t){return function(n,i){n||i[0]&&i[0].error?((n=n||i[0]).docId=t,e(n)):e(null,i.length?i[0]:i)}}function Qe(e,t){var n=Xe(e._id,t._id);return 0!==n?n:Xe(e._revisions?e._revisions.start:0,t._revisions?t._revisions.start:0)}function Ze(){for(var e in v.a.call(this),Ze.prototype)"function"==typeof this[e]&&(this[e]=this[e].bind(this))}function et(){this.isReady=!1,this.failed=!1,this.queue=[]}function tt(e,t){if(!(this instanceof tt))return new tt(e,t);var n=this;if(t=t||{},e&&"object"==typeof e&&(e=(t=e).name,delete t.name),void 0===t.deterministic_revs&&(t.deterministic_revs=!0),this.__opts=t=L(t),n.auto_compaction=t.auto_compaction,n.prefix=tt.prefix,"string"!=typeof e)throw new Error("Missing/invalid DB name");var i=function(e,t){var n=e.match(/([a-z-]*):\/\/(.*)/);if(n)return{name:/https?/.test(n[1])?n[1]+"://"+n[2]:n[2],adapter:n[1]};var i=tt.adapters,r=tt.preferredAdapters,o=tt.prefix,s=t.adapter;if(!s)for(var a=0;at&&a.push(e)})),Ie(o,(function(e,t,n,i,r){var o=t+"-"+n;"available"===r.status&&-1!==a.indexOf(o)&&c.push(o)})),i._doCompaction(e,c,n)}))})),Ze.prototype.compact=C("compact",(function(e,t){"function"==typeof e&&(t=e,e={});e=e||{},this._compactionQueue=this._compactionQueue||[],this._compactionQueue.push({opts:e,callback:t}),1===this._compactionQueue.length&&function e(t){var n=t._compactionQueue[0],i=n.opts,r=n.callback;t.get("_local/compaction").catch((function(){return!1})).then((function(n){n&&n.last_seq&&(i.last_seq=n.last_seq),t._compact(i,(function(n,i){n?r(n):r(null,i),s()((function(){t._compactionQueue.shift(),t._compactionQueue.length&&e(t)}))}))}))}(this)})),Ze.prototype._compact=function(e,t){var n=this,i={return_docs:!1,last_seq:e.last_seq||0},r=[];n.changes(i).on("change",(function(e){r.push(n.compactDocument(e.id,0))})).on("complete",(function(e){var i=e.last_seq;Promise.all(r).then((function(){return pe(n,"_local/compaction",(function(e){return(!e.last_seq||e.last_seq0?e.keys.slice(e.skip):e.keys;e.keys=t,e.skip=0,delete e.limit,e.descending&&(t.reverse(),e.descending=!1)}(e),0===e.keys.length))return this._allDocs({limit:0},t)}return this._allDocs(e,t)})),Ze.prototype.changes=function(e,t){return"function"==typeof e&&(t=e,e={}),(e=e||{}).return_docs="return_docs"in e?e.return_docs:!e.live,new Je(this,e,t)},Ze.prototype.close=C("close",(function(e){return this._closed=!0,this.emit("closed"),this._close(e)})),Ze.prototype.info=C("info",(function(e){var t=this;this._info((function(n,i){if(n)return e(n);i.db_name=i.db_name||t.name,i.auto_compaction=!(!t.auto_compaction||ae(t)),i.adapter=t.adapter,e(null,i)}))})),Ze.prototype.id=C("id",(function(e){return this._id(e)})),Ze.prototype.type=function(){return"function"==typeof this._type?this._type():this.adapter},Ze.prototype.bulkDocs=C("bulkDocs",(function(e,t,n){if("function"==typeof t&&(n=t,t={}),t=t||{},Array.isArray(e)&&(e={docs:e}),!e||!e.docs||!Array.isArray(e.docs))return n(ne(H));for(var i=0;i1?t.set(e.name,n):t.delete(e.name))}})),e.on("destroyed",(function(e){if(t.has(e)){var n=t.get(e);t.delete(e),n.forEach((function(e){e.emit("destroyed",!0)}))}}))}(tt),tt.adapter=function(e,t,n){t.valid()&&(tt.adapters[e]=t,n&&tt.preferredAdapters.push(e))},tt.plugin=function(e){if("function"==typeof e)e(tt);else{if("object"!=typeof e||0===Object.keys(e).length)throw new Error('Invalid plugin: got "'+e+'", expected an object or a function');Object.keys(e).forEach((function(t){tt.prototype[t]=e[t]}))}return this.__defaults&&(tt.__defaults=j({},this.__defaults)),tt},tt.defaults=function(e){function t(e,n){if(!(this instanceof t))return new t(e,n);n=n||{},e&&"object"==typeof e&&(e=(n=e).name,delete n.name),n=j({},t.__defaults,n),tt.call(this,e,n)}return p()(t,tt),t.preferredAdapters=tt.preferredAdapters.slice(),Object.keys(tt).forEach((function(e){e in t||(t[e]=tt[e])})),t.__defaults=j({},this.__defaults,e),t},tt.fetch=function(e,t){return it(e,t)};function st(e,t){for(var n=e,i=0,r=t.length;i0&&"\\"===e[i-1]&&("$"===o||"."===o)?n=n.substring(0,n.length-1)+o:"."===o?(t.push(n),n=""):n+=o}return t.push(n),t}var ct=["$or","$nor","$not"];function lt(e){return ct.indexOf(e)>-1}function dt(e){return Object.keys(e)[0]}function ut(e){var t={},n={$or:!0,$nor:!0};return e.forEach((function(e){Object.keys(e).forEach((function(i){var r=e[i];if("object"!=typeof r&&(r={$eq:r}),lt(i))if(r instanceof Array){if(n[i])return n[i]=!1,void(t[i]=r);var o=[];t[i].forEach((function(e){Object.keys(r).forEach((function(t){var n=r[t],i=Math.max(Object.keys(e).length,Object.keys(n).length),s=ut([e,n]);Object.keys(s).length<=i||o.push(s)}))})),t[i]=o}else t[i]=ut([r]);else{var s=t[i]=t[i]||{};Object.keys(r).forEach((function(e){var t=r[e];return"$gt"===e||"$gte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$gte?"$gte"===e?t>n.$gte&&(n.$gte=t):t>=n.$gte&&(delete n.$gte,n.$gt=t):void 0!==n.$gt?"$gte"===e?t>n.$gt&&(delete n.$gt,n.$gte=t):t>n.$gt&&(n.$gt=t):n[e]=t}(e,t,s):"$lt"===e||"$lte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$lte?"$lte"===e?tt?1:-1}(e,t)}return Array.isArray(e)?function(e,t){for(var n=Math.min(e.length,t.length),i=0;it.length?1:-1}(e,t):function(e,t){for(var n=Object.keys(e),i=Object.keys(t),r=Math.min(n.length,i.length),o=0;oi.length?1:-1}(e,t)}function ht(e){switch(typeof e){case"undefined":return null;case"number":return e===1/0||e===-1/0||isNaN(e)?null:e;case"object":var t=e;if(Array.isArray(e)){var n=e.length;e=new Array(n);for(var i=0;ir?1:0)}}(t.sort);e=e.sort(i),"string"!=typeof t.sort[0]&&"desc"===(r=t.sort[0])[dt(r)]&&(e=e.reverse())}var r;if("limit"in t||"skip"in t){var o=t.skip||0,s=("limit"in t?t.limit:e.length)+o;e=e.slice(o,s)}return e}function _t(e,t,n){return n.every((function(n){var i=t[n],r=at(n),o=st(e,r);return lt(n)?function(e,t,n){if("$or"===e)return t.some((function(e){return _t(n,e,Object.keys(e))}));if("$not"===e)return!_t(n,t,Object.keys(t));return!t.find((function(e){return _t(n,e,Object.keys(e))}))}(n,i,e):Et(i,e,r,o)}))}function Et(e,t,n,i){return!e||("object"==typeof e?Object.keys(e).every((function(r){var o=e[r];if(0===r.indexOf("$"))return St(r,t,o,n,i);var s=at(r);if(void 0===i&&"object"!=typeof o&&s.length>0)return!1;var a=st(i,s);return"object"==typeof o?Et(o,t,n,a):St("$eq",t,o,s,a)})):e===i)}function St(e,t,n,i,r){if(!xt[e])throw new Error('unknown operator "'+e+'" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, $nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');return xt[e](t,n,i,r)}function kt(e){return null!=e}function Lt(e){return void 0!==e}function At(e,t){return t.some((function(t){return e instanceof Array?e.some((function(e){return 0===mt(t,e)})):0===mt(t,e)}))}var xt={$elemMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.some((function(e){return _t(e,t,Object.keys(t))})):i.some((function(i){return Et(t,e,n,i)}))))},$allMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.every((function(e){return _t(e,t,Object.keys(t))})):i.every((function(i){return Et(t,e,n,i)}))))},$eq:function(e,t,n,i){return Lt(i)&&0===mt(i,t)},$gte:function(e,t,n,i){return Lt(i)&&mt(i,t)>=0},$gt:function(e,t,n,i){return Lt(i)&&mt(i,t)>0},$lte:function(e,t,n,i){return Lt(i)&&mt(i,t)<=0},$lt:function(e,t,n,i){return Lt(i)&&mt(i,t)<0},$exists:function(e,t,n,i){return t?Lt(i):!Lt(i)},$mod:function(e,t,n,i){return kt(i)&&function(e,t){return"number"==typeof e&&parseInt(e,10)===e&&e%t[0]===t[1]}(i,t)},$ne:function(e,t,n,i){return t.every((function(e){return 0!==mt(i,e)}))},$in:function(e,t,n,i){return kt(i)&&At(i,t)},$nin:function(e,t,n,i){return kt(i)&&!At(i,t)},$size:function(e,t,n,i){return kt(i)&&Array.isArray(i)&&function(e,t){return e.length===t}(i,t)},$all:function(e,t,n,i){return Array.isArray(i)&&function(e,t){return t.every((function(t){return e.some((function(e){return 0===mt(t,e)}))}))}(i,t)},$regex:function(e,t,n,i){return kt(i)&&"string"==typeof i&&t.every((function(e){return function(e,t){return new RegExp(t).test(e)}(i,e)}))},$type:function(e,t,n,i){return function(e,t){switch(t){case"null":return null===e;case"boolean":return"boolean"==typeof e;case"number":return"number"==typeof e;case"string":return"string"==typeof e;case"array":return e instanceof Array;case"object":return"[object Object]"==={}.toString.call(e)}}(i,t)}};function Ct(e,t){if(e.selector&&e.filter&&"_selector"!==e.filter){var n="string"==typeof e.filter?e.filter:"function";return t(new Error('selector invalid for filter "'+n+'"'))}t()}function Tt(e){e.view&&!e.filter&&(e.filter="_view"),e.selector&&!e.filter&&(e.filter="_selector"),e.filter&&"string"==typeof e.filter&&("_view"===e.filter?e.view=le(e.view):e.filter=le(e.filter))}function Nt(e,t){return t.filter&&"string"==typeof t.filter&&!t.doc_ids&&!ae(e.db)}function Ot(e,t){var n=t.complete;if("_view"===t.filter){if(!t.view||"string"!=typeof t.view){var i=ne(Y,"`view` filter parameter not found or invalid.");return n(i)}var r=ce(t.view);e.db.get("_design/"+r[0],(function(i,o){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var s=o&&o.views&&o.views[r[1]]&&o.views[r[1]].map;if(!s)return n(ne($,o.views?"missing json key: "+r[1]:"missing json key: views"));t.filter=he(["return function(doc) {",' "use strict";'," var emitted = false;"," var emit = function (a, b) {"," emitted = true;"," };"," var view = "+s+";"," view(doc);"," if (emitted) {"," return true;"," }","};"].join("\n"),{}),e.doChanges(t)}))}else if(t.selector)t.filter=function(e){return function(e,t){if("object"!=typeof t)throw new Error("Selector error: expected a JSON object");var n=wt([{doc:e}],{selector:t=ft(t)},Object.keys(t));return n&&1===n.length}(e,t.selector)},e.doChanges(t);else{var o=ce(t.filter);e.db.get("_design/"+o[0],(function(i,r){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var s=r&&r.filters&&r.filters[o[1]];if(!s)return n(ne($,r&&r.filters?"missing json key: "+o[1]:"missing json key: filters"));t.filter=he('"use strict";\nreturn '+s+";",{}),e.doChanges(t)}))}}function qt(e){return e.reduce((function(e,t){return e[t]=!0,e}),{})}tt.plugin((function(e){e._changesFilterPlugin={validate:Ct,normalize:Tt,shouldFilter:Nt,filter:Ot}})),tt.version="7.3.0";var It=qt(["_id","_rev","_access","_attachments","_deleted","_revisions","_revs_info","_conflicts","_deleted_conflicts","_local_seq","_rev_tree","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats","_removed"]),Bt=qt(["_access","_attachments","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats"]);function Mt(e){if(!/^\d+-/.test(e))return ne(ee);var t=e.indexOf("-"),n=e.substring(0,t),i=e.substring(t+1);return{prefix:parseInt(n,10),id:i}}function Pt(e,t,n){var i,r,o;n||(n={deterministic_revs:!0});var s={status:"available"};if(e._deleted&&(s.deleted=!0),t)if(e._id||(e._id=Oe()),r=Ne(e,n.deterministic_revs),e._rev){if((o=Mt(e._rev)).error)return o;e._rev_tree=[{pos:o.prefix,ids:[o.id,{status:"missing"},[[r,s,[]]]]}],i=o.prefix+1}else e._rev_tree=[{pos:1,ids:[r,s,[]]}],i=1;else if(e._revisions&&(e._rev_tree=function(e,t){for(var n=e.start-e.ids.length+1,i=e.ids,r=[i[0],t,[]],o=1,s=i.length;o1&&!n?(a={continue:function(){if(!o.length)return r();var n,a=o[o.length-1];if(t&&t.upper)try{n=IDBKeyRange.bound(a,t.upper,!0,t.upperOpen)}catch(e){if("DataError"===e.name&&0===e.code)return r()}else n=IDBKeyRange.lowerBound(a,!0);t=n,o=null,s=null,e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l}},e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l):n?e.openCursor(t,"prev").onsuccess=d:e.openCursor(t).onsuccess=d}function nn(e,t,n){var i,r,o="startkey"in e&&e.startkey,s="endkey"in e&&e.endkey,a="key"in e&&e.key,c="keys"in e&&e.keys,l=e.skip||0,d="number"==typeof e.limit?e.limit:-1,u=!1!==e.inclusive_end;if(!c&&(r=(i=function(e,t,n,i,r){try{if(e&&t)return r?IDBKeyRange.bound(t,e,!n,!1):IDBKeyRange.bound(e,t,!1,!n);if(e)return r?IDBKeyRange.upperBound(e):IDBKeyRange.lowerBound(e);if(t)return r?IDBKeyRange.lowerBound(t,!n):IDBKeyRange.upperBound(t,!n);if(i)return IDBKeyRange.only(i)}catch(e){return{error:e}}return null}(o,s,u,a,e.descending))&&i.error)&&("DataError"!==r.name||0!==r.code))return n(ne(Z,r.name,r.message));var f=[Ht,"by-sequence",$t];e.attachments&&f.push("attach-store");var m=Qt(t,f,"readonly");if(m.error)return n(m.error);var h=m.txn;h.oncomplete=function(){e.attachments?Xt(E,e.binary).then(A):A()},h.onabort=Vt(n);var p,g,v,y=h.objectStore(Ht),b=h.objectStore("by-sequence"),w=h.objectStore($t),_=b.index("_doc_id_rev"),E=[];function S(t,n){var i={id:n.id,key:n.id,value:{rev:t}};n.deleted?c&&(E.push(i),i.value.deleted=!0,i.doc=null):l--<=0&&(E.push(i),e.include_docs&&function(t,n,i){var r=t.id+"::"+i;_.get(r).onsuccess=function(i){if(n.doc=zt(i.target.result)||{},e.conflicts){var r=Pe(t);r.length&&(n.doc._conflicts=r)}Kt(n.doc,e,h)}}(n,i,t))}function k(e){for(var t=0,n=e.length;t0&&(g=e.target.result[0])},b.openCursor(null,"prev").onsuccess=function(e){var t=e.target.result,n=void 0;return t&&t.key&&(n=t.key),v({target:{result:[n]}})}),r||0===d?void 0:c?function(e,t,n){var i=new Array(e.length),r=0;e.forEach((function(o,s){t.get(o).onsuccess=function(t){t.target.result?i[s]=t.target.result:i[s]={key:o,error:"not_found"},++r===e.length&&n(e,i,{})}}))}(e.keys,y,L):-1===d?function(e,t,n){if("function"!=typeof e.getAll){var i=[];e.openCursor(t).onsuccess=function(e){var t=e.target.result;t?(i.push(t.value),t.continue()):n({target:{result:i}})}}else e.getAll(t).onsuccess=n}(y,i,(function(t){var n=t.target.result;e.descending&&(n=n.reverse()),k(n)})):void tn(y,i,e.descending,d+l,L)}var rn=!1,on=[];function sn(){!rn&&on.length&&(rn=!0,on.shift()())}function an(e,t,n,o){if((e=L(e)).continuous){var s=n+":"+Oe();return Zt.addListener(n,s,t,e),Zt.notify(n),{cancel:function(){Zt.removeListener(n,s)}}}var a=e.doc_ids&&new i(e.doc_ids);e.since=e.since||0;var c=e.since,l="limit"in e?e.limit:-1;0===l&&(l=1);var d,u,f,m,h=[],p=0,g=re(e),v=new r;function y(e,t,n,i){if(n.seq!==t)return i();if(n.winningRev===e._rev)return i(n,e);var r=e._id+"::"+n.winningRev;m.get(r).onsuccess=function(e){i(n,zt(e.target.result))}}function b(){e.complete(null,{results:h,last_seq:c})}var w=[Ht,"by-sequence"];e.attachments&&w.push("attach-store");var _=Qt(o,w,"readonly");if(_.error)return e.complete(_.error);(d=_.txn).onabort=Vt(e.complete),d.oncomplete=function(){!e.continuous&&e.attachments?Xt(h).then(b):b()},u=d.objectStore("by-sequence"),f=d.objectStore(Ht),m=u.index("_doc_id_rev"),tn(u,e.since&&!e.descending?IDBKeyRange.lowerBound(e.since,!0):null,e.descending,l,(function(t,n,i){if(i&&t.length){var r=new Array(t.length),o=new Array(t.length),s=0;n.forEach((function(n,c){!function(e,t,n){if(a&&!a.has(e._id))return n();var i=v.get(e._id);if(i)return y(e,t,i,n);f.get(e._id).onsuccess=function(r){i=Gt(r.target.result),v.set(e._id,i),y(e,t,i,n)}}(zt(n),t[c],(function(n,a){o[c]=n,r[c]=a,++s===t.length&&function(){for(var t=[],n=0,s=r.length;nr&&(r=n),t.continue()}}()}function s(){var e=Wt(o,o.winningRev,o.deleted);n.put(e).onsuccess=function(){i.continue()}}}}e._meta=null,e._remote=!1,e.type=function(){return"idb"},e._id=x((function(t){t(null,e._meta.instanceId)})),e._bulkDocs=function(n,i,o){en(t,n,i,e,r,a(o))},e._get=function(e,t,n){var i,o,s,a=t.ctx;if(!a){var c=Qt(r,[Ht,"by-sequence","attach-store"],"readonly");if(c.error)return n(c.error);a=c.txn}function l(){n(s,{doc:i,metadata:o,ctx:a})}a.objectStore(Ht).get(e).onsuccess=function(e){if(!(o=Gt(e.target.result)))return s=ne($,"missing"),l();var n;if(t.rev)n=t.latest?function(e,t){for(var n,i=t.rev_tree.slice();n=i.pop();){var r=n.pos,o=n.ids,s=o[0],a=o[1],c=o[2],l=0===c.length,d=n.history?n.history.slice():[];if(d.push({id:s,pos:r,opts:a}),l)for(var u=0,f=d.length;u=43)},i.onerror=e.onabort=function(e){e.preventDefault(),e.stopPropagation(),t(!1)}})).catch((function(){return!1}))}(d)),cn.then((function(e){c=e,f()})),d.oncomplete=function(){u=!0,f()},d.onabort=Vt(n)},m.onerror=function(e){var t=e.target.error&&e.target.error.message;t?-1!==t.indexOf("stored database is a higher version")&&(t=new Error('This DB was created with the newer "indexeddb" adapter, but you are trying to open it with the older "idb" adapter')):t="Failed to open indexedDB, are you in private browsing mode?",P("error",t),n(ne(Z,t))}}(n,e,t)}),t,n.constructor)}un.valid=function(){try{return"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(e){return!1}};var fn={};function mn(e){var t=e.doc||e.ok,n=t&&t._attachments;n&&Object.keys(n).forEach((function(e){var t=n[e];t.data=_e(t.data,t.content_type)}))}function hn(e){return/^_design/.test(e)?"_design/"+encodeURIComponent(e.slice(8)):/^_local/.test(e)?"_local/"+encodeURIComponent(e.slice(7)):encodeURIComponent(e)}function pn(e){return e._attachments&&Object.keys(e._attachments)?Promise.all(Object.keys(e._attachments).map((function(t){var n=e._attachments[t];if(n.data&&"string"!=typeof n.data)return new Promise((function(e){ke(n.data,e)})).then((function(e){n.data=e}))}))):Promise.resolve()}function gn(e,t){if(function(e){if(!e.prefix)return!1;var t=me(e.prefix).protocol;return"http"===t||"https"===t}(t)){var n=t.name.substr(t.prefix.length);e=t.prefix.replace(/\/?$/,"/")+encodeURIComponent(n)}var i=me(e);(i.user||i.password)&&(i.auth={username:i.user,password:i.password});var r=i.path.replace(/(^\/|\/$)/g,"").split("/");return i.db=r.pop(),-1===i.db.indexOf("%")&&(i.db=encodeURIComponent(i.db)),i.path=r.join("/"),i}function vn(e,t){return yn(e,e.db+"/"+t)}function yn(e,t){var n=e.path?"/":"";return e.protocol+"://"+e.host+(e.port?":"+e.port:"")+"/"+e.path+n+t}function bn(e){return"?"+Object.keys(e).map((function(t){return t+"="+encodeURIComponent(e[t])})).join("&")}function wn(t,n){var i=this,r=gn(t.name,t),o=vn(r,"");t=L(t);var a,c=function(e,n){if((n=n||{}).headers=n.headers||new rt,n.credentials="include",t.auth||r.auth){var i=t.auth||r.auth,o=i.username+":"+i.password,s=ve(unescape(encodeURIComponent(o)));n.headers.set("Authorization","Basic "+s)}var a=t.headers||{};return Object.keys(a).forEach((function(e){n.headers.append(e,a[e])})),function(e){var t="undefined"!=typeof navigator&&navigator.userAgent?navigator.userAgent.toLowerCase():"",n=-1!==t.indexOf("msie"),i=-1!==t.indexOf("trident"),r=-1!==t.indexOf("edge"),o=!("method"in e)||"GET"===e.method;return(n||i||r)&&o}(n)&&(e+=(-1===e.indexOf("?")?"?":"&")+"_nonce="+Date.now()),(t.fetch||it)(e,n)};function l(e,t){return C(e,m()((function(e){u().then((function(){return t.apply(this,e)})).catch((function(t){e.pop()(t)}))}))).bind(i)}function d(e,t,n){var i={};return(t=t||{}).headers=t.headers||new rt,t.headers.get("Content-Type")||t.headers.set("Content-Type","application/json"),t.headers.get("Accept")||t.headers.set("Accept","application/json"),c(e,t).then((function(e){return i.ok=e.ok,i.status=e.status,e.json()})).then((function(e){if(i.data=e,!i.ok){i.data.status=i.status;var t=ie(i.data);if(n)return n(t);throw t}if(Array.isArray(i.data)&&(i.data=i.data.map((function(e){return e.error||e.missing?ie(e):e}))),!n)return i;n(null,i.data)}))}function u(){return t.skip_setup?Promise.resolve():a||((a=d(o).catch((function(e){return e&&e.status&&404===e.status?(D(404,"PouchDB is just detecting if the remote exists."),d(o,{method:"PUT"})):Promise.reject(e)})).catch((function(e){return!(!e||!e.status||412!==e.status)||Promise.reject(e)}))).catch((function(){a=null})),a)}function f(e){return e.split("/").map(encodeURIComponent).join("/")}s()((function(){n(null,i)})),i._remote=!0,i.type=function(){return"http"},i.id=l("id",(function(e){c(yn(r,"")).then((function(e){return e.json()})).catch((function(){return{}})).then((function(t){var n=t&&t.uuid?t.uuid+r.db:vn(r,"");e(null,n)}))})),i.compact=l("compact",(function(e,t){"function"==typeof e&&(t=e,e={}),e=L(e),d(vn(r,"_compact"),{method:"POST"}).then((function(){!function n(){i.info((function(i,r){r&&!r.compact_running?t(null,{ok:!0}):setTimeout(n,e.interval||200)}))}()}))})),i.bulkGet=C("bulkGet",(function(e,t){var n=this;function i(t){var n={};e.revs&&(n.revs=!0),e.attachments&&(n.attachments=!0),e.latest&&(n.latest=!0),d(vn(r,"_bulk_get"+bn(n)),{method:"POST",body:JSON.stringify({docs:e.docs})}).then((function(n){e.attachments&&e.binary&&n.data.results.forEach((function(e){e.docs.forEach(mn)})),t(null,n.data)})).catch(t)}function o(){var i=Math.ceil(e.docs.length/50),r=0,o=new Array(i);function s(e){return function(n,s){o[e]=s.results,++r===i&&t(null,{results:oe(o)})}}for(var a=0;at?t:a;var c=vn(r,"_changes"+bn(i)),p={signal:h.signal,method:f,body:JSON.stringify(l)};m=n,e.aborted||u().then((function(){return d(c,p,s)})).catch(s)}},g={results:[]},v=function(n,i){if(!e.aborted){var r=0;if(i&&i.results){r=i.results.length,g.last_seq=i.last_seq;var c=null,l=null;"number"==typeof i.pending&&(c=i.pending),"string"!=typeof g.last_seq&&"number"!=typeof g.last_seq||(l=g.last_seq);e.query_params,i.results=i.results.filter((function(t){a--;var n=re(e)(t);return n&&(e.include_docs&&e.attachments&&e.binary&&mn(t),e.return_docs&&g.results.push(t),e.onChange(t,c,l)),n}))}else if(n)return e.aborted=!0,void e.complete(n);i&&i.last_seq&&(m=i.last_seq);var d=o&&a<=0||i&&r0?e.slice(n):e}function u(e){var t=e.value;return t&&"object"==typeof t&&t._id||e.id}function f(e){return function(t){return e.include_docs&&e.attachments&&e.binary&&function(e){e.rows.forEach((function(e){var t=e.doc&&e.doc._attachments;t&&Object.keys(t).forEach((function(e){var n=t[e];t[e].data=_e(n.data,n.content_type)}))}))}(t),t}}function h(e,t,n,i){var r=t[e];void 0!==r&&(i&&(r=encodeURIComponent(JSON.stringify(r))),n.push(e+"="+r))}function p(e){if(void 0!==e){var t=Number(e);return isNaN(t)||t!==parseInt(e,10)?e:t}}function g(e,t){var n=e.descending?"endkey":"startkey",i=e.descending?"startkey":"endkey";if(void 0!==e[n]&&void 0!==e[i]&&mt(e[n],e[i])>0)throw new _n("No rows can match your key range, reverse your start_key and end_key or set {descending : true}");if(t.reduce&&!1!==e.reduce){if(e.include_docs)throw new _n("{include_docs:true} is invalid for reduce");if(e.keys&&e.keys.length>1&&!e.group&&!e.group_level)throw new _n("Multi-key fetches for reduce views must use {group: true}")}["group_level","limit","skip"].forEach((function(t){var n=function(e){if(e){if("number"!=typeof e)return new _n('Invalid value for integer: "'+e+'"');if(e<0)return new _n('Invalid value for positive integer: "'+e+'"')}}(e[t]);if(n)throw n}))}function v(e){return function(t){if(404===t.status)return e;throw t}}function y(e,t,n){var r="_local/doc_"+e,o={_id:r,keys:[]},s=n.get(e),a=s[0];return(function(e){return 1===e.length&&/^1-/.test(e[0].rev)}(s[1])?Promise.resolve(o):t.db.get(r).catch(v(o))).then((function(e){return function(e){return e.keys.length?t.db.allDocs({keys:e.keys,include_docs:!0}):Promise.resolve({rows:[]})}(e).then((function(t){return function(e,t){for(var n=[],r=new i,o=0,s=t.rows.length;o0&&0===mt(s.key,t)&&a.push(i),n.set(gt(a),s),t=s.key}return n}return h().then((function(){return m.finish()})).then((function(){e.seq=c}))}(e,n)}))()}function _(e,t){return Ln(b(e),(function(){return function(e,t){var i,o=e.reduceFun&&!1!==t.reduce,s=t.skip||0;void 0===t.keys||t.keys.length||(t.limit=0,delete t.keys);function a(t){return t.include_docs=!0,e.db.allDocs(t).then((function(e){return i=e.total_rows,e.rows.map((function(e){if("value"in e.doc&&"object"==typeof e.doc.value&&null!==e.doc.value){var t=Object.keys(e.doc.value).sort(),n=["id","key","value"];if(!(tn))return e.doc.value}var i=function(e){for(var t=[],n=[],i=0;;){var r=e[i++];if("\0"!==r)switch(r){case"1":t.push(null);break;case"2":t.push("1"===e[i]),i++;break;case"3":var o=vt(e,i);t.push(o.num),i+=o.length;break;case"4":for(var s="";;){var a=e[i];if("\0"===a)break;s+=a,i++}s=s.replace(/\u0001\u0001/g,"\0").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,""),t.push(s);break;case"5":var c={element:[],index:t.length};t.push(c.element),n.push(c);break;case"6":var l={element:{},index:t.length};t.push(l.element),n.push(l);break;default:throw new Error("bad collationIndex or unexpectedly reached end of input: "+r)}else{if(1===t.length)return t.pop();yt(t,n)}}}(e.doc._id);return{key:i[0],id:i[1],value:"value"in e.doc?e.doc.value:null}}))}))}function l(a){var l;if(l=o?function(e,t,i){0===i.group_level&&delete i.group_level;var r=i.group||i.group_level,o=n(e.reduceFun),s=[],a=isNaN(i.group_level)?Number.POSITIVE_INFINITY:i.group_level;t.forEach((function(e){var t=s[s.length-1],n=r?e.key:null;if(r&&Array.isArray(n)&&(n=n.slice(0,a)),t&&0===mt(t.groupKey,n))return t.keys.push([e.key,e.id]),void t.values.push(e.value);s.push({keys:[[e.key,e.id]],values:[e.value],groupKey:n})})),t=[];for(var l=0,u=s.length;l0)||function(e){return e._conflicts&&e._conflicts.length>0}(e.doc)||(e.doc._conflicts&&delete e.doc._conflicts,r.push(e.doc),delete n[e.id])}))}))}return Promise.resolve().then((function(){var e=Object.keys(n).filter((function(e){var t=n[e].missing;return 1===t.length&&Gn(t[0])}));if(e.length>0)return s(e)})).then((function(){var s=function(e){var t=[];return Object.keys(e).forEach((function(n){e[n].missing.forEach((function(e){t.push({id:n,rev:e})}))})),{docs:t,revs:!0,latest:!0}}(n);if(s.docs.length)return e.bulkGet(s).then((function(n){if(i.cancelled)throw new Error("cancelled");return Promise.all(n.results.map((function(n){return Promise.all(n.docs.map((function(n){var i=n.ok;return n.error&&(o=!1),i&&i._attachments?function(e,t,n){var i=ae(t)&&!ae(e),r=Object.keys(n._attachments);return i?e.get(n._id).then((function(i){return Promise.all(r.map((function(r){return function(e,t,n){return!e._attachments||!e._attachments[n]||e._attachments[n].digest!==t._attachments[n].digest}(i,n,r)?t.getAttachment(n._id,r):e.getAttachment(i._id,r)})))})).catch((function(e){if(404!==e.status)throw e;return zn(t,n)})):zn(t,n)}(t,e,i).then((function(e){var t=Object.keys(i._attachments);return e.forEach((function(e,n){var r=i._attachments[t[n]];delete r.stub,delete r.length,r.data=e})),i})):i})))}))).then((function(e){r=r.concat(oe(e).filter(Boolean))}))}))})).then((function(){return{ok:o,docs:r}}))}function Kn(e,t,n,i,r){return e.get(t).catch((function(n){if(404===n.status)return"http"!==e.adapter&&"https"!==e.adapter||D(404,"PouchDB is just checking if a remote checkpoint exists."),{session_id:i,_id:t,history:[],replicator:"pouchdb",version:1};throw n})).then((function(o){if(!r.cancelled&&o.last_seq!==n)return o.history=(o.history||[]).filter((function(e){return e.session_id!==i})),o.history.unshift({last_seq:n,session_id:i}),o.history=o.history.slice(0,5),o.version=1,o.replicator="pouchdb",o.session_id=i,o.last_seq=n,e.put(o).catch((function(o){if(409===o.status)return Kn(e,t,n,i,r);throw o}))}))}function Xn(e,t,n,i,r){this.src=e,this.target=t,this.id=n,this.returnValue=i,this.opts=r||{}}Xn.prototype.writeCheckpoint=function(e,t){var n=this;return this.updateTarget(e,t).then((function(){return n.updateSource(e,t)}))},Xn.prototype.updateTarget=function(e,t){return this.opts.writeTargetCheckpoint?Kn(this.target,this.id,e,t,this.returnValue):Promise.resolve(!0)},Xn.prototype.updateSource=function(e,t){if(this.opts.writeSourceCheckpoint){var n=this;return Kn(this.src,this.id,e,t,this.returnValue).catch((function(e){if(Zn(e))return n.opts.writeSourceCheckpoint=!1,!0;throw e}))}return Promise.resolve(!0)};var Yn={undefined:function(e,t){return 0===mt(e.last_seq,t.last_seq)?t.last_seq:0},1:function(e,t){return function(e,t){if(e.session_id===t.session_id)return{last_seq:e.last_seq,history:e.history};return function e(t,n){var i=t[0],r=t.slice(1),o=n[0],s=n.slice(1);if(!i||0===n.length)return{last_seq:0,history:[]};if(Qn(i.session_id,n))return{last_seq:i.last_seq,history:t};if(Qn(o.session_id,r))return{last_seq:o.last_seq,history:s};return e(r,s)}(e.history,t.history)}(t,e).last_seq}};function Qn(e,t){var n=t[0],i=t.slice(1);return!(!e||0===t.length)&&(e===n.session_id||Qn(e,i))}function Zn(e){return"number"==typeof e.status&&4===Math.floor(e.status/100)}Xn.prototype.getCheckpoint=function(){var e=this;return e.opts&&e.opts.writeSourceCheckpoint&&!e.opts.writeTargetCheckpoint?e.src.get(e.id).then((function(e){return e.last_seq||0})).catch((function(e){if(404!==e.status)throw e;return 0})):e.target.get(e.id).then((function(t){return e.opts&&e.opts.writeTargetCheckpoint&&!e.opts.writeSourceCheckpoint?t.last_seq||0:e.src.get(e.id).then((function(e){return t.version!==e.version?0:(n=t.version?t.version.toString():"undefined")in Yn?Yn[n](t,e):0;var n}),(function(n){if(404===n.status&&t.last_seq)return e.src.put({_id:e.id,last_seq:0}).then((function(){return 0}),(function(n){return Zn(n)?(e.opts.writeSourceCheckpoint=!1,t.last_seq):0}));throw n}))})).catch((function(e){if(404!==e.status)throw e;return 0}))};function ei(e,t,n){var i=n.doc_ids?n.doc_ids.sort(mt):"",r=n.filter?n.filter.toString():"",o="",s="",a="";return n.selector&&(a=JSON.stringify(n.selector)),n.filter&&n.query_params&&(o=JSON.stringify(function(e){return Object.keys(e).sort(mt).reduce((function(t,n){return t[n]=e[n],t}),{})}(n.query_params))),n.filter&&"_view"===n.filter&&(s=n.view.toString()),Promise.all([e.id(),t.id()]).then((function(e){var t=e[0]+e[1]+r+s+o+i+a;return new Promise((function(e){Ce(t,e)}))})).then((function(e){return"_local/"+(e=e.replace(/\//g,".").replace(/\+/g,"_"))}))}function ti(e,t,n,i,r){var o,a,c,l=[],d={seq:0,changes:[],docs:[]},u=!1,f=!1,m=!1,h=0,p=n.continuous||n.live||!1,g=n.batch_size||100,v=n.batches_limit||10,y=n.style||"all_docs",b=!1,w=n.doc_ids,_=n.selector,E=[],S=Oe();r=r||{ok:!0,start_time:(new Date).toISOString(),docs_read:0,docs_written:0,doc_write_failures:0,errors:[]};var k={};function A(){return c?Promise.resolve():ei(e,t,n).then((function(r){a=r;var o={};o=!1===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!1}:"source"===n.checkpoint?{writeSourceCheckpoint:!0,writeTargetCheckpoint:!1}:"target"===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!0}:{writeSourceCheckpoint:!0,writeTargetCheckpoint:!0},c=new Xn(e,t,a,i,o)}))}function x(){if(E=[],0!==o.docs.length){var e=o.docs,s={timeout:n.timeout};return t.bulkDocs({docs:e,new_edits:!1},s).then((function(t){if(i.cancelled)throw I(),new Error("cancelled");var n=Object.create(null);t.forEach((function(e){e.error&&(n[e.id]=e)}));var o=Object.keys(n).length;r.doc_write_failures+=o,r.docs_written+=e.length-o,e.forEach((function(e){var t=n[e._id];if(t){r.errors.push(t);var o=(t.name||"").toLowerCase();if("unauthorized"!==o&&"forbidden"!==o)throw t;i.emit("denied",L(t))}else E.push(e)}))}),(function(t){throw r.doc_write_failures+=e.length,t}))}}function C(){if(o.error)throw new Error("There was a problem getting docs.");r.last_seq=h=o.seq;var e=L(r);return E.length&&(e.docs=E,"number"==typeof o.pending&&(e.pending=o.pending,delete o.pending),i.emit("change",e)),u=!0,c.writeCheckpoint(o.seq,S).then((function(){if(i.emit("checkpoint",{checkpoint:o.seq}),u=!1,i.cancelled)throw I(),new Error("cancelled");o=void 0,D()})).catch((function(e){throw R(e),e}))}function T(){return Jn(e,t,o.diffs,i).then((function(e){o.error=!e.ok,e.docs.forEach((function(e){delete o.diffs[e._id],r.docs_read++,o.docs.push(e)}))}))}function N(){var e;i.cancelled||o||(0!==l.length?(o=l.shift(),i.emit("checkpoint",{start_next_batch:o.seq}),(e={},o.changes.forEach((function(t){i.emit("checkpoint",{revs_diff:t}),"_user/"!==t.id&&(e[t.id]=t.changes.map((function(e){return e.rev})))})),t.revsDiff(e).then((function(e){if(i.cancelled)throw I(),new Error("cancelled");o.diffs=e}))).then(T).then(x).then(C).then(N).catch((function(e){q("batch processing terminated with error",e)}))):O(!0))}function O(e){0!==d.changes.length?(e||f||d.changes.length>=g)&&(l.push(d),d={seq:0,changes:[],docs:[]},"pending"!==i.state&&"stopped"!==i.state||(i.state="active",i.emit("active")),N()):0!==l.length||o||((p&&k.live||f)&&(i.state="pending",i.emit("paused")),f&&I())}function q(e,t){m||(t.message||(t.message=e),r.ok=!1,r.status="aborting",l=[],d={seq:0,changes:[],docs:[]},I(t))}function I(o){if(!(m||i.cancelled&&(r.status="cancelled",u)))if(r.status=r.status||"complete",r.end_time=(new Date).toISOString(),r.last_seq=h,m=!0,o){(o=ne(o)).result=r;var s=(o.name||"").toLowerCase();"unauthorized"===s||"forbidden"===s?(i.emit("error",o),i.removeAllListeners()):function(e,t,n,i){if(!1===e.retry)return t.emit("error",n),void t.removeAllListeners();if("function"!=typeof e.back_off_function&&(e.back_off_function=F),t.emit("requestError",n),"active"===t.state||"pending"===t.state){t.emit("paused",n),t.state="stopped";var r=function(){e.current_back_off=0};t.once("paused",(function(){t.removeListener("active",r)})),t.once("active",r)}e.current_back_off=e.current_back_off||0,e.current_back_off=e.back_off_function(e.current_back_off),setTimeout(i,e.current_back_off)}(n,i,o,(function(){ti(e,t,n,i)}))}else i.emit("complete",r),i.removeAllListeners()}function B(e,t,r){if(i.cancelled)return I();"number"==typeof t&&(d.pending=t),re(n)(e)&&(d.seq=e.seq||r,d.changes.push(e),i.emit("checkpoint",{pending_batch:d.seq}),s()((function(){O(0===l.length&&k.live)})))}function M(e){if(b=!1,i.cancelled)return I();if(e.results.length>0)k.since=e.results[e.results.length-1].seq,D(),O(!0);else{var t=function(){p?(k.live=!0,D()):f=!0,O(!0)};o||0!==e.results.length?t():(u=!0,c.writeCheckpoint(e.last_seq,S).then((function(){u=!1,r.last_seq=h=e.last_seq,t()})).catch(R))}}function P(e){if(b=!1,i.cancelled)return I();q("changes rejected",e)}function D(){if(!b&&!f&&l.length1)for(var n=1;na)&&void 0===e.nsecs&&(p=0),p>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");a=h,c=p,r=f;var v=(1e4*(268435455&(h+=122192928e5))+p)%4294967296;d[l++]=v>>>24&255,d[l++]=v>>>16&255,d[l++]=v>>>8&255,d[l++]=255&v;var y=h/4294967296*1e4&268435455;d[l++]=y>>>8&255,d[l++]=255&y,d[l++]=y>>>24&15|16,d[l++]=y>>>16&255,d[l++]=f>>>8|128,d[l++]=255&f;for(var b=0;b<6;++b)d[l+b]=u[b];return t||Object(s.a)(d)},d=n(12);var u=function(e){if(!Object(d.a)(e))throw TypeError("Invalid UUID");var t,n=new Uint8Array(16);return n[0]=(t=parseInt(e.slice(0,8),16))>>>24,n[1]=t>>>16&255,n[2]=t>>>8&255,n[3]=255&t,n[4]=(t=parseInt(e.slice(9,13),16))>>>8,n[5]=255&t,n[6]=(t=parseInt(e.slice(14,18),16))>>>8,n[7]=255&t,n[8]=(t=parseInt(e.slice(19,23),16))>>>8,n[9]=255&t,n[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,n[11]=t/4294967296&255,n[12]=t>>>24&255,n[13]=t>>>16&255,n[14]=t>>>8&255,n[15]=255&t,n};var f=function(e,t,n){function i(e,i,r,o){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],n=0;n>>9<<4)+1}function h(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function p(e,t,n,i,r,o){return h((s=h(h(t,e),h(i,o)))<<(a=r)|s>>>32-a,n);var s,a}function g(e,t,n,i,r,o,s){return p(t&n|~t&i,e,t,r,o,s)}function v(e,t,n,i,r,o,s){return p(t&i|n&~i,e,t,r,o,s)}function y(e,t,n,i,r,o,s){return p(t^n^i,e,t,r,o,s)}function b(e,t,n,i,r,o,s){return p(n^(t|~i),e,t,r,o,s)}var w=f("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var n=0;n>5]>>>i%32&255,o=parseInt("0123456789abcdef".charAt(r>>>4&15)+"0123456789abcdef".charAt(15&r),16);t.push(o)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[i/8])<>>32-t}var k=f("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var i=unescape(encodeURIComponent(e));e=[];for(var r=0;r>>0;b=y,y=v,v=S(g,30)>>>0,g=p,p=k}n[0]=n[0]+p>>>0,n[1]=n[1]+g>>>0,n[2]=n[2]+v>>>0,n[3]=n[3]+y>>>0,n[4]=n[4]+b>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]})),L="00000000-0000-0000-0000-000000000000";var A=function(e){if(!Object(d.a)(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},,function(e,t){
/**
* vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats.
*
@@ -44,5 +44,5 @@
* vkbeautify.sqlmin(text);// minify SQL
*
*/
-function n(e){var t=" ";if(isNaN(parseInt(e)))t=e;else switch(e){case 1:t=" ";break;case 2:t=" ";break;case 3:t=" ";break;case 4:t=" ";break;case 5:t=" ";break;case 6:t=" ";break;case 7:t=" ";break;case 8:t=" ";break;case 9:t=" ";break;case 10:t=" ";break;case 11:t=" ";break;case 12:t=" "}for(var n=["\n"],i=0;i<100;i++)n.push(n[i]+t);return n}function i(){this.step=" ",this.shift=n(this.step)}function r(e,t){return t-(e.replace(/\(/g,"").length-e.replace(/\)/g,"").length)}function o(e,t){return e.replace(/\s{1,}/g," ").replace(/ AND /gi,"~::~"+t+t+"AND ").replace(/ BETWEEN /gi,"~::~"+t+"BETWEEN ").replace(/ CASE /gi,"~::~"+t+"CASE ").replace(/ ELSE /gi,"~::~"+t+"ELSE ").replace(/ END /gi,"~::~"+t+"END ").replace(/ FROM /gi,"~::~FROM ").replace(/ GROUP\s{1,}BY/gi,"~::~GROUP BY ").replace(/ HAVING /gi,"~::~HAVING ").replace(/ IN /gi," IN ").replace(/ JOIN /gi,"~::~JOIN ").replace(/ CROSS~::~{1,}JOIN /gi,"~::~CROSS JOIN ").replace(/ INNER~::~{1,}JOIN /gi,"~::~INNER JOIN ").replace(/ LEFT~::~{1,}JOIN /gi,"~::~LEFT JOIN ").replace(/ RIGHT~::~{1,}JOIN /gi,"~::~RIGHT JOIN ").replace(/ ON /gi,"~::~"+t+"ON ").replace(/ OR /gi,"~::~"+t+t+"OR ").replace(/ ORDER\s{1,}BY/gi,"~::~ORDER BY ").replace(/ OVER /gi,"~::~"+t+"OVER ").replace(/\(\s{0,}SELECT /gi,"~::~(SELECT ").replace(/\)\s{0,}SELECT /gi,")~::~SELECT ").replace(/ THEN /gi," THEN~::~"+t).replace(/ UNION /gi,"~::~UNION~::~").replace(/ USING /gi,"~::~USING ").replace(/ WHEN /gi,"~::~"+t+"WHEN ").replace(/ WHERE /gi,"~::~WHERE ").replace(/ WITH /gi,"~::~WITH ").replace(/ ALL /gi," ALL ").replace(/ AS /gi," AS ").replace(/ ASC /gi," ASC ").replace(/ DESC /gi," DESC ").replace(/ DISTINCT /gi," DISTINCT ").replace(/ EXISTS /gi," EXISTS ").replace(/ NOT /gi," NOT ").replace(/ NULL /gi," NULL ").replace(/ LIKE /gi," LIKE ").replace(/\s{0,}SELECT /gi,"SELECT ").replace(/\s{0,}UPDATE /gi,"UPDATE ").replace(/ SET /gi," SET ").replace(/~::~{1,}/g,"~::~").split("~::~")}i.prototype.xml=function(e,t){var i=e.replace(/>\s{0,}<").replace(/-1?(a+=l[s]+i[c],o=!0,(i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1||i[c].search(/!DOCTYPE/)>-1)&&(o=!1)):i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1?(a+=i[c],o=!1):/^<\w/.exec(i[c-1])&&/^<\/\w/.exec(i[c])&&/^<[\w:\-\.\,]+/.exec(i[c-1])==/^<\/[\w:\-\.\,]+/.exec(i[c])[0].replace("/","")?(a+=i[c],o||s--):i[c].search(/<\w/)>-1&&-1==i[c].search(/<\//)&&-1==i[c].search(/\/>/)?a=a+=o?i[c]:l[s++]+i[c]:i[c].search(/<\w/)>-1&&i[c].search(/<\//)>-1?a=a+=o?i[c]:l[s]+i[c]:i[c].search(/<\//)>-1?a=a+=o?i[c]:l[--s]+i[c]:i[c].search(/\/>/)>-1?a=a+=o?i[c]:l[s]+i[c]:i[c].search(/<\?/)>-1||i[c].search(/xmlns\:/)>-1||i[c].search(/xmlns\=/)>-1?a+=l[s]+i[c]:a+=i[c];return"\n"==a[0]?a.slice(1):a},i.prototype.json=function(e,t){t=t||this.step;return"undefined"==typeof JSON?e:"string"==typeof e?JSON.stringify(JSON.parse(e),null,t):"object"==typeof e?JSON.stringify(e,null,t):e},i.prototype.css=function(e,t){var i=e.replace(/\s{1,}/g," ").replace(/\{/g,"{~::~").replace(/\}/g,"~::~}~::~").replace(/\;/g,";~::~").replace(/\/\*/g,"~::~/*").replace(/\*\//g,"*/~::~").replace(/~::~\s{0,}~::~/g,"~::~").split("~::~"),r=i.length,o=0,s="",a=0,c=t?n(t):this.shift;for(a=0;a/g,"").replace(/[ \r\n\t]{1,}xmlns/g," xmlns")).replace(/>\s{0,}<")},i.prototype.jsonmin=function(e){return"undefined"==typeof JSON?e:JSON.stringify(JSON.parse(e),null,0)},i.prototype.cssmin=function(e,t){return(t?e:e.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"")).replace(/\s{1,}/g," ").replace(/\{\s{1,}/g,"{").replace(/\}\s{1,}/g,"}").replace(/\;\s{1,}/g,";").replace(/\/\*\s{1,}/g,"/*").replace(/\*\/\s{1,}/g,"*/")},i.prototype.sqlmin=function(e){return e.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")")},e.exports=new i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.renameHTML=t.newFolderHTML=t.uploadAreaHTML=void 0,t.uploadAreaHTML='\n\n
\n \n
\n
\n\n
Unpaired Documents
\n\n
\n\n
\n
MEI
\n
\n
\n
\n \n \n \n Create new MEI file\n \n \n
\n
\n
\n\n
\n\n
\n\n
\n
\n\n
\n\n
Paired Folios
\n
\n
\n\n
\n\n
\n\n \x3c!--\n
\n --\x3e\n\n
\n
',t.newFolderHTML='\n \n
\n
\n
\n Cancel \n Create \n
\n
\n ',t.renameHTML='\n \n
\n
\n
\n Cancel \n Confirm \n
\n
\n '},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.groupingNotRecognized=void 0,t.groupingNotRecognized=function(){window.confirm("Neon does not recognize this neume grouping. Would you like to create a compound neume?")||document.getElementById("undo").click()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitStaffHandler=void 0;const i=n(5),r=n(4),o=n(23),s=n(15);t.SplitStaffHandler=class{constructor(e,t){this.handler=(e=>{const t=this.staff.id,n=(0,s.getSVGRelCoords)(e.clientX,e.clientY),a={action:"split",param:{elementId:t,x:n.x}};this.neonView.edit(a,this.neonView.view.getCurrentPageURI()).then(async e=>{e&&(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success"));const n=new o.default(this.neonView,".staff");this.splitDisable(),(0,r.selectAll)([document.querySelector("#"+t)],this.neonView,n);const s=document.getElementById("moreEdit");s&&(s.innerHTML="",s.parentElement.classList.add("hidden"))})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.staff=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click Where to Split")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitNeumeHandler=void 0;const i=n(5);t.SplitNeumeHandler=class{constructor(e,t){this.handler=(e=>{const t={action:"splitNeume",param:{elementId:this.neume.id,ncId:e.target.parentElement.id}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(async e=>{e?(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success")):(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action failed","error")),this.splitDisable()})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.neume=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click The Beginning of The Second Neume")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t){},function(e,t,n){"use strict";(function(e){t.test=function(){return"function"==typeof e.queueMicrotask},t.install=function(t){return function(){e.queueMicrotask(t)}}}).call(this,n(9))},function(e,t,n){"use strict";(function(e){var n=e.MutationObserver||e.WebKitMutationObserver;t.test=function(){return n},t.install=function(t){var i=0,r=new n(t),o=e.document.createTextNode("");return r.observe(o,{characterData:!0}),function(){o.data=i=++i%2}}}).call(this,n(9))},function(e,t,n){"use strict";(function(e){t.test=function(){return!e.setImmediate&&void 0!==e.MessageChannel},t.install=function(t){var n=new e.MessageChannel;return n.port1.onmessage=t,function(){n.port2.postMessage(0)}}}).call(this,n(9))},function(e,t,n){"use strict";(function(e){t.test=function(){return"document"in e&&"onreadystatechange"in e.document.createElement("script")},t.install=function(t){return function(){var n=e.document.createElement("script");return n.onreadystatechange=function(){t(),n.onreadystatechange=null,n.parentNode.removeChild(n),n=null},e.document.documentElement.appendChild(n),t}}}).call(this,n(9))},function(e,t,n){"use strict";t.test=function(){return!0},t.install=function(e){return function(){setTimeout(e,0)}}},,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateDocName=t.deleteDocument=t.addDocument=t.createManifest=t.fetchUploads=t.db=void 0;const i=n(30),r=n(28),o=n(92);t.db=new r.default("Neon-User-Storage"),t.fetchUploads=async function(){try{return(await new Promise((e,n)=>{t.db.allDocs({include_docs:!0}).then(t=>e(t)).catch(e=>n(e))})).rows.map(e=>({id:e.id,name:e.doc?e.doc.name:"undefined"}))}catch(e){return console.log("Couldn't fetch uploaded documents",e.message),[]}},t.createManifest=function(e,t,n,r){return new Promise(async s=>{const a=JSON.parse(JSON.stringify(o));a["@id"]=e,a.title=t,a.timestamp=(new Date).toISOString();const c=new Promise(e=>{const t=new FileReader;t.addEventListener("load",()=>{e(t.result)}),t.readAsDataURL(n)}),l=new Promise(e=>{const t=new FileReader;t.addEventListener("load",()=>{e(t.result)}),t.readAsDataURL(r)}),d=await c,u=await l;a.image=u,a.mei_annotations=[{id:(0,i.v4)(),type:"Annotation",body:d,target:u}],s(a)})},t.addDocument=function(e,n,i,r){return new Promise((o,s)=>{t.db.put({_id:e,name:n,type:r?"page":"manuscript",_attachments:{manifest:{content_type:"application/ld+json",data:i}}}).then(()=>{o(!0)}).catch(t=>{window.alert(`Error Uploading Document: ${t.message}, title: ${n}, id: ${e}.`),s(!1)})})},t.deleteDocument=function(e){return new Promise((n,i)=>{t.db.get(e).then(e=>{t.db.remove(e).then(e=>{n(!0)}).catch(e=>{console.log(e),i(e)})}).catch(e=>{console.log(e),i(e)})})},t.updateDocName=function(e,n){return new Promise((i,r)=>{t.db.get(e).then(o=>{t.db.getAttachment(e,"manifest").then(e=>{e.text().then(e=>{const s=JSON.parse(e);o.name=n,s.title=n;const a=new Blob([JSON.stringify(s,null,2)],{type:"application/ld+json"});o._attachments.manifest={content_type:"application/ld+json",data:a},t.db.put(o).then(()=>i(!0)).catch(e=>r(e))}).catch(e=>r(e))}).catch(e=>r(e))}).catch(e=>r(e))})}},,,,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.loadDashboard=t.updateDashboard=void 0;const i=n(25),r=n(46),o=n(25),s=n(94),a=n(95),c=n(98),l=n(13),d=document.querySelector("#fs-content-container"),u=document.querySelector("#main-section-content"),f=document.querySelector("#open-doc"),m=document.querySelector("#remove-doc"),p=document.querySelector("#nav-path-container");let h=document.querySelector("#fs-back-btn"),g=document.querySelector("#fs-empty-btn"),v=document.querySelector("#fs-delete-btn");const y=document.querySelector("#upload-new-doc-button"),b=document.querySelector("#add-folder-button"),_=new s.ShiftSelectionManager,w=(0,o.FileSystemManager)(),E=(0,s.dashboardState)(),S=document.querySelector(".main-section-content"),k=document.querySelector(".right-click-file-menu"),L=document.querySelector(".context-menu-items-wrapper");let A=!1,x=!1,C=null,N=!1;function O(){y.classList.contains("active")&&(0,a.InitUploadArea)(E.getParentFolder())}function T(e,t){const n=(i=t?{manifest:e}:{storage:e},Object.keys(i).map(e=>encodeURIComponent(e)+"="+encodeURIComponent(i[e])).join("&"));var i;window.open("./editor.html?"+n,"_blank")}function q(e){const t=E.getEntries().at(e);E.setSelection(e,!0);document.getElementById(t.id).classList.add("selected")}function I(e){const t=E.getEntries().at(e).id;E.setSelection(e,!1);document.getElementById(t).classList.remove("selected")}function B(){Array.from(document.querySelectorAll(".document-entry.selected")).forEach(e=>e.classList.remove("selected")),E.resetSelection()}async function M(e,t,n){if("folder"===t.type){n.addEventListener("dblclick",(async function(){return await z([...E.getFolderPath(),t])}),!1)}else n.addEventListener("dblclick",F,!1);!function(e,t){e.addEventListener("click",(function(e){P(t)}),!1)}(n,e),function(e,t){e.addEventListener("contextmenu",e=>{e.stopPropagation(),e.preventDefault(),(N||1===E.getSelectedEntries().length)&&B(),q(t),ne("selection-options",e.clientX,e.clientY),k.classList.remove("hidden"),N=!0}),S.addEventListener("click",e=>{if(N){let t=e.target;if(t.parentElement.classList.contains("document-entry")&&(t=t.parentElement),k.classList.add("hidden"),N=!1,t.classList.contains("document-entry")){const e=W(t.id);P(E.getIndexByEntryName(e.name))}else B()}})}(n,e)}function P(e){A||x?A?E.getSelection()[e]?(I(e),_.setStart(E.getSelection().lastIndexOf(!0))):(q(e),_.setStart(e)):x&&(_.getPrevSelection().forEach(e=>{I(e)}),_.setEnd(e),_.getSelection(E.getSelection()).forEach(e=>{q(e)})):(B(),q(e),_.setStart(e)),U(),V()}function F(){if(f.classList.contains("active"))if(1!==E.getSelectedFolders().length&&1!==E.getSelectedTrash().length)E.getSelectedFiles().forEach(e=>function(e){const t=e.metadata.document;if(void 0!==typeof t){const n="sample"===t;T(e.id,n)}}(e)),_.reset(),B(),U();else{z([...E.getFolderPath(),E.getSelectedEntries()[0]])}}function j(){if(!m.classList.contains("active"))return;const e=E.getSelectedEntries(),t=E.getParentFolder(),n=E.getTrashFolder(),r=(new Date).toLocaleString();for(let t of e)t=i.FileSystemTools.addMetadata(t,{removed_on:r,recover_folder:E.getFolderPathNames()});K(e,t,n)}function D(e,t){return new Promise((n,o)=>{(0,r.deleteDocument)(e.id).then(()=>{i.FileSystemTools.removeEntry(e,t),n(!0)}).catch(()=>o(!1))})}function R(e,t){return new Promise(n=>{const r=e.children.map(t=>"file"===t.type?D(t,e):"folder"===t.type?R(t,e):Promise.resolve(!1));Promise.all(r).then(()=>{i.FileSystemTools.removeEntry(e,t),n(!0)}).catch(()=>n(!1))})}function H(){const e=E.getSelectedEntries(),t=`Are you sure you want to delete:\n${n=e,n.map(e=>`- ${e.name} (${e.type})`).join("\n")}\nThis action is irreversible.`;var n;if(window.confirm(t)){const t=e.map(e=>"file"===e.type?D(e,E.getParentFolder()):"folder"===e.type?R(e,E.getParentFolder()):void 0);Promise.all(t).then(()=>{z(E.getFolderPath())}).catch(e=>console.debug("failed to delete files: ",e))}}function $(){const e=E.getTrashFolder();if(!e)return void console.error("Trash folder not found.");if(window.confirm("Are you sure you want to delete all the files in Trash Folder?\nThis action is irreversible.")){const t=e.children.map(t=>"file"===t.type?D(t,e):"folder"===t.type?R(t,e):Promise.resolve(!1));Promise.all(t).then(()=>{z(E.getFolderPath())}).catch(e=>console.debug("failed to delete files: ",e))}}function U(){E.getParentFolder().metadata.immutable||E.getSelectedEntries()[0]&&E.getSelectedEntries()[0].metadata.immutable?(y.classList.remove("active"),b.classList.remove("active"),m.classList.remove("active"),E.getSelectedEntries().length?f.classList.add("active"):f.classList.remove("active")):E.isInTrash()?(y.classList.remove("active"),b.classList.remove("active"),m.classList.remove("active"),f.classList.remove("active")):E.getSelectedTrash().length?(f.classList.add("active"),m.classList.remove("active"),y.classList.remove("active"),b.classList.remove("active")):E.getSelectedEntries().length?(f.classList.add("active"),m.classList.add("active"),y.classList.remove("active"),b.classList.remove("active")):(f.classList.remove("active"),m.classList.remove("active"),y.classList.add("active"),b.classList.add("active"))}function V(){!function(){const e=h.cloneNode(!0);h.parentNode.replaceChild(e,h),1===E.getFolderPath().length?(e.classList.remove("active"),e.setAttribute("disabled","true")):(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",G),e.addEventListener("ondragenter",()=>e.classList.add("active")),e.addEventListener("ondragleave",()=>e.classList.remove("active")),J(e,E.getParentFolder(),E.getFolderPath().at(-2))),h=e}(),function(){const e=g.cloneNode(!0);g.parentNode.replaceChild(e,g);const t=E.getParentFolder();"trash"===t.type||E.isInTrash()?(e.style.display="",t.children.length&&!E.getSelectedEntries().length&&"trash"===t.type?(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",$)):(e.classList.remove("active"),e.setAttribute("disabled","true"))):e.style.display="none",g=e}(),function(){const e=v.cloneNode(!0);v.parentNode.replaceChild(e,v),"trash"===E.getParentFolder().type||E.isInTrash()?(e.style.display="",E.getSelectedEntries().length?(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",H)):(e.classList.remove("active"),e.setAttribute("disabled","true"))):e.style.display="none",v=e}()}async function G(){const e=E.getFolderPath().slice(0,-1);await z(e)}function W(e){return E.getEntries().find(t=>t.id===e)}async function z(e){e||(e=E.getFolderPath()),E.setFolderPath(e);const t=E.getParentFolder();d.innerHTML="",_.reset(),E.setEntries(t.children),t.children.forEach(async(e,t)=>{const n=function(e){const t=document.createElement("div");t.classList.add("document-entry"),t.setAttribute("draggable","true");const n=document.createElement("img");n.classList.add("document-icon");const i=document.createElement("div");switch(i.innerText=e.name,e.type){case"folder":t.classList.add("folder-entry"),t.setAttribute("id",e.id),n.src="./Neon-gh/assets/img/folder-icon.svg",t.setAttribute("drop-id",e.id),t.classList.add("drop-target");break;case"trash":t.classList.add("folder-entry"),t.setAttribute("id",e.id),n.src="./Neon-gh/assets/img/trash-icon.svg",t.setAttribute("drop-id",e.id),t.classList.add("drop-target");break;case"file":t.classList.add("file-entry"),t.setAttribute("id",e.id),"manuscript"===e.metadata.type?(t.classList.add("manuscript-entry"),n.src="./Neon-gh/assets/img/manuscript-icon.svg"):"folio"===e.metadata.type?(t.classList.add("folio-entry"),n.src="./Neon-gh/assets/img/folio-icon.svg"):n.src="./Neon-gh/assets/img/folio-icon.svg"}return t.appendChild(n),t.appendChild(i),t}(e);d.appendChild(n),await M(t,e,n)}),U(),function(){p.innerHTML="";const e=E.getFolderPath().map((e,t)=>{const n=document.createElement("div");n.classList.add("nav-path-section"),n.innerHTML=e.name;const i=E.getFolderPath().slice(0,t+1);return n.addEventListener("click",async()=>await z(i)),J(n,E.getParentFolder(),i.at(-1)),n});e.forEach((t,n)=>{if(p.appendChild(t),n!==e.length-1){const e=document.createElement("div");e.classList.add("nav-path-seperator"),e.innerHTML=" / ",p.appendChild(e)}})}(),V();const n=document.getElementById("info-badge");E.isInTrash()?(n.textContent="Files will be deleted after 30 days",n.style.background="#9DB2BF"):(n.textContent="",n.style.background=""),t.children.forEach(e=>{const n=document.getElementById(e.id);n.addEventListener("dragstart",e=>{e.dataTransfer.effectAllowed="move",C=e.target}),"folder"!==e.type&&"trash"!==e.type||J(n,t,e)}),w.setFileSystem(E.getFolderPath().at(0))}function J(e,t,n){e.addEventListener("dragenter",t=>{t.preventDefault(),e.classList.add("dragenter")}),e.addEventListener("dragleave",t=>{t.preventDefault(),e.classList.remove("dragenter")}),e.addEventListener("dragover",e=>e.preventDefault()),e.addEventListener("drop",function(e,t){return n=>{n.preventDefault();const i=W(C.getAttribute("id"));i&&i!==t&&K([i],e,t)}}(t,n))}function K(e,t,n){const r=[];e.forEach(e=>{"trash"===n.type&&n.children.some(t=>t.name===e.name)&&(e.name=function(e){const t=(new Date).toLocaleString();return e+" - "+t}(e.name));const o=i.FileSystemTools.canMoveEntry(e,t,n);o.succeeded?i.FileSystemTools.moveEntry(e,t,n):r.push(o.error)}),r.filter((e,t,n)=>n.indexOf(e)===t),r.length>0&&window.alert(r.join("\n")),z()}function X(){const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.MOVE_TO),e.openModalWindow();const t=E.getSelectedEntries(),n=E.getParentFolder(),i=function(e){const t=document.createElement("ul");return t.id="tree-root",t.appendChild(function e(t,n,i){const r=document.createElement("li"),o=document.createElement("div");o.classList.add("tree-li-container");const s=document.createElement("div");s.classList.add("tree-name"),s.innerHTML=t.name,s.addEventListener("click",()=>{document.querySelectorAll(".tree-name").forEach(e=>e.classList.remove("selected")),s.classList.add("selected")}),s.addEventListener("dblclick",()=>{n(t)});if(t.children.every(e=>"folder"!==e.type))return r.appendChild(o),o.appendChild(s),r;const a=document.createElement("ul"),c=document.createElement("div");c.classList.add("tree-arrow"),c.innerHTML="▶",i<2&&a.classList.add("active");i<2&&c.classList.add("active");return c.addEventListener("click",()=>{c.classList.toggle("active"),a.classList.toggle("active")}),r.appendChild(o),o.appendChild(c),o.appendChild(s),r.appendChild(a),t.children.forEach(t=>{if("folder"===t.type){const r=e(t,n,i+1);a.appendChild(r)}}),r}(E.root(),e,0)),t}(i=>{e.hideModalWindow(),K(t,n,i)}),r=document.createElement("div");r.classList.add("tree-container"),r.appendChild(i);const o=document.getElementById("neon-modal-window-content-container");o.innerHTML='',o.appendChild(r)}function Y(){if(!b.classList.contains("active"))return;const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.NEW_FOLDER),e.openModalWindow();const t=document.getElementById("dashboard_input_container"),n=document.getElementById("cancel_dashboard"),i=document.getElementById("confirm_dashboard"),r=document.createElement("input");r.id="dashboard_input",r.type="text",r.placeholder="Untitled Folder",r.value="Untitled Folder",t.appendChild(r),r.select(),r.focus(),n.addEventListener("click",()=>e.hideModalWindow()),i.addEventListener("click",()=>Q(e,r.value)),t.addEventListener("keydown",t=>{"Escape"===t.key?e.hideModalWindow():"Enter"===t.key&&Q(e,r.value)})}function Q(e,t){te(t)?(window.alert("The folder name already exists in the current folder!"),Y()):(e.hideModalWindow(),function(e){const t=document.createElement("div");t.classList.add("document-entry"),t.classList.add("folder-entry"),t.setAttribute("id","new-folder");const n=i.FileSystemTools.createFolder(e);i.FileSystemTools.addEntry(n,E.getParentFolder())?(t.setAttribute("id",e),z()):t.remove()}(t))}function Z(){const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.RENAME),e.openModalWindow();const t=document.getElementById("dashboard_input_container"),n=document.getElementById("cancel_dashboard"),i=document.getElementById("confirm_dashboard"),r=document.createElement("input");r.id="dashboard_input",r.type="text";const o=E.getSelectedEntries()[0].name;r.placeholder=o,r.value=o,t.appendChild(r),r.select(),r.focus(),n.addEventListener("click",()=>e.hideModalWindow()),i.addEventListener("click",()=>ee(e,r.value,o)),t.addEventListener("keydown",t=>{"Escape"===t.key?e.hideModalWindow():"Enter"===t.key&&ee(e,r.value,o)})}function ee(e,t,n){if(t===n)e.hideModalWindow();else if(te(t))window.alert("The filename already exists in the current folder!"),Z();else{e.hideModalWindow();!function(e,t){if(i.FileSystemTools.renameEntry(e,E.getParentFolder(),t))if("file"===e.type){const n=e;(0,r.updateDocName)(n.id,t).then(()=>{z()})}else z()}(E.getSelectedEntries()[0],t)}}function te(e){return E.getParentFolder().children.some(t=>t.name===e)}function ne(e,t,n){switch(e){case"selection-options":const e=E.getSelectedFiles().length,t=E.getSelectedFolders().length,n=E.getSelectedTrash().length;e||t||!n?E.getFolderPath().length>1&&"Trash"==E.getFolderPath().at(1).name?(L.innerHTML=c.trashEntryOptions,ie("trash-entry-options")):1!==e||t||n?e>1&&!t&&!n?(L.innerHTML=c.multiFileOptions,ie("multi-file-options")):e>=1&&t>=1&&!n?(L.innerHTML=c.folderAndFileOptions,ie("folder-and-file-options")):e||1!==t||n?!e&&t>1&&!n&&(L.innerHTML=c.multiFolderOptions,ie("multi-folder-options")):(L.innerHTML=c.singleFolderOptions,ie("single-folder-options")):(L.innerHTML=c.singleFileOptions,ie("single-file-options")):(L.innerHTML=c.trashFolderOptions,ie("trash-folder-options"));break;default:L.innerHTML=c.defaultOptions,ie("default")}if(E.getParentFolder().metadata.immutable||E.getSelectedEntries()[0]&&E.getSelectedEntries()[0].metadata.immutable||E.isInTrash()){const e=document.getElementById("cm-remove-btn"),t=document.getElementById("cm-rename-btn"),n=document.getElementById("cm-move-btn"),i=document.getElementById("cm-upload-doc-btn"),r=document.getElementById("cm-new-folder-btn");e&&e.classList.add("disabled"),t&&t.classList.add("disabled"),n&&n.classList.add("disabled"),i&&i.classList.add("disabled"),r&&r.classList.add("disabled")}k.style.left=t+"px",k.style.top=n+"px",k.classList.remove("hidden")}function ie(e){const t="context-menu-item-wrapper";switch(e){case"single-file-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),j()}),document.querySelector(`.${t}#cm-rename-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Z()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"multi-file-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),j()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"folder-and-file-options":document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),j()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"single-folder-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),j()}),document.querySelector(`.${t}#cm-rename-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Z()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"multi-folder-options":document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),j()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"trash-folder-options":document.querySelector(`.${t}#cm-empty-trash-btn`).addEventListener("click",e=>{k.classList.add("hidden"),$()});break;case"trash-entry-options":document.querySelector(`.${t}#cm-recover-btn`).addEventListener("click",e=>{k.classList.add("hidden"),function(){const e=E.getSelectedEntries(),t=E.getParentFolder();for(let n of e){const e=n.metadata.recover_folder,r=E.getFolderPathByNames(e);if(r){n=i.FileSystemTools.removeMetadata(n,["removed_on","recover_folder"]);const e=/ - \d{1,2}\/\d{1,2}\/\d{4}, \d{1,2}:\d{2}:\d{2} [APMapm]{2}$/;e.test(n.name)&&(n.name=n.name.replace(e,"")),K([n],t,r)}}}()}),document.querySelector(`.${t}#cm-delete-btn`).addEventListener("click",e=>{k.classList.add("hidden"),H()});break;default:document.querySelector(`.${t}#cm-upload-doc-btn`).addEventListener("click",e=>{k.classList.add("hidden"),O()}),document.querySelector(`.${t}#cm-new-folder-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Y()})}}function re(e){E.getTrashFolder()||w.newTrash(e);const t=E.getTrashFolder(),n=new Date,i=new Date(n.getTime()-2592e6);t.children.forEach(e=>{(e=>{if(e.metadata&&e.metadata.removed_on){return new Date(e.metadata.removed_on)<=i}return!1})(e)&&("file"===e.type?D(e,t):"folder"===e.type&&R(e,t))})}null==f||f.addEventListener("click",F),null==m||m.addEventListener("click",j),null==y||y.addEventListener("click",O),null==b||b.addEventListener("click",Y),window.addEventListener("keydown",e=>{e.metaKey&&(A=!0),e.shiftKey&&(x=!0),"Escape"===e.key&&(B(),_.reset(),U(),V())}),window.addEventListener("keyup",e=>{e.metaKey||(A=!1),e.shiftKey||(x=!1)}),null==u||u.addEventListener("click",e=>{const t=e.target;Boolean(t.closest(".document-entry"))||(B(),_.reset(),U(),V())}),t.updateDashboard=z;t.loadDashboard=async()=>{const e=await w.getRoot();E.root(e),re(e),z([e]),document.querySelector(".main-section").addEventListener("contextmenu",e=>{e.preventDefault(),B(),ne("default",e.clientX,e.clientY)}),document.querySelector(".main-section").addEventListener("click",e=>{k.classList.add("hidden")})}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){"use strict";var i;Object.defineProperty(t,"__esModule",{value:!0});(0,n(56).loadDashboard)(),null===(i=document.querySelector("#home-link"))||void 0===i||i.setAttribute("href","https://ddmal.music.mcgill.ca/Neon")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EntryType=void 0,function(e){e.Folder="folder",e.Trash="trash",e.File="file"}(t.EntryType||(t.EntryType={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemTools=void 0;const i=n(25),r=n(17),o=(e,t,n,r)=>{const o={};return t===i.EntryType.File?{name:e,type:t,id:n,metadata:o}:{name:e,type:t,id:n,children:r,metadata:o}};const s=(e,t)=>{const n=t.children.some(t=>t.name===e.name),i=t.metadata.immutable,r={succeeded:!1,error:""};return n?r.error=`Duplicate name: ${e.name} already exists in ${t.name}.`:i?r.error=t.name+" is immutable.":r.succeeded=!0,r},a=(e,t)=>{const n=-1!==t.children.findIndex(t=>t.id===e.id),i=t.metadata.immutable,r=e.metadata.immutable,o={succeeded:!1,error:""};return n?i?o.error=t.name+" is immutable.":r?o.error=e.name+" is immutable.":o.succeeded=!0:o.error=`${e.name} does not exist in ${t.name}.`,o},c=(e,t,n)=>{const r=e===n,o=n.children.some(t=>t.name===e.name),s=t.metadata.immutable,a=n.metadata.immutable,c=-1!==t.children.findIndex(t=>t.id===e.id),l=e.type==i.EntryType.Folder&&function e(t,n){return n.children.filter(e=>e.type===i.EntryType.Folder).map(n=>n===t||e(t,n)).some(e=>!0===e)}(n,e),d={succeeded:!1,error:""};return r?d.error=`Cannot move ${e.name} to itself.`:o?d.error=`Duplicate name: ${e.name} already exists in ${n.name}.`:s?d.error=t.name+" is immutable.":a?d.error=n.name+" is immutable.":c?l?d.error=`Cannot move ${e.name} into a its own subfolder, ${n.name}.`:d.succeeded=!0:d.error=`${e.name} does not exist in ${t.name}.`,d},l=(e,t,n)=>{const i={succeeded:!1,error:""};return t.children.some((t,n,i)=>t.name===e.name&&n!==i.indexOf(t))?i.error=`Duplicate name: ${n} already exists in ${t.name}.`:i.succeeded=!0,i},d=(e,t)=>{const{succeeded:n,error:r}=s(e,t);return n?(t.children.push(e),(o=t).children.sort((e,t)=>e.name.localeCompare(t.name)),o.children.sort((e,t)=>e.type===i.EntryType.File&&t.type===i.EntryType.Folder?1:e.type===i.EntryType.Folder&&t.type===i.EntryType.File?-1:0),!0):(console.error(r),!1);var o},u=(e,t,n=!1)=>{const{succeeded:i,error:r}=a(e,t);if(i||n){const n=t.children.indexOf(e);return t.children.splice(n,1),!0}return console.error(r),!1};t.FileSystemTools={createFolder:e=>o(e,i.EntryType.Folder,(0,r.uuidv4)(),[]),createTrash:e=>o(e,i.EntryType.Trash,(0,r.uuidv4)(),[]),createFile:(e,t)=>o(e,i.EntryType.File,t),moveEntry:function(e,t,n){const i=c(e,t,n);if(i.succeeded){if(u(e,t,!0)){if(d(e,n))return!0;console.error(`Moving: failed to add ${e.name} to ${n.name}`)}else console.error(`Moving: failed to remove ${e.name} from ${t.name}`)}else console.error(i.error);return!1},canAddEntry:s,canRemoveEntry:a,canMoveEntry:c,canRenameEntry:l,addEntry:d,removeEntry:u,addMetadata:function(e,t){return Object.entries(t).forEach(([t,n])=>{e.metadata[t]=n}),e},removeMetadata:function(e,t){return t.forEach(t=>{delete e.metadata[t]}),e},getAllNames:e=>e.children.map(e=>e.name),renameEntry:(e,t,n)=>{const{succeeded:i,error:r}=l(e,t,n);return i?(e.name=n,!0):(console.error(r),!1)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemManager=void 0;const i=n(25),r=n(46),o=n(93);t.FileSystemManager=()=>{function e(e){try{window.localStorage.setItem("neon-fs",JSON.stringify(e))}catch(e){return console.error(e),window.alert("Error saving file system"),!1}return!0}async function t(){try{const t=window.localStorage.getItem("neon-fs");if(t){return JSON.parse(t)}{const t=i.FileSystemTools.createFolder("Home");return function(e){const t=o.samples.map(([e,t])=>{const n=i.FileSystemTools.createFile(e,e);return"folio"===t?i.FileSystemTools.addMetadata(n,{type:"folio",document:"sample",immutable:!0}):"manuscript"===t&&i.FileSystemTools.addMetadata(n,{type:"manuscript",document:"sample",immutable:!0}),n}),n=i.FileSystemTools.createFolder("Samples");t.forEach(e=>{i.FileSystemTools.addEntry(e,n)}),i.FileSystemTools.addEntry(n,e),i.FileSystemTools.addMetadata(n,{immutable:!0})}(t),n(t),await async function(e){const t=await(0,r.fetchUploads)();return t.map(e=>i.FileSystemTools.createFile(e.name,e.id)).forEach(t=>{i.FileSystemTools.addEntry(t,e)}),e}(t),e(t),t}}catch(e){console.error(e),window.alert("Error loading file system")}}function n(e){const t=i.FileSystemTools.createTrash("Trash");i.FileSystemTools.addEntry(t,e)}return{getRoot:async function(){return await t()},setFileSystem:e,getFileSystem:t,newTrash:n}}},function(e){e.exports=JSON.parse('{"@context":["http://www.w3.org/ns/anno.jsonld",{"schema":"http://schema.org/","title":"schema:name","timestamp":"schema:dateModified","image":{"@id":"schema:image","@type":"@id"},"mei_annotations":{"@id":"Annotation","@type":"@id","@container":"@list"}}]}')},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.samples=void 0,t.samples=[["CDN-Hsmu_M2149.L4_001r","folio"],["CDN-Hsmu_M2149.L4_002r","folio"],["CH-E_611_024r","folio"],["CH-E_611_026r","folio"],["CH-E_611_028r","folio"],["Salzinnes","manuscript"]]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dashboardState=t.ShiftSelectionManager=void 0;t.ShiftSelectionManager=class{constructor(){this.prevSelection=[],this.reset()}setStart(e){this.reset(),this.start=Math.max(e,0)}setEnd(e){this.end=e}reset(){this.start=0,this.end=-1,this.prevSelection.splice(0)}getPrevSelection(){return this.prevSelection}getSelection(e){let t,n;if(-1===this.end)return[];this.endn+t).filter(t=>!e[t]);return this.prevSelection=i,i}},t.dashboardState=function(){let e=[],t=[],n=[],i=null;function r(e){return e&&(i=e),i}function o(){return e.filter((e,n)=>t[n])}return{root:r,setEntries:function(n){e=n,t=Array(n.length).fill(!1)},getEntries:function(){return e},getIndexByEntryName:function(t){return e.findIndex(e=>e.name===t)},setSelection:function(e,n){t[e]=n},getSelection:function(){return t},resetSelection:function(){t.fill(!1)},setFolderPath:function(e){n=e},getFolderPath:function(){return n},getFolderPathNames:function(){return n.map(e=>e.name)},getFolderPathByNames:function(e){let t=r();e=e.slice(1);for(const n of e){const e=t.children.find(e=>e.name===n);if(!e||"folder"!==e.type)return void console.debug("failed to find folder: ",n);t=e}return t},getParentFolder:function(){return n.at(-1)},getTrashFolder:function(){return r().children.filter(e=>"trash"===e.type)[0]},getSelectedEntries:o,getSelectedFolders:function(){return o().filter(e=>"folder"===e.type)},getSelectedTrash:function(){return o().filter(e=>"trash"===e.type)},getSelectedFiles:function(){return o().filter(e=>"file"===e.type)},isInTrash:function(){return n.some(e=>"trash"===e.type)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InitUploadArea=void 0;const i=n(13),r=n(96),o=n(56);t.InitUploadArea=function(e){const t=new i.ModalWindow;t.setModalWindowView(i.ModalWindowView.DOCUMENT_UPLOAD),t.openModalWindow();const n=document.querySelector("#make_pair"),s=document.querySelector("#upload_button");n.addEventListener("click",r.handleMakePair),s.addEventListener("click",()=>async function(e,t){const n=document.querySelector("#uploading_spinner");n.classList.add("visible"),(0,r.handleUploadAllDocuments)(t).then(t=>{setTimeout(async()=>{await(0,o.updateDashboard)(),n.classList.remove("visible"),e.hideModalWindow();const i=t.filter(e=>"fulfilled"===e.status&&e.value).map(e=>e.value);if(i.length>0){const e=document.getElementById("info-badge");e.textContent="Uploaded files: "+i.join(", "),e.style.display="block",e.style.background="#9DB2BF"}},2e3)}).catch(t=>{console.log("One or more uploads rejected: ",t),setTimeout(async()=>{await(0,o.updateDashboard)(),n.classList.remove("visible"),e.hideModalWindow()},2e3)})}(t,e));const a=document.createElement("input");a.type="file",a.multiple=!0,a.addEventListener("change",(function(){const e=a.files,t=Array.from(e),n=(0,r.addNewFiles)(t);if(0!==n.length){const e=n.map(e=>e.name);window.alert("The following files are not .mei, .png, .jpeg, or .jsonld files: \n\n"+e.join("\n"))}a.value=null}));const c=document.querySelector("#initial_upload_area");c.onclick=()=>a.click(),c.ondragleave=()=>c.classList.remove("over"),c.ondragover=e=>{e.stopPropagation(),e.preventDefault(),c.classList.add("over"),e.dataTransfer.dropEffect="copy"},c.ondrop=e=>{e.stopPropagation(),e.preventDefault(),c.classList.remove("over");const t=e.dataTransfer.files,n=Array.from(t),i=(0,r.addNewFiles)(n);if(0!==i.length){const e=i.map(e=>e.name);window.alert("The following files are not .mei, .png, .jpeg, or .jsonld files: \n\n"+e.join("\n"))}},document.querySelectorAll(".sort_name").forEach(e=>{e.addEventListener("click",()=>(0,r.sortFileByName)(e))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.fnConflictHandler=t.formatFilename=t.sortFileByName=t.handleUploadAllDocuments=t.handleMakePair=t.addNewFiles=void 0;const i=n(30),r=n(97),o=n(46),s=n(25),a=r.default.getInstance();function c(e,t){if("mei"!==t&&"image"!==t)return;const n="mei"===t?"mei_radio_group":"image_radio_group",r=(0,i.v4)(),o=document.createElement("div");o.className="unpaired_item_container";const s=document.createElement("input");s.type="radio",s.className="unpaired_item_radio",s.name=n,s.value=e,s.id=r;const a=document.createElement("label");a.className="unpaired_item_label",a.setAttribute("for",r);const c=document.createElement("span");c.innerText=l(e,50),c.setAttribute("style","margin-top: auto; margin-left: 3px;");const d=document.createElement("img");return d.className="unpaired_del_btn",d.src="/Neon/Neon-gh/assets/img/unpaired-remove-doc.svg",d.title="delete",a.appendChild(s),a.appendChild(c),o.appendChild(a),o.appendChild(d),d.addEventListener("click",(function(){o.remove()})),o}function l(e,t){const n=Math.floor(t/2),i=e.length;return i<=t?e:`${e.substring(0,n-1)}...${e.substring(i-n+2,i)}`}function d(e,t){let n=e,i=1;for(;t.includes(n);)n=`${e}(${i})`,i++;return n}a.setMeiTemplate("samples/mei/mei_template.mei"),t.addNewFiles=function(e){const t=document.querySelector("#mei_list"),n=document.querySelector("#image_list"),i=[];return e.forEach(e=>{const r=e.name.split(".").pop();if("mei"===r){const n=c(e.name,"mei");t.appendChild(n),a.addFile(e)}else if(["png","jpg","jpeg"].includes(r)){const t=c(e.name,"image");n.appendChild(t),a.addFile(e)}else"jsonld"===r||i.push(e)}),i},t.handleMakePair=function(){const e=document.querySelector("#paired_list"),t=document.querySelector('input[name="mei_radio_group"]:checked'),n=document.querySelector('input[name="image_radio_group"]:checked');if(null===t||null===n)return;let i=t.value;const r=n.value;let o=!1;if("create_mei"===t.value){o=!0;const e=r.split(".");e.length>1&&e.pop(),e.push("mei"),i=e.join("."),a.getImgDimension(r).then(e=>{const{width:t,height:n,staffSpace:r}=e,o=a.createMeiFile(i,t,n,r);a.addFile(o)}).catch(e=>{console.error(e.message)})}const s=i.substring(0,i.length-4),d=function(e,t,n){const i=document.querySelector("#mei_list"),r=document.querySelector("#image_list"),o=document.createElement("div");o.className="folio_item",o.setAttribute("mei",t),o.setAttribute("image",n);const s=document.createElement("div");function d(){o.remove();const s=a.isCreatedFolio(e);if(a.removeFolio(e),!s){const e=c(t,"mei");i.appendChild(e)}const l=c(n,"image");r.appendChild(l)}s.classList.add("folio-filename"),s.innerHTML=l(e,50),o.appendChild(s);const u=document.createElement("img");return u.className="unpair_btn",u.src="/Neon/Neon-gh/assets/img/unpair-doc.svg",u.title="unpair",u.addEventListener("click",d),o.appendChild(u),o}(s,i,r);e.appendChild(d),a.addFolio(s,i,r,o),o||t.parentElement.parentElement.remove(),n.parentElement.parentElement.remove()},t.handleUploadAllDocuments=async function(e){const t=[...a.getFolios().map(async([t,n,r])=>{const a=(0,i.v4)();return await async function(e,t,n,i,r){const a=d(t,s.FileSystemTools.getAllNames(r));return(0,o.createManifest)(e,a,n,i).then(t=>{const n=new Blob([JSON.stringify(t,null,2)],{type:"application/ld+json"});return(0,o.addDocument)(e,a,n,!0)}).then(n=>{if(n){const t=(new Date).toLocaleString(),n=s.FileSystemTools.createFile(a,e),i=s.FileSystemTools.addMetadata(n,{type:"folio",created_on:t});return s.FileSystemTools.addEntry(i,r)?a:null}return console.log("failed to uploadFolio: "+t),null})}(a,t,n,r,e)})].map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e})));return a.clear(),Promise.all(t)},t.sortFileByName=async function(e){const t=e.parentElement.nextElementSibling,n=Array.from(t.children);let i=e.classList.contains("arrow-up");i?(e.classList.remove("arrow-up"),e.classList.add("arrow-down"),e.innerHTML="⋁"):(e.classList.remove("arrow-down"),e.classList.add("arrow-up"),e.innerHTML="⋀"),i=!i,n.sort((e,t)=>{const n=e.textContent.trim(),r=t.textContent.trim();return i?n.localeCompare(r):r.localeCompare(n)}),n.forEach(e=>{t.appendChild(e)}),e.setAttribute("style","color: black")},t.formatFilename=l,t.fnConflictHandler=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const i=n(17),r=n(32);class o{constructor(){this.allFiles=new Map,this.folios=new Array}static getInstance(){return o.instance||(o.instance=new o),o.instance}addFile(e){if(this.allFiles.has(e.name)){const t={file:e,count:this.getFileCount(e.name)+1};this.allFiles.set(e.name,t)}else{const t={file:e,count:1};this.allFiles.set(e.name,t)}}async setMeiTemplate(e){try{const t=await fetch(e);if(!t.ok)throw new Error("Failed to load MEI template from "+e);this.meiTemplate=await t.text()}catch(e){console.error(e)}}createMeiFile(e,t,n,o){try{if(!this.meiTemplate)throw new Error("Cannot find MEI template");const s=new DOMParser,a=new XMLSerializer,c=s.parseFromString(this.meiTemplate,"text/xml"),l=c.documentElement;l.querySelector("meiHead").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("fileDesc").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("titleStmt").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("title").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("pubStmt").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("facsimile").setAttribute("xml:id","m-"+(0,i.uuidv4)());const d=l.querySelector("surface"),u="m-"+(0,i.uuidv4)();d.setAttribute("xml:id",u),d.setAttribute("lrx",t.toString()),d.setAttribute("lry",n.toString());const f=l.querySelector("zone"),m="m-"+(0,i.uuidv4)();f.setAttribute("xml:id",m);const p=.1,h=.15,g=Math.round(p*t),v=Math.round(h*t);f.setAttribute("ulx",v.toString()),f.setAttribute("uly",g.toString()),f.setAttribute("lrx",(t-v).toString()),f.setAttribute("lry",(g+3*o).toString());l.querySelector("mdiv").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("score").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("scoreDef").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("staffGrp").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("staffDef").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("section").setAttribute("xml:id","m-"+(0,i.uuidv4)());const y=l.querySelector("pb");y.setAttribute("xml:id","m-"+(0,i.uuidv4)()),y.setAttribute("facs","#"+u);const b=l.querySelector("sb");b.setAttribute("xml:id","m-"+(0,i.uuidv4)()),b.setAttribute("facs","#"+m);const _=r.xml(a.serializeToString(c)),w=new Blob([_],{type:"text/xml"});return new File([w],e,{type:"text/xml"})}catch(e){console.error(e)}}getImgDimension(e){return new Promise((t,n)=>{const i=this.getFile(e);if(!i)return void n(new Error("File not found: "+e));const r=new FileReader;r.onload=i=>{const r=new Image;r.onload=()=>{const e=document.createElement("canvas"),i=e.getContext("2d",{willReadFrequently:!0});if(!i)return void n(new Error("Could not get 2D context"));e.width=r.width,e.height=r.height,i.drawImage(r,0,0);const o=i.getImageData(0,0,e.width,e.height),s=o.data;for(let e=0;e0?(a.push(c),c=0):c++}const l=a.length>0?this.findSecondMode(a):0;t({width:r.width,height:r.height,staffSpace:l})},r.onerror=()=>{n(new Error("Failed to load image: "+e))},r.src=i.target.result},r.readAsDataURL(i)})}findSecondMode(e){const t=new Map;e.forEach(e=>{const n=(t.get(e)||0)+1;t.set(e,n)});return Array.from(t.entries()).sort((e,t)=>t[1]-e[1])[1][0]}getFile(e){if(this.allFiles.has(e))return this.allFiles.get(e).file}removeFile(e){const t=this.getFileCount(e);if(0!==t)if(1===t)this.allFiles.delete(e);else{const n={file:this.allFiles.get(e).file,count:t-1};this.allFiles.set(e,n)}}getFileCount(e){return this.allFiles.has(e)?this.allFiles.get(e).count:0}addFolio(e,t,n,i){const r={filename:e,mei_filename:t,image_filename:n,isCreated:i};this.folios.push(r)}isCreatedFolio(e){const t=this.folios.find(t=>t.filename===e);return!!t&&t.isCreated}removeFolio(e){const t=this.folios.findIndex(t=>t.filename===e);this.folios.splice(t,1)}getFolios(){return this.folios.map(e=>{const t=e.filename,n=e.mei_filename,i=e.image_filename;return[t,this.getFile(n),this.getFile(i)]})}clear(){this.allFiles.clear(),this.folios.splice(0)}print(){console.log(this.allFiles),console.log(this.folios)}}t.default=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.trashEntryOptions=t.trashFolderOptions=t.multiFolderOptions=t.singleFolderOptions=t.folderAndFileOptions=t.multiFileOptions=t.singleFileOptions=t.defaultOptions=void 0,t.defaultOptions='\n ',t.singleFileOptions='\n \n \n ',t.multiFileOptions='\n \n ',t.folderAndFileOptions='\n ',t.singleFolderOptions='\n \n \n ',t.multiFolderOptions='\n ',t.trashFolderOptions='',t.trashEntryOptions='\n '}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ltbWVkaWF0ZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL0xvY2FsU2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL1NlbGVjdFRvb2xzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Ob3RpZmljYXRpb24udHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FyZ3NhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJkM1wiIiwid2VicGFjazovLy8uL3NyYy9TcXVhcmVFZGl0L0NvbnRlbnRzLnRzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9yZWdleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovLy8uL3NyYy9EaXNwbGF5UGFuZWwvRGlzcGxheUNvbnRyb2xzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Nb2RhbFdpbmRvdy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db29yZGluYXRlcy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3BhcmstbWQ1L3NwYXJrLW1kNS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvcmFuZG9tLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db2xvci50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnV2dXplbGEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvRHJhZ0hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvR3JvdXBpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL2luZGV4LnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9FcnJvckxvZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvUmVzaXplLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wb3VjaGRiL2xpYi9pbmRleC1icm93c2VyLmVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zaGExLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9uaWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy92a2JlYXV0aWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRGFzaGJvYXJkQ29udGVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvV2FybmluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvU3RhZmZUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9OZXVtZVRvb2xzLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3F1ZXVlTWljcm90YXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL211dGF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL21lc3NhZ2VDaGFubmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3N0YXRlQ2hhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3RpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9TdG9yYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRGFzaGJvYXJkLnRzIiwid2VicGFjazovLy8uL2RlcGxveW1lbnQvc2NyaXB0cy9kYXNoYm9hcmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL0ZpbGVTeXN0ZW1JbnRlcmZhY2VzLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRmlsZVN5c3RlbS9GaWxlU3lzdGVtVG9vbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL0ZpbGVTeXN0ZW1NYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvc2FtcGxlc19maWxlbmFtZXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9EYXNoYm9hcmRUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGFzaGJvYXJkL1VwbG9hZEFyZWEudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9VcGxvYWRUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGFzaGJvYXJkL1VwbG9hZEZpbGVNYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvQ29udGV4dE1lbnVDb250ZW50LnRzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiUmVmbGVjdE93bktleXMiLCJSIiwiUmVmbGVjdCIsIlJlZmxlY3RBcHBseSIsImFwcGx5IiwidGFyZ2V0IiwicmVjZWl2ZXIiLCJhcmdzIiwiRnVuY3Rpb24iLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImNvbmNhdCIsIk51bWJlcklzTmFOIiwiTnVtYmVyIiwiaXNOYU4iLCJFdmVudEVtaXR0ZXIiLCJpbml0IiwidGhpcyIsIm9uY2UiLCJlbWl0dGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJlcnJvckxpc3RlbmVyIiwiZXJyIiwicmVtb3ZlTGlzdGVuZXIiLCJyZXNvbHZlciIsInNsaWNlIiwiYXJndW1lbnRzIiwiZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyIiwiaGFuZGxlciIsImZsYWdzIiwib24iLCJhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlciIsIl9ldmVudHMiLCJ1bmRlZmluZWQiLCJfZXZlbnRzQ291bnQiLCJfbWF4TGlzdGVuZXJzIiwiZGVmYXVsdE1heExpc3RlbmVycyIsImNoZWNrTGlzdGVuZXIiLCJsaXN0ZW5lciIsIlR5cGVFcnJvciIsIl9nZXRNYXhMaXN0ZW5lcnMiLCJ0aGF0IiwiX2FkZExpc3RlbmVyIiwidHlwZSIsInByZXBlbmQiLCJldmVudHMiLCJleGlzdGluZyIsIndhcm5pbmciLCJuZXdMaXN0ZW5lciIsImVtaXQiLCJ1bnNoaWZ0IiwicHVzaCIsImxlbmd0aCIsIndhcm5lZCIsInciLCJFcnJvciIsIlN0cmluZyIsImNvdW50IiwiY29uc29sZSIsIndhcm4iLCJvbmNlV3JhcHBlciIsImZpcmVkIiwid3JhcEZuIiwiX29uY2VXcmFwIiwic3RhdGUiLCJ3cmFwcGVkIiwiX2xpc3RlbmVycyIsInVud3JhcCIsImV2bGlzdGVuZXIiLCJhcnIiLCJyZXQiLCJBcnJheSIsInVud3JhcExpc3RlbmVycyIsImFycmF5Q2xvbmUiLCJsaXN0ZW5lckNvdW50IiwiY29weSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ3cmFwTGlzdGVuZXIiLCJhcmciLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0IiwiUmFuZ2VFcnJvciIsImdldFByb3RvdHlwZU9mIiwic2V0TWF4TGlzdGVuZXJzIiwiZ2V0TWF4TGlzdGVuZXJzIiwiZG9FcnJvciIsImVycm9yIiwiZXIiLCJtZXNzYWdlIiwiY29udGV4dCIsImxlbiIsImxpc3RlbmVycyIsImFkZExpc3RlbmVyIiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImxpc3QiLCJwb3NpdGlvbiIsIm9yaWdpbmFsTGlzdGVuZXIiLCJzaGlmdCIsImluZGV4IiwicG9wIiwic3BsaWNlT25lIiwib2ZmIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwia2V5cyIsInJhd0xpc3RlbmVycyIsImV2ZW50TmFtZXMiLCJjdG9yIiwic3VwZXJDdG9yIiwic3VwZXJfIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIlRlbXBDdG9yIiwiZHJhaW5pbmciLCJjdXJyZW50UXVldWUiLCJzY2hlZHVsZURyYWluIiwidHlwZXMiLCJxdWV1ZUluZGV4IiwicXVldWUiLCJzY2hlZHVsZWQiLCJjbGVhblVwTmV4dFRpY2siLCJuZXh0VGljayIsInRpbWVvdXQiLCJzZXRUaW1lb3V0IiwicnVuIiwiY2xlYXJUaW1lb3V0IiwidGVzdCIsImluc3RhbGwiLCJJdGVtIiwiZnVuIiwiYXJyYXkiLCJ0YXNrIiwibG9jYWxTZXR0aW5ncyIsIkRFRkFVTFRfU0VUVElOR1MiLCJ6b29tIiwiZ2x5cGhPcGFjaXR5IiwiaW1hZ2VPcGFjaXR5IiwiY2lyY2xlU2l6ZSIsImhpZ2hsaWdodE1vZGUiLCJ1c2VyTW9kZSIsImluc2VydE1vZGUiLCJpbnNlcnRUYWIiLCJzZWxlY3Rpb25Nb2RlIiwiZGVidWdNb2RlIiwiZGlzcGxheUJCb3giLCJkaXNwbGF5VGV4dCIsImRpc3BsYXlJbmZvIiwiZGlzcGxheUVyckxvZyIsInZpZXdCb3giLCJzZXR0aW5ncyIsInBhcmFtcyIsImZvbGlvSWQiLCJpZCIsImxvYWQiLCJzdG9yZWQiLCJKU09OIiwicGFyc2UiLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwic3luYyIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJnZXRTZWxlY3Rpb25UeXBlIiwiZWxlbWVudCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsInVuc2VsZWN0IiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJzZWxlY3RlZCIsImNsYXNzTGlzdCIsInJlbW92ZSIsImNvbnRhaW5zIiwicmVtb3ZlQXR0cmlidXRlIiwiQ29sb3IiLCJ1bmhpZ2hsaWdodCIsInN0eWxlIiwiZmlsbCIsImZyb20iLCJkaXZMaW5lIiwic3Ryb2tlIiwic2V0QXR0cmlidXRlIiwibmV1bWUiLCJzeWxSZWN0IiwicGFyZW50RWxlbWVudCIsImFkZCIsImQzIiwic2VsZWN0QWxsIiwiZWwiLCJjb2xvciIsImZvbnRXZWlnaHQiLCJnZXRFbGVtZW50QnlJZCIsIlNlbGVjdE9wdGlvbnMiLCJlbmRPcHRpb25zU2VsZWN0aW9uIiwiR3JvdXBpbmciLCJlbmRHcm91cGluZ1NlbGVjdGlvbiIsImlubmVySFRNTCIsInVwZGF0ZUhpZ2hsaWdodCIsInNlbGVjdFN0YWZmIiwic3RhZmYiLCJkcmFnSGFuZGxlciIsImhpZ2hsaWdodCIsInRyaWdnZXJTaW5nbGVTdGFmZkFjdGlvbnMiLCJpbml0R3JvdXBpbmdMaXN0ZW5lcnMiLCJkcmFnSW5pdCIsInNlbGVjdExheWVyRWxlbWVudCIsImxheWVyRWxlbWVudCIsInNlbGVjdCIsIm5lZWRzSGlnaGxpZ2h0VXBkYXRlIiwic3lsSWQiLCJlbGVtIiwiY2xvc2VzdCIsInNwYW4iLCJhc3luYyIsImlzTGlnYXR1cmUiLCJuYyIsIm5lb25WaWV3IiwiYXR0cmlidXRlcyIsImdldEVsZW1lbnRBdHRyIiwidmlldyIsImdldEN1cnJlbnRQYWdlVVJJIiwiQm9vbGVhbiIsImxpZ2F0ZWQiLCJlbGVtZW50c0hhdmVDb3JyZWN0VHlwZSIsInNlbGVjdGlvblR5cGUiLCJlbGVtZW50cyIsInNoYXJlZFNlY29uZExldmVsUGFyZW50IiwidGVtcEVsZW1lbnRzIiwic2Vjb25kUGFyZW50Iiwic2VsZWN0QkJveCIsImJib3giLCJzeWwiLCJyZXNpemUiLCJxdWVyeVNlbGVjdG9yIiwidHJpZ2dlckJCb3hBY3Rpb25zIiwicGFyZW50IiwicHJldk5jIiwicHJldmlvdXNTaWJsaW5nIiwibmV4dE5jIiwibmV4dFNpYmxpbmciLCJ0cmlnZ2VyR3JvdXBpbmciLCJ0cmlnZ2VyTmNBY3Rpb25zIiwiYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUiLCJzb3J0ZWRFbGVtZW50cyIsImoiLCJpc1NhbWVOb2RlIiwiZmlyc3RFbGVtIiwic2Vjb25kRWxlbSIsImluZGV4MSIsImluZGV4T2YiLCJpbmRleDIiLCJNYXRoIiwiYWJzIiwiZmlsdGVyIiwicmVmZXJlbmNlUGFyZW50U3RhZmYiLCJyZWZlcmVuY2VQYXJlbnRTeWxsYWJsZSIsImVsZW1lbnRzQXJyYXkiLCJhbm90aGVyU3RhZmYiLCJ1bHgiLCJ1bHkiLCJscngiLCJscnkiLCJyb3RhdGUiLCJwYXRoIiwiY29vcmRpbmF0ZXMiLCJnZXRBdHRyaWJ1dGUiLCJtYXRjaCIsIm1hcCIsImF0YW4iLCJtaW4iLCJtYXgiLCJub3ROZXVtZXMiLCJubiIsInNlbGVjdGlvbkNsYXNzIiwiY29udGFpbnNMYXllckVsZW1lbnRzIiwiY29udGFpbnNOYyIsImdyb3Vwc1RvU2VsZWN0IiwiU2V0IiwiZ3JvdXBpbmciLCJmb2xsb3dzIiwicHJlY2VkZXMiLCJoYXMiLCJncm91cCIsImdyb3VwcyIsInZhbHVlcyIsInRyaWdnZXJNdWx0aVN0YWZmQWN0aW9ucyIsInNpemUiLCJ0cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyIsInRyaWdnZXJEZWZhdWx0QWN0aW9ucyIsInRyaWdnZXJTeWxsYWJsZUFjdGlvbnMiLCJpc0xpbmthYmxlIiwiaXNHcm91cGFibGUiLCJ0cmlnZ2VyTmV1bWVBY3Rpb25zIiwiY2hpbGRyZW4iLCJmaXJzdE5DIiwic2Vjb25kTkMiLCJmaXJzdE5DWCIsIngiLCJiYXNlVmFsIiwic2Vjb25kTkNYIiwiZmlyc3ROQ1kiLCJ5Iiwic2Vjb25kTkNZIiwiZyIsInRyaWdnZXJEZWZhdWx0U3lsQWN0aW9ucyIsIm5vdGlmaWNhdGlvbnMiLCJjdXJyZW50TW9kZU1lc3NhZ2UiLCJub3RpZmljYXRpb25JY29uIiwiZGVmYXVsdCIsInN1Y2Nlc3MiLCJOb3RpZmljYXRpb24iLCJsb2dJbmZvIiwiZGlzcGxheWVkIiwidXVpZHY0IiwiaXNNb2RlTWVzc2FnZSIsInNlYXJjaCIsInRpbWVvdXRJRCIsImNsZWFyTm90aWZpY2F0aW9uIiwiY3VycmVudElkIiwic3RhcnROb3RpZmljYXRpb24iLCJub3RpZmljYXRpb24iLCJnZXRJZCIsIm5vdGlmaWNhdGlvbkNvbnRlbnQiLCJuZXdOb3RpZmljYXRpb24iLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kIiwiZGlzcGxheSIsImRpc3BsYXlOb3RpZmljYXRpb24iLCJzZXRUaW1lb3V0SWQiLCJxdWV1ZU5vdGlmaWNhdGlvbiIsInJlY29yZE5vdGlmaWNhdGlvbiIsImluc2VydFRhYkh0bWwiLCJwcmltaXRpdmVUYWIiLCJncm91cGluZ1RhYiIsInN5c3RlbVRhYiIsImluc2VydENvbnRyb2xzUGFuZWwiLCJlZGl0Q29udHJvbHNQYW5lbCIsIm5jQWN0aW9uQ29udGVudHMiLCJkZWZhdWx0TmV1bWVBY3Rpb25Db250ZW50cyIsIm5ldW1lQWN0aW9uQ29udGVudHMiLCJkZWZhdWx0QWN0aW9uQ29udGVudHMiLCJkZWZhdWx0U3lsQWN0aW9uQ29udGVudHMiLCJjdXN0b3NBY3Rpb25Db250ZW50cyIsImxheWVyRWxlbWVudE91dEFjdGlvbkNvbnRlbnRzIiwibGF5ZXJFbGVtZW50SW5BY3Rpb25Db250ZW50cyIsImFjY2lkQWN0aW9uQ29udGVudHMiLCJzdGFmZlNwbGl0QWN0aW9uQ29udGVudHMiLCJzdGFmZk1lcmdlQWN0aW9uQ29udGVudHMiLCJjb2x1bW5BY3Rpb25Db250ZW50cyIsImNsZWZBY3Rpb25Db250ZW50cyIsImRpdkxpbmVBY3Rpb25Db250ZW50cyIsImJib3hBY3Rpb25Db250ZW50cyIsImdyb3VwaW5nTWVudSIsImxpZ2F0dXJlTmMiLCJsaWdhdHVyZSIsInNwbGl0U3lsbGFibGUiLCJlZGl0VGV4dE1vZGFsIiwiaG90a2V5c01vZGFsIiwic3lsbGFibGVBY3Rpb25zQ29udGVudCIsImVycm9yTG9nc1BhbmVsQ29udGVudHMiLCJlIiwiYnl0ZVRvSGV4IiwidG9TdHJpbmciLCJzdWJzdHIiLCJvZmZzZXQiLCJ1dWlkIiwidG9Mb3dlckNhc2UiLCJsYXN0R2x5cGhPcGFjaXR5IiwibGFzdEltYWdlT3BhY2l0eSIsImxhc3RDaXJjbGVTaXplIiwic2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlciIsIm1laUNsYXNzTmFtZSIsIm9wYWNpdHlPdXRwdXQiLCJzZXRTZXR0aW5ncyIsImhpZGVHbHlwaEltZyIsIm9wYWNpdHkiLCJzZXRCZ09wYWNpdHlGcm9tU2xpZGVyIiwiYmFja2dyb3VuZCIsImJnT3BhY2l0eU91dHB1dCIsImhpZGVCZ0ltZyIsImJnIiwidXBkYXRlSGlnaGxpZ2h0T3B0aW9uIiwib3B0aW9uIiwiZHJvcGRvd24iLCJoaWdobGlnaHRUeXBlIiwidGV4dENvbnRlbnQiLCJ1bnNldEdyb3VwaW5nSGlnaGxpZ2h0IiwidG9VcHBlckNhc2UiLCJzZXRHcm91cGluZ0hpZ2hsaWdodCIsInNldEhpZ2hsaWdodE9wdGlvbiIsImhpZ2hsaWdodENsaWNrYXdheSIsImJvZHkiLCJzZXRIaWdobGlnaHRDb250cm9scyIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInRvZ2dsZSIsImxvYWRIaWdobGlnaHRTZXR0aW5ncyIsImdldFNldHRpbmdzIiwiem9vbUhhbmRsZXIiLCJ6b29tU2xpZGVyIiwiem9vbU91dHB1dCIsInpvb21UbyIsInJlc2V0Wm9vbUFuZFBhbiIsImRpc2FibGVkIiwiY3VycmVudFpvb20iLCJwYXJzZUludCIsInByZXZlbnREZWZhdWx0IiwibmV3Wm9vbSIsImNpcmNsZVNsaWRlciIsImNpcmNsZU91dHB1dCIsImNpcmNsZVNpemVJbnB1dENoYW5nZUhhbmRsZXIiLCJyZXNpemVQb2ludHMiLCJlbXB0eSIsImF0dHIiLCJoaWdobGlnaHRTZWxlY3Rpb24iLCJoaWdobGlnaHRJZCIsImRpc3BsYXlBbGxCdG4iLCJkaXNwbGF5QkJveGVzIiwiY2hlY2tlZCIsIm9wYWNpdHlTbGlkZXIiLCJpbnB1dENoYW5nZU9wYWNpdHkiLCJ0b2dnbGVPcGFjaXR5QnRuIiwibmV3T3BhY2l0eSIsInJvdW5kIiwic2V0R2x5cGhPcGFjaXR5Q29udHJvbHMiLCJiZ09wYWNpdHlTbGlkZXIiLCJiZ0lucHV0Q2hhbmdlSGFuZGxlciIsInRvZ2dsZUJnT3BhY2l0eUJ0biIsInNldEJnT3BhY2l0eUNvbnRyb2xzIiwibWV0YUtleSIsInNlbGVjdEFsbEJ0biIsIm9wdGlvbnMiLCJjbGljayIsInNldERpc3BsYXlBbGxMaXN0ZW5lciIsImRpc3BsYXlDb250ZW50cyIsInRvZ2dsZURpc3BsYXkiLCJwYWRkaW5nIiwib3ZlcmZsb3ciLCJNb2RhbFdpbmRvd1ZpZXciLCJNb2RhbFdpbmRvd1N0YXRlIiwib3BlbkVkaXRTeWxUZXh0TW9kYWxXaW5kb3ciLCJoaWRlTW9kYWxXaW5kb3ciLCJ1cGRhdGVTeWxUZXh0IiwiZm9jdXNNb2RhbFdpbmRvdyIsIm9yaWciLCJyZXBsYWNlIiwidHJpbSIsInVwZGF0ZWRTeWxUZXh0IiwiZWRpdG9yQWN0aW9uIiwiYWN0aW9uIiwicGFyYW0iLCJlbGVtZW50SWQiLCJlbnRyaWVzIiwiY2xhc3NOYW1lIiwidGV4dCIsImVkaXQiLCJ0aGVuIiwicmVzcG9uc2UiLCJ1cGRhdGVGb3JDdXJyZW50UGFnZSIsInVwZGF0ZVNlbGVjdGVkQkJveCIsImtleWRvd25MaXN0ZW5lciIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsIm1vZGFsV2luZG93VmlldyIsIkVESVRfVEVYVCIsIkRPQ1VNRU5UX1VQTE9BRCIsIk5FV19GT0xERVIiLCJSRU5BTUUiLCJmb2N1cyIsIm1vZGFsV2luZG93U3RhdGUiLCJDTE9TRUQiLCJzZXR1cEV2ZW50TGlzdGVuZXJzIiwiY29udGVudCIsInNldE1vZGFsV2luZG93Q29udGVudCIsIkhPVEtFWVMiLCJNT1ZFX1RPIiwib3ZlcmZsb3dYIiwib3ZlcmZsb3dZIiwiT1BFTiIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwiY29udGFpbmVyIiwidGl0bGUiLCJpbm5lclRleHQiLCJyZW1vdmVTeW1ib2wiLCJFUlJPUl9MT0ciLCJlbmNvZGVVUkkiLCJ1cGxvYWRBcmVhSFRNTCIsIm5ld0ZvbGRlckhUTUwiLCJyZW5hbWVIVE1MIiwiYmJveElkIiwiZmluZCIsImRpc3BsYXlSZWN0IiwidW5zZXRJbmNsaW5hdHVtQWN0aW9uIiwiYXR0clR5cGUiLCJhdHRyVmFsdWUiLCJ1bnNldFZpcmdhQWN0aW9uIiwidW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uIiwidW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uIiwidW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbiIsImN1cnZlIiwiZGVsZXRlQnV0dG9uSGFuZGxlciIsInJlbW92ZUhhbmRsZXIiLCJtb3JlRWRpdCIsImV4dHJhRWRpdCIsInRvUmVtb3ZlIiwiY2hhaW5BY3Rpb24iLCJjaGFuZ2VTdGFmZkhhbmRsZXIiLCJ0b0NoYW5nZSIsImluc2VydFRvU3lsbGFibGVIYW5kbGVyIiwidG9JbnNlcnQiLCJyZXN1bHQiLCJtb3ZlT3V0c2lkZVN5bGxhYmxlSGFuZGxlciIsInRvTW92ZSIsIm1hdGNoSGVpZ2h0SGFuZGxlciIsImFkZERlbGV0ZUxpc3RlbmVyIiwiZGVsIiwiYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lciIsImNoYW5nZVN0YWZmIiwidXBkYXRlQ29sdW1uSW5mbyIsImNvbElucHV0Iiwic3RhdmVzIiwiY29sSW5mbyIsImhhc0NvbHVtbiIsImpvaW4iLCJzdGFmZkNvbCIsImFkZENvbHVtbkluZm9TdGVwSGFuZGxlciIsImRlY3JlbWVudEJ1dHRvbiIsImluY3JlbWVudEJ1dHRvbiIsImNvbmZpcm1CdXR0b24iLCJ1cGRhdGVOdW1iZXIiLCJjaGFuZ2UiLCJjdXJyZW50VmFsdWUiLCJ0b1NldENvbHVtbiIsInNldEVkaXRDb250cm9scyIsImVkaXRUeXBlIiwiY29udGVudHMiLCJwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uIiwidHJpZ2dlclN0YWZmU3BsaXRNb2RlIiwiU3BsaXRTdGFmZkhhbmRsZXIiLCJzdGFydFNwbGl0IiwiaW5pdE9wdGlvbnNMaXN0ZW5lcnMiLCJkcm9wIiwib3B0aW9uc0NsaWNrYXdheSIsIm90aGVyIiwiaW5pdE5lb25WaWV3IiwiQ29udGVudHMiLCJ1bnNldEluY2xpbmF0dW0iLCJ1bnNldFZpcmdhIiwidW5zZXRWaXJnYVJldmVyc2VkIiwidW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlIiwidW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSIsInNldEluY2xpbmF0dW0iLCJzZXRWaXJnYSIsInNldFZpcmdhUmV2ZXJzZWQiLCJzZXRMaXF1ZXNjZW50Q2xvY2t3aXNlIiwic2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UiLCJ0cmlnZ2VyQ2hhbmdlR3JvdXAiLCJjb250b3VyIiwiY2hhbmdlR3JvdXBpbmdBY3Rpb24iLCJTcGxpdE5ldW1lSGFuZGxlciIsImluZm8iLCJnZXRDb250b3VyQnlWYWx1ZSIsImV4dHJhQWN0aW9uc0hUTUwiLCJhY2NpZE9wdGlvbnNMaXN0ZW5lciIsImluY3JlbWVudE9jdGF2ZSIsImRpcmVjdGlvbiIsInNoYXBlIiwiY2xlZk9wdGlvbnNMaXN0ZW5lciIsImRpdkxpbmVPcHRpb25zTGlzdGVuZXIiLCJtZXJnZVN0YXZlcyIsInBvaW50cyIsImdldFN0YWZmQkJveCIsInlfY2hhbmdlIiwidGFuIiwiZ2V0U1ZHUmVsQ29vcmRzIiwiY2xpZW50WCIsImNsaWVudFkiLCJwdCIsIkRPTVBvaW50IiwicGFnZU1hcmdpbiIsIm1hdHJpeFRyYW5zZm9ybSIsImdldFNjcmVlbkNUTSIsImludmVyc2UiLCJnZXRTdGFmZklkQnlDb29yZHMiLCJzdGFmZkJCb3hlcyIsInN0YWZmSWQiLCJiZ0ltZyIsInJlY3QiLCJ0YWdOYW1lIiwiZ2V0QkJveCIsInBhcmVudE5vZGUiLCJ3aWR0aCIsImhlaWdodCIsImhleF9jaHIiLCJtZDVjeWNsZSIsImsiLCJhIiwiYiIsIm1kNWJsayIsIm1kNWJsa3MiLCJjaGFyQ29kZUF0IiwibWQ1YmxrX2FycmF5IiwibWQ1MSIsInRhaWwiLCJ0bXAiLCJsbyIsImhpIiwic3Vic3RyaW5nIiwicmhleCIsImhleCIsInRvVXRmOCIsInN0ciIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaGV4VG9CaW5hcnlTdHJpbmciLCJieXRlcyIsImZyb21DaGFyQ29kZSIsIlNwYXJrTUQ1IiwicmVzZXQiLCJBcnJheUJ1ZmZlciIsImNsYW1wIiwidmFsIiwidG8iLCJudW0iLCJ0YXJnZXRBcnJheSIsInNvdXJjZUFycmF5IiwiYnl0ZUxlbmd0aCIsImJlZ2luIiwiZW5kIiwiVWludDhBcnJheSIsImFwcGVuZEJpbmFyeSIsIl9idWZmIiwiX2xlbmd0aCIsIl9oYXNoIiwicmF3IiwiYnVmZiIsIl9maW5pc2giLCJnZXRTdGF0ZSIsImhhc2giLCJzZXRTdGF0ZSIsImRlc3Ryb3kiLCJoYXNoQmluYXJ5IiwiZmlyc3QiLCJzZWNvbmQiLCJyZXR1cm5VSW50OEFycmF5IiwiYnVmZmVyIiwic3ViYXJyYXkiLCJ1dGY4U3RyMkFycmF5QnVmZmVyIiwibWQ1MV9hcnJheSIsImZhY3RvcnkiLCJ1aW50OFRvVXVpZCIsImRhdGEiLCJjYiIsInByZXZpb3VzIiwiY3VycmVudCIsInBhZFN0YXJ0IiwicmVkdWNlIiwiY3J5cHRvIiwib2N0ZXRzIiwibW9kaWZpZXJzIiwiZ2V0UmFuZG9tVmFsdWVzIiwiQ29sb3JQYWxldHRlIiwicmVjdHMiLCJ1bnNldFN0YWZmSGlnaGxpZ2h0IiwiY2hpbGQiLCJjY2hpbGQiLCJzZXRTdGFmZkhpZ2hsaWdodCIsInN0YWZmQ29sb3IiLCJjb2x1bW5OdW0iLCJjb2x1bW4iLCJzZXRDb2x1bW5IaWdobGlnaHQiLCJncm91cENvbG9yIiwiZGl2TGluZUNoaWxkcmVuIiwicm5kczgiLCJybmciLCJtc0NyeXB0byIsIm9iaiIsInN0YWNrIiwibWV0YVN0YWNrIiwibGFzdE1ldGFFbGVtZW50IiwibGFzdEVsZW1lbnRJbmRleCIsImlzQXJyYXkiLCJpbnB1dCIsIm5leHQiLCJhcnJheVByZWZpeCIsIm9ialByZWZpeCIsInJlcyIsInByZWZpeCIsImNvbGxhdGlvbkluZGV4IiwicGFyc2VkTnVtIiwibnVtQ2hhciIsInBhcnNlZFN0cmluZyIsImxhc3RDaCIsIm51bUNvbnNlY3V0aXZlU2xhc2hlcyIsImNoIiwiYXJyYXlFbGVtZW50Iiwib2JqRWxlbWVudCIsInBhcnNlRmxvYXQiLCJidWYiLCJybmRzIiwicmFuZG9tIiwic2VsZWN0b3IiLCJkcmFnU3RhcnRDb29yZHMiLCJkcmFnQmVoYXZpb3VyIiwiZHJhZyIsImV2ZW50IiwiZHgiLCJkeSIsInNvdXJjZUV2ZW50IiwiZHJhZ2dpbmciLCJkcmFnRW5kZWQiLCJzZWxlY3Rpb24iLCJub01vdmVQcmVjZWRlcyIsImhhc0F0dHJpYnV0ZSIsIm1vdmVFbGVtZW50cyIsImJib3hlcyIsInhEaWZmIiwieURpZmYiLCJpc0N1cnNvck91dE9mQm91bmRzIiwiaXNEcmFnT3V0T2ZCb3VuZHMiLCJyZXR1cm5FbGVtZW50cyIsInBhcmFtQXJyYXkiLCJkcmFnQWN0aW9uIiwidG9SZXNlbGVjdCIsInJlc2VsZWN0IiwicmVzZWxlY3RlZCIsInJlc2V0VG9BY3Rpb24iLCJlbmRYIiwiZW5kWSIsImlzT3V0T2ZTVkdCb3VuZHMiLCJnbHlwaFNlbGVjdG9yIiwic2VsZWN0aW9uQkJveCIsImFjYyIsImdldEdseXBoQkJveCIsImN1cnIiLCJNQVhfVkFMVUUiLCJNSU5fVkFMVUUiLCJTZWxlY3RUb29scyIsInNoYXJlZExvZ2ljYWxQYXJlbnQiLCJhcmVBZGphY2VudCIsImNvbnRhaW5zTGlua2VkIiwiaXNMaW5rZWQiLCJjYW5CZUxpbmtlZCIsInNvcnQiLCJzdGFmZkEiLCJzdGFmZkIiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJzeWxsYWJsZXMiLCJjdXJyZW50U3lsbGFibGVJbmRleCIsImN1cnJlbnRTdGFmZiIsIm5leHRTdGFmZiIsImN1cnJlbnRTdGFmZkluZGV4IiwiZXZlcnkiLCJ1bmxpbmtlZEVsZW1lbnRzIiwiZmlyc3RVbmxpbmtlZCIsIkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyIsImlkeCIsInN5bGxhYmxlIiwiYXQiLCJuZXh0U3lsbGFibGVJZCIsIm5leHRTeWxsYWJsZUlkeCIsIm5leHRTeWxsYWJsZSIsInByZXZTeWxsYWJsZUlkIiwicHJldlN5bGxhYmxlIiwiaGFzSW52YWxpZExpbmtlZFN5bGxhYmxlIiwic3lzdGVtcyIsImVsZW1lbnRJZHMiLCJncm91cGluZ0FjdGlvbiIsImdldENoaWxkcmVuSWRzIiwiZ2V0SWRzIiwidG9nZ2xlTGlua2VkU3lsbGFibGVzIiwiZ3JvdXBUeXBlIiwibmV1bWVQYXJlbnQiLCJuY3MiLCJnZXRDb250b3VyIiwiV2FybmluZ3MiLCJncm91cGluZ05vdFJlY29nbml6ZWQiLCJnZXRTVkdHcmFwaGljc0VsZW1lbnRCeUlkIiwiU1ZHR3JhcGhpY3NFbGVtZW50IiwidW5saW5rIiwiZmlyc3RTeWxsYWJsZSIsInNlY29uZFN5bGxhYmxlIiwidW5saW5rZWRFbGVtZW50IiwiZ2V0VG9nZ2xlU3lsbGFibGVJZHMiLCJsb2ciLCJpZHMiLCJjaGlsZHJlbklkcyIsIkVudHJ5VHlwZSIsIkZpbGVTeXN0ZW1Ub29scyIsIkZpbGVTeXN0ZW1NYW5hZ2VyIiwiY3JlYXRlTG9nTWVzc2FnZSIsIm5vdGlmIiwibm90aWZEaXYiLCJyZW1vdmVCdG4iLCJvbmNsaWNrIiwiaW5mb0J0biIsIm1vZGFsV2luZG93IiwiTW9kYWxXaW5kb3ciLCJzZXRNb2RhbFdpbmRvd1ZpZXciLCJvcGVuTW9kYWxXaW5kb3ciLCJvcGVuRXJyb3JMb2dXaW5kb3ciLCJpbml0RXJyb3JMb2dDb250cm9scyIsImVycm9yUGFuZWwiLCJoZWFkaW5nIiwiZHJvcGRvd25JY29uIiwiaW5pdERpc3BsYXlMaXN0ZW5lciIsImNoZWNrYm94ZXNDb250YWluZXIiLCJlcnJvcnNMYWJlbCIsImVyb3Jyc0J0biIsImFwcGVuZENoaWxkIiwidXBkYXRlRXJyb3JMb2dWaXNpYmlsaXR5Iiwibm90aWZQYW5lbCIsIlBvaW50TmFtZXMiLCJUb3BMZWZ0IiwiVG9wIiwiVG9wUmlnaHQiLCJSaWdodCIsIkJvdHRvbVJpZ2h0IiwiQm90dG9tIiwiQm90dG9tTGVmdCIsIkxlZnQiLCJnZXRQb2ludHMiLCJzaW4iLCJpbml0aWFsVWx4IiwiaW5pdGlhbExyeCIsImluaXRpYWxQb2ludCIsImluaXRpYWxVbHkiLCJpbml0aWFsTHJ5IiwiaW5pdGlhbFkiLCJpbml0aWFsUmVjdFkiLCJwb2x5TGVuIiwiaW5pdGlhbFJvdGF0ZSIsInJlZHJhdyIsInBvaW50U3RyaW5nIiwiX2VsZW0iLCJ0ZXh0UmVjdCIsInBvaW50TmFtZSIsInBvaW50IiwicG9pbnRTdHJpbmdSaWdodCIsInBvaW50U3RyaW5nTGVmdCIsImRyYXdJbml0aWFsUmVjdCIsIndoaWNoUG9pbnQiLCJfIiwidmlld3BvcnRFbGVtZW50IiwicmVzaXplU3RhcnQiLCJyZXNpemVEcmFnIiwicmVzaXplRW5kIiwicm90YXRlU3RhcnQiLCJ0ZW1wIiwibW91c2UiLCJ0ZW1wUm90YXRlIiwicm90YXRlRW5kIiwiY3VycmVudFBvaW50Iiwid2hpY2giLCJQSSIsIkV4cG9ydGVkU2V0IiwiRXhwb3J0ZWRNYXAiLCJtYW5nbGUiLCJ1bm1hbmdsZSIsIk1hcCQxIiwiX3N0b3JlIiwiU2V0JDEiLCJjbG9uZUJpbmFyeU9iamVjdCIsImNsb25lQXJyYXlCdWZmZXIiLCJ3ZWJraXRTbGljZSIsIm1hbmdsZWQiLCJkZWxldGUiLCJNYXAiLCJwcm9wIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwic3BlY2llcyIsInN1cHBvcnRzTWFwQW5kU2V0IiwiZnVuY1RvU3RyaW5nIiwib2JqZWN0Q3RvclN0cmluZyIsImNsb25lIiwibmV3T2JqZWN0IiwiRGF0ZSIsImlzRmluaXRlIiwidG9JU09TdHJpbmciLCJCbG9iIiwiaXNCaW5hcnlPYmplY3QiLCJwcm90byIsIkN0b3IiLCJpc1BsYWluT2JqZWN0IiwiY2FsbGVkIiwidG9Qcm9taXNlIiwiZnVuYyIsInNlbGYiLCJ1c2VkQ0IiLCJwcm9taXNlIiwiZnVsZmlsbCIsInJlc3AiLCJjYWxsYmFjayIsIm1lc2ciLCJhZGFwdGVyRnVuIiwiX2Nsb3NlZCIsIl9kZXN0cm95ZWQiLCJsb2dBcmdzIiwib3JpZ0NhbGxiYWNrIiwicmVzcG9uc2VBcmdzIiwibG9nQXBpQ2FsbCIsInRhc2txdWV1ZSIsImlzUmVhZHkiLCJhZGRUYXNrIiwiZmFpbGVkIiwicGljayIsImhhc0xvY2FsIiwiaWRlbnRpdHlGdW5jdGlvbiIsImZvcm1hdFJlc3VsdEZvck9wZW5SZXZzR2V0Iiwib2siLCJidWxrR2V0IiwiZGIiLCJvcHRzIiwicmVxdWVzdHMiLCJkb2NzIiwicmVxdWVzdHNCeUlkIiwicmVxdWVzdCIsIm51bURvY3MiLCJudW1Eb25lIiwicGVyRG9jUmVzdWx0cyIsImNoZWNrRG9uZSIsInJlc3VsdHMiLCJhbGxSZXF1ZXN0cyIsIm5leHRCYXRjaCIsInVwVG8iLCJiYXRjaCIsImRvY0lkIiwiZG9jSWR4IiwiZG9jUmVxdWVzdHMiLCJkb2NPcHRzIiwib3Blbl9yZXZzIiwicmV2IiwiZm9ybWF0UmVzdWx0IiwicHJvY2Vzc0JhdGNoIiwiaGFzTG9jYWxTdG9yYWdlIiwiQ2hhbmdlcyIsImF0dGFjaEJyb3dzZXJFdmVudHMiLCJndWFyZGVkQ29uc29sZSIsIm1ldGhvZCIsImRlZmF1bHRCYWNrT2ZmIiwibWF4VGltZW91dCIsInJhbmRvbU51bWJlciIsImV4cGxhaW5FcnJvciIsInN0YXR1cyIsImRiTmFtZSIsImlucHJvZ3Jlc3MiLCJldmVudEZ1bmN0aW9uIiwiY2hhbmdlc09wdHMiLCJjaGFuZ2VzIiwic2VxIiwic2luY2UiLCJjYW5jZWxsZWQiLCJvbkNoYW5nZSIsIm5vdGlmeUxvY2FsV2luZG93cyIsIm5vdGlmeSIsIiRpbmplY3RfT2JqZWN0X2Fzc2lnbiIsImFzc2lnbiIsIm5leHRTb3VyY2UiLCJuZXh0S2V5IiwiUG91Y2hFcnJvciIsInJlYXNvbiIsIk1JU1NJTkdfQlVMS19ET0NTIiwiTUlTU0lOR19ET0MiLCJSRVZfQ09ORkxJQ1QiLCJJTlZBTElEX0lEIiwiTUlTU0lOR19JRCIsIlJFU0VSVkVEX0lEIiwiVU5LTk9XTl9FUlJPUiIsIkJBRF9BUkciLCJRVUVSWV9QQVJTRV9FUlJPUiIsIkRPQ19WQUxJREFUSU9OIiwiQkFEX1JFUVVFU1QiLCJOT1RfQU5fT0JKRUNUIiwiSURCX0VSUk9SIiwiSU5WQUxJRF9SRVYiLCJNSVNTSU5HX1NUVUIiLCJjcmVhdGVFcnJvciIsIkN1c3RvbVBvdWNoRXJyb3IiLCJuYW1lcyIsImdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UiLCJmaWx0ZXJDaGFuZ2UiLCJyZXEiLCJoYXNGaWx0ZXIiLCJxdWVyeSIsInF1ZXJ5X3BhcmFtcyIsImRvYyIsImZpbHRlclJldHVybiIsIm1zZyIsInRyeUZpbHRlciIsImluY2x1ZGVfZG9jcyIsImF0dGFjaG1lbnRzIiwiYXR0IiwiX2F0dGFjaG1lbnRzIiwic3R1YiIsImZsYXR0ZW4iLCJhcnJzIiwiaW52YWxpZElkRXJyb3IiLCJpc1JlbW90ZSIsIl9yZW1vdGUiLCJwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZSIsInBhcnRzIiwic3BsaXQiLCJub3JtYWxpemVEZXNpZ25Eb2NGdW5jdGlvbk5hbWUiLCJub3JtYWxpemVkIiwicVBhcnNlciIsInBhcnNlciIsInBhcnNlVXJpIiwiZXhlYyIsInVyaSIsImVuY29kZWQiLCJkZWNvZGVVUklDb21wb25lbnQiLCIkMCIsIiQxIiwiJDIiLCJzY29wZUV2YWwiLCJzb3VyY2UiLCJzY29wZSIsInVwc2VydCIsImRpZmZGdW4iLCJjYXRjaCIsImRvY1JldiIsIl9yZXYiLCJuZXdEb2MiLCJfaWQiLCJwdXQiLCJ1cGRhdGVkIiwidHJ5QW5kUHV0IiwidGhpc0F0b2IiLCJhdG9iIiwidGhpc0J0b2EiLCJidG9hIiwiY3JlYXRlQmxvYiIsInByb3BlcnRpZXMiLCJidWlsZGVyIiwiQmxvYkJ1aWxkZXIiLCJNU0Jsb2JCdWlsZGVyIiwiTW96QmxvYkJ1aWxkZXIiLCJXZWJLaXRCbG9iQnVpbGRlciIsImdldEJsb2IiLCJiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyIiwiYmluIiwiYmluU3RyaW5nVG9CbHVmZmVyIiwiYmluU3RyaW5nIiwiYjY0VG9CbHVmZmVyIiwiYjY0IiwicmVhZEFzQmluYXJ5U3RyaW5nIiwiYmxvYiIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJoYXNCaW5hcnlTdHJpbmciLCJvbmxvYWRlbmQiLCJiaW5hcnkiLCJhcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJibG9iVG9CaW5hcnlTdHJpbmciLCJibG9iT3JCdWZmZXIiLCJibG9iVG9CYXNlNjQiLCJiYXNlNjQiLCJzZXRJbW1lZGlhdGVTaGltIiwic2V0SW1tZWRpYXRlIiwiYXBwZW5kQmxvYiIsInN0YXJ0Iiwic2xpY2VCbG9iIiwiYXJyYXlCdWZmZXIiLCJhcHBlbmRTdHJpbmciLCJzdHJpbmciLCJiaW5hcnlNZDUiLCJpbnB1dElzU3RyaW5nIiwiY2h1bmtTaXplIiwiY2h1bmtzIiwiY2VpbCIsImN1cnJlbnRDaHVuayIsImxvYWROZXh0Q2h1bmsiLCJkb25lIiwicmF3VG9CYXNlNjQiLCJzdHJpbmdNZDUiLCJyZXYkJDEiLCJkZXRlcm1pbmlzdGljX3JldnMiLCJtdXRhdGVhYmxlRG9jIiwiX3Jldl90cmVlIiwid2lubmluZ1JldiIsIm1ldGFkYXRhIiwid2lubmluZ0lkIiwid2lubmluZ1BvcyIsIndpbm5pbmdEZWxldGVkIiwibm9kZSIsInRvVmlzaXQiLCJyZXZfdHJlZSIsInRyZWUiLCJicmFuY2hlcyIsInBvcyIsImRlbGV0ZWQiLCJ0cmF2ZXJzZVJldlRyZWUiLCJyZXZzIiwibmV3Q3R4IiwiY3R4Iiwic29ydEJ5UG9zIiwiY29sbGVjdExlYXZlcyIsImxlYXZlcyIsImlzTGVhZiIsInJldmVyc2UiLCJjb2xsZWN0Q29uZmxpY3RzIiwid2luIiwiY29uZmxpY3RzIiwibGVhZiIsInJvb3RUb0xlYWYiLCJwYXRocyIsImhpc3RvcnkiLCJzb3J0QnlQb3MkMSIsImluc2VydFNvcnRlZCIsIml0ZW0iLCJjb21wYXJhdG9yIiwibWlkIiwibG93IiwiaGlnaCIsImJpbmFyeVNlYXJjaCIsInNwbGljZSIsInBhdGhUb1RyZWUiLCJudW1TdGVtbWVkIiwicm9vdCIsImN1cnJlbnRMZWFmIiwiY29tcGFyZVRyZWUiLCJtZXJnZVRyZWUiLCJpbl90cmVlMSIsImluX3RyZWUyIiwidHJlZTEiLCJ0cmVlMiIsIm1lcmdlZCIsImRvTWVyZ2UiLCJkb250RXhwYW5kIiwicmVzdHJlZSIsImJyYW5jaCIsInQxIiwidDIiLCJkaWZmIiwiY2FuZGlkYXRlUGFyZW50cyIsInRyZWVzIiwicGFyZW50SWR4IiwiZWxlbWVudHNMZW4iLCJtZXJnZSIsImRlcHRoIiwibmV3VHJlZSIsInN0ZW1tZWQiLCJzdGVtbWVkUmV2cyIsInJldkhhc2giLCJzdGVtIiwiZ2V0VHJlZXMiLCJpc0RlbGV0ZWQiLCJpc0xvY2FsSWQiLCJDaGFuZ2VzJDEiLCJjb21wbGV0ZSIsImVlIiwib25EZXN0cm95IiwiY2FuY2VsIiwicGVuZGluZyIsImxhc3RTZXEiLCJpc0NhbmNlbGxlZCIsInRyeUNhdGNoSW5DaGFuZ2VMaXN0ZW5lciIsInZhbGlkYXRlQ2hhbmdlcyIsInByb2Nlc3NDaGFuZ2UiLCJjaGFuZ2VMaXN0IiwiX2NvbmZsaWN0cyIsImNvbXBhcmUiLCJsZWZ0IiwicmlnaHQiLCJ5YW5rRXJyb3IiLCJjb21wYXJlQnlJZFRoZW5SZXYiLCJpZENvbXBhcmUiLCJfcmV2aXNpb25zIiwiQWJzdHJhY3RQb3VjaERCIiwiVGFza1F1ZXVlIiwiUG91Y2hEQiIsIl9fb3B0cyIsImF1dG9fY29tcGFjdGlvbiIsImJhY2tlbmQiLCJhZGFwdGVyIiwiYWRhcHRlcnMiLCJwcmVmZXJyZWRBZGFwdGVycyIsImFkYXB0ZXJOYW1lIiwidXNlX3ByZWZpeCIsInBhcnNlQWRhcHRlciIsIl9hZGFwdGVyIiwidmFsaWQiLCJ2aWV3X2FkYXB0ZXIiLCJmYWlsIiwib25EZXN0cm95ZWQiLCJmcm9tX2NvbnN0cnVjdG9yIiwib25DbG9zZWQiLCJwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24iLCJyZWFkeSIsIl9jaGFuZ2VzRmlsdGVyUGx1Z2luIiwidmFsaWRhdGUiLCJkb0NoYW5nZXMiLCJjb250aW51b3VzIiwibGl2ZSIsIm5vcm1hbGl6ZSIsInNob3VsZEZpbHRlciIsImRlc2NlbmRpbmciLCJsaW1pdCIsIm5ld1Byb21pc2UiLCJfY2hhbmdlcyIsInVwZGF0ZV9zZXEiLCJwb3N0IiwiYnVsa0RvY3MiLCJfcHV0TG9jYWwiLCJfZGVsZXRlZCIsIl9yZW1vdmVMb2NhbCIsIm9sZFJldklkIiwibmV3UmV2TnVtIiwibmV3UmV2SWQiLCJwdXREb2MiLCJfcHV0IiwibmV3X2VkaXRzIiwiZm9yY2UiLCJwdXRBdHRhY2htZW50IiwiYXR0YWNobWVudElkIiwiYXBpIiwiY3JlYXRlQXR0YWNobWVudCIsInByZXZyZXZwb3MiLCJjb250ZW50X3R5cGUiLCJyZXZwb3MiLCJyZW1vdmVBdHRhY2htZW50IiwiZG9jT3JJZCIsIm9wdHNPclJldiIsIndhc19kZWxldGUiLCJyZXZzRGlmZiIsIm1pc3NpbmciLCJhZGRUb01pc3NpbmciLCJyZXZJZCIsIl9nZXRSZXZpc2lvblRyZWUiLCJtaXNzaW5nRm9ySWQiLCJwcm9jZXNzRG9jIiwibWlzc2luZ09iaiIsImNvbXBhY3REb2N1bWVudCIsIm1heEhlaWdodCIsInJldlRyZWUiLCJlZGdlcyIsInBybnQiLCJlZGdlIiwiY29tcHV0ZUhlaWdodCIsImNhbmRpZGF0ZXMiLCJfZG9Db21wYWN0aW9uIiwiY29tcGFjdCIsIl9jb21wYWN0aW9uUXVldWUiLCJkb05leHRDb21wYWN0aW9uIiwibGFzdF9zZXEiLCJfY29tcGFjdCIsInJldHVybl9kb2NzIiwicHJvbWlzZXMiLCJyb3ciLCJhbGwiLCJfZ2V0TG9jYWwiLCJmaW5pc2hPcGVuUmV2cyIsImxhdGVzdCIsIl9nZXQiLCJyZXZzX2luZm8iLCJzcGxpdHRlZFJldiIsInJldk5vIiwiY3VycmVudFBhdGgiLCJoYXNoSW5kZXgiLCJpbmRleE9mUmV2IiwiaG93TWFueSIsIl9yZXZzX2luZm8iLCJfZ2V0QXR0YWNobWVudCIsImdldEF0dGFjaG1lbnQiLCJhbGxEb2NzIiwic2tpcCIsInN0YXJ0X2tleSIsInN0YXJ0a2V5IiwiZW5kX2tleSIsImVuZGtleSIsImluY29tcGF0aWJsZU9wdCIsImFsbERvY3NLZXlzUGFyc2UiLCJfYWxsRG9jcyIsImNsb3NlIiwiX2Nsb3NlIiwiX2luZm8iLCJkYl9uYW1lIiwiX3R5cGUiLCJhdHRhY2htZW50RXJyb3IiLCJjaGFyQXQiLCJhdHRhY2htZW50TmFtZUVycm9yIiwiYXR0cyIsImNsZWFuRG9jcyIsIl9idWxrRG9jcyIsInJlZ2lzdGVyRGVwZW5kZW50RGF0YWJhc2UiLCJkZXBlbmRlbnREYiIsImRiT3B0aW9ucyIsImRlcERCIiwiZGVwZW5kZW50RGJzIiwidXNlUHJlZml4IiwiZGVzdHJveURiIiwiX2Rlc3Ryb3kiLCJsb2NhbERvYyIsImRlbGV0ZWRNYXAiLCJ0cnVlTmFtZSIsIlJlZ0V4cCIsImV4ZWN1dGUiLCJBYm9ydENvbnRyb2xsZXIiLCJhYm9ydCIsImYkMSIsImZldGNoIiwiaCIsIkhlYWRlcnMiLCJldmVudEVtaXR0ZXIiLCJQb3VjaCIsImRlc3RydWN0TGlzdGVuZXJzIiwiX2Rlc3RydWN0aW9uTGlzdGVuZXJzIiwiZGJMaXN0Iiwic2V0VXBFdmVudEVtaXR0ZXIiLCJhZGRUb1ByZWZlcnJlZEFkYXB0ZXJzIiwicGx1Z2luIiwiX19kZWZhdWx0cyIsImRlZmF1bHRzIiwiZGVmYXVsdE9wdHMiLCJQb3VjaEFsdCIsInVybCIsImdldEZpZWxkRnJvbURvYyIsInBhcnNlZEZpZWxkIiwicGFyc2VGaWVsZCIsImZpZWxkTmFtZSIsImZpZWxkcyIsImNvbWJpbmF0aW9uRmllbGRzIiwiaXNDb21iaW5hdGlvbmFsRmllbGQiLCJmaWVsZCIsImdldEtleSIsIm1lcmdlQW5kZWRTZWxlY3RvcnMiLCJzZWxlY3RvcnMiLCIkb3IiLCIkbm9yIiwibWF0Y2hlciIsIiRlcSIsImxvbmdlc3QiLCJmaWVsZE1hdGNoZXJzIiwib3BlcmF0b3IiLCIkZ3RlIiwiJGd0IiwibWVyZ2VHdEd0ZSIsIiRsdGUiLCIkbHQiLCJtZXJnZUx0THRlIiwiJG5lIiwibWVyZ2VOZSIsIm1lcmdlRXEiLCIkcmVnZXgiLCJtZXJnZVJlZ2V4IiwibWFzc2FnZVNlbGVjdG9yIiwid2FzQW5kZWQiLCJpc0FuZEluU2VsZWN0b3IiLCJpc0FuZCIsIm1lcmdlQW5kZWRTZWxlY3RvcnNOZXN0ZWQiLCJvck9yTm9yIiwic3ViU2VsZWN0b3IiLCJjb2xsYXRlIiwibm9ybWFsaXplS2V5IiwiYWkiLCJiaSIsInN0cmluZ0NvbGxhdGUiLCJhcnJheUNvbGxhdGUiLCJhayIsImJrIiwib2JqZWN0Q29sbGF0ZSIsIkluZmluaXR5Iiwib3JpZ0tleSIsInRvSlNPTiIsImluZGV4aWZ5IiwiZXhwRm9ybWF0IiwidG9FeHBvbmVudGlhbCIsIm1hZ25pdHVkZSIsIm5lZyIsIm1hZ1N0cmluZyIsInBhZFdpdGgiLCJ1cFRvTGVuZ3RoIiwidGFyZ2V0TGVuZ3RoIiwicGFkIiwiZmFjdG9yIiwiZmFjdG9yU3RyIiwidG9GaXhlZCIsIm51bVRvSW5kZXhhYmxlU3RyaW5nIiwidG9JbmRleGFibGVTdHJpbmciLCJvYmpLZXkiLCJwYXJzZU51bWJlciIsIm9yaWdpbmFsSWR4IiwibnVtQXNTdHJpbmciLCJtYWdBc1N0cmluZyIsImZpbHRlckluTWVtb3J5RmllbGRzIiwicm93cyIsInJlcXVlc3REZWYiLCJpbk1lbW9yeUZpZWxkcyIsInJvd0ZpbHRlciIsImZpZWxkU29ydGVyIiwiZ2V0RmllbGRWYWx1ZXNBc0FycmF5Iiwic29ydGluZyIsImFSb3ciLCJiUm93IiwiY29sbGF0aW9uIiwiY3JlYXRlRmllbGRTb3J0ZXIiLCJkb2NGaWVsZFZhbHVlIiwic29tZSIsIm9yTWF0Y2hlcnMiLCJtYXRjaENvbWluYXRpb25hbFNlbGVjdG9yIiwibWF0Y2hTZWxlY3RvciIsIm1heWJlVXNlck9wZXJhdG9yIiwidXNlclZhbHVlIiwic3ViUGFyc2VkRmllbGQiLCJzdWJEb2NGaWVsZFZhbHVlIiwidXNlck9wZXJhdG9yIiwibWF0Y2hlcnMiLCJmaWVsZEV4aXN0cyIsImZpZWxkSXNOb3RVbmRlZmluZWQiLCJhcnJheUNvbnRhaW5zVmFsdWUiLCJkb2NGaWVsZFZhbHVlSXRlbSIsIm1vZEZpZWxkIiwibmVWYWx1ZSIsImFycmF5U2l6ZSIsImFycmF5Q29udGFpbnNBbGxWYWx1ZXMiLCJyZWdleFZhbHVlIiwicmVnZXhNYXRjaCIsInR5cGVNYXRjaCIsImZpbHRlck5hbWUiLCJjaGFuZ2VzSGFuZGxlciIsImRvY19pZHMiLCJ2aWV3TmFtZSIsImRkb2MiLCJtYXBGdW4iLCJ2aWV3cyIsInJvd3NNYXRjaGVkIiwibWF0Y2hlc1NlbGVjdG9yIiwiZmlsdGVyRnVuIiwiZmlsdGVycyIsInRvT2JqZWN0IiwidmVyc2lvbiIsInJlc2VydmVkV29yZHMiLCJkYXRhV29yZHMiLCJwYXJzZVJldmlzaW9uSW5mbyIsInBhcnNlRG9jIiwibmV3RWRpdHMiLCJkYk9wdHMiLCJuUmV2TnVtIiwicmV2SW5mbyIsInJldmlzaW9ucyIsInJldmlzaW9uSWRzIiwibWFrZVJldlRyZWVGcm9tUmV2aXNpb25zIiwic3BlY2lhbEtleSIsInByZXByb2Nlc3NTdHJpbmciLCJibG9iVHlwZSIsImFzQmluYXJ5IiwicGFyc2VCYXNlNjQiLCJkaWdlc3QiLCJwcmVwcm9jZXNzQXR0YWNobWVudCIsIm1kNSIsInByZXByb2Nlc3NCbG9iIiwidXBkYXRlRG9jIiwicmV2TGltaXQiLCJwcmV2IiwiZG9jSW5mbyIsIndyaXRlRG9jIiwic3BsaXRSZXYiLCJ0YXJnZXRQb3MiLCJ0YXJnZXRJZCIsInJldkV4aXN0cyIsInByZXZpb3VzV2lubmluZ1JldiIsInByZXZpb3VzbHlEZWxldGVkIiwiaXNSb290IiwibmV3UmV2IiwicmV2X21hcCIsIndpbm5pbmdSZXYkJDEiLCJ3aW5uaW5nUmV2SXNEZWxldGVkIiwiZGVsdGEiLCJwcm9jZXNzRG9jcyIsImRvY0luZm9zIiwiZmV0Y2hlZERvY3MiLCJ0eCIsIm92ZXJhbGxDYWxsYmFjayIsImlkc1RvRG9jcyIsImRvY3NEb25lIiwiZG9jc1RvRG8iLCJjaGVja0FsbERvY3NEb25lIiwiY3VycmVudERvYyIsInJlc3VsdHNJZHgiLCJkb2NXcml0dGVuIiwibmV4dERvYyIsInJvb3RJc01pc3NpbmciLCJpbnNlcnREb2MiLCJET0NfU1RPUkUiLCJNRVRBX1NUT1JFIiwic2FmZUpzb25TdHJpbmdpZnkiLCJqc29uIiwiaWRiRXJyb3IiLCJlbmNvZGVNZXRhZGF0YSIsImRlbGV0ZWRPckxvY2FsIiwiZGVjb2RlTWV0YWRhdGEiLCJzdG9yZWRPYmplY3QiLCJzYWZlSnNvblBhcnNlIiwiZGVjb2RlRG9jIiwiX2RvY19pZF9yZXYiLCJsYXN0SW5kZXhPZiIsInJlYWRCbG9iRGF0YSIsImFzQmxvYiIsImZldGNoQXR0YWNobWVudHNJZk5lY2Vzc2FyeSIsInR4biIsImF0dE9iaiIsIm9iamVjdFN0b3JlIiwib25zdWNjZXNzIiwiZmV0Y2hBdHRhY2htZW50IiwicG9zdFByb2Nlc3NBdHRhY2htZW50cyIsImF0dE5hbWVzIiwiY29tcGFjdFJldnMiLCJwb3NzaWJseU9ycGhhbmVkRGlnZXN0cyIsInNlcVN0b3JlIiwiYXR0U3RvcmUiLCJhdHRBbmRTZXFTdG9yZSIsIklEQktleVJhbmdlIiwiYm91bmQiLCJkZWxldGVPcnBoYW5lZEF0dGFjaG1lbnRzIiwib3BlbkN1cnNvciIsIm9ubHkiLCJjdXJzb3IiLCJkaWdlc3RTZXEiLCJwcmltYXJ5S2V5IiwiY29udGludWUiLCJvcGVuVHJhbnNhY3Rpb25TYWZlbHkiLCJpZGIiLCJzdG9yZXMiLCJ0cmFuc2FjdGlvbiIsImlkYkJ1bGtEb2NzIiwiZG9jU3RvcmUiLCJieVNlcVN0b3JlIiwiYXR0YWNoU3RvcmUiLCJhdHRhY2hBbmRTZXFTdG9yZSIsIm1ldGFTdG9yZSIsImRvY0luZm9FcnJvciIsIm1ldGFEb2MiLCJhbGxEb2NzUHJvY2Vzc2VkIiwiZG9jQ291bnREZWx0YSIsInByZWNvbmRpdGlvbkVycm9yZWQiLCJfbWV0YSIsImJsb2JTdXBwb3J0Iiwib25BbGxEb2NzUHJvY2Vzc2VkIiwidXBkYXRlRG9jQ291bnRJZlJlYWR5IiwiZG9jQ291bnQiLCJuZXdSZXZJc0RlbGV0ZWQiLCJpc1VwZGF0ZSIsImNvbGxlY3RSZXN1bHRzIiwiZmluaXNoRG9jIiwiYXR0YWNobWVudFNhdmVkIiwibmV3QXR0Iiwic2F2ZUF0dGFjaG1lbnQiLCJ3cml0ZUF0dGFjaG1lbnRzIiwiYWZ0ZXJQdXREb2MiLCJyZXZzVG9EZWxldGUiLCJjb21wYWN0VHJlZSIsIm1ldGFkYXRhVG9TdG9yZSIsImFmdGVyUHV0TWV0YWRhdGEiLCJhdHRzQWRkZWQiLCJhdHRzVG9BZGQiLCJvbmVycm9yIiwiaW5zZXJ0QXR0YWNobWVudE1hcHBpbmdzIiwicHV0UmVxIiwib3ZlcmFsbEVyciIsImRvY3YiLCJyZWN2IiwicHJvY2Vzc2VkQXR0YWNobWVudCIsInByZXByb2Nlc3NBdHRhY2htZW50cyIsInR4blJlc3VsdCIsIm9uYWJvcnQiLCJvbnRpbWVvdXQiLCJvbmNvbXBsZXRlIiwiZmluaXNoIiwiZGlnZXN0cyIsImZpbGVuYW1lIiwidmVyaWZ5QXR0YWNobWVudCIsImF0dEVyciIsInZlcmlmeUF0dGFjaG1lbnRzIiwibnVtRmV0Y2hlZCIsInJldnNfbGltaXQiLCJyZWFkTWV0YWRhdGEiLCJmZXRjaEV4aXN0aW5nRG9jcyIsInN0YXJ0VHJhbnNhY3Rpb24iLCJydW5CYXRjaGVkQ3Vyc29yIiwia2V5UmFuZ2UiLCJiYXRjaFNpemUiLCJvbkJhdGNoIiwia2V5c0JhdGNoIiwidmFsdWVzQmF0Y2giLCJwc2V1ZG9DdXJzb3IiLCJvbkdldEFsbCIsIm9uR2V0QWxsS2V5cyIsIm9uQ3Vyc29yIiwiZ2V0QWxsIiwiZ2V0QWxsS2V5cyIsIm5ld0tleVJhbmdlIiwibGFzdEtleSIsInVwcGVyIiwidXBwZXJPcGVuIiwiY29kZSIsImxvd2VyQm91bmQiLCJpZGJBbGxEb2NzIiwia2V5UmFuZ2VFcnJvciIsImluY2x1c2l2ZUVuZCIsImluY2x1c2l2ZV9lbmQiLCJ1cHBlckJvdW5kIiwiY3JlYXRlS2V5UmFuZ2UiLCJvblJlc3VsdHNSZWFkeSIsInVwZGF0ZVNlcSIsIm9uU3VjY2VzcyIsImRvY0lkUmV2SW5kZXgiLCJhbGxEb2NzSW5uZXIiLCJmZXRjaERvY0FzeW5jaHJvbm91c2x5IiwiYmF0Y2hWYWx1ZXMiLCJiYXRjaFZhbHVlIiwiYmF0Y2hLZXlzIiwicmV0dXJuVmFsIiwidG90YWxfcm93cyIsIm1heEtleSIsImFsbERvY3NLZXlzIiwicnVubmluZyIsImFwcGx5TmV4dCIsImRvY0lkcyIsIm51bVJlc3VsdHMiLCJkb2NJZHNUb01ldGFkYXRhIiwib25HZXRNZXRhZGF0YSIsImRvY0lkUmV2Iiwib2JqZWN0U3RvcmVzIiwid2lubmluZ0RvY3MiLCJtZXRhZGF0YXMiLCJmZXRjaFdpbm5pbmdEb2NBbmRNZXRhZGF0YSIsIndpbm5pbmdEb2MiLCJwcm9jZXNzTWV0YWRhdGFBbmRXaW5uaW5nRG9jIiwib25CYXRjaERvbmUiLCJmaWx0ZXJlZCIsImJsb2JTdXBwb3J0UHJvbWlzZSIsImNhY2hlZERCcyIsIm9wZW5SZXFMaXN0IiwiSWRiUG91Y2giLCJ0cnlDb2RlIiwiZW5xdWV1ZVRhc2siLCJ0aGlzQ2FsbGJhY2siLCJpZGJHbG9iYWxGYWlsdXJlRXJyb3IiLCJlbnJpY2hDYWxsYmFja0Vycm9yIiwiYWRkRGVsZXRlZE9yTG9jYWxJbmRleCIsImNyZWF0ZUluZGV4IiwidW5pcXVlIiwibWlncmF0ZUxvY2FsU3RvcmUiLCJsb2NhbFN0b3JlIiwibG9jYWwiLCJyYW5nZSIsInNlcUN1cnNvciIsIm1pZ3JhdGVBdHRzQW5kU2VxcyIsImRpZ2VzdE1hcCIsIm1pZ3JhdGVNZXRhZGF0YSIsIm9uR2V0TWV0YWRhdGFTZXEiLCJtZXRhZGF0YVNlcSIsImZldGNoTWV0YWRhdGFTZXEiLCJpbnN0YW5jZUlkIiwicmVxT3B0cyIsImhpc3RvcnlOb2RlIiwiYXR0YWNoSWQiLCJhdHRhY2htZW50IiwiYmxvYkRhdGEiLCJkb2NfY291bnQiLCJpZGJfYXR0YWNobWVudF9mb3JtYXQiLCJvbGRSZXYiLCJvU3RvcmUiLCJvbGREb2MiLCJvcGVuUmVxIiwiaW5kZXhlZERCIiwiZGVsZXRlRGF0YWJhc2UiLCJjYWNoZWQiLCJnbG9iYWwiLCJvcGVuIiwib251cGdyYWRlbmVlZGVkIiwib2xkVmVyc2lvbiIsImNyZWF0ZU9iamVjdFN0b3JlIiwia2V5UGF0aCIsImF1dG9JbmNyZW1lbnQiLCJjcmVhdGVTY2hlbWEiLCJjdXJyZW50VGFyZ2V0IiwiY3JlYXRlTG9jYWxTdG9yZVNjaGVtYSIsImFkZEF0dGFjaEFuZFNlcVN0b3JlIiwibWlncmF0aW9ucyIsIm1pZ3JhdGlvbiIsIm9udmVyc2lvbmNoYW5nZSIsInN0b3JlZE1ldGFEb2MiLCJjb21wbGV0ZVNldHVwIiwic3RvcmVNZXRhRG9jSWZSZWFkeSIsImluc3RhbmNlS2V5IiwiY291bnREb2NzIiwiYmxvYiQkMSIsIm1hdGNoZWRDaHJvbWUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJtYXRjaGVkRWRnZSIsImNoZWNrQmxvYlN1cHBvcnQiLCJzdXBwb3J0c0J1bGtHZXRNYXAiLCJyZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlciIsImVuY29kZURvY0lkIiwicHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEiLCJnZXRIb3N0IiwicHJvdG9jb2wiLCJoYXNVcmxQcmVmaXgiLCJ1c2VyIiwicGFzc3dvcmQiLCJhdXRoIiwidXNlcm5hbWUiLCJnZW5EQlVybCIsImdlblVybCIsInBhdGhEZWwiLCJob3N0IiwicG9ydCIsInBhcmFtc1RvU3RyIiwiSHR0cFBvdWNoIiwiZGJVcmwiLCJzZXR1cFByb21pc2UiLCJvdXJGZXRjaCIsImhlYWRlcnMiLCJjcmVkZW50aWFscyIsIm5BdXRoIiwidG9rZW4iLCJ1YSIsImlzSUUiLCJpc1RyaWRlbnQiLCJpc0VkZ2UiLCJpc0dFVCIsInNob3VsZENhY2hlQnVzdCIsIm5vdyIsImFkYXB0ZXJGdW4kJDEiLCJzZXR1cCIsImZldGNoSlNPTiIsInYiLCJza2lwX3NldHVwIiwiZW5jb2RlQXR0YWNobWVudElkIiwidXVpZCQkMSIsInBpbmciLCJjb21wYWN0X3J1bm5pbmciLCJpbnRlcnZhbCIsImRvQnVsa0dldCIsImRvQnVsa0dldFNoaW0iLCJudW1CYXRjaGVzIiwib25SZXN1bHQiLCJiYXRjaE51bSIsInN1Yk9wdHMiLCJzdXBwb3J0c0J1bGtHZXQiLCJmZXRjaEF0dGFjaG1lbnRzIiwiZmlsZW5hbWVzIiwicHJvbWlzZUZhY3RvcmllcyIsImRvTmV4dCIsInJ1bk5leHRCYXRjaCIsIm9uRXJyb3IiLCJ0aGlzRXJyIiwicG9vbCIsInR5cGVGaWVsZERlc2NyaXB0b3IiLCJfX3Byb3RvX18iLCJmZXRjaERhdGEiLCJkb2NPckRvY3MiLCJjb250ZW50VHlwZSIsInByb2Nlc3MiLCJicm93c2VyIiwicGFyYW1TdHIiLCJiYXRjaF9zaXplIiwiaGVhcnRiZWF0IiwicmVxdWVzdFRpbWVvdXQiLCJsZWZ0VG9GZXRjaCIsImZlZWQiLCJzZXFfaW50ZXJ2YWwiLCJwYXJhbV9uYW1lIiwibGFzdEZldGNoZWRTZXEiLCJjb250cm9sbGVyIiwiYWJvcnRlZCIsImZldGNoT3B0cyIsInNpZ25hbCIsImZldGNoZWQiLCJyYXdfcmVzdWx0c19sZW5ndGgiLCJmaW5pc2hlZCIsIlF1ZXJ5UGFyc2VFcnJvciIsImNhcHR1cmVTdGFja1RyYWNlIiwiTm90Rm91bmRFcnJvciIsIkJ1aWx0SW5FcnJvciIsInByb21pc2VkQ2FsbGJhY2siLCJzZXF1ZW50aWFsaXplIiwicHJvbWlzZUZhY3RvcnkiLCJ1bmlxIiwidGhlU2V0IiwibWFwVG9LZXlzQXJyYXkiLCJjcmVhdGVCdWlsdEluRXJyb3IiLCJzdW0iLCJqTGVuIiwiak51bSIsImV2YWxGdW5jdGlvbldpdGhFdmFsIiwiVGFza1F1ZXVlJDEiLCJjcmVhdGVWaWV3Iiwic291cmNlREIiLCJyZWR1Y2VGdW4iLCJ0ZW1wb3JhcnkiLCJsb2NhbERvY05hbWUiLCJjYWNoZWRWaWV3cyIsInZpZXdTaWduYXR1cmUiLCJjcmVhdGVWaWV3U2lnbmF0dXJlIiwiX2NhY2hlZFZpZXdzIiwicHJvbWlzZUZvclZpZXciLCJkZXBEYk5hbWUiLCJmdWxsVmlld05hbWUiLCJkZXBEYnMiLCJsYXN0U2VxRG9jIiwicGVyc2lzdGVudFF1ZXVlcyIsInRlbXBWaWV3UXVldWUiLCJwYXJzZVZpZXdOYW1lIiwiZW1pdEVycm9yIiwiYnVpbHRJblJlZHVjZSIsInN1bXNxciIsIl9zdW1zcXIiLCJhYnN0cmFjdCIsIm1hcHBlciIsInJlZHVjZXIiLCJkZG9jVmFsaWRhdG9yIiwidHJ5TWFwIiwidHJ5UmVkdWNlIiwicmVyZWR1Y2UiLCJvdXRwdXQiLCJzb3J0QnlLZXlUaGVuVmFsdWUiLCJrZXlDb21wYXJlIiwic2xpY2VSZXN1bHRzIiwicm93VG9Eb2NJZCIsInBvc3Rwcm9jZXNzQXR0YWNobWVudHMiLCJhZGRIdHRwUGFyYW0iLCJwYXJhbU5hbWUiLCJhc0pzb24iLCJjb2VyY2VJbnRlZ2VyIiwiaW50ZWdlckNhbmRpZGF0ZSIsImFzTnVtYmVyIiwiY2hlY2tRdWVyeVBhcnNlRXJyb3IiLCJzdGFydGtleU5hbWUiLCJlbmRrZXlOYW1lIiwiZ3JvdXBfbGV2ZWwiLCJvcHRpb25OYW1lIiwibnVtYmVyIiwiY2hlY2tQb3NpdGl2ZUludGVnZXIiLCJkZWZhdWx0c1RvIiwiZ2V0RG9jc1RvUGVyc2lzdCIsImRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzIiwibWV0YURvY0lkIiwiZGVmYXVsdE1ldGFEb2MiLCJkb2NEYXRhIiwiaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzIiwiaXNHZW5PbmUiLCJnZXRLZXlWYWx1ZURvY3MiLCJrdkRvY3NSZXMiLCJrdkRvY3MiLCJvbGRLZXlzIiwia2V5VmFsdWUiLCJuZXdLZXlzIiwia3ZEb2MiLCJwcm9jZXNzS2V5VmFsdWVEb2NzIiwiZ2V0UXVldWUiLCJ1cGRhdGVWaWV3IiwibWFwUmVzdWx0cyIsImN1cnJlbnRTZXEiLCJsaXN0T2ZEb2NzVG9QZXJzaXN0IiwiZG9jc1RvUGVyc2lzdCIsInNhdmVLZXlWYWx1ZXMiLCJpbmRleGVkX2RvY3MiLCJwcm9ncmVzcyIsInByb2Nlc3NOZXh0QmF0Y2giLCJjaGFuZ2VzX2JhdGNoX3NpemUiLCJjcmVhdGVJbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMiLCJjcmVhdGVEb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyIsInJlc3VsdHNfY291bnQiLCJlbWl0dGVkS2V5VmFsdWUiLCJjb21wbGV4S2V5IiwidXBkYXRlVmlld0luUXVldWUiLCJxdWVyeVZpZXciLCJ0b3RhbFJvd3MiLCJzaG91bGRSZWR1Y2UiLCJmZXRjaEZyb21WaWV3Iiwidmlld09wdHMiLCJleHBlY3RlZEtleXMiLCJwYXJzZWRLZXlBbmREb2NJZCIsInBhcnNlZFN0ciIsInBhcnNlSW5kZXhhYmxlU3RyaW5nIiwib25NYXBSZXN1bHRzUmVhZHkiLCJmaW5hbFJlc3VsdHMiLCJzaG91bGRHcm91cCIsImx2bCIsIlBPU0lUSVZFX0lORklOSVRZIiwibGFzdCIsImdyb3VwS2V5IiwicmVkdWNlVHJ5IiwicmVkdWNlVmlldyIsImFsbERvY3NSZXMiLCJkb2NJZHNUb0RvY3MiLCJmZXRjaFByb21pc2VzIiwia2V5U3RhcnQiLCJrZXlFbmQiLCJxdWVyeVZpZXdJblF1ZXVlIiwicXVlcnlQcm9taXNlZCIsIl9xdWVyeSIsImN1c3RvbVF1ZXJ5Iiwia2V5c0FzU3RyaW5nIiwiaHR0cFF1ZXJ5IiwidXBkYXRlVmlld09wdHMiLCJ2aWV3X3VwZGF0ZV9jaGFuZ2VzX2JhdGNoX3NpemUiLCJmaW5hbFByb21pc2VGYWN0b3J5IiwiZGVzaWduRG9jTmFtZSIsInN0YWxlIiwiY29lcmNlT3B0aW9ucyIsInZpZXdDbGVhbnVwIiwiX3ZpZXdDbGVhbnVwIiwiY3VzdG9tVmlld0NsZWFudXAiLCJodHRwVmlld0NsZWFudXAiLCJkb2NzVG9WaWV3cyIsInZpZXdzVG9TdGF0dXMiLCJkZG9jTmFtZSIsInZpZXdEQk5hbWVzIiwic3RhdHVzSXNHb29kIiwidmlld0RCTmFtZSIsImRlc3Ryb3lQcm9taXNlcyIsImxvY2FsVmlld0NsZWFudXAiLCJjcmVhdGVBYnN0cmFjdE1hcFJlZHVjZSIsIm9yaWdNYXAiLCJyZWR1Y2VGdW5TdHJpbmciLCJidWlsdEluIiwiZ2V0QnVpbHRJbiIsIm1hcHJlZHVjZSIsImlzR2VuT25lJDEiLCJnZXREb2NBdHRhY2htZW50cyIsImdldERvY3MiLCJzcmMiLCJkaWZmcyIsInJlc3VsdERvY3MiLCJmZXRjaFJldmlzaW9uT25lRG9jcyIsImhhc0NvbmZsaWN0cyIsImJ1bGtHZXRPcHRzIiwibWlzc2luZ1JldiIsImNyZWF0ZUJ1bGtHZXRPcHRzIiwiYnVsa0dldFJlc3BvbnNlIiwiYnVsa0dldEluZm8iLCJyZW1vdGVEb2MiLCJkb0NoZWNrRm9yTG9jYWxBdHRhY2htZW50cyIsImZpbGVIYXNDaGFuZ2VkIiwiZ2V0RG9jQXR0YWNobWVudHNGcm9tVGFyZ2V0T3JTb3VyY2UiLCJ1cGRhdGVDaGVja3BvaW50IiwiY2hlY2twb2ludCIsInNlc3Npb24iLCJyZXR1cm5WYWx1ZSIsInNlc3Npb25faWQiLCJyZXBsaWNhdG9yIiwiQ2hlY2twb2ludGVyIiwid3JpdGVDaGVja3BvaW50IiwidXBkYXRlVGFyZ2V0IiwidXBkYXRlU291cmNlIiwid3JpdGVUYXJnZXRDaGVja3BvaW50Iiwid3JpdGVTb3VyY2VDaGVja3BvaW50IiwiaXNGb3JiaWRkZW5FcnJvciIsImNvbXBhcmlzb25zIiwidGFyZ2V0RG9jIiwic291cmNlRG9jIiwic3JjRG9jIiwidGd0RG9jIiwiY29tcGFyZVJlcGxpY2F0aW9uSGlzdG9yeSIsInNvdXJjZUhpc3RvcnkiLCJ0YXJnZXRIaXN0b3J5IiwiUyIsInNvdXJjZVJlc3QiLCJUIiwidGFyZ2V0UmVzdCIsImhhc1Nlc3Npb25JZCIsImNvbXBhcmVSZXBsaWNhdGlvbkxvZ3MiLCJzZXNzaW9uSWQiLCJwcm9wcyIsInJlc3QiLCJmbG9vciIsImdldENoZWNrcG9pbnQiLCJnZW5lcmF0ZVJlcGxpY2F0aW9uSWQiLCJxdWVyeVBhcmFtcyIsImZpbHRlclZpZXdOYW1lIiwic29ydE9iamVjdFByb3BlcnRpZXNCeUtleSIsInF1ZXJ5RGF0YSIsIm1kNXN1bSIsInJlcGxpY2F0ZSIsImN1cnJlbnRCYXRjaCIsInJlcElkIiwiY2hlY2twb2ludGVyIiwiYmF0Y2hlcyIsInBlbmRpbmdCYXRjaCIsIndyaXRpbmdDaGVja3BvaW50IiwiY2hhbmdlc0NvbXBsZXRlZCIsInJlcGxpY2F0aW9uQ29tcGxldGVkIiwiYmF0Y2hlc19saW1pdCIsImNoYW5nZXNQZW5kaW5nIiwiY2hhbmdlZERvY3MiLCJzdGFydF90aW1lIiwiZG9jc19yZWFkIiwiZG9jc193cml0dGVuIiwiZG9jX3dyaXRlX2ZhaWx1cmVzIiwiZXJyb3JzIiwiaW5pdENoZWNrcG9pbnRlciIsImNoZWNrcG9pbnRPcHRzIiwid3JpdGVEb2NzIiwiYnVsa09wdHMiLCJjb21wbGV0ZVJlcGxpY2F0aW9uIiwiZXJyb3JzQnlJZCIsImVycm9yc05vIiwiZXJyb3JOYW1lIiwiZmluaXNoQmF0Y2giLCJvdXRSZXN1bHQiLCJnZXRDaGFuZ2VzIiwib25DaGVja3BvaW50RXJyb3IiLCJnZXRCYXRjaERvY3MiLCJnb3QiLCJzdGFydE5leHRCYXRjaCIsImFib3J0UmVwbGljYXRpb24iLCJwcm9jZXNzUGVuZGluZ0JhdGNoIiwiaW1tZWRpYXRlJCQxIiwiZmF0YWxFcnJvciIsImVuZF90aW1lIiwicmV0cnkiLCJiYWNrX29mZl9mdW5jdGlvbiIsImJhY2tPZmZTZXQiLCJjdXJyZW50X2JhY2tfb2ZmIiwiYmFja09mZiIsIm9uQ2hhbmdlc0NvbXBsZXRlIiwib25DaGFuZ2VzRXJyb3IiLCJfYWJvcnRDaGFuZ2VzIiwiYWJvcnRDaGFuZ2VzIiwic3RhcnRDaGFuZ2VzIiwiX2FkZGVkTGlzdGVuZXJzIiwiUmVwbGljYXRpb24iLCJ0b1BvdWNoIiwiUG91Y2hDb25zdHJ1Y3RvciIsInJlcGxpY2F0ZVdyYXBwZXIiLCJyZXBsaWNhdGVSZXQiLCJTeW5jIiwiY2FuY2VsZWQiLCJvcHRzUHVzaCIsIm9wdHNQdWxsIiwicHVsbCIsInB1bGxDaGFuZ2UiLCJwdXNoQ2hhbmdlIiwicHVzaERlbmllZCIsInB1bGxEZW5pZWQiLCJwdXNoUGF1c2VkIiwicHVsbFBhdXNlZCIsInB1c2hBY3RpdmUiLCJwdWxsQWN0aXZlIiwicmVtb3ZlZCIsInJlbW92ZUFsbCIsImFkZE9uZUxpc3RlbmVyIiwib3V0IiwiY2xlYW51cCIsIl9yZWFkeUNhbGxlZCIsInJlcGxpY2F0ZU1ldGhvZHMiLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0IiwiZGVmYXVsdFNldFRpbW91dCIsImRlZmF1bHRDbGVhclRpbWVvdXQiLCJydW5UaW1lb3V0IiwiZHJhaW5RdWV1ZSIsIm1hcmtlciIsInJ1bkNsZWFyVGltZW91dCIsIm5vb3AiLCJlbnYiLCJhcmd2IiwidmVyc2lvbnMiLCJiaW5kaW5nIiwiY3dkIiwiY2hkaXIiLCJkaXIiLCJ1bWFzayIsIl9ub2RlSWQiLCJfY2xvY2tzZXEiLCJfbGFzdE1TZWNzIiwiX2xhc3ROU2VjcyIsImNsb2Nrc2VxIiwic2VlZEJ5dGVzIiwibXNlY3MiLCJuc2VjcyIsImR0IiwidGwiLCJ0bWgiLCJnZW5lcmF0ZVVVSUQiLCJuYW1lc3BhY2UiLCJzdHJpbmdUb0J5dGVzIiwiaGFzaGZ1bmMiLCJETlMiLCJVUkwiLCJnZXRPdXRwdXRMZW5ndGgiLCJpbnB1dExlbmd0aDgiLCJzYWZlQWRkIiwibHN3IiwibWQ1Y21uIiwicSIsImNudCIsIm1kNWZmIiwibWQ1Z2ciLCJtZDVoaCIsIm1kNWlpIiwidjM1IiwibGVuZ3RoMzIiLCJtZDVUb0hleEVuY29kZWRBcnJheSIsIm9sZGEiLCJvbGRiIiwib2xkYyIsIm9sZGQiLCJ3b3Jkc1RvTWQ1IiwibGVuZ3RoOCIsIlVpbnQzMkFycmF5IiwiYnl0ZXNUb1dvcmRzIiwiZiIsInoiLCJST1RMIiwiSyIsIkgiLCJOIiwiTSIsIl9pIiwicG93IiwiX2kyIiwiVyIsIl90IiwiX3QyIiwiY3JlYXRlU2hpZnRBcnIiLCJzdGVwIiwic3BhY2UiLCJpeCIsInZrYmVhdXRpZnkiLCJpc1N1YnF1ZXJ5IiwicGFyZW50aGVzaXNMZXZlbCIsInNwbGl0X3NxbCIsInRhYiIsInhtbCIsImFyIiwiaW5Db21tZW50IiwiZGVlcCIsImNzcyIsInNxbCIsImFyX2J5X3F1b3RlIiwieG1sbWluIiwicHJlc2VydmVDb21tZW50cyIsImpzb25taW4iLCJjc3NtaW4iLCJzcWxtaW4iLCJjb25maXJtIiwic3BsaXREaXNhYmxlIiwiY2FwdHVyZSIsImNsaWNrYXdheUhhbmRsZXIiLCJyZXNldEhhbmRsZXIiLCJuY0lkIiwicXVldWVNaWNyb3Rhc2siLCJNdXRhdGlvbiIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJXZWJLaXRNdXRhdGlvbk9ic2VydmVyIiwiaGFuZGxlIiwib2JzZXJ2ZXIiLCJjcmVhdGVUZXh0Tm9kZSIsIm9ic2VydmUiLCJjaGFyYWN0ZXJEYXRhIiwiTWVzc2FnZUNoYW5uZWwiLCJjaGFubmVsIiwicG9ydDEiLCJvbm1lc3NhZ2UiLCJwb3J0MiIsInBvc3RNZXNzYWdlIiwic2NyaXB0RWwiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZW1vdmVDaGlsZCIsImRvY3VtZW50RWxlbWVudCIsIm1laSIsIm1hbmlmZXN0IiwibG9jYWxNYW5pZmVzdCIsIm1laVByb21pc2UiLCJtZWlSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwiYmdQcm9taXNlIiwiYmdSZWFkZXIiLCJtZWlVcmkiLCJiZ1VyaSIsInNpbmdsZSIsImFsZXJ0IiwibmV3TmFtZSIsIm1hbmlmZXN0QmxvYiIsIm1hbmlmZXN0VGV4dCIsIm5ld01hbmlmZXN0QmxvYiIsImRvY3VtZW50c0NvbnRhaW5lciIsImJhY2tncm91bmRBcmVhIiwib3BlbkJ1dHRvbiIsInJlbW92ZUJ1dHRvbiIsIm5hdlBhdGhDb250YWluZXIiLCJiYWNrQnV0dG9uIiwiZW1wdHlCdXR0b24iLCJkZWxldGVCdXR0b24iLCJ1cGxvYWREb2N1bWVudHNCdXR0b24iLCJuZXdGb2xkZXJCdXR0b24iLCJzaGlmdFNlbGVjdGlvbiIsIlNoaWZ0U2VsZWN0aW9uTWFuYWdlciIsImZzbSIsImRhc2hib2FyZFN0YXRlIiwibWFpblNlY3Rpb24iLCJjb250ZXh0TWVudSIsImNvbnRleHRNZW51Q29udGVudFdyYXBwZXIiLCJtZXRhS2V5SXNQcmVzc2VkIiwic2hpZnRLZXlJc1ByZXNzZWQiLCJjdXJyZW50RHJhZ1RhcmdldCIsInJpZ2h0Q2xpY2tlZCIsIm9wZW5VcGxvYWRBcmVhSGFuZGxlciIsIkluaXRVcGxvYWRBcmVhIiwiZ2V0UGFyZW50Rm9sZGVyIiwib3BlbkVkaXRvclRhYiIsImlzU2FtcGxlIiwic3RvcmFnZSIsImVudHJ5IiwiZ2V0RW50cmllcyIsInNldFNlbGVjdGlvbiIsInVuc2VsZWN0QWxsIiwidGlsZSIsInJlc2V0U2VsZWN0aW9uIiwiYWRkVGlsZUV2ZW50TGlzdGVuZXIiLCJ1cGRhdGVEYXNoYm9hcmQiLCJnZXRGb2xkZXJQYXRoIiwib3BlbkRvY3NIYW5kbGVyIiwiX2UiLCJzaGlmdFNlbGVjdGlvbkhhbmRsZXIiLCJhZGRTaGlmdFNlbGVjdGlvbkxpc3RlbmVyIiwiZ2V0U2VsZWN0ZWRFbnRyaWVzIiwic2hvd0NvbnRleHRNZW51IiwiY2xpY2tlZEVsZW1lbnQiLCJjbGlja2VkRW50cnkiLCJnZXRFbnRyeUJ5SWQiLCJnZXRJbmRleEJ5RW50cnlOYW1lIiwiYWRkU3BlY2lmaWNDb250ZXh0TWVudUxpc3RlbmVycyIsImdldFNlbGVjdGlvbiIsInNldFN0YXJ0IiwiZ2V0UHJldlNlbGVjdGlvbiIsInNldEVuZCIsInVwZGF0ZUFjdGlvbkJhckJ1dHRvbnMiLCJ1cGRhdGVGU0J1dHRvbnMiLCJnZXRTZWxlY3RlZEZvbGRlcnMiLCJnZXRTZWxlY3RlZFRyYXNoIiwiZ2V0U2VsZWN0ZWRGaWxlcyIsImRvY3VtZW50VHlwZSIsIm9wZW5GaWxlIiwicmVtb3ZlRG9jc0hhbmRsZXIiLCJzZWxlY3RlZEVudHJpZXMiLCJwYXJlbnRGb2xkZXIiLCJ0cmFzaEZvbGRlciIsImdldFRyYXNoRm9sZGVyIiwiZGF0ZXRpbWUiLCJ0b0xvY2FsZVN0cmluZyIsImFkZE1ldGFkYXRhIiwicmVtb3ZlZF9vbiIsInJlY292ZXJfZm9sZGVyIiwiZ2V0Rm9sZGVyUGF0aE5hbWVzIiwibW92ZVRvRm9sZGVyIiwiZGVsZXRlRmlsZUVudHJ5IiwiZmlsZSIsImRlbGV0ZURvY3VtZW50IiwicmVtb3ZlRW50cnkiLCJkZWxldGVGb2xkZXJFbnRyeSIsImZvbGRlciIsImRlbGV0ZVByb21pc2VzIiwiZGVsZXRlRG9jc0hhbmRsZXIiLCJhbGxFbnRyaWVzIiwiYWxlcnRNZXNzYWdlIiwiZW50cnlBcnJheSIsImRlYnVnIiwiZW1wdHlUcmFzaEhhbmRsZXIiLCJpc0luVHJhc2giLCJidXR0b25DbG9uZSIsImNsb25lTm9kZSIsInJlcGxhY2VDaGlsZCIsImhhbmRsZU5hdmlnYXRlQmFjayIsImFkZERyb3BUYXJnZXRMaXN0ZW5lcnMiLCJ1cGRhdGVCYWNrQnV0dG9uIiwidXBkYXRlRW1wdHlCdXR0b24iLCJ1cGRhdGVEZWxldGVCdXR0b24iLCJuZXdQYXRoIiwic2V0Rm9sZGVyUGF0aCIsImN1cnJlbnRGb2xkZXIiLCJzZXRFbnRyaWVzIiwiaWNvbiIsImNyZWF0ZVRpbGUiLCJuYXZFbGVtZW50cyIsIm5hdlNlY3Rpb24iLCJ0YXJnZXRQYXRoIiwibmF2RWxlbWVudCIsInNlcGVyYXRvciIsInVwZGF0ZU5hdlBhdGgiLCJpbmZvQmFkZ2UiLCJkYXRhVHJhbnNmZXIiLCJlZmZlY3RBbGxvd2VkIiwic2V0RmlsZVN5c3RlbSIsImRlc3RpbmF0aW9uRm9sZGVyIiwiZHJhZ0VudHJ5IiwiY3JlYXRlSGFuZGxlRHJvcCIsIm5ld0ZvbGRlciIsImVycm9yTWVzc2FnZXMiLCJ0cmFzaEZOQ29uZmxpY3RIYW5kbGVyIiwiY2FuTW92ZUVudHJ5Iiwic3VjY2VlZGVkIiwibW92ZUVudHJ5Iiwib3Blbk1vdmVUb1dpbmRvdyIsInJvb3RUcmVlIiwibW92ZVRvQ2FsbGJhY2siLCJnZW5lcmF0ZUZvbGRlclRyZWUiLCJkZWdyZWUiLCJsaUNvbnRhaW5lciIsImZvbGRlck5hbWUiLCJ1bCIsImFycm93IiwiZm9sZGVyVHJlZSIsImdlbmVyYXRlUm9vdFRyZWUiLCJuZXdQYXJlbnRGb2xkZXIiLCJ0cmVlQ29udGFpbmVyIiwibW9kYWxDb250YWluZXIiLCJvcGVuTmV3Rm9sZGVyV2luZG93IiwiaW5wdXRDb250YWluZXIiLCJjYW5jZWxCdXR0b24iLCJwbGFjZWhvbGRlciIsImNvbmZpcm1OZXdGb2xkZXJBY3Rpb24iLCJuYW1lRXhpc3RzIiwibmV3Rm9sZGVyVGlsZSIsImNyZWF0ZUZvbGRlciIsImFkZEVudHJ5IiwiaGFuZGxlQWRkRm9sZGVyIiwib3BlblJlbmFtZVdpbmRvdyIsInByZXZOYW1lIiwiY29uZmlybVJlbmFtZUFjdGlvbiIsInJlbmFtZUVudHJ5IiwidXBkYXRlRG9jTmFtZSIsIm51bWJlck9mU2VsZWN0ZWRGaWxlcyIsIm51bWJlck9mU2VsZWN0ZWRGb2xkZXJzIiwic2VsZWN0ZWRUcmFzaCIsImNvbnRleHRNZW51Q29udGVudCIsInRyYXNoRW50cnlPcHRpb25zIiwic2V0Q29udGV4dE1lbnVJdGVtc0V2ZW50TGlzdGVuZXJzIiwibXVsdGlGaWxlT3B0aW9ucyIsImZvbGRlckFuZEZpbGVPcHRpb25zIiwibXVsdGlGb2xkZXJPcHRpb25zIiwic2luZ2xlRm9sZGVyT3B0aW9ucyIsInNpbmdsZUZpbGVPcHRpb25zIiwidHJhc2hGb2xkZXJPcHRpb25zIiwiZGVmYXVsdE9wdGlvbnMiLCJkZWxldGVCdG4iLCJyZW5hbWVCdG4iLCJtb3ZlQnRuIiwidXBkYXRlRG9jQnRuIiwibmV3Rm9sZGVyQnRuIiwidG9wIiwiYnRuQ2xhc3NuYW1lIiwiZm9sZGVyUGF0aE5hbWVzIiwidGFyZ2V0Rm9sZGVyIiwiZ2V0Rm9sZGVyUGF0aEJ5TmFtZXMiLCJyZW1vdmVNZXRhZGF0YSIsImRhdGVUaW1lUGF0dGVybiIsInB1dEJhY2tEb2NzSGFuZGxlciIsInVwZGF0ZVRyYXNoIiwibmV3VHJhc2giLCJjdXJyZW50RGF0ZSIsInRoaXJ0eURheXNBZ28iLCJnZXRUaW1lIiwidG9EZWxldGUiLCJzaGlmdEtleSIsImxvYWREYXNoYm9hcmQiLCJnZXRSb290IiwiY3JlYXRlRW50cnkiLCJGaWxlIiwiY2FuQWRkRW50cnkiLCJpc0ltbXV0YWJsZSIsInJldHVybk9iaiIsImNhblJlbW92ZUVudHJ5IiwiZXhpc3RzSW5QYXJlbnQiLCJmaW5kSW5kZXgiLCJpc0ltbXV0YWJsZVBhcmVudCIsImlzSW1tdXRhYmxlRW50cnkiLCJuZXdQYXJlbnQiLCJpc1NhbWUiLCJpc0ltbXV0YWJsZU5ld1BhcmVudCIsIm5ld1BhcmVudElzQ2hpbGRPZkVudHJ5IiwiRm9sZGVyIiwiaXNDaGlsZE9mIiwiY2FuUmVuYW1lRW50cnkiLCJsb2NhbGVDb21wYXJlIiwiY3JlYXRlVHJhc2giLCJUcmFzaCIsImNyZWF0ZUZpbGUiLCJtb3ZlUmVzcG9uc2UiLCJnZXRBbGxOYW1lcyIsImdldEZpbGVTeXN0ZW0iLCJmcyIsInNhbXBsZUVudHJpZXMiLCJzYW1wbGVzIiwiaW1tdXRhYmxlIiwic2FtcGxlc0ZvbGRlciIsInNhbXBsZSIsImxvYWRTYW1wbGVzIiwidXBsb2FkcyIsImZldGNoVXBsb2FkcyIsInVwbG9hZCIsImxvYWRQcmV2aW91c1VwbG9hZHMiLCJwcmV2U2VsZWN0aW9uIiwib3JkZXJlZFNlbGVjdGlvbiIsInNwZWNpZmljU2VsZWN0aW9uIiwib3JkZXJlZEVudHJpZXMiLCJmb2xkZXJQYXRoIiwiX3Jvb3QiLCJyb290Rm9sZGVyIiwiYm9vbCIsImZvbGRlck5hbWVzIiwicGFpckJ1dHRvbiIsInVwbG9hZEJ1dHRvbiIsImhhbmRsZU1ha2VQYWlyIiwic3Bpbm5lciIsImhhbmRsZVVwbG9hZEFsbERvY3VtZW50cyIsInN1Y2Nlc3NmdWxGaWxlcyIsImhhbmRsZVVwbG9hZFVwZGF0ZSIsImZpbGVTZWxlY3RvciIsIm11bHRpcGxlIiwiZmlsZUxpc3QiLCJmaWxlcyIsInJlamVjdEZpbGVzIiwiYWRkTmV3RmlsZXMiLCJ1cGxvYWRfYXJlYSIsIm9uZHJhZ2xlYXZlIiwib25kcmFnb3ZlciIsImRyb3BFZmZlY3QiLCJvbmRyb3AiLCJzb3J0QnlOYW1lQnRuIiwic29ydEZpbGVCeU5hbWUiLCJmbSIsImdldEluc3RhbmNlIiwiY3JlYXRlVW5wYWlyZWRJdGVtIiwicmFkaW9OYW1lIiwicmFkaW8iLCJsYWJlbCIsImZvcm1hdEZpbGVuYW1lIiwiZGVsQnRuIiwibWF4TGVuIiwiY2h1bmtMZW4iLCJmbkNvbmZsaWN0SGFuZGxlciIsImV4aXN0aW5nTmFtZXMiLCJuZXdGaWxlbmFtZSIsImNvdW50ZXIiLCJpbmNsdWRlcyIsInNldE1laVRlbXBsYXRlIiwibWVpX2NvbnRhaW5lciIsImltYWdlX2NvbnRhaW5lciIsImV4dCIsInVucGFpcmVkSXRlbSIsImFkZEZpbGUiLCJwYWlyZWRfY29udGFpbmVyIiwic2VsZWN0ZWRNZWlFbGVtZW50Iiwic2VsZWN0ZWRJbWFnZUVsZW1lbnQiLCJtZWlfZmlsZW5hbWUiLCJpbWFnZV9maWxlbmFtZSIsImlzQ3JlYXRlZCIsImZuIiwiZ2V0SW1nRGltZW5zaW9uIiwiZGltZW5zaW9ucyIsInN0YWZmU3BhY2UiLCJuZXdNZWlGaWxlIiwiY3JlYXRlTWVpRmlsZSIsInBhaXJlZF9lbCIsImZvbGlvIiwiZm9saW9fZmlsZW5hbWUiLCJoYW5kbGVVbnBhaXIiLCJpc0NyZWF0ZWRGb2xpbyIsInJlbW92ZUZvbGlvIiwibWVpSXRlbSIsImltYWdlSXRlbSIsInVucGFpckJ0biIsImNyZWF0ZVBhaXJlZEZvbGlvIiwiYWRkRm9saW8iLCJnZXRGb2xpb3MiLCJpbWFnZSIsImNyZWF0ZU1hbmlmZXN0IiwiYWRkRG9jdW1lbnQiLCJmaWxlRW50cnkiLCJmb2xpb0VudHJ5IiwiY3JlYXRlZF9vbiIsInVwbG9hZEZvbGlvIiwiY2xlYXIiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJmaWxlRWxlbWVudHMiLCJpc0FzY2VuZGluZyIsIm5hbWVBIiwibmFtZUIiLCJVcGxvYWRGaWxlTWFuYWdlciIsImFsbEZpbGVzIiwiZm9saW9zIiwiaW5zdGFuY2UiLCJ1cGRhdGVkRW50cnkiLCJnZXRGaWxlQ291bnQiLCJuZXdFbnRyeSIsInRlbXBsYXRlUGF0aCIsIm1laVRlbXBsYXRlIiwiRE9NUGFyc2VyIiwic2VyaWFsaXplciIsIlhNTFNlcmlhbGl6ZXIiLCJtZWlEb2MiLCJwYXJzZUZyb21TdHJpbmciLCJzdXJmYWNlIiwic3VyZmFjZUlkIiwiem9uZSIsInpvbmVJZCIsIm1hcmdpblJhdGVWIiwibWFyZ2luUmF0ZUgiLCJtYXJnaW5WIiwibWFyZ2luSCIsInBiIiwic2IiLCJtZWlGaWxlQ29udGVudCIsInNlcmlhbGl6ZVRvU3RyaW5nIiwibWVpQmxvYiIsImltZ0ZpbGUiLCJnZXRGaWxlIiwib25sb2FkIiwiaW1nIiwiSW1hZ2UiLCJjYW52YXMiLCJnZXRDb250ZXh0Iiwid2lsbFJlYWRGcmVxdWVudGx5IiwiZHJhd0ltYWdlIiwiaW1hZ2VEYXRhIiwiZ2V0SW1hZ2VEYXRhIiwiYmluYXJ5VmFsdWUiLCJwdXRJbWFnZURhdGEiLCJ3aGl0ZVJ1bkxlbmd0aHMiLCJjdXJyU3BhY2VDb3VudCIsImZpbmRTZWNvbmRNb2RlIiwiY291bnRNYXAiLCJuZXdGb2xpbyJdLCJtYXBwaW5ncyI6ImFBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVUMsUUFHbkMsSUFBSUMsRUFBU0osRUFBaUJFLEdBQVksQ0FDekNHLEVBQUdILEVBQ0hJLEdBQUcsRUFDSEgsUUFBUyxJQVVWLE9BTkFJLEVBQVFMLEdBQVVNLEtBQUtKLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNGLEdBRy9ERyxFQUFPRSxHQUFJLEVBR0pGLEVBQU9ELFFBS2ZGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixFQUFTUyxFQUFNQyxHQUMzQ1osRUFBb0JhLEVBQUVYLEVBQVNTLElBQ2xDRyxPQUFPQyxlQUFlYixFQUFTUyxFQUFNLENBQUVLLFlBQVksRUFBTUMsSUFBS0wsS0FLaEVaLEVBQW9Ca0IsRUFBSSxTQUFTaEIsR0FDWCxvQkFBWGlCLFFBQTBCQSxPQUFPQyxhQUMxQ04sT0FBT0MsZUFBZWIsRUFBU2lCLE9BQU9DLFlBQWEsQ0FBRUMsTUFBTyxXQUU3RFAsT0FBT0MsZUFB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d0IsS0FBSzA2RSxVQUNqQi8zRSxRQUFReXRCLElBQUlwd0IsS0FBSzI2RSxTQUtyQixVQUFlRixHLHdQQ2pTRixFQUFBakosZUFDVCx5Y0FVUyxFQUFBRixrQkFDVCxpM0JBa0JTLEVBQUFKLGlCQUNULG9wQkFjUyxFQUFBQyxxQkFDVCxzYkFVUyxFQUFBRSxvQkFDVCxpM0JBa0JTLEVBQUFELG1CQUNULDZiQVVTLEVBQUFHLG1CQUNULG9PQU1TLEVBQUFQLGtCQUNUIiwiZmlsZSI6ImRhc2hib2FyZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA4OCk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xubW9kdWxlLmV4cG9ydHMub25jZSA9IG9uY2U7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIEVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZiBhbmQgb25seSBpZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBlcnJvckxpc3RlbmVyKGVycikge1xuICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihuYW1lLCByZXNvbHZlcik7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlcigpIHtcbiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIH07XG5cbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgcmVzb2x2ZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAobmFtZSAhPT0gJ2Vycm9yJykge1xuICAgICAgYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgZXJyb3JMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIGxpc3RlbmVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgZW1pdHRlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBFdmVudFRhcmdldCBkb2VzIG5vdCBoYXZlIGBlcnJvcmAgZXZlbnQgc2VtYW50aWNzIGxpa2UgTm9kZVxuICAgIC8vIEV2ZW50RW1pdHRlcnMsIHdlIGRvIG5vdCBsaXN0ZW4gZm9yIGBlcnJvcmAgZXZlbnRzIGhlcmUuXG4gICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lcihhcmcpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgYnVpbHRpbiBgeyBvbmNlOiB0cnVlIH1gIHN1cHBvcnQgc28gd2VcbiAgICAgIC8vIGhhdmUgdG8gZG8gaXQgbWFudWFsbHkuXG4gICAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgd3JhcExpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVyKGFyZyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiZW1pdHRlclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTtcbiAgfVxufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHR5cGVzID0gW1xuICByZXF1aXJlKCcuL25leHRUaWNrJyksXG4gIHJlcXVpcmUoJy4vcXVldWVNaWNyb3Rhc2snKSxcbiAgcmVxdWlyZSgnLi9tdXRhdGlvbi5qcycpLFxuICByZXF1aXJlKCcuL21lc3NhZ2VDaGFubmVsJyksXG4gIHJlcXVpcmUoJy4vc3RhdGVDaGFuZ2UnKSxcbiAgcmVxdWlyZSgnLi90aW1lb3V0Jylcbl07XG52YXIgZHJhaW5pbmc7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIHNjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgfVxuICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgbmV4dFRpY2soKTtcbiAgfVxufVxuXG4vL25hbWVkIG5leHRUaWNrIGZvciBsZXNzIGNvbmZ1c2luZyBzdGFjayB0cmFjZXNcbmZ1bmN0aW9uIG5leHRUaWNrKCkge1xuICBpZiAoZHJhaW5pbmcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc2NoZWR1bGVkID0gZmFsc2U7XG4gIGRyYWluaW5nID0gdHJ1ZTtcbiAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gIHdoaWxlIChsZW4pIHtcbiAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICBxdWV1ZSA9IFtdO1xuICAgIHdoaWxlIChjdXJyZW50UXVldWUgJiYgKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgfVxuICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gIH1cbiAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgcXVldWVJbmRleCA9IC0xO1xuICBkcmFpbmluZyA9IGZhbHNlO1xuICBjbGVhclRpbWVvdXQodGltZW91dCk7XG59XG52YXIgc2NoZWR1bGVEcmFpbjtcbnZhciBpID0gLTE7XG52YXIgbGVuID0gdHlwZXMubGVuZ3RoO1xud2hpbGUgKCsraSA8IGxlbikge1xuICBpZiAodHlwZXNbaV0gJiYgdHlwZXNbaV0udGVzdCAmJiB0eXBlc1tpXS50ZXN0KCkpIHtcbiAgICBzY2hlZHVsZURyYWluID0gdHlwZXNbaV0uaW5zdGFsbChuZXh0VGljayk7XG4gICAgYnJlYWs7XG4gIH1cbn1cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICB0aGlzLmZ1biA9IGZ1bjtcbiAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZnVuID0gdGhpcy5mdW47XG4gIHZhciBhcnJheSA9IHRoaXMuYXJyYXk7XG4gIHN3aXRjaCAoYXJyYXkubGVuZ3RoKSB7XG4gIGNhc2UgMDpcbiAgICByZXR1cm4gZnVuKCk7XG4gIGNhc2UgMTpcbiAgICByZXR1cm4gZnVuKGFycmF5WzBdKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBmdW4oYXJyYXlbMF0sIGFycmF5WzFdKTtcbiAgY2FzZSAzOlxuICAgIHJldHVybiBmdW4oYXJyYXlbMF0sIGFycmF5WzFdLCBhcnJheVsyXSk7XG4gIGRlZmF1bHQ6XG4gICAgcmV0dXJuIGZ1bi5hcHBseShudWxsLCBhcnJheSk7XG4gIH1cblxufTtcbm1vZHVsZS5leHBvcnRzID0gaW1tZWRpYXRlO1xuZnVuY3Rpb24gaW1tZWRpYXRlKHRhc2spIHtcbiAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICB9XG4gIHF1ZXVlLnB1c2gobmV3IEl0ZW0odGFzaywgYXJncykpO1xuICBpZiAoIXNjaGVkdWxlZCAmJiAhZHJhaW5pbmcpIHtcbiAgICBzY2hlZHVsZWQgPSB0cnVlO1xuICAgIHNjaGVkdWxlRHJhaW4oKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgR3JvdXBpbmdUeXBlLCBTZWxlY3Rpb25UeXBlLCBVc2VyVHlwZSwgSW5zZXJ0VHlwZSwgSW5zZXJ0VGFiVHlwZSB9IGZyb20gJy4uL1R5cGVzJztcblxuLyoqXG4gKiBUaGUgb25lIGluc3RhbmNlIG9mIExvY2FsU2V0dGluZ3MgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYW5kXG4gKiB1c2VkIGJ5IHRoZSBlZGl0b3IuXG4gKiBcbiAqIFVzZSB0aGUgZnVuY3Rpb25zIGBnZXRTZXR0aW5ncygpYCBhbmQgYHNldFNldHRpbmdzKClgXG4gKiB0byBhY2Nlc3MgdGhpcyBpbnN0YW5jZS5cbiAqL1xubGV0IGxvY2FsU2V0dGluZ3M6IExvY2FsU2V0dGluZ3MgPSBudWxsO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgdGhlIHNldHRpbmdzIGZvciBlYWNoIGZvbGlvXG4gKiBzdG9yZWQgaW4gbG9jYWxTdG9yYWdlLlxuICpcbiAqIEV2ZXJ5IGtleSBpcyBvcHRpb25hbCBzbyB0aGF0IHRoaXMgc2FtZSB0eXBpbmdcbiAqIGNhbiBiZSB1c2VkIGZvciBgc2V0U2V0dGluZ3MoKWAgLyBgTG9jYWxTZXR0aW5ncy5zZXQoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xuICB6b29tOiBudW1iZXI7XG4gIGdseXBoT3BhY2l0eTogbnVtYmVyO1xuICBpbWFnZU9wYWNpdHk6IG51bWJlcjtcbiAgY2lyY2xlU2l6ZTogbnVtYmVyO1xuICBoaWdobGlnaHRNb2RlOiBHcm91cGluZ1R5cGU7XG4gIHVzZXJNb2RlOiBVc2VyVHlwZTtcbiAgaW5zZXJ0TW9kZTogSW5zZXJ0VHlwZTtcbiAgaW5zZXJ0VGFiOiBJbnNlcnRUYWJUeXBlO1xuICBzZWxlY3Rpb25Nb2RlOiBTZWxlY3Rpb25UeXBlO1xuICBkZWJ1Z01vZGU6IGJvb2xlYW47XG4gIGRpc3BsYXlCQm94OiBib29sZWFuO1xuICBkaXNwbGF5VGV4dDogYm9vbGVhbjtcbiAgZGlzcGxheUluZm86IGJvb2xlYW47XG4gIGRpc3BsYXlFcnJMb2c6IGJvb2xlYW47XG4gIHZpZXdCb3g6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHNldHRpbmdzLCB3aGljaCBzaG91bGQgYmUgc2V0IGZvciBhIGZvbGlvIHdpdGggbm9cbiAqIGxvY2FsU3RvcmFnZSB2YWx1ZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSB1cGRhdGVkIGFsb25nc2lkZSB0aGUgaW50ZXJmYWNlIGBTZXR0aW5nc2BcbiAqIGFueSB0aW1lIHdlIHdhbnQgdG8gYWRkIGEgbmV3IHNldHRpbmcgdG8gc3RvcmUgaW4gbG9jYWxTdG9yYWdlLlxuICovXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBTZXR0aW5ncyA9IHtcbiAgem9vbTogMTAwLFxuICBnbHlwaE9wYWNpdHk6IDEwMCxcbiAgaW1hZ2VPcGFjaXR5OiAxMDAsXG4gIGNpcmNsZVNpemU6IDI1LFxuICBoaWdobGlnaHRNb2RlOiAnbm9uZScsXG4gIHVzZXJNb2RlOiAnZWRpdCcsXG4gIGluc2VydE1vZGU6ICdwdW5jdHVtJyxcbiAgaW5zZXJ0VGFiOiAncHJpbWl0aXZlVGFiJyxcbiAgc2VsZWN0aW9uTW9kZTogJ3NlbEJ5U3lsbGFibGUnLFxuICBkZWJ1Z01vZGU6IGZhbHNlLFxuICBkaXNwbGF5QkJveDogZmFsc2UsXG4gIGRpc3BsYXlUZXh0OiBmYWxzZSxcbiAgZGlzcGxheUluZm86IGZhbHNlLFxuICBkaXNwbGF5RXJyTG9nOiBmYWxzZSxcbiAgdmlld0JveDogbnVsbFxufTtcblxuY2xhc3MgTG9jYWxTZXR0aW5ncyB7XG4gIGlkOiBzdHJpbmc7XG4gIHNldHRpbmdzOiBTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvciAoZm9saW9JZDogc3RyaW5nKSB7XG4gICAgbG9jYWxTZXR0aW5ncyA9IHRoaXM7XG4gICAgdGhpcy5pZCA9IGZvbGlvSWQ7XG4gICAgdGhpcy5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBzZXR0aW5ncyBmcm9tIGxvY2FsU3RvcmFnZSwgYW5kIHN5bmMgbG9hZGVkIHNldHRpbmdzIHdpdGhcbiAgICogbmV3IGZpZWxkcyB0aGF0IG1heSBub3QgYmUgaW4gbG9jYWxTdG9yYWdlLlxuICAgKi9cbiAgbG9hZCAoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZDogUGFydGlhbDxTZXR0aW5ncz4gPSBKU09OLnBhcnNlKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmlkKSk7XG4gICAgICB0aGlzLnN5bmMoc3RvcmVkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIHZhbHVlIGlzIG5vdCBhIEpTT04gb2JqZWN0IChmb3IgaW5zdGFuY2UsIGFuIGVtcHR5IHN0cmluZyksXG4gICAgICAvLyBhIFN5bnRheEVycm9yIHdpbGwgYmUgdGhyb3duLiBXZSBtdXN0IGhhbmRsZSBpdCBieSBjYWxsaW5nIHN5bmMoKVxuICAgICAgLy8gd2l0aCBhbiBlbXB0eSBKU09OIG9iamVjdC5cbiAgICAgIHRoaXMuc3luYyh7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBuZXcgZmllbGRzIGluIGxvY2FsU3RvcmFnZSwgYXMgYSBcInVuaW9uXCIgb2Ygb2xkIGFuZCBuZXcgc2V0dGluZ3MuXG4gICAqL1xuICBzZXQgKHBhcmFtczogUGFydGlhbDxTZXR0aW5ncz4pOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzID0geyAuLi50aGlzLnNldHRpbmdzLCAuLi5wYXJhbXMgfTtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXR0aW5ncykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmMgc2V0dGluZ3MgdGhhdCBtYXkgbm90IGJlIGluY2x1ZGVkIGluIHVzZXIncyBsb2NhbFN0b3JhZ2UsXG4gICAqIHN1Y2ggYXMgZmllbGRzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIGxvY2FsU3RvcmFnZSBpbiBhIG5ld1xuICAgKiB1cGRhdGUgb2YgTmVvbi5cbiAgICovXG4gIHN5bmMgKHN0b3JlZDogUGFydGlhbDxTZXR0aW5ncz4pOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzID0geyAuLi5ERUZBVUxUX1NFVFRJTkdTLCAuLi5zdG9yZWQgfTtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXR0aW5ncykpO1xuICB9XG59XG5cbi8qKlxuICogR2V0IGxvY2FsU3RvcmFnZSBzZXR0aW5ncyBmb3IgdGhlIGZvbGlvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MgKCk6IFNldHRpbmdzIHtcbiAgcmV0dXJuIGxvY2FsU2V0dGluZ3Muc2V0dGluZ3M7XG59XG5cbi8qKlxuICogU2V0IHNwZWNpZmljIGxvY2FsU3RvcmFnZSBzZXR0aW5ncyBmb3IgdGhlIGZvbGlvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2V0dGluZ3MgKHBhcmFtczogUGFydGlhbDxTZXR0aW5ncz4pOiB2b2lkIHtcbiAgbG9jYWxTZXR0aW5ncy5zZXQocGFyYW1zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9jYWxTZXR0aW5ncztcbiIsImltcG9ydCAqIGFzIENvbG9yIGZyb20gJy4vQ29sb3InO1xuaW1wb3J0IHsgdXBkYXRlSGlnaGxpZ2h0IH0gZnJvbSAnLi4vRGlzcGxheVBhbmVsL0Rpc3BsYXlDb250cm9scyc7XG5pbXBvcnQgKiBhcyBHcm91cGluZyBmcm9tICcuLi9TcXVhcmVFZGl0L0dyb3VwaW5nJztcbmltcG9ydCB7IHJlc2l6ZSB9IGZyb20gJy4vUmVzaXplJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIFNlbGVjdGlvblR5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4vRHJhZ0hhbmRsZXInO1xuaW1wb3J0ICogYXMgU2VsZWN0T3B0aW9ucyBmcm9tICcuLi9TcXVhcmVFZGl0L1NlbGVjdE9wdGlvbnMnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBzZWxlY3Rpb24gbW9kZSBjaG9zZW4gYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25UeXBlKCk6IFNlbGVjdGlvblR5cGUge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsLWJ5IGlzLWFjdGl2ZScpO1xuICBpZiAoZWxlbWVudC5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gZWxlbWVudFswXS5pZCBhcyBTZWxlY3Rpb25UeXBlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogVW5zZWxlY3QgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGFuZCBydW4gdW5kbyBhbnkgZXh0cmFcbiAqIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNlbGVjdCgpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvckFsbCgnLm5vLW1vdmluZycpXG4gICAgLmZvckVhY2goKHNlbGVjdGVkOiBTVkdHRWxlbWVudCkgPT4gc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnbm8tbW92aW5nJykpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKS5mb3JFYWNoKChzZWxlY3RlZDogU1ZHR0VsZW1lbnQpID0+IHtcbiAgICBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgIGlmIChzZWxlY3RlZC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgIHNlbGVjdGVkLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgIENvbG9yLnVuaGlnaGxpZ2h0KHNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgc2VsZWN0ZWQuc3R5bGUuZmlsbCA9ICcnO1xuICAgIH1cblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChcbiAgICAgIChkaXZMaW5lOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBkaXZMaW5lLnN0eWxlLnN0cm9rZSA9ICcnO1xuICAgICAgICBkaXZMaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykpLmZvckVhY2goXG4gICAgICAobmV1bWU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIG5ldW1lLnN0eWxlLmZpbGwgPSAnJztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKSkuZm9yRWFjaChcbiAgICAgIChzeWxSZWN0OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBzeWxSZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJykpIHtcbiAgICAgIHNlbGVjdGVkLnBhcmVudEVsZW1lbnQuc3R5bGUuZmlsbCA9ICcnO1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzeWxsYWJsZScpO1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzeWxsYWJsZS1oaWdobGlnaHRlZCcpO1xuXG4gICAgICBBcnJheS5mcm9tKHNlbGVjdGVkLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChcbiAgICAgICAgKGRpdkxpbmU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgZGl2TGluZS5zdHlsZS5zdHJva2UgPSAnJztcbiAgICAgICAgICBkaXZMaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUnKSkuZm9yRWFjaChcbiAgICAgICAgKG5ldW1lOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgIG5ldW1lLnN0eWxlLmZpbGwgPSAnJztcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZDMuc2VsZWN0QWxsKCcjcmVzaXplUmVjdCcpLnJlbW92ZSgpO1xuICAgIGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcucm90YXRlUG9pbnQnKS5yZW1vdmUoKTtcbiAgfSk7XG5cbiAgQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGV4dC1zZWxlY3QnKSkuZm9yRWFjaChcbiAgICAoZWw6IFNWR0VsZW1lbnQpID0+IHtcbiAgICAgIGVsLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICBlbC5zdHlsZS5mb250V2VpZ2h0ID0gJyc7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCd0ZXh0LXNlbGVjdCcpO1xuICAgIH0sXG4gICk7XG5cbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICBHcm91cGluZy5lbmRHcm91cGluZ1NlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIFNlbGVjdE9wdGlvbnMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICB9XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gIHVwZGF0ZUhpZ2hsaWdodCgpO1xufVxuXG4vKipcbiAqIFNlbGVjdCBhIHN0YWZmIGVsZW1lbnQuXG4gKiBAcGFyYW0gc3RhZmYgLSBUaGUgc3RhZmYgZWxlbWVudCBpbiB0aGUgRE9NLlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gVGhlIGRyYWcgaGFuZGxlciBpbiB1c2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RTdGFmZihcbiAgc3RhZmY6IFNWR0dFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCFzdGFmZi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBzdGFmZi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIENvbG9yLnVuaGlnaGxpZ2h0KHN0YWZmKTtcbiAgICBDb2xvci5oaWdobGlnaHQoc3RhZmYsICcjZDAwJyk7XG4gICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zKCk7XG4gICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbGVjdCBhIGxheWVyIGVsZW1lbnQuXG4gKiBAcGFyYW0gbGF5ZXJFbGVtZW50IC0gVGhlIGxheWVyIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAqIEBwYXJhbSBkcmFnSGFuZGxlciAtIFRoZSBkcmFnIGhhbmRsZXIgaW4gdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0TGF5ZXJFbGVtZW50KFxuICBsYXllckVsZW1lbnQ6IFNWR0dFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCFsYXllckVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgbGF5ZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgQ29sb3IudW5oaWdobGlnaHQobGF5ZXJFbGVtZW50KTtcbiAgICBDb2xvci5oaWdobGlnaHQobGF5ZXJFbGVtZW50LCAnI2QwMCcpO1xuICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmljIHNlbGVjdCBmdW5jdGlvbi5cbiAqIEBwYXJhbSBlbCAtIEVsZW1lbnQgdG8gc2VsZWN0LlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gT25seSB1c2VkIGZvciBzdGF2ZXMuXG4gKiBAcGFyYW0gbmVlZHNIaWdobGlnaHRVcGRhdGUgLSBXaGV0aGVyIGFsbCB0aGUgZ3JvdXAncyBoaWdobGlnaHRzIHNob3VsZCBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoXG4gIGVsOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIGRyYWdIYW5kbGVyPzogRHJhZ0hhbmRsZXIsXG4gIG5lZWRzSGlnaGxpZ2h0VXBkYXRlID0gdHJ1ZSxcbik6IHZvaWQge1xuICAvLyBJZiBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCBleGl0XG4gIGlmICghZWwpIHJldHVybjtcblxuICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFmZicpKSB7XG4gICAgcmV0dXJuIHNlbGVjdFN0YWZmKGVsLCBkcmFnSGFuZGxlcik7XG4gIH1cbiAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbGF5ZXInKSkge1xuICAgIHJldHVybiBzZWxlY3RMYXllckVsZW1lbnQoZWwsIGRyYWdIYW5kbGVyKTtcbiAgfVxuXG4gIGlmIChcbiAgICAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpICYmXG4gICAgIWVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsVGV4dFJlY3QnKSAmJlxuICAgICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bFRleHRSZWN0LWRpc3BsYXknKVxuICApIHtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIC8vIHNldCBmaWxsIHRvIHJlZFxuICAgIC8vIHNldCBzdHJva2UgdG8gcmVkIG9ubHkgaWYgc2VsZWN0ZWQgZWxlbSBpcyBhIGRpdkxpbmVcbiAgICBlbC5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgIGVsLnN0eWxlLnN0cm9rZSA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpID8gJyNkMDAnIDogJ2JsYWNrJztcblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLmxlbmd0aCkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKS5mb3JFYWNoKFxuICAgICAgICAoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBlbGVtLnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZGl2TGluZScpLmxlbmd0aCkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBlbGVtLnN0eWxlLnN0cm9rZSA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZScpLmZvckVhY2goKGVsZW06IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGVsZW0uc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFNldCBjb2xvciBvZiB0aGUgY29ycmVzcG9uZGluZyB0ZXh0IGluIHRoZSB0ZXh0IHBhbmVsIHRvIHJlZFxuICAgIGxldCBzeWxJZDtcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSB7XG4gICAgICBzeWxJZCA9IGVsLmlkO1xuICAgIH0gZWxzZSBpZiAoZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykgIT09IG51bGwpIHtcbiAgICAgIHN5bElkID0gZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykuaWQ7XG4gICAgfVxuICAgIGlmIChzeWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzcGFucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uJyArIHN5bElkKTtcbiAgICAgIHNwYW5zLmZvckVhY2goKHNwYW46IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnI2QwMCc7XG4gICAgICAgIHNwYW4uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LXNlbGVjdCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChuZWVkc0hpZ2hsaWdodFVwZGF0ZSkge1xuICAgIHVwZGF0ZUhpZ2hsaWdodCgpO1xuICB9XG59XG5cbi8qKlxuICogU2VsZWN0IGFuIG5jLlxuICogQHBhcmFtIGVsIC0gVGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdE5jcyhcbiAgZWw6IFNWR0dyYXBoaWNzRWxlbWVudCxcbiAgbmVvblZpZXc6IE5lb25WaWV3LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFlbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQgYXMgdW5rbm93biBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgdW5zZWxlY3QoKTtcbiAgICBzZWxlY3QocGFyZW50KTtcbiAgICBpZiAoYXdhaXQgaXNMaWdhdHVyZShwYXJlbnQsIG5lb25WaWV3KSkge1xuICAgICAgY29uc3QgcHJldk5jID0gcGFyZW50LnByZXZpb3VzU2libGluZyBhcyB1bmtub3duIGFzIFNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICAgIGlmIChhd2FpdCBpc0xpZ2F0dXJlKHByZXZOYywgbmVvblZpZXcpKSB7XG4gICAgICAgIHNlbGVjdChwcmV2TmMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dE5jID0gcGFyZW50Lm5leHRTaWJsaW5nIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICBpZiAoYXdhaXQgaXNMaWdhdHVyZShuZXh0TmMsIG5lb25WaWV3KSkge1xuICAgICAgICAgIHNlbGVjdChuZXh0TmMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3I6IE5laXRoZXIgcHJldiBvciBuZXh0IG5jIGFyZSBsaWdhdHVyZXMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCdsaWdhdHVyZScpO1xuICAgIH0gZWxzZSBpZiAocGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnbmMnKSkge1xuICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTmNBY3Rpb25zKHBhcmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gYWN0aW9uIHRyaWdnZXJlZCEnKTtcbiAgICB9XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBuYyAtIFRoZSBuZXVtZSBjb21wb25lbnQuXG4gKiBAcGFyYW0gbmVvblZpZXcgLSBUaGUgW1tOZW9uVmlld11dIGZvciB0aGlzIGluc3RhbmNlLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbmV1bWUgY29tcG9uZW50IGlzIHBhcnQgb2YgYSBsaWdhdHVyZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzTGlnYXR1cmUoXG4gIG5jOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVzID0gYXdhaXQgbmVvblZpZXcuZ2V0RWxlbWVudEF0dHIoXG4gICAgbmMuaWQsXG4gICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICApO1xuICByZXR1cm4gQm9vbGVhbihhdHRyaWJ1dGVzLmxpZ2F0ZWQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGxpc3Qgb2YgZWxlbWVudHMgb2YgYSBjZXJ0YWluIHR5cGUgYXJlIGxvZ2ljYWxseSBhZGphY2VudCB0byBlYWNoIG90aGVyLlxuICogSW5jbHVkZXMgZWxlbWVudHMgdGhhdCBhcmUgb24gc2VwYXJhdGUgc3RhdmVzIGJ1dCB3b3VsZCBvdGhlcndpc2UgYmUgbmV4dCB0byBlYWNoIG90aGVyLlxuICogQ2FuIG5vdCBhcHBseSB0byBlbGVtZW50cyBvZiB0eXBlIG5ldW1lIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB1c2VyIHNlbGVjdGlvbiBtb2RlXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIG9mIGludGVyZXN0XG4gKiBAcmV0dXJucyB0cnVlIGlmIGVsZW1lbnRzIGFyZSBhZGphY2VudCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVBZGphY2VudChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgLy8gMiBlbGVtZW50cyBjYW5ub3QgYmUgYWRqYWNlbnQgaWYgdGhlcmUgaXMgb25seSAxIGVsZW1lbnRcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcblxuICAvLyBnZXQgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgc2VsZWN0aW9uVHlwZVxuICBsZXQgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGU6IEhUTUxFbGVtZW50W107XG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUgPSBBcnJheS5mcm9tKFxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUnKSxcbiAgICAgICk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgLy8gV2UgYXV0b21hdGljYWxseSByZXR1cm4gJ3RydWUnIGZvciBuZXVtZXMgYmVjYXVzZSB3ZSB3YW50IHRoZSB1c2VyIHRvIGJlXG4gICAgICAvLyBhbGxvd2VkIHRvIGdyb3VwIHR3byBuZXVtZXMgaW4gc2VwYXJhdGUgc3lsbGFiZXMgd2l0aG91dCBoYXZpbmcgdG8gcGFyZm9ybSBvdGhlclxuICAgICAgLy8gc3RlcHMgZmlyc3QuIFllcywgdGhlcmUgaXMgYSB0cmFkZS1vZmYgLSB0aGlzIGFsbG93cyB1c2VycyB0byB0cnkgYW5kIGdyb3VwIGFueVxuICAgICAgLy8gdHdvIG5vbi1hZGphY2VudCBuZXVtZXMsIGJ1dCBpdCB3YXMgZGVjaWRlZCB0aGF0IHRoZSBiZW5lZml0cyAoc3BlZWQgYW5kIGVmZmljaWVuY3kpXG4gICAgICAvLyBvdXR3ZWlnaCB0aGUgY29zdHMgKHVzZXIgdHJ5aW5nIGFuIGlsbGVnYWwgZWRpdCkuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYycpKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gU29ydCBTRUxFQ1RFRCBlbGVtZW50cyBpbiBvcmRlciBvZiBhcHBlYXJhbmNlIGJ5XG4gIC8vIG1hdGNoaW5nIHRvIG9yZGVyIG9mIEFMTCBlbGVtZW50cyBvZiBzZWxlY3Rpb24gdHlwZVxuICBjb25zdCBzb3J0ZWRFbGVtZW50cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlW2ldLmlzU2FtZU5vZGUoZWxlbWVudHNbal0pKSB7XG4gICAgICAgIHNvcnRlZEVsZW1lbnRzLnB1c2goZWxlbWVudHNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyBjaGVjayBpZiBTRUxFQ1RFRCBlbGVtZW50cyBhcmUgYWxsIGFkamFjZW50IChpbiBhIHJvdykgYnlcbiAgLy8gZmluZGluZyBhbmQgY29tcGFyaW5nIHRoZWlyIGluZGVjZXMgaW4gdGhlIGFycmF5IG9mIEFMTCBlbGVtZW50cyBvZiBzZWxlY3Rpb24gdHlwZVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGZpcnN0RWxlbSA9IHNvcnRlZEVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IHNlY29uZEVsZW0gPSBzb3J0ZWRFbGVtZW50c1tpICsgMV07XG5cbiAgICBjb25zdCBpbmRleDEgPSBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZS5pbmRleE9mKGZpcnN0RWxlbSk7XG4gICAgY29uc3QgaW5kZXgyID0gYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUuaW5kZXhPZihzZWNvbmRFbGVtKTtcblxuICAgIGlmIChNYXRoLmFicyhpbmRleDEgLSBpbmRleDIpICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgdGhlIGFycmF5IG9mIGVsZW1lbnRzIGFsbCBzaGFyZSB0aGUgc2FtZSBsb2dpY2FsIHBhcmVudC5cbiAqIEZvciBleGFtcGxlOiBJZiBhbGwgbmV1bWVzIGFyZSBpbiB0aGUgc2FtZSBzeWxsYWJsZS5cbiAqXG4gKiBOb3RlISEgVGhlcmUgaXMgY3VycmVudGx5IG5vIGxvZ2ljIGZvciB0cmVhdGluZyBsYXllciBlbGVtZW50cyBhbmQgYmJveGVzIVxuICogTm90ZSEhIEZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlIGZvciBzdGF2ZSBlbGVtZW50cy4gKFNob3VsZCBpdD8/PylcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB0aGUgY3VycmVudCBOZW9uIHNlbGVjdGlvbiBtb2RlXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIGluIHF1ZXN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBlbGVtZW50cyBzaGFyZSB0aGUgc2FtZSBsb2dpY2FsIHBhcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkTG9naWNhbFBhcmVudChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgZWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgKGVsZW0pID0+XG4gICAgICAhKFxuICAgICAgICBlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpIHx8XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpIHx8XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdjbGVmJylcbiAgICAgICksXG4gICk7XG5cbiAgaWYgKCFlbGVtZW50c0hhdmVDb3JyZWN0VHlwZShzZWxlY3Rpb25UeXBlLCBlbGVtZW50cykpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeVN5bGxhYmxlJzpcbiAgICAgIGNvbnN0IHJlZmVyZW5jZVBhcmVudFN0YWZmID0gZWxlbWVudHNbMF0uY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50c1tpXTtcbiAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmlzU2FtZU5vZGUocmVmZXJlbmNlUGFyZW50U3RhZmYpKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBjb25zdCByZWZlcmVuY2VQYXJlbnRTeWxsYWJsZSA9IGVsZW1lbnRzWzBdLmNsb3Nlc3QoJy5zeWxsYWJsZScpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbGVtID0gZWxlbWVudHNbaV07XG4gICAgICAgIGlmICghZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKS5pc1NhbWVOb2RlKHJlZmVyZW5jZVBhcmVudFN5bGxhYmxlKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjdXJyZW50IHNlbGVjdGlvbiBtb2RlLlxuICogRm9yIGV4YW1wbGUsIGNoZWNrIGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgb2YgdHlwZSBuZXVtZSwgb3Igc3lsbGFibGUsIGV0Yy5cbiAqXG4gKiBOb3RlISEgVGhlcmUgaXMgbm8gbG9naWMgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBsYXllciBlbGVtZW50cyBvciBiYm94ZXMuXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvblR5cGUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG1vZGVcbiAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdGhhdCBhcmUgYmVpbmcgY2hlY2tlZFxuICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgZWxlbWVudHMgbWF0Y2ggc2VsZWN0aW9uIG1vZGUsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVsZW1lbnRzSGF2ZUNvcnJlY3RUeXBlKFxuICBzZWxlY3Rpb25UeXBlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiBTVkdHcmFwaGljc0VsZW1lbnRbXSxcbik6IGJvb2xlYW4ge1xuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICBpZiAoIWVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGlmICghZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeVN0YWZmJzpcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgaWYgKCFlbGVtLmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZWxlbWVudHMgLSBUaGUgZWxlbWVudHMgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgcGFyZW50IHVwIHR3byBsZXZlbHMsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZFNlY29uZExldmVsUGFyZW50KFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdGVtcEVsZW1lbnRzID0gQXJyYXkuZnJvbShlbGVtZW50cyk7XG4gIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRlbXBFbGVtZW50cy5wb3AoKTtcbiAgY29uc3Qgc2Vjb25kUGFyZW50ID0gZmlyc3RFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRlbXBFbGVtZW50cykge1xuICAgIGNvbnN0IHNlY1BhciA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIGlmIChzZWNQYXIuaWQgIT09IHNlY29uZFBhcmVudC5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB1c2VyIHNlbGVjdGVkIGVsZW1lbnRzIGFjY3Jvc3MgbXVsdGlwbGUgc3RhdmVzXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIHVzZXItc2VsZWN0ZWQgZWxlbWVudHNcbiAqIEByZXR1cm5zIHRydWUgaWYgc2VsZWN0aW9uIGlzIGFjY3Jvc3MgbXVsdGlwbGUgc3RhdmVzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlTdGF2ZVNlbGVjdGlvbihlbGVtZW50czogU1ZHRWxlbWVudFtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IGVsZW1lbnRzQXJyYXkgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFmZiA9IGVsZW1lbnRzQXJyYXlbaV0uY2xvc2VzdCgnLnN0YWZmJyk7XG5cbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IGVsZW1lbnRzQXJyYXkubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGFub3RoZXJTdGFmZiA9IGVsZW1lbnRzQXJyYXlbal0uY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgICAvLyBjb21wYXJlIHdpdGggb3RoZXIgc3RhdmVzXG4gICAgICBpZiAoIXN0YWZmLmlzU2FtZU5vZGUoYW5vdGhlclN0YWZmKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEJvdW5kaW5nIGJveCBvYmplY3QgaW50ZXJmYWNlIGZvciBnZXRTdGFmZkJCb3goKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWZmQkJveCB7XG4gIGlkOiBzdHJpbmc7XG4gIHVseDogbnVtYmVyO1xuICB1bHk6IG51bWJlcjtcbiAgbHJ4OiBudW1iZXI7XG4gIGxyeTogbnVtYmVyO1xuICByb3RhdGU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGJvdW5kaW5nIGJveCBvZiBhIHN0YWZmIGJhc2VkIG9uIGl0cyBzdGFmZiBsaW5lcy5cbiAqIFJvdGF0ZSBpcyBpbmNsdWRlZCBpbiByYWRpYW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhZmZCQm94KHN0YWZmOiBTVkdHRWxlbWVudCk6IFN0YWZmQkJveCB7XG4gIGxldCB1bHgsIHVseSwgbHJ4LCBscnksIHJvdGF0ZTtcbiAgc3RhZmYucXVlcnlTZWxlY3RvckFsbCgncGF0aCcpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBjb25zdCBjb29yZGluYXRlczogbnVtYmVyW10gPSBwYXRoXG4gICAgICAuZ2V0QXR0cmlidXRlKCdkJylcbiAgICAgIC5tYXRjaCgvXFxkKy9nKVxuICAgICAgLm1hcCgoZWxlbWVudCkgPT4gTnVtYmVyKGVsZW1lbnQpKTtcbiAgICBpZiAocm90YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvdGF0ZSA9IE1hdGguYXRhbihcbiAgICAgICAgKGNvb3JkaW5hdGVzWzNdIC0gY29vcmRpbmF0ZXNbMV0pIC8gKGNvb3JkaW5hdGVzWzJdIC0gY29vcmRpbmF0ZXNbMF0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodWx5ID09PSB1bmRlZmluZWQgfHwgTWF0aC5taW4oY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKSA8IHVseSkge1xuICAgICAgdWx5ID0gTWF0aC5taW4oY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKTtcbiAgICB9XG4gICAgaWYgKHVseCA9PT0gdW5kZWZpbmVkIHx8IGNvb3JkaW5hdGVzWzBdIDwgdWx4KSB7XG4gICAgICB1bHggPSBjb29yZGluYXRlc1swXTtcbiAgICB9XG4gICAgaWYgKGxyeSA9PT0gdW5kZWZpbmVkIHx8IE1hdGgubWF4KGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1szXSkgPiBscnkpIHtcbiAgICAgIGxyeSA9IE1hdGgubWF4KGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1szXSk7XG4gICAgfVxuICAgIGlmIChscnggPT09IHVuZGVmaW5lZCB8fCBjb29yZGluYXRlc1syXSA+IGxyeCkge1xuICAgICAgbHJ4ID0gY29vcmRpbmF0ZXNbMl07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBpZDogc3RhZmYuaWQsIHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlIH07XG59XG5cbi8qKlxuICogc2VsZWN0IGEgYm91bmRpbmdib3ggZWxlbWVudFxuICogQHBhcmFtIGVsIC0gdGhlIGJib3ggKHN5bFRleHRSZWN0KSBlbGVtZW50IGluIHRoZSBET01cbiAqIEBwYXJhbSBkcmFnSGFuZGxlciAtIHRoZSBkcmFnIGhhbmRsZXIgaW4gdXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCQm94KFxuICBlbDogU1ZHR3JhcGhpY3NFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbik6IHZvaWQge1xuICBjb25zdCBiYm94ID0gZWw7XG4gIGNvbnN0IHN5bCA9IGJib3guY2xvc2VzdCgnLnN5bCcpO1xuICBpZiAoIXN5bC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBzeWwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICBiYm94LnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgY29uc3QgY2xvc2VzdCA9IGVsLmNsb3Nlc3QoJy5zeWxsYWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNsb3Nlc3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICBjbG9zZXN0LmNsYXNzTGlzdC5hZGQoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJyk7XG4gICAgaWYgKGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5sZW5ndGgpIHtcbiAgICAgIGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgICAgfSk7XG4gICAgICBjbG9zZXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5zdHJva2UgPSAnI2QwMCc7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobmVvblZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzaXplKHN5bCBhcyBTVkdHcmFwaGljc0VsZW1lbnQsIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChkcmFnSGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICAgIH1cbiAgICBjb25zdCBzeWxJZCA9IGVsLmNsb3Nlc3QoJy5zeWxsYWJsZScpLmlkO1xuICAgIGlmIChzeWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzcGFuOiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzcGFuLicgKyBzeWxJZCk7XG4gICAgICBpZiAoc3Bhbikge1xuICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyNkMDAnO1xuICAgICAgICBzcGFuLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgndGV4dC1zZWxlY3QnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyQkJveEFjdGlvbnMoKTtcbn1cblxuLyoqXG4gKiBTZWxlY3Qgbm90IG5ldW1lIGVsZW1lbnRzLlxuICogQHBhcmFtIG5vdE5ldW1lcyAtIEFuIGFycmF5IG9mIG5vdCBuZXVtZXMgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RObihub3ROZXVtZXM6IFNWR0dyYXBoaWNzRWxlbWVudFtdKTogYm9vbGVhbiB7XG4gIGlmIChub3ROZXVtZXMubGVuZ3RoID4gMCkge1xuICAgIG5vdE5ldW1lcy5mb3JFYWNoKChubikgPT4ge1xuICAgICAgc2VsZWN0KG5uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgc2VsZWN0aW5nIGFuIGFycmF5IG9mIGVsZW1lbnRzIGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24gdHlwZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdEFsbChcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbiAgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNlbGVjdGlvblR5cGUgPSBnZXRTZWxlY3Rpb25UeXBlKCk7XG4gIHVuc2VsZWN0KCk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHNlbGVjdGlvbkNsYXNzO1xuICBsZXQgY29udGFpbnNMYXllckVsZW1lbnRzID0gZmFsc2U7XG4gIGxldCBjb250YWluc05jID0gZmFsc2U7XG5cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcuc3lsbGFibGUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcubmV1bWUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcubmMnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcuc3RhZmYnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlCQm94JzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5zeWxUZXh0UmVjdC1kaXNwbGF5JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbEJ5TGF5ZXJFbGVtZW50JzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5jbGVmLCAuY3VzdG9zLCAuYWNjaWQsIC5kaXZMaW5lJztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHNlbGVjdGlvbiB0eXBlICcgKyBzZWxlY3Rpb25UeXBlKTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCB0aGUgZ3JvdXBpbmdzIHNwZWNpZmllZCBieSBzZWxlY3Rpb25DbGFzc1xuICAvLyB0aGF0IGNvbnRhaW4gdGhlIHByb3ZpZGVkIGVsZW1lbnRzIHRvIHNlbGVjdC5cbiAgY29uc3QgZ3JvdXBzVG9TZWxlY3QgPSBuZXcgU2V0PFNWR0dFbGVtZW50PigpO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBsZXQgZ3JvdXBpbmcgPSBlbGVtZW50LmNsb3Nlc3Q8U1ZHR0VsZW1lbnQ+KHNlbGVjdGlvbkNsYXNzKTtcbiAgICBpZiAoZ3JvdXBpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIGNsaWNrLXNlbGVjdGVkIGEgY2xlZiBvciBhIGN1c3RvcyBvciBhbiBhY2NpZCBvciBhIGRpdkxpbmVcbiAgICAgIGdyb3VwaW5nID0gZWxlbWVudC5jbG9zZXN0KCcuY2xlZiwgLmN1c3RvcywgLmFjY2lkLCAuZGl2TGluZScpO1xuICAgICAgaWYgKGdyb3VwaW5nID09PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnRWxlbWVudCAnICtcbiAgICAgICAgICAgIGVsZW1lbnQuaWQgK1xuICAgICAgICAgICAgJyBpcyBub3QgcGFydCBvZiBzcGVjaWZpZWQgZ3JvdXAgYW5kIGlzIG5vdCBhIGNsZWYgb3IgY3VzdG9zIG9yIGFjY2lkIG9yIGRpdkxpbmUuJyxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb250YWluc0xheWVyRWxlbWVudHMgPSBjb250YWluc0xheWVyRWxlbWVudHMgfHwgdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbnNOYyA9IGNvbnRhaW5zTmMgfHwgdHJ1ZTtcbiAgICB9XG4gICAgZ3JvdXBzVG9TZWxlY3QuYWRkKGdyb3VwaW5nKTtcblxuICAgIC8vIENoZWNrIGZvciBwcmVjZWRlcy9mb2xsb3dzXG4gICAgbGV0IHNlbGVjdGVkID0gZ3JvdXBpbmc7XG4gICAgbGV0IGZvbGxvd3MgPSBzZWxlY3RlZC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyk7XG4gICAgbGV0IHByZWNlZGVzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKTtcbiAgICB3aGlsZSAoZm9sbG93cyB8fCBwcmVjZWRlcykge1xuICAgICAgaWYgKGZvbGxvd3MpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGZvbGxvd3Muc2xpY2UoMSkpO1xuICAgICAgICBpZiAoZ3JvdXBzVG9TZWxlY3QuaGFzKHNlbGVjdGVkKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkLmNsYXNzTGlzdC5hZGQoJ25vLW1vdmluZycpO1xuICAgICAgICBncm91cHNUb1NlbGVjdC5hZGQoc2VsZWN0ZWQpO1xuICAgICAgICBmb2xsb3dzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6Zm9sbG93cycpO1xuICAgICAgfVxuICAgICAgaWYgKHByZWNlZGVzKSB7XG4gICAgICAgIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBwcmVjZWRlcy5zbGljZSgxKSk7XG4gICAgICAgIGlmIChncm91cHNUb1NlbGVjdC5oYXMoc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWQuY2xhc3NMaXN0LmFkZCgnbm8tbW92aW5nJyk7XG4gICAgICAgIGdyb3Vwc1RvU2VsZWN0LmFkZChzZWxlY3RlZCk7XG4gICAgICAgIHByZWNlZGVzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU2VsZWN0IHRoZSBlbGVtZW50c1xuICBncm91cHNUb1NlbGVjdC5mb3JFYWNoKChncm91cDogU1ZHR3JhcGhpY3NFbGVtZW50KSA9PlxuICAgIHNlbGVjdChncm91cCwgZHJhZ0hhbmRsZXIsIGZhbHNlKSxcbiAgKTtcblxuICAvKiBEZXRlcm1pbmUgdGhlIGNvbnRleHQgbWVudSB0byBkaXNwbGF5IChpZiBhbnkpICovXG5cbiAgY29uc3QgZ3JvdXBzID0gQXJyYXkuZnJvbShncm91cHNUb1NlbGVjdC52YWx1ZXMoKSkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG5cbiAgLy8gSGFuZGxlIG9jY3VyYW5jZSBvZiBjbGVmIG9yIGN1c3RvcyBvciBhY2NpZCBvciBkaXZMaW5lXG4gIGlmIChjb250YWluc0xheWVyRWxlbWVudHMgJiYgIWNvbnRhaW5zTmMpIHtcbiAgICAvLyBBIGNvbnRleHQgbWVudSB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGEgc2luZ2xlIGNsZWZcbiAgICBpZiAoZ3JvdXBzVG9TZWxlY3Quc2l6ZSA9PT0gMSkge1xuICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyhncm91cHNbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2VsZWN0aW9uVHlwZSA9PSAnc2VsQnlTeWxsYWJsZScpIHtcbiAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdFN5bEFjdGlvbnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckRlZmF1bHRBY3Rpb25zKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTaW5nbGVTdGFmZkFjdGlvbnMoKTtcbiAgICAgICAgICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbiAgICAgICAgICByZXNpemUoZ3JvdXBzWzBdLCBuZW9uVmlldywgZHJhZ0hhbmRsZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck11bHRpU3RhZmZBY3Rpb25zKCk7XG4gICAgICAgICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TGF5ZXJFbGVtZW50JzpcbiAgICAgIGlmIChncm91cHNUb1NlbGVjdC5zaXplID09PSAxKSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckxheWVyRWxlbWVudEFjdGlvbnMoZ3JvdXBzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckRlZmF1bHRBY3Rpb25zKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAvLyBUT0RPIGNoYW5nZSBjb250ZXh0IGlmIGl0IGlzIG9ubHkgYSBuZXVtZS9uYy5cbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoJ3NpbmdsZVNlbGVjdCcpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGxpbmtlZCBzeWxsYWJsZSBzcGxpdCBieSBhIHN0YWZmIGJyZWFrXG4gICAgICAgICAgLy8gaWYgdGhleSBhcmUgbGlua2FibGUsIHVzZXIgY2FuIHRvZ2dsZSBsaW5rZWQtc3lsbHNcbiAgICAgICAgICBpZiAoR3JvdXBpbmcuaXNMaW5rYWJsZSgnc2VsQnlTeWxsYWJsZScsIGdyb3VwcykpIHtcbiAgICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlclN5bGxhYmxlQWN0aW9ucygnbGlua2FibGVTZWxlY3QnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaWYgc3lsbGFibGVzIGFyZSBhbGwgbG9jYXRlZCBvbiBvbmUgc3RhdmUsIHRoZXkgc2hvdWxkIGJlIGdyb3VwYWJsZVxuICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nLmlzR3JvdXBhYmxlKCdzZWxCeVN5bGxhYmxlJywgZ3JvdXBzKSkge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU3lsbGFibGVBY3Rpb25zKCdtdWx0aVNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBzeWxscyBhcmUgYWNjcm9zcyBtdWx0aXBsZSBzdGF2ZXNcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlclN5bGxhYmxlQWN0aW9ucygnZGVmYXVsdCcpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIC8vIFRPRE8gY2hhbmdlIGNvbnRleHQgaWYgaXQgaXMgb25seSBhIG5jLlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck5ldW1lQWN0aW9ucygpO1xuICAgICAgICAgIEdyb3VwaW5nLmluaXRHcm91cGluZ0xpc3RlbmVycygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChHcm91cGluZy5pc0dyb3VwYWJsZSgnc2VsQnlOZXVtZScsIGdyb3VwcykpIHtcbiAgICAgICAgICAgIEdyb3VwaW5nLnRyaWdnZXJHcm91cGluZygnbmV1bWUnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdEFjdGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJOY0FjdGlvbnMoZ3JvdXBzWzBdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGlmIChzaGFyZWRTZWNvbmRMZXZlbFBhcmVudChncm91cHMpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHNlbGVjdGlvbiBpcyBhIGxpZ2F0dXJlIG9yIGNhbiBiZSBhIGxpZ2F0dXJlXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVzZSBuZXVtZSBjb21wb25lbnRzIGFyZSBwYXJ0IG9mIHRoZSBzYW1lIG5ldW1lXG4gICAgICAgICAgICBpZiAoZ3JvdXBzWzBdLnBhcmVudEVsZW1lbnQgPT09IGdyb3Vwc1sxXS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShncm91cHNbMF0ucGFyZW50RWxlbWVudC5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBuZXVtZSBjb21wb25lbnRzIGFyZSBhZGphY2VudFxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoXG4gICAgICAgICAgICAgICAgICBjaGlsZHJlbi5pbmRleE9mKGdyb3Vwc1swXSkgLSBjaGlsZHJlbi5pbmRleE9mKGdyb3Vwc1sxXSksXG4gICAgICAgICAgICAgICAgKSA9PT0gMVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHNlY29uZCBuZXVtZSBjb21wb25lbnQgaXMgbG93ZXIgdGhhbiBmaXJzdC5cbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG9yZGVyIGluIHRoZSBsaXN0IG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3JkZXIgYnkgeC1wb3NpdGlvbi5cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3ROQyA9IGdyb3Vwc1swXS5jaGlsZHJlblswXSBhcyBTVkdVc2VFbGVtZW50O1xuICAgICAgICAgICAgICAgIGxldCBzZWNvbmROQyA9IGdyb3Vwc1sxXS5jaGlsZHJlblswXSBhcyBTVkdVc2VFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0TkNYID0gZmlyc3ROQy54LmJhc2VWYWwudmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IHNlY29uZE5DWCA9IHNlY29uZE5DLnguYmFzZVZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3ROQ1kgPSBmaXJzdE5DLnkuYmFzZVZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc2Vjb25kTkNZID0gc2Vjb25kTkMueS5iYXNlVmFsLnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgLy8gb3JkZXIgbmMncyBieSB4IGNvb3JkIChsZWZ0IHRvIHJpZ2h0KVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIGZpcnN0TkNYID4gc2Vjb25kTkNYIHx8XG4gICAgICAgICAgICAgICAgICAoZmlyc3ROQ1ggPT09IHNlY29uZE5DWCAmJiBmaXJzdE5DWSA8IHNlY29uZE5DWSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIFtmaXJzdE5DLCBzZWNvbmROQ10gPSBbc2Vjb25kTkMsIGZpcnN0TkNdO1xuICAgICAgICAgICAgICAgICAgW2ZpcnN0TkNYLCBmaXJzdE5DWSwgc2Vjb25kTkNYLCBzZWNvbmROQ1ldID0gW1xuICAgICAgICAgICAgICAgICAgICBzZWNvbmROQ1gsXG4gICAgICAgICAgICAgICAgICAgIHNlY29uZE5DWSxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3ROQ1gsXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0TkNZLFxuICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBzdGFja2VkIG5jJ3MvbGlnYXR1cmUgKGlkZW50aWNhbCB4KSwgb3IgZGVzY2VuZGluZyBuYydzICh5IGRlc2NlbmRzKVxuICAgICAgICAgICAgICAgIGlmIChmaXJzdE5DWCA9PT0gc2Vjb25kTkNYIHx8IGZpcnN0TkNZIDwgc2Vjb25kTkNZKSB7XG4gICAgICAgICAgICAgICAgICBHcm91cGluZy50cmlnZ2VyR3JvdXBpbmcoJ2xpZ2F0dXJlJyk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEdyb3VwaW5nLnRyaWdnZXJHcm91cGluZygnbmMnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdEFjdGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKHNoYXJlZFNlY29uZExldmVsUGFyZW50KGdyb3VwcykpIHtcbiAgICAgICAgICAgIEdyb3VwaW5nLnRyaWdnZXJHcm91cGluZygnbmMnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdEFjdGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxCeUJCb3gnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBzZWxlY3RCQm94KGdyb3Vwc1swXSwgZHJhZ0hhbmRsZXIsIG5lb25WaWV3KTtcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJCQm94QWN0aW9ucygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGdyb3Vwcy5mb3JFYWNoKChnKSA9PiBzZWxlY3RCQm94KGcsIGRyYWdIYW5kbGVyLCB1bmRlZmluZWQpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHNlbGVjdGlvbiB0eXBlLiBUaGlzIHNob3VsZCBub3QgaGF2ZSBvY2N1cnJlZC4nKTtcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uIGNoYW5nZVN0YWZmTGlzdGVuZXIoKTogdm9pZCB7XG4gIC8vIHRyeSB7XG4gIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFuZ2VTdGFmZicpXG4gIC8vIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIFNlbGVjdE9wdGlvbnMuY2hhbmdlU3RhZmZIYW5kbGVyKTtcbiAgLy8gfSBjYXRjaCAoZSkge2NvbnNvbGUuZGVidWcoZSk7fVxuICAvLyB9XG59XG4iLCJpbXBvcnQgeyByZWNvcmROb3RpZmljYXRpb24gfSBmcm9tICcuL0Vycm9yTG9nJztcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gJy4vcmFuZG9tJztcblxudHlwZSBOb3RpZmljYXRpb25UeXBlID0gJ2RlZmF1bHQnIHwgJ2Vycm9yJyB8ICd3YXJuaW5nJyB8ICdzdWNjZXNzJztcblxuY29uc3Qgbm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW10gPSBuZXcgQXJyYXkoMCk7XG5sZXQgY3VycmVudE1vZGVNZXNzYWdlOiBOb3RpZmljYXRpb24gPSBudWxsO1xuXG4vKipcbiAqIE51bWJlciBvZiBub3RpZmljYXRpb25zIHRvIGRpc3BsYXkgYXQgYSB0aW1lLlxuICovXG5jb25zdCBOVU1CRVJfVE9fRElTUExBWSA9IDM7XG5cbi8qKlxuICogTnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgdG8gZGlzcGxheSBhdCBhIHRpbWUuXG4gKi9cbmNvbnN0IFRJTUVPVVQgPSA1MDAwO1xuXG5jb25zdCBub3RpZmljYXRpb25JY29uOiBSZWNvcmQ8Tm90aWZpY2F0aW9uVHlwZSwgc3RyaW5nPiA9IHtcbiAgZGVmYXVsdDogJycsXG4gIHdhcm5pbmc6ICfimqDvuI8gJyxcbiAgZXJyb3I6ICfwn5S0ICcsXG4gIHN1Y2Nlc3M6ICfinIUgJyxcbn07XG5cbi8qKlxuICogQSBjbGFzcyB0byBtYW5hZ2UgTmVvbiBub3RpZmljYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkaXNwbGF5ZWQ6IGJvb2xlYW47XG4gIGlkOiBzdHJpbmc7XG4gIGlzTW9kZU1lc3NhZ2U6IGJvb2xlYW47XG4gIGxvZ0luZm86IHN0cmluZztcbiAgdGltZW91dElEOiBudW1iZXI7XG4gIHR5cGU6IE5vdGlmaWNhdGlvblR5cGU7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgbm90aWZpY2F0aW9uLlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIE5vdGlmaWNhdGlvbiBjb250ZW50LlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG1lc3NhZ2U6IHN0cmluZywgdHlwZTogTm90aWZpY2F0aW9uVHlwZSwgbG9nSW5mbzogc3RyaW5nID0gbnVsbCkge1xuICAgIHRoaXMubWVzc2FnZSA9IG5vdGlmaWNhdGlvbkljb25bdHlwZV0gKyBtZXNzYWdlO1xuICAgIHRoaXMuZGlzcGxheWVkID0gZmFsc2U7XG4gICAgdGhpcy5pZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMuaXNNb2RlTWVzc2FnZSA9IG1lc3NhZ2Uuc2VhcmNoKCdNb2RlJykgIT09IC0xO1xuICAgIHRoaXMubG9nSW5mbyA9IGxvZ0luZm87XG4gICAgdGhpcy50aW1lb3V0SUQgPSAtMTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgSUQgZnJvbSBzZXRUaW1lb3V0LiAqL1xuICBzZXRUaW1lb3V0SWQgKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVvdXRJRCA9IE1hdGgubWF4KGlkLCAtMSk7XG4gIH1cblxuICAvKiogRGlzcGxheSB0aGUgTm90aWZpY2F0aW9uLiAqL1xuICBkaXNwbGF5ICgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXllZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIFVVSUQgZm9yIHRoaXMgbm90aWZpY2F0aW9uLlxuICAgKi9cbiAgZ2V0SWQgKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhciB0aGUgbm90aWZpY2F0aW9uXG4gKiBAcGFyYW0gY3VycmVudElkIC0gVGhlIElEIG9mIHRoZSBub3RpZmljYXRpb24gdG8gYmUgY2xlYXJlZC5cbiAqL1xuZnVuY3Rpb24gY2xlYXJOb3RpZmljYXRpb24gKGN1cnJlbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjdXJyZW50SWQpKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VycmVudElkKS5yZW1vdmUoKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BsYXkgYSBub3RpZmljYXRpb24uXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uIC0gTm90aWZpY2F0aW9uIHRvIGRpc3BsYXkuXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlOb3RpZmljYXRpb24gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gIC8vIE5vdCBzdXJlIHdoYXQgaXQgZG9lcywgbWF5YmUgcmVsYXRlZCB0byByb2Rhbi9uZW9uXG4gIGlmIChub3RpZmljYXRpb24uaXNNb2RlTWVzc2FnZSkge1xuICAgIGlmIChjdXJyZW50TW9kZU1lc3NhZ2UgPT09IG51bGwpIHtcbiAgICAgIGN1cnJlbnRNb2RlTWVzc2FnZSA9IG5vdGlmaWNhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dChjdXJyZW50TW9kZU1lc3NhZ2UudGltZW91dElEKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgdGhlIHRvcCBub3RpZmljYXRpb24gaWYgZXhjZWVkcyBtYXhtaW11bVxuICBub3RpZmljYXRpb25zLnB1c2gobm90aWZpY2F0aW9uKTtcbiAgaWYgKG5vdGlmaWNhdGlvbnMubGVuZ3RoID4gTlVNQkVSX1RPX0RJU1BMQVkpIHtcbiAgICBjb25zdCB0b1JlbW92ZSA9IG5vdGlmaWNhdGlvbnMuc2hpZnQoKTtcbiAgICBjbGVhck5vdGlmaWNhdGlvbih0b1JlbW92ZS5nZXRJZCgpKTtcbiAgfVxuICBjb25zdCBub3RpZmljYXRpb25Db250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbi1jb250ZW50Jyk7XG4gIGNvbnN0IG5ld05vdGlmaWNhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBuZXdOb3RpZmljYXRpb24uY2xhc3NMaXN0LmFkZCgnbmVvbi1ub3RpZmljYXRpb24nKTtcbiAgbmV3Tm90aWZpY2F0aW9uLmNsYXNzTGlzdC5hZGQoYG5lb24tbm90aWZpY2F0aW9uLSR7bm90aWZpY2F0aW9uLnR5cGV9YCk7XG4gIG5ld05vdGlmaWNhdGlvbi5pZCA9IG5vdGlmaWNhdGlvbi5nZXRJZCgpO1xuICBuZXdOb3RpZmljYXRpb24uaW5uZXJIVE1MID0gbm90aWZpY2F0aW9uLm1lc3NhZ2U7XG4gIG5vdGlmaWNhdGlvbkNvbnRlbnQuYXBwZW5kKG5ld05vdGlmaWNhdGlvbik7XG4gIG5vdGlmaWNhdGlvbkNvbnRlbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICBub3RpZmljYXRpb24uZGlzcGxheSgpO1xufVxuXG4vKipcbiAqIFN0YXJ0IGRpc3BsYXlpbmcgbm90aWZpY2F0aW9ucy4gQ2FsbGVkIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0Tm90aWZpY2F0aW9uIChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICBkaXNwbGF5Tm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG4gIG5vdGlmaWNhdGlvbi5zZXRUaW1lb3V0SWQoXG4gICAgd2luZG93LnNldFRpbWVvdXQoY2xlYXJOb3RpZmljYXRpb24sIFRJTUVPVVQsIG5vdGlmaWNhdGlvbi5nZXRJZCgpKVxuICApO1xuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChub3RpZmljYXRpb24uZ2V0SWQoKSlcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KG5vdGlmaWNhdGlvbi50aW1lb3V0SUQpO1xuICAgICAgY2xlYXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLmdldElkKCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEFkZCBhIG5vdGlmaWNhdGlvbiB0byB0aGUgcXVldWUuXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uIC0gTm90aWZpY2F0aW9uIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWV1ZU5vdGlmaWNhdGlvbiAobm90aWZpY2F0aW9uQ29udGVudDogc3RyaW5nLCB0eXBlOiBOb3RpZmljYXRpb25UeXBlID0gJ2RlZmF1bHQnLCBsb2dJbmZvOiBzdHJpbmcgPSBudWxsKTogdm9pZCB7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24obm90aWZpY2F0aW9uQ29udGVudCwgdHlwZSwgbG9nSW5mbyk7XG5cbiAgaWYgKG5vdGlmaWNhdGlvbi50eXBlID09ICdlcnJvcicgfHwgbm90aWZpY2F0aW9uLnR5cGUgPT0gJ3dhcm5pbmcnKSB7XG4gICAgcmVjb3JkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG4gIH1cblxuICBzdGFydE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7IHF1ZXVlTm90aWZpY2F0aW9uIH07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gYXJnc0FycmF5O1xuXG5mdW5jdGlvbiBhcmdzQXJyYXkoZnVuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKGxlbikge1xuICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgIHZhciBpID0gLTE7XG4gICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuLmNhbGwodGhpcywgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4uY2FsbCh0aGlzLCBbXSk7XG4gICAgfVxuICB9O1xufSIsIm1vZHVsZS5leHBvcnRzID0gZDM7IiwiLyoqXG4gKiBIVE1MIGZvciBlYWNoIGluc2VydCB0YWIgKG5ldW1lLCBncm91cGluZywgY2xlZiwgc3lzdGVtLCBhbmQgZGl2aXNpb24pLlxuICovXG5leHBvcnQgY29uc3QgaW5zZXJ0VGFiSHRtbDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgcHJpbWl0aXZlVGFiOiBgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJwdW5jdHVtXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cInB1bmN0dW1cIiB0aXRsZT1cInB1bmN0dW1cIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3B1bmN0dW0ucG5nXCIgY2xhc3M9XCJpbWFnZVwiLz48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInZpcmdhXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cInZpcmdhXCIgdGl0bGU9XCJ2aXJnYVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdmlyZ2EucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidmlyZ2FSZXZlcnNlZFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJSZXZlcnNlZCBWaXJnYVwiIHRpdGxlPVwiUmV2ZXJzZWQgVmlyZ2FcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3ZpcmdhX3JldmVyc2VkLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImRpYW1vbmRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiaW5jbGluYXR1bVwiIHRpdGxlPVwiaW5jbGluYXR1bVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvZGlhbW9uZC5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjdXN0b3NcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiY3VzdG9zXCIgdGl0bGU9XCJjdXN0b3NcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2N1c3Rvcy5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjQ2xlZlwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJDIENsZWZcIiB0aXRsZT1cIiBDIENsZWZcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2NDbGVmLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImZDbGVmXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIkYgQ2xlZlwiIHRpdGxlPVwiRiBDbGVmXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9mQ2xlZi5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJsaXF1ZXNjZW50QVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJMaXF1ZXNjZW50IEFcIiB0aXRsZT1cIkxpcXVlc2NlbnQgQVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbGlxdWVzY2VudEEucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwibGlxdWVzY2VudENcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiTGlxdWVzY2VudCBDXCIgdGl0bGU9XCJMaXF1ZXNjZW50IENcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2xpcXVlc2NlbnRDLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImZsYXRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiRmxhdFwiIHRpdGxlPVwiRmxhdFwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvYWNjaWRGbGF0LnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cIm5hdHVyYWxcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiTmF0dXJhbFwiIHRpdGxlPVwiTmF0dXJhbFwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvYWNjaWROYXR1cmFsLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImRpdkxpbmVNYXhpbWFcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiRGl2TGluZSBNYXhpbWFcIiB0aXRsZT1cIkRpdkxpbmUgTWF4aW1hXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9kaXZpc2lvLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPmAsXG4gIGdyb3VwaW5nVGFiOiBgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJwZXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwicGVzXCIgdGl0bGU9XCJwZXNcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3Blcy5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjbGl2aXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiY2xpdmlzXCIgdGl0bGU9XCJjbGl2aXNcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2NsaXZpcy5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzY2FuZGljdXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwic2NhbmRpY3VzXCIgdGl0bGU9XCJzY2FuZGljdXNcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3NjYW5kaWN1cy5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjbGltYWN1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJjbGltYWN1c1wiIHRpdGxlPVwiY2xpbWFjdXNcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2NsaW1hY3VzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInRvcmN1bHVzXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cInRvY3VsdXNcIiB0aXRsZT1cInRvY3VsdXNcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3RvcmN1bHVzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInBvcnJlY3R1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJwb3JyZWN0dXNcIiB0aXRsZT1cInBvcnJlY3R1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcG9ycmVjdHVzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInByZXNzdXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwicHJlc3N1c1wiIHRpdGxlPVwicHJlc3N1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcHJlc3N1cy5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5gLFxuICBzeXN0ZW1UYWI6IGA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInN0YWZmXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBsb25nZWxcIiBhcmlhLWxhYmVsPVwic3lzdGVtXCIgdGl0bGU9XCJzeXN0ZW1cIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3N0YWZmLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cD5DbGljayB1cHBlciBsZWZ0IGFuZCBsb3dlciByaWdodCBjb3JuZXJzIG9mIG5ldyBzdGFmZi48L3A+YCxcbiAgLy8gZGl2aXNpb25UYWI6IFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyBcIjxidXR0b24gaWQ9J3NtYWxsRGl2JyBjbGFzcz0nc2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgdGFsbGVsJz48aW1nIHNyYz0nXCIgKyBfX0FTU0VUX1BSRUZJWF9fICsgJ2Fzc2V0cy9pbWcvc21hbGxkaXYucG5nIFwiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCIgK1xuICAvLyBcIjxwIGNsYXNzPSdpbnNlcnQtZWxlbWVudC1jb250YWluZXInPlwiICtcbiAgLy8gICAgIFwiPGJ1dHRvbiBpZD0nbWlub3JEaXYnIGNsYXNzPSdzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCB0YWxsZWwnPjxpbWcgc3JjPSdcIiArIF9fQVNTRVRfUFJFRklYX18gKyAnYXNzZXRzL2ltZy9taW5vcmRpdi5wbmdcIicgY2xhc3M9J2ltYWdlJy8+PC9idXR0b24+PC9wPlwiICtcbiAgLy8gICAgIFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyBcIjxidXR0b24gaWQ9J21ham9yRGl2JyBjbGFzcz0nc2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgdGFsbGVsJz48aW1nIHNyYz0nXCIgKyBfX0FTU0VUX1BSRUZJWF9fICsgJ2Fzc2V0cy9pbWcvbWFqb3JkaXYucG5nIFwiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCIgK1xuICAvLyBcIjxwIGNsYXNzPSdpbnNlcnQtZWxlbWVudC1jb250YWluZXInPlwiICtcbiAgLy8gXCI8YnV0dG9uIGlkPSdmaW5hbERpdicgY2xhc3M9J3NpZGUtcGFuZWwtYnRuIGluc2VydGVsIHRhbGxlbCc+PGltZyBzcmM9J1wiICsgX19BU1NFVF9QUkVGSVhfXyArICdhc3NldHMvaW1nL2ZpbmFsZGl2LnBuZyBcIicgY2xhc3M9J2ltYWdlJy8+PC9idXR0b24+PC9wPlwiXG59O1xuXG4vKipcbiAqIFN0cnVjdHVyZSBvZiBpbnNlcnQgcGFuZWwgd2l0aCBiYXNpYyBncm91cGluZyB0YWJzLlxuICovXG5leHBvcnQgY29uc3QgaW5zZXJ0Q29udHJvbHNQYW5lbCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiIGlkPVwiaW5zZXJ0TWVudVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZy10aXRsZVwiPklOU0VSVDwvZGl2PlxuICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvbiBpcy1wdWxsZWQtcmlnaHRcIj5cbiAgICAgICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVJbnNlcnRcIiB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb24gZmlyc3Qtc3Vic2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiaW5zZXJ0Q29udGVudHNcIiBjbGFzcz1cInBhbmVsLWNvbnRlbnRzXCIgc3R5bGU9XCJvdmVyZmxvdy15OiBoaWRkZW47XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgICAgICAgICA8YSBpZD1cInByaW1pdGl2ZVRhYlwiIGNsYXNzPVwiaW5zZXJ0VGFiXCI+UHJpbWl0aXZlIEVsZW1lbnRzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiZ3JvdXBpbmdUYWJcIiBjbGFzcz1cImluc2VydFRhYlwiPkdyb3VwaW5nPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwic3lzdGVtVGFiXCIgY2xhc3M9XCJpbnNlcnRUYWJcIj5TeXN0ZW08L2E+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiaW5zZXJ0X2RhdGFcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBlZGl0IHBhbmVsIHdpdGggYnV0dG9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRDb250cm9sc1BhbmVsID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJlZGl0TWVudVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZy10aXRsZSBmb2N1c2VkXCI+RURJVDwvZGl2PlxuICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvbiBpcy1wdWxsZWQtcmlnaHRcIj5cbiAgICAgICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVFZGl0XCIgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+XG4gICAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJlZGl0Q29udGVudHNcIiBjbGFzcz1cInBhbmVsLWNvbnRlbnRzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb24gZmlyc3Qtc3Vic2VjdGlvblwiPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNlbGVjdGlvbi1tb2RlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1zdWItdGl0bGVcIj5TZWxlY3Rpb24gTW9kZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwic2VsZWN0aW9uLW1vZGUtYnRucy1jb250YWluZXJcIiAgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCIgc3R5bGU9XCJvdmVyZmxvdy14OiBhdXRvO1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeVN5bGxhYmxlXCI+U3lsbGFibGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzZWwtYnlcIiBpZD1cInNlbEJ5TmV1bWVcIj5OZXVtZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNlbC1ieVwiIGlkPVwic2VsQnlOY1wiPk5ldW1lIENvbXBvbmVudDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNlbC1ieVwiIGlkPVwic2VsQnlTdGFmZlwiPlN0YWZmPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeUxheWVyRWxlbWVudFwiPkxheWVyIEVsZW1lbnQ8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJkaXNwbGF5LXNsaWRlci1hY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb24gaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJtb3JlRWRpdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb24gaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJleHRyYUVkaXRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgICAgICAgICAqIFRoZSBleHRyYUVkaXQgcGFuZWwgaXMgYWRkZWQgZm9yIGVkaXQgb3B0aW9ucyB0aGF0IGhhdmUgZHJvcGRvd24gbWVudXNcbiAgICAgICAgICAgICAgICAgICAgKiBMaWtlIHRoZSBOZXVtZSBhbmQgQ2xlZiBtZW51c1xuICAgICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRoZSBtb3JlRWRpdCBtZW51IG5lZWRzIHRvIGhhdmUgb3ZlcmZsb3cgZm9yIGNhc2VzIHdoZXJlIGl0IGhhcyBsb3RzIG9mIGJ1dHRvbnNcbiAgICAgICAgICAgICAgICAgICAgKiBCdXQgb3ZlcmZsb3cgcnVpbnMgZHJvcGRvd24gbWVudXNcbiAgICAgICAgICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cIm5ldW1lRWRpdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInVuZG9SZWRvX2NvbnRyb2xzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZXh0cmEgbmMgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBuY0FjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5DaGFuZ2UgSGVhZCBTaGFwZTo8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wX3NlbGVjdCBkcm9wZG93blwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5IZWFkIFNoYXBlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQdW5jdHVtXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+UHVuY3R1bTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlZpcmdhXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+VmlyZ2E8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJWaXJnYVJldmVyc2VkXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+UmV2ZXJzZWQgVmlyZ2E8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJJbmNsaW5hdHVtXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+SW5jbGluYXR1bTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkxpcXVlc2NlbnRBbnRpY2xvY2t3aXNlXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TGlxdWVzY2VudCBBPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiTGlxdWVzY2VudENsb2Nrd2lzZVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPkxpcXVlc2NlbnQgQzwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGJhc2ljIG5ldW1lIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdE5ldW1lQWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJzcGxpdC1uZXVtZVwiPlNwbGl0IE5ldW1lczwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZXh0cmEgbmV1bWUgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBuZXVtZUFjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5Hcm91cGluZyBPcHRpb25zOjwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bfc2VsZWN0IGRyb3Bkb3duXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzZWxlY3Qtb3B0aW9uc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtY29udHJvbHM9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkdyb3VwaW5nczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGlkPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudCBzY3JvbGxhYmxlLWRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDbGltYWN1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPkNsaW1hY3VzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiQ2xpbWFjdXNSZXN1cGludXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5DbGltYWN1cyBSZXN1cGludXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDbGl2aXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5DbGl2aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQZXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5QZXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQZXNTdWJwdW5jdGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+UGVzIFN1YnB1bmN0aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQb3JyZWN0dXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5Qb3JyZWN0dXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQb3JyZWN0dXNGbGV4dXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5Qb3JyZWN0dXMgRmxleHVzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiUG9ycmVjdHVzU3VicHVuY3Rpc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBvcnJlY3R1cyBTdWJwdW5jdGlzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiUHJlc3N1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlByZXNzdXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJTY2FuZGljdXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5TY2FuZGljdXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJTY2FuZGljdXNGbGV4dXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5TY2FuZGljdXMgRmxleHVzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiU2NhbmRpY3VzU3VicHVuY3Rpc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlNjYW5kaWN1cyBTdWJwdW5jdGlzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiVG9yY3VsdXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5Ub3JjdWx1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlRvcmN1bHVzUmVzdXBpbnVzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+VG9yY3VsdXMgUmVzdXBpbnVzPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5jc1wiPlVuZ3JvdXA8L2J1dHRvbj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGRlZmF1bHQgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0QWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGRlZmF1bHQgYWN0aW9uIG1lbnUgd2hlbiBzZWxlY3RpbmcgYnkgc3lsbGFibGVcbiAqIFNhbWUgYXMgYWJvdmUgZXhjZXB0IGluY2x1ZGVzIHJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0U3lsQWN0aW9uQ29udGVudHMgPSBgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGN1c3RvcyBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGN1c3Rvc0FjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgbGF5ZXIgZWxlbWVudCAob3V0c2lkZSBzeWxsYWJsZSkgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBsYXllckVsZW1lbnRPdXRBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImluc2VydFRvU3lsbGFibGVcIj5JbnNlcnQgdG8gbmVhcmVzdCBzeWxsYWJsZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGxheWVyIGVsZW1lbnQgKGluc2lkZSBzeWxsYWJsZSkgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBsYXllckVsZW1lbnRJbkFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwibW92ZU91dHNpZGVTeWxsYWJsZVwiPk1vdmUgb3V0c2lkZSBzeWxsYWJsZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGFjY2lkIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgYWNjaWRBY3Rpb25Db250ZW50cyA9IGA8bGFiZWw+Q2hhbmdlIEFjY2lkZW50YWw6PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRyaWdnZXJcIm92ZXJmbG93PVwiYXV0b1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5TaGFwZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj48dXNlIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93blwiPjwvdXNlPjwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGlkPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9GbGF0XCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+RmxhdDwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvTmF0dXJhbFwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPk5hdHVyYWw8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBzdGFmZiBzcGxpdCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0YWZmU3BsaXRBY3Rpb25Db250ZW50cyA9IGA8ZGl2PlNwbGl0IFN5c3RlbTo8L2Rpdj5cbiAgICA8ZGl2IGlkPVwic3BsaXQtc3lzdGVtLWJ0bnMtY29udGFpbmVyXCIgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzcGxpdC1zeXN0ZW1cIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCI+U3BsaXQ8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlc2V0LXJvdGF0ZVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIj5SZXNldCBSb3RhdGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGV4dHJhIHN0YWZmIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3Qgc3RhZmZNZXJnZUFjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5NZXJnZSBTeXN0ZW1zOjwvbGFiZWw+XG4gICAgPGRpdiBpZD1cIm1lcmdlLXN5c3RlbS1idG5zLWNvbnRhaW5lclwiIGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwibWVyZ2Utc3lzdGVtc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIj5NZXJnZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYWNjaWQgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBjb2x1bW5BY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwiY29sLWVkaXQtY29udGFpbmVyXCI+XG4gICAgICAgIEVkaXQgQ29sdW1uIEluZm9ybWF0aW9uOlxuICAgICAgICA8ZGl2IGlkPVwiY29sLXN0ZXBwZXItYnRucy1jb250YWluZXJcIiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjb2wtZGVjcmVtZW50XCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBjb2wtc3RlcHBlci1idG5cIj7igJM8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY29sLWlucHV0XCIgY2xhc3M9XCJzaWRlLXBhbmVsLXN0ZXBwZXItaW5wdXRcIiB2YWx1ZT1cIjBcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjb2wtaW5jcmVtZW50XCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBjb2wtc3RlcHBlci1idG5cIj4rPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiY29sLWNvbmZpcm1cIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNpZGUtcGFuZWwtY29uZmlybS1idG5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPkNvbmZpcm08L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJjb2wtd2FybmluZ1wiIGNsYXNzPVwic2lkZS1wYW5lbC13YXJuaW5nXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZXh0cmEgY2xlZiBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNsZWZBY3Rpb25Db250ZW50cyA9IGBcbiAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCIgb3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RGlzcGxhY2UgT2N0YXZlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBpZD1cImluY3JlbWVudC1vY3RhdmVcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj4rMSBPY3RhdmU8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiZGVjcmVtZW50LW9jdGF2ZVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPi0xIE9jdGF2ZTwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bfc2VsZWN0IGRyb3Bkb3duXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwiIG92ZXJmbG93PVwiYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzZWxlY3Qtb3B0aW9uc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtY29udHJvbHM9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNoYW5nZSBDbGVmIFNoYXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBpZD1cIkNDbGVmXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+QyBDbGVmPC9hPlxuICAgICAgICAgICAgICAgICAgICA8YSBpZD1cIkZDbGVmXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+RiBDbGVmPC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIGA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZGl2TGluZSB0eXBlIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgZGl2TGluZUFjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5DaGFuZ2UgRGl2TGluZTo8L2xhYmVsPlxuPGRpdiBjbGFzcz1cImRyb3Bfc2VsZWN0IGRyb3Bkb3duXCI+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRyaWdnZXJcIm92ZXJmbG93PVwiYXV0b1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgPHNwYW4+U2hhcGVzPC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj48dXNlIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93blwiPjwvdXNlPjwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGlkPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvQ2Flc3VyYVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPkNhZXN1cmE8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvRmluYWxpc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPkZpbmFsaXM8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvTWluaW1hXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TWluaW1hPC9hPlxuICAgICAgICAgICAgPGEgaWQ9XCJDaGFuZ2VUb01haW9yXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TWFpb3I8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvTWF4aW1hXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TWF4aW1hPC9hPlxuICAgICAgICAgICAgPGEgaWQ9XCJDaGFuZ2VUb1Zpcmd1bGFcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5WaXJndWxhPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYmJveCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGJib3hBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cIm1hdGNoSGVpZ2h0XCI+TWF0Y2ggSGVpZ2h0IGZvciBFbnRpcmUgUm93PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBIVE1MIGZvciBncm91cGluZyBzZWxlY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdyb3VwaW5nTWVudSA9IHtcbiAgbmM6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIG1vcmUtZWRpdC1idG5cIiBpZD1cImdyb3VwTmNzXCI+R3JvdXAgTmV1bWUgQ29tcG9uZW50czwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YCxcbiAgbmV1bWU6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJncm91cE5ldW1lc1wiPkdyb3VwIE5ldW1lczwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YCxcbiAgc3lsOiBgPGRpdiBjbGFzcz1cIm1vcmUtZWRpdC1idG4gcGFuZWwtYnRuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwibWVyZ2VTeWxzXCI+TWVyZ2UgU3lsbGFibGVzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXHRcdDwvZGl2PmAsXG4gIGxpZ2F0dXJlTmM6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZ3JvdXBOY3NcIj5Hcm91cCBOZXVtZSBDb21wb25lbnRzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInRvZ2dsZS1saWdhdHVyZVwiPlRvZ2dsZSBMaWdhdHVyZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YCxcbiAgbGlnYXR1cmU6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInRvZ2dsZS1saWdhdHVyZVwiPlRvZ2dsZSBMaWdhdHVyZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YCxcbiAgc3BsaXRTeWxsYWJsZTogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ0b2dnbGUtbGlua1wiPlRvZ2dsZSBMaW5rZWQgU3lsbGFibGVzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gLFxufTtcblxuLyogQkdJTk5JTkcgT0YgTU9EQUwgV0lORE9XIENPTlRFTlQgU0VDVElPTiAqL1xuXG4vKipcbiAqIEhUTUwgZm9yIEVkaXQgU3lsbGFibGUgVGV4dCBtb2RhbCB3aW5kb3dcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRUZXh0TW9kYWwgPSBgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJuZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1sYWJlbFwiPkVudGVyIFN5bGxhYmxlIFRleHQ6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgPGRpdiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1idG5zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1idG5cIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWxcIj5DYW5jZWw8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LXNhdmVcIj5TYXZlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogSFRNTCBmb3IgSG90a2V5cyBtb2RhbCB3aW5kb3dcbiAqL1xuZXhwb3J0IGNvbnN0IGhvdGtleXNNb2RhbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudFwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1ob3RrZXlzXCI+XG4gICAgICAgIDwhLS0gXCJEaXNwbGF5XCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5EaXNwbGF5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPis8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+Wm9vbSBJbjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+Wm9vbSBPdXQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+MDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5ab29tIFJlc2V0PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPmg8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+SGlkZSBHbHlwaDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPlQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+U2Nyb2xsIFRvIFN5bGxhYmxlIFRleHQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFwiRWRpdFwiIGhvdGtleXMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LXN1YmNhdGVnb3J5LXRpdGxlXCI+RWRpdDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+Q3RybDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5vcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+4oyYPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ejwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5VbmRvPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPkN0cmw8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5vcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+4oyYPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+U2hpZnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj56PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlJlZG88L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+cS93L2Uvci90L3k8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBieSBTdGFmZi9TeWxsYWJsZS9OZXVtZS9MYXllckVsZW1lbnQvU2VsZWN0aW9uL09mZlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj4xLzIvMy80LzUvNjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGJ5IFN5bGxhYmxlL05ldW1lL05ldW1lIENvbXBvbmVudC9TdGFmZi9MYXllciBFbGVtZW50L0JCb3hcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+U2hpZnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5OdW1iZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIEJlZ2luIEluc2VydCBmb3IgdGhlIDxpPm50aDwvaT4gT3B0aW9uIGluIHRoZSBTZWxlY3RlZCBUYWJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ZzwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgR3JvdXAvVW5ncm91cCBTZWxlY3RlZCBFbGVtZW50KHMpXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBcIk90aGVyXCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5PdGhlcjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+czwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5TYXZlIEZpbGU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+RXNjPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlJldHVybiB0byBFZGl0IE1vZGU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG5leHBvcnQgY29uc3Qgc3lsbGFibGVBY3Rpb25zQ29udGVudCA9IGBcbiAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cIm1lcmdlU3lsc1wiPk1lcmdlIFN5bGxhYmxlczwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5ldW1lc1wiPlVuZ3JvdXA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICA8L2Rpdj5cbmA7XG5cbmV4cG9ydCBjb25zdCBlcnJvckxvZ3NQYW5lbENvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJlcnJvckxvZ0hlYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmctdGl0bGVcIj5FcnJvciBMb2c8L2Rpdj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVFcnJvckxvZ1wiIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnRzXCIgaWQ9XCJlcnJvckxvZ0NvbnRlbnRzXCIgc3R5bGU9XCJvdmVyZmxvdzogc2Nyb2xsOyBwYWRkaW5nOiAwLjVlbSAwLjc1ZW07IG1heC1oZWlnaHQ6IDMwMHB4O1wiPjxkaXY+YDtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG52YXIgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHZhciB1dWlkID0gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiLCJpbXBvcnQgUkVHRVggZnJvbSAnLi9yZWdleC5qcyc7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBSRUdFWC50ZXN0KHV1aWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0ZTsiLCIvKiogQG1vZHVsZSBEaXNwbGF5UGFuZWwvRGlzcGxheUNvbnRyb2xzICovXG5cbmltcG9ydCAqIGFzIENvbG9yIGZyb20gJy4uL3V0aWxzL0NvbG9yJztcbmltcG9ydCBab29tSGFuZGxlciBmcm9tICcuLi9TaW5nbGVWaWV3L1pvb20nO1xuaW1wb3J0IHsgR3JvdXBpbmdUeXBlIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MsIHNldFNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5cbmxldCBsYXN0R2x5cGhPcGFjaXR5OiBudW1iZXIsIGxhc3RJbWFnZU9wYWNpdHk6IG51bWJlciwgbGFzdENpcmNsZVNpemU6IG51bWJlcjtcblxuLyoqXG4gKiBTZXQgem9vbSBjb250cm9sIGxpc3RlbmVyIGZvciBidXR0b24gYW5kIHNsaWRlclxuICogQHBhcmFtIHpvb21IYW5kbGVyIC0gQSBbW1pvb21IYW5kbGVyXV0gaXMgb25seSBuZWNlc3NhcnkgaW4gU2luZ2xlIFBhZ2UgbW9kZSBhcyBkaXZhLmpzIGhhbmRsZXMgem9vbWluZyBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRab29tQ29udHJvbHMgKHpvb21IYW5kbGVyPzogWm9vbUhhbmRsZXIpOiB2b2lkIHtcbiAgaWYgKHpvb21IYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgem9vbVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6b29tU2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgem9vbU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6b29tT3V0cHV0JykgYXMgSFRNTE91dHB1dEVsZW1lbnQ7XG5cbiAgY29uc3QgeyB6b29tIH0gPSBnZXRTZXR0aW5ncygpO1xuICB6b29tU2xpZGVyLnZhbHVlID0gU3RyaW5nKHpvb20pO1xuICB6b29tT3V0cHV0LnZhbHVlID0gU3RyaW5nKHpvb20pO1xuICB6b29tSGFuZGxlci56b29tVG8oem9vbSAvIDEwMC4wKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LXpvb20nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB6b29tT3V0cHV0LnZhbHVlID0gJzEwMCc7XG4gICAgem9vbVNsaWRlci52YWx1ZSA9ICcxMDAnO1xuICAgIHpvb21IYW5kbGVyLnJlc2V0Wm9vbUFuZFBhbigpO1xuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2V0LXpvb20tZWFzeS1lZGl0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgem9vbU91dHB1dC52YWx1ZSA9ICcxODAnO1xuICAgIHpvb21TbGlkZXIudmFsdWUgPSAnMTgwJztcbiAgICB6b29tSGFuZGxlci56b29tVG8oMTgwLzEwMCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGlucHV0Q2hhbmdlSGFuZGxlciAoKTogdm9pZCB7XG4gICAgem9vbU91dHB1dC52YWx1ZSA9IHpvb21TbGlkZXIudmFsdWU7XG4gICAgem9vbUhhbmRsZXIuem9vbVRvKE51bWJlcih6b29tT3V0cHV0LnZhbHVlKSAvIDEwMC4wKTtcbiAgfVxuXG4gIC8vIHpvb21TbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBpbnB1dENoYW5nZUhhbmRsZXIpO1xuICB6b29tU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBpbnB1dENoYW5nZUhhbmRsZXIpO1xuICB6b29tU2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRab29tID0gcGFyc2VJbnQoem9vbU91dHB1dC52YWx1ZSk7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdBcnJvd1VwJyB8fCBldnQua2V5ID09PSAnQXJyb3dEb3duJyB8fCBcbiAgICBldnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZ0LmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJysnKSB7IC8vIGluY3JlYXNlIHpvb20gYnkgMjBcbiAgICAgIGNvbnN0IG5ld1pvb20gPSBNYXRoLm1pbihjdXJyZW50Wm9vbSArIDIwLCBwYXJzZUludCh6b29tU2xpZGVyLmdldEF0dHJpYnV0ZSgnbWF4JykpKTtcbiAgICAgIHpvb21IYW5kbGVyLnpvb21UbyhuZXdab29tIC8gMTAwLjApO1xuICAgICAgem9vbU91dHB1dC52YWx1ZSA9IFN0cmluZyhuZXdab29tKTtcbiAgICAgIHpvb21TbGlkZXIudmFsdWUgPSBTdHJpbmcobmV3Wm9vbSk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnXycpIHsgLy8gZGVjcmVhc2Ugem9vbSBieSAyMFxuICAgICAgY29uc3QgbmV3Wm9vbSA9IE1hdGgubWF4KGN1cnJlbnRab29tIC0gMjAsIHBhcnNlSW50KHpvb21TbGlkZXIuZ2V0QXR0cmlidXRlKCdtaW4nKSkpO1xuICAgICAgem9vbUhhbmRsZXIuem9vbVRvKG5ld1pvb20gLyAxMDAuMCk7XG4gICAgICB6b29tT3V0cHV0LnZhbHVlID0gU3RyaW5nKG5ld1pvb20pO1xuICAgICAgem9vbVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdab29tKTtcbiAgICB9IGVsc2UgaWYgKGV2dC5rZXkgPT09ICcwJykge1xuICAgICAgem9vbU91dHB1dC52YWx1ZSA9ICcxMDAnO1xuICAgICAgem9vbVNsaWRlci52YWx1ZSA9ICcxMDAnO1xuICAgICAgem9vbUhhbmRsZXIucmVzZXRab29tQW5kUGFuKCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgTUVJIG9wYWNpdHkgdG8gdmFsdWUgZnJvbSB0aGUgc2xpZGVyLlxuICogQHBhcmFtIG1laUNsYXNzTmFtZSAtIENsYXNzIHRoYXQgY29udGFpbnMgdGhlIHJlbmRlcmVkIE1FSS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdseXBoT3BhY2l0eUZyb21TbGlkZXIgKG1laUNsYXNzTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBvcGFjaXR5T3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wYWNpdHlPdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcbiAgY29uc3Qgb3BhY2l0eVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGFjaXR5U2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICBvcGFjaXR5U2xpZGVyLnZhbHVlID0gb3BhY2l0eU91dHB1dC52YWx1ZTtcbiAgLy8gdGhpcyBpcyB3aGVyZSB3ZSBsb2FkIGdseXBoIG9wYWNpdHkgZnJvbSBsb2NhbFN0b3JhZ2Ugb24gcGFnZS1sb2FkXG4gIHNldFNldHRpbmdzKHsgZ2x5cGhPcGFjaXR5OiBOdW1iZXIob3BhY2l0eU91dHB1dC52YWx1ZSkgfSk7XG5cbiAgLy8gZGlzcGF5IGNvcnJlY3Qgc2xpZGVyIHRvZ2dsZSBkaXNwbGF5IGljb25cbiAgY29uc3QgaGlkZUdseXBoSW1nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvZ2dsZS1nbHlwaC1vcGFjaXR5ID4gaW1nJyk7XG4gIGlmIChOdW1iZXIob3BhY2l0eU91dHB1dC52YWx1ZSkgPT09IDApIHtcbiAgICBoaWRlR2x5cGhJbWcuc2V0QXR0cmlidXRlKCdzcmMnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc2hvdy1pY29uLnN2Z2ApO1xuICAgIGhpZGVHbHlwaEltZy5wYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnU2hvdyBnbHlwaCcpO1xuICB9XG4gIGVsc2Uge1xuICAgIGhpZGVHbHlwaEltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9oaWRlLWljb24uc3ZnYCk7XG4gICAgaGlkZUdseXBoSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdIaWRlIGdseXBoJyk7XG4gIH1cblxuICB0cnkge1xuICAgICgoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBtZWlDbGFzc05hbWUpKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PikuZm9yRWFjaChnID0+IHtcbiAgICAgIGcuc3R5bGUub3BhY2l0eSA9IChOdW1iZXIob3BhY2l0eU91dHB1dC52YWx1ZSkgLyAxMDAuMCkudG9TdHJpbmcoKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIHByb3Blcmx5IHNldCBvcGFjaXR5IHRvIHBhZ2VzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgcmVuZGVyZWQgTUVJIG9wYWNpdHkgYnV0dG9uIGFuZCBzbGlkZXIgbGlzdGVuZXJzLlxuICogQHBhcmFtIG1laUNsYXNzTmFtZSAtIENsYXNzIHRoYXQgY29udGFpbnMgdGhlIHJlbmRlcmVkIE1FSS5cbiAqL1xuZnVuY3Rpb24gc2V0R2x5cGhPcGFjaXR5Q29udHJvbHMgKG1laUNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG9wYWNpdHlTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BhY2l0eVNsaWRlcicpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IG9wYWNpdHlPdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BhY2l0eU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50O1xuXG4gIGNvbnN0IHsgZ2x5cGhPcGFjaXR5IH0gPSBnZXRTZXR0aW5ncygpO1xuICBsYXN0R2x5cGhPcGFjaXR5ID0gZ2x5cGhPcGFjaXR5O1xuICBvcGFjaXR5U2xpZGVyLnZhbHVlID0gU3RyaW5nKGdseXBoT3BhY2l0eSk7XG4gIG9wYWNpdHlPdXRwdXQudmFsdWUgPSBTdHJpbmcoZ2x5cGhPcGFjaXR5KTtcblxuICBmdW5jdGlvbiBpbnB1dENoYW5nZU9wYWNpdHkgKCk6IHZvaWQge1xuICAgIG9wYWNpdHlPdXRwdXQudmFsdWUgPSBvcGFjaXR5U2xpZGVyLnZhbHVlO1xuICAgIGxhc3RHbHlwaE9wYWNpdHkgPSBOdW1iZXIob3BhY2l0eVNsaWRlci52YWx1ZSk7XG4gICAgc2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlcihtZWlDbGFzc05hbWUpO1xuICB9XG5cbiAgY29uc3QgdG9nZ2xlT3BhY2l0eUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtZ2x5cGgtb3BhY2l0eScpO1xuXG4gIGlmIChnbHlwaE9wYWNpdHkgPT0gMTAwKSB7XG4gICAgdG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgfVxuXG4gIHRvZ2dsZU9wYWNpdHlCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgbGV0IG5ld09wYWNpdHk7XG4gICAgaWYgKHRvZ2dsZU9wYWNpdHlCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRlLWljb24nKSkge1xuICAgICAgdG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRvZ2dsZU9wYWNpdHlCdG4uY2xhc3NMaXN0LmFkZCgnaGlkZS1pY29uJyk7XG4gICAgICBuZXdPcGFjaXR5ID0gMTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbml0aW9uIHNjYWxlIGlzIHRoZSByb290IGVsZW1lbnQgb2Ygd2hhdCBpcyBnZW5lcmF0ZWQgYnkgdmVyb3Zpb1xuICAgIFxuICAgIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIG1laUNsYXNzTmFtZSkgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4pLmZvckVhY2goZyA9PiB7XG4gICAgICBnLnN0eWxlLm9wYWNpdHkgPSBuZXdPcGFjaXR5LnRvU3RyaW5nKCk7XG4gICAgfSk7XG5cbiAgICBsYXN0R2x5cGhPcGFjaXR5ID0gTnVtYmVyKG9wYWNpdHlTbGlkZXIudmFsdWUpO1xuICAgIG9wYWNpdHlTbGlkZXIudmFsdWUgPSBTdHJpbmcobmV3T3BhY2l0eSAqIDEwMCk7XG4gICAgb3BhY2l0eU91dHB1dC52YWx1ZSA9IFN0cmluZyhNYXRoLnJvdW5kKG5ld09wYWNpdHkgKiAxMDApKTtcblxuICAgIHNldFNldHRpbmdzKHsgZ2x5cGhPcGFjaXR5OiBuZXdPcGFjaXR5ICogMTAwIH0pO1xuXG4gICAgaW5wdXRDaGFuZ2VPcGFjaXR5KCk7XG4gIH0pO1xuXG4gIG9wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBpbnB1dENoYW5nZU9wYWNpdHkpO1xuICBvcGFjaXR5U2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGlucHV0Q2hhbmdlT3BhY2l0eSk7XG5cbiAgb3BhY2l0eVNsaWRlci5kaXNhYmxlZCA9IGZhbHNlO1xufVxuXG5cbi8qKlxuICogU2V0IGJhY2tncm91bmQgaW1hZ2Ugb3BhY2l0eSBidXR0b24gYW5kIHNsaWRlciBsaXN0ZW5lcnMuXG4gKiBAcGFyYW0gYmFja2dyb3VuZCAtIFRoZSBiYWNrZ3JvdW5kIGltYWdlIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBzZXRCZ09wYWNpdHlDb250cm9scyAoYmFja2dyb3VuZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGJnT3BhY2l0eVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZ09wYWNpdHlTbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICBjb25zdCBiZ09wYWNpdHlPdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmdPcGFjaXR5T3V0cHV0JykgYXMgSFRNTE91dHB1dEVsZW1lbnQ7XG5cbiAgY29uc3QgeyBpbWFnZU9wYWNpdHkgfSA9IGdldFNldHRpbmdzKCk7XG4gIGxhc3RJbWFnZU9wYWNpdHkgPSBpbWFnZU9wYWNpdHk7XG4gIGJnT3BhY2l0eVNsaWRlci52YWx1ZSA9IFN0cmluZyhpbWFnZU9wYWNpdHkpO1xuICBiZ09wYWNpdHlPdXRwdXQudmFsdWUgPSBTdHJpbmcoaW1hZ2VPcGFjaXR5KTtcblxuICBmdW5jdGlvbiBiZ0lucHV0Q2hhbmdlSGFuZGxlciAoKTogdm9pZCB7XG4gICAgYmdPcGFjaXR5T3V0cHV0LnZhbHVlID0gYmdPcGFjaXR5U2xpZGVyLnZhbHVlO1xuICAgIGxhc3RJbWFnZU9wYWNpdHkgPSBOdW1iZXIoYmdPcGFjaXR5U2xpZGVyLnZhbHVlKTtcbiAgICBzZXRCZ09wYWNpdHlGcm9tU2xpZGVyKGJhY2tncm91bmQpO1xuICB9XG5cblxuICBjb25zdCB0b2dnbGVCZ09wYWNpdHlCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlLWJnLW9wYWNpdHknKTtcblxuICBpZiAoaW1hZ2VPcGFjaXR5ID09IDEwMCkge1xuICAgIHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgfVxuXG4gIHRvZ2dsZUJnT3BhY2l0eUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcblxuICAgIGxldCBuZXdPcGFjaXR5O1xuXG4gICAgaWYgKHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUtaWNvbicpKSB7XG4gICAgICB0b2dnbGVCZ09wYWNpdHlCdG4uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZS1pY29uJyk7XG4gICAgICBuZXdPcGFjaXR5ID0gMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0b2dnbGVCZ09wYWNpdHlCdG4uY2xhc3NMaXN0LmFkZCgnaGlkZS1pY29uJyk7XG4gICAgICBuZXdPcGFjaXR5ID0gMTtcbiAgICB9XG4gICAgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYmFja2dyb3VuZClbMF0gYXMgSFRNTEVsZW1lbnQpXG4gICAgICAuc3R5bGUub3BhY2l0eSA9IG5ld09wYWNpdHkudG9TdHJpbmcoKTtcblxuICAgIGxhc3RJbWFnZU9wYWNpdHkgPSBOdW1iZXIoYmdPcGFjaXR5U2xpZGVyLnZhbHVlKTtcbiAgICBiZ09wYWNpdHlTbGlkZXIudmFsdWUgPSBTdHJpbmcobmV3T3BhY2l0eSAqIDEwMCk7XG4gICAgYmdPcGFjaXR5T3V0cHV0LnZhbHVlID0gU3RyaW5nKE1hdGgucm91bmQobmV3T3BhY2l0eSAqIDEwMCkpO1xuXG4gICAgc2V0U2V0dGluZ3MoeyBpbWFnZU9wYWNpdHk6IG5ld09wYWNpdHkgKiAxMDAgfSk7XG4gICAgYmdJbnB1dENoYW5nZUhhbmRsZXIoKTtcbiAgfSk7XG5cbiAgYmdPcGFjaXR5U2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmdJbnB1dENoYW5nZUhhbmRsZXIpO1xuICBiZ09wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYmdJbnB1dENoYW5nZUhhbmRsZXIpO1xuXG4gIGJnT3BhY2l0eVNsaWRlci5kaXNhYmxlZCA9IGZhbHNlO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRCZ09wYWNpdHlGcm9tU2xpZGVyIChiYWNrZ3JvdW5kPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGJnT3BhY2l0eU91dHB1dDogSFRNTE91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmdPcGFjaXR5T3V0cHV0Jyk7XG4gIFxuICBzZXRTZXR0aW5ncyh7IGltYWdlT3BhY2l0eTogTnVtYmVyKGJnT3BhY2l0eU91dHB1dC52YWx1ZSkgfSk7XG5cbiAgLy8gZGlzcGF5IGNvcnJlY3Qgc2xpZGVyIHRpZ2dsZSBkaXNwbGF5IGljb25cbiAgY29uc3QgaGlkZUJnSW1nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvZ2dsZS1iZy1vcGFjaXR5ID4gaW1nJyk7XG4gIGlmIChOdW1iZXIoYmdPcGFjaXR5T3V0cHV0LnZhbHVlKSA9PT0gMCkge1xuICAgIGhpZGVCZ0ltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9zaG93LWljb24uc3ZnYCk7XG4gICAgaGlkZUJnSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdTaG93IGJhY2tncm91bmQgaW1hZ2UnKTtcbiAgfVxuICBlbHNlIHtcbiAgICBoaWRlQmdJbWcuc2V0QXR0cmlidXRlKCdzcmMnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaGlkZS1pY29uLnN2Z2ApO1xuICAgIGhpZGVCZ0ltZy5wYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnSGlkZSBiYWNrZ3JvdW5kIGltYWdlJyk7XG4gIH1cblxuICBjb25zdCBiZzogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtiYWNrZ3JvdW5kfWApO1xuICBpZiAoYmcpIGJnLnN0eWxlLm9wYWNpdHkgPSBTdHJpbmcoTnVtYmVyKGJnT3BhY2l0eU91dHB1dC52YWx1ZSkgLyAxMDApO1xufVxuXG4vKipcbiAqIFNldCBiYm94IGFkanVzdG1lbnQgY2lyY2xlIHNpemUgYnV0dG9uIGFuZCBzbGlkZXIgbGlzdGVuZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2lyY2xlU2l6ZUNvbnRyb2xzICgpOiB2b2lkIHtcbiAgY29uc3QgY2lyY2xlU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NpcmNsZVNsaWRlcicpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGNpcmNsZU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaXJjbGVPdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcblxuICBjb25zdCB7IGNpcmNsZVNpemUgfSA9IGdldFNldHRpbmdzKCk7XG4gIGxhc3RDaXJjbGVTaXplID0gY2lyY2xlU2l6ZTtcbiAgY2lyY2xlU2xpZGVyLnZhbHVlID0gU3RyaW5nKGNpcmNsZVNpemUpO1xuICBjaXJjbGVPdXRwdXQudmFsdWUgPSBTdHJpbmcoY2lyY2xlU2l6ZSk7XG5cbiAgZnVuY3Rpb24gY2lyY2xlU2l6ZUlucHV0Q2hhbmdlSGFuZGxlciAoKTogdm9pZCB7XG4gICAgY2lyY2xlT3V0cHV0LnZhbHVlID0gY2lyY2xlU2xpZGVyLnZhbHVlO1xuICAgIGxhc3RDaXJjbGVTaXplID0gTnVtYmVyKGNpcmNsZVNsaWRlci52YWx1ZSk7XG4gICAgc2V0U2V0dGluZ3MoeyBjaXJjbGVTaXplOiBOdW1iZXIobGFzdENpcmNsZVNpemUpIH0pO1xuICAgIGNvbnN0IHJlc2l6ZVBvaW50cyA9IGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50Jyk7XG4gICAgaWYgKCFyZXNpemVQb2ludHMuZW1wdHkoKSkge1xuICAgICAgcmVzaXplUG9pbnRzLmF0dHIoJ3InLCBsYXN0Q2lyY2xlU2l6ZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzZXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXQtY2lyY2xlLXNpemUnKTtcbiAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdFNpemUgPSAyNTsgXG4gICAgLy8gaWYgaGFzIHJlc2l6ZVBvaW50cyBkaXNwbGF5ZWRcbiAgICBjb25zdCByZXNpemVQb2ludHMgPSBkMy5zZWxlY3RBbGwoJy5yZXNpemVQb2ludCcpO1xuICAgIGlmICghcmVzaXplUG9pbnRzLmVtcHR5KCkpIHtcbiAgICAgIHJlc2l6ZVBvaW50cy5hdHRyKCdyJywgZGVmYXVsdFNpemUpO1xuICAgIH1cblxuICAgIGxhc3RDaXJjbGVTaXplID0gTnVtYmVyKGRlZmF1bHRTaXplKTtcbiAgICBjaXJjbGVTbGlkZXIudmFsdWUgPSBTdHJpbmcoZGVmYXVsdFNpemUpO1xuICAgIGNpcmNsZU91dHB1dC52YWx1ZSA9IFN0cmluZyhkZWZhdWx0U2l6ZSk7XG5cbiAgICBzZXRTZXR0aW5ncyh7IGNpcmNsZVNpemU6IE51bWJlcihkZWZhdWx0U2l6ZSkgfSk7XG4gICAgY2lyY2xlU2l6ZUlucHV0Q2hhbmdlSGFuZGxlcigpO1xuICB9KTtcblxuICBjaXJjbGVTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBjaXJjbGVTaXplSW5wdXRDaGFuZ2VIYW5kbGVyKTtcbiAgY2lyY2xlU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNpcmNsZVNpemVJbnB1dENoYW5nZUhhbmRsZXIpO1xuXG4gIGNpcmNsZVNsaWRlci5kaXNhYmxlZCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBoaWdobGlnaHQgZHJvcGRvd24gb3B0aW9uICsgZGlzcGxheVxuICogQHBhcmFtIGdyb3VwIC0gR3JvdXBpbmdUeXBlIC8gVGhlIERPTSBlbGVtZW50J3MgaWQgYXMgYGhpZ2hsaWdodC0ke2lkfWBcbiAqL1xuZnVuY3Rpb24gdXBkYXRlSGlnaGxpZ2h0T3B0aW9uIChncm91cDogR3JvdXBpbmdUeXBlKTogdm9pZCB7XG4gIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBoaWdobGlnaHQtJHtncm91cH1gKTtcbiAgY29uc3QgZHJvcGRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LWRyb3Bkb3duJyk7XG4gIGNvbnN0IGhpZ2hsaWdodFR5cGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LXR5cGUnKTtcblxuICAvLyBzYXZlIGhpZ2hsaWdodCBvcHRpb24gdG8gbG9jYWxTdG9yYWdlXG4gIHNldFNldHRpbmdzKHsgaGlnaGxpZ2h0TW9kZTogZ3JvdXAgfSk7XG5cbiAgZHJvcGRvd24uY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0LXNlbGVjdGVkJyk7XG4gIH0pO1xuXG4gIGlmIChncm91cCA9PT0gJ25vbmUnKSB7XG4gICAgaGlnaGxpZ2h0VHlwZS50ZXh0Q29udGVudCA9ICdcXHhBMC0gT2ZmJztcbiAgICBDb2xvci51bnNldEdyb3VwaW5nSGlnaGxpZ2h0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBvcHRpb24uY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0LXNlbGVjdGVkJyk7XG5cbiAgLy8gVGV4dCBjb250ZW50IGlzIHRoZSBncm91cGluZyB0eXBlIGNhcGl0YWxpemVkXG4gIGhpZ2hsaWdodFR5cGUudGV4dENvbnRlbnQgPSBgXFx4QTAtICR7Z3JvdXBbMF0udG9VcHBlckNhc2UoKSArIGdyb3VwLnNsaWNlKDEpfWA7XG4gIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KGdyb3VwKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgaGlnaGxpZ2h0IG1vZGUgY2hvc2VuIGJ5IHRoZSB1c2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0VHlwZSAoKTogR3JvdXBpbmdUeXBlIHtcbiAgY29uc3QgaGlnaGxpZ2h0VHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtdHlwZScpO1xuICByZXR1cm4gaGlnaGxpZ2h0VHlwZS50ZXh0Q29udGVudC5zbGljZSgzKS50b0xvd2VyQ2FzZSgpIGFzIEdyb3VwaW5nVHlwZTtcbn1cblxuLyoqXG4gKiBTZXQgY2xpY2sgbGlzdGVuZXIgZm9yIGVhY2ggaGlnaGxpZ2h0IGRyb3Bkb3duIG9wdGlvblxuICogQHBhcmFtIGdyb3VwIC0gR3JvdXBpbmdUeXBlIC8gVGhlIERPTSBlbGVtZW50J3MgaWQgYXMgYGhpZ2hsaWdodC0ke2lkfWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhpZ2hsaWdodE9wdGlvbiAoZ3JvdXA6IEdyb3VwaW5nVHlwZSk6IHZvaWQge1xuICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgaGlnaGxpZ2h0LSR7Z3JvdXB9YCk7XG4gIG9wdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oZ3JvdXApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDbGlja2F3YXkgbGlzdGVuZXIgZm9yIHRoZSBoaWdobGlnaHQgZHJvcGRvd24uXG4gKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodENsaWNrYXdheSAoKTogdm9pZCB7XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWdobGlnaHRDbGlja2F3YXkpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LWRyb3Bkb3duJykuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG59XG5cbi8qKlxuICogU2V0IGxpc3RlbmVyIG9uIHN0YWZmIGhpZ2hsaWdodGluZyBjaGVja2JveC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhpZ2hsaWdodENvbnRyb2xzICgpOiB2b2lkIHtcbiAgY29uc3QgZHJvcGRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LWRyb3Bkb3duJyk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC1idXR0b24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldnQpID0+IHtcbiAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZHJvcGRvd24uY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYWN0aXZlJyk7XG4gICAgaWYgKGRyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWdobGlnaHRDbGlja2F3YXkpO1xuXG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ2NvbHVtbicpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCdzdGFmZicpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCdzeWxsYWJsZScpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCduZXVtZScpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCdsYXllckVsZW1lbnQnKTtcbiAgICAgIHNldEhpZ2hsaWdodE9wdGlvbignbm9uZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGlnaGxpZ2h0Q2xpY2thd2F5KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAgKiBTZXQgbGlzdGVuZXIgb24ga2V5IHNob3J0Y3V0cyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gaGlnaGxpZ2h0c1xuICAqIFxuICAqIFRoZSBjdXJyZW50IHBsYW4gaXMgdG8gdXNlIHRoZSBrZXlzIHEsIHcsIGUsIHIsIHQsIGFuZCB5XG4gICovXG5mdW5jdGlvbiBzZXRIaWdobGlnaHRLZXlDb250cm9scyAoKTogdm9pZCB7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQpID0+IHtcbiAgICAvLyBQcmV2ZW50IGNtZC9jdHJsK3IgZnJvbSBjaGFuZ2luZyBoaWdobGlnaHQgb3B0aW9uXG4gICAgaWYgKGV2dC5tZXRhS2V5KSByZXR1cm47XG5cbiAgICBzd2l0Y2ggKGV2dC5rZXkpIHtcbiAgICAgIGNhc2UgJ3EnOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ3N0YWZmJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndyc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignc3lsbGFibGUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlJzpcbiAgICAgICAgdXBkYXRlSGlnaGxpZ2h0T3B0aW9uKCduZXVtZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3InOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ2xheWVyRWxlbWVudCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3QnOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ3NlbGVjdGlvbicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3knOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ25vbmUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEhpZ2hsaWdodFNlbGVjdGlvbkNvbnRyb2xzICgpOiB2b2lkIHtcbiAgY29uc3QgaGlnaGxpZ2h0U2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC1zZWxlY3Rpb24nKTtcbiAgaGlnaGxpZ2h0U2VsZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGlnaGxpZ2h0LXNlbGVjdGVkJykuZm9yRWFjaChlbGVtID0+IHtcbiAgICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0LXNlbGVjdGVkJyk7XG4gICAgfSk7XG4gICAgaGlnaGxpZ2h0U2VsZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodC1zZWxlY3RlZCcpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtdHlwZScpLnRleHRDb250ZW50ID0gJyAtIFNlbGVjdGlvbic7XG4gICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3NlbGVjdGlvbicpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNldCB0aGUgaGlnaGxpZ2h0IGZvciBkaWZmZXJlbnQgdHlwZXMgYmFzZWQgb24gdGhlICdoaWdobGlnaHQtc2VsZWN0ZWQnIGNsYXNzIGluIHRoZSBET00uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVIaWdobGlnaHQgKCk6IHZvaWQge1xuICBsZXQgaGlnaGxpZ2h0SWQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBoaWdobGlnaHRJZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5pZDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhpZ2hsaWdodElkID0gJyc7XG4gIH1cbiAgc3dpdGNoIChoaWdobGlnaHRJZCkge1xuICAgIGNhc2UgJ2hpZ2hsaWdodC1jb2x1bW4nOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ2NvbHVtbicpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LXN0YWZmJzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCdzdGFmZicpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LXN5bGxhYmxlJzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCdzeWxsYWJsZScpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LW5ldW1lJzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCduZXVtZScpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LWxheWVyRWxlbWVudCc6XG4gICAgICBDb2xvci5zZXRHcm91cGluZ0hpZ2hsaWdodCgnbGF5ZXJFbGVtZW50Jyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtc2VsZWN0aW9uJzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCdzZWxlY3Rpb24nKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBDb2xvci51bnNldEdyb3VwaW5nSGlnaGxpZ2h0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgbGlzdGVuZXIgb24gYnVyZ2VyIG1lbnUgZm9yIHNtYWxsZXIgc2NyZWVucy5cbiAqL1xuZnVuY3Rpb24gc2V0QnVyZ2VyQ29udHJvbHMgKCk6IHZvaWQge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVyZ2VyTWVudScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidXJnZXJNZW51JykuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYWN0aXZlJyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdk1lbnUnKS5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcbiAgfSk7XG59XG5cbi8qKiBcbiAqIFNldCBsaXN0ZW5lciBmb3IgXCJEaXNwbGF5IEFsbFwiIGJ1dHRvbiBpbiBEaXNwbGF5IHBhbmVsLlxuKi9cbmZ1bmN0aW9uIHNldERpc3BsYXlBbGxMaXN0ZW5lcigpOiB2b2lkIHtcbiAgY29uc3Qgc2VsZWN0QWxsQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Rpc3BsYXktYWxsLWJ0bicpO1xuICBzZWxlY3RBbGxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgLy8gYXQgdGhlIG1vbWVudCwgY2xhc3NuYW1lICdzZWxlY3RlZCcgaXMgb25seSB1c2VkIGZvciB0cmFja2luZyBwdXJwb3Nlc1xuICAgIGlmIChzZWxlY3RBbGxCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBzZWxlY3RBbGxCdG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgIHNlbGVjdEFsbEJ0bi5pbm5lckhUTUwgPSAnRGlzcGxheSBBbGwnO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9ICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2hlY2tib3gtY29udGFpbmVyOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZTtcIl0pID4gLmNoZWNrYm94Jyk7XG5cbiAgICAgIEFycmF5LmZyb20ob3B0aW9ucykuZm9yRWFjaCgob3B0aW9uOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uY2hlY2tlZCkgb3B0aW9uLmNsaWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzZWxlY3RBbGxCdG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgIHNlbGVjdEFsbEJ0bi5pbm5lckhUTUwgPSAnSGlkZSBBbGwnO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9ICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2hlY2tib3gtY29udGFpbmVyOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZTtcIl0pID4gLmNoZWNrYm94Jyk7XG4gICAgICBcbiAgICAgIEFycmF5LmZyb20ob3B0aW9ucykuZm9yRWFjaCgob3B0aW9uOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmICghb3B0aW9uLmNoZWNrZWQpIG9wdGlvbi5jbGljaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqIFxuICogVXBkYXRlIGBEaXNwbGF5IEFsbGAgYnV0dG9uIHN0YXR1c1xuKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEaXNwbGF5QWxsQnRuKCk6IHZvaWQge1xuICBjb25zdCBkaXNwbGF5QWxsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXktYWxsLWJ0bicpO1xuICBjb25zdCBkaXNwbGF5SW5mbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5SW5mbycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGRpc3BsYXlCQm94ZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUJCb3gnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICBjb25zdCBkaXNwbGF5VGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5VGV4dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGRpc3BsYXlFcnJMb2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheS1lcnJvcnMnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIC8vIGlmIGFsbCBvcHRpb25zIGFyZSBzZWxlY3RlZCxcbiAgLy8gc2V0IFwiRGlzcGxheS9IaWRlIEFsbFwiIGJ1dHRvbiB0byBcIkhpZGUgQWxsXCIuXG4gIGlmIChkaXNwbGF5SW5mbz8uY2hlY2tlZCAmJiBkaXNwbGF5QkJveGVzPy5jaGVja2VkICYmIFxuICAgIGRpc3BsYXlUZXh0Py5jaGVja2VkICYmIGRpc3BsYXlFcnJMb2c/LmNoZWNrZWQpIHtcbiAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgZGlzcGxheUFsbEJ0bi5pbm5lckhUTUwgPSAnSGlkZSBBbGwnO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIFwiRGlzcGxheS9IaWRlIEFsbFwiIGJ1dHRvbiBpcyBpbiBcIkhpZGUgQWxsXCIgbW9kZSwgc2V0IGl0IHRvIFwiRGlzcGxheSBBbGxcIiBtb2RlXG4gICAgaWYgKGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTG9hZCBoaWdobGlnaHQgc2V0dGluZ3MgZnJvbSBsb2NhbFN0b3JhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRIaWdobGlnaHRTZXR0aW5ncyAoKTogdm9pZCB7XG4gIGNvbnN0IHsgaGlnaGxpZ2h0TW9kZSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgdXBkYXRlSGlnaGxpZ2h0T3B0aW9uKGhpZ2hsaWdodE1vZGUpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgbGlzdGVuZXJzIGFuZCBjb250cm9scyBmb3IgZGlzcGxheSBwYW5lbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZWlDbGFzc05hbWUgLSBUaGUgY2xhc3MgdXNlZCB0byBzaWduaWZpeSB0aGUgTUVJIGVsZW1lbnQocykuXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFja2dyb3VuZCAtIFRoZSBjbGFzcyB1c2VkIHRvIHNpZ25pZnkgdGhlIGJhY2tncm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RGlzcGxheUNvbnRyb2xzIChtZWlDbGFzc05hbWU6IHN0cmluZywgYmFja2dyb3VuZDogc3RyaW5nKTogdm9pZCB7XG4gIHNldEdseXBoT3BhY2l0eUNvbnRyb2xzKG1laUNsYXNzTmFtZSk7XG4gIHNldEJnT3BhY2l0eUNvbnRyb2xzKGJhY2tncm91bmQpO1xuICBzZXRIaWdobGlnaHRDb250cm9scygpO1xuICBzZXRCdXJnZXJDb250cm9scygpO1xuICBzZXRIaWdobGlnaHRLZXlDb250cm9scygpO1xuICBzZXREaXNwbGF5QWxsTGlzdGVuZXIoKTtcbiAgbG9hZEhpZ2hsaWdodFNldHRpbmdzKCk7XG5cbiAgY29uc3QgZGlzcGxheUNvbnRlbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlDb250ZW50cycpO1xuICBjb25zdCB0b2dnbGVEaXNwbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZURpc3BsYXknKTtcbiAgY29uc3QgZGlzcGxheUhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5SGVhZGVyJyk7XG5cbiAgZGlzcGxheUhlYWRlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvLyBpZiBkaXNwbGF5IHBhbmVsIGlzIGNsb3NlZCwgb3BlbiBpdFxuICAgIGlmIChkaXNwbGF5Q29udGVudHMuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbG9zZWQnKSkge1xuICAgICAgZGlzcGxheUNvbnRlbnRzLmNsYXNzTGlzdC5yZW1vdmUoJ2Nsb3NlZCcpO1xuICAgICAgZGlzcGxheUNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMC41ZW0gMC43NWVtJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkaXNwbGF5Q29udGVudHMuc3R5bGUub3ZlcmZsb3cgPSAndmlzaWJsZSc7XG4gICAgICB9LCAyMDApO1xuICAgICAgdG9nZ2xlRGlzcGxheS5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25gKTtcbiAgICB9IFxuICAgIC8vIGlmIGRpc3BsYXkgcGFuZWwgaXMgb3BlbiwgY2xvc2UgaXRcbiAgICBlbHNlIHtcbiAgICAgIGRpc3BsYXlDb250ZW50cy5jbGFzc0xpc3QuYWRkKCdjbG9zZWQnKTtcbiAgICAgIGRpc3BsYXlDb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRpc3BsYXlDb250ZW50cy5zdHlsZS5wYWRkaW5nID0gJzBweCc7XG4gICAgICB9LCAyMDApO1xuICAgICAgdG9nZ2xlRGlzcGxheS5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLXNpZGVgKTtcbiAgICB9XG4gIH0pO1xufVxuXG4iLCJpbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgU2V0VGV4dEFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IE1vZGFsV2luZG93SW50ZXJmYWNlIH0gZnJvbSAnLi4vSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBob3RrZXlzTW9kYWwsIGVkaXRUZXh0TW9kYWwgfSBmcm9tICcuLi9TcXVhcmVFZGl0L0NvbnRlbnRzJztcbmltcG9ydCB7IG5ld0ZvbGRlckhUTUwsIHJlbmFtZUhUTUwsIHVwbG9hZEFyZWFIVE1MIH0gZnJvbSAnLi4vRGFzaGJvYXJkL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4vRHJhZ0hhbmRsZXInO1xuaW1wb3J0IHsgc2VsZWN0QkJveCwgdW5zZWxlY3QgfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuXG4vKipcbiAqIERlZmluZXMgbW9kYWwgdHlwZXMuXG4gKiBUbyBjcmVhdGUgbmV3IG1vZGFsIHdpbmRvdyB0eXBlcywgYWRkIGVudW0gb3B0aW9uIGFuZCBpbXBsZW1lbnQgbG9naWMgaW5zaWRlIE1vZGFsIGNsYXNzLlxuICovXG5leHBvcnQgZW51bSBNb2RhbFdpbmRvd1ZpZXcge1xuICBFRElUX1RFWFQsXG4gIEhPVEtFWVMsXG4gIEVSUk9SX0xPRywgLy8gZm9yIHZhbGlkYXRpb24gZXJyb3JzIGFnYWluc3QgTUVJIHNjaGVtYSBhbmQgaW52YWxpZCBlbGVtZW50IGVycm9yc1xuICBET0NVTUVOVF9VUExPQUQsXG4gIE1PVkVfVE8sXG4gIE5FV19GT0xERVIsXG4gIFJFTkFNRVxufVxuXG5lbnVtIE1vZGFsV2luZG93U3RhdGUge1xuICBPUEVOLFxuICBDTE9TRURcbn1cblxuXG5cbi8qKlxuICogTW9kYWwgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYW5kIGNvbnRyb2wgc3RhdGUvY29udGVudCBcbiAqIG9mIG1vZGFsIHdpbmRvd3MgaW4gTmVvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGFsV2luZG93IGltcGxlbWVudHMgTW9kYWxXaW5kb3dJbnRlcmZhY2Uge1xuICBwcml2YXRlIG1vZGFsV2luZG93VmlldzogTW9kYWxXaW5kb3dWaWV3OyAvLyBjdXJyZW50IG1vZGFsIHR5cGVcbiAgcHJpdmF0ZSBtb2RhbFdpbmRvd1N0YXRlOiBNb2RhbFdpbmRvd1N0YXRlOyAvLyBvcGVuIG9yIGNsb3NlZD9cbiAgcHJpdmF0ZSBuZW9uVmlldzogTmVvblZpZXc7IC8vIG5lb25WaWV3IGluc3RhbmNlIGNvbnRleHRcblxuXG4gIC8qKlxuICAgKiBTZXQgbmVvblZpZXcgaW5zdGFuY2UgY29udGV4dCBmb3IgdGhpcyBtb2RhbCB3aW5kb3cgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBuZW9uVmlldyBuZW9uVmlldyBjb250ZXh0IGZvciBNb2RhbCBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3PzogTmVvblZpZXcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5DTE9TRUQ7XG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGV2ZW50IGxpc3RlbmVycyB0aGF0IGFwcGx5IHRvIGFsbCBtb2RhbCB3aW5kb3dzXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWhlYWRlci1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93JykuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyLmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250YWluZXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZm9jdXNNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZGFsIHdpbmRvd1xuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctaGVhZGVyLWNsb3NlJykucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3cnKS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRhaW5lcicpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5mb2N1c01vZGFsV2luZG93LmJpbmQodGhpcykpO1xuICB9XG5cblxuICAvKipcbiAgICogU2V0IHRoZSBtb2RhbCB2aWV3IG9mIHRoaXMgTW9kYWwgaW5zdGFuY2UuXG4gICAqIFVwZGF0ZSB0aGUgY29udGVudCBiYXNlZCBvbiBwYXNzZWQgdmlldy5cbiAgICogQHBhcmFtIHZpZXcgVHlwZSBvZiBtb2RhbCB0byBvcGVuIChNb2RhbFZpZXcgZW51bSlcbiAgICovXG4gIHNldE1vZGFsV2luZG93Vmlldyh2aWV3OiBNb2RhbFdpbmRvd1ZpZXcsIGNvbnRlbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsV2luZG93VmlldyA9IHZpZXc7XG4gICAgdGhpcy5zZXRNb2RhbFdpbmRvd0NvbnRlbnQoY29udGVudCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgbW9kYWwgdmlldyBhcyBhIHN0cmluZ1xuICAgKi9cbiAgZ2V0TW9kYWxXaW5kb3dWaWV3KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubW9kYWxXaW5kb3dWaWV3LnRvU3RyaW5nKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBPcGVuIGEgbW9kZWwgd2luZG93IHdpdGggY29udGVudCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgTW9kYWxWaWV3LlxuICAgKi9cbiAgb3Blbk1vZGFsV2luZG93KCk6IHZvaWQge1xuICAgIC8vIG1ha2Ugc3VyZSBubyBvdGhlciBtb2RhbCBjb250ZW50IGlzIGJlaW5nIGRpc3BsYXllZFxuICAgIEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpKS5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICB9KTtcbiAgICBzd2l0Y2godGhpcy5tb2RhbFdpbmRvd1ZpZXcpIHtcbiAgICAgIFxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICB0aGlzLm9wZW5FZGl0U3lsVGV4dE1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkhPVEtFWVM6XG4gICAgICAgIC8vIHNldCB1cCBhbmQgZGlwbGF5IGhvdGtleSBtb2RhbCBjb250ZW50XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXMnKS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRDpcbiAgICAgICAgLy8gYWRkIGZ1bmN0aW9uIHRvIHBhaXJpbmcgYnV0dG9uXG4gICAgICAgIC8vIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5NT1ZFX1RPOlxuICAgICAgICBcbiAgICAgICAgLy8gYnJlYWs7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSOlxuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5SRU5BTUU6XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250YWluZXInKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICB0aGlzLmZvY3VzTW9kYWxXaW5kb3coKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIG1ha2Ugc3VyZSB1c2VyIGNhbid0IHNjcm9sbCB3aGVuIG1vZGFsIGlzIG9wZW5cbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5PUEVOO1xuICB9XG5cblxuXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBOZW9uIG1vZGFsIHdpbmRvd1xuICAgKi9cbiAgaGlkZU1vZGFsV2luZG93KCk6IHZvaWQge1xuICAgIHN3aXRjaCh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICBjb25zdCBzcGFuID0gKDxIVE1MU3BhbkVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzeWxfdGV4dCcpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uc2VsZWN0ZWQtdG8tZWRpdCcpWzBdKTtcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZC10by1lZGl0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRDpcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk1PVkVfVE86XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FOlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1jb250YWluZXInKS5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH0gXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRhaW5lcicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgLy8gcmVzZXQgc2Nyb2xsIGJlaGF2aW9yIG9mIGJvZHlcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dZID0gJ3Njcm9sbCc7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5DTE9TRUQ7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICB9XG5cblxuICAvKipcbiAgICogU2V0IGNvbnRlbnQgb2YgbW9kYWwgd2luZG93XG4gICAqL1xuICBwcml2YXRlIHNldE1vZGFsV2luZG93Q29udGVudChjb250ZW50Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtY29udGFpbmVyJyk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctaGVhZGVyLXRpdGxlJyk7XG5cbiAgICBzd2l0Y2ggKHRoaXMubW9kYWxXaW5kb3dWaWV3KSB7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBlZGl0VGV4dE1vZGFsO1xuICAgICAgICAvLyBzZXQgbW9kYWwgd2luZG93IHRpdGxlXG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdFRElUIFNZTExBQkxFIFRFWFQnO1xuXG4gICAgICAgIC8vIHNwYW4gYW5kIGN1cnJlbnQgdGV4dCBvZiBzZWxlY3RlZC10by1lZGl0IHN5bGxhYmxlIGFuZCBmaWx0ZXIgb3V0IHVud2FudGVkIGNoYXJzXG4gICAgICAgIGNvbnN0IHNwYW4gPSA8SFRNTFNwYW5FbGVtZW50PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3lsX3RleHQnKS5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuLnNlbGVjdGVkLXRvLWVkaXQnKVswXTtcbiAgICAgICAgY29uc3QgcmVtb3ZlU3ltYm9sID0gL1xcdXsyNUNBfS91O1xuICAgICAgICBjb25zdCBvcmlnID0gc3Bhbi50ZXh0Q29udGVudC5yZXBsYWNlKHJlbW92ZVN5bWJvbCwgJycpLnRyaW0oKTtcblxuICAgICAgICAvLyBzZXQgdmFsdWUgb2YgaW5wdXQgZmllbGQgdG8gY3VycmVudCBzeWxsYWJsZSB0ZXh0XG4gICAgICAgICg8SFRNTElucHV0RWxlbWVudD4gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXQnKSkpLnZhbHVlID0gb3JpZztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkhPVEtFWVM6XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBob3RrZXlzTW9kYWw7XG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdIT1RLRVlTJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkVSUk9SX0xPRzpcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IFxuICAgICAgICAgIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMzBweDt3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XCI+JHtjb250ZW50fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1idG5cIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCJkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCwke2VuY29kZVVSSShjb250ZW50KX1cIiBkb3dubG9hZD1cImVycm9yLmxvZ1wiPlxuICAgICAgICAgICAgICBFeHBvcnRcbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdFUlJPUiBMT0cnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSAnRE9DVU1FTlQgVVBMT0FEJztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHVwbG9hZEFyZWFIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTU9WRV9UTzpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ01PVkUgVE8nO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTkVXX0ZPTERFUjpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ05FVyBGT0xERVInO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gbmV3Rm9sZGVySFRNTDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LlJFTkFNRTpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ1JFTkFNRSc7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSByZW5hbWVIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBzZWxlY3Rpb24gdHlwZS4gVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuJyk7XG4gICAgfSBcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggY29udGVudCBmb3IgdXBkYXRpbmcgc3lsbGFibGUgdGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRWRpdFN5bFRleHRNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uKCk6IHZvaWQge1xuICAgIC8vIG1ha2Ugc3VyZSBubyBvdGhlciBtb2RhbCBjb250ZW50IGlzIGJlaW5nIGRpc3BsYXllZFxuICAgIEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpKS5mb3JFYWNoKCAoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgRWRpdCBTeWxsYWJsZSBUZXh0IG1vZGFsIHdpbmRvd1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWVkaXQtdGV4dCcpLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICBcbiAgICAvLyBSZXNldCBcIkNhbmNlbFwiIGJ1dHRvbiBldmVudCBsaXN0ZW5lclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtY2FuY2VsJykucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGlkZU1vZGFsV2luZG93LmJpbmQodGhpcykpO1xuXG4gICAgLy8gUmVzZXQgXCJTYXZlXCIgYnV0dG9uIGV2ZW50IGxpc3RlbmVyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1zYXZlJykucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnVwZGF0ZVN5bFRleHQuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1zYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnVwZGF0ZVN5bFRleHQuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBkaXNwbGF5IG1vZGFsIHdpbmRvd1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250YWluZXInKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIHRoaXMuZm9jdXNNb2RhbFdpbmRvdygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGV4dCBvZiBzZWxlY3RlZC10by1lZGl0IHN5bGxhYmxlcyB3aXRoIHVzZXItcHJvdmlkZWQgdGV4dFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTeWxUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIHNwYW4gYW5kIGN1cnJlbnQgdGV4dCBvZiBzZWxlY3RlZC10by1lZGl0IHN5bGxhYmxlIGFuZCBmaWx0ZXIgb3V0IHVud2FudGVkIGNoYXJzXG4gICAgY29uc3Qgc3BhbiA9IDxIVE1MU3BhbkVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzeWxfdGV4dCcpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uc2VsZWN0ZWQtdG8tZWRpdCcpWzBdO1xuICAgIGNvbnN0IHJlbW92ZVN5bWJvbCA9IC9cXHV7MjVDQX0vdTtcbiAgICBjb25zdCBvcmlnID0gc3Bhbi50ZXh0Q29udGVudC5yZXBsYWNlKHJlbW92ZVN5bWJvbCwgJycpLnRyaW0oKTtcbiAgICBjb25zdCB1cGRhdGVkU3lsVGV4dCA9ICg8SFRNTElucHV0RWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1pbnB1dCcpKS52YWx1ZTtcblxuICAgIGlmICh1cGRhdGVkU3lsVGV4dCAhPT0gbnVsbCAmJiB1cGRhdGVkU3lsVGV4dCAhPT0gb3JpZykge1xuICAgICAgLy8gY3JlYXRlIFwic2V0IHRleHRcIiBhY3Rpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IFsuLi5zcGFuLmNsYXNzTGlzdC5lbnRyaWVzKCldLmZpbHRlcigoY2xhc3NOYW1lKSA9PiBjbGFzc05hbWVbMV0gIT09ICd0ZXh0LXNlbGVjdCcgJiYgY2xhc3NOYW1lWzFdICE9PSAnc2VsZWN0ZWQtdG8tZWRpdCcpWzBdWzFdO1xuICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBTZXRUZXh0QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnRJZCxcbiAgICAgICAgICB0ZXh0OiB1cGRhdGVkU3lsVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBzZW5kIGFjdGlvbiB0byB2ZXJvdmlvIGZvciBwcm9jZXNzaW5nXG4gICAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzcG9uc2U6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBTVkdcbiAgICAgICAgICB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBBbiB1cGRhdGUgdG8gdGhlIHBhZ2Ugd2lsbCByZWxvYWQgdGhlIGVudGlyZSBzdmc7XG4gICAgICAgICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIHRoZW4gcmVzZWxlY3QgdGhlIHNhbWUgc2VsZWN0ZWQgc3lsbGFibGVcbiAgICAgICAgICAgIC8vIGlmIGJib3hlcyBhcmUgZW5hYmxlZFxuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEJCb3goc3BhbiwgdGhpcy5kcmFnSGFuZGxlciwgdGhpcy5uZW9uVmlldyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXNlbGVjdCBpZiBubyBjaGFuZ2UgaXMgbWFkZVxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEJCb3goc3BhbiwgdGhpcy5kcmFnSGFuZGxlciwgdGhpcy5uZW9uVmlldyk7XG4gICAgfVxuICAgIC8vIGNsb3NlIG1vZGFsIHdpbmRvd1xuICAgIHRoaXMuaGlkZU1vZGFsV2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgYm91bmRpbmcgYm94IHNlbGVjdGVkIHdoZW4gdGhlIGVkaXQgdGV4dCBtb2RhbCBoYXMgYmVlbiBjbGlja2VkIFxuICAqL1xuICB1cGRhdGVTZWxlY3RlZEJCb3ggKHNwYW46IEhUTUxTcGFuRWxlbWVudCwgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyLCBuZW9uVmlldzogTmVvblZpZXcpOiB2b2lkIHtcbiAgICB1bnNlbGVjdCgpO1xuXG4gICAgY29uc3QgYmJveElkID0gQXJyYXkuZnJvbShzcGFuLmNsYXNzTGlzdCkuZmluZChlID0+IGUgIT09ICd0ZXh0LXNlbGVjdCcgJiYgZSAhPT0gJ3NlbGVjdGVkLXRvLWVkaXQnKTtcblxuICAgIGlmICgoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlCQm94JykgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZCkge1xuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJib3hJZCkpIHtcbiAgICAgICAgY29uc3QgZGlzcGxheVJlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiYm94SWQpLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JykgYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICBzZWxlY3RCQm94KGRpc3BsYXlSZWN0LCBkcmFnSGFuZGxlciwgbmVvblZpZXcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggaG90a2V5IGluZm8gY29udGVudFxuICAgKi9cbiAgLypcbiAgcHJpdmF0ZSBvcGVuSG90a2V5TW9kYWxXaW5kb3cgPSBmdW5jdGlvbigpIHsgICBcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQnKSkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgYW5kIGRpcGxheSBob3RrZXkgbW9kYWwgY29udGVudFxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXMnKS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICB0aGlzLmZvY3VzTW9kYWxXaW5kb3coKTtcbiAgfTtcbiAgKi9cblxuXG4gIC8qKlxuICAgKiBEZWZpbmUgZXZlbnQgbGlzdGVuZXJzIGZvciBtb2RhbCB3aW5kb3cgYmFzZWQgb24gbW9kYWxWaWV3IHR5cGVcbiAgICovXG4gIHByaXZhdGUga2V5ZG93bkxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIHByZXZlbnQgTmVvbiBob3RrZXkgZXZlbnRzIGZyb20gZmlyaW5nIHdoZW4gdXNlciBpcyB0eXBpbmdcblxuICAgIHN3aXRjaCh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHRoaXMudXBkYXRlU3lsVGV4dCgpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB0aGlzLmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIH0gIFxuICB9O1xuXG5cbiAgLyoqXG4gICAqIEV2ZW50IGxpc3RlbmVyIHRoYXQgZm9jdXNlcyB0aGUgbW9kYWwgd2luZG93IGlmIHVzZXIgY2xpY2tzIGFueXdoZXJlIG91dHNpZGUgb2YgaXRcbiAgICovXG4gIHByaXZhdGUgZm9jdXNNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICAoPEhUTUxJbnB1dEVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXQnKSkuc2VsZWN0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTkVXX0ZPTERFUjpcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LlJFTkFNRTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3cnKS5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxufVxuIiwiaW1wb3J0ICogYXMgQ29udGVudHMgZnJvbSAnLi9Db250ZW50cyc7XG5pbXBvcnQgKiBhcyBHcm91cGluZyBmcm9tICcuL0dyb3VwaW5nJztcbmltcG9ydCBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBTcGxpdFN0YWZmSGFuZGxlciB9IGZyb20gJy4vU3RhZmZUb29scyc7XG5pbXBvcnQgeyBTcGxpdE5ldW1lSGFuZGxlciB9IGZyb20gJy4vTmV1bWVUb29scyc7XG5pbXBvcnQge1xuICBDaGFpbkFjdGlvbixcbiAgQ2hhbmdlU3RhZmZBY3Rpb24sXG4gIERpc3BsYWNlQ2xlZk9jdGF2ZUFjdGlvbixcbiAgRWRpdG9yQWN0aW9uLFxuICBNYXRjaEhlaWdodEFjdGlvbixcbiAgUmVtb3ZlQWN0aW9uLFxuICBTZXRBY3Rpb24sXG4gIFNldENsZWZBY3Rpb24sXG4gIFNldExpcXVlc2NlbnRBY3Rpb25cbn0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgZ2V0U3RhZmZCQm94IH0gZnJvbSAnLi4vdXRpbHMvU2VsZWN0VG9vbHMnO1xuXG4vKipcbiAqIFRoZSBOZW9uVmlldyBwYXJlbnQgdG8gY2FsbCBlZGl0b3IgYWN0aW9ucy5cbiAqL1xubGV0IG5lb25WaWV3OiBOZW9uVmlldztcblxuLyoqXG4gKiBJbml0aWFsaXplIE5lb25WaWV3LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdE5lb25WaWV3ICh2aWV3OiBOZW9uVmlldyk6IHZvaWQge1xuICBuZW9uVmlldyA9IHZpZXc7XG4gIEdyb3VwaW5nLmluaXROZW9uVmlldyh2aWV3KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgaW5jbGluYXR1bSBwYXJhbWV0ZXIgb2YgYSBuZXVtZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldEluY2xpbmF0dW1BY3Rpb24gKGlkOiBzdHJpbmcpOiBTZXRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldCcsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgYXR0clZhbHVlOiAnJ1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgdmlyZ2EgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRWaXJnYUFjdGlvbiAoaWQ6IHN0cmluZyk6IFNldEFjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgYWN0aW9uOiAnc2V0JyxcbiAgICBwYXJhbToge1xuICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgIGF0dHJUeXBlOiAndGlsdCcsXG4gICAgICBhdHRyVmFsdWU6ICcnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSByZXZlcnNlZCB2aXJnYSBwYXJhbWV0ZXIgb2YgYSBuZXVtZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldFZpcmdhUmV2ZXJzZWRBY3Rpb24gKGlkOiBzdHJpbmcpOiBTZXRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldCcsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgYXR0clZhbHVlOiAnJ1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgbGlxdWVzY2VudF9jbG9ja3dpc2UgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uIChpZDogc3RyaW5nKTogU2V0QWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246ICdzZXQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgYXR0clR5cGU6ICdjdXJ2ZScsXG4gICAgICBhdHRyVmFsdWU6ICcnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBsaXF1ZXNjZW50X2FudGljbG9ja3dpc2UgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbiAoaWQ6IHN0cmluZyk6IFNldExpcXVlc2NlbnRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldExpcXVlc2NlbnQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgY3VydmU6ICcnXG4gICAgfVxuICB9O1xufVxuXG4vKiogRXZlbnQgaGFuZGxlciBmb3IgZGVsZXRlIGJ1dHRvbiBwcmVzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVCdXR0b25IYW5kbGVyIChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgaWYgKGV2dC5rZXkgPT09ICdkJyB8fCBldnQua2V5ID09PSAnQmFja3NwYWNlJykgeyByZW1vdmVIYW5kbGVyKCk7IGV2dC5wcmV2ZW50RGVmYXVsdCgpOyB9XG59XG5cbi8qKlxuICogRW5kIHRoZSBleHRyYSBvcHRpb25zIG1lbnUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmRPcHRpb25zU2VsZWN0aW9uICgpOiB2b2lkIHtcbiAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKTtcbiAgY29uc3QgZXh0cmFFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpO1xuICBpZiAobW9yZUVkaXQpIHtcbiAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICB9XG4gIGlmIChleHRyYUVkaXQpIHtcbiAgICBleHRyYUVkaXQuaW5uZXJIVE1MID0gJyc7XG4gICAgZXh0cmFFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gIH1cbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZGVsZXRlQnV0dG9uSGFuZGxlcik7XG59XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBoYW5kbGUgcmVtb3ZpbmcgZWxlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUhhbmRsZXIgKCk6IHZvaWQge1xuICBjb25zdCB0b1JlbW92ZTogUmVtb3ZlQWN0aW9uW10gPSBbXTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICBzZWxlY3RlZC5mb3JFYWNoKGVsZW0gPT4ge1xuICAgIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgIGVsZW0gPSBlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpO1xuICAgIH1cbiAgICBpZiAoZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2FjY2lkJykpIHtcbiAgICAgIGVsZW0gPSBlbGVtLmNsb3Nlc3QoJy5hY2NpZCcpO1xuICAgIH1cbiAgICBpZiAoZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSkge1xuICAgICAgZWxlbSA9IGVsZW0uY2xvc2VzdCgnLmRpdkxpbmUnKTtcbiAgICB9XG4gICAgdG9SZW1vdmUucHVzaChcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAncmVtb3ZlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW0uaWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuICBjb25zdCBjaGFpbkFjdGlvbjogQ2hhaW5BY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b1JlbW92ZVxuICB9O1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIG5lb25WaWV3LmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigoKSA9PiB7IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSByZS1hc3NvY2lhdGluZyBlbGVtZW50cyB0byB0aGUgbmVhcmVzdCBzdGFmZlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlU3RhZmZIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCB0b0NoYW5nZTogQ2hhbmdlU3RhZmZBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goZWxlbSA9PiB7XG4gICAgdG9DaGFuZ2UucHVzaChcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAnY2hhbmdlU3RhZmYnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbS5pZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b0NoYW5nZVxuICB9O1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIG5lb25WaWV3LmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigoKSA9PiB7IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSBpbnNlcnRpbmcgZGl2aXNpbyBvciBhY2NpZGVudGFsIGludG8gbmVhcmVzdCBzeWxsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHRvSW5zZXJ0OiBFZGl0b3JBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goZWxlbSA9PiB7XG4gICAgdG9JbnNlcnQucHVzaChcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAnaW5zZXJ0VG9TeWxsYWJsZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgY29uc3QgY2hhaW5BY3Rpb246IENoYWluQWN0aW9uID0ge1xuICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICBwYXJhbTogdG9JbnNlcnRcbiAgfTtcbiAgbmVvblZpZXcuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHsgXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdJbnNlcnQgU3VjY2VzcycsICdzdWNjZXNzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignSW5zZXJ0IEZhaWxlZCBYb1gnLCAnZXJyb3InKTtcbiAgICB9XG4gICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IFxuICB9KTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBoYW5kbGUgbW92aW5nIGRpdmlzaW8gb3IgYWNjaWRlbnRhbCBvdXQgb2Ygc3lsbGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdmVPdXRzaWRlU3lsbGFibGVIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCB0b01vdmU6IEVkaXRvckFjdGlvbltdID0gW107XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgc2VsZWN0ZWQuZm9yRWFjaChlbGVtID0+IHtcbiAgICB0b01vdmUucHVzaChcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAnbW92ZU91dHNpZGVTeWxsYWJsZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgY29uc3QgY2hhaW5BY3Rpb246IENoYWluQWN0aW9uID0ge1xuICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICBwYXJhbTogdG9Nb3ZlXG4gIH07XG4gIG5lb25WaWV3LmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7IFxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTW92ZSBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdNb3ZlIEZhaWxlZCBYb1gnLCAnZXJyb3InKTtcbiAgICB9XG4gICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IFxuICB9KTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBtYXRjaCBiYm94IGhlaWdodCB0byB0aGUgc2VsZWN0ZWQgYmJveFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hIZWlnaHRIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdDYW5ub3QgbWF0Y2ggaGVpZ2h0IHRvIG11bHRpcGxlIGJib3gnLCAnZXJyb3InKTtcbiAgfVxuICBjb25zdCB0b0NoYW5nZTogTWF0Y2hIZWlnaHRBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnbWF0Y2hIZWlnaHQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IHNlbGVjdGVkWzBdLmlkXG4gICAgfVxuICB9O1xuXG4gIG5lb25WaWV3LmVkaXQodG9DaGFuZ2UsIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7IFxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignSGVpZ2h0IE1hdGNoIFN1Y2Nlc3MnLCAnc3VjY2VzcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0hlaWdodCBNYXRjaCBGYWlsZWQgWG9YJywgJ2Vycm9yJyk7XG4gICAgfVxuICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpOyBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZERlbGV0ZUxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBkZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlJyk7XG5cbiAgaWYgKGRlbCkge1xuICAgIGRlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuICAgIGRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuXG4gICAgLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgb3V0c2lkZSB0aGUgaWYgY29uZGl0aW9uP1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRlbGV0ZUJ1dHRvbkhhbmRsZXIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBjaGFuZ2VTdGFmZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFuZ2VTdGFmZicpO1xuICBjaGFuZ2VTdGFmZj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFuZ2VTdGFmZkhhbmRsZXIpO1xuICBjaGFuZ2VTdGFmZj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFuZ2VTdGFmZkhhbmRsZXIpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgaW5wdXRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlQ29sdW1uSW5mbygpOiB2b2lkIHtcbiAgY29uc3QgY29sSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgc3RhdmVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmLnNlbGVjdGVkJyk7XG4gIGxldCBjb2xJbmZvOiBudW1iZXI7XG4gIGZvciAoY29uc3Qgc3RhZmYgb2Ygc3RhdmVzKSB7XG4gICAgY29uc3QgaGFzQ29sdW1uID0gQXJyYXkuZnJvbShzdGFmZi5jbGFzc0xpc3QpLmpvaW4oJyAnKS5tYXRjaCgvXFxiY29sdW1uKFxcZCspXFxiLyk7XG4gICAgaWYgKGhhc0NvbHVtbikge1xuICAgICAgY29uc3Qgc3RhZmZDb2wgPSBwYXJzZUludChoYXNDb2x1bW5bMV0sIDEwKTtcbiAgICAgIGlmIChjb2xJbmZvICYmIGNvbEluZm8gIT0gc3RhZmZDb2wpIHtcbiAgICAgICAgY29uc3Qgd2FybmluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2wtd2FybmluZycpO1xuICAgICAgICB3YXJuaW5nLmlubmVyVGV4dCA9ICdUaGUgc2VsZWN0ZWQgc3RhdmVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgY29sdW1uISc7XG4gICAgICAgIGNvbEluZm8gPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbEluZm8gPSBzdGFmZkNvbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gXG4gIGlmIChjb2xJbmZvKSBjb2xJbnB1dC52YWx1ZSA9IGNvbEluZm8udG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBBZGQgY29sdW1uIGluZm8gZWRpdCBoYW5kbGVyIGZvciBjb2x1bW4gaW5mbyBlZGl0b3JcbiAqL1xuZnVuY3Rpb24gYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCBkZWNyZW1lbnRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWRlY3JlbWVudCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICBjb25zdCBpbmNyZW1lbnRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWluY3JlbWVudCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICBjb25zdCBjb25maXJtQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbC1jb25maXJtJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGNvbnN0IGNvbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbC1pbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgZGVjcmVtZW50QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZU51bWJlcigtMSk7XG4gIH0pO1xuXG4gIGluY3JlbWVudEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB1cGRhdGVOdW1iZXIoMSk7XG4gIH0pO1xuXG4gIC8vIEFkZCBjb2x1bW4gaW5mbyBlZGl0IGhhbmRsZXJcbiAgY29uZmlybUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b1NldENvbHVtbjogRWRpdG9yQWN0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzdGF2ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhZmYuc2VsZWN0ZWQnKTtcbiAgICBzdGF2ZXMuZm9yRWFjaChzdGFmZiA9PiB7XG4gICAgICB0b1NldENvbHVtbi5wdXNoKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgZWxlbWVudElkOiBzdGFmZi5pZCxcbiAgICAgICAgICAgIGF0dHJUeXBlOiAndHlwZScsXG4gICAgICAgICAgICBhdHRyVmFsdWU6ICdjb2x1bW4nICsgY29sSW5wdXQudmFsdWUsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IGNoYWluQWN0aW9uOiBDaGFpbkFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgIHBhcmFtOiB0b1NldENvbHVtblxuICAgIH07XG4gICAgbmVvblZpZXcuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHsgXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ29sdW1uIFZhbHVlIFVwZGF0ZSBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ29sdW1uIFZhbHVlIFVwZGF0ZSBGYWlsZWQgWG9YJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpOyBcbiAgICB9KTtcbiAgfSk7XG4gIFxuICBmdW5jdGlvbiB1cGRhdGVOdW1iZXIoY2hhbmdlOiBudW1iZXIpIHtcbiAgICBjb25zdCBtaW5OdW0gPSAxO1xuICAgIGNvbnN0IG1heE51bSA9IDU7XG4gICAgbGV0IGN1cnJlbnRWYWx1ZSA9IHBhcnNlSW50KGNvbElucHV0LnZhbHVlLCAxMCkgfHwgMDtcbiAgICBjdXJyZW50VmFsdWUgKz0gY2hhbmdlO1xuXG4gICAgY3VycmVudFZhbHVlID0gTWF0aC5taW4oTWF0aC5tYXgoY3VycmVudFZhbHVlLCBtaW5OdW0pLCBtYXhOdW0pO1xuICAgIGlmIChjdXJyZW50VmFsdWUudG9TdHJpbmcoKSAhPSBjb2xJbnB1dC52YWx1ZSkgY29uZmlybUJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgY29sSW5wdXQudmFsdWUgPSBjdXJyZW50VmFsdWUudG9TdHJpbmcoKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHNldCB0aGUgSFRNTCBjb250ZW50IG9mIGVkaXQgY29udHJvbHM6IGVpdGhlciAjbW9yZUVkaXQgb3IgI2V4dHJhRWRpdFxuICpcbiAqIEBwYXJhbSB7J21vcmVFZGl0JyB8ICdleHRyYUVkaXQnfSBlZGl0VHlwZSAtIFRoZSB0eXBlIG9mIGVkaXQgY29udHJvbHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50cyAtIFRoZSBpbm5lckhUTUwgY29udGVudHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVwbGFjZSAtIElzIHRoZSBpbm5lckhUTUwgYmVpbmcgcmVwbGFjZWQsIG9yIGJlaW5nIGFkZGVkIHRvP1xuICovXG5mdW5jdGlvbiBzZXRFZGl0Q29udHJvbHMoZWRpdFR5cGU6ICdtb3JlRWRpdCcgfCAnZXh0cmFFZGl0JywgY29udGVudHM6IHN0cmluZywgcmVwbGFjZSA9IHRydWUpOiB2b2lkIHtcbiAgY29uc3QgZWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRUeXBlKTtcbiAgXG4gIGlmIChlZGl0KSB7XG4gICAgZWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgIGlmIChyZXBsYWNlKSBlZGl0LmlubmVySFRNTCA9IGNvbnRlbnRzO1xuICAgIGVsc2UgZWRpdC5pbm5lckhUTUwgKz0gY29udGVudHM7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmlnZ2VyIHRoZSBleHRyYSBuYyBhY3Rpb24gbWVudSBmb3IgYSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyTmNBY3Rpb25zIChuYzogU1ZHR3JhcGhpY3NFbGVtZW50KTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdEFjdGlvbkNvbnRlbnRzKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5uY0FjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjUHVuY3R1bS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBuZW9uVmlldy5lZGl0KHsgYWN0aW9uOiAnY2hhaW4nLCBwYXJhbTogWyB1bnNldEluY2xpbmF0dW0sIHVuc2V0VmlyZ2EsIHVuc2V0VmlyZ2FSZXZlcnNlZCwgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLCB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlIF0gfSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0luY2xpbmF0dW0uZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCBzZXRJbmNsaW5hdHVtOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3NlJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbmVvblZpZXcuZWRpdCh7IGFjdGlvbjogJ2NoYWluJywgcGFyYW06IFsgdW5zZXRWaXJnYSwgdW5zZXRWaXJnYVJldmVyc2VkLCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsIHNldEluY2xpbmF0dW0gXSB9ICwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1ZpcmdhLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2FSZXZlcnNlZCA9IHVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHNldFZpcmdhOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3MnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KHsgYWN0aW9uOiAnY2hhaW4nLCBwYXJhbTogWyB1bnNldFZpcmdhUmV2ZXJzZWQsIHVuc2V0SW5jbGluYXR1bSwgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLCB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLCBzZXRWaXJnYSBdIH0sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNWaXJnYVJldmVyc2VkLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2V0SW5jbGluYXR1bSA9IHVuc2V0SW5jbGluYXR1bUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldFZpcmdhID0gdW5zZXRWaXJnYUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3Qgc2V0VmlyZ2FSZXZlcnNlZDogU2V0QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogbmMuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICd0aWx0JyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICduJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbmVvblZpZXcuZWRpdCh7IGFjdGlvbjogJ2NoYWluJywgcGFyYW06IFsgdW5zZXRJbmNsaW5hdHVtLCB1bnNldFZpcmdhLCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsIHNldFZpcmdhUmV2ZXJzZWQgXSB9LCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjTGlxdWVzY2VudENsb2Nrd2lzZS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHNldExpcXVlc2NlbnRDbG9ja3dpc2U6IFNldExpcXVlc2NlbnRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldExpcXVlc2NlbnQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogbmMuaWQsXG4gICAgICAgICAgY3VydmU6ICdjJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbmVvblZpZXcuZWRpdCh7IGFjdGlvbjogJ2NoYWluJywgcGFyYW06IFsgdW5zZXRJbmNsaW5hdHVtLCB1bnNldFZpcmdhLCB1bnNldFZpcmdhUmV2ZXJzZWQsIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsIHNldExpcXVlc2NlbnRDbG9ja3dpc2UgXSB9LCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9KTtcbiAgICB9KTsgIFxuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCBzZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZTogU2V0TGlxdWVzY2VudEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0TGlxdWVzY2VudCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBjdXJ2ZTogJ2EnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KHsgYWN0aW9uOiAnY2hhaW4nLCBwYXJhbTogWyB1bnNldEluY2xpbmF0dW0sIHVuc2V0VmlyZ2EsIHVuc2V0VmlyZ2FSZXZlcnNlZCwgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLCBzZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSBdIH0sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgIH0pO1xuICAgIH0pOyAgXG5cbiAgaW5pdE9wdGlvbnNMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGV4dHJhIG5ldW1lIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyTmV1bWVBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuXG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5kZWZhdWx0TmV1bWVBY3Rpb25Db250ZW50cyk7XG4gIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMubmV1bWVBY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgY29uc3QgbmV1bWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKTtcbiAgaWYgKG5ldW1lLmxlbmd0aCAhPT0gMSkge1xuICAgIGNvbnNvbGUud2FybignTW9yZSB0aGFuIG9uZSBuZXVtZSBzZWxlY3RlZCEgQ2Fubm90IHRyaWdnZXIgTmV1bWUgQ2xpY2tTZWxlY3QgYWN0aW9ucy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUT0RPIGFkZCB0cmlnZ2VyIGZvciBzcGxpdCBhY3Rpb25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwbGl0LW5ldW1lJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXVtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uZXVtZS5zZWxlY3RlZCcpIGFzIFNWR0dFbGVtZW50O1xuICAgICAgaWYgKG5ldW1lICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gbmV3IFNwbGl0TmV1bWVIYW5kbGVyKG5lb25WaWV3LCBuZXVtZSk7XG4gICAgICAgIHNwbGl0LnN0YXJ0U3BsaXQoKTtcbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkIScpO1xuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1Blcy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1Blc1N1YnB1bmN0aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDbGl2aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNTY2FuZGljdXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNTY2FuZGljdXNGbGV4dXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNTY2FuZGljdXNTdWJwdW5jdGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZSgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTsgXG4gICAgfSk7IFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjQ2xpbWFjdXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDbGltYWN1c1Jlc3VwaW51cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1RvcmN1bHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZSgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTsgXG4gICAgfSk7IFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjVG9yY3VsdXNSZXN1cGludXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNQb3JyZWN0dXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNQb3JyZWN0dXNGbGV4dXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNQb3JyZWN0dXNTdWJwdW5jdGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZSgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTsgXG4gICAgfSk7IFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjUHJlc3N1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcblxuICBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlR3JvdXAgKGNvbnRvdXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5nZUdyb3VwaW5nQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdjaGFuZ2VHcm91cCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IG5ldW1lWzBdLmlkLFxuICAgICAgICBjb250b3VyOiBjb250b3VyXG4gICAgICB9XG4gICAgfTtcbiAgICBuZW9uVmlldy5lZGl0KGNoYW5nZUdyb3VwaW5nQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdHcm91cGluZyBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgfSk7XG4gIH1cblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgc3lsbGFibGUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJTeWxsYWJsZUFjdGlvbnMgKHNlbGVjdGlvblR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG5cbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLnN5bGxhYmxlQWN0aW9uc0NvbnRlbnQpO1xuICAvLyBpbml0aWFsaXplIHZhcmlhYmxlIHRoYXQgd2lsbCBob2xkIGh0bWwgdG8gYmUgYWRkZWQgdG8gRGlzcGxheSBwYW5lbFxuICBsZXQgZXh0cmFBY3Rpb25zSFRNTCA9ICcnO1xuXG4gIC8vIGRldGVybWluZSB0aGUgdHlwZSBvZiBzZWxlY3Rpb24gdGhhdCB3YXMgbWFkZSBieSB0aGUgdXNlclxuICBzd2l0Y2goc2VsZWN0aW9uVHlwZSkge1xuICAgIC8vIG9ubHkgb25lIHN5bGxhYmxlXG4gICAgY2FzZSAnc2luZ2xlU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5ldW1lc1wiPlVuZ3JvdXA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyB0d28gc3lsbGFibGVzIG9uIHNlcGFyYXRlIHN0YXZlc1xuICAgIGNhc2UgJ2xpbmthYmxlU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidG9nZ2xlLWxpbmtcIj5Ub2dnbGUgTGlua2VkIFN5bGxhYmxlczwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBicmVhaztcblxuICAgIC8vIHRvdyBvciBtb3JlIHN5bGxhYmxlcyBvbiBvbmUgc3RhZmZcbiAgICBjYXNlICdtdWx0aVNlbGVjdCc6XG4gICAgICBleHRyYUFjdGlvbnNIVE1MICs9IFxuICAgICAgICBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cIm1lcmdlU3lsc1wiPk1lcmdlIFN5bGxhYmxlczwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBicmVhaztcblxuICAgIC8vZGVmYXVsdCBvcHRpb25zXG4gICAgY2FzZSAnZGVmYXVsdCc6XG4gICAgICBleHRyYUFjdGlvbnNIVE1MICs9IFxuICAgICAgICBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgfVxuXG4gIC8vIHNldCBjb250ZW50IG9mIGFkZGl0aW9uYWwgYWN0aW9ucyBpbiBEaXNwbGF5IHBhbmVsIFxuICAvLyBhbmQgaW5pdGlhbGl6ZSBuZWNlc3NhcnkgbGlzdGVuZXJzXG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBleHRyYUFjdGlvbnNIVE1MLCB0cnVlKTtcbiAgYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lcigpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbn1cblxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgbGF5ZXIgZWxlbWVudCAoYWNjaWQsIGRpdkxpbmUsIGN1c3RvcywgY2xlZikgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJMYXllckVsZW1lbnRBY3Rpb25zIChlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnY3VzdG9zJykpIHtcbiAgICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuY3VzdG9zQWN0aW9uQ29udGVudHMpO1xuICAgIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBjb25zdCBwYXJlbnRJc1N5bGxhYmxlID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsbGFibGUnKTtcbiAgY29uc3QgbGF5ZXJFbGVtZW50QWN0aW9ucyA9IHBhcmVudElzU3lsbGFibGVcbiAgICA/IENvbnRlbnRzLmxheWVyRWxlbWVudEluQWN0aW9uQ29udGVudHNcbiAgICA6IENvbnRlbnRzLmxheWVyRWxlbWVudE91dEFjdGlvbkNvbnRlbnRzO1xuICBcbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIGxheWVyRWxlbWVudEFjdGlvbnMsIGZhbHNlKTtcbiAgXG4gIC8vIGV4dHJhIGFjdGlvbnMgZm9yIGFjY2lkIGFuZCBkaXZMaW5lXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYWNjaWQnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuYWNjaWRBY3Rpb25Db250ZW50cyk7XG4gICAgYWNjaWRPcHRpb25zTGlzdGVuZXIoZWxlbWVudCk7XG4gIH1cbiAgZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuY2xlZkFjdGlvbkNvbnRlbnRzKTtcbiAgICBjbGVmT3B0aW9uc0xpc3RlbmVyKGVsZW1lbnQpO1xuICB9XG4gIGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXZMaW5lJykpIHtcbiAgICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLmRpdkxpbmVBY3Rpb25Db250ZW50cyk7XG4gICAgZGl2TGluZU9wdGlvbnNMaXN0ZW5lcihlbGVtZW50KTtcbiAgfVxuICBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnNlcnRUb1N5bGxhYmxlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92ZU91dHNpZGVTeWxsYWJsZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1vdmVPdXRzaWRlU3lsbGFibGVIYW5kbGVyKTtcblxuIFxuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydFRvU3lsbGFibGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpbnNlcnRUb1N5bGxhYmxlSGFuZGxlcik7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3ZlT3V0c2lkZVN5bGxhYmxlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbW92ZU91dHNpZGVTeWxsYWJsZUhhbmRsZXIpO1xufVxuXG5mdW5jdGlvbiBhY2NpZE9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvRmxhdC5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VUb0ZsYXQ6IFNldEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdhY2NpZCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnZidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oY2hhbmdlVG9GbGF0KTtcbiAgICB9KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTmF0dXJhbC5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VUb05hdHVyYWw6IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdhY2NpZCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oY2hhbmdlVG9OYXR1cmFsKTtcbiAgICB9KTtcblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xuXG59XG5cbmZ1bmN0aW9uIGNsZWZPcHRpb25zTGlzdGVuZXIoZWxlbWVudDogU1ZHR3JhcGhpY3NFbGVtZW50KTogdm9pZCB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbmNyZW1lbnQtb2N0YXZlJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbmNyZW1lbnRPY3RhdmU6IERpc3BsYWNlQ2xlZk9jdGF2ZUFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnZGlzcGxhY2VDbGVmT2N0YXZlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgZGlyZWN0aW9uOiAnYWJvdmUnXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG5lb25WaWV3LmVkaXQoaW5jcmVtZW50T2N0YXZlLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdDbGVmIG9jdGF2ZSBpbmNyZW1lbnRlZC4nLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTWF4aW11bSBvY3RhdmUgZGlzcGxhY2VtZW50IHJlYWNoZWQuIENsZWYgY2FuIG9ubHkgYmUgZGlzcGxhY2VkIHVwIHRvIDMgb2N0YXZlcy4nLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGVjcmVtZW50LW9jdGF2ZScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5jcmVtZW50T2N0YXZlOiBEaXNwbGFjZUNsZWZPY3RhdmVBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ2Rpc3BsYWNlQ2xlZk9jdGF2ZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGRpcmVjdGlvbjogJ2JlbG93J1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBuZW9uVmlldy5lZGl0KGluY3JlbWVudE9jdGF2ZSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xlZiBvY3RhdmUgZGVjcmVtZW50ZWQuJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ01heGltdW0gb2N0YXZlIGRpc3BsYWNlbWVudCByZWFjaGVkLiBDbGVmIGNhbiBvbmx5IGJlIGRpc3BsYWNlZCB1cCB0byAzIG9jdGF2ZXMuJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NDbGVmLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNldENDbGVmOiBTZXRDbGVmQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRDbGVmJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgc2hhcGU6ICdDJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihzZXRDQ2xlZik7XG4gICAgfSk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNGQ2xlZi5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRGQ2xlZjogU2V0Q2xlZkFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0Q2xlZicsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHNoYXBlOiAnRidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oc2V0RkNsZWYpO1xuICAgIH0pO1xuXG4gIGluaXRPcHRpb25zTGlzdGVuZXJzKCk7XG59XG5cbmZ1bmN0aW9uIGRpdkxpbmVPcHRpb25zTGlzdGVuZXIoZWxlbWVudDogU1ZHR3JhcGhpY3NFbGVtZW50KTogdm9pZCB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDaGFuZ2VUb01pbmltYS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBDaGFuZ2VUb01pbmltYTogU2V0QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ21pbmltYSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9NaW5pbWEpO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDaGFuZ2VUb01haW9yLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWFpb3I6IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdmb3JtJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICdtYWlvcidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9NYWlvcik7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTWF4aW1hLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWF4aW1hOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWF4aW1hJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihDaGFuZ2VUb01heGltYSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvRmluYWxpcy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBDaGFuZ2VUb0ZpbmFsaXM6IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdmb3JtJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICdmaW5hbGlzJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihDaGFuZ2VUb0ZpbmFsaXMpO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDaGFuZ2VUb0NhZXN1cmEuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ2hhbmdlVG9DYWVzdXJhOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnY2Flc3VyYSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9DYWVzdXJhKTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9WaXJndWxhLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvVmlyZ3VsYTogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3Zpcmd1bGEnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKENoYW5nZVRvVmlyZ3VsYSk7XG4gICAgfSk7XG4gICAgXG4gIGluaXRPcHRpb25zTGlzdGVuZXJzKCk7XG59XG5cbi8qKlxuICogUGFyc2UgYWN0aW9ucyByZWdhcmRpbmcgc2hhcGUgY2hhbmdlcyB0byBlZGl0b3IgYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oYWN0aW9uOiBTZXRBY3Rpb24gfCBTZXRDbGVmQWN0aW9uKSB7XG4gIG5lb25WaWV3LmVkaXQoYWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlZCcsICdzdWNjZXNzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlIEZhaWxlZCcsICdlcnJvcicpO1xuICAgIH1cbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVHJpZ2dlciBleHRyYSBzdGFmZiBhY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlck11bHRpU3RhZmZBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuc3RhZmZNZXJnZUFjdGlvbkNvbnRlbnRzKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5jb2x1bW5BY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgLy8gQ29sdW1uIGluZm8gZWRpdG9yXG4gIHVwZGF0ZUNvbHVtbkluZm8oKTtcbiAgYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lcmdlLXN5c3RlbXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBHcm91cGluZy5tZXJnZVN0YXZlcygpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFbnRlciBzdGFmZiBzcGxpdHRpbmcgbW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclN0YWZmU3BsaXRNb2RlICgpOiB2b2lkIHtcbiAgY29uc3Qgc3RhZmYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3RhZmYuc2VsZWN0ZWQnKSBhcyBTVkdHRWxlbWVudDtcbiAgaWYgKHN0YWZmICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3BsaXQgPSBuZXcgU3BsaXRTdGFmZkhhbmRsZXIobmVvblZpZXcsIHN0YWZmKTtcbiAgICBzcGxpdC5zdGFydFNwbGl0KCk7XG4gICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoJ05vIHN0YWZmIHdhcyBzZWxlY3RlZCEnKTtcbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmlnZ2VyIHNwbGl0IHN0YWZmIG9wdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNpbmdsZVN0YWZmQWN0aW9ucyAoKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLnN0YWZmU3BsaXRBY3Rpb25Db250ZW50cyk7XG4gIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuY29sdW1uQWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIC8vIENvbHVtbiBpbmZvIGVkaXRvclxuICB1cGRhdGVDb2x1bW5JbmZvKCk7XG4gIGFkZENvbHVtbkluZm9TdGVwSGFuZGxlcigpO1xuXG4gIC8vIEFkZCB0cmlnZ2VyIGZvciBzcGxpdCBhY3Rpb25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwbGl0LXN5c3RlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdHJpZ2dlclN0YWZmU3BsaXRNb2RlKCk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LXJvdGF0ZScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhZmYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3RhZmYuc2VsZWN0ZWQnKSBhcyBTVkdFbGVtZW50O1xuICAgICAgLy8gVW51c2VkIHZhcmlhYmxlczpcbiAgICAgIC8vIGNvbnN0IHJlY3QgPSBzdGFmZi5xdWVyeVNlbGVjdG9yKCcjcmVzaXplUmVjdCcpO1xuICAgICAgLy8gY29uc3QgY28gPSByZWN0LmdldEF0dHJpYnV0ZSgncG9pbnRzJykuc3BsaXQoJyAnKTtcbiAgICAgIC8vIGNvbnN0IGR5ID0gcGFyc2VJbnQoY29bMF0uc3BsaXQoJywnKVsxXSkgLSBwYXJzZUludChjb1sxXS5zcGxpdCgnLCcpWzFdKTtcbiAgICAgIGNvbnN0IHBvaW50cyA9IGdldFN0YWZmQkJveChzdGFmZiBhcyBTVkdHRWxlbWVudCk7XG4gICAgICBjb25zdCB5X2NoYW5nZSA9IE1hdGgudGFuKHBvaW50cy5yb3RhdGUpKihwb2ludHMubHJ4IC0gcG9pbnRzLnVseCk7XG4gICAgICBpZiAoc3RhZmYgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgICAgYWN0aW9uOiAncmVzaXplUm90YXRlJyxcbiAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgZWxlbWVudElkOiBzdGFmZi5pZCxcbiAgICAgICAgICAgIHVseDogcG9pbnRzLnVseCxcbiAgICAgICAgICAgIHVseTogcG9pbnRzLnJvdGF0ZSA+IDAgPyBwb2ludHMudWx5ICsgeV9jaGFuZ2UvMiA6IHBvaW50cy51bHkgLSB5X2NoYW5nZS8yLFxuICAgICAgICAgICAgbHJ4OiBwb2ludHMubHJ4LFxuICAgICAgICAgICAgbHJ5OiBwb2ludHMucm90YXRlID4gMCA/IHBvaW50cy5scnkgLSB5X2NoYW5nZS8yIDogcG9pbnRzLmxyeSArIHlfY2hhbmdlLzIsXG4gICAgICAgICAgICByb3RhdGU6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIG5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGF3YWl0IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkJyk7XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGJib3ggb3B0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckJCb3hBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuYmJveEFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hdGNoSGVpZ2h0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbWF0Y2hIZWlnaHRIYW5kbGVyKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZGVmYXVsdCBhY3Rpb25zIHdoZW4gc2VsZWN0aW5nIGJ5IHN5bFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRTeWxBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdFN5bEFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcbiAgYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lcigpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZGVmYXVsdCBzZWxlY3Rpb24gb3B0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdEFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGV4dHJhIGRyb3Bkb3duIG9wdGlvbnM6XG4gKiBMaXN0ZW4gdG8gY2xpY2tzIG9uIGRyb3Bkb3duc1xuICovXG5mdW5jdGlvbiBpbml0T3B0aW9uc0xpc3RlbmVycyAoKTogdm9pZCB7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wX3NlbGVjdCcpXG4gICAgLmZvckVhY2goXG4gICAgICBkcm9wID0+IHtcbiAgICAgICAgLy8gV2hlbiBhbnl0aGluZyB0aGF0IGlzIG5vdCB0aGUgZHJvcGRvd24gaXMgY2xpY2tlZCBhd2F5LCB0aGUgZHJvcGRvd25cbiAgICAgICAgLy8gc2hvdWxkIGxvc2UgaXRzIHZpc2liaWxpdHlcbiAgICAgICAgY29uc3Qgb3B0aW9uc0NsaWNrYXdheSA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3B0aW9uc0NsaWNrYXdheSk7XG4gICAgICAgICAgZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkcm9wLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgICAgICAgIC8vIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIGRyb3Bkb3duXG4gICAgICAgICAgZHJvcC5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcblxuICAgICAgICAgIC8vIFJlbW92ZSB2aXNpYmlsaXR5IG9mIG90aGVyIGRyb3Bkb3ducyB3aGVuIHRoaXMgb25lIGlzIGNsaWNrZWRcbiAgICAgICAgICBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wX3NlbGVjdCcpKVxuICAgICAgICAgICAgLmZpbHRlcihvdGhlciA9PiBvdGhlciAhPT0gZHJvcClcbiAgICAgICAgICAgIC5mb3JFYWNoKG90aGVyID0+IG90aGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpKTtcblxuICAgICAgICAgIC8vIERvbid0IGFsbG93IG90aGVyIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgYm9keSB0byBpbnRlcmZlcmUgd2l0aCB0aGlzIGxpc3RlbmVyXG4gICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgaWYgKGRyb3AuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSlcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcHRpb25zQ2xpY2thd2F5KTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3B0aW9uc0NsaWNrYXdheSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG59XG4iLCJpbXBvcnQgeyBnZXRTdGFmZkJCb3ggfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuZXhwb3J0IGludGVyZmFjZSBQb2ludCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJCb3gge1xuICB1bHg6IG51bWJlcjtcbiAgdWx5OiBudW1iZXI7XG4gIGxyeDogbnVtYmVyO1xuICBscnk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgU1ZHIHJlbGF0aXZlIGNvb3JkaW5hdGVzIGdpdmVuIGNsaWVudFggYW5kIGNsaWVudFlcbiAqIFNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjkyNjEzMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNWR1JlbENvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBQb2ludCB7XG4gIGNvbnN0IHB0ID0gbmV3IERPTVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICBjb25zdCBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPFNWR1NWR0VsZW1lbnQ+KCcuYWN0aXZlLXBhZ2UgPiAuZGVmaW5pdGlvbi1zY2FsZScpO1xuICBjb25zdCBwYWdlTWFyZ2luID0gc3ZnLnF1ZXJ5U2VsZWN0b3I8U1ZHR0VsZW1lbnQ+KCcucGFnZS1tYXJnaW4nKTtcblxuICBjb25zdCB7IHgsIHkgfSA9IHB0Lm1hdHJpeFRyYW5zZm9ybShwYWdlTWFyZ2luLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG4gIHJldHVybiB7IHgsIHkgfTtcblxuICAvLyBJZiB0aGVyZSBpcyBzb21lIGlzc3VlIHdpdGggY29vcmRpbmF0ZXMsIHRoaXMgbWF5IGZpeCB0aGUgaXNzdWU6XG4gIC8vIGNvbnN0IHN2ZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHU1ZHRWxlbWVudD4oJyNzdmdfZ3JvdXAnKTtcbiAgLy8gY29uc3QgeyB4LCB5IH0gPSBwdC5tYXRyaXhUcmFuc2Zvcm0oc3ZnLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG59XG5cbi8qKlxuICogR2V0IElEIG9mIHN0YWZmIGJ5IGNsaWVudCdzIHgteSBjb29yZGluYXRlcy5cbiAqIFRoaXMgZnVuY3Rpb24gY29uc2lkZXJzIHRoZSAqdmlzdWFsKiBib3VuZGluZyBib3ggb2YgdGhlIHN0YWZmXG4gKiBiYXNlZCBvbiBpdHMgc3RhZmYgbGluZXMsIGluc3RlYWQgb2YgdGhlIFNWRyBlbGVtZW50IGl0c2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YWZmSWRCeUNvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzdGF2ZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8U1ZHR0VsZW1lbnQ+KCcuc3RhZmYnKSk7XG4gIGNvbnN0IHN0YWZmQkJveGVzID0gc3RhdmVzLm1hcChzdGFmZiA9PiBnZXRTdGFmZkJCb3goc3RhZmYpKTtcblxuICAvLyBmaW5kIHRoZSBzdGFmZiB0aGF0IHRoZSBjdXJzb3IgaXMgaW5zaWRlXG4gIGNvbnN0IHsgeCwgeSB9ID0gZ2V0U1ZHUmVsQ29vcmRzKGNsaWVudFgsIGNsaWVudFkpO1xuICBjb25zdCBzdGFmZiA9IHN0YWZmQkJveGVzLmZpbmQoXG4gICAgKGJib3gpID0+IHggPD0gYmJveC5scnggJiYgeCA+PSBiYm94LnVseCAmJiB5IDw9IGJib3gubHJ5ICYmIHkgPj0gYmJveC51bHlcbiAgKTsgXG5cbiAgLy8gSWYgdGhlcmUgaXMgaXNzdWVzIHdpdGggZmluZGluZyB0aGUgc3RhZmYsIHRoaXMgbWF5IGJlIG1vcmUgYWNjdXJhdGU6XG4gIC8vIHJldHVybiAocHQueCA+IHVseCAmJiBwdC54IDwgbHJ4KSAmJlxuICAvLyAgIChwdC55ID4gKHVseSArIChwdC54IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkpKSAmJlxuICAvLyAgIChwdC55IDwgKGxyeSAtIChscnggLSBwdC54KSAqIE1hdGgudGFuKHJvdGF0ZSkpKTtcblxuICAvLyBpZiB0aGUgY3Vyc29yIGlzIG5vdCBpbnNpZGUgYW55IHN0YWZmLCB0aGVuIGV4cGxpY2l0bHkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHN0YWZmID8gc3RhZmYuaWQgOiBudWxsO1xufVxuXG4vKipcbiAqIEdldCBzdGFmZiBieSBjbGllbnQncyB4LXkgY29vcmRpbmF0ZXM7IHdyYXBwZXIgZm9yIGdldFN0YWZmSWRCeUNvb3JkcywgYnV0XG4gKiAgIHJldHVybnMgdGhlIGVsZW1lbnQsIG5vdCB0aGUgSURcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YWZmQnlDb29yZHMgKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogU1ZHR0VsZW1lbnQgfCBudWxsIHtcbiAgY29uc3Qgc3RhZmZJZCA9IGdldFN0YWZmSWRCeUNvb3JkcyhjbGllbnRYLCBjbGllbnRZKTtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3N0YWZmSWR9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc091dE9mU1ZHQm91bmRzICh4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiZ0ltZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHSW1hZ2VFbGVtZW50PignI2JnaW1nJyk7XG4gIFxuICByZXR1cm4gKFxuICAgIHggPD0gMCB8fCB4ID49IE51bWJlcihiZ0ltZy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpIHx8XG4gICAgeSA8PSAwIHx8IHkgPj0gTnVtYmVyKGJnSW1nLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpXG4gICk7XG59XG5cbi8qKlxuICogR2V0IGJvdW5kaW5nIGJveCAobHJ4LCBscnksIHVseCwgdWx5KSBvZiBhIGdseXBoLCB3aGljaFxuICogaXMgYSA8dXNlPiBlbGVtZW50IGluIHRoZSBTVkdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdseXBoQkJveCAoZzogU1ZHUmVjdEVsZW1lbnQgfCBTVkdVc2VFbGVtZW50KTogQkJveCB7XG4gIGNvbnN0IHJlY3QgPSAoZy50YWdOYW1lID09ICdyZWN0JykgPyBnLmdldEJCb3goKSA6IChnLnBhcmVudE5vZGUgYXMgU1ZHR0VsZW1lbnQpLmdldEJCb3goKTtcblxuICByZXR1cm4ge1xuICAgIHVseDogcmVjdC54LFxuICAgIHVseTogcmVjdC55LFxuICAgIGxyeDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBscnk6IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH07XG59XG5cbiIsIihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gTm9kZS9Db21tb25KU1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTURcbiAgICAgICAgZGVmaW5lKGZhY3RvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAod2l0aCBzdXBwb3J0IGZvciB3ZWIgd29ya2VycylcbiAgICAgICAgdmFyIGdsb2I7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdsb2IgPSB3aW5kb3c7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGdsb2IgPSBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2xvYi5TcGFya01ENSA9IGZhY3RvcnkoKTtcbiAgICB9XG59KGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcblxuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8qXG4gICAgICogRmFzdGVzdCBtZDUgaW1wbGVtZW50YXRpb24gYXJvdW5kIChKS00gbWQ1KS5cbiAgICAgKiBDcmVkaXRzOiBKb3NlcGggTXllcnNcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cDovL3d3dy5teWVyc2RhaWx5Lm9yZy9qb3NlcGgvamF2YXNjcmlwdC9tZDUtdGV4dC5odG1sXG4gICAgICogQHNlZSBodHRwOi8vanNwZXJmLmNvbS9tZDUtc2hvb3RvdXQvN1xuICAgICAqL1xuXG4gICAgLyogdGhpcyBmdW5jdGlvbiBpcyBtdWNoIGZhc3RlcixcbiAgICAgIHNvIGlmIHBvc3NpYmxlIHdlIHVzZSBpdC4gU29tZSBJRXNcbiAgICAgIGFyZSB0aGUgb25seSBvbmVzIEkga25vdyBvZiB0aGF0XG4gICAgICBuZWVkIHRoZSBpZGlvdGljIHNlY29uZCBmdW5jdGlvbixcbiAgICAgIGdlbmVyYXRlZCBieSBhbiBpZiBjbGF1c2UuICAqL1xuICAgIHZhciBhZGQzMiA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiAoYSArIGIpICYgMHhGRkZGRkZGRjtcbiAgICB9LFxuICAgICAgICBoZXhfY2hyID0gWycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ107XG5cblxuICAgIGZ1bmN0aW9uIGNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gICAgICAgIGEgPSBhZGQzMihhZGQzMihhLCBxKSwgYWRkMzIoeCwgdCkpO1xuICAgICAgICByZXR1cm4gYWRkMzIoKGEgPDwgcykgfCAoYSA+Pj4gKDMyIC0gcykpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDVjeWNsZSh4LCBrKSB7XG4gICAgICAgIHZhciBhID0geFswXSxcbiAgICAgICAgICAgIGIgPSB4WzFdLFxuICAgICAgICAgICAgYyA9IHhbMl0sXG4gICAgICAgICAgICBkID0geFszXTtcblxuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzBdIC0gNjgwODc2OTM2IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbMV0gLSAzODk1NjQ1ODYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEyIHwgZCA+Pj4gMjApICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBhIHwgfmQgJiBiKSArIGtbMl0gKyA2MDYxMDU4MTkgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE3IHwgYyA+Pj4gMTUpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgJiBkIHwgfmMgJiBhKSArIGtbM10gLSAxMDQ0NTI1MzMwIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzRdIC0gMTc2NDE4ODk3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbNV0gKyAxMjAwMDgwNDI2IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYSB8IH5kICYgYikgKyBrWzZdIC0gMTQ3MzIzMTM0MSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1s3XSAtIDQ1NzA1OTgzIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzhdICsgMTc3MDAzNTQxNiB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNyB8IGEgPj4+IDI1KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYiB8IH5hICYgYykgKyBrWzldIC0gMTk1ODQxNDQxNyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxMF0gLSA0MjA2MyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1sxMV0gLSAxOTkwNDA0MTYyIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzEyXSArIDE4MDQ2MDM2ODIgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSAmIGIgfCB+YSAmIGMpICsga1sxM10gLSA0MDM0MTEwMSB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxNF0gLSAxNTAyMDAyMjkwIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzE1XSArIDEyMzY1MzUzMjkgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7XG5cbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxXSAtIDE2NTc5NjUxMCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzZdIC0gMTA2OTUwMTYzMiB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzExXSArIDY0MzcxNzcxMyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1swXSAtIDM3Mzg5NzMwMiB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1s1XSAtIDcwMTU1ODY5MSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzEwXSArIDM4MDE2MDgzIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCA5IHwgZCA+Pj4gMjMpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbMTVdIC0gNjYwNDc4MzM1IHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzRdIC0gNDA1NTM3ODQ4IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgZCB8IGMgJiB+ZCkgKyBrWzldICsgNTY4NDQ2NDM4IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMTRdIC0gMTAxOTgwMzY5MCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzNdIC0gMTg3MzYzOTYxIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzhdICsgMTE2MzUzMTUwMSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxM10gLSAxNDQ0NjgxNDY3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMl0gLSA1MTQwMzc4NCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzddICsgMTczNTMyODQ3MyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1sxMl0gLSAxOTI2NjA3NzM0IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuXG4gICAgICAgIGEgKz0gKGIgXiBjIF4gZCkgKyBrWzVdIC0gMzc4NTU4IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzhdIC0gMjAyMjU3NDQ2MyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbMTFdICsgMTgzOTAzMDU2MiB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMTRdIC0gMzUzMDk1NTYgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMV0gLSAxNTMwOTkyMDYwIHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzRdICsgMTI3Mjg5MzM1MyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbN10gLSAxNTU0OTc2MzIgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE2IHwgYyA+Pj4gMTYpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgXiBkIF4gYSkgKyBrWzEwXSAtIDEwOTQ3MzA2NDAgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMTNdICsgNjgxMjc5MTc0IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzBdIC0gMzU4NTM3MjIyIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkIF4gYSBeIGIpICsga1szXSAtIDcyMjUyMTk3OSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbNl0gKyA3NjAyOTE4OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgfCAwO1xuICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1s5XSAtIDY0MDM2NDQ4NyB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNCB8IGEgPj4+IDI4KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhIF4gYiBeIGMpICsga1sxMl0gLSA0MjE4MTU4MzUgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgXiBhIF4gYikgKyBrWzE1XSArIDUzMDc0MjUyMCB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMl0gLSA5OTUzMzg2NTEgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcblxuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1swXSAtIDE5ODYzMDg0NCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1s3XSArIDExMjY4OTE0MTUgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzE0XSAtIDE0MTYzNTQ5MDUgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzVdIC0gNTc0MzQwNTUgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIxIHxiID4+PiAxMSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYyBeIChiIHwgfmQpKSArIGtbMTJdICsgMTcwMDQ4NTU3MSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1szXSAtIDE4OTQ5ODY2MDYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzEwXSAtIDEwNTE1MjMgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzFdIC0gMjA1NDkyMjc5OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s4XSArIDE4NzMzMTMzNTkgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDYgfCBhID4+PiAyNikgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYiBeIChhIHwgfmMpKSArIGtbMTVdIC0gMzA2MTE3NDQgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzZdIC0gMTU2MDE5ODM4MCB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbMTNdICsgMTMwOTE1MTY0OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s0XSAtIDE0NTUyMzA3MCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1sxMV0gLSAxMTIwMjEwMzc5IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgfCAwO1xuICAgICAgICBjICs9IChhIF4gKGQgfCB+YikpICsga1syXSArIDcxODc4NzI1OSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbOV0gLSAzNDM0ODU1NTEgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIxIHwgYiA+Pj4gMTEpICsgYyB8IDA7XG5cbiAgICAgICAgeFswXSA9IGEgKyB4WzBdIHwgMDtcbiAgICAgICAgeFsxXSA9IGIgKyB4WzFdIHwgMDtcbiAgICAgICAgeFsyXSA9IGMgKyB4WzJdIHwgMDtcbiAgICAgICAgeFszXSA9IGQgKyB4WzNdIHwgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDVibGsocykge1xuICAgICAgICB2YXIgbWQ1YmxrcyA9IFtdLFxuICAgICAgICAgICAgaTsgLyogQW5keSBLaW5nIHNhaWQgZG8gaXQgdGhpcyB3YXkuICovXG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIG1kNWJsa3NbaSA+PiAyXSA9IHMuY2hhckNvZGVBdChpKSArIChzLmNoYXJDb2RlQXQoaSArIDEpIDw8IDgpICsgKHMuY2hhckNvZGVBdChpICsgMikgPDwgMTYpICsgKHMuY2hhckNvZGVBdChpICsgMykgPDwgMjQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZDVibGtzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNWJsa19hcnJheShhKSB7XG4gICAgICAgIHZhciBtZDVibGtzID0gW10sXG4gICAgICAgICAgICBpOyAvKiBBbmR5IEtpbmcgc2FpZCBkbyBpdCB0aGlzIHdheS4gKi9cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgKz0gNCkge1xuICAgICAgICAgICAgbWQ1Ymxrc1tpID4+IDJdID0gYVtpXSArIChhW2kgKyAxXSA8PCA4KSArIChhW2kgKyAyXSA8PCAxNikgKyAoYVtpICsgM10gPDwgMjQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZDVibGtzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNTEocykge1xuICAgICAgICB2YXIgbiA9IHMubGVuZ3RoLFxuICAgICAgICAgICAgc3RhdGUgPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF0sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbGVuZ3RoLFxuICAgICAgICAgICAgdGFpbCxcbiAgICAgICAgICAgIHRtcCxcbiAgICAgICAgICAgIGxvLFxuICAgICAgICAgICAgaGk7XG5cbiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbjsgaSArPSA2NCkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIG1kNWJsayhzLnN1YnN0cmluZyhpIC0gNjQsIGkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcyA9IHMuc3Vic3RyaW5nKGkgLSA2NCk7XG4gICAgICAgIGxlbmd0aCA9IHMubGVuZ3RoO1xuICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBzLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cbiAgICAgICAgdGFpbFtpID4+IDJdIHw9IDB4ODAgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIGlmIChpID4gNTUpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgdGFpbFtpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZXdhcmUgdGhhdCB0aGUgZmluYWwgbGVuZ3RoIG1pZ2h0IG5vdCBmaXQgaW4gMzIgYml0cyBzbyB3ZSB0YWtlIGNhcmUgb2YgdGhhdFxuICAgICAgICB0bXAgPSBuICogODtcbiAgICAgICAgdG1wID0gdG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtcbiAgICAgICAgbG8gPSBwYXJzZUludCh0bXBbMl0sIDE2KTtcbiAgICAgICAgaGkgPSBwYXJzZUludCh0bXBbMV0sIDE2KSB8fCAwO1xuXG4gICAgICAgIHRhaWxbMTRdID0gbG87XG4gICAgICAgIHRhaWxbMTVdID0gaGk7XG5cbiAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWQ1MV9hcnJheShhKSB7XG4gICAgICAgIHZhciBuID0gYS5sZW5ndGgsXG4gICAgICAgICAgICBzdGF0ZSA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsZW5ndGgsXG4gICAgICAgICAgICB0YWlsLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBuOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgbWQ1YmxrX2FycmF5KGEuc3ViYXJyYXkoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IHN1cmUgaWYgaXQgaXMgYSBidWcsIGhvd2V2ZXIgSUUxMCB3aWxsIGFsd2F5cyBwcm9kdWNlIGEgc3ViIGFycmF5IG9mIGxlbmd0aCAxXG4gICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGFyZW50IGFycmF5IGlmIHRoZSBzdWIgYXJyYXkgc3BlY2lmaWVkIHN0YXJ0c1xuICAgICAgICAvLyBiZXlvbmQgdGhlIGxlbmd0aCBvZiB0aGUgcGFyZW50IGFycmF5IC0gd2VpcmQuXG4gICAgICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNzcxNDUyL3R5cGVkLWFycmF5LXN1YmFycmF5LWlzc3VlXG4gICAgICAgIGEgPSAoaSAtIDY0KSA8IG4gPyBhLnN1YmFycmF5KGkgLSA2NCkgOiBuZXcgVWludDhBcnJheSgwKTtcblxuICAgICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB0YWlsW2kgPj4gMl0gfD0gYVtpXSA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWxbaSA+PiAyXSB8PSAweDgwIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICBpZiAoaSA+IDU1KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgdGFpbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtaWdodCBub3QgZml0IGluIDMyIGJpdHMgc28gd2UgdGFrZSBjYXJlIG9mIHRoYXRcbiAgICAgICAgdG1wID0gbiAqIDg7XG4gICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7XG4gICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7XG4gICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDtcblxuICAgICAgICB0YWlsWzE0XSA9IGxvO1xuICAgICAgICB0YWlsWzE1XSA9IGhpO1xuXG4gICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcblxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmhleChuKSB7XG4gICAgICAgIHZhciBzID0gJycsXG4gICAgICAgICAgICBqO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaiArPSAxKSB7XG4gICAgICAgICAgICBzICs9IGhleF9jaHJbKG4gPj4gKGogKiA4ICsgNCkpICYgMHgwRl0gKyBoZXhfY2hyWyhuID4+IChqICogOCkpICYgMHgwRl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGV4KHgpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB4W2ldID0gcmhleCh4W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geC5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBmYXN0IGFkZDMyIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkLi5cbiAgICBpZiAoaGV4KG1kNTEoJ2hlbGxvJykpICE9PSAnNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTInKSB7XG4gICAgICAgIGFkZDMyID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgICAgIHZhciBsc3cgPSAoeCAmIDB4RkZGRikgKyAoeSAmIDB4RkZGRiksXG4gICAgICAgICAgICAgICAgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gICAgICAgICAgICByZXR1cm4gKG1zdyA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIEFycmF5QnVmZmVyIHNsaWNlIHBvbHlmaWxsLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHRhdWJlcnQvbm9kZS1hcnJheWJ1ZmZlci1zbGljZVxuICAgICAqL1xuXG4gICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgIUFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSkge1xuICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gY2xhbXAodmFsLCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSAodmFsIHwgMCkgfHwgMDtcblxuICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh2YWwgKyBsZW5ndGgsIDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2YWwsIGxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJlZ2luID0gY2xhbXAoZnJvbSwgbGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gbGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBudW0sXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUFycmF5O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gY2xhbXAodG8sIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGJlZ2luID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbnVtID0gZW5kIC0gYmVnaW47XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IEFycmF5QnVmZmVyKG51bSk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBuZXcgVWludDhBcnJheSh0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgc291cmNlQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLCBiZWdpbiwgbnVtKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheS5zZXQoc291cmNlQXJyYXkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXJzLlxuICAgICAqL1xuXG4gICAgZnVuY3Rpb24gdG9VdGY4KHN0cikge1xuICAgICAgICBpZiAoL1tcXHUwMDgwLVxcdUZGRkZdLy50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRmOFN0cjJBcnJheUJ1ZmZlcihzdHIsIHJldHVyblVJbnQ4QXJyYXkpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgICAgICAgIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKSxcbiAgICAgICAgICAgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZiksXG4gICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBhcnJbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gYXJyIDogYnVmZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcnJheUJ1ZmZlcjJVdGY4U3RyKGJ1ZmYpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoYnVmZikpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKGZpcnN0LCBzZWNvbmQsIHJldHVyblVJbnQ4QXJyYXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGZpcnN0LmJ5dGVMZW5ndGggKyBzZWNvbmQuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgcmVzdWx0LnNldChuZXcgVWludDhBcnJheShmaXJzdCkpO1xuICAgICAgICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KHNlY29uZCksIGZpcnN0LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gcmVzdWx0IDogcmVzdWx0LmJ1ZmZlcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoZXhUb0JpbmFyeVN0cmluZyhoZXgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gW10sXG4gICAgICAgICAgICBsZW5ndGggPSBoZXgubGVuZ3RoLFxuICAgICAgICAgICAgeDtcblxuICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGVuZ3RoIC0gMTsgeCArPSAyKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKHBhcnNlSW50KGhleC5zdWJzdHIoeCwgMiksIDE2KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIFNwYXJrTUQ1IE9PUCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGNsYXNzIHRvIHBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbWQ1LCBvdGhlcndpc2UgdXNlIHRoZVxuICAgICAqIHN0YXRpYyBtZXRob2RzIGluc3RlYWQuXG4gICAgICovXG5cbiAgICBmdW5jdGlvbiBTcGFya01ENSgpIHtcbiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHN0cmluZy5cbiAgICAgKiBBIGNvbnZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIGlmIGFuIHV0Zjggc3RyaW5nIGlzIGRldGVjdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gVGhlbiBhcHBlbmQgYXMgYmluYXJ5XG4gICAgICAgIHRoaXMuYXBwZW5kQmluYXJ5KHRvVXRmOChzdHIpKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIGJpbmFyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudHMgVGhlIGJpbmFyeSBzdHJpbmcgdG8gYmUgYXBwZW5kZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1fSBUaGUgaW5zdGFuY2UgaXRzZWxmXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmFwcGVuZEJpbmFyeSA9IGZ1bmN0aW9uIChjb250ZW50cykge1xuICAgICAgICB0aGlzLl9idWZmICs9IGNvbnRlbnRzO1xuICAgICAgICB0aGlzLl9sZW5ndGggKz0gY29udGVudHMubGVuZ3RoO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLl9idWZmLmxlbmd0aCxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbGVuZ3RoOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCBtZDVibGsodGhpcy5fYnVmZi5zdWJzdHJpbmcoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYnVmZiA9IHRoaXMuX2J1ZmYuc3Vic3RyaW5nKGkgLSA2NCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZFxuICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSxcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maW5pc2godGFpbCwgbGVuZ3RoKTtcbiAgICAgICAgcmV0ID0gaGV4KHRoaXMuX2hhc2gpO1xuXG4gICAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgICAgIHJldCA9IGhleFRvQmluYXJ5U3RyaW5nKHJldCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYnVmZiA9ICcnO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9oYXNoID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ1ZmY6IHRoaXMuX2J1ZmYsXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMuX2xlbmd0aCxcbiAgICAgICAgICAgIGhhc2g6IHRoaXMuX2hhc2guc2xpY2UoKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB0aGlzLl9idWZmID0gc3RhdGUuYnVmZjtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICB0aGlzLl9oYXNoID0gc3RhdGUuaGFzaDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgbWVtb3J5IHVzZWQgYnkgdGhlIGluY3JlbWVudGFsIGJ1ZmZlciBhbmQgb3RoZXIgYWRkaXRpb25hbFxuICAgICAqIHJlc291cmNlcy4gSWYgeW91IHBsYW4gdG8gdXNlIHRoZSBpbnN0YW5jZSBhZ2FpbiwgdXNlIHJlc2V0IGluc3RlYWQuXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9oYXNoO1xuICAgICAgICBkZWxldGUgdGhpcy5fYnVmZjtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xlbmd0aDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmluaXNoIHRoZSBmaW5hbCBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgdGFpbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9ICB0YWlsICAgVGhlIHRhaWwgKHdpbGwgYmUgbW9kaWZpZWQpXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZW1haW5pbmcgYnVmZmVyXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbiAodGFpbCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBpID0gbGVuZ3RoLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICB0YWlsW2kgPj4gMl0gfD0gMHg4MCA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgaWYgKGkgPiA1NSkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUodGhpcy5faGFzaCwgdGFpbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gdGhlIGZpbmFsIGNvbXB1dGF0aW9uIGJhc2VkIG9uIHRoZSB0YWlsIGFuZCBsZW5ndGhcbiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtYXkgbm90IGZpdCBpbiAzMiBiaXRzIHNvIHdlIHRha2UgY2FyZSBvZiB0aGF0XG4gICAgICAgIHRtcCA9IHRoaXMuX2xlbmd0aCAqIDg7XG4gICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7XG4gICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7XG4gICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDtcblxuICAgICAgICB0YWlsWzE0XSA9IGxvO1xuICAgICAgICB0YWlsWzE1XSA9IGhpO1xuICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCB0YWlsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGEgc3RyaW5nLlxuICAgICAqIEEgY29udmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgaWYgdXRmOCBzdHJpbmcgaXMgZGV0ZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIHN0ciBUaGUgc3RyaW5nXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbcmF3XSBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5oYXNoID0gZnVuY3Rpb24gKHN0ciwgcmF3KSB7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gVGhlbiBjb21wdXRlIGl0IHVzaW5nIHRoZSBiaW5hcnkgZnVuY3Rpb25cbiAgICAgICAgcmV0dXJuIFNwYXJrTUQ1Lmhhc2hCaW5hcnkodG9VdGY4KHN0ciksIHJhdyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBtZDUgaGFzaCBvbiBhIGJpbmFyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIGNvbnRlbnQgVGhlIGJpbmFyeSBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyYXddICAgICBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5oYXNoQmluYXJ5ID0gZnVuY3Rpb24gKGNvbnRlbnQsIHJhdykge1xuICAgICAgICB2YXIgaGFzaCA9IG1kNTEoY29udGVudCksXG4gICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7XG5cbiAgICAgICAgcmV0dXJuIHJhdyA/IGhleFRvQmluYXJ5U3RyaW5nKHJldCkgOiByZXQ7XG4gICAgfTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICogU3BhcmtNRDUgT09QIGltcGxlbWVudGF0aW9uIGZvciBhcnJheSBidWZmZXJzLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBtZDUgT05MWSBmb3IgYXJyYXkgYnVmZmVycy5cbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYW4gYXJyYXkgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyIFRoZSBhcnJheSB0byBiZSBhcHBlbmRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKGFycikge1xuICAgICAgICB2YXIgYnVmZiA9IGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKHRoaXMuX2J1ZmYuYnVmZmVyLCBhcnIsIHRydWUpLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICBpO1xuXG4gICAgICAgIHRoaXMuX2xlbmd0aCArPSBhcnIuYnl0ZUxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBsZW5ndGg7IGkgKz0gNjQpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHRoaXMuX2hhc2gsIG1kNWJsa19hcnJheShidWZmLnN1YmFycmF5KGkgLSA2NCwgaSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2J1ZmYgPSAoaSAtIDY0KSA8IGxlbmd0aCA/IG5ldyBVaW50OEFycmF5KGJ1ZmYuYnVmZmVyLnNsaWNlKGkgLSA2NCkpIDogbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZFxuICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmW2ldIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmluaXNoKHRhaWwsIGxlbmd0aCk7XG4gICAgICAgIHJldCA9IGhleCh0aGlzLl9oYXNoKTtcblxuICAgICAgICBpZiAocmF3KSB7XG4gICAgICAgICAgICByZXQgPSBoZXhUb0JpbmFyeVN0cmluZyhyZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmYgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5faGFzaCA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgc3RhdGVcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgYnVmZmVyIHRvIGEgc3RyaW5nXG4gICAgICAgIHN0YXRlLmJ1ZmYgPSBhcnJheUJ1ZmZlcjJVdGY4U3RyKHN0YXRlLmJ1ZmYpO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIFRoZSBzdGF0ZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gYnVmZmVyXG4gICAgICAgIHN0YXRlLmJ1ZmYgPSB1dGY4U3RyMkFycmF5QnVmZmVyKHN0YXRlLmJ1ZmYsIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBTcGFya01ENS5wcm90b3R5cGUuc2V0U3RhdGUuY2FsbCh0aGlzLCBzdGF0ZSk7XG4gICAgfTtcblxuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5kZXN0cm95ID0gU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3k7XG5cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuX2ZpbmlzaCA9IFNwYXJrTUQ1LnByb3RvdHlwZS5fZmluaXNoO1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGFuIGFycmF5IGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFyciBUaGUgYXJyYXkgYnVmZmVyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSAgICAgW3Jhd10gVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IG9uZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIuaGFzaCA9IGZ1bmN0aW9uIChhcnIsIHJhdykge1xuICAgICAgICB2YXIgaGFzaCA9IG1kNTFfYXJyYXkobmV3IFVpbnQ4QXJyYXkoYXJyKSksXG4gICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7XG5cbiAgICAgICAgcmV0dXJuIHJhdyA/IGhleFRvQmluYXJ5U3RyaW5nKHJldCkgOiByZXQ7XG4gICAgfTtcblxuICAgIHJldHVybiBTcGFya01ENTtcbn0pKTtcbiIsIi8qKlxuICogRm9ybWF0cyByYXcgVVVJRCBkYXRhIGludG8gdGhlIHByb3BlciBzdHJpbmcgZm9ybWF0LlxuICogQHBhcmFtIGRhdGEgLSBSYXcgVVVJRCBkYXRhLlxuICogQHJldHVybnMgRm9ybWF0dGVkIFVVSUQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiB1aW50OFRvVXVpZCAoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gMTYpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBjYiAocHJldmlvdXM6IHN0cmluZywgY3VycmVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJldmlvdXMgKyBjdXJyZW50LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEuc2xpY2UoMCwgNCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoNCwgNikucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoNiwgOCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoOCwgMTApLnJlZHVjZShjYiwgJycpICtcbiAgICAnLScgKyBkYXRhLnNsaWNlKDEwKS5yZWR1Y2UoY2IsICcnKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBBIFt2ZXJzaW9uIDQgVVVJRF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXIjVmVyc2lvbl80XyhyYW5kb20pKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCAoKTogc3RyaW5nIHtcbiAgLy8gQ2hlY2sgZm9yIGNyeXB0byBBUElcbiAgaWYgKHdpbmRvdy5jcnlwdG8gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1aW50OFRvVXVpZChuZXcgVWludDhBcnJheSgxNikpO1xuICB9XG5cbiAgLy8gR2V0IDE2IG9jdGV0cyBmb3IgVVVJRFxuICBjb25zdCBvY3RldHMgPSBuZXcgVWludDhBcnJheSgxNik7XG4gIGNvbnN0IG1vZGlmaWVycyA9IFVpbnQ4QXJyYXkuZnJvbShbXG4gICAgcGFyc2VJbnQoJzAxMDAwMDAwJywgMiksICAvLyBWZXJzaW9uIGJpdHMgKDQgPT4gMDEwMClcbiAgICBwYXJzZUludCgnMTAwMDAwMDAnLCAyKSwgIC8vIFZhcmlhbnQgYml0cyAoMTB4KVxuICAgIHBhcnNlSW50KCcwMDAwMTExMScsIDIpLCAgLy8gTWFzayB0byB6ZXJvIGhpZ2hlciBiaXRzLCB2ZXJzaW9uXG4gICAgcGFyc2VJbnQoJzAwMTExMTExJywgMikgICAvLyBNYXNrIHRvIHplcm8gaGlnaGVyIGJpdHMsIHZhcmlhbnRcbiAgXSk7XG4gIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG9jdGV0cyk7XG4gIC8vIFNldCB2ZXJzaW9uIGJpdHMgYW5kIHZhcmlhbnQgYml0c1xuICBvY3RldHNbNl0gPSAob2N0ZXRzWzZdICYgbW9kaWZpZXJzWzJdKSB8IG1vZGlmaWVyc1swXTtcbiAgb2N0ZXRzWzhdID0gKG9jdGV0c1s4XSAmIG1vZGlmaWVyc1szXSkgfCBtb2RpZmllcnNbMV07XG5cbiAgcmV0dXJuIHVpbnQ4VG9VdWlkKG9jdGV0cyk7XG59XG4iLCJpbXBvcnQgeyBHcm91cGluZ1R5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIGNvbG9yIHBhbGV0dGUgZnJvbSBGaWd1cmUgMiAoQ29sb3JzIG9wdGltaXplZCBmb3IgY29sb3ItYmxpbmRcbiAqIGluZGl2aWR1YWxzKSBmcm9tXG4gKiBbXCJQb2ludHMgb2YgdmlldzogQ29sb3IgYmxpbmRuZXNzXCIgYnkgQmFuZyBXb25nIHB1Ymxpc2hlZCBpbiBOYXR1cmUgTWV0aG9kcyB2b2x1bWUgOCBvbiAyNyBNYXkgMjAxMV0oaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9ubWV0aC4xNjE4P1dULmVjX2lkPU5NRVRILTIwMTEwNilcbiAqL1xuY29uc3QgQ29sb3JQYWxldHRlOiBzdHJpbmdbXSA9IFtcbiAgJ3JnYigyMzAsIDE1OSwgMCknLFxuICAncmdiKDg2LCAxODAsIDIzMyknLFxuICAncmdiKDAsIDE1OCwgMTE1KScsXG4gICdyZ2IoMjQwLCAyMjgsIDY2KScsXG4gICdyZ2IoMCwgMTE0LCAxNzgpJyxcbiAgJ3JnYigyMTMsIDk0LCAwKScsXG4gICdyZ2IoMjA0LCAxMjEsIDE2NyknXG5dO1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgaGlnaGxpZ2h0IGZyb20gYSBzdGFmZi5cbiAqIEBwYXJhbSBzdGFmZiBJZiB1bmRlZmluZWQsIHRoZSBhbGwgc3RhdmVzIGFyZSB1bmhpZ2hsaWdodGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5oaWdobGlnaHQoc3RhZmY/OiBTVkdHRWxlbWVudCk6IHZvaWQge1xuICBsZXQgY2hpbGRyZW46IE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gIGlmIChzdGFmZikge1xuICAgIGNoaWxkcmVuID0gc3RhZmYucXVlcnlTZWxlY3RvckFsbCgnOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHRlZCcpO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkcmVuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHRlZCcpO1xuICB9XG4gIGNoaWxkcmVuLmZvckVhY2goZWxlbSA9PiB7XG4gICAgaWYgKGVsZW0udGFnTmFtZSA9PT0gJ3BhdGgnICYmICFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwMDAwJyk7XG4gICAgfSBlbHNlIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpICYmICFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwMDAwJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoJ2ZpbGwnKTtcbiAgICAgIGxldCByZWN0cyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjdHMgPSBlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWN0cyA9IFtdIGFzIHVua25vd24gYXMgTm9kZUxpc3RPZjxFbGVtZW50PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3RhZmYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zeWwnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICAgICAvLyByZWN0LmNsb3Nlc3QoJy5sYXllcicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApe1xuICAgICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmVjdC5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBoaWdobGlnaHQgZnJvbSBlYWNoIHN0YWZmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRTdGFmZkhpZ2hsaWdodCgpOiB2b2lkIHtcbiAgdW5oaWdobGlnaHQoKTtcbn1cblxuLyoqXG4gKiBVbnNldCBoaWdobGlnaHQgZm9yIGFsbCBncm91cGluZyB0eXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRHcm91cGluZ0hpZ2hsaWdodCgpOiB2b2lkIHtcbiAgdW5zZXRTdGFmZkhpZ2hsaWdodCgpO1xuICBjb25zdCBoaWdobGlnaHRlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0ZWQnKSlcbiAgICAuZmlsdGVyKChlbGVtOiBIVE1MRWxlbWVudCkgPT4gIWVsZW0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpO1xuICBoaWdobGlnaHRlZC5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgIGVsZW0uc2V0QXR0cmlidXRlKCcjZDAwJywgbnVsbCk7XG4gICAgbGV0IHJlY3RzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICBpZiAoZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKSAhPT0gbnVsbCkge1xuICAgICAgICByZWN0cyA9IGVsZW0uY2xvc2VzdCgnLnN5bGxhYmxlJykucXVlcnlTZWxlY3RvckFsbCgnc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgfVxuICAgIH1cbiAgICByZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWN0OiBIVE1MRWxlbWVudCkge1xuICAgICAgaWYgKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8IFxuICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpXG4gICAgICApe1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICB9XG4gICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICAgIGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnc3lsVGV4dFJlY3QtZGlzcGxheScpLmZvckVhY2gocmVjdCA9PiB7XG4gICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG4gIH0pO1xuICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpLmZvckVhY2goKGVsKSA9PiB7IGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcnKTsgfSk7XG59XG5cbi8qKlxuICogSGlnaGxpZ2h0IGEgc3RhZmYgYSBjZXJ0YWluIGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlnaGxpZ2h0KHN0YWZmOiBTVkdHRWxlbWVudCwgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oc3RhZmYuY2hpbGRyZW4pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ3BhdGgnKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykubGVuZ3RoICYmIGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnc3lsbGFibGUnKSkge1xuICAgICAgQXJyYXkuZnJvbShjaGlsZC5jaGlsZHJlbikuZmlsdGVyKGVsID0+IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykpLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemVQb2ludCcpIHx8IGNoaWxkLmlkID09PSAncmVzaXplUmVjdCcgfHwgY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyb3RhdGVQb2ludCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ2xheWVyJykpIHtcbiAgICAgIEFycmF5LmZyb20oY2hpbGQuY2hpbGRyZW4pLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hpZ2hsaWdodC1zZWxlY3RlZCcpLmxlbmd0aCAmJlxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0LXNlbGVjdGVkJylbMF0uaWQgPT09ICdoaWdobGlnaHQtbmV1bWUnXG4gICAgICAmJiBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIEFycmF5LmZyb20oY2hpbGQuY2hpbGRyZW4pLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJykpLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgbGV0IHJlY3RzID0gY2hpbGQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjdHMgPSBjaGlsZC5jbG9zZXN0KCcuc3lsbGFibGUnKS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVjdHMgPSBbXSBhcyB1bmtub3duIGFzIE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlY3RzLmZvckVhY2goZnVuY3Rpb24gKHJlY3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGlmICghKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3RhZmYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICAgICAvLyByZWN0LmNsb3Nlc3QoJy5sYXllcicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApKSB7XG4gICAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gY29sb3I7XG4gICAgICAgICAgcmVjdC5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHRlZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY2hpbGQuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0ZWQnKTtcbiAgfVxuICBsZXQgd2lkdGgsIGhlaWdodDtcbiAgLyp0cnkge1xuICAgIHdpZHRoID0gTnVtYmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZScpLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEF0dHJpYnV0ZSgnd2lkdGgnKS5zcGxpdCgncHgnKVswXSk7XG4gICAgaGVpZ2h0ID0gTnVtYmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZScpLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jykuc3BsaXQoJ3B4JylbMF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhlKTtcbiAgfSovXG4gIGxldCBzdHJva2U6IHN0cmluZztcbiAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQgJiYgaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBpZGsgbG9va3MgZ29vZCA6JylcbiAgICAvLyBUT0RPIGZpbmQgYSBiZXR0ZXIgd2F5IG9mIGNhbGN1bGF0aW5nIHRoaXMgYXMgdGhpcyBhY3R1YWxseSBkb2Vzbid0IHdvcmsgYXMgd2VsbCBhcyAzMHB4XG4gICAgc3Ryb2tlID0gKHdpZHRoICogaGVpZ2h0IC8gMTAwMDAwMCkudG9TdHJpbmcoKTtcbiAgfVxuICBlbHNlIHtcbiAgICBzdHJva2UgPSAnMzBweCc7XG4gIH1cbiAgc3RhZmYucXVlcnlTZWxlY3RvckFsbCgnLm5jLCAuY3VzdG9zLCAuY2xlZiwgLmFjY2lkJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnYmxhY2snKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIHN0cm9rZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEhpZ2hsaWdodCBlYWNoIHN0YWZmIGEgZGlmZmVyZW50IGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U3RhZmZIaWdobGlnaHQoKTogdm9pZCB7XG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3RhZmYnKSkgYXMgU1ZHR0VsZW1lbnRbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFmZkNvbG9yID0gQ29sb3JQYWxldHRlW2kgJSBDb2xvclBhbGV0dGUubGVuZ3RoXTtcbiAgICBoaWdobGlnaHQoc3RhdmVzW2ldLCBzdGFmZkNvbG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDb2x1bW5IaWdobGlnaHQoKTogdm9pZCB7XG4gIGNvbnN0ICBncm91cHM6IHsgW2tleTogbnVtYmVyXTogU1ZHR0VsZW1lbnRbXSB9ID0ge307XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICBjb25zdCBoYXNDb2x1bW4gPSBBcnJheS5mcm9tKHN0YWZmLmNsYXNzTGlzdCkuam9pbignICcpLm1hdGNoKC9cXGJjb2x1bW4oXFxkKylcXGIvKTtcbiAgICBsZXQgY29sdW1uTnVtID0gMDtcbiAgICBpZiAoaGFzQ29sdW1uKSB7XG4gICAgICBjb2x1bW5OdW0gPSBwYXJzZUludChoYXNDb2x1bW5bMV0sIDEwKSAtIDE7XG4gICAgfVxuXG4gICAgaWYgKCFncm91cHNbY29sdW1uTnVtXSkge1xuICAgICAgZ3JvdXBzW2NvbHVtbk51bV0gPSBbXTtcbiAgICB9XG5cbiAgICBncm91cHNbY29sdW1uTnVtXS5wdXNoKHN0YWZmIGFzIFNWR0dFbGVtZW50KTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbY29sdW1uLCBzdGF2ZXNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcbiAgICBjb25zdCBjb2xvciA9IENvbG9yUGFsZXR0ZVtOdW1iZXIoY29sdW1uKSAlIENvbG9yUGFsZXR0ZS5sZW5ndGhdO1xuICAgIGZvciAoY29uc3Qgc3RhZmYgb2Ygc3RhdmVzKSB7XG4gICAgICBoaWdobGlnaHQoc3RhZmYsIGNvbG9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSBoaWdobGlnaHQgYnkgYSBkaWZmZXJlbnQgZ3JvdXBpbmcuXG4gKiBAcGFyYW0gZ3JvdXBpbmcgLSBFaXRoZXIgXCJzdGFmZlwiLCBcInN5bGxhYmxlXCIsIFwibmV1bWVcIiwgXCJzZWxlY3Rpb25cIiwgb3IgXCJsYXllckVsZW1lbnRcIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdyb3VwaW5nSGlnaGxpZ2h0KGdyb3VwaW5nOiBHcm91cGluZ1R5cGUpOiB2b2lkIHtcbiAgdW5zZXRHcm91cGluZ0hpZ2hsaWdodCgpO1xuICBpZiAoZ3JvdXBpbmcgPT09ICdzdGFmZicpIHtcbiAgICBzZXRTdGFmZkhpZ2hsaWdodCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBlbHNlIGlmIChncm91cGluZyA9PT0gJ2NvbHVtbicpIHtcbiAgICBzZXRDb2x1bW5IaWdobGlnaHQoKTtcbiAgICByZXR1cm47XG4gIH0gXG4gIGVsc2UgaWYgKGdyb3VwaW5nID09PSAnc2VsZWN0aW9uJykge1xuICAgIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VsLWJ5LmlzLWFjdGl2ZScpLmlkO1xuICAgIHN3aXRjaCAodGVtcCkge1xuICAgICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBjYXNlICdzZWxCeUJCb3gnOlxuICAgICAgICBncm91cGluZyA9ICdzeWxsYWJsZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlDb2x1bW4nOlxuICAgICAgICBncm91cGluZyA9ICdjb2x1bW4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgICBncm91cGluZyA9ICdzdGFmZic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlMYXllckVsZW1lbnQnOlxuICAgICAgICBncm91cGluZyA9ICdsYXllckVsZW1lbnQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZ3JvdXBpbmcgPSAnbmV1bWUnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgc2V0R3JvdXBpbmdIaWdobGlnaHQoZ3JvdXBpbmcpO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZ3JvdXBzO1xuXG4gIGlmIChncm91cGluZyA9PSAnbGF5ZXJFbGVtZW50Jykge1xuICAgIGdyb3VwcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hY2NpZCwgLmNsZWYsIC5jdXN0b3MsIC5kaXZMaW5lJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZ3JvdXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShncm91cGluZykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD47XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmMsIC5jdXN0b3MsIC5jbGVmLCAuYWNjaWQsIC5kaXZMaW5lJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnYmxhY2snKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczMHB4Jyk7XG4gIH0pO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZ3JvdXBDb2xvciA9IENvbG9yUGFsZXR0ZVtpICUgQ29sb3JQYWxldHRlLmxlbmd0aF07XG4gICAgaWYgKChncm91cHNbaV0uY2xvc2VzdCgnLnNlbGVjdGVkJykgPT09IG51bGwpICYmICFncm91cHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBncm91cHNbaV0uc2V0QXR0cmlidXRlKCdmaWxsJywgZ3JvdXBDb2xvcik7XG4gICAgICBjb25zdCByZWN0cyA9IGdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+O1xuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdCkge1xuICAgICAgICBpZiAocmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsbGFibGUnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gZ3JvdXBDb2xvcjtcbiAgICAgIH0pO1xuICAgICAgZ3JvdXBzW2ldLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICBncm91cHNbaV0ucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKS5mb3JFYWNoKHJlY3QgPT4ge1xuICAgICAgICByZWN0LmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2QwMCcpO1xuICAgICAgfVxuICAgICAgZ3JvdXBzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGl2TGluZUNoaWxkcmVuID0gZ3JvdXBzW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJyk7XG4gICAgaWYgKGRpdkxpbmVDaGlsZHJlbikge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaXZMaW5lQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZGl2TGluZUNoaWxkcmVuW2pdLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgZ3JvdXBDb2xvcik7XG4gICAgICAgIGRpdkxpbmVDaGlsZHJlbltqXS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczMHB4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxufVxuIiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdHJpbmdpZnkvcGFyc2UgZnVuY3Rpb25zIHRoYXQgZG9uJ3Qgb3BlcmF0ZVxuICogcmVjdXJzaXZlbHksIHNvIHRoZXkgYXZvaWQgY2FsbCBzdGFjayBleGNlZWRlZFxuICogZXJyb3JzLlxuICovXG5leHBvcnRzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeShpbnB1dCkge1xuICB2YXIgcXVldWUgPSBbXTtcbiAgcXVldWUucHVzaCh7b2JqOiBpbnB1dH0pO1xuXG4gIHZhciByZXMgPSAnJztcbiAgdmFyIG5leHQsIG9iaiwgcHJlZml4LCB2YWwsIGksIGFycmF5UHJlZml4LCBrZXlzLCBrLCBrZXksIHZhbHVlLCBvYmpQcmVmaXg7XG4gIHdoaWxlICgobmV4dCA9IHF1ZXVlLnBvcCgpKSkge1xuICAgIG9iaiA9IG5leHQub2JqO1xuICAgIHByZWZpeCA9IG5leHQucHJlZml4IHx8ICcnO1xuICAgIHZhbCA9IG5leHQudmFsIHx8ICcnO1xuICAgIHJlcyArPSBwcmVmaXg7XG4gICAgaWYgKHZhbCkge1xuICAgICAgcmVzICs9IHZhbDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICByZXMgKz0gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkob2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgcmVzICs9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcXVldWUucHVzaCh7dmFsOiAnXSd9KTtcbiAgICAgIGZvciAoaSA9IG9iai5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBhcnJheVByZWZpeCA9IGkgPT09IDAgPyAnJyA6ICcsJztcbiAgICAgICAgcXVldWUucHVzaCh7b2JqOiBvYmpbaV0sIHByZWZpeDogYXJyYXlQcmVmaXh9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ1snfSk7XG4gICAgfSBlbHNlIHsgLy8gb2JqZWN0XG4gICAgICBrZXlzID0gW107XG4gICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICBrZXlzLnB1c2goayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ30nfSk7XG4gICAgICBmb3IgKGkgPSBrZXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIG9ialByZWZpeCA9IChpID4gMCA/ICcsJyA6ICcnKTtcbiAgICAgICAgb2JqUHJlZml4ICs9IEpTT04uc3RyaW5naWZ5KGtleSkgKyAnOic7XG4gICAgICAgIHF1ZXVlLnB1c2goe29iajogdmFsdWUsIHByZWZpeDogb2JqUHJlZml4fSk7XG4gICAgICB9XG4gICAgICBxdWV1ZS5wdXNoKHt2YWw6ICd7J30pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHRoZSBwYXJzZSBmdW5jdGlvbi5cbi8vIFRoaXMgcG9wIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBjb3BpZWQgZnJvbVxuLy8gcG91Y2hDb2xsYXRlLnBhcnNlSW5kZXhhYmxlU3RyaW5nXG5mdW5jdGlvbiBwb3Aob2JqLCBzdGFjaywgbWV0YVN0YWNrKSB7XG4gIHZhciBsYXN0TWV0YUVsZW1lbnQgPSBtZXRhU3RhY2tbbWV0YVN0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAob2JqID09PSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudCkge1xuICAgIC8vIHBvcHBpbmcgYSBtZXRhLWVsZW1lbnQsIGUuZy4gYW4gb2JqZWN0IHdob3NlIHZhbHVlIGlzIGFub3RoZXIgb2JqZWN0XG4gICAgbWV0YVN0YWNrLnBvcCgpO1xuICAgIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gIH1cbiAgdmFyIGVsZW1lbnQgPSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudDtcbiAgdmFyIGxhc3RFbGVtZW50SW5kZXggPSBsYXN0TWV0YUVsZW1lbnQuaW5kZXg7XG4gIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgZWxlbWVudC5wdXNoKG9iaik7XG4gIH0gZWxzZSBpZiAobGFzdEVsZW1lbnRJbmRleCA9PT0gc3RhY2subGVuZ3RoIC0gMikgeyAvLyBvYmogd2l0aCBrZXkrdmFsdWVcbiAgICB2YXIga2V5ID0gc3RhY2sucG9wKCk7XG4gICAgZWxlbWVudFtrZXldID0gb2JqO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2gob2JqKTsgLy8gb2JqIHdpdGgga2V5IG9ubHlcbiAgfVxufVxuXG5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIG1ldGFTdGFjayA9IFtdOyAvLyBzdGFjayBmb3IgYXJyYXlzIGFuZCBvYmplY3RzXG4gIHZhciBpID0gMDtcbiAgdmFyIGNvbGxhdGlvbkluZGV4LHBhcnNlZE51bSxudW1DaGFyO1xuICB2YXIgcGFyc2VkU3RyaW5nLGxhc3RDaCxudW1Db25zZWN1dGl2ZVNsYXNoZXMsY2g7XG4gIHZhciBhcnJheUVsZW1lbnQsIG9iakVsZW1lbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29sbGF0aW9uSW5kZXggPSBzdHJbaSsrXTtcbiAgICBpZiAoY29sbGF0aW9uSW5kZXggPT09ICd9JyB8fFxuICAgICAgICBjb2xsYXRpb25JbmRleCA9PT0gJ10nIHx8XG4gICAgICAgIHR5cGVvZiBjb2xsYXRpb25JbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9wKHN0YWNrLnBvcCgpLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoY29sbGF0aW9uSW5kZXgpIHtcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnXFx0JzpcbiAgICAgIGNhc2UgJ1xcbic6XG4gICAgICBjYXNlICc6JzpcbiAgICAgIGNhc2UgJywnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ24nOlxuICAgICAgICBpICs9IDM7IC8vICd1bGwnXG4gICAgICAgIHBvcChudWxsLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0JzpcbiAgICAgICAgaSArPSAzOyAvLyAncnVlJ1xuICAgICAgICBwb3AodHJ1ZSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZic6XG4gICAgICAgIGkgKz0gNDsgLy8gJ2Fsc2UnXG4gICAgICAgIHBvcChmYWxzZSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMCc6XG4gICAgICBjYXNlICcxJzpcbiAgICAgIGNhc2UgJzInOlxuICAgICAgY2FzZSAnMyc6XG4gICAgICBjYXNlICc0JzpcbiAgICAgIGNhc2UgJzUnOlxuICAgICAgY2FzZSAnNic6XG4gICAgICBjYXNlICc3JzpcbiAgICAgIGNhc2UgJzgnOlxuICAgICAgY2FzZSAnOSc6XG4gICAgICBjYXNlICctJzpcbiAgICAgICAgcGFyc2VkTnVtID0gJyc7XG4gICAgICAgIGktLTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBudW1DaGFyID0gc3RyW2krK107XG4gICAgICAgICAgaWYgKC9bXFxkXFwuXFwtZVxcK10vLnRlc3QobnVtQ2hhcikpIHtcbiAgICAgICAgICAgIHBhcnNlZE51bSArPSBudW1DaGFyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9wKHBhcnNlRmxvYXQocGFyc2VkTnVtKSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnXCInOlxuICAgICAgICBwYXJzZWRTdHJpbmcgPSAnJztcbiAgICAgICAgbGFzdENoID0gdm9pZCAwO1xuICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGNoID0gc3RyW2krK107XG4gICAgICAgICAgaWYgKGNoICE9PSAnXCInIHx8IChsYXN0Q2ggPT09ICdcXFxcJyAmJlxuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgJSAyID09PSAxKSkge1xuICAgICAgICAgICAgcGFyc2VkU3RyaW5nICs9IGNoO1xuICAgICAgICAgICAgbGFzdENoID0gY2g7XG4gICAgICAgICAgICBpZiAobGFzdENoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgbnVtQ29uc2VjdXRpdmVTbGFzaGVzKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9wKEpTT04ucGFyc2UoJ1wiJyArIHBhcnNlZFN0cmluZyArICdcIicpLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdbJzpcbiAgICAgICAgYXJyYXlFbGVtZW50ID0geyBlbGVtZW50OiBbXSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKGFycmF5RWxlbWVudC5lbGVtZW50KTtcbiAgICAgICAgbWV0YVN0YWNrLnB1c2goYXJyYXlFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd7JzpcbiAgICAgICAgb2JqRWxlbWVudCA9IHsgZWxlbWVudDoge30sIGluZGV4OiBzdGFjay5sZW5ndGggfTtcbiAgICAgICAgc3RhY2sucHVzaChvYmpFbGVtZW50LmVsZW1lbnQpO1xuICAgICAgICBtZXRhU3RhY2sucHVzaChvYmpFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ3VuZXhwZWN0ZWRseSByZWFjaGVkIGVuZCBvZiBpbnB1dDogJyArIGNvbGxhdGlvbkluZGV4KTtcbiAgICB9XG4gIH1cbn07XG4iLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuXG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpOyAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG5cbiAgcm5kc1s2XSA9IHJuZHNbNl0gJiAweDBmIHwgMHg0MDtcbiAgcm5kc1s4XSA9IHJuZHNbOF0gJiAweDNmIHwgMHg4MDsgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG5cbiAgaWYgKGJ1Zikge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICByZXR1cm4gc3RyaW5naWZ5KHJuZHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2NDsiLCJpbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgRHJhZ0FjdGlvbiwgRWRpdG9yQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgQkJveCwgaXNPdXRPZlNWR0JvdW5kcywgZ2V0R2x5cGhCQm94IH0gZnJvbSAnLi9Db29yZGluYXRlcyc7XG5pbXBvcnQgeyBxdWV1ZU5vdGlmaWNhdGlvbiB9IGZyb20gJy4vTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IHNlbGVjdEFsbCwgc2VsZWN0QkJveCwgc2VsZWN0U3RhZmYgfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuY2xhc3MgRHJhZ0hhbmRsZXIge1xuICByZWFkb25seSBuZW9uVmlldzogTmVvblZpZXc7XG4gIHByaXZhdGUgc2VsZWN0b3I6IHN0cmluZztcbiAgcHJpdmF0ZSBzZWxlY3Rpb246IFNWR0dyYXBoaWNzRWxlbWVudFtdO1xuICBwcml2YXRlIG5vTW92ZVByZWNlZGVzOiBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICBwcml2YXRlIGRyYWdTdGFydENvb3JkczogW251bWJlciwgbnVtYmVyXSA9IFstMSwgLTFdO1xuICBwcml2YXRlIHJlc2V0VG9BY3Rpb246IChzZWxlY3Rpb246IGQzLlNlbGVjdGlvbjxkMy5CYXNlVHlwZSwgdW5rbm93biwgSFRNTEVsZW1lbnQsIHVua25vd24+LCBhcmdzOiB1bmtub3duW10pID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBkeDogbnVtYmVyO1xuICBwcml2YXRlIGR5OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzZWxlY3RvciAtIENTUyBzZWxlY3RvciBvZiBlbGVtZW50IHRvIGFwcGx5IGRyYWcgaGFuZGxlciB0by5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcsIHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGRyYWdnaW5nIGFjdGlvbiBhbmQgaGFuZGxlciBmb3Igc2VsZWN0ZWQgZWxlbWVudHMuXG4gICAqL1xuICBkcmFnSW5pdCAoKTogdm9pZCB7XG4gICAgLy8gRHJhZyBlZmZlY3RzXG4gICAgZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQgKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnU3RhcnRDb29yZHMgPSBbZDMuZXZlbnQueCwgZDMuZXZlbnQueV07XG4gICAgICB0aGlzLmR4ID0gMDtcbiAgICAgIHRoaXMuZHkgPSAwO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZDMuZXZlbnQuc291cmNlRXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgICAgZDMuc2VsZWN0KHRoaXMuc2VsZWN0b3IpLmNhbGwoZHJhZ0JlaGF2aW91cik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkaW5nIGxpc3RlbmVyc1xuICAgIGNvbnN0IGRyYWdCZWhhdmlvdXIgPSBkMy5kcmFnKClcbiAgICAgIC5vbignc3RhcnQnLCBkcmFnU3RhcnRlZC5iaW5kKHRoaXMpKVxuICAgICAgLm9uKCdkcmFnJywgdGhpcy5kcmFnZ2luZy5iaW5kKHRoaXMpKVxuICAgICAgLm9uKCdlbmQnLCB0aGlzLmRyYWdFbmRlZC5iaW5kKHRoaXMpKTtcblxuICAgIGNvbnN0IGFjdGl2ZU5jID0gZDMuc2VsZWN0QWxsKCcuc2VsZWN0ZWQnKTtcbiAgICBhY3RpdmVOYy5jYWxsKGRyYWdCZWhhdmlvdXIpO1xuXG4gICAgbGV0IHNlbGVjdGlvbiA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHcmFwaGljc0VsZW1lbnQ+KCcuc2VsZWN0ZWQnKSk7XG5cbiAgICAvLyBpZiB0aGUgdXNlciBkcmFncyB0aGUgZm9sbG93cyBzeWxsYWJsZSBpbiBhIHRvZ2dsZS1saW5rZWQgc3lsbGFibGUsIFxuICAgIC8vIGNhbmNlbCB0aGUgY29tcGVuc2F0aW9uIGZvciBzeWwgbW92ZW1lbnQgaW4gZHJhZ2dpbmcuXG4gICAgdGhpcy5ub01vdmVQcmVjZWRlcyA9IHNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25vLW1vdmluZycpICYmIGVsLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykpO1xuICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5maWx0ZXIoZWwgPT4gIWVsLmNsYXNzTGlzdC5jb250YWlucygnbm8tbW92aW5nJykpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24uY29uY2F0KEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHcmFwaGljc0VsZW1lbnQ+KCcucmVzaXplUG9pbnQnKSkpO1xuICB9XG5cbiAgZHJhZ2dpbmcgKCk6IHZvaWQge1xuICAgIHRoaXMuZHggPSBkMy5ldmVudC54IC0gdGhpcy5kcmFnU3RhcnRDb29yZHNbMF07XG4gICAgdGhpcy5keSA9IGQzLmV2ZW50LnkgLSB0aGlzLmRyYWdTdGFydENvb3Jkc1sxXTtcblxuICAgIHRoaXMubW92ZUVsZW1lbnRzKHRoaXMuc2VsZWN0aW9uLCB0aGlzLmR4LCB0aGlzLmR5KTtcblxuICAgIC8qXG4gICAgICogaWYgd2UncmUgZHJhZ2dpbmcgYSBzeWxsYWJsZSAob3IgbmV1bWUgZXRjKSB0aGVuIHRoZXJlIHdvbid0IGJlIGEgc3lsIHNlbGVjdGVkXG4gICAgICogdGhlbiB3ZSBkb24ndCB3YW50IHRoZSBib3VuZGluZyBib3ggKGlmIGl0IGlzIGRpc3BsYXllZCkgdG8gbW92ZSB3aGVuIGRyYWdnaW5nIHRoZSBuZXVtZXNcbiAgICAgKiBpdCB3aWxsIGJlIGEgY2hpbGQgb2YgdGhlIGVsZW1lbnQgaW4gc2VsZWN0aW9uLCBzbyBpdCB3aWxsIGdldCBtb3ZlZCBpbiB0aGUgYWJvdmUgbG9vcFxuICAgICAqIHNvIHdlIGNhbmNlbCB0aGF0IG1vdmVtZW50IG91dCBoZXJlXG4gICAgICovXG4gICAgY29uc3Qgc3lscyA9IHRoaXMuc2VsZWN0aW9uLmZpbHRlcigoZWwpID0+IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpO1xuICAgIGlmIChzeWxzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLm5vTW92ZVByZWNlZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgYmJveGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUuc2VsZWN0ZWQnKSlcbiAgICAgICAgLm1hcChlbCA9PiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcbiAgICAgIHRoaXMubW92ZUVsZW1lbnRzKGJib3hlcywgLXRoaXMuZHgsIC10aGlzLmR5KTtcbiAgICB9XG4gIH1cblxuXG4gIGRyYWdFbmRlZCAoKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBoYXMgbm90IGJlZW4gbW92ZWQgbW9yZSB0aGFuIDUgcGl4ZWxzIGluIGFueSBkaXJlY3Rpb24sXG4gICAgLy8gZG8gbm90IGRvIGFueSBhY3Rpb25cbiAgICBjb25zdCB4RGlmZiA9IE1hdGguYWJzKHRoaXMuZHgpLCB5RGlmZiA9IE1hdGguYWJzKHRoaXMuZHkpO1xuICAgIGlmICh4RGlmZiA8PSA1ICYmIHlEaWZmIDw9IDUpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMuZHJhZ0luaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgc2VsZWN0aW9uIGZvciBkcmFnZ2FibGUgZWxlbWVudHNcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemVQb2ludCcpKTtcblxuICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGUgc2VsZWN0aW9uIGFycmF5IGlzIG91dCBvZiBib3VuZHMsXG4gICAgLy8gZHJhZyBhY3Rpb25zIHNob3VsZCBub3QgaGFwcGVuLiBSZXR1cm4gYW4gZXJyb3Igbm90aWZpY2F0aW9uIGFuZCByZXNldFxuICAgIC8vIHRoZSBkcmFnIGhhbmRsZXJcbiAgICBpZiAodGhpcy5pc0N1cnNvck91dE9mQm91bmRzKCkgfHwgdGhpcy5pc0RyYWdPdXRPZkJvdW5kcyhzZWxlY3Rpb24pKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIHNlbGVjdGlvbiBiYWNrIHRvIG5vcm1hbCBzdGF0ZVxuICAgICAgdGhpcy5yZXR1cm5FbGVtZW50cyh0aGlzLnNlbGVjdGlvbik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgYm91bmRpbmcgYm94ZXMgYXMgd2VsbFxuICAgICAgY29uc3QgYmJveGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUuc2VsZWN0ZWQnKSlcbiAgICAgICAgLm1hcChlbCA9PiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcbiAgICAgIHRoaXMucmV0dXJuRWxlbWVudHMoYmJveGVzKTtcblxuICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgcmV0dXJuIHF1ZXVlTm90aWZpY2F0aW9uKCdbRkFJTF0gR2x5cGhzIHdlcmUgcGxhY2VkIG91dCBvZiBib3VuZHMhIERyYWcgYWN0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNoYWluIGVkaXRvciBhY3Rpb24gZm9yIHNlbGVjdGlvblxuICAgIGNvbnN0IHBhcmFtQXJyYXk6IEVkaXRvckFjdGlvbltdID0gW107XG4gICAgc2VsZWN0aW9uLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGVsLnRhZ05hbWUgPT09ICdyZWN0JyA/IGVsLmNsb3Nlc3QoJy5zeWwnKS5pZCA6IGVsLmlkO1xuXG4gICAgICBjb25zdCBkcmFnQWN0aW9uOiBEcmFnQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdkcmFnJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIHg6IHRoaXMuZHgsXG4gICAgICAgICAgeTogLXRoaXMuZHksXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHBhcmFtQXJyYXkucHVzaChkcmFnQWN0aW9uKTtcbiAgICB9KTtcbiAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgIHBhcmFtOiBwYXJhbUFycmF5XG4gICAgfTtcblxuICAgIC8vIFNlbmQgZWRpdG9yIGFjdGlvblxuICAgIHRoaXMubmVvblZpZXdcbiAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIE5lb24gcmUtcmVuZGVycyB0aGUgZW50aXJlIFNWRywgYW5kIGhlbmNlLCBiZWZvcmUgd2UgZG8gc28sXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgYWxsIHRoZSBlbGVtZW50cyAoSURzKSB3ZSBuZWVkIHRvIHNlbGVjdCBhZ2FpblxuICAgICAgICAvLyBUaGVuLCB3ZSBuZWVkIHRvIHJlc2VsZWN0IHRoZW0gYnkgY2FsbGluZyBgdGhpcy5yZXNlbGVjdCgpYFxuICAgICAgICBjb25zdCB0b1Jlc2VsZWN0ID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKSlcbiAgICAgICAgICAuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25vLW1vdmluZycpKVxuICAgICAgICAgIC5tYXAoZWwgPT4gZWwuaWQpO1xuXG4gICAgICAgIC8vIENBVVRJT046IGB1cGRhdGVGb3JDdXJyZW50UGFnZSgpYCBpcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24hXG4gICAgICAgIC8vIEl0IHJlcXVpcmVzIGFuIGBhd2FpdGAga2V5d29yZC5cbiAgICAgICAgYXdhaXQgdGhpcy5uZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB0aGlzLmVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIC8vIFJlc2VsZWN0IHRoZSBlbGVtZW50cyBhbmQgcmVpbml0aWFsaXplIGRyYWdcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNlbGVjdCh0b1Jlc2VsZWN0KTtcbiAgICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyByZXNlbGVjdCAodG9SZXNlbGVjdDogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNlbGVjdGVkID0gdG9SZXNlbGVjdC5tYXAoaWQgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxTVkdHcmFwaGljc0VsZW1lbnQ+KGAjJHtpZH1gKSk7XG5cbiAgICAvLyBBbGwgZ2x5cGhzIGV4Y2VwdCBib3VkaW5nIGJveGVzICgnc3lsJ3MpIG11c3QgYmUgc2VsZWN0ZWQgd2l0aFxuICAgIC8vIGBzZWxlY3RBbGwoKWBcbiAgICByZXNlbGVjdGVkXG4gICAgICAuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bCcpKVxuICAgICAgLmZvckVhY2goYXN5bmMgKCkgPT4gYXdhaXQgc2VsZWN0QWxsKHJlc2VsZWN0ZWQsIHRoaXMubmVvblZpZXcsIHRoaXMpKTtcblxuICAgIC8vIEJvdW5kaW5nIGJveGVzIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZCB1c2luZyBgc2VsZWN0QkJveCgpYFxuICAgIHJlc2VsZWN0ZWRcbiAgICAgIC5maWx0ZXIoZWwgPT4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSlcbiAgICAgIC5mb3JFYWNoKFxuICAgICAgICBlbCA9PiBzZWxlY3RCQm94KGVsLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JyksIHRoaXMsIHRoaXMubmVvblZpZXcpXG4gICAgICApO1xuXG4gICAgLy8gU3RhdmVzIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZCB1c2luZyBgc2VsZWN0U3RhZmYoKWBcbiAgICAvLyBBTkQgbXVzdCBiZSBzZWxlY3RlZCB3aXRoIGBzZWxlY3RBbGwoKWAgZm9yIGNvcnJlY3QgYmVoYXZpb3IgKGZvciBzb21lIHJlYXNvbikuXG4gICAgcmVzZWxlY3RlZFxuICAgICAgLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpXG4gICAgICAuZm9yRWFjaChlbCA9PiBzZWxlY3RTdGFmZihlbCwgdGhpcykpO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZDMgYWN0aW9uIHRvIHVzZSBmb3IgW1tyZXNldF1dLiAqL1xuICByZXNldFRvIChyZXNldDogKHNlbGVjdGlvbjogZDMuU2VsZWN0aW9uPGQzLkJhc2VUeXBlLCB1bmtub3duLCBIVE1MRWxlbWVudCwgdW5rbm93bj4sIGFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRUb0FjdGlvbiA9IHJlc2V0O1xuICB9XG5cbiAgLyoqIFJlc2V0IHRvIGEgcHJldmlvdXMgZDMgYWN0aW9uIGZvciBbW3RoaXMuc2VsZWN0b3JdXS4gKi9cbiAgcmVzZXQgKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2V0VG9BY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZDMuc2VsZWN0KHRoaXMuc2VsZWN0b3IpLmNhbGwodGhpcy5yZXNldFRvQWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBlbmRPcHRpb25zU2VsZWN0aW9uICgpOiB2b2lkIHtcbiAgICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICAgIGNvbnN0IGV4dHJhRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKTtcbiAgICBpZiAobW9yZUVkaXQpIHtcbiAgICAgIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhRWRpdCkge1xuICAgICAgZXh0cmFFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgZXh0cmFFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc3VhbGx5IG1vdmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIGJ5IGBkeGAgYW5kIGBkeWA7IChub3QgdXNpbmcgZDMpXG4gICAqL1xuICBtb3ZlRWxlbWVudHMgKHNlbGVjdGlvbjogRWxlbWVudFtdLCBkeDogbnVtYmVyLCBkeTogbnVtYmVyKTogdm9pZCB7XG4gICAgc2VsZWN0aW9uLmZpbHRlcihlbCA9PiBlbCAhPT0gbnVsbCkuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke2R4fSwke2R5fSlgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXN1YWxseSByZXR1cm4gc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgcG9zaXRpb25zXG4gICAqIGJ5IHJlbW92aW5nIHRoZSB0cmFuc2Zvcm0gYXR0cmlidXRlXG4gICAqL1xuICByZXR1cm5FbGVtZW50cyAoc2VsZWN0aW9uOiBFbGVtZW50W10pOiB2b2lkIHtcbiAgICBzZWxlY3Rpb24uZmlsdGVyKGVsID0+IGVsICE9PSBudWxsKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQ3Vyc29yT3V0T2ZCb3VuZHMgKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVuZFggPSB0aGlzLmRyYWdTdGFydENvb3Jkc1swXSArIHRoaXMuZHg7XG4gICAgY29uc3QgZW5kWSA9IHRoaXMuZHJhZ1N0YXJ0Q29vcmRzWzFdICsgdGhpcy5keTtcblxuICAgIHJldHVybiBpc091dE9mU1ZHQm91bmRzKGVuZFgsIGVuZFkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgc2VsZWN0aW9uIGFycmF5IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBTVkdcbiAgICogQHBhcmFtIHtTVkdHcmFwaGljc0VsZW1lbnRbXX0gc2VsZWN0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJcyBzZWxlY3Rpb24gb3V0IG9mIGJvdW5kc1xuICAgKi9cbiAgaXNEcmFnT3V0T2ZCb3VuZHMgKHNlbGVjdGlvbjogU1ZHR3JhcGhpY3NFbGVtZW50W10pOiBib29sZWFuIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kaW5nIGJveGVzIG9mIGFsbCBnbHlwaHMgKDx1c2U+IGVsZW1lbnRzKSB3aXRoaW4gdGhlIHNlbGVjdGlvbiBhcnJheVxuICAgIGNvbnN0IGlzQkJveERpc3BsYXllZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNkaXNwbGF5QkJveCcpLmNoZWNrZWQ7XG4gICAgbGV0IGdseXBoU2VsZWN0b3IgPSBpc0JCb3hEaXNwbGF5ZWQgPyAndXNlLCByZWN0JyA6ICd1c2UnO1xuXG4gICAgaWYgKHNlbGVjdGlvblswXS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIGdseXBoU2VsZWN0b3IgPSAncGF0aCc7XG5cbiAgICBjb25zdCBnbHlwaHM6IFNWR1VzZUVsZW1lbnRbXSA9IHNlbGVjdGlvbi5yZWR1Y2UoXG4gICAgICAoYWNjLCBlbCkgPT4gYWNjLmNvbmNhdCguLi5lbC5xdWVyeVNlbGVjdG9yQWxsKGdseXBoU2VsZWN0b3IpKSwgW11cbiAgICApO1xuICAgIGNvbnN0IGdseXBoQkJveGVzOiBCQm94W10gPSBnbHlwaHMubWFwKGdldEdseXBoQkJveCk7XG5cbiAgICAvLyBHZXQgdGhlIHN1cnJvdW5kaW5nIGJvdW5kaW5nIGJveCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICBjb25zdCBzZWxlY3Rpb25CQm94OiBCQm94ID0gZ2x5cGhCQm94ZXMucmVkdWNlKFxuICAgICAgKGJib3gsIGN1cnIpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bHg6IE1hdGgubWluKGJib3gudWx4LCBjdXJyLnVseCksXG4gICAgICAgICAgdWx5OiBNYXRoLm1pbihiYm94LnVseSwgY3Vyci51bHkpLFxuICAgICAgICAgIGxyeDogTWF0aC5tYXgoYmJveC5scngsIGN1cnIubHJ4KSxcbiAgICAgICAgICBscnk6IE1hdGgubWF4KGJib3gubHJ5LCBjdXJyLmxyeSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB1bHg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIHVseTogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgbHJ4OiBOdW1iZXIuTUlOX1ZBTFVFLFxuICAgICAgICBscnk6IE51bWJlci5NSU5fVkFMVUUsXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHsgdWx4LCB1bHksIGxyeCwgbHJ5IH0gPSBzZWxlY3Rpb25CQm94O1xuICAgIHJldHVybiBpc091dE9mU1ZHQm91bmRzKHVseCArIHRoaXMuZHgsIHVseSArIHRoaXMuZHkpIHx8IGlzT3V0T2ZTVkdCb3VuZHMobHJ4ICsgdGhpcy5keCwgbHJ5ICsgdGhpcy5keSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRHJhZ0hhbmRsZXIgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0ICogYXMgQ29udGVudHMgZnJvbSAnLi9Db250ZW50cyc7XG5pbXBvcnQgKiBhcyBXYXJuaW5ncyBmcm9tICcuLi9XYXJuaW5ncyc7XG5pbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCAqIGFzIFNlbGVjdFRvb2xzIGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCAqIGFzIFNlbGVjdE9wdGlvbnMgZnJvbSAnLi4vU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24sIFRvZ2dsZUxpZ2F0dXJlQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgcmVtb3ZlSGFuZGxlciwgZGVsZXRlQnV0dG9uSGFuZGxlciB9IGZyb20gJy4vU2VsZWN0T3B0aW9ucyc7XG5cbi8qKlxuICogVGhlIE5lb25WaWV3IHBhcmVudCB0byBhY2Nlc3MgZWRpdG9yIGFjdGlvbnMuXG4gKi9cbmxldCBuZW9uVmlldzogTmVvblZpZXc7XG5cbi8qKlxuICogU2V0IHRoZSBuZW9uVmlldyBtZW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TmVvblZpZXcodmlldzogTmVvblZpZXcpOiB2b2lkIHtcbiAgbmVvblZpZXcgPSB2aWV3O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGNhbiBiZSBncm91cGVkIG9yIG5vdFxuICogQHJldHVybnMgdHJ1ZSBpZiBjYW4gYmUgZ3JvdXBlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dyb3VwYWJsZShcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBncm91cHMgPSBBcnJheS5mcm9tKGVsZW1lbnRzLnZhbHVlcygpKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICBpZiAoZ3JvdXBzLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBjYW5ub3QgZ3JvdXAgaWYgb25seSAxIGVsZW1lbnQgaXMgc2VsZWN0ZWRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIC8vIGlmIG5ldW1lcyBhcmUgaW4gc2FtZSBzeWxsYWJsZSwgZG9uJ3QgZGlzcGxheSBncm91cGluZyBvcHRpb25cbiAgICAgIGlmIChTZWxlY3RUb29scy5zaGFyZWRMb2dpY2FsUGFyZW50KHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGNoZWNrIGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgYWRqYWNlbnQgdG8gZWFjaCBvdGhlclxuICAgICAgaWYgKFNlbGVjdFRvb2xzLmFyZUFkamFjZW50KHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0xpbmtlZChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50cz86IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pIHtcbiAgaWYgKCFlbGVtZW50cykge1xuICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLFxuICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gIH1cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSB8fFxuICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlICdzZWxCeU5jJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKVxuICAgICAgICApIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnVGhlIGFjdGlvbiBpbnZvbHZlcyBsaW5rZWQgc3lsbGFibGVzLCBwbGVhc2UgdW50b2dnbGUgdGhlbSBmaXJzdCcsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0ludmFsaWRMaW5rZWRTeWxsYWJsZShcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBib29sZWFuIHtcbiAgLy8gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElOR1xuICAgICkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcblxuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBlbGVtZW50cy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgY29uc3Qgc3lsbGFibGUgPSBlbGVtZW50cy5hdChpZHgpO1xuICAgIGlmIChzeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICAvLyBHZXQgeG1sOmlkIG9mIHRoZSBuZXh0IHN5bGxhYmxlICh3aXRob3V0IHRoZSAjLCBpZiBpdCBleGlzdHMpXG4gICAgICBjb25zdCBuZXh0U3lsbGFibGVJZCA9IHN5bGxhYmxlXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgIC5yZXBsYWNlKCcjJywgJycpO1xuXG4gICAgICAvLyBGaW5kIHRoZSBuZXh0IHN5bGxhYmxlIGFuZCBpdHMgaW5kZXggaW4gdGhlIGFycmF5XG4gICAgICBsZXQgbmV4dFN5bGxhYmxlSWR4OiBudW1iZXI7XG4gICAgICBjb25zdCBuZXh0U3lsbGFibGUgPSBlbGVtZW50cy5maW5kKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQgPT09IG5leHRTeWxsYWJsZUlkKSB7XG4gICAgICAgICAgbmV4dFN5bGxhYmxlSWR4ID0gaWR4O1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgbmV4dCAoZm9sbG93aW5nKSBzeWxsYWJsZSBjYW5ub3QgYmUgZm91bmRcbiAgICAgIGlmICghbmV4dFN5bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIG5leHQgc3lsbGFibGUgaGFzIGJlZW4gZm91bmQsIGJ1dCB0aGUgQGZvbGxvd3MgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIW5leHRTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiAzOiBUaGUgbmV4dCBzeWxsYWJsZSdzIEBmb2xsb3dzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKG5leHRTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykgIT0gJyMnICsgc3lsbGFibGUuaWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiA0OlxuICAgICAgLy8gU2luY2UgdGhlIEBmb2xsb3dzIHZhbHVlIGlzIGNvcnJlY3QsIGEgcGFpciBvZiBzeWxsYWJsZXMgZXhpc3QgZm9yIHRoZSB0b2dnbGUtbGlua2VkIHN5bGxhYmxlLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIEBmb2xsb3dzIHN5bGxhYmxlIGlzIHRoZSBuZXh0IHN5bGxhYmxlIChpbmRleC13aXNlKSBpbiB0aGUgYXJyYXk6XG4gICAgICBpZiAobmV4dFN5bGxhYmxlSWR4ICE9PSBpZHggKyAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3lsbGFibGUuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpKSB7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGVJZCA9IHN5bGxhYmxlXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJylcbiAgICAgICAgLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGUgPSBlbGVtZW50cy5maW5kKFxuICAgICAgICAoc3lsbGFibGUpID0+IHN5bGxhYmxlLmlkID09PSBwcmV2U3lsbGFibGVJZCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgcHJldmlvdXMgc3lsbGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICAgIGlmICghcHJldlN5bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIHByZXZpb3VzIHN5bGxhYmxlIGV4aXN0cywgYnV0IHRoZSBAcHJlY2VkZXMgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIXByZXZTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMzogVGhlIHByZXZpb3VzIHN5bGxhYmxlJ3MgQHByZWNlZGVzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKHByZXZTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICE9ICcjJyArIHN5bGxhYmxlLmlkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB0byBzZWUgaXMgYSBzZWxlY3Rpb24gb2YgZWxlbWVudHMgaXMgYWxyZWFkeSBsaW5rZWRcbiAqIEBwYXJhbSBlbGVtZW50cyBlbGVtZW50cyB0byBiZSBjb25zaWRlcmVkXG4gKiBAcmV0dXJucyB0cnVlIGlzIGxpbmtlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xpbmtlZChlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pik6IGJvb2xlYW4ge1xuICAvLyBldmVyeSBlbGVtZW50IHNob3VsZCBiZSBsaW5rZWRcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgaWYgKFxuICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSAmJlxuICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEFzc3VtaW5nIGFsbCBlbGVtZW50cyBhcmUgdmFsaWQsXG4gKiBjaGVjayBpZiB0aGUgZWxlbWVudHMgY2FuIGJlIGxpbmtlZDpcbiAqIDEuIHNvcnQgZWxlbWVudHMgYmFzZWQgb24gdGhlaXIgb3JkZXIgaW4gdGhlIERPTVxuICogMi4gZW5zdXJlIGVsZW1lbnRzIGFyZSBhZGphY2VudCBpbiB0aGUgRE9NXG4gKiAzLiBlbnN1cmUgZWxlbWVudHMgYmVsb25nIHRvIGFkamFjZW50IHN0YXZlc1xuICogNC4gY2hlY2sgaWYgY2FuIGJlIGxpbmtlZDpcbiAqICAgIDQuMSBpZiBleGFjdGx5IHR3byBlbGVtZW50cywgYm90aCBuZWVkcyB0byBiZSB1bmxpbmtlZFxuICogICAgNC4yIGlmIG1vcmUgdGhhbiB0d28gZWxlbWVudHMsIG9ubHkgb25lIGVsZW1lbnQgY2FuIGJlIHVubGlua2VkLFxuICogICAgICAgIGF0IGVpdGhlciBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBzZXF1ZW5jZVxuICogQHBhcmFtIGVsZW1lbnRzIGVsZW1lbnRzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEByZXR1cm5zIHRydWUgY2FuIGJlIGxpbmtlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuQmVMaW5rZWQoZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4pOiBib29sZWFuIHtcbiAgLy8gMS4gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdGFmZkEgPSBhLmNsb3Nlc3QoJy5zdGFmZicpO1xuICAgIGNvbnN0IHN0YWZmQiA9IGIuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgcmV0dXJuIHN0YWZmQS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFmZkIpICZcbiAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICA/IC0xXG4gICAgICA6IDE7XG4gIH0pO1xuXG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykpO1xuICBjb25zdCBzeWxsYWJsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxsYWJsZScpKTtcblxuICAvLyAyLiBFbnN1cmUgc3lsbGFibGVzIGFyZSBhZGphY2VudCBpbiB0aGUgRE9NXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IG5leHQgPSBlbGVtZW50c1tpICsgMV07XG4gICAgY29uc3QgY3VycmVudFN5bGxhYmxlSW5kZXggPSBzeWxsYWJsZXMuaW5kZXhPZihjdXJyZW50KTtcbiAgICBjb25zdCBuZXh0U3lsbGFibGVJbmRleCA9IHN5bGxhYmxlcy5pbmRleE9mKG5leHQpO1xuICAgIGlmIChuZXh0U3lsbGFibGVJbmRleCAtIGN1cnJlbnRTeWxsYWJsZUluZGV4ICE9PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIFN0YXZlcyBtdXN0IGJlIGFkamFjZW50XG4gICAgfVxuICAgIC8vIDMuIEVuc3VyZSBzeWxsYWJsZXMgYmVsb25nIHRvIGFkamFjZW50IHN0YXZlc1xuICAgIGNvbnN0IGN1cnJlbnRTdGFmZiA9IGN1cnJlbnQuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgY29uc3QgbmV4dFN0YWZmID0gbmV4dC5jbG9zZXN0KCcuc3RhZmYnKTtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGFmZkluZGV4ID0gc3RhdmVzLmluZGV4T2YoY3VycmVudFN0YWZmIGFzIEhUTUxFbGVtZW50KTtcbiAgICBjb25zdCBuZXh0U3RhZmZJbmRleCA9IHN0YXZlcy5pbmRleE9mKG5leHRTdGFmZiBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKG5leHRTdGFmZkluZGV4IC0gY3VycmVudFN0YWZmSW5kZXggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gU3RhdmVzIG11c3QgYmUgYWRqYWNlbnRcbiAgICB9XG4gIH1cblxuICAvLyA0LjEgSGFuZGxlIGNhc2UgZm9yIGV4YWN0bHkgdHdvIHN5bGxhYmxlc1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmV2ZXJ5KFxuICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiZcbiAgICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpLFxuICAgICk7XG4gIH1cblxuICAvLyA0LjIgSGFuZGxlIGNhc2UgZm9yIG1vcmUgdGhhbiB0d28gc3lsbGFibGVzXG4gIGNvbnN0IHVubGlua2VkRWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgKGVsZW1lbnQpID0+XG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICYmXG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyksXG4gICk7XG5cbiAgaWYgKHVubGlua2VkRWxlbWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBPbmx5IG9uZSB1bmxpbmtlZCBzeWxsYWJsZSBpcyBhbGxvd2VkXG4gIH1cblxuICAvLyBUaGUgdW5saW5rZWQgc3lsbGFibGUgc2hvdWxkIGJlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kXG4gIGNvbnN0IGZpcnN0VW5saW5rZWQgPSB1bmxpbmtlZEVsZW1lbnRzWzBdO1xuXG4gIHJldHVybiAoXG4gICAgZWxlbWVudHMuaW5kZXhPZihmaXJzdFVubGlua2VkKSA9PT0gMCB8fFxuICAgIGVsZW1lbnRzLmluZGV4T2YoZmlyc3RVbmxpbmtlZCkgPT09IGVsZW1lbnRzLmxlbmd0aCAtIDFcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgY2FuIGJlIGxpbmtlZCBvciB1bmxpa25lZC5cbiAqIEBwYXJhbSBzZWxlY3Rpb25UeXBlIEN1cnJlbnQgc2VsZWN0aW9uIG1vZGUuIE9ubHkgY2VydGFpbiBlbGVtZW50cyBjYW4gYmUgbGlua2VkXG4gKiBAcGFyYW0gZWxlbWVudHMgVGhlIGVsZW1lbnRzIHVuZGVyIHF1ZXN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gbGluayBvciB1bi1saW5rIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGlua2FibGUoXG4gIHNlbGVjdGlvblR5cGU6IHN0cmluZyxcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBib29sZWFuIHtcbiAgLy8gY2Fubm90IHRvZ2dsZSBsaW5rIGZvciBzeWxsYWJsZSBzZWxlY3Rpb24gaWYgbnVtYmVyIG9mIHNlbGVjdGVkXG4gIC8vIHN5bGxhYmxlcyBpcyBzbWFsbGVyIHRoYW4gMlxuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIG9ubHkgU3lsbGFibGVzIGNhbiBiZSBsaW5rZWQgb3IgdW5saW5rZWQgKD8pXG4gIGlmIChzZWxlY3Rpb25UeXBlICE9PSAnc2VsQnlTeWxsYWJsZScpIHJldHVybiBmYWxzZTtcblxuICAvLyBDaGVjayBpZiBoYXMgaW52YWxpZCBsaW5rZWQgc3lsbGFibGVzXG4gIGlmIChoYXNJbnZhbGlkTGlua2VkU3lsbGFibGUoZWxlbWVudHMpKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoZSBzZWxlY3RlZCBzeWxsYWJsZXMgaW5jbHVkZSBpbnZhbGlkIGxpbmtlZCBzeWxsYWJsZShzKSEnLFxuICAgICAgJ3dhcm5pbmcnLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gaWYgQUxSRUFEWSBsaW5rZWRcbiAgaWYgKGlzTGlua2VkKGVsZW1lbnRzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIGlmIENBTiBiZSBsaW5rZWRcbiAgZWxzZSBpZiAoY2FuQmVMaW5rZWQoZWxlbWVudHMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTWVyZ2Ugc2VsZWN0ZWQgc3RhdmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVN0YXZlcygpOiB2b2lkIHtcbiAgY29uc3Qgc3lzdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGFmZi5zZWxlY3RlZCcpO1xuICBjb25zdCBlbGVtZW50SWRzID0gW107XG4gIHN5c3RlbXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICBlbGVtZW50SWRzLnB1c2goc3RhZmYuaWQpO1xuICB9KTtcbiAgY29uc3QgZWRpdG9yQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnbWVyZ2UnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWRzOiBlbGVtZW50SWRzLFxuICAgIH0sXG4gIH07XG4gIG5lb25WaWV3XG4gICAgLmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1N0YWZmIE1lcmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdNZXJnZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIHRoZSBncm91cGluZyBzZWxlY3Rpb24gbWVudS5cbiAqIEBwYXJhbSB0eXBlIC0gVGhlIGdyb3VwaW5nIHR5cGU6IG5jLCBuZXVtZSwgc3lsLCBsaWdhdHVyZU5jLCBvciBsaWdhdHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckdyb3VwaW5nKHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICBtb3JlRWRpdC5pbm5lckhUTUwgKz0gQ29udGVudHMuZ3JvdXBpbmdNZW51W3R5cGVdO1xuICBpbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGdyb3VwaW5nIHNlbGVjdGlvbiBtZW51LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kR3JvdXBpbmdTZWxlY3Rpb24oKTogdm9pZCB7XG4gIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkxpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBUaGUgZ3JvdXBpbmcgZHJvcGRvd24gbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gIGNvbnN0IGRlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUnKTtcbiAgZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlSGFuZGxlcik7XG4gIGRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkxpc3RlbmVyKTtcblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXJnZVN5bHMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGlmIChjb250YWluc0xpbmtlZChTZWxlY3RUb29scy5nZXRTZWxlY3Rpb25UeXBlKCkpKSByZXR1cm47XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSxcbiAgICAgICk7XG4gICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cE5ldW1lcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgaWYgKGNvbnRhaW5zTGlua2VkKFNlbGVjdFRvb2xzLmdldFNlbGVjdGlvblR5cGUoKSkpIHJldHVybjtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRJZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSxcbiAgICAgICk7XG4gICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cE5jcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpLmZpbHRlcigoZSkgPT5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduYycpLFxuICAgICAgKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduYycsIGVsZW1lbnRJZHMpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZ3JvdXBOZXVtZXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgZ3JvdXBpbmdBY3Rpb24oJ3VuZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bmdyb3VwTmNzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtbGlnYXR1cmUnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0SWRzKCk7XG5cbiAgICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBUb2dnbGVMaWdhdHVyZUFjdGlvbiA9IHtcbiAgICAgICAgICBhY3Rpb246ICd0b2dnbGVMaWdhdHVyZScsXG4gICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgbmVvblZpZXdcbiAgICAgICAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTGlnYXR1cmUgVG9nZ2xlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0xpZ2F0dXJlIFRvZ2dsZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlLWxpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG4vKipcbiAqIEdyb3VwaW5nL1VuZ3JvdXBpbmcga2V5YmluZGluZyBldmVudCBsaXN0ZW5lclxuICovXG5jb25zdCBrZXlkb3duTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICBpZiAoZS5rZXkgPT09ICdnJykge1xuICAgIC8vIGdldCBzZWxlY3RlZCBlbGVtZW50cyB0byBjaGVjayBpZiB0aGV5IGNhbiBiZSBncm91cGVkc1xuICAgIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLFxuICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gU2VsZWN0VG9vbHMuZ2V0U2VsZWN0aW9uVHlwZSgpO1xuXG4gICAgaWYgKGNvbnRhaW5zTGlua2VkKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkgcmV0dXJuO1xuXG4gICAgLy8gR3JvdXAvbWVyZ2Ugb3IgdW5ncm91cC9zcGxpdCBiYXNlZCBvbiBzZWxlY3Rpb24gdHlwZVxuICAgIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICAgIC8vIGlmIHN5bGxhYmxlcyBhcmUgbGlubmthYmxlLCB0b2dnbGUgbGlua2VkIHN5bGxhYmxlXG4gICAgICAgIC8vIGxpbmtlZCBzeWxsYWJsZXMgY2Fubm90IGJlIGdyb3VwZWQvdW5ncm91cGVkXG4gICAgICAgIGlmIChpc0xpbmthYmxlKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkge1xuICAgICAgICAgIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGlmIGdyb3VwYWJsZSBiZWZvcmUgZ3JvdXBpbmdcbiAgICAgICAgZWxzZSBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldENoaWxkcmVuSWRzKCkuZmlsdGVyKChlKSA9PlxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduZXVtZScpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZ3JvdXBpbmdBY3Rpb24oJ2dyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2FuIG9ubHkgdW5ncm91cCBpZiBsZW5ndGggaXMgMSAob25lIHN5bGxhYmxlIHNlbGVjdGVkKVxuICAgICAgICAvLyBjYW5ub3QgdW5ncm91cCBpZiBtdWx0aXBsZSBzeWxsYWJsZXMgYXJlIHNlbGVjdGVkXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduZXVtZScsIGVsZW1lbnRJZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduYycsIGVsZW1lbnRJZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgbWVyZ2VTdGF2ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTdGFmZlNwbGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBDYW4ndCBwZXJmb3JtIGdyb3VwaW5nL3VuZ3JvdXBpbmcgYWN0aW9uIG9uIHNlbGVjdGlvbiB0eXBlICR7c2VsZWN0aW9uVHlwZX0uYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBGb3JtIGFuZCBleGVjdXRlIGEgZ3JvdXAvdW5ncm91cCBhY3Rpb24uXG4gKiBAcGFyYW0gYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBleGVjdXRlLiBFaXRoZXIgXCJncm91cFwiIG9yIFwidW5ncm91cFwiLlxuICogQHBhcmFtIGdyb3VwVHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGdyb3VwLiBFaXRoZXIgXCJuZXVtZVwiIG9yIFwibmNcIi5cbiAqIEBwYXJhbSBlbGVtZW50SWRzIC0gVGhlIElEcyBvZiB0aGUgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGdyb3VwaW5nQWN0aW9uKFxuICBhY3Rpb246ICdncm91cCcgfCAndW5ncm91cCcsXG4gIGdyb3VwVHlwZTogJ25ldW1lJyB8ICduYycsXG4gIGVsZW1lbnRJZHM6IHN0cmluZ1tdLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVkaXRvckFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIHBhcmFtOiB7XG4gICAgICBncm91cFR5cGU6IGdyb3VwVHlwZSxcbiAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgfSxcbiAgfTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChhY3Rpb24gPT09ICdncm91cCcpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIFN1Y2Nlc3MnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignVW5ncm91cGluZyBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2dyb3VwJykge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignR3JvdXBpbmcgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdVbmdyb3VwaW5nIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuXG4gICAgICAvLyBQcm9tcHQgdXNlciB0byBjb25maXJtIGlmIE5lb24gZG9lcyBub3QgcmUgY29nbml6ZSBjb250b3VyXG4gICAgICBpZiAoZ3JvdXBUeXBlID09PSAnbmMnKSB7XG4gICAgICAgIGNvbnN0IG5ldW1lUGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgZWxlbWVudElkc1swXSxcbiAgICAgICAgKS5wYXJlbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBuY3MgPSBBcnJheS5mcm9tKG5ldW1lUGFyZW50LmNoaWxkcmVuKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcbiAgICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91cihuY3MpO1xuICAgICAgICBpZiAoY29udG91ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgV2FybmluZ3MuZ3JvdXBpbmdOb3RSZWNvZ25pemVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHVubGluayhlbGVtZW50SWRzOiBzdHJpbmdbXSk6IEFycmF5PEVkaXRvckFjdGlvbj4ge1xuICBjb25zdCBwYXJhbSA9IG5ldyBBcnJheTxFZGl0b3JBY3Rpb24+KCk7XG4gIGZvciAoY29uc3QgaWQgb2YgZWxlbWVudElkcykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3ByZWNlZGVzJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmFtO1xufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBhbiBlbGVtZW50IGJ5IElEIGFuZCBlbnN1cmUgaXQncyBhbiBTVkdHcmFwaGljc0VsZW1lbnRcbmZ1bmN0aW9uIGdldFNWR0dyYXBoaWNzRWxlbWVudEJ5SWQoaWQ6IHN0cmluZyk6IFNWR0dyYXBoaWNzRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNWR0dyYXBoaWNzRWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRUb2dnbGVTeWxsYWJsZUlkcyhcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBbU1ZHR3JhcGhpY3NFbGVtZW50LCBTVkdHcmFwaGljc0VsZW1lbnRdIHtcbiAgLy8gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdGFmZkEgPSBhLmNsb3Nlc3QoJy5zdGFmZicpO1xuICAgIGNvbnN0IHN0YWZmQiA9IGIuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgcmV0dXJuIHN0YWZmQS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFmZkIpICZcbiAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICA/IC0xXG4gICAgICA6IDE7XG4gIH0pO1xuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gW2VsZW1lbnRzWzBdLCBlbGVtZW50c1sxXV07XG4gIH1cblxuICBjb25zdCB1bmxpbmtlZEVsZW1lbnQgPSBlbGVtZW50cy5maW5kKFxuICAgIChlbCkgPT4gIWVsLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiYgIWVsLmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSxcbiAgKTtcblxuICBpZiAodW5saW5rZWRFbGVtZW50KSB7XG4gICAgY29uc3QgaW5kZXggPSBlbGVtZW50cy5pbmRleE9mKHVubGlua2VkRWxlbWVudCk7XG5cbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBbZWxlbWVudHNbaW5kZXhdLCBlbGVtZW50c1tpbmRleCArIDFdXTtcbiAgICB9IGVsc2UgaWYgKGluZGV4ID09PSBlbGVtZW50cy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gW2VsZW1lbnRzW2luZGV4IC0gMV0sIGVsZW1lbnRzW2luZGV4XV07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoYXQgYWN0aW9uIChsaW5rL3VubGluaykgdG8gcGVyZm9ybSB3aGVuIHVzZXIgY2xpY2tzIG9uIFwiVG9nZ2xlIExpbmtlZCBTeWxsYWJsZVwiXG4gKiBBbHNvIGNhbGxlZCB3aGVuIGNvcnJlc3BpbmRpbmcgaG90a2V5IGlzIHByZXNzZWQuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpIHtcbiAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICBjb25zdCBjaGFpbkFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICBwYXJhbTogW10sXG4gIH07XG4gIGNvbnN0IHBhcmFtID0gbmV3IEFycmF5PEVkaXRvckFjdGlvbj4oKTtcblxuICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnRJZHNcbiAgICAubWFwKGdldFNWR0dyYXBoaWNzRWxlbWVudEJ5SWQpIC8vIE1hcCBJRHMgdG8gU1ZHR3JhcGhpY3NFbGVtZW50IG9yIG51bGxcbiAgICAuZmlsdGVyKChlbCk6IGVsIGlzIFNWR0dyYXBoaWNzRWxlbWVudCA9PiBlbCAhPT0gbnVsbCk7XG5cbiAgaWYgKGlzTGlua2VkKGVsZW1lbnRzKSkge1xuICAgIHBhcmFtLnB1c2goLi4udW5saW5rKGVsZW1lbnRJZHMpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbZmlyc3RTeWxsYWJsZSwgc2Vjb25kU3lsbGFibGVdID0gZ2V0VG9nZ2xlU3lsbGFibGVJZHMoZWxlbWVudHMpO1xuICAgIGNvbnNvbGUubG9nKGZpcnN0U3lsbGFibGUuaWQsIHNlY29uZFN5bGxhYmxlLmlkKTtcbiAgICBwYXJhbS5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGZpcnN0U3lsbGFibGUuaWQsXG4gICAgICAgIGF0dHJUeXBlOiAncHJlY2VkZXMnLFxuICAgICAgICBhdHRyVmFsdWU6ICcjJyArIHNlY29uZFN5bGxhYmxlLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBwYXJhbS5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IHNlY29uZFN5bGxhYmxlLmlkLFxuICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICBhdHRyVmFsdWU6ICcjJyArIGZpcnN0U3lsbGFibGUuaWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIERlbGV0ZSBzeWwgb24gc2Vjb25kIHN5bGxhYmxlXG4gICAgY29uc3Qgc3lsID0gc2Vjb25kU3lsbGFibGUucXVlcnlTZWxlY3RvcignLnN5bCcpO1xuICAgIGlmIChzeWwgIT09IG51bGwpIHtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogc3lsLmlkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY2hhaW5BY3Rpb24ucGFyYW0gPSBwYXJhbTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdUb2dnbGVkIFN5bGxhYmxlIExpbmsnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICdGYWlsZWQgdG8gVG9nZ2xlIFN5bGxhYmxlIExpbmsnLFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbmRHcm91cGluZ1NlbGVjdGlvbigpO1xuICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgSURzIG9mIHNlbGVjdGVkIGVsZW1lbnRzLlxuICovXG5mdW5jdGlvbiBnZXRJZHMoKTogc3RyaW5nW10ge1xuICBjb25zdCBpZHMgPSBbXTtcbiAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGlkcy5wdXNoKGVsLmlkKTtcbiAgfSk7XG4gIHJldHVybiBpZHM7XG59XG5cbi8qKlxuICogQHJldHVybnMgVGhlIElEcyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMnIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBnZXRDaGlsZHJlbklkcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNoaWxkcmVuSWRzID0gW107XG4gIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBpZiAoXG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSB8fFxuICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpIHx8XG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoKSA9PiB7XG4gICAgICBjaGlsZHJlbklkcy5wdXNoKGNoLmlkKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBjaGlsZHJlbklkcztcbn1cbiIsImV4cG9ydCB7IElFbnRyeSwgSUZpbGUsIElGb2xkZXIsIEVudHJ5VHlwZSB9IGZyb20gJy4vRmlsZVN5c3RlbUludGVyZmFjZXMnO1xuZXhwb3J0IHsgRmlsZVN5c3RlbVRvb2xzIH0gZnJvbSAnLi9GaWxlU3lzdGVtVG9vbHMnO1xuZXhwb3J0IHsgRmlsZVN5c3RlbU1hbmFnZXIgfSBmcm9tICcuL0ZpbGVTeXN0ZW1NYW5hZ2VyJzsiLCJpbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICcuL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBlcnJvckxvZ3NQYW5lbENvbnRlbnRzIH0gZnJvbSAnLi4vU3F1YXJlRWRpdC9Db250ZW50cyc7XG5pbXBvcnQgeyBzZXRTZXR0aW5ncywgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0xvY2FsU2V0dGluZ3MnO1xuaW1wb3J0IHsgTW9kYWxXaW5kb3csIE1vZGFsV2luZG93VmlldyB9IGZyb20gJy4vTW9kYWxXaW5kb3cnO1xuXG5mdW5jdGlvbiBjcmVhdGVMb2dNZXNzYWdlIChub3RpZjogTm90aWZpY2F0aW9uKTogRWxlbWVudCB7XG4gIGNvbnN0IG5vdGlmRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5vdGlmRGl2LmNsYXNzTGlzdC5hZGQoJ25vdGlmaWNhdGlvbi1jb250YWluZXInKTtcbiAgbm90aWZEaXYuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvbi13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctbWFpblwiPiR7bm90aWYubWVzc2FnZX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1leHRyYVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tYnRuLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLWxvZy1pbmZvLWljb24td3JhcHBlclwiPlxuICAgICAgICAgIDxpbWcgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGNsYXNzPVwibm90aWYtbG9nLWluZm8taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9ub3RpZmljYXRpb24taW5mby1pY29uLWxpZ2h0LnN2Z1wiIHRpdGxlPVwiTG9nIE1lc3NhZ2VcIj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLXJlbW92ZS1pY29uLXdyYXBwZXJcIj5cbiAgICAgICAgICA8aW1nIGNsYXNzPVwibG9nLXJlbW92ZSBub3RpZi1yZW1vdmUtaWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9nYXJiYWdlLWNsb3NlZC5zdmdcIiB0aXRsZT1cIlJlbW92ZVwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICBgO1xuXG4gIGNvbnN0IHJlbW92ZUJ0biA9IG5vdGlmRGl2LnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcubG9nLXJlbW92ZScpO1xuICByZW1vdmVCdG4ub25jbGljayA9ICgpID0+IG5vdGlmRGl2LnJlbW92ZSgpO1xuICByZW1vdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgIHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvZ2FyYmFnZS1vcGVuLnN2Z2ApO1xuICB9KTtcbiAgcmVtb3ZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgIHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvZ2FyYmFnZS1jbG9zZWQuc3ZnYCk7XG4gIH0pO1xuXG4gIGlmIChub3RpZi5sb2dJbmZvKSB7XG4gICAgY29uc3QgaW5mb0J0biA9IG5vdGlmRGl2LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcubm90aWYtbG9nLWluZm8taWNvbicpO1xuICAgIGluZm9CdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gICAgcmVtb3ZlQnRuLnN0eWxlLmhlaWdodCA9ICcyMHB4JztcblxuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgaW5mb0J0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvbm90aWZpY2F0aW9uLWluZm8taWNvbi1kYXJrLnN2Z2ApO1xuICAgIH0pO1xuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB7XG4gICAgICBpbmZvQnRuLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9ub3RpZmljYXRpb24taW5mby1pY29uLWxpZ2h0LnN2Z2ApO1xuICAgIH0pO1xuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBvcGVuRXJyb3JMb2dXaW5kb3cobm90aWYubG9nSW5mbykpO1xuICB9XG5cbiAgcmV0dXJuIG5vdGlmRGl2O1xufVxuXG5cbi8qKlxuICogQWRkIG5vdGlmaWNhdGlvbiB0byB0aGUgcGVyc2lzdGVudCBlcnJvciBsb2cgb24gdGhlIHNpZGViYXJcbiAqIEBwYXJhbSBub3RpZiB7Tm90aWZpY2F0aW9ufSBOb3RpZmljYXRpb24gdG8gYWRkIHRvIHRoZSBlcnJvciBsb2dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE5vdGlmaWNhdGlvbiAobm90aWY6IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICBjb25zdCBsb2cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JMb2dDb250ZW50cycpO1xuICBsb2cucHJlcGVuZChjcmVhdGVMb2dNZXNzYWdlKG5vdGlmKSk7XG59XG5cblxuLyoqXG4gKiBJbml0aWFsaXplIGVycm9yIGxvZy5cbiAqIEFkZHMgbmVjZXNzYXJ5IEhUTUwgdG8gRE9NLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEVycm9yTG9nKCk6IHZvaWQge1xuICAvLyBFcnJvciBsb2cgcGFuZWxcbiAgY29uc3QgbG9nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yX2xvZycpO1xuICBsb2cuaW5uZXJIVE1MID0gZXJyb3JMb2dzUGFuZWxDb250ZW50cztcblxuICBpbml0RXJyb3JMb2dDb250cm9scygpO1xufVxuXG5cbi8qKlxuICogU2V0IHVwIGV2ZW50IGxpc3RlbmVycyBmb3IgZXJyb3IgTG9nIHBhbmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RXJyb3JMb2dDb250cm9scygpOiB2b2lkIHtcbiAgY29uc3QgZXJyb3JQYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvcl9sb2cnKTtcbiAgY29uc3QgaGVhZGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvckxvZ0hlYWRpbmcnKTtcbiAgY29uc3QgZHJvcGRvd25JY29uID0gaGVhZGluZy5xdWVyeVNlbGVjdG9yKCdzdmcgPiB1c2UnKTtcbiAgY29uc3QgY29udGVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JMb2dDb250ZW50cycpIGFzIEhUTUxFbGVtZW50O1xuXG4gIGNvbnN0IHsgZGlzcGxheUVyckxvZyB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgaWYgKGRpc3BsYXlFcnJMb2cpIGVycm9yUGFuZWwuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuXG4gIGhlYWRpbmcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy8gaWYgZXJyb3IgcGFuZWwgaXMgY2xvc2VkLCBvcGVuIGl0XG4gICAgaWYgKGNvbnRlbnRzLmNsYXNzTGlzdC5jb250YWlucygnY2xvc2VkJykpIHtcbiAgICAgIC8vIHNldCBjbGFzc2VzIGFuZCBzdHlsZXMgZm9yIGFuIG9wZW4gcGFuZWxcbiAgICAgIGNvbnRlbnRzLmNsYXNzTGlzdC5yZW1vdmUoJ2Nsb3NlZCcpO1xuICAgICAgY29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwLjVlbSAwLjc1ZW0nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ3Zpc2libGUnO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIGRyb3Bkb3duSWNvbi5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25gKTtcbiAgICB9IFxuICAgIC8vIGlmIGVycm9yIHBhbmVsIGlzIG9wZW4sIGNsb3NlIGl0XG4gICAgZWxzZSB7XG4gICAgICAvLyBzZXQgY2xhc3NlcyBhbmQgc3R5bGVzIGZvciBhIGNsb3NlZCBwYW5lbFxuICAgICAgY29udGVudHMuY2xhc3NMaXN0LmFkZCgnY2xvc2VkJyk7XG4gICAgICBjb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMHB4JztcbiAgICAgIH0sIDIwMCk7XG4gICAgICBkcm9wZG93bkljb24uc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1zaWRlYCk7XG4gICAgfVxuICB9KTtcblxuICBpbml0RGlzcGxheUxpc3RlbmVyKCk7XG59XG5cblxuLyoqXG4gKiBJbml0aWFsaXplcyBjbGljayBsaXN0ZW5lciBvbiBcIlNob3cgZXJyb3IgbG9nc1wiIGJ1dHRvbiBpbiBcIlZpZXdcIiBkcm9wZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXREaXNwbGF5TGlzdGVuZXIoKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrYm94ZXNDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGlzcGxheS1zaW5nbGUtY29udGFpbmVyJyk7XG4gIGNvbnN0IGVycm9yc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgY29uc3QgZXJvcnJzQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcblxuICBlcm9ycnNCdG4uY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gnKTtcbiAgZXJyb3JzTGFiZWwuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gtY29udGFpbmVyJywgJ3NpZGUtcGFuZWwtYnRuJyk7XG4gIGVycm9yc0xhYmVsLnRleHRDb250ZW50ID0gJ0Vycm9ycyc7XG4gIGVyb3Jyc0J0bi5pZCA9ICdkaXNwbGF5LWVycm9ycyc7XG4gIGVyb3Jyc0J0bi50eXBlID0gJ2NoZWNrYm94JztcbiAgZXJvcnJzQnRuLmNoZWNrZWQgPSBmYWxzZTtcbiAgZXJyb3JzTGFiZWwuYXBwZW5kQ2hpbGQoZXJvcnJzQnRuKTtcbiAgY2hlY2tib3hlc0NvbnRhaW5lci5hcHBlbmQoZXJyb3JzTGFiZWwpO1xuXG4gIGNvbnN0IHsgZGlzcGxheUVyckxvZyB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgZXJvcnJzQnRuLmNoZWNrZWQgPSBkaXNwbGF5RXJyTG9nO1xuXG4gIGVyb3Jyc0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBzZXRTZXR0aW5ncyh7IGRpc3BsYXlFcnJMb2c6IGVyb3Jyc0J0bi5jaGVja2VkIH0pO1xuICAgIHVwZGF0ZUVycm9yTG9nVmlzaWJpbGl0eSgpO1xuICB9KTtcbn1cblxuXG5mdW5jdGlvbiBvcGVuRXJyb3JMb2dXaW5kb3cobG9nOiBzdHJpbmcpIHtcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5FUlJPUl9MT0csIGxvZyk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRXJyb3JMb2dWaXNpYmlsaXR5KCk6IHZvaWQge1xuICBjb25zdCBub3RpZlBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yX2xvZycpO1xuICBjb25zdCB7IGRlYnVnTW9kZSwgZGlzcGxheUVyckxvZywgZGlzcGxheUluZm8sIGRpc3BsYXlCQm94LCBkaXNwbGF5VGV4dCB9ID0gZ2V0U2V0dGluZ3MoKTtcblxuICBjb25zdCBkaXNwbGF5QWxsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXktYWxsLWJ0bicpO1xuXG4gIGlmIChkZWJ1Z01vZGUpIHtcbiAgICBpZiAoZGlzcGxheUVyckxvZykge1xuICAgICAgbm90aWZQYW5lbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICBpZiAoZGlzcGxheUluZm8gJiYgZGlzcGxheUJCb3ggJiYgXG4gICAgICAgIGRpc3BsYXlUZXh0ICYmIGRpc3BsYXlFcnJMb2cpIHtcbiAgICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbm90aWZQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICBpZiAoZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5vdGlmUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIGlmIChkaXNwbGF5SW5mbyAmJiBkaXNwbGF5QkJveCAmJiBkaXNwbGF5VGV4dCkge1xuICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgZGlzcGxheUFsbEJ0bi5pbm5lckhUTUwgPSAnSGlkZSBBbGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IHsgZ2V0U3RhZmZCQm94LCBzZWxlY3RCQm94LCBzZWxlY3RTdGFmZiwgc2VsZWN0QWxsIH0gZnJvbSAnLi9TZWxlY3RUb29scyc7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4vRHJhZ0hhbmRsZXInO1xuXG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24sIFJlc2l6ZUFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IGlzT3V0T2ZTVkdCb3VuZHMgfSBmcm9tICcuL0Nvb3JkaW5hdGVzJztcbmltcG9ydCB7IHF1ZXVlTm90aWZpY2F0aW9uIH0gZnJvbSAnLi9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0xvY2FsU2V0dGluZ3MnO1xuXG4vKipcbiAqIFJlc2l6ZSBhIHN0YWZmIG9yIGEgc3lsbGFibGUgdGV4dCBib3VuZGluZyBib3guXG4gKiBGb3Igc3RhdmVzLCB0aGlzIGFsc28gc3VwcG9ydHMgYWRqdXN0aW5nIHRoZSByb3RhdGUuXG4gKi9cbnR5cGUgUG9pbnQgPSB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBuYW1lOiBudW1iZXIgfTtcblxuLyoqXG4gKiBUaGUgcG9pbnRzIHlvdSBjYW4gY2xpY2sgYW5kIGRyYWcgdG8gcmVzaXplXG4gKi9cbmNvbnN0IFBvaW50TmFtZXMgPSB7XG4gIFRvcExlZnQ6IDAsXG4gIFRvcDogMSxcbiAgVG9wUmlnaHQ6IDIsXG4gIFJpZ2h0OiAzLFxuICBCb3R0b21SaWdodDogNCxcbiAgQm90dG9tOiA1LFxuICBCb3R0b21MZWZ0OiA2LFxuICBMZWZ0OiA3XG59O1xuXG5mdW5jdGlvbiBnZXRQb2ludHModWx4OiBudW1iZXIsIHVseTogbnVtYmVyLCBscng6IG51bWJlciwgbHJ5OiBudW1iZXIsIHJvdGF0ZTogbnVtYmVyKTogUG9pbnRbXSB7XG4gIC8vIE5vdGUgdGhhdCBhcmMgZnVuY3Rpb25zIHJldHVybiBhbiBhbmdsZSB4IGluIFstcGkvMiwgcGkvMl0uXG4gIGxldCBwb2ludHM6IEFycmF5PFBvaW50PjtcbiAgLy8gdWwgaXMgdWx4LCB1bHksIGxyIGlzIGxyeCwgbHJ5XG4gIGlmIChyb3RhdGUgPj0gMCkge1xuICAgIHBvaW50cyA9IFtcbiAgICAgIHsgeDogdWx4LCB5OiB1bHksIG5hbWU6IFBvaW50TmFtZXMuVG9wTGVmdCB9LFxuICAgICAgeyB4OiAodWx4ICsgbHJ4KSAvIDIsIHk6IHVseSArIChscnggLSB1bHgpIC8gMiAqIE1hdGguc2luKHJvdGF0ZSksIG5hbWU6IFBvaW50TmFtZXMuVG9wIH0sXG4gICAgICB7IHg6IGxyeCwgeTogdWx5ICsgKGxyeCAtIHVseCkgKiBNYXRoLnNpbihyb3RhdGUpLCBuYW1lOiBQb2ludE5hbWVzLlRvcFJpZ2h0IH0sXG4gICAgICB7IHg6IGxyeCwgeTogKHVseSArIGxyeSArIChscnggLSB1bHgpICogTWF0aC5zaW4ocm90YXRlKSkgLyAyLCBuYW1lOiBQb2ludE5hbWVzLlJpZ2h0IH0sXG4gICAgICB7IHg6IGxyeCwgeTogbHJ5LCBuYW1lOiBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0IH0sXG4gICAgICB7IHg6ICh1bHggKyBscngpIC8gMiwgeTogbHJ5IC0gKGxyeCAtIHVseCkgLyAyICogTWF0aC5zaW4ocm90YXRlKSwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b20gfSxcbiAgICAgIHsgeDogdWx4LCB5OiBscnkgLSAobHJ4IC0gdWx4KSAqIE1hdGguc2luKHJvdGF0ZSksIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tTGVmdCB9LFxuICAgICAgeyB4OiB1bHgsIHk6ICh1bHkgKyBscnkgLSAobHJ4IC0gdWx4KSAqIE1hdGguc2luKHJvdGF0ZSkpIC8gMiwgbmFtZTogUG9pbnROYW1lcy5MZWZ0IH1cbiAgICBdO1xuICB9XG4gIC8vIE5vdCB0aGF0XG4gIGVsc2Uge1xuICAgIGNvbnN0IGEgPSAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKE1hdGguYWJzKHJvdGF0ZSkpO1xuICAgIGNvbnN0IGIgPSBscnkgLSB1bHkgLSBhO1xuICAgIHBvaW50cyA9IFtcbiAgICAgIHsgeDogdWx4LCB5OiB1bHkgKyBhLCBuYW1lOiBQb2ludE5hbWVzLlRvcExlZnQgfSxcbiAgICAgIHsgeDogKHVseCArIGxyeCkgLyAyLCB5OiB1bHkgKyBhIC8gMiwgbmFtZTogUG9pbnROYW1lcy5Ub3AgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiB1bHksIG5hbWU6IFBvaW50TmFtZXMuVG9wUmlnaHQgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiB1bHkgKyBiIC8gMiwgbmFtZTogUG9pbnROYW1lcy5SaWdodCB9LFxuICAgICAgeyB4OiBscngsIHk6IHVseSArIGIsIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tUmlnaHQgfSxcbiAgICAgIHsgeDogKHVseCArIGxyeCkgLyAyLCB5OiBscnkgLSBhIC8gMiwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b20gfSxcbiAgICAgIHsgeDogdWx4LCB5OiBscnksIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tTGVmdCB9LFxuICAgICAgeyB4OiB1bHgsIHk6IGxyeSAtIGIgLyAyLCBuYW1lOiBQb2ludE5hbWVzLkxlZnQgfVxuICAgIF07XG4gIH1cbiAgcmV0dXJuIHBvaW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZSAoZWxlbWVudDogU1ZHR3JhcGhpY3NFbGVtZW50LCBuZW9uVmlldzogTmVvblZpZXcsIGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlcik6IHZvaWQge1xuICBsZXQgdWx4OiBudW1iZXI7XG4gIGxldCB1bHk6IG51bWJlcjtcbiAgbGV0IGxyeDogbnVtYmVyO1xuICBsZXQgbHJ5OiBudW1iZXI7XG4gIGxldCByb3RhdGU6IG51bWJlcjtcblxuICBsZXQgaW5pdGlhbFVseDogbnVtYmVyLCBpbml0aWFsTHJ4OiBudW1iZXI7XG4gIGxldCBpbml0aWFsUG9pbnQ6IG51bWJlcltdLCBpbml0aWFsVWx5OiBudW1iZXIsIGluaXRpYWxMcnk6IG51bWJlcixcbiAgICBpbml0aWFsWTogbnVtYmVyLCBpbml0aWFsUmVjdFk6IG51bWJlciwgcG9seUxlbjogbnVtYmVyLCBkeTogbnVtYmVyLCBpbml0aWFsUm90YXRlOiBudW1iZXI7XG5cbiAgZHJhd0luaXRpYWxSZWN0KCk7XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIG5ldyBib3VuZHNcbiAgICovXG4gIGZ1bmN0aW9uIHJlZHJhdyAoKTogdm9pZCB7XG4gICAgY29uc3QgcG9pbnRzOiBQb2ludFtdID0gZ2V0UG9pbnRzKHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlKTtcblxuICAgIGNvbnN0IHBvaW50U3RyaW5nOiBzdHJpbmcgPSBwb2ludHMuZmlsdGVyKChfZWxlbSwgaW5kZXgpID0+IHsgcmV0dXJuIGluZGV4ICUgMiA9PT0gMDsgfSlcbiAgICAgIC5tYXAoZWxlbSA9PiBlbGVtLnggKyAnLCcgKyBlbGVtLnkpXG4gICAgICAuam9pbignICcpO1xuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jlc2l6ZVJlY3QnKS5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIHBvaW50U3RyaW5nKTtcblxuICAgIGNvbnN0IHRleHRSZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN5bC5zZWxlY3RlZCA+IC5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgaWYgKHRleHRSZWN0KSB7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3gnLCBTdHJpbmcoTWF0aC5taW4odWx4LCBscngpKSk7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3knLCBTdHJpbmcoTWF0aC5taW4odWx5LCBscnkpKSk7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKE1hdGguYWJzKGxyeCAtIHVseCkpKTtcbiAgICAgIHRleHRSZWN0LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKE1hdGguYWJzKGxyeSAtIHVseSkpKTtcbiAgICB9XG5cblxuICAgIGZvciAoY29uc3QgcG9pbnROYW1lIGluIFBvaW50TmFtZXMpIHtcbiAgICAgIGNvbnN0IHBvaW50OiBQb2ludCA9IHBvaW50c1tQb2ludE5hbWVzW3BvaW50TmFtZV1dO1xuICAgICAgZDMuc2VsZWN0KCcjcC0nICsgcG9pbnROYW1lKS5maWx0ZXIoJy5yZXNpemVQb2ludCcpXG4gICAgICAgIC5hdHRyKCdjeCcsIHBvaW50LngpXG4gICAgICAgIC5hdHRyKCdjeScsIHBvaW50LnkpO1xuICAgIH1cblxuICAgIGxldCB4ID0gcG9pbnRzWzNdLng7XG4gICAgbGV0IHkgPSBwb2ludHNbM10ueTtcbiAgICBjb25zdCBwb2ludFN0cmluZ1JpZ2h0ID0gKHggKyAxMDApICsgJywnICsgKHkgKyA4NSkgKyAnICcgK1xuICAgICAgKHggKyA3MCkgKyAnLCcgKyAoeSArIDUwKSArICcgJyArICh4ICsgMTAwKSArICcsJyArICh5ICsgMTUpICsgJyAnICsgKHggKyAxMzApICsgJywnICsgKHkgKyA1MCk7XG4gICAgeCA9IHBvaW50c1s3XS54O1xuICAgIHkgPSBwb2ludHNbN10ueTtcbiAgICBjb25zdCBwb2ludFN0cmluZ0xlZnQgPSAoeCAtIDEwMCkgKyAnLCcgKyAoeSAtIDE1KSArICcgJyArXG4gICAgICAoeCAtIDEzMCkgKyAnLCcgKyAoeSAtIDUwKSArICcgJyArICh4IC0gMTAwKSArICcsJyArICh5IC0gODUpICsgJyAnICsgKHggLSA3MCkgKyAnLCcgKyAoeSAtIDUwKTtcblxuICAgIGQzLnNlbGVjdCgnI3JvdGF0ZUxlZnQnKS5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZ0xlZnQpO1xuICAgIGQzLnNlbGVjdCgnI3JvdGF0ZVJpZ2h0JykuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdSaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgaW5pdGlhbCByZWN0YW5nbGUgYXJvdW5kIHRoZSBlbGVtZW50XG4gICAqIGFuZCBhZGQgdGhlIGxpc3RlbmVycyB0byBzdXBwb3J0IGRyYWdnaW5nIHRvIHJlc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGRyYXdJbml0aWFsUmVjdCAoKTogdm9pZCB7XG4gICAgaWYgKGVsZW1lbnQgPT09IG51bGwpIHJldHVybjtcblxuICAgIGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcjcmVzaXplUmVjdCcpLnJlbW92ZSgpO1xuICAgIGQzLnNlbGVjdEFsbCgnLnJvdGF0ZVBvaW50JykucmVtb3ZlKCk7XG5cbiAgICAvLyBpZiBpdCdzIGEgYm91bmRpbmdib3gganVzdCBnZXQgdGhlIGNvb3JkaW5hdGVzXG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmIChyZWN0ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVHJpZWQgdG8gZHJhdyByZXNpemUgcmVjdCBmb3IgYSBzeWxUZXh0UmVjdCB0aGF0IGRvZXNuXFwndCBleGlzdCAob3IgaXNuXFwndCBkaXNwbGF5aW5nKScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bHggPSBOdW1iZXIocmVjdC5nZXRBdHRyaWJ1dGUoJ3gnKSk7XG4gICAgICB1bHkgPSBOdW1iZXIocmVjdC5nZXRBdHRyaWJ1dGUoJ3knKSk7XG4gICAgICBscnggPSArdWx4ICsgK3JlY3QuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgICAgbHJ5ID0gK3VseSArICtyZWN0LmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG5cbiAgICAgIHJvdGF0ZSA9IDA7XG4gICAgfVxuXG4gICAgLy8gaWYgaXQncyBhIHN0YWZmIHVzZSB0aGUgcGF0aHMgdG8gZ2V0IGl0J3MgYm91bmRpbmdib3hcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgIGNvbnN0IGJib3ggPSBnZXRTdGFmZkJCb3goZWxlbWVudCk7XG4gICAgICB1bHggPSBiYm94LnVseDtcbiAgICAgIHVseSA9IGJib3gudWx5O1xuICAgICAgbHJ4ID0gYmJveC5scng7XG4gICAgICBscnkgPSBiYm94LmxyeTtcblxuICAgICAgY29uc3QgY29vcmRpbmF0ZXM6IG51bWJlcltdID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdwYXRoJylcbiAgICAgICAgLmdldEF0dHJpYnV0ZSgnZCcpXG4gICAgICAgIC5tYXRjaCgvXFxkKy9nKVxuICAgICAgICAubWFwKGVsZW1lbnQgPT4gTnVtYmVyKGVsZW1lbnQpKTtcbiAgICAgIHJvdGF0ZSA9IE1hdGguYXRhbigoY29vcmRpbmF0ZXNbM10gLSBjb29yZGluYXRlc1sxXSkgL1xuICAgICAgICAoY29vcmRpbmF0ZXNbMl0gLSBjb29yZGluYXRlc1swXSkpO1xuICAgIH1cblxuICAgIGluaXRpYWxVbHggPSB1bHgsIGluaXRpYWxVbHkgPSB1bHksIGluaXRpYWxMcnggPSBscngsIGluaXRpYWxMcnkgPSBscnk7XG5cbiAgICBsZXQgd2hpY2hQb2ludDogc3RyaW5nO1xuXG4gICAgY29uc3QgcG9pbnRzID0gZ2V0UG9pbnRzKHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlKTtcblxuICAgIHBvbHlMZW4gPSBwb2ludHNbMl0ueCAtIHBvaW50c1swXS54O1xuXG4gICAgY29uc3QgcG9pbnRTdHJpbmcgPSBwb2ludHMuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggJSAyID09PSAwKVxuICAgICAgLm1hcChlbGVtID0+IGVsZW0ueCArICcsJyArIGVsZW0ueSlcbiAgICAgIC5qb2luKCcgJyk7XG5cbiAgICBkMy5zZWxlY3QoJyMnICsgZWxlbWVudC5pZCkuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgIC5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZylcbiAgICAgIC5hdHRyKCdpZCcsICdyZXNpemVSZWN0JylcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEwKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdtb3ZlJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICcyMCAxMCcpO1xuXG4gICAgY29uc3QgeyBjaXJjbGVTaXplIH0gPSBnZXRTZXR0aW5ncygpO1xuXG4gICAgZm9yIChjb25zdCBwb2ludE5hbWUgaW4gUG9pbnROYW1lcykge1xuICAgICAgY29uc3QgcG9pbnQ6IFBvaW50ID0gcG9pbnRzW1BvaW50TmFtZXNbcG9pbnROYW1lXV07XG4gICAgICBkMy5zZWxlY3QoZWxlbWVudC52aWV3cG9ydEVsZW1lbnQpLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgLmF0dHIoJ2N4JywgcG9pbnQueClcbiAgICAgICAgLmF0dHIoJ2N5JywgcG9pbnQueSlcbiAgICAgICAgLmF0dHIoJ3InLCBjaXJjbGVTaXplKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDQpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJyMwMDk5ZmYnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAncmVzaXplUG9pbnQnKVxuICAgICAgICAuYXR0cignaWQnLCAncC0nICsgcG9pbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyBkbyBpdCBhcyBhIGxvb3AgaW5zdGVhZCBvZiBzZWxlY3RBbGwgc28gdGhhdCB5b3UgY2FuIGVhc2lseSBrbm93IHdoaWNoIHBvaW50IHdhc1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBQb2ludE5hbWVzKSB7XG4gICAgICBkMy5zZWxlY3QoJyNwLScgKyBuYW1lKS5maWx0ZXIoJy5yZXNpemVQb2ludCcpLmNhbGwoXG4gICAgICAgIGQzLmRyYWcoKVxuICAgICAgICAgIC5vbignc3RhcnQnLCAoKSA9PiB7IHJlc2l6ZVN0YXJ0KG5hbWUpOyB9KVxuICAgICAgICAgIC5vbignZHJhZycsIHJlc2l6ZURyYWcpXG4gICAgICAgICAgLm9uKCdlbmQnLCByZXNpemVFbmQuYmluZCh0aGlzKSkpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkge1xuICAgICAgbGV0IHggPSBwb2ludHNbM10ueDtcbiAgICAgIGxldCB5ID0gcG9pbnRzWzNdLnk7XG4gICAgICBjb25zdCBwb2ludFN0cmluZ1JpZ2h0ID0gKHggKyAxMDApICsgJywnICsgKHkgKyA4NSkgKyAnICcgK1xuICAgICAgICAoeCArIDcwKSArICcsJyArICh5ICsgNTApICsgJyAnICsgKHggKyAxMDApICsgJywnICsgKHkgKyAxNSkgKyAnICcgKyAoeCArIDEzMCkgKyAnLCcgKyAoeSArIDUwKTtcbiAgICAgIHggPSBwb2ludHNbN10ueDtcbiAgICAgIHkgPSBwb2ludHNbN10ueTtcbiAgICAgIGNvbnN0IHBvaW50U3RyaW5nTGVmdCA9ICh4IC0gMTAwKSArICcsJyArICh5IC0gMTUpICsgJyAnICtcbiAgICAgICAgKHggLSAxMzApICsgJywnICsgKHkgLSA1MCkgKyAnICcgKyAoeCAtIDEwMCkgKyAnLCcgKyAoeSAtIDg1KSArICcgJyArICh4IC0gNzApICsgJywnICsgKHkgLSA1MCk7XG5cbiAgICAgIGQzLnNlbGVjdCgnIycgKyBlbGVtZW50LmlkKS5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdSaWdodClcbiAgICAgICAgLmF0dHIoJ2lkJywgJ3JvdGF0ZVJpZ2h0JylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCA3KVxuICAgICAgICAuYXR0cignZmlsbCcsICcjMDA5OWZmJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3JvdGF0ZVBvaW50Jyk7XG5cbiAgICAgIGQzLnNlbGVjdCgnIycgKyBlbGVtZW50LmlkKS5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdMZWZ0KVxuICAgICAgICAuYXR0cignaWQnLCAncm90YXRlTGVmdCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgNylcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnIzAwOTlmZicpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdyb3RhdGVQb2ludCcpO1xuXG4gICAgICBkMy5zZWxlY3QoJyNyb3RhdGVMZWZ0JykuY2FsbChcbiAgICAgICAgZDMuZHJhZygpXG4gICAgICAgICAgLm9uKCdzdGFydCcsIHJvdGF0ZVN0YXJ0KVxuICAgICAgICAgIC5vbignZHJhZycsIHJvdGF0ZURyYWdMZWZ0KVxuICAgICAgICAgIC5vbignZW5kJywgcm90YXRlRW5kKSk7XG5cbiAgICAgIGQzLnNlbGVjdCgnI3JvdGF0ZVJpZ2h0JykuY2FsbChcbiAgICAgICAgZDMuZHJhZygpXG4gICAgICAgICAgLm9uKCdzdGFydCcsIHJvdGF0ZVN0YXJ0KVxuICAgICAgICAgIC5vbignZHJhZycsIHJvdGF0ZURyYWdSaWdodClcbiAgICAgICAgICAub24oJ2VuZCcsIHJvdGF0ZUVuZCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZVN0YXJ0IChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHdoaWNoUG9pbnQgPSBuYW1lO1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHMuZmluZChwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzW25hbWVdKTtcbiAgICAgIGluaXRpYWxQb2ludCA9IFtwb2ludC54LCBwb2ludC55XTtcbiAgICAgIGluaXRpYWxVbHkgPSB1bHk7XG4gICAgICBpbml0aWFsTHJ5ID0gbHJ5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZURyYWcgKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFBvaW50ID0gZDMubW91c2UodGhpcyk7XG4gICAgICBzd2l0Y2ggKFBvaW50TmFtZXNbd2hpY2hQb2ludF0pIHtcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlRvcExlZnQ6XG4gICAgICAgICAgdWx4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIHVseSA9IGN1cnJlbnRQb2ludFsxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlRvcDpcbiAgICAgICAgICB1bHkgPSBjdXJyZW50UG9pbnRbMV0gLSAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuVG9wUmlnaHQ6XG4gICAgICAgICAgbHJ4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIHVseSA9IGN1cnJlbnRQb2ludFsxXSAtIChscnggLSB1bHgpICogTWF0aC50YW4ocm90YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlJpZ2h0OlxuICAgICAgICAgIGxyeCA9IGN1cnJlbnRQb2ludFswXTtcbiAgICAgICAgICBscnkgPSBpbml0aWFsTHJ5ICsgKGN1cnJlbnRQb2ludFswXSAtIGluaXRpYWxQb2ludFswXSkgKiBNYXRoLnRhbihyb3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuQm90dG9tUmlnaHQ6XG4gICAgICAgICAgbHJ4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIGxyeSA9IGN1cnJlbnRQb2ludFsxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLkJvdHRvbTpcbiAgICAgICAgICBscnkgPSBjdXJyZW50UG9pbnRbMV0gKyAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuQm90dG9tTGVmdDpcbiAgICAgICAgICB1bHggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgbHJ5ID0gY3VycmVudFBvaW50WzFdICsgKGxyeCAtIHVseCkgKiBNYXRoLnRhbihyb3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuTGVmdDpcbiAgICAgICAgICB1bHggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgdWx5ID0gaW5pdGlhbFVseSArIChjdXJyZW50UG9pbnRbMF0gLSBpbml0aWFsUG9pbnRbMF0pICogTWF0aC50YW4ocm90YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdTb21ldGhpbmcgdGhhdCB3YXNuXFwndCBhIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB3YXMgZHJhZ2dlZC4gVGhpcyBzaG91bGRuXFwndCBoYXBwZW4uJyk7XG4gICAgICB9XG4gICAgICByZWRyYXcoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemVFbmQgKCk6IHZvaWQge1xuICAgICAgaWYgKGlzT3V0T2ZTVkdCb3VuZHModWx4LCB1bHkpIHx8IGlzT3V0T2ZTVkdCb3VuZHMobHJ4LCBscnkpKSB7XG4gICAgICAgIHVseCA9IGluaXRpYWxVbHgsIHVseSA9IGluaXRpYWxVbHksIGxyeCA9IGluaXRpYWxMcngsIGxyeSA9IGluaXRpYWxMcnk7XG4gICAgICAgIHJlZHJhdygpO1xuXG4gICAgICAgIHJldHVybiBxdWV1ZU5vdGlmaWNhdGlvbignW0ZBSUxdIEdseXBocyB3ZXJlIHBsYWNlZCBvdXQgb2YgYm91bmRzISBSZXNpemUgYWN0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBSZXNpemVBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3Jlc2l6ZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHVseDogdWx4LFxuICAgICAgICAgIHVseTogdWx5LFxuICAgICAgICAgIGxyeDogbHJ4LFxuICAgICAgICAgIGxyeTogbHJ5XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgYXdhaXQgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudC5pZH1gKTtcbiAgICAgICAgdWx4ID0gdW5kZWZpbmVkLCB1bHkgPSB1bmRlZmluZWQsIGxyeCA9IHVuZGVmaW5lZCwgbHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgICAgICBzZWxlY3RCQm94KGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSwgZHJhZ0hhbmRsZXIsIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdEFsbChbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudC5pZH1gKV0sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgICAgICAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb3JlRWRpdCcpO1xuXG4gICAgICAgICAgaWYgKG1vcmVFZGl0KSB7XG4gICAgICAgICAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgIG1vcmVFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBST1RBVEVcbiAgICBmdW5jdGlvbiByb3RhdGVTdGFydCAoKTogdm9pZCB7XG4gICAgICBjb25zdCB3aGljaCA9IGQzLmV2ZW50LnNvdXJjZUV2ZW50LnRhcmdldC5pZDtcbiAgICAgIGluaXRpYWxZID0gZDMubW91c2UodGhpcylbMV07XG4gICAgICBpbml0aWFsTHJ5ID0gbHJ5O1xuICAgICAgaW5pdGlhbFVseSA9IHVseTtcbiAgICAgIGluaXRpYWxSZWN0WSA9ICh3aGljaCA9PT0gJ3JvdGF0ZVJpZ2h0JyA/IGxyeSA6IHVseSk7XG4gICAgICBpbml0aWFsUm90YXRlID0gcm90YXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvdGF0ZURyYWdMZWZ0ICgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRZID0gZDMubW91c2UodGhpcylbMV07XG4gICAgICBjb25zdCB0ZW1wID0gY3VycmVudFkgLSBpbml0aWFsWTtcbiAgICAgIGNvbnN0IHRlbXBSb3RhdGUgPSBpbml0aWFsUm90YXRlIC0gTWF0aC5hdGFuKHRlbXAgLyBwb2x5TGVuKTtcbiAgICAgIGlmICh0ZW1wUm90YXRlID4gLTAuMiAmJiB0ZW1wUm90YXRlIDwgMC4yKSB7XG4gICAgICAgIGR5ID0gdGVtcDtcbiAgICAgICAgdWx5ID0gaW5pdGlhbFJlY3RZICsgZHk7XG4gICAgICAgIHJvdGF0ZSA9IHRlbXBSb3RhdGU7XG4gICAgICAgIGlmIChyb3RhdGUgPj0gMCkge1xuICAgICAgICAgIHVseSA9IGR5ICsgcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLlRvcExlZnQpWzBdLnk7XG4gICAgICAgICAgbHJ5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0KVswXS55O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVseSA9IHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Ub3BSaWdodClbMF0ueTtcbiAgICAgICAgICBscnkgPSBkeSArIHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Cb3R0b21MZWZ0KVswXS55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWRyYXcoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByb3RhdGVEcmFnUmlnaHQgKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFkgPSBkMy5tb3VzZSh0aGlzKVsxXTtcbiAgICAgIGNvbnN0IHRlbXAgPSBjdXJyZW50WSAtIGluaXRpYWxZO1xuICAgICAgY29uc3QgdGVtcFJvdGF0ZSA9IGluaXRpYWxSb3RhdGUgKyBNYXRoLmF0YW4odGVtcCAvIHBvbHlMZW4pO1xuICAgICAgaWYgKHRlbXBSb3RhdGUgPiAtMC4yICYmIHRlbXBSb3RhdGUgPCAwLjIpIHtcbiAgICAgICAgZHkgPSB0ZW1wO1xuICAgICAgICByb3RhdGUgPSB0ZW1wUm90YXRlO1xuICAgICAgICBpZiAocm90YXRlID49IDAgKSB7XG4gICAgICAgICAgbHJ5ID0gZHkgKyBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuQm90dG9tUmlnaHQpWzBdLnk7XG4gICAgICAgICAgdWx5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLlRvcExlZnQpWzBdLnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdWx5ID0gZHkgKyBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuVG9wUmlnaHQpWzBdLnk7XG4gICAgICAgICAgbHJ5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLkJvdHRvbUxlZnQpWzBdLnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZHJhdygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvdGF0ZUVuZCAoKTogdm9pZCB7XG4gICAgICBpZiAoZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkeSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc091dE9mU1ZHQm91bmRzKHVseCwgdWx5KSB8fCBpc091dE9mU1ZHQm91bmRzKGxyeCwgbHJ5KSkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVzaXplUG9pbnQnKS5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3Jlc2l6ZVJlY3QnKS5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJvdGF0ZVBvaW50JykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG5cbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQpIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICB1bHggPSB1bmRlZmluZWQ7XG4gICAgICAgIHVseSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbHJ4ID0gdW5kZWZpbmVkO1xuICAgICAgICBscnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGR5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgICAgIHNlbGVjdEJCb3goZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLCBkcmFnSGFuZGxlciwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0U3RhZmYoZWxlbWVudCwgZHJhZ0hhbmRsZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXVlTm90aWZpY2F0aW9uKCdbRkFJTF0gR2x5cGhzIHdlcmUgcGxhY2VkIG91dCBvZiBib3VuZHMhIFJvdGF0ZSBhY3Rpb24gZmFpbGVkLicsICdlcnJvcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAncmVzaXplUm90YXRlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgdWx4OiB1bHgsXG4gICAgICAgICAgdWx5OiB1bHksXG4gICAgICAgICAgbHJ4OiBscngsXG4gICAgICAgICAgbHJ5OiBscnksXG4gICAgICAgICAgcm90YXRlOiByb3RhdGUgKiAxODAgLyBNYXRoLlBJXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KGVkaXRvckFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGF3YWl0IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQpIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICB1bHggPSB1bmRlZmluZWQsIHVseSA9IHVuZGVmaW5lZCwgbHJ4ID0gdW5kZWZpbmVkLCBscnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGR5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgICAgICBzZWxlY3RCQm94KGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSwgZHJhZ0hhbmRsZXIsIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdFN0YWZmKGVsZW1lbnQsIGRyYWdIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgaW1tZWRpYXRlIGZyb20gJ2ltbWVkaWF0ZSc7XG5pbXBvcnQgeyB2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IE1kNSBmcm9tICdzcGFyay1tZDUnO1xuaW1wb3J0IHZ1dnV6ZWxhIGZyb20gJ3Z1dnV6ZWxhJztcbmltcG9ydCBnZXRBcmd1bWVudHMgZnJvbSAnYXJnc2FycmF5JztcbmltcG9ydCBpbmhlcml0cyBmcm9tICdpbmhlcml0cyc7XG5pbXBvcnQgRUUgZnJvbSAnZXZlbnRzJztcblxuZnVuY3Rpb24gbWFuZ2xlKGtleSkge1xuICByZXR1cm4gJyQnICsga2V5O1xufVxuZnVuY3Rpb24gdW5tYW5nbGUoa2V5KSB7XG4gIHJldHVybiBrZXkuc3Vic3RyaW5nKDEpO1xufVxuZnVuY3Rpb24gTWFwJDEoKSB7XG4gIHRoaXMuX3N0b3JlID0ge307XG59XG5NYXAkMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgbWFuZ2xlZCA9IG1hbmdsZShrZXkpO1xuICByZXR1cm4gdGhpcy5fc3RvcmVbbWFuZ2xlZF07XG59O1xuTWFwJDEucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHZhciBtYW5nbGVkID0gbWFuZ2xlKGtleSk7XG4gIHRoaXMuX3N0b3JlW21hbmdsZWRdID0gdmFsdWU7XG4gIHJldHVybiB0cnVlO1xufTtcbk1hcCQxLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBtYW5nbGVkID0gbWFuZ2xlKGtleSk7XG4gIHJldHVybiBtYW5nbGVkIGluIHRoaXMuX3N0b3JlO1xufTtcbk1hcCQxLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpLm1hcChrID0+IHVubWFuZ2xlKGspKTtcbn07XG5NYXAkMS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgbWFuZ2xlZCA9IG1hbmdsZShrZXkpO1xuICB2YXIgcmVzID0gbWFuZ2xlZCBpbiB0aGlzLl9zdG9yZTtcbiAgZGVsZXRlIHRoaXMuX3N0b3JlW21hbmdsZWRdO1xuICByZXR1cm4gcmVzO1xufTtcbk1hcCQxLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNiKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuX3N0b3JlW2tleV07XG4gICAga2V5ID0gdW5tYW5nbGUoa2V5KTtcbiAgICBjYih2YWx1ZSwga2V5KTtcbiAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNYXAkMS5wcm90b3R5cGUsICdzaXplJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpLmxlbmd0aDtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIFNldCQxKGFycmF5KSB7XG4gIHRoaXMuX3N0b3JlID0gbmV3IE1hcCQxKCk7XG5cbiAgLy8gaW5pdCB3aXRoIGFuIGFycmF5XG4gIGlmIChhcnJheSAmJiBBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdGhpcy5hZGQoYXJyYXlbaV0pO1xuICAgIH1cbiAgfVxufVxuU2V0JDEucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX3N0b3JlLnNldChrZXksIHRydWUpO1xufTtcblNldCQxLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9zdG9yZS5oYXMoa2V5KTtcbn07XG5TZXQkMS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYikge1xuICB0aGlzLl9zdG9yZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgY2Ioa2V5KTtcbiAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldCQxLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5zaXplO1xuICB9XG59KTtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9rYW5nYXguZ2l0aHViLmlvL2NvbXBhdC10YWJsZS9lczYvIHdlIGNhbiBzbmlmZiBvdXRcbi8vIGluY29tcGxldGUgTWFwL1NldCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGNhdXNlIG91ciB0ZXN0cyB0byBmYWlsLlxuLy8gTm90YWJseSB0aGV5IGZhaWwgaW4gSUUxMSBhbmQgaU9TIDguNCwgd2hpY2ggdGhpcyBwcmV2ZW50cy5cbmZ1bmN0aW9uIHN1cHBvcnRzTWFwQW5kU2V0KCkge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3AgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcCwgU3ltYm9sLnNwZWNpZXMpO1xuICByZXR1cm4gcHJvcCAmJiAnZ2V0JyBpbiBwcm9wICYmIE1hcFtTeW1ib2wuc3BlY2llc10gPT09IE1hcDtcbn1cblxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vbnRhZ2Vqcy9jb2xsZWN0aW9uc1xuXG52YXIgRXhwb3J0ZWRTZXQ7XG52YXIgRXhwb3J0ZWRNYXA7XG5cbntcbiAgaWYgKHN1cHBvcnRzTWFwQW5kU2V0KCkpIHsgLy8gcHJlZmVyIGJ1aWx0LWluIE1hcC9TZXRcbiAgICBFeHBvcnRlZFNldCA9IFNldDtcbiAgICBFeHBvcnRlZE1hcCA9IE1hcDtcbiAgfSBlbHNlIHsgLy8gZmFsbCBiYWNrIHRvIG91ciBwb2x5ZmlsbFxuICAgIEV4cG9ydGVkU2V0ID0gU2V0JDE7XG4gICAgRXhwb3J0ZWRNYXAgPSBNYXAkMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0JpbmFyeU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIG9iamVjdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fFxuICAgICh0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqZWN0IGluc3RhbmNlb2YgQmxvYik7XG59XG5cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYnVmZikge1xuICBpZiAodHlwZW9mIGJ1ZmYuc2xpY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYnVmZi5zbGljZSgwKTtcbiAgfVxuICAvLyBJRTEwLTExIHNsaWNlKCkgcG9seWZpbGxcbiAgdmFyIHRhcmdldCA9IG5ldyBBcnJheUJ1ZmZlcihidWZmLmJ5dGVMZW5ndGgpO1xuICB2YXIgdGFyZ2V0QXJyYXkgPSBuZXcgVWludDhBcnJheSh0YXJnZXQpO1xuICB2YXIgc291cmNlQXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmKTtcbiAgdGFyZ2V0QXJyYXkuc2V0KHNvdXJjZUFycmF5KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gY2xvbmVCaW5hcnlPYmplY3Qob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG4gIH1cbiAgdmFyIHNpemUgPSBvYmplY3Quc2l6ZTtcbiAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcbiAgLy8gQmxvYlxuICBpZiAodHlwZW9mIG9iamVjdC5zbGljZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBvYmplY3Quc2xpY2UoMCwgc2l6ZSwgdHlwZSk7XG4gIH1cbiAgLy8gUGhhbnRvbUpTIHNsaWNlKCkgcmVwbGFjZW1lbnRcbiAgcmV0dXJuIG9iamVjdC53ZWJraXRTbGljZSgwLCBzaXplLCB0eXBlKTtcbn1cblxuLy8gbW9zdCBvZiB0aGlzIGlzIGJvcnJvd2VkIGZyb20gbG9kYXNoLmlzUGxhaW5PYmplY3Q6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmlzLWNvbXBvbmVudHMvbG9kYXNoLmlzcGxhaW5vYmplY3QvXG4vLyBibG9iLzI5YzM1ODE0MGE3NGYyNTJhZWIwOGM5ZWIyOGJlZjg2ZjIyMTdkNGEvaW5kZXguanNcblxudmFyIGZ1bmNUb1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb3RvID09PSBudWxsKSB7IC8vIG5vdCBzdXJlIHdoZW4gdGhpcyBoYXBwZW5zLCBidXQgSSBndWVzcyBpdCBjYW5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiZcbiAgICBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gY2xvbmUob2JqZWN0KSB7XG4gIHZhciBuZXdPYmplY3Q7XG4gIHZhciBpO1xuICB2YXIgbGVuO1xuXG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICBuZXdPYmplY3QgPSBbXTtcbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBvYmplY3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIG5ld09iamVjdFtpXSA9IGNsb25lKG9iamVjdFtpXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdPYmplY3Q7XG4gIH1cblxuICAvLyBzcGVjaWFsIGNhc2U6IHRvIGF2b2lkIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIEluZGV4ZWREQlxuICAvLyBhbmQgb3RoZXIgYmFja2VuZHMsIHdlIGF1dG9tYXRpY2FsbHkgc3RyaW5naWZ5IERhdGVzXG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEYXRlICYmIGlzRmluaXRlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICBpZiAoaXNCaW5hcnlPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBjbG9uZUJpbmFyeU9iamVjdChvYmplY3QpO1xuICB9XG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0OyAvLyBkb24ndCBjbG9uZSBvYmplY3RzIGxpa2UgV29ya2Vyc1xuICB9XG5cbiAgbmV3T2JqZWN0ID0ge307XG4gIGZvciAoaSBpbiBvYmplY3QpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBpKSkge1xuICAgICAgdmFyIHZhbHVlID0gY2xvbmUob2JqZWN0W2ldKTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5ld09iamVjdFtpXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3T2JqZWN0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGZ1bikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICAvLyB0aGlzIGlzIGEgc21va2UgdGVzdCBhbmQgc2hvdWxkIG5ldmVyIGFjdHVhbGx5IGhhcHBlblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbmNlIGNhbGxlZCBtb3JlIHRoYW4gb25jZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgZnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUHJvbWlzZShmdW5jKSB7XG4gIC8vY3JlYXRlIHRoZSBmdW5jdGlvbiB3ZSB3aWxsIGJlIHJldHVybmluZ1xuICByZXR1cm4gZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgLy8gQ2xvbmUgYXJndW1lbnRzXG4gICAgYXJncyA9IGNsb25lKGFyZ3MpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBpZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLCBhc3N1bWUgaXRzIGEgY2FsbGJhY2tcbiAgICB2YXIgdXNlZENCID0gKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpID8gYXJncy5wb3AoKSA6IGZhbHNlO1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgICAgdmFyIHJlc3A7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBvbmNlKGZ1bmN0aW9uIChlcnIsIG1lc2cpIHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnVsZmlsbChtZXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjcmVhdGUgYSBjYWxsYmFjayBmb3IgdGhpcyBpbnZvY2F0aW9uXG4gICAgICAgIC8vIGFwcGx5IHRoZSBmdW5jdGlvbiBpbiB0aGUgb3JpZyBjb250ZXh0XG4gICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJlc3AgPSBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICBpZiAocmVzcCAmJiB0eXBlb2YgcmVzcC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZnVsZmlsbChyZXNwKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gaWYgdGhlcmUgaXMgYSBjYWxsYmFjaywgY2FsbCBpdCBiYWNrXG4gICAgaWYgKHVzZWRDQikge1xuICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdXNlZENCKG51bGwsIHJlc3VsdCk7XG4gICAgICB9LCB1c2VkQ0IpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGxvZ0FwaUNhbGwoc2VsZiwgbmFtZSwgYXJncykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHNlbGYuY29uc3RydWN0b3IubGlzdGVuZXJzKCdkZWJ1ZycpLmxlbmd0aCkge1xuICAgIHZhciBsb2dBcmdzID0gWydhcGknLCBzZWxmLm5hbWUsIG5hbWVdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGxvZ0FyZ3MucHVzaChhcmdzW2ldKTtcbiAgICB9XG4gICAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCdkZWJ1ZycsIGxvZ0FyZ3MpO1xuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIGNhbGxiYWNrIGl0c2VsZiB0byBsb2cgdGhlIHJlc3BvbnNlXG4gICAgdmFyIG9yaWdDYWxsYmFjayA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIHZhciByZXNwb25zZUFyZ3MgPSBbJ2FwaScsIHNlbGYubmFtZSwgbmFtZV07XG4gICAgICByZXNwb25zZUFyZ3MgPSByZXNwb25zZUFyZ3MuY29uY2F0KFxuICAgICAgICBlcnIgPyBbJ2Vycm9yJywgZXJyXSA6IFsnc3VjY2VzcycsIHJlc11cbiAgICAgICk7XG4gICAgICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ2RlYnVnJywgcmVzcG9uc2VBcmdzKTtcbiAgICAgIG9yaWdDYWxsYmFjayhlcnIsIHJlcyk7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGFwdGVyRnVuKG5hbWUsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0b1Byb21pc2UoZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZGF0YWJhc2UgaXMgY2xvc2VkJykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdkYXRhYmFzZSBpcyBkZXN0cm95ZWQnKSk7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBsb2dBcGlDYWxsKHNlbGYsIG5hbWUsIGFyZ3MpO1xuICAgIGlmICghdGhpcy50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi50YXNrcXVldWUuYWRkVGFzayhmdW5jdGlvbiAoZmFpbGVkKSB7XG4gICAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgcmVqZWN0KGZhaWxlZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZ1bGZpbGwoc2VsZltuYW1lXS5hcHBseShzZWxmLCBhcmdzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJncyk7XG4gIH0pKTtcbn1cblxuLy8gbGlrZSB1bmRlcnNjb3JlL2xvZGFzaCBfLnBpY2soKVxuZnVuY3Rpb24gcGljayhvYmosIGFycikge1xuICB2YXIgcmVzID0ge307XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgcHJvcCA9IGFycltpXTtcbiAgICBpZiAocHJvcCBpbiBvYmopIHtcbiAgICAgIHJlc1twcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy8gTW9zdCBicm93c2VycyB0aHJvdHRsZSBjb25jdXJyZW50IHJlcXVlc3RzIGF0IDYsIHNvIGl0J3Mgc2lsbHlcbi8vIHRvIHNoaW0gX2J1bGtfZ2V0IGJ5IHRyeWluZyB0byBsYXVuY2ggcG90ZW50aWFsbHkgaHVuZHJlZHMgb2YgcmVxdWVzdHNcbi8vIGFuZCB0aGVuIGxldHRpbmcgdGhlIG1ham9yaXR5IHRpbWUgb3V0LiBXZSBjYW4gaGFuZGxlIHRoaXMgb3Vyc2VsdmVzLlxudmFyIE1BWF9OVU1fQ09OQ1VSUkVOVF9SRVFVRVNUUyA9IDY7XG5cbmZ1bmN0aW9uIGlkZW50aXR5RnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzdWx0Rm9yT3BlblJldnNHZXQocmVzdWx0KSB7XG4gIHJldHVybiBbe1xuICAgIG9rOiByZXN1bHRcbiAgfV07XG59XG5cbi8vIHNoaW0gZm9yIFAvQ291Y2hEQiBhZGFwdGVycyB0aGF0IGRvbid0IGRpcmVjdGx5IGltcGxlbWVudCBfYnVsa19nZXRcbmZ1bmN0aW9uIGJ1bGtHZXQoZGIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciByZXF1ZXN0cyA9IG9wdHMuZG9jcztcblxuICAvLyBjb25zb2xpZGF0ZSBpbnRvIG9uZSByZXF1ZXN0IHBlciBkb2MgaWYgcG9zc2libGVcbiAgdmFyIHJlcXVlc3RzQnlJZCA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICByZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgaWYgKHJlcXVlc3RzQnlJZC5oYXMocmVxdWVzdC5pZCkpIHtcbiAgICAgIHJlcXVlc3RzQnlJZC5nZXQocmVxdWVzdC5pZCkucHVzaChyZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdHNCeUlkLnNldChyZXF1ZXN0LmlkLCBbcmVxdWVzdF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIG51bURvY3MgPSByZXF1ZXN0c0J5SWQuc2l6ZTtcbiAgdmFyIG51bURvbmUgPSAwO1xuICB2YXIgcGVyRG9jUmVzdWx0cyA9IG5ldyBBcnJheShudW1Eb2NzKTtcblxuICBmdW5jdGlvbiBjb2xsYXBzZVJlc3VsdHNBbmRGaW5pc2goKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICBwZXJEb2NSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJlcykge1xuICAgICAgcmVzLmRvY3MuZm9yRWFjaChmdW5jdGlvbiAoaW5mbykge1xuICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgIGlkOiByZXMuaWQsXG4gICAgICAgICAgZG9jczogW2luZm9dXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY2FsbGJhY2sobnVsbCwge3Jlc3VsdHM6IHJlc3VsdHN9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICBpZiAoKytudW1Eb25lID09PSBudW1Eb2NzKSB7XG4gICAgICBjb2xsYXBzZVJlc3VsdHNBbmRGaW5pc2goKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnb3RSZXN1bHQoZG9jSW5kZXgsIGlkLCBkb2NzKSB7XG4gICAgcGVyRG9jUmVzdWx0c1tkb2NJbmRleF0gPSB7aWQ6IGlkLCBkb2NzOiBkb2NzfTtcbiAgICBjaGVja0RvbmUoKTtcbiAgfVxuXG4gIHZhciBhbGxSZXF1ZXN0cyA9IFtdO1xuICByZXF1ZXN0c0J5SWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgIGFsbFJlcXVlc3RzLnB1c2goa2V5KTtcbiAgfSk7XG5cbiAgdmFyIGkgPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHRCYXRjaCgpIHtcblxuICAgIGlmIChpID49IGFsbFJlcXVlc3RzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB1cFRvID0gTWF0aC5taW4oaSArIE1BWF9OVU1fQ09OQ1VSUkVOVF9SRVFVRVNUUywgYWxsUmVxdWVzdHMubGVuZ3RoKTtcbiAgICB2YXIgYmF0Y2ggPSBhbGxSZXF1ZXN0cy5zbGljZShpLCB1cFRvKTtcbiAgICBwcm9jZXNzQmF0Y2goYmF0Y2gsIGkpO1xuICAgIGkgKz0gYmF0Y2gubGVuZ3RoO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoKGJhdGNoLCBvZmZzZXQpIHtcbiAgICBiYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChkb2NJZCwgaikge1xuICAgICAgdmFyIGRvY0lkeCA9IG9mZnNldCArIGo7XG4gICAgICB2YXIgZG9jUmVxdWVzdHMgPSByZXF1ZXN0c0J5SWQuZ2V0KGRvY0lkKTtcblxuICAgICAgLy8ganVzdCB1c2UgdGhlIGZpcnN0IHJlcXVlc3QgYXMgdGhlIFwidGVtcGxhdGVcIlxuICAgICAgLy8gVE9ETzogVGhlIF9idWxrX2dldCBBUEkgYWxsb3dzIGZvciBtb3JlIHN1YnRsZSB1c2UgY2FzZXMgdGhhbiB0aGlzLFxuICAgICAgLy8gYnV0IGZvciBub3cgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGVyZSB3aWxsIGJlIGEgbWl4IG9mIGRpZmZlcmVudFxuICAgICAgLy8gXCJhdHRzX3NpbmNlXCIgb3IgXCJhdHRhY2htZW50c1wiIGluIHRoZSBzYW1lIHJlcXVlc3QsIHNpbmNlIGl0J3MganVzdFxuICAgICAgLy8gcmVwbGljYXRlLmpzIHRoYXQgaXMgdXNpbmcgdGhpcyBmb3IgdGhlIG1vbWVudC5cbiAgICAgIC8vIEFsc28sIGF0dHNfc2luY2UgaXMgYXNwaXJhdGlvbmFsLCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGl0IHlldC5cbiAgICAgIHZhciBkb2NPcHRzID0gcGljayhkb2NSZXF1ZXN0c1swXSwgWydhdHRzX3NpbmNlJywgJ2F0dGFjaG1lbnRzJ10pO1xuICAgICAgZG9jT3B0cy5vcGVuX3JldnMgPSBkb2NSZXF1ZXN0cy5tYXAoZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgLy8gcmV2IGlzIG9wdGlvbmFsLCBvcGVuX3JldnMgZGlzYWxsb3dlZFxuICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXY7XG4gICAgICB9KTtcblxuICAgICAgLy8gcmVtb3ZlIGZhbHNleSAvIHVuZGVmaW5lZCByZXZpc2lvbnNcbiAgICAgIGRvY09wdHMub3Blbl9yZXZzID0gZG9jT3B0cy5vcGVuX3JldnMuZmlsdGVyKGlkZW50aXR5RnVuY3Rpb24pO1xuXG4gICAgICB2YXIgZm9ybWF0UmVzdWx0ID0gaWRlbnRpdHlGdW5jdGlvbjtcblxuICAgICAgaWYgKGRvY09wdHMub3Blbl9yZXZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgZG9jT3B0cy5vcGVuX3JldnM7XG5cbiAgICAgICAgLy8gd2hlbiBmZXRjaGluZyBvbmx5IHRoZSBcIndpbm5pbmdcIiBsZWFmLFxuICAgICAgICAvLyB0cmFuc2Zvcm0gdGhlIHJlc3VsdCBzbyBpdCBsb29rcyBsaWtlIGFuIG9wZW5fcmV2c1xuICAgICAgICAvLyByZXF1ZXN0XG4gICAgICAgIGZvcm1hdFJlc3VsdCA9IGZvcm1hdFJlc3VsdEZvck9wZW5SZXZzR2V0O1xuICAgICAgfVxuXG4gICAgICAvLyBnbG9iYWxseS1zdXBwbGllZCBvcHRpb25zXG4gICAgICBbJ3JldnMnLCAnYXR0YWNobWVudHMnLCAnYmluYXJ5JywgJ2FqYXgnLCAnbGF0ZXN0J10uZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgaWYgKHBhcmFtIGluIG9wdHMpIHtcbiAgICAgICAgICBkb2NPcHRzW3BhcmFtXSA9IG9wdHNbcGFyYW1dO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGRiLmdldChkb2NJZCwgZG9jT3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gW3tlcnJvcjogZXJyfV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gZm9ybWF0UmVzdWx0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZ290UmVzdWx0KGRvY0lkeCwgZG9jSWQsIHJlc3VsdCk7XG4gICAgICAgIG5leHRCYXRjaCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZXh0QmF0Y2goKTtcblxufVxuXG52YXIgaGFzTG9jYWw7XG5cbnRyeSB7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdfcG91Y2hfY2hlY2tfbG9jYWxzdG9yYWdlJywgMSk7XG4gIGhhc0xvY2FsID0gISFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnX3BvdWNoX2NoZWNrX2xvY2Fsc3RvcmFnZScpO1xufSBjYXRjaCAoZSkge1xuICBoYXNMb2NhbCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFN0b3JhZ2UoKSB7XG4gIHJldHVybiBoYXNMb2NhbDtcbn1cblxuLy8gQ3VzdG9tIG5leHRUaWNrKCkgc2hpbSBmb3IgYnJvd3NlcnMuIEluIG5vZGUsIHRoaXMgd2lsbCBqdXN0IGJlIHByb2Nlc3MubmV4dFRpY2soKS4gV2VcblxuaW5oZXJpdHMoQ2hhbmdlcywgRUUpO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gYXR0YWNoQnJvd3NlckV2ZW50cyhzZWxmKSB7XG4gIGlmIChoYXNMb2NhbFN0b3JhZ2UoKSkge1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBzZWxmLmVtaXQoZS5rZXkpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIENoYW5nZXMoKSB7XG4gIEVFLmNhbGwodGhpcyk7XG4gIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG4gIGF0dGFjaEJyb3dzZXJFdmVudHModGhpcyk7XG59XG5DaGFuZ2VzLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChkYk5hbWUsIGlkLCBkYiwgb3B0cykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHRoaXMuX2xpc3RlbmVyc1tpZF0pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICBmdW5jdGlvbiBldmVudEZ1bmN0aW9uKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghc2VsZi5fbGlzdGVuZXJzW2lkXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5wcm9ncmVzcykge1xuICAgICAgaW5wcm9ncmVzcyA9ICd3YWl0aW5nJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5wcm9ncmVzcyA9IHRydWU7XG4gICAgdmFyIGNoYW5nZXNPcHRzID0gcGljayhvcHRzLCBbXG4gICAgICAnc3R5bGUnLCAnaW5jbHVkZV9kb2NzJywgJ2F0dGFjaG1lbnRzJywgJ2NvbmZsaWN0cycsICdmaWx0ZXInLFxuICAgICAgJ2RvY19pZHMnLCAndmlldycsICdzaW5jZScsICdxdWVyeV9wYXJhbXMnLCAnYmluYXJ5JywgJ3JldHVybl9kb2NzJ1xuICAgIF0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBmdW5jdGlvbiBvbkVycm9yKCkge1xuICAgICAgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRiLmNoYW5nZXMoY2hhbmdlc09wdHMpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoYykge1xuICAgICAgaWYgKGMuc2VxID4gb3B0cy5zaW5jZSAmJiAhb3B0cy5jYW5jZWxsZWQpIHtcbiAgICAgICAgb3B0cy5zaW5jZSA9IGMuc2VxO1xuICAgICAgICBvcHRzLm9uQ2hhbmdlKGMpO1xuICAgICAgfVxuICAgIH0pLm9uKCdjb21wbGV0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpbnByb2dyZXNzID09PSAnd2FpdGluZycpIHtcbiAgICAgICAgaW1tZWRpYXRlKGV2ZW50RnVuY3Rpb24pO1xuICAgICAgfVxuICAgICAgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICAgIH0pLm9uKCdlcnJvcicsIG9uRXJyb3IpO1xuICB9XG4gIHRoaXMuX2xpc3RlbmVyc1tpZF0gPSBldmVudEZ1bmN0aW9uO1xuICB0aGlzLm9uKGRiTmFtZSwgZXZlbnRGdW5jdGlvbik7XG59O1xuXG5DaGFuZ2VzLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChkYk5hbWUsIGlkKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIShpZCBpbiB0aGlzLl9saXN0ZW5lcnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIEVFLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGRiTmFtZSxcbiAgICB0aGlzLl9saXN0ZW5lcnNbaWRdKTtcbiAgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tpZF07XG59O1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5DaGFuZ2VzLnByb3RvdHlwZS5ub3RpZnlMb2NhbFdpbmRvd3MgPSBmdW5jdGlvbiAoZGJOYW1lKSB7XG4gIC8vZG8gYSB1c2VsZXNzIGNoYW5nZSBvbiBhIHN0b3JhZ2UgdGhpbmdcbiAgLy9pbiBvcmRlciB0byBnZXQgb3RoZXIgd2luZG93cydzIGxpc3RlbmVycyB0byBhY3RpdmF0ZVxuICBpZiAoaGFzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICBsb2NhbFN0b3JhZ2VbZGJOYW1lXSA9IChsb2NhbFN0b3JhZ2VbZGJOYW1lXSA9PT0gXCJhXCIpID8gXCJiXCIgOiBcImFcIjtcbiAgfVxufTtcblxuQ2hhbmdlcy5wcm90b3R5cGUubm90aWZ5ID0gZnVuY3Rpb24gKGRiTmFtZSkge1xuICB0aGlzLmVtaXQoZGJOYW1lKTtcbiAgdGhpcy5ub3RpZnlMb2NhbFdpbmRvd3MoZGJOYW1lKTtcbn07XG5cbmZ1bmN0aW9uIGd1YXJkZWRDb25zb2xlKG1ldGhvZCkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgY29uc29sZVttZXRob2RdLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJhbmRvbU51bWJlcihtaW4sIG1heCkge1xuICB2YXIgbWF4VGltZW91dCA9IDYwMDAwMDsgLy8gSGFyZC1jb2RlZCBkZWZhdWx0IG9mIDEwIG1pbnV0ZXNcbiAgbWluID0gcGFyc2VJbnQobWluLCAxMCkgfHwgMDtcbiAgbWF4ID0gcGFyc2VJbnQobWF4LCAxMCk7XG4gIGlmIChtYXggIT09IG1heCB8fCBtYXggPD0gbWluKSB7XG4gICAgbWF4ID0gKG1pbiB8fCAxKSA8PCAxOyAvL2RvdWJsaW5nXG4gIH0gZWxzZSB7XG4gICAgbWF4ID0gbWF4ICsgMTtcbiAgfVxuICAvLyBJbiBvcmRlciB0byBub3QgZXhjZWVkIG1heFRpbWVvdXQsIHBpY2sgYSByYW5kb20gdmFsdWUgYmV0d2VlbiBoYWxmIG9mIG1heFRpbWVvdXQgYW5kIG1heFRpbWVvdXRcbiAgaWYgKG1heCA+IG1heFRpbWVvdXQpIHtcbiAgICBtaW4gPSBtYXhUaW1lb3V0ID4+IDE7IC8vIGRpdmlkZSBieSB0d29cbiAgICBtYXggPSBtYXhUaW1lb3V0O1xuICB9XG4gIHZhciByYXRpbyA9IE1hdGgucmFuZG9tKCk7XG4gIHZhciByYW5nZSA9IG1heCAtIG1pbjtcblxuICByZXR1cm4gfn4ocmFuZ2UgKiByYXRpbyArIG1pbik7IC8vIH5+IGNvZXJjZXMgdG8gYW4gaW50LCBidXQgZmFzdC5cbn1cblxuZnVuY3Rpb24gZGVmYXVsdEJhY2tPZmYobWluKSB7XG4gIHZhciBtYXggPSAwO1xuICBpZiAoIW1pbikge1xuICAgIG1heCA9IDIwMDA7XG4gIH1cbiAgcmV0dXJuIHJhbmRvbU51bWJlcihtaW4sIG1heCk7XG59XG5cbi8vIGRlc2lnbmVkIHRvIGdpdmUgaW5mbyB0byBicm93c2VyIHVzZXJzLCB3aG8gYXJlIGRpc3R1cmJlZFxuLy8gd2hlbiB0aGV5IHNlZSBodHRwIGVycm9ycyBpbiB0aGUgY29uc29sZVxuZnVuY3Rpb24gZXhwbGFpbkVycm9yKHN0YXR1cywgc3RyKSB7XG4gIGd1YXJkZWRDb25zb2xlKCdpbmZvJywgJ1RoZSBhYm92ZSAnICsgc3RhdHVzICsgJyBpcyB0b3RhbGx5IG5vcm1hbC4gJyArIHN0cik7XG59XG5cbnZhciBhc3NpZ247XG57XG4gIGlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG4gIH0gZWxzZSB7XG4gICAgLy8gbGl0ZSBPYmplY3QuYXNzaWduIHBvbHlmaWxsIGJhc2VkIG9uXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuICAgIGFzc2lnbiA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuXG4gICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgbmV4dFNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG5cbiAgICAgICAgaWYgKG5leHRTb3VyY2UgIT0gbnVsbCkgeyAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIG5leHRTb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGJ1Z3Mgd2hlbiBoYXNPd25Qcm9wZXJ0eSBpcyBzaGFkb3dlZFxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXh0U291cmNlLCBuZXh0S2V5KSkge1xuICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdG87XG4gICAgfTtcbiAgfVxufVxuXG52YXIgJGluamVjdF9PYmplY3RfYXNzaWduID0gYXNzaWduO1xuXG5pbmhlcml0cyhQb3VjaEVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIFBvdWNoRXJyb3Ioc3RhdHVzLCBlcnJvciwgcmVhc29uKSB7XG4gIEVycm9yLmNhbGwodGhpcywgcmVhc29uKTtcbiAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIHRoaXMubmFtZSA9IGVycm9yO1xuICB0aGlzLm1lc3NhZ2UgPSByZWFzb247XG4gIHRoaXMuZXJyb3IgPSB0cnVlO1xufVxuXG5Qb3VjaEVycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgcmVhc29uOiB0aGlzLnJlYXNvblxuICB9KTtcbn07XG5cbnZhciBVTkFVVEhPUklaRUQgPSBuZXcgUG91Y2hFcnJvcig0MDEsICd1bmF1dGhvcml6ZWQnLCBcIk5hbWUgb3IgcGFzc3dvcmQgaXMgaW5jb3JyZWN0LlwiKTtcbnZhciBNSVNTSU5HX0JVTEtfRE9DUyA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgXCJNaXNzaW5nIEpTT04gbGlzdCBvZiAnZG9jcydcIik7XG52YXIgTUlTU0lOR19ET0MgPSBuZXcgUG91Y2hFcnJvcig0MDQsICdub3RfZm91bmQnLCAnbWlzc2luZycpO1xudmFyIFJFVl9DT05GTElDVCA9IG5ldyBQb3VjaEVycm9yKDQwOSwgJ2NvbmZsaWN0JywgJ0RvY3VtZW50IHVwZGF0ZSBjb25mbGljdCcpO1xudmFyIElOVkFMSURfSUQgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdfaWQgZmllbGQgbXVzdCBjb250YWluIGEgc3RyaW5nJyk7XG52YXIgTUlTU0lOR19JRCA9IG5ldyBQb3VjaEVycm9yKDQxMiwgJ21pc3NpbmdfaWQnLCAnX2lkIGlzIHJlcXVpcmVkIGZvciBwdXRzJyk7XG52YXIgUkVTRVJWRURfSUQgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdPbmx5IHJlc2VydmVkIGRvY3VtZW50IGlkcyBtYXkgc3RhcnQgd2l0aCB1bmRlcnNjb3JlLicpO1xudmFyIE5PVF9PUEVOID0gbmV3IFBvdWNoRXJyb3IoNDEyLCAncHJlY29uZGl0aW9uX2ZhaWxlZCcsICdEYXRhYmFzZSBub3Qgb3BlbicpO1xudmFyIFVOS05PV05fRVJST1IgPSBuZXcgUG91Y2hFcnJvcig1MDAsICd1bmtub3duX2Vycm9yJywgJ0RhdGFiYXNlIGVuY291bnRlcmVkIGFuIHVua25vd24gZXJyb3InKTtcbnZhciBCQURfQVJHID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnYmFkYXJnJywgJ1NvbWUgcXVlcnkgYXJndW1lbnQgaXMgaW52YWxpZCcpO1xudmFyIElOVkFMSURfUkVRVUVTVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2ludmFsaWRfcmVxdWVzdCcsICdSZXF1ZXN0IHdhcyBpbnZhbGlkJyk7XG52YXIgUVVFUllfUEFSU0VfRVJST1IgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdxdWVyeV9wYXJzZV9lcnJvcicsICdTb21lIHF1ZXJ5IHBhcmFtZXRlciBpcyBpbnZhbGlkJyk7XG52YXIgRE9DX1ZBTElEQVRJT04gPSBuZXcgUG91Y2hFcnJvcig1MDAsICdkb2NfdmFsaWRhdGlvbicsICdCYWQgc3BlY2lhbCBkb2N1bWVudCBtZW1iZXInKTtcbnZhciBCQURfUkVRVUVTVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ1NvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSByZXF1ZXN0Jyk7XG52YXIgTk9UX0FOX09CSkVDVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ0RvY3VtZW50IG11c3QgYmUgYSBKU09OIG9iamVjdCcpO1xudmFyIERCX01JU1NJTkcgPSBuZXcgUG91Y2hFcnJvcig0MDQsICdub3RfZm91bmQnLCAnRGF0YWJhc2Ugbm90IGZvdW5kJyk7XG52YXIgSURCX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnaW5kZXhlZF9kYl93ZW50X2JhZCcsICd1bmtub3duJyk7XG52YXIgV1NRX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnd2ViX3NxbF93ZW50X2JhZCcsICd1bmtub3duJyk7XG52YXIgTERCX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnbGV2ZWxEQl93ZW50X3dlbnRfYmFkJywgJ3Vua25vd24nKTtcbnZhciBGT1JCSURERU4gPSBuZXcgUG91Y2hFcnJvcig0MDMsICdmb3JiaWRkZW4nLCAnRm9yYmlkZGVuIGJ5IGRlc2lnbiBkb2MgdmFsaWRhdGVfZG9jX3VwZGF0ZSBmdW5jdGlvbicpO1xudmFyIElOVkFMSURfUkVWID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAnYmFkX3JlcXVlc3QnLCAnSW52YWxpZCByZXYgZm9ybWF0Jyk7XG52YXIgRklMRV9FWElTVFMgPSBuZXcgUG91Y2hFcnJvcig0MTIsICdmaWxlX2V4aXN0cycsICdUaGUgZGF0YWJhc2UgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLicpO1xudmFyIE1JU1NJTkdfU1RVQiA9IG5ldyBQb3VjaEVycm9yKDQxMiwgJ21pc3Npbmdfc3R1YicsICdBIHByZS1leGlzdGluZyBhdHRhY2htZW50IHN0dWIgd2FzblxcJ3QgZm91bmQnKTtcbnZhciBJTlZBTElEX1VSTCA9IG5ldyBQb3VjaEVycm9yKDQxMywgJ2ludmFsaWRfdXJsJywgJ1Byb3ZpZGVkIFVSTCBpcyBpbnZhbGlkJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yKGVycm9yLCByZWFzb24pIHtcbiAgZnVuY3Rpb24gQ3VzdG9tUG91Y2hFcnJvcihyZWFzb24pIHtcbiAgICAvLyBpbmhlcml0IGVycm9yIHByb3BlcnRpZXMgZnJvbSBvdXIgcGFyZW50IGVycm9yIG1hbnVhbGx5XG4gICAgLy8gc28gYXMgdG8gYWxsb3cgcHJvcGVyIEpTT04gcGFyc2luZy5cbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXJyb3IpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBuYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKHR5cGVvZiBlcnJvcltuYW1lc1tpXV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpc1tuYW1lc1tpXV0gPSBlcnJvcltuYW1lc1tpXV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gICAgfVxuXG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgIH1cbiAgfVxuICBDdXN0b21Qb3VjaEVycm9yLnByb3RvdHlwZSA9IFBvdWNoRXJyb3IucHJvdG90eXBlO1xuICByZXR1cm4gbmV3IEN1c3RvbVBvdWNoRXJyb3IocmVhc29uKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpIHtcblxuICBpZiAodHlwZW9mIGVyciAhPT0gJ29iamVjdCcpIHtcbiAgICB2YXIgZGF0YSA9IGVycjtcbiAgICBlcnIgPSBVTktOT1dOX0VSUk9SO1xuICAgIGVyci5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGlmICgnZXJyb3InIGluIGVyciAmJiBlcnIuZXJyb3IgPT09ICdjb25mbGljdCcpIHtcbiAgICBlcnIubmFtZSA9ICdjb25mbGljdCc7XG4gICAgZXJyLnN0YXR1cyA9IDQwOTtcbiAgfVxuXG4gIGlmICghKCduYW1lJyBpbiBlcnIpKSB7XG4gICAgZXJyLm5hbWUgPSBlcnIuZXJyb3IgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgaWYgKCEoJ3N0YXR1cycgaW4gZXJyKSkge1xuICAgIGVyci5zdGF0dXMgPSA1MDA7XG4gIH1cblxuICBpZiAoISgnbWVzc2FnZScgaW4gZXJyKSkge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UgfHwgZXJyLnJlYXNvbjtcbiAgfVxuXG4gIGlmICghKCdzdGFjaycgaW4gZXJyKSkge1xuICAgIGVyci5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gIH1cblxuICByZXR1cm4gZXJyO1xufVxuXG5mdW5jdGlvbiB0cnlGaWx0ZXIoZmlsdGVyLCBkb2MsIHJlcSkge1xuICB0cnkge1xuICAgIHJldHVybiAhZmlsdGVyKGRvYywgcmVxKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdmFyIG1zZyA9ICdGaWx0ZXIgZnVuY3Rpb24gdGhyZXc6ICcgKyBlcnIudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3IoQkFEX1JFUVVFU1QsIG1zZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsdGVyQ2hhbmdlKG9wdHMpIHtcbiAgdmFyIHJlcSA9IHt9O1xuICB2YXIgaGFzRmlsdGVyID0gb3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nO1xuICByZXEucXVlcnkgPSBvcHRzLnF1ZXJ5X3BhcmFtcztcblxuICByZXR1cm4gZnVuY3Rpb24gZmlsdGVyKGNoYW5nZSkge1xuICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgLy8gQ1NHIHNlbmRzIGV2ZW50cyBvbiB0aGUgY2hhbmdlcyBmZWVkIHRoYXQgZG9uJ3QgaGF2ZSBkb2N1bWVudHMsXG4gICAgICAvLyB0aGlzIGhhY2sgbWFrZXMgYSB3aG9sZSBsb3Qgb2YgZXhpc3RpbmcgY29kZSByb2J1c3QuXG4gICAgICBjaGFuZ2UuZG9jID0ge307XG4gICAgfVxuXG4gICAgdmFyIGZpbHRlclJldHVybiA9IGhhc0ZpbHRlciAmJiB0cnlGaWx0ZXIob3B0cy5maWx0ZXIsIGNoYW5nZS5kb2MsIHJlcSk7XG5cbiAgICBpZiAodHlwZW9mIGZpbHRlclJldHVybiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJSZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlclJldHVybikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghb3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgIGRlbGV0ZSBjaGFuZ2UuZG9jO1xuICAgIH0gZWxzZSBpZiAoIW9wdHMuYXR0YWNobWVudHMpIHtcbiAgICAgIGZvciAodmFyIGF0dCBpbiBjaGFuZ2UuZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoYW5nZS5kb2MuX2F0dGFjaG1lbnRzLCBhdHQpKSB7XG4gICAgICAgICAgY2hhbmdlLmRvYy5fYXR0YWNobWVudHNbYXR0XS5zdHViID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbihhcnJzKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXMgPSByZXMuY29uY2F0KGFycnNbaV0pO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8vIHNoaW0gZm9yIEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lLFxuXG4vLyBEZXRlcm1pbmUgaWQgYW4gSUQgaXMgdmFsaWRcbi8vICAgLSBpbnZhbGlkIElEcyBiZWdpbiB3aXRoIGFuIHVuZGVyZXNjb3JlIHRoYXQgZG9lcyBub3QgYmVnaW4gJ19kZXNpZ24nIG9yXG4vLyAgICAgJ19sb2NhbCdcbi8vICAgLSBhbnkgb3RoZXIgc3RyaW5nIHZhbHVlIGlzIGEgdmFsaWQgaWRcbi8vIFJldHVybnMgdGhlIHNwZWNpZmljIGVycm9yIG9iamVjdCBmb3IgZWFjaCBjYXNlXG5mdW5jdGlvbiBpbnZhbGlkSWRFcnJvcihpZCkge1xuICB2YXIgZXJyO1xuICBpZiAoIWlkKSB7XG4gICAgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19JRCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgIGVyciA9IGNyZWF0ZUVycm9yKElOVkFMSURfSUQpO1xuICB9IGVsc2UgaWYgKC9eXy8udGVzdChpZCkgJiYgISgvXl8oZGVzaWdufGxvY2FsKS8pLnRlc3QoaWQpKSB7XG4gICAgZXJyID0gY3JlYXRlRXJyb3IoUkVTRVJWRURfSUQpO1xuICB9XG4gIGlmIChlcnIpIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLy8gQ2hlY2tzIGlmIGEgUG91Y2hEQiBvYmplY3QgaXMgXCJyZW1vdGVcIiBvciBub3QuIFRoaXMgaXNcblxuZnVuY3Rpb24gaXNSZW1vdGUoZGIpIHtcbiAgaWYgKHR5cGVvZiBkYi5fcmVtb3RlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZGIuX3JlbW90ZTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodHlwZW9mIGRiLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBndWFyZGVkQ29uc29sZSgnd2FybicsXG4gICAgICAnZGIudHlwZSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICtcbiAgICAgICdhIGZ1dHVyZSB2ZXJzaW9uIG9mIFBvdWNoREInKTtcbiAgICByZXR1cm4gZGIudHlwZSgpID09PSAnaHR0cCc7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KGVlLCB0eXBlKSB7XG4gIHJldHVybiAnbGlzdGVuZXJDb3VudCcgaW4gZWUgPyBlZS5saXN0ZW5lckNvdW50KHR5cGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFLmxpc3RlbmVyQ291bnQoZWUsIHR5cGUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBwYXJ0cyA9IHMuc3BsaXQoJy8nKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiBwYXJ0cztcbiAgfVxuICBpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIFtzLCBzXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKHMpIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShzKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPyBub3JtYWxpemVkLmpvaW4oJy8nKSA6IG51bGw7XG59XG5cbi8vIG9yaWdpbmFsbHkgcGFyc2VVcmkgMS4yLjIsIG5vdyBwYXRjaGVkIGJ5IHVzXG4vLyAoYykgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+XG4vLyBNSVQgTGljZW5zZVxudmFyIGtleXMgPSBbXCJzb3VyY2VcIiwgXCJwcm90b2NvbFwiLCBcImF1dGhvcml0eVwiLCBcInVzZXJJbmZvXCIsIFwidXNlclwiLCBcInBhc3N3b3JkXCIsXG4gICAgXCJob3N0XCIsIFwicG9ydFwiLCBcInJlbGF0aXZlXCIsIFwicGF0aFwiLCBcImRpcmVjdG9yeVwiLCBcImZpbGVcIiwgXCJxdWVyeVwiLCBcImFuY2hvclwiXTtcbnZhciBxTmFtZSA9XCJxdWVyeUtleVwiO1xudmFyIHFQYXJzZXIgPSAvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2c7XG5cbi8vIHVzZSB0aGUgXCJsb29zZVwiIHBhcnNlclxuLyogZXNsaW50IG5vLXVzZWxlc3MtZXNjYXBlOiAwICovXG52YXIgcGFyc2VyID0gL14oPzooPyFbXjpAXSs6W146QFxcL10qQCkoW146XFwvPyMuXSspOik/KD86XFwvXFwvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcXC8/I10qKSg/OjooXFxkKikpPykoKChcXC8oPzpbXj8jXSg/IVtePyNcXC9dKlxcLltePyNcXC8uXSsoPzpbPyNdfCQpKSkqXFwvPyk/KFtePyNcXC9dKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvO1xuXG5mdW5jdGlvbiBwYXJzZVVyaShzdHIpIHtcbiAgdmFyIG0gPSBwYXJzZXIuZXhlYyhzdHIpO1xuICB2YXIgdXJpID0ge307XG4gIHZhciBpID0gMTQ7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IG1baV0gfHwgXCJcIjtcbiAgICB2YXIgZW5jb2RlZCA9IFsndXNlcicsICdwYXNzd29yZCddLmluZGV4T2Yoa2V5KSAhPT0gLTE7XG4gICAgdXJpW2tleV0gPSBlbmNvZGVkID8gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSA6IHZhbHVlO1xuICB9XG5cbiAgdXJpW3FOYW1lXSA9IHt9O1xuICB1cmlba2V5c1sxMl1dLnJlcGxhY2UocVBhcnNlciwgZnVuY3Rpb24gKCQwLCAkMSwgJDIpIHtcbiAgICBpZiAoJDEpIHtcbiAgICAgIHVyaVtxTmFtZV1bJDFdID0gJDI7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdXJpO1xufVxuXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vYWxleGRhdmlkL3Njb3BlLWV2YWwgdjAuMC4zXG4vLyAoc291cmNlOiBodHRwczovL3VucGtnLmNvbS9zY29wZS1ldmFsQDAuMC4zL3Njb3BlX2V2YWwuanMpXG4vLyBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgd3JhcHBlciBhcm91bmQgbmV3IEZ1bmN0aW9uKClcblxuZnVuY3Rpb24gc2NvcGVFdmFsKHNvdXJjZSwgc2NvcGUpIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gc2NvcGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjb3BlLCBrZXkpKSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIHZhbHVlcy5wdXNoKHNjb3BlW2tleV0pO1xuICAgIH1cbiAgfVxuICBrZXlzLnB1c2goc291cmNlKTtcbiAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KG51bGwsIGtleXMpLmFwcGx5KG51bGwsIHZhbHVlcyk7XG59XG5cbi8vIHRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIFwidXBkYXRlIHN1Z2FyXCIgZnVuY3Rpb24gZnJvbSBkYWxlaGFydmV5L3BvdWNoZGIjMTM4OFxuLy8gdGhlIGRpZmZGdW4gdGVsbHMgdXMgd2hhdCBkZWx0YSB0byBhcHBseSB0byB0aGUgZG9jLiAgaXQgZWl0aGVyIHJldHVybnNcbi8vIHRoZSBkb2MsIG9yIGZhbHNlIGlmIGl0IGRvZXNuJ3QgbmVlZCB0byBkbyBhbiB1cGRhdGUgYWZ0ZXIgYWxsXG5mdW5jdGlvbiB1cHNlcnQoZGIsIGRvY0lkLCBkaWZmRnVuKSB7XG4gIHJldHVybiBkYi5nZXQoZG9jSWQpXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgIC8vIHRoZSB1c2VyIG1pZ2h0IGNoYW5nZSB0aGUgX3Jldiwgc28gc2F2ZSBpdCBmb3IgcG9zdGVyaXR5XG4gICAgICB2YXIgZG9jUmV2ID0gZG9jLl9yZXY7XG4gICAgICB2YXIgbmV3RG9jID0gZGlmZkZ1bihkb2MpO1xuXG4gICAgICBpZiAoIW5ld0RvYykge1xuICAgICAgICAvLyBpZiB0aGUgZGlmZkZ1biByZXR1cm5zIGZhbHN5LCB3ZSBzaG9ydC1jaXJjdWl0IGFzXG4gICAgICAgIC8vIGFuIG9wdGltaXphdGlvblxuICAgICAgICByZXR1cm4ge3VwZGF0ZWQ6IGZhbHNlLCByZXY6IGRvY1Jldn07XG4gICAgICB9XG5cbiAgICAgIC8vIHVzZXJzIGFyZW4ndCBhbGxvd2VkIHRvIG1vZGlmeSB0aGVzZSB2YWx1ZXMsXG4gICAgICAvLyBzbyByZXNldCB0aGVtIGhlcmVcbiAgICAgIG5ld0RvYy5faWQgPSBkb2NJZDtcbiAgICAgIG5ld0RvYy5fcmV2ID0gZG9jUmV2O1xuICAgICAgcmV0dXJuIHRyeUFuZFB1dChkYiwgbmV3RG9jLCBkaWZmRnVuKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdHJ5QW5kUHV0KGRiLCBkb2MsIGRpZmZGdW4pIHtcbiAgcmV0dXJuIGRiLnB1dChkb2MpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGVkOiB0cnVlLFxuICAgICAgcmV2OiByZXMucmV2XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKGVyci5zdGF0dXMgIT09IDQwOSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gdXBzZXJ0KGRiLCBkb2MuX2lkLCBkaWZmRnVuKTtcbiAgfSk7XG59XG5cbnZhciB0aGlzQXRvYiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGF0b2Ioc3RyKTtcbn07XG5cbnZhciB0aGlzQnRvYSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGJ0b2Eoc3RyKTtcbn07XG5cbi8vIEFic3RyYWN0cyBjb25zdHJ1Y3RpbmcgYSBCbG9iIG9iamVjdCwgc28gaXQgYWxzbyB3b3JrcyBpbiBvbGRlclxuLy8gYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBuYXRpdmUgQmxvYiBjb25zdHJ1Y3RvciAoZS5nLlxuLy8gb2xkIFF0V2ViS2l0IHZlcnNpb25zLCBBbmRyb2lkIDwgNC40KS5cbmZ1bmN0aW9uIGNyZWF0ZUJsb2IocGFydHMsIHByb3BlcnRpZXMpIHtcbiAgLyogZ2xvYmFsIEJsb2JCdWlsZGVyLE1TQmxvYkJ1aWxkZXIsTW96QmxvYkJ1aWxkZXIsV2ViS2l0QmxvYkJ1aWxkZXIgKi9cbiAgcGFydHMgPSBwYXJ0cyB8fCBbXTtcbiAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwge307XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKHBhcnRzLCBwcm9wZXJ0aWVzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLm5hbWUgIT09IFwiVHlwZUVycm9yXCIpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHZhciBCdWlsZGVyID0gdHlwZW9mIEJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IEJsb2JCdWlsZGVyIDpcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBNU0Jsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IE1TQmxvYkJ1aWxkZXIgOlxuICAgICAgICAgICAgICAgICAgdHlwZW9mIE1vekJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IE1vekJsb2JCdWlsZGVyIDpcbiAgICAgICAgICAgICAgICAgIFdlYktpdEJsb2JCdWlsZGVyO1xuICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBidWlsZGVyLmFwcGVuZChwYXJ0c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLmdldEJsb2IocHJvcGVydGllcy50eXBlKTtcbiAgfVxufVxuXG4vLyBGcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQ5Njc2NDcvIChjb250aW51ZXMgb24gbmV4dCBsaW5lKVxuLy8gZW5jb2RlLWRlY29kZS1pbWFnZS13aXRoLWJhc2U2NC1icmVha3MtaW1hZ2UgKDIwMTMtMDQtMjEpXG5mdW5jdGlvbiBiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyKGJpbikge1xuICB2YXIgbGVuZ3RoID0gYmluLmxlbmd0aDtcbiAgdmFyIGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgpO1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IGJpbi5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBidWY7XG59XG5cbmZ1bmN0aW9uIGJpblN0cmluZ1RvQmx1ZmZlcihiaW5TdHJpbmcsIHR5cGUpIHtcbiAgcmV0dXJuIGNyZWF0ZUJsb2IoW2JpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIoYmluU3RyaW5nKV0sIHt0eXBlOiB0eXBlfSk7XG59XG5cbmZ1bmN0aW9uIGI2NFRvQmx1ZmZlcihiNjQsIHR5cGUpIHtcbiAgcmV0dXJuIGJpblN0cmluZ1RvQmx1ZmZlcih0aGlzQXRvYihiNjQpLCB0eXBlKTtcbn1cblxuLy9DYW4ndCBmaW5kIG9yaWdpbmFsIHBvc3QsIGJ1dCB0aGlzIGlzIGNsb3NlXG4vL2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjk2NTEwNy8gKGNvbnRpbnVlcyBvbiBuZXh0IGxpbmUpXG4vL2NvbnZlcnRpbmctYmV0d2Vlbi1zdHJpbmdzLWFuZC1hcnJheWJ1ZmZlcnNcbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcoYnVmZmVyKSB7XG4gIHZhciBiaW5hcnkgPSAnJztcbiAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgdmFyIGxlbmd0aCA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gIH1cbiAgcmV0dXJuIGJpbmFyeTtcbn1cblxuLy8gc2hpbSBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGl0XG5mdW5jdGlvbiByZWFkQXNCaW5hcnlTdHJpbmcoYmxvYiwgY2FsbGJhY2spIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHZhciBoYXNCaW5hcnlTdHJpbmcgPSB0eXBlb2YgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyA9PT0gJ2Z1bmN0aW9uJztcbiAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGUudGFyZ2V0LnJlc3VsdCB8fCAnJztcbiAgICBpZiAoaGFzQmluYXJ5U3RyaW5nKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0KTtcbiAgICB9XG4gICAgY2FsbGJhY2soYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhyZXN1bHQpKTtcbiAgfTtcbiAgaWYgKGhhc0JpbmFyeVN0cmluZykge1xuICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XG4gIH0gZWxzZSB7XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2JUb0JpbmFyeVN0cmluZyhibG9iT3JCdWZmZXIsIGNhbGxiYWNrKSB7XG4gIHJlYWRBc0JpbmFyeVN0cmluZyhibG9iT3JCdWZmZXIsIGZ1bmN0aW9uIChiaW4pIHtcbiAgICBjYWxsYmFjayhiaW4pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYmxvYlRvQmFzZTY0KGJsb2JPckJ1ZmZlciwgY2FsbGJhY2spIHtcbiAgYmxvYlRvQmluYXJ5U3RyaW5nKGJsb2JPckJ1ZmZlciwgZnVuY3Rpb24gKGJhc2U2NCkge1xuICAgIGNhbGxiYWNrKHRoaXNCdG9hKGJhc2U2NCkpO1xuICB9KTtcbn1cblxuLy8gc2ltcGxpZmllZCBBUEkuIHVuaXZlcnNhbCBicm93c2VyIHN1cHBvcnQgaXMgYXNzdW1lZFxuZnVuY3Rpb24gcmVhZEFzQXJyYXlCdWZmZXIoYmxvYiwgY2FsbGJhY2spIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciByZXN1bHQgPSBlLnRhcmdldC5yZXN1bHQgfHwgbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gIH07XG4gIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbn1cblxuLy8gdGhpcyBpcyBub3QgdXNlZCBpbiB0aGUgYnJvd3NlclxuXG52YXIgc2V0SW1tZWRpYXRlU2hpbSA9IHNlbGYuc2V0SW1tZWRpYXRlIHx8IHNlbGYuc2V0VGltZW91dDtcbnZhciBNRDVfQ0hVTktfU0laRSA9IDMyNzY4O1xuXG5mdW5jdGlvbiByYXdUb0Jhc2U2NChyYXcpIHtcbiAgcmV0dXJuIHRoaXNCdG9hKHJhdyk7XG59XG5cbmZ1bmN0aW9uIHNsaWNlQmxvYihibG9iLCBzdGFydCwgZW5kKSB7XG4gIGlmIChibG9iLndlYmtpdFNsaWNlKSB7XG4gICAgcmV0dXJuIGJsb2Iud2Via2l0U2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIGJsb2Iuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEJsb2IoYnVmZmVyLCBibG9iLCBzdGFydCwgZW5kLCBjYWxsYmFjaykge1xuICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IGJsb2Iuc2l6ZSkge1xuICAgIC8vIG9ubHkgc2xpY2UgYmxvYiBpZiB3ZSByZWFsbHkgbmVlZCB0b1xuICAgIGJsb2IgPSBzbGljZUJsb2IoYmxvYiwgc3RhcnQsIGVuZCk7XG4gIH1cbiAgcmVhZEFzQXJyYXlCdWZmZXIoYmxvYiwgZnVuY3Rpb24gKGFycmF5QnVmZmVyKSB7XG4gICAgYnVmZmVyLmFwcGVuZChhcnJheUJ1ZmZlcik7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFN0cmluZyhidWZmZXIsIHN0cmluZywgc3RhcnQsIGVuZCwgY2FsbGJhY2spIHtcbiAgaWYgKHN0YXJ0ID4gMCB8fCBlbmQgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgLy8gb25seSBjcmVhdGUgYSBzdWJzdHJpbmcgaWYgd2UgcmVhbGx5IG5lZWQgdG9cbiAgICBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICB9XG4gIGJ1ZmZlci5hcHBlbmRCaW5hcnkoc3RyaW5nKTtcbiAgY2FsbGJhY2soKTtcbn1cblxuZnVuY3Rpb24gYmluYXJ5TWQ1KGRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBpbnB1dElzU3RyaW5nID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnO1xuICB2YXIgbGVuID0gaW5wdXRJc1N0cmluZyA/IGRhdGEubGVuZ3RoIDogZGF0YS5zaXplO1xuICB2YXIgY2h1bmtTaXplID0gTWF0aC5taW4oTUQ1X0NIVU5LX1NJWkUsIGxlbik7XG4gIHZhciBjaHVua3MgPSBNYXRoLmNlaWwobGVuIC8gY2h1bmtTaXplKTtcbiAgdmFyIGN1cnJlbnRDaHVuayA9IDA7XG4gIHZhciBidWZmZXIgPSBpbnB1dElzU3RyaW5nID8gbmV3IE1kNSgpIDogbmV3IE1kNS5BcnJheUJ1ZmZlcigpO1xuXG4gIHZhciBhcHBlbmQgPSBpbnB1dElzU3RyaW5nID8gYXBwZW5kU3RyaW5nIDogYXBwZW5kQmxvYjtcblxuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHNldEltbWVkaWF0ZVNoaW0obG9hZE5leHRDaHVuayk7XG4gIH1cblxuICBmdW5jdGlvbiBkb25lKCkge1xuICAgIHZhciByYXcgPSBidWZmZXIuZW5kKHRydWUpO1xuICAgIHZhciBiYXNlNjQgPSByYXdUb0Jhc2U2NChyYXcpO1xuICAgIGNhbGxiYWNrKGJhc2U2NCk7XG4gICAgYnVmZmVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWROZXh0Q2h1bmsoKSB7XG4gICAgdmFyIHN0YXJ0ID0gY3VycmVudENodW5rICogY2h1bmtTaXplO1xuICAgIHZhciBlbmQgPSBzdGFydCArIGNodW5rU2l6ZTtcbiAgICBjdXJyZW50Q2h1bmsrKztcbiAgICBpZiAoY3VycmVudENodW5rIDwgY2h1bmtzKSB7XG4gICAgICBhcHBlbmQoYnVmZmVyLCBkYXRhLCBzdGFydCwgZW5kLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kKGJ1ZmZlciwgZGF0YSwgc3RhcnQsIGVuZCwgZG9uZSk7XG4gICAgfVxuICB9XG4gIGxvYWROZXh0Q2h1bmsoKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nTWQ1KHN0cmluZykge1xuICByZXR1cm4gTWQ1Lmhhc2goc3RyaW5nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJldmlzaW9uIHN0cmluZyB0aGF0IGRvZXMgTk9UIGluY2x1ZGUgdGhlIHJldmlzaW9uIGhlaWdodFxuICogRm9yIGV4YW1wbGUgJzU2NjQ5ZjFiMDUwNmM2Y2E5ZmRhMDc0NmViMGNhY2RmJ1xuICovXG5mdW5jdGlvbiByZXYkJDEoZG9jLCBkZXRlcm1pbmlzdGljX3JldnMpIHtcbiAgaWYgKCFkZXRlcm1pbmlzdGljX3JldnMpIHtcbiAgICByZXR1cm4gdjQoKS5yZXBsYWNlKC8tL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgdmFyIG11dGF0ZWFibGVEb2MgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIGRvYyk7XG4gIGRlbGV0ZSBtdXRhdGVhYmxlRG9jLl9yZXZfdHJlZTtcbiAgcmV0dXJuIHN0cmluZ01kNShKU09OLnN0cmluZ2lmeShtdXRhdGVhYmxlRG9jKSk7XG59XG5cbnZhciB1dWlkID0gdjQ7IC8vIG1pbWljIG9sZCBpbXBvcnQsIG9ubHkgdjQgaXMgZXZlciB1c2VkIGVsc2V3aGVyZVxuXG4vLyBXZSBmZXRjaCBhbGwgbGVhZnMgb2YgdGhlIHJldmlzaW9uIHRyZWUsIGFuZCBzb3J0IHRoZW0gYmFzZWQgb24gdHJlZSBsZW5ndGhcbi8vIGFuZCB3aGV0aGVyIHRoZXkgd2VyZSBkZWxldGVkLCB1bmRlbGV0ZWQgZG9jdW1lbnRzIHdpdGggdGhlIGxvbmdlc3QgcmV2aXNpb25cbi8vIHRyZWUgKG1vc3QgZWRpdHMpIHdpblxuLy8gVGhlIGZpbmFsIHNvcnQgYWxnb3JpdGhtIGlzIHNsaWdodGx5IGRvY3VtZW50ZWQgaW4gYSBzaWRlYmFyIGhlcmU6XG4vLyBodHRwOi8vZ3VpZGUuY291Y2hkYi5vcmcvZHJhZnQvY29uZmxpY3RzLmh0bWxcbmZ1bmN0aW9uIHdpbm5pbmdSZXYobWV0YWRhdGEpIHtcbiAgdmFyIHdpbm5pbmdJZDtcbiAgdmFyIHdpbm5pbmdQb3M7XG4gIHZhciB3aW5uaW5nRGVsZXRlZDtcbiAgdmFyIHRvVmlzaXQgPSBtZXRhZGF0YS5yZXZfdHJlZS5zbGljZSgpO1xuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgdHJlZSA9IG5vZGUuaWRzO1xuICAgIHZhciBicmFuY2hlcyA9IHRyZWVbMl07XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zO1xuICAgIGlmIChicmFuY2hlcy5sZW5ndGgpIHsgLy8gbm9uLWxlYWZcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBicmFuY2hlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0b1Zpc2l0LnB1c2goe3BvczogcG9zICsgMSwgaWRzOiBicmFuY2hlc1tpXX0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBkZWxldGVkID0gISF0cmVlWzFdLmRlbGV0ZWQ7XG4gICAgdmFyIGlkID0gdHJlZVswXTtcbiAgICAvLyBzb3J0IGJ5IGRlbGV0ZWQsIHRoZW4gcG9zLCB0aGVuIGlkXG4gICAgaWYgKCF3aW5uaW5nSWQgfHwgKHdpbm5pbmdEZWxldGVkICE9PSBkZWxldGVkID8gd2lubmluZ0RlbGV0ZWQgOlxuICAgICAgICB3aW5uaW5nUG9zICE9PSBwb3MgPyB3aW5uaW5nUG9zIDwgcG9zIDogd2lubmluZ0lkIDwgaWQpKSB7XG4gICAgICB3aW5uaW5nSWQgPSBpZDtcbiAgICAgIHdpbm5pbmdQb3MgPSBwb3M7XG4gICAgICB3aW5uaW5nRGVsZXRlZCA9IGRlbGV0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdpbm5pbmdQb3MgKyAnLScgKyB3aW5uaW5nSWQ7XG59XG5cbi8vIFByZXR0eSBtdWNoIGFsbCBiZWxvdyBjYW4gYmUgY29tYmluZWQgaW50byBhIGhpZ2hlciBvcmRlciBmdW5jdGlvbiB0b1xuLy8gdHJhdmVyc2UgcmV2aXNpb25zXG4vLyBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIGFzIGNvbnRleHQgdG8gYWxsXG4vLyBjaGlsZHJlbiBvZiB0aGF0IG5vZGVcbmZ1bmN0aW9uIHRyYXZlcnNlUmV2VHJlZShyZXZzLCBjYWxsYmFjaykge1xuICB2YXIgdG9WaXNpdCA9IHJldnMuc2xpY2UoKTtcblxuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3M7XG4gICAgdmFyIHRyZWUgPSBub2RlLmlkcztcbiAgICB2YXIgYnJhbmNoZXMgPSB0cmVlWzJdO1xuICAgIHZhciBuZXdDdHggPVxuICAgICAgY2FsbGJhY2soYnJhbmNoZXMubGVuZ3RoID09PSAwLCBwb3MsIHRyZWVbMF0sIG5vZGUuY3R4LCB0cmVlWzFdKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnJhbmNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBwb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldLCBjdHg6IG5ld0N0eH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzb3J0QnlQb3MoYSwgYikge1xuICByZXR1cm4gYS5wb3MgLSBiLnBvcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdExlYXZlcyhyZXZzKSB7XG4gIHZhciBsZWF2ZXMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKHJldnMsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgaWQsIGFjYywgb3B0cykge1xuICAgIGlmIChpc0xlYWYpIHtcbiAgICAgIGxlYXZlcy5wdXNoKHtyZXY6IHBvcyArIFwiLVwiICsgaWQsIHBvczogcG9zLCBvcHRzOiBvcHRzfSk7XG4gICAgfVxuICB9KTtcbiAgbGVhdmVzLnNvcnQoc29ydEJ5UG9zKS5yZXZlcnNlKCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsZWF2ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBkZWxldGUgbGVhdmVzW2ldLnBvcztcbiAgfVxuICByZXR1cm4gbGVhdmVzO1xufVxuXG4vLyByZXR1cm5zIHJldnMgb2YgYWxsIGNvbmZsaWN0cyB0aGF0IGlzIGxlYXZlcyBzdWNoIHRoYXRcbi8vIDEuIGFyZSBub3QgZGVsZXRlZCBhbmRcbi8vIDIuIGFyZSBkaWZmZXJlbnQgdGhhbiB3aW5uaW5nIHJldmlzaW9uXG5mdW5jdGlvbiBjb2xsZWN0Q29uZmxpY3RzKG1ldGFkYXRhKSB7XG4gIHZhciB3aW4gPSB3aW5uaW5nUmV2KG1ldGFkYXRhKTtcbiAgdmFyIGxlYXZlcyA9IGNvbGxlY3RMZWF2ZXMobWV0YWRhdGEucmV2X3RyZWUpO1xuICB2YXIgY29uZmxpY3RzID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsZWF2ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgbGVhZiA9IGxlYXZlc1tpXTtcbiAgICBpZiAobGVhZi5yZXYgIT09IHdpbiAmJiAhbGVhZi5vcHRzLmRlbGV0ZWQpIHtcbiAgICAgIGNvbmZsaWN0cy5wdXNoKGxlYWYucmV2KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuLy8gY29tcGFjdCBhIHRyZWUgYnkgbWFya2luZyBpdHMgbm9uLWxlYWZzIGFzIG1pc3NpbmcsXG4vLyBhbmQgcmV0dXJuIGEgbGlzdCBvZiByZXZzIHRvIGRlbGV0ZVxuZnVuY3Rpb24gY29tcGFjdFRyZWUobWV0YWRhdGEpIHtcbiAgdmFyIHJldnMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKG1ldGFkYXRhLnJldl90cmVlLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldkhhc2gsIGN0eCwgb3B0cykge1xuICAgIGlmIChvcHRzLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScgJiYgIWlzTGVhZikge1xuICAgICAgcmV2cy5wdXNoKHBvcyArICctJyArIHJldkhhc2gpO1xuICAgICAgb3B0cy5zdGF0dXMgPSAnbWlzc2luZyc7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldnM7XG59XG5cbi8vIGJ1aWxkIHVwIGEgbGlzdCBvZiBhbGwgdGhlIHBhdGhzIHRvIHRoZSBsZWFmcyBpbiB0aGlzIHJldmlzaW9uIHRyZWVcbmZ1bmN0aW9uIHJvb3RUb0xlYWYocmV2cykge1xuICB2YXIgcGF0aHMgPSBbXTtcbiAgdmFyIHRvVmlzaXQgPSByZXZzLnNsaWNlKCk7XG4gIHZhciBub2RlO1xuICB3aGlsZSAoKG5vZGUgPSB0b1Zpc2l0LnBvcCgpKSkge1xuICAgIHZhciBwb3MgPSBub2RlLnBvcztcbiAgICB2YXIgdHJlZSA9IG5vZGUuaWRzO1xuICAgIHZhciBpZCA9IHRyZWVbMF07XG4gICAgdmFyIG9wdHMgPSB0cmVlWzFdO1xuICAgIHZhciBicmFuY2hlcyA9IHRyZWVbMl07XG4gICAgdmFyIGlzTGVhZiA9IGJyYW5jaGVzLmxlbmd0aCA9PT0gMDtcblxuICAgIHZhciBoaXN0b3J5ID0gbm9kZS5oaXN0b3J5ID8gbm9kZS5oaXN0b3J5LnNsaWNlKCkgOiBbXTtcbiAgICBoaXN0b3J5LnB1c2goe2lkOiBpZCwgb3B0czogb3B0c30pO1xuICAgIGlmIChpc0xlYWYpIHtcbiAgICAgIHBhdGhzLnB1c2goe3BvczogKHBvcyArIDEgLSBoaXN0b3J5Lmxlbmd0aCksIGlkczogaGlzdG9yeX0pO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnJhbmNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBwb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldLCBoaXN0b3J5OiBoaXN0b3J5fSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXRocy5yZXZlcnNlKCk7XG59XG5cbi8vIGZvciBhIGJldHRlciBvdmVydmlldyBvZiB3aGF0IHRoaXMgaXMgZG9pbmcsIHJlYWQ6XG5cbmZ1bmN0aW9uIHNvcnRCeVBvcyQxKGEsIGIpIHtcbiAgcmV0dXJuIGEucG9zIC0gYi5wb3M7XG59XG5cbi8vIGNsYXNzaWMgYmluYXJ5IHNlYXJjaFxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGFyciwgaXRlbSwgY29tcGFyYXRvcikge1xuICB2YXIgbG93ID0gMDtcbiAgdmFyIGhpZ2ggPSBhcnIubGVuZ3RoO1xuICB2YXIgbWlkO1xuICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMTtcbiAgICBpZiAoY29tcGFyYXRvcihhcnJbbWlkXSwgaXRlbSkgPCAwKSB7XG4gICAgICBsb3cgPSBtaWQgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWdoID0gbWlkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbG93O1xufVxuXG4vLyBhc3N1bWluZyB0aGUgYXJyIGlzIHNvcnRlZCwgaW5zZXJ0IHRoZSBpdGVtIGluIHRoZSBwcm9wZXIgcGxhY2VcbmZ1bmN0aW9uIGluc2VydFNvcnRlZChhcnIsIGl0ZW0sIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGlkeCA9IGJpbmFyeVNlYXJjaChhcnIsIGl0ZW0sIGNvbXBhcmF0b3IpO1xuICBhcnIuc3BsaWNlKGlkeCwgMCwgaXRlbSk7XG59XG5cbi8vIFR1cm4gYSBwYXRoIGFzIGEgZmxhdCBhcnJheSBpbnRvIGEgdHJlZSB3aXRoIGEgc2luZ2xlIGJyYW5jaC5cbi8vIElmIGFueSBzaG91bGQgYmUgc3RlbW1lZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LCB0aGF0J3MgcGFzc2VkXG4vLyBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG5mdW5jdGlvbiBwYXRoVG9UcmVlKHBhdGgsIG51bVN0ZW1tZWQpIHtcbiAgdmFyIHJvb3Q7XG4gIHZhciBsZWFmO1xuICBmb3IgKHZhciBpID0gbnVtU3RlbW1lZCwgbGVuID0gcGF0aC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBub2RlID0gcGF0aFtpXTtcbiAgICB2YXIgY3VycmVudExlYWYgPSBbbm9kZS5pZCwgbm9kZS5vcHRzLCBbXV07XG4gICAgaWYgKGxlYWYpIHtcbiAgICAgIGxlYWZbMl0ucHVzaChjdXJyZW50TGVhZik7XG4gICAgICBsZWFmID0gY3VycmVudExlYWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3QgPSBsZWFmID0gY3VycmVudExlYWY7XG4gICAgfVxuICB9XG4gIHJldHVybiByb290O1xufVxuXG4vLyBjb21wYXJlIHRoZSBJRHMgb2YgdHdvIHRyZWVzXG5mdW5jdGlvbiBjb21wYXJlVHJlZShhLCBiKSB7XG4gIHJldHVybiBhWzBdIDwgYlswXSA/IC0xIDogMTtcbn1cblxuLy8gTWVyZ2UgdHdvIHRyZWVzIHRvZ2V0aGVyXG4vLyBUaGUgcm9vdHMgb2YgdHJlZTEgYW5kIHRyZWUyIG11c3QgYmUgdGhlIHNhbWUgcmV2aXNpb25cbmZ1bmN0aW9uIG1lcmdlVHJlZShpbl90cmVlMSwgaW5fdHJlZTIpIHtcbiAgdmFyIHF1ZXVlID0gW3t0cmVlMTogaW5fdHJlZTEsIHRyZWUyOiBpbl90cmVlMn1dO1xuICB2YXIgY29uZmxpY3RzID0gZmFsc2U7XG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICB2YXIgdHJlZTEgPSBpdGVtLnRyZWUxO1xuICAgIHZhciB0cmVlMiA9IGl0ZW0udHJlZTI7XG5cbiAgICBpZiAodHJlZTFbMV0uc3RhdHVzIHx8IHRyZWUyWzFdLnN0YXR1cykge1xuICAgICAgdHJlZTFbMV0uc3RhdHVzID1cbiAgICAgICAgKHRyZWUxWzFdLnN0YXR1cyA9PT0gICdhdmFpbGFibGUnIHx8XG4gICAgICAgIHRyZWUyWzFdLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScpID8gJ2F2YWlsYWJsZScgOiAnbWlzc2luZyc7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlMlsyXS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0cmVlMVsyXVswXSkge1xuICAgICAgICBjb25mbGljdHMgPSAnbmV3X2xlYWYnO1xuICAgICAgICB0cmVlMVsyXVswXSA9IHRyZWUyWzJdW2ldO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1lcmdlZCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0cmVlMVsyXS5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAodHJlZTFbMl1bal1bMF0gPT09IHRyZWUyWzJdW2ldWzBdKSB7XG4gICAgICAgICAgcXVldWUucHVzaCh7dHJlZTE6IHRyZWUxWzJdW2pdLCB0cmVlMjogdHJlZTJbMl1baV19KTtcbiAgICAgICAgICBtZXJnZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW1lcmdlZCkge1xuICAgICAgICBjb25mbGljdHMgPSAnbmV3X2JyYW5jaCc7XG4gICAgICAgIGluc2VydFNvcnRlZCh0cmVlMVsyXSwgdHJlZTJbMl1baV0sIGNvbXBhcmVUcmVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtjb25mbGljdHM6IGNvbmZsaWN0cywgdHJlZTogaW5fdHJlZTF9O1xufVxuXG5mdW5jdGlvbiBkb01lcmdlKHRyZWUsIHBhdGgsIGRvbnRFeHBhbmQpIHtcbiAgdmFyIHJlc3RyZWUgPSBbXTtcbiAgdmFyIGNvbmZsaWN0cyA9IGZhbHNlO1xuICB2YXIgbWVyZ2VkID0gZmFsc2U7XG4gIHZhciByZXM7XG5cbiAgaWYgKCF0cmVlLmxlbmd0aCkge1xuICAgIHJldHVybiB7dHJlZTogW3BhdGhdLCBjb25mbGljdHM6ICduZXdfbGVhZid9O1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRyZWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgYnJhbmNoID0gdHJlZVtpXTtcbiAgICBpZiAoYnJhbmNoLnBvcyA9PT0gcGF0aC5wb3MgJiYgYnJhbmNoLmlkc1swXSA9PT0gcGF0aC5pZHNbMF0pIHtcbiAgICAgIC8vIFBhdGhzIHN0YXJ0IGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFuZCBoYXZlIHRoZSBzYW1lIHJvb3QsIHNvIHRoZXkgbmVlZFxuICAgICAgLy8gbWVyZ2VkXG4gICAgICByZXMgPSBtZXJnZVRyZWUoYnJhbmNoLmlkcywgcGF0aC5pZHMpO1xuICAgICAgcmVzdHJlZS5wdXNoKHtwb3M6IGJyYW5jaC5wb3MsIGlkczogcmVzLnRyZWV9KTtcbiAgICAgIGNvbmZsaWN0cyA9IGNvbmZsaWN0cyB8fCByZXMuY29uZmxpY3RzO1xuICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRvbnRFeHBhbmQgIT09IHRydWUpIHtcbiAgICAgIC8vIFRoZSBwYXRocyBzdGFydCBhdCBhIGRpZmZlcmVudCBwb3NpdGlvbiwgdGFrZSB0aGUgZWFybGllc3QgcGF0aCBhbmRcbiAgICAgIC8vIHRyYXZlcnNlIHVwIHVudGlsIGl0IGFzIGF0IHRoZSBzYW1lIHBvaW50IGZyb20gcm9vdCBhcyB0aGUgcGF0aCB3ZVxuICAgICAgLy8gd2FudCB0byBtZXJnZS4gIElmIHRoZSBrZXlzIG1hdGNoIHdlIHJldHVybiB0aGUgbG9uZ2VyIHBhdGggd2l0aCB0aGVcbiAgICAgIC8vIG90aGVyIG1lcmdlZCBBZnRlciBzdGVtbWluZyB3ZSBkb250IHdhbnQgdG8gZXhwYW5kIHRoZSB0cmVlc1xuXG4gICAgICB2YXIgdDEgPSBicmFuY2gucG9zIDwgcGF0aC5wb3MgPyBicmFuY2ggOiBwYXRoO1xuICAgICAgdmFyIHQyID0gYnJhbmNoLnBvcyA8IHBhdGgucG9zID8gcGF0aCA6IGJyYW5jaDtcbiAgICAgIHZhciBkaWZmID0gdDIucG9zIC0gdDEucG9zO1xuXG4gICAgICB2YXIgY2FuZGlkYXRlUGFyZW50cyA9IFtdO1xuXG4gICAgICB2YXIgdHJlZXMgPSBbXTtcbiAgICAgIHRyZWVzLnB1c2goe2lkczogdDEuaWRzLCBkaWZmOiBkaWZmLCBwYXJlbnQ6IG51bGwsIHBhcmVudElkeDogbnVsbH0pO1xuICAgICAgd2hpbGUgKHRyZWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0cmVlcy5wb3AoKTtcbiAgICAgICAgaWYgKGl0ZW0uZGlmZiA9PT0gMCkge1xuICAgICAgICAgIGlmIChpdGVtLmlkc1swXSA9PT0gdDIuaWRzWzBdKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVQYXJlbnRzLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbGVtZW50cyA9IGl0ZW0uaWRzWzJdO1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgZWxlbWVudHNMZW4gPSBlbGVtZW50cy5sZW5ndGg7IGogPCBlbGVtZW50c0xlbjsgaisrKSB7XG4gICAgICAgICAgdHJlZXMucHVzaCh7XG4gICAgICAgICAgICBpZHM6IGVsZW1lbnRzW2pdLFxuICAgICAgICAgICAgZGlmZjogaXRlbS5kaWZmIC0gMSxcbiAgICAgICAgICAgIHBhcmVudDogaXRlbS5pZHMsXG4gICAgICAgICAgICBwYXJlbnRJZHg6IGpcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZWwgPSBjYW5kaWRhdGVQYXJlbnRzWzBdO1xuXG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJlc3RyZWUucHVzaChicmFuY2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzID0gbWVyZ2VUcmVlKGVsLmlkcywgdDIuaWRzKTtcbiAgICAgICAgZWwucGFyZW50WzJdW2VsLnBhcmVudElkeF0gPSByZXMudHJlZTtcbiAgICAgICAgcmVzdHJlZS5wdXNoKHtwb3M6IHQxLnBvcywgaWRzOiB0MS5pZHN9KTtcbiAgICAgICAgY29uZmxpY3RzID0gY29uZmxpY3RzIHx8IHJlcy5jb25mbGljdHM7XG4gICAgICAgIG1lcmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RyZWUucHVzaChicmFuY2gpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlIGRpZG50IGZpbmRcbiAgaWYgKCFtZXJnZWQpIHtcbiAgICByZXN0cmVlLnB1c2gocGF0aCk7XG4gIH1cblxuICByZXN0cmVlLnNvcnQoc29ydEJ5UG9zJDEpO1xuXG4gIHJldHVybiB7XG4gICAgdHJlZTogcmVzdHJlZSxcbiAgICBjb25mbGljdHM6IGNvbmZsaWN0cyB8fCAnaW50ZXJuYWxfbm9kZSdcbiAgfTtcbn1cblxuLy8gVG8gZW5zdXJlIHdlIGRvbnQgZ3JvdyB0aGUgcmV2aXNpb24gdHJlZSBpbmZpbml0ZWx5LCB3ZSBzdGVtIG9sZCByZXZpc2lvbnNcbmZ1bmN0aW9uIHN0ZW0odHJlZSwgZGVwdGgpIHtcbiAgLy8gRmlyc3Qgd2UgYnJlYWsgb3V0IHRoZSB0cmVlIGludG8gYSBjb21wbGV0ZSBsaXN0IG9mIHJvb3QgdG8gbGVhZiBwYXRoc1xuICB2YXIgcGF0aHMgPSByb290VG9MZWFmKHRyZWUpO1xuICB2YXIgc3RlbW1lZFJldnM7XG5cbiAgdmFyIHJlc3VsdDtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhdGhzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgLy8gVGhlbiBmb3IgZWFjaCBwYXRoLCB3ZSBjdXQgb2ZmIHRoZSBzdGFydCBvZiB0aGUgcGF0aCBiYXNlZCBvbiB0aGVcbiAgICAvLyBgZGVwdGhgIHRvIHN0ZW0gdG8sIGFuZCBnZW5lcmF0ZSBhIG5ldyBzZXQgb2YgZmxhdCB0cmVlc1xuICAgIHZhciBwYXRoID0gcGF0aHNbaV07XG4gICAgdmFyIHN0ZW1tZWQgPSBwYXRoLmlkcztcbiAgICB2YXIgbm9kZTtcbiAgICBpZiAoc3RlbW1lZC5sZW5ndGggPiBkZXB0aCkge1xuICAgICAgLy8gb25seSBkbyB0aGUgc3RlbW1pbmcgd29yayBpZiB3ZSBhY3R1YWxseSBuZWVkIHRvIHN0ZW1cbiAgICAgIGlmICghc3RlbW1lZFJldnMpIHtcbiAgICAgICAgc3RlbW1lZFJldnMgPSB7fTsgLy8gYXZvaWQgYWxsb2NhdGluZyB0aGlzIG9iamVjdCB1bm5lY2Vzc2FyaWx5XG4gICAgICB9XG4gICAgICB2YXIgbnVtU3RlbW1lZCA9IHN0ZW1tZWQubGVuZ3RoIC0gZGVwdGg7XG4gICAgICBub2RlID0ge1xuICAgICAgICBwb3M6IHBhdGgucG9zICsgbnVtU3RlbW1lZCxcbiAgICAgICAgaWRzOiBwYXRoVG9UcmVlKHN0ZW1tZWQsIG51bVN0ZW1tZWQpXG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBzID0gMDsgcyA8IG51bVN0ZW1tZWQ7IHMrKykge1xuICAgICAgICB2YXIgcmV2ID0gKHBhdGgucG9zICsgcykgKyAnLScgKyBzdGVtbWVkW3NdLmlkO1xuICAgICAgICBzdGVtbWVkUmV2c1tyZXZdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBubyBuZWVkIHRvIGFjdHVhbGx5IHN0ZW1cbiAgICAgIG5vZGUgPSB7XG4gICAgICAgIHBvczogcGF0aC5wb3MsXG4gICAgICAgIGlkczogcGF0aFRvVHJlZShzdGVtbWVkLCAwKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBUaGVuIHdlIHJlbWVyZ2UgYWxsIHRob3NlIGZsYXQgdHJlZXMgdG9nZXRoZXIsIGVuc3VyaW5nIHRoYXQgd2UgZG9udFxuICAgIC8vIGNvbm5lY3QgdHJlZXMgdGhhdCB3b3VsZCBnbyBiZXlvbmQgdGhlIGRlcHRoIGxpbWl0XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmVzdWx0ID0gZG9NZXJnZShyZXN1bHQsIG5vZGUsIHRydWUpLnRyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFtub2RlXTtcbiAgICB9XG4gIH1cblxuICAvLyB0aGlzIGlzIG1lbW9yeS1oZWF2eSBwZXIgQ2hyb21lIHByb2ZpbGVyLCBhdm9pZCB1bmxlc3Mgd2UgYWN0dWFsbHkgc3RlbW1lZFxuICBpZiAoc3RlbW1lZFJldnMpIHtcbiAgICB0cmF2ZXJzZVJldlRyZWUocmVzdWx0LCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsIHJldkhhc2gpIHtcbiAgICAgIC8vIHNvbWUgcmV2aXNpb25zIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBhIGJyYW5jaCBidXQgbm90IGluIGFub3RoZXJcbiAgICAgIGRlbGV0ZSBzdGVtbWVkUmV2c1twb3MgKyAnLScgKyByZXZIYXNoXTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHJlZTogcmVzdWx0LFxuICAgIHJldnM6IHN0ZW1tZWRSZXZzID8gT2JqZWN0LmtleXMoc3RlbW1lZFJldnMpIDogW11cbiAgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2UodHJlZSwgcGF0aCwgZGVwdGgpIHtcbiAgdmFyIG5ld1RyZWUgPSBkb01lcmdlKHRyZWUsIHBhdGgpO1xuICB2YXIgc3RlbW1lZCA9IHN0ZW0obmV3VHJlZS50cmVlLCBkZXB0aCk7XG4gIHJldHVybiB7XG4gICAgdHJlZTogc3RlbW1lZC50cmVlLFxuICAgIHN0ZW1tZWRSZXZzOiBzdGVtbWVkLnJldnMsXG4gICAgY29uZmxpY3RzOiBuZXdUcmVlLmNvbmZsaWN0c1xuICB9O1xufVxuXG4vLyByZXR1cm4gdHJ1ZSBpZiBhIHJldiBleGlzdHMgaW4gdGhlIHJldiB0cmVlLCBmYWxzZSBvdGhlcndpc2VcbmZ1bmN0aW9uIHJldkV4aXN0cyhyZXZzLCByZXYpIHtcbiAgdmFyIHRvVmlzaXQgPSByZXZzLnNsaWNlKCk7XG4gIHZhciBzcGxpdFJldiA9IHJldi5zcGxpdCgnLScpO1xuICB2YXIgdGFyZ2V0UG9zID0gcGFyc2VJbnQoc3BsaXRSZXZbMF0sIDEwKTtcbiAgdmFyIHRhcmdldElkID0gc3BsaXRSZXZbMV07XG5cbiAgdmFyIG5vZGU7XG4gIHdoaWxlICgobm9kZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgaWYgKG5vZGUucG9zID09PSB0YXJnZXRQb3MgJiYgbm9kZS5pZHNbMF0gPT09IHRhcmdldElkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGJyYW5jaGVzID0gbm9kZS5pZHNbMl07XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJyYW5jaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0b1Zpc2l0LnB1c2goe3Bvczogbm9kZS5wb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJlZXMobm9kZSkge1xuICByZXR1cm4gbm9kZS5pZHM7XG59XG5cbi8vIGNoZWNrIGlmIGEgc3BlY2lmaWMgcmV2aXNpb24gb2YgYSBkb2MgaGFzIGJlZW4gZGVsZXRlZFxuLy8gIC0gbWV0YWRhdGE6IHRoZSBtZXRhZGF0YSBvYmplY3QgZnJvbSB0aGUgZG9jIHN0b3JlXG4vLyAgLSByZXY6IChvcHRpb25hbCkgdGhlIHJldmlzaW9uIHRvIGNoZWNrLiBkZWZhdWx0cyB0byB3aW5uaW5nIHJldmlzaW9uXG5mdW5jdGlvbiBpc0RlbGV0ZWQobWV0YWRhdGEsIHJldikge1xuICBpZiAoIXJldikge1xuICAgIHJldiA9IHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuICB9XG4gIHZhciBpZCA9IHJldi5zdWJzdHJpbmcocmV2LmluZGV4T2YoJy0nKSArIDEpO1xuICB2YXIgdG9WaXNpdCA9IG1ldGFkYXRhLnJldl90cmVlLm1hcChnZXRUcmVlcyk7XG5cbiAgdmFyIHRyZWU7XG4gIHdoaWxlICgodHJlZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgaWYgKHRyZWVbMF0gPT09IGlkKSB7XG4gICAgICByZXR1cm4gISF0cmVlWzFdLmRlbGV0ZWQ7XG4gICAgfVxuICAgIHRvVmlzaXQgPSB0b1Zpc2l0LmNvbmNhdCh0cmVlWzJdKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0xvY2FsSWQoaWQpIHtcbiAgcmV0dXJuICgvXl9sb2NhbC8pLnRlc3QoaWQpO1xufVxuXG4vLyByZXR1cm5zIHRoZSBjdXJyZW50IGxlYWYgbm9kZSBmb3IgYSBnaXZlbiByZXZpc2lvblxuZnVuY3Rpb24gbGF0ZXN0KHJldiwgbWV0YWRhdGEpIHtcbiAgdmFyIHRvVmlzaXQgPSBtZXRhZGF0YS5yZXZfdHJlZS5zbGljZSgpO1xuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3M7XG4gICAgdmFyIHRyZWUgPSBub2RlLmlkcztcbiAgICB2YXIgaWQgPSB0cmVlWzBdO1xuICAgIHZhciBvcHRzID0gdHJlZVsxXTtcbiAgICB2YXIgYnJhbmNoZXMgPSB0cmVlWzJdO1xuICAgIHZhciBpc0xlYWYgPSBicmFuY2hlcy5sZW5ndGggPT09IDA7XG5cbiAgICB2YXIgaGlzdG9yeSA9IG5vZGUuaGlzdG9yeSA/IG5vZGUuaGlzdG9yeS5zbGljZSgpIDogW107XG4gICAgaGlzdG9yeS5wdXNoKHtpZDogaWQsIHBvczogcG9zLCBvcHRzOiBvcHRzfSk7XG5cbiAgICBpZiAoaXNMZWFmKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaGlzdG9yeS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgaGlzdG9yeU5vZGUgPSBoaXN0b3J5W2ldO1xuICAgICAgICB2YXIgaGlzdG9yeVJldiA9IGhpc3RvcnlOb2RlLnBvcyArICctJyArIGhpc3RvcnlOb2RlLmlkO1xuXG4gICAgICAgIGlmIChoaXN0b3J5UmV2ID09PSByZXYpIHtcbiAgICAgICAgICAvLyByZXR1cm4gdGhlIHJldiBvZiB0aGlzIGxlYWZcbiAgICAgICAgICByZXR1cm4gcG9zICsgJy0nICsgaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gMCwgbCA9IGJyYW5jaGVzLmxlbmd0aDsgaiA8IGw7IGorKykge1xuICAgICAgdG9WaXNpdC5wdXNoKHtwb3M6IHBvcyArIDEsIGlkczogYnJhbmNoZXNbal0sIGhpc3Rvcnk6IGhpc3Rvcnl9KTtcbiAgICB9XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byByZXNvbHZlIGxhdGVzdCByZXZpc2lvbiBmb3IgaWQgJyArIG1ldGFkYXRhLmlkICsgJywgcmV2ICcgKyByZXYpO1xufVxuXG5pbmhlcml0cyhDaGFuZ2VzJDEsIEVFKTtcblxuZnVuY3Rpb24gdHJ5Q2F0Y2hJbkNoYW5nZUxpc3RlbmVyKHNlbGYsIGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSkge1xuICAvLyBpc29sYXRlIHRyeS9jYXRjaGVzIHRvIGF2b2lkIFY4IGRlb3B0aW1pemF0aW9uc1xuICB0cnkge1xuICAgIHNlbGYuZW1pdCgnY2hhbmdlJywgY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGd1YXJkZWRDb25zb2xlKCdlcnJvcicsICdFcnJvciBpbiAub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24pOicsIGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIENoYW5nZXMkMShkYiwgb3B0cywgY2FsbGJhY2spIHtcbiAgRUUuY2FsbCh0aGlzKTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmRiID0gZGI7XG4gIG9wdHMgPSBvcHRzID8gY2xvbmUob3B0cykgOiB7fTtcbiAgdmFyIGNvbXBsZXRlID0gb3B0cy5jb21wbGV0ZSA9IG9uY2UoZnVuY3Rpb24gKGVyciwgcmVzcCkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGlmIChsaXN0ZW5lckNvdW50KHNlbGYsICdlcnJvcicpID4gMCkge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5lbWl0KCdjb21wbGV0ZScsIHJlc3ApO1xuICAgIH1cbiAgICBzZWxmLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGRiLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB9KTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgc2VsZi5vbignY29tcGxldGUnLCBmdW5jdGlvbiAocmVzcCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcCk7XG4gICAgfSk7XG4gICAgc2VsZi5vbignZXJyb3InLCBjYWxsYmFjayk7XG4gIH1cbiAgZnVuY3Rpb24gb25EZXN0cm95KCkge1xuICAgIHNlbGYuY2FuY2VsKCk7XG4gIH1cbiAgZGIub25jZSgnZGVzdHJveWVkJywgb25EZXN0cm95KTtcblxuICBvcHRzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeUNhdGNoSW5DaGFuZ2VMaXN0ZW5lcihzZWxmLCBjaGFuZ2UsIHBlbmRpbmcsIGxhc3RTZXEpO1xuICB9O1xuXG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgIG9wdHMuY29tcGxldGUgPSBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmdWxmaWxsKHJlcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHNlbGYub25jZSgnY2FuY2VsJywgZnVuY3Rpb24gKCkge1xuICAgIGRiLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICAgIG9wdHMuY29tcGxldGUobnVsbCwge3N0YXR1czogJ2NhbmNlbGxlZCd9KTtcbiAgfSk7XG4gIHRoaXMudGhlbiA9IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpO1xuICB0aGlzWydjYXRjaCddID0gcHJvbWlzZVsnY2F0Y2gnXS5iaW5kKHByb21pc2UpO1xuICB0aGlzLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGNvbXBsZXRlKG51bGwsIHJlc3VsdCk7XG4gIH0sIGNvbXBsZXRlKTtcblxuXG5cbiAgaWYgKCFkYi50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgIGRiLnRhc2txdWV1ZS5hZGRUYXNrKGZ1bmN0aW9uIChmYWlsZWQpIHtcbiAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgb3B0cy5jb21wbGV0ZShmYWlsZWQpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnY2FuY2VsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnZhbGlkYXRlQ2hhbmdlcyhvcHRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZWxmLnZhbGlkYXRlQ2hhbmdlcyhvcHRzKTtcbiAgfVxufVxuQ2hhbmdlcyQxLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICBpZiAodGhpcy5kYi50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgIHRoaXMuZW1pdCgnY2FuY2VsJyk7XG4gIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzQ2hhbmdlKGRvYywgbWV0YWRhdGEsIG9wdHMpIHtcbiAgdmFyIGNoYW5nZUxpc3QgPSBbe3JldjogZG9jLl9yZXZ9XTtcbiAgaWYgKG9wdHMuc3R5bGUgPT09ICdhbGxfZG9jcycpIHtcbiAgICBjaGFuZ2VMaXN0ID0gY29sbGVjdExlYXZlcyhtZXRhZGF0YS5yZXZfdHJlZSlcbiAgICAubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB7cmV2OiB4LnJldn07IH0pO1xuICB9XG4gIHZhciBjaGFuZ2UgPSB7XG4gICAgaWQ6IG1ldGFkYXRhLmlkLFxuICAgIGNoYW5nZXM6IGNoYW5nZUxpc3QsXG4gICAgZG9jOiBkb2NcbiAgfTtcblxuICBpZiAoaXNEZWxldGVkKG1ldGFkYXRhLCBkb2MuX3JldikpIHtcbiAgICBjaGFuZ2UuZGVsZXRlZCA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgY2hhbmdlLmRvYy5fY29uZmxpY3RzID0gY29sbGVjdENvbmZsaWN0cyhtZXRhZGF0YSk7XG4gICAgaWYgKCFjaGFuZ2UuZG9jLl9jb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICBkZWxldGUgY2hhbmdlLmRvYy5fY29uZmxpY3RzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlO1xufVxuXG5DaGFuZ2VzJDEucHJvdG90eXBlLnZhbGlkYXRlQ2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHZhciBjYWxsYmFjayA9IG9wdHMuY29tcGxldGU7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbikge1xuICAgIFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4udmFsaWRhdGUob3B0cywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZG9DaGFuZ2VzKG9wdHMpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNlbGYuZG9DaGFuZ2VzKG9wdHMpO1xuICB9XG59O1xuXG5DaGFuZ2VzJDEucHJvdG90eXBlLmRvQ2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNhbGxiYWNrID0gb3B0cy5jb21wbGV0ZTtcblxuICBvcHRzID0gY2xvbmUob3B0cyk7XG4gIGlmICgnbGl2ZScgaW4gb3B0cyAmJiAhKCdjb250aW51b3VzJyBpbiBvcHRzKSkge1xuICAgIG9wdHMuY29udGludW91cyA9IG9wdHMubGl2ZTtcbiAgfVxuICBvcHRzLnByb2Nlc3NDaGFuZ2UgPSBwcm9jZXNzQ2hhbmdlO1xuXG4gIGlmIChvcHRzLnNpbmNlID09PSAnbGF0ZXN0Jykge1xuICAgIG9wdHMuc2luY2UgPSAnbm93JztcbiAgfVxuICBpZiAoIW9wdHMuc2luY2UpIHtcbiAgICBvcHRzLnNpbmNlID0gMDtcbiAgfVxuICBpZiAob3B0cy5zaW5jZSA9PT0gJ25vdycpIHtcbiAgICB0aGlzLmRiLmluZm8oKS50aGVuKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9wdHMuc2luY2UgPSBpbmZvLnVwZGF0ZV9zZXE7XG4gICAgICBzZWxmLmRvQ2hhbmdlcyhvcHRzKTtcbiAgICB9LCBjYWxsYmFjayk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4pIHtcbiAgICBQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luLm5vcm1hbGl6ZShvcHRzKTtcbiAgICBpZiAoUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbi5zaG91bGRGaWx0ZXIodGhpcywgb3B0cykpIHtcbiAgICAgIHJldHVybiBQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luLmZpbHRlcih0aGlzLCBvcHRzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgWydkb2NfaWRzJywgJ2ZpbHRlcicsICdzZWxlY3RvcicsICd2aWV3J10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoa2V5IGluIG9wdHMpIHtcbiAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ3dhcm4nLFxuICAgICAgICAgICdUaGUgXCInICsga2V5ICsgJ1wiIG9wdGlvbiB3YXMgcGFzc2VkIGluIHRvIGNoYW5nZXMvcmVwbGljYXRlLCAnICtcbiAgICAgICAgICAnYnV0IHBvdWNoZGItY2hhbmdlcy1maWx0ZXIgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQsIHNvIGl0ICcgK1xuICAgICAgICAgICd3YXMgaWdub3JlZC4gUGxlYXNlIGluc3RhbGwgdGhlIHBsdWdpbiB0byBlbmFibGUgZmlsdGVyaW5nLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmICghKCdkZXNjZW5kaW5nJyBpbiBvcHRzKSkge1xuICAgIG9wdHMuZGVzY2VuZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gMCBhbmQgMSBzaG91bGQgcmV0dXJuIDEgZG9jdW1lbnRcbiAgb3B0cy5saW1pdCA9IG9wdHMubGltaXQgPT09IDAgPyAxIDogb3B0cy5saW1pdDtcbiAgb3B0cy5jb21wbGV0ZSA9IGNhbGxiYWNrO1xuICB2YXIgbmV3UHJvbWlzZSA9IHRoaXMuZGIuX2NoYW5nZXMob3B0cyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChuZXdQcm9taXNlICYmIHR5cGVvZiBuZXdQcm9taXNlLmNhbmNlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBjYW5jZWwgPSBzZWxmLmNhbmNlbDtcbiAgICBzZWxmLmNhbmNlbCA9IGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgICAgbmV3UHJvbWlzZS5jYW5jZWwoKTtcbiAgICAgIGNhbmNlbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLypcbiAqIEEgZ2VuZXJpYyBwb3VjaCBhZGFwdGVyXG4gKi9cblxuZnVuY3Rpb24gY29tcGFyZShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbn1cblxuLy8gV3JhcHBlciBmb3IgZnVuY3Rpb25zIHRoYXQgY2FsbCB0aGUgYnVsa2RvY3MgYXBpIHdpdGggYSBzaW5nbGUgZG9jLFxuLy8gaWYgdGhlIGZpcnN0IHJlc3VsdCBpcyBhbiBlcnJvciwgcmV0dXJuIGFuIGVycm9yXG5mdW5jdGlvbiB5YW5rRXJyb3IoY2FsbGJhY2ssIGRvY0lkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7XG4gICAgaWYgKGVyciB8fCAocmVzdWx0c1swXSAmJiByZXN1bHRzWzBdLmVycm9yKSkge1xuICAgICAgZXJyID0gZXJyIHx8IHJlc3VsdHNbMF07XG4gICAgICBlcnIuZG9jSWQgPSBkb2NJZDtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdHMubGVuZ3RoID8gcmVzdWx0c1swXSAgOiByZXN1bHRzKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIGNsZWFuIGRvY3MgZ2l2ZW4gdG8gdXMgYnkgdGhlIHVzZXJcbmZ1bmN0aW9uIGNsZWFuRG9jcyhkb2NzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkb2MgPSBkb2NzW2ldO1xuICAgIGlmIChkb2MuX2RlbGV0ZWQpIHtcbiAgICAgIGRlbGV0ZSBkb2MuX2F0dGFjaG1lbnRzOyAvLyBpZ25vcmUgYXR0cyBmb3IgZGVsZXRlZCBkb2NzXG4gICAgfSBlbHNlIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAvLyBmaWx0ZXIgb3V0IGV4dHJhbmVvdXMga2V5cyBmcm9tIF9hdHRhY2htZW50c1xuICAgICAgdmFyIGF0dHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXR0cy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgYXR0ID0gYXR0c1tqXTtcbiAgICAgICAgZG9jLl9hdHRhY2htZW50c1thdHRdID0gcGljayhkb2MuX2F0dGFjaG1lbnRzW2F0dF0sXG4gICAgICAgICAgWydkYXRhJywgJ2RpZ2VzdCcsICdjb250ZW50X3R5cGUnLCAnbGVuZ3RoJywgJ3JldnBvcycsICdzdHViJ10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBjb21wYXJlIHR3byBkb2NzLCBmaXJzdCBieSBfaWQgdGhlbiBieSBfcmV2XG5mdW5jdGlvbiBjb21wYXJlQnlJZFRoZW5SZXYoYSwgYikge1xuICB2YXIgaWRDb21wYXJlID0gY29tcGFyZShhLl9pZCwgYi5faWQpO1xuICBpZiAoaWRDb21wYXJlICE9PSAwKSB7XG4gICAgcmV0dXJuIGlkQ29tcGFyZTtcbiAgfVxuICB2YXIgYVN0YXJ0ID0gYS5fcmV2aXNpb25zID8gYS5fcmV2aXNpb25zLnN0YXJ0IDogMDtcbiAgdmFyIGJTdGFydCA9IGIuX3JldmlzaW9ucyA/IGIuX3JldmlzaW9ucy5zdGFydCA6IDA7XG4gIHJldHVybiBjb21wYXJlKGFTdGFydCwgYlN0YXJ0KTtcbn1cblxuLy8gZm9yIGV2ZXJ5IG5vZGUgaW4gYSByZXZpc2lvbiB0cmVlIGNvbXB1dGVzIGl0cyBkaXN0YW5jZSBmcm9tIHRoZSBjbG9zZXN0XG4vLyBsZWFmXG5mdW5jdGlvbiBjb21wdXRlSGVpZ2h0KHJldnMpIHtcbiAgdmFyIGhlaWdodCA9IHt9O1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKHJldnMsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgaWQsIHBybnQpIHtcbiAgICB2YXIgcmV2ID0gcG9zICsgXCItXCIgKyBpZDtcbiAgICBpZiAoaXNMZWFmKSB7XG4gICAgICBoZWlnaHRbcmV2XSA9IDA7XG4gICAgfVxuICAgIGlmIChwcm50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVkZ2VzLnB1c2goe2Zyb206IHBybnQsIHRvOiByZXZ9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldjtcbiAgfSk7XG5cbiAgZWRnZXMucmV2ZXJzZSgpO1xuICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgaWYgKGhlaWdodFtlZGdlLmZyb21dID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlaWdodFtlZGdlLmZyb21dID0gMSArIGhlaWdodFtlZGdlLnRvXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVpZ2h0W2VkZ2UuZnJvbV0gPSBNYXRoLm1pbihoZWlnaHRbZWRnZS5mcm9tXSwgMSArIGhlaWdodFtlZGdlLnRvXSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGhlaWdodDtcbn1cblxuZnVuY3Rpb24gYWxsRG9jc0tleXNQYXJzZShvcHRzKSB7XG4gIHZhciBrZXlzID0gICgnbGltaXQnIGluIG9wdHMpID9cbiAgICBvcHRzLmtleXMuc2xpY2Uob3B0cy5za2lwLCBvcHRzLmxpbWl0ICsgb3B0cy5za2lwKSA6XG4gICAgKG9wdHMuc2tpcCA+IDApID8gb3B0cy5rZXlzLnNsaWNlKG9wdHMuc2tpcCkgOiBvcHRzLmtleXM7XG4gIG9wdHMua2V5cyA9IGtleXM7XG4gIG9wdHMuc2tpcCA9IDA7XG4gIGRlbGV0ZSBvcHRzLmxpbWl0O1xuICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAga2V5cy5yZXZlcnNlKCk7XG4gICAgb3B0cy5kZXNjZW5kaW5nID0gZmFsc2U7XG4gIH1cbn1cblxuLy8gYWxsIGNvbXBhY3Rpb24gaXMgZG9uZSBpbiBhIHF1ZXVlLCB0byBhdm9pZCBhdHRhY2hpbmdcbi8vIHRvbyBtYW55IGxpc3RlbmVycyBhdCBvbmNlXG5mdW5jdGlvbiBkb05leHRDb21wYWN0aW9uKHNlbGYpIHtcbiAgdmFyIHRhc2sgPSBzZWxmLl9jb21wYWN0aW9uUXVldWVbMF07XG4gIHZhciBvcHRzID0gdGFzay5vcHRzO1xuICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICBzZWxmLmdldCgnX2xvY2FsL2NvbXBhY3Rpb24nKS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KS50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAoZG9jICYmIGRvYy5sYXN0X3NlcSkge1xuICAgICAgb3B0cy5sYXN0X3NlcSA9IGRvYy5sYXN0X3NlcTtcbiAgICB9XG4gICAgc2VsZi5fY29tcGFjdChvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgIH1cbiAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAoc2VsZi5fY29tcGFjdGlvblF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIGRvTmV4dENvbXBhY3Rpb24oc2VsZik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXR0YWNobWVudE5hbWVFcnJvcihuYW1lKSB7XG4gIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gJ18nKSB7XG4gICAgcmV0dXJuIG5hbWUgKyAnIGlzIG5vdCBhIHZhbGlkIGF0dGFjaG1lbnQgbmFtZSwgYXR0YWNobWVudCAnICtcbiAgICAgICduYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCBcXCdfXFwnJztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmluaGVyaXRzKEFic3RyYWN0UG91Y2hEQiwgRUUpO1xuXG5mdW5jdGlvbiBBYnN0cmFjdFBvdWNoREIoKSB7XG4gIEVFLmNhbGwodGhpcyk7XG5cbiAgLy8gcmUtYmluZCBwcm90b3R5cGVkIG1ldGhvZHNcbiAgZm9yICh2YXIgcCBpbiBBYnN0cmFjdFBvdWNoREIucHJvdG90eXBlKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzW3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW3BdID0gdGhpc1twXS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgfVxufVxuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnBvc3QgPVxuICBhZGFwdGVyRnVuKCdwb3N0JywgZnVuY3Rpb24gKGRvYywgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGRvYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkb2MpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE5PVF9BTl9PQkpFQ1QpKTtcbiAgfVxuICB0aGlzLmJ1bGtEb2NzKHtkb2NzOiBbZG9jXX0sIG9wdHMsIHlhbmtFcnJvcihjYWxsYmFjaywgZG9jLl9pZCkpO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucHV0ID0gYWRhcHRlckZ1bigncHV0JywgZnVuY3Rpb24gKGRvYywgb3B0cywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGRvYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkb2MpKSB7XG4gICAgcmV0dXJuIGNiKGNyZWF0ZUVycm9yKE5PVF9BTl9PQkpFQ1QpKTtcbiAgfVxuICBpbnZhbGlkSWRFcnJvcihkb2MuX2lkKTtcbiAgaWYgKGlzTG9jYWxJZChkb2MuX2lkKSAmJiB0eXBlb2YgdGhpcy5fcHV0TG9jYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZG9jLl9kZWxldGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVtb3ZlTG9jYWwoZG9jLCBjYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wdXRMb2NhbChkb2MsIGNiKTtcbiAgICB9XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAob3B0cy5mb3JjZSAmJiBkb2MuX3Jldikge1xuICAgIHRyYW5zZm9ybUZvcmNlT3B0aW9uVG9OZXdFZGl0c09wdGlvbigpO1xuICAgIHB1dERvYyhmdW5jdGlvbiAoZXJyKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZXJyID8gbnVsbCA6IHtvazogdHJ1ZSwgaWQ6IGRvYy5faWQsIHJldjogZG9jLl9yZXZ9O1xuICAgICAgY2IoZXJyLCByZXN1bHQpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHB1dERvYyhjYik7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1Gb3JjZU9wdGlvblRvTmV3RWRpdHNPcHRpb24oKSB7XG4gICAgdmFyIHBhcnRzID0gZG9jLl9yZXYuc3BsaXQoJy0nKTtcbiAgICB2YXIgb2xkUmV2SWQgPSBwYXJ0c1sxXTtcbiAgICB2YXIgb2xkUmV2TnVtID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcblxuICAgIHZhciBuZXdSZXZOdW0gPSBvbGRSZXZOdW0gKyAxO1xuICAgIHZhciBuZXdSZXZJZCA9IHJldiQkMSgpO1xuXG4gICAgZG9jLl9yZXZpc2lvbnMgPSB7XG4gICAgICBzdGFydDogbmV3UmV2TnVtLFxuICAgICAgaWRzOiBbbmV3UmV2SWQsIG9sZFJldklkXVxuICAgIH07XG4gICAgZG9jLl9yZXYgPSBuZXdSZXZOdW0gKyAnLScgKyBuZXdSZXZJZDtcbiAgICBvcHRzLm5ld19lZGl0cyA9IGZhbHNlO1xuICB9XG4gIGZ1bmN0aW9uIHB1dERvYyhuZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBzZWxmLl9wdXQgPT09ICdmdW5jdGlvbicgJiYgb3B0cy5uZXdfZWRpdHMgIT09IGZhbHNlKSB7XG4gICAgICBzZWxmLl9wdXQoZG9jLCBvcHRzLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5idWxrRG9jcyh7ZG9jczogW2RvY119LCBvcHRzLCB5YW5rRXJyb3IobmV4dCwgZG9jLl9pZCkpO1xuICAgIH1cbiAgfVxufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucHV0QXR0YWNobWVudCA9XG4gIGFkYXB0ZXJGdW4oJ3B1dEF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCwgcmV2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2IsIHR5cGUpIHtcbiAgdmFyIGFwaSA9IHRoaXM7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHR5cGUgPSBibG9iO1xuICAgIGJsb2IgPSByZXY7XG4gICAgcmV2ID0gbnVsbDtcbiAgfVxuICAvLyBMZXRzIGZpeCBpbiBodHRwczovL2dpdGh1Yi5jb20vcG91Y2hkYi9wb3VjaGRiL2lzc3Vlcy8zMjY3XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHlwZSA9IGJsb2I7XG4gICAgYmxvYiA9IHJldjtcbiAgICByZXYgPSBudWxsO1xuICB9XG4gIGlmICghdHlwZSkge1xuICAgIGd1YXJkZWRDb25zb2xlKCd3YXJuJywgJ0F0dGFjaG1lbnQnLCBhdHRhY2htZW50SWQsICdvbiBkb2N1bWVudCcsIGRvY0lkLCAnaXMgbWlzc2luZyBjb250ZW50X3R5cGUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUF0dGFjaG1lbnQoZG9jKSB7XG4gICAgdmFyIHByZXZyZXZwb3MgPSAnX3JldicgaW4gZG9jID8gcGFyc2VJbnQoZG9jLl9yZXYsIDEwKSA6IDA7XG4gICAgZG9jLl9hdHRhY2htZW50cyA9IGRvYy5fYXR0YWNobWVudHMgfHwge307XG4gICAgZG9jLl9hdHRhY2htZW50c1thdHRhY2htZW50SWRdID0ge1xuICAgICAgY29udGVudF90eXBlOiB0eXBlLFxuICAgICAgZGF0YTogYmxvYixcbiAgICAgIHJldnBvczogKytwcmV2cmV2cG9zXG4gICAgfTtcbiAgICByZXR1cm4gYXBpLnB1dChkb2MpO1xuICB9XG5cbiAgcmV0dXJuIGFwaS5nZXQoZG9jSWQpLnRoZW4oZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChkb2MuX3JldiAhPT0gcmV2KSB7XG4gICAgICB0aHJvdyBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVBdHRhY2htZW50KGRvYyk7XG4gIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgLy8gY3JlYXRlIG5ldyBkb2NcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChlcnIucmVhc29uID09PSBNSVNTSU5HX0RPQy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQXR0YWNobWVudCh7X2lkOiBkb2NJZH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnJlbW92ZUF0dGFjaG1lbnQgPVxuICBhZGFwdGVyRnVuKCdyZW1vdmVBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsIHJldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZ2V0KGRvY0lkLCBmdW5jdGlvbiAoZXJyLCBvYmopIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob2JqLl9yZXYgIT09IHJldikge1xuICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoUkVWX0NPTkZMSUNUKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghb2JqLl9hdHRhY2htZW50cykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGRlbGV0ZSBvYmouX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnRJZF07XG4gICAgaWYgKE9iamVjdC5rZXlzKG9iai5fYXR0YWNobWVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIG9iai5fYXR0YWNobWVudHM7XG4gICAgfVxuICAgIHNlbGYucHV0KG9iaiwgY2FsbGJhY2spO1xuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnJlbW92ZSA9XG4gIGFkYXB0ZXJGdW4oJ3JlbW92ZScsIGZ1bmN0aW9uIChkb2NPcklkLCBvcHRzT3JSZXYsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBkb2M7XG4gIGlmICh0eXBlb2Ygb3B0c09yUmV2ID09PSAnc3RyaW5nJykge1xuICAgIC8vIGlkLCByZXYsIG9wdHMsIGNhbGxiYWNrIHN0eWxlXG4gICAgZG9jID0ge1xuICAgICAgX2lkOiBkb2NPcklkLFxuICAgICAgX3Jldjogb3B0c09yUmV2XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gZG9jLCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgIGRvYyA9IGRvY09ySWQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzT3JSZXYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0c09yUmV2O1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0gb3B0c09yUmV2O1xuICAgIH1cbiAgfVxuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgb3B0cy53YXNfZGVsZXRlID0gdHJ1ZTtcbiAgdmFyIG5ld0RvYyA9IHtfaWQ6IGRvYy5faWQsIF9yZXY6IChkb2MuX3JldiB8fCBvcHRzLnJldil9O1xuICBuZXdEb2MuX2RlbGV0ZWQgPSB0cnVlO1xuICBpZiAoaXNMb2NhbElkKG5ld0RvYy5faWQpICYmIHR5cGVvZiB0aGlzLl9yZW1vdmVMb2NhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0aGlzLl9yZW1vdmVMb2NhbChkb2MsIGNhbGxiYWNrKTtcbiAgfVxuICB0aGlzLmJ1bGtEb2NzKHtkb2NzOiBbbmV3RG9jXX0sIG9wdHMsIHlhbmtFcnJvcihjYWxsYmFjaywgbmV3RG9jLl9pZCkpO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucmV2c0RpZmYgPVxuICBhZGFwdGVyRnVuKCdyZXZzRGlmZicsIGZ1bmN0aW9uIChyZXEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKHJlcSk7XG5cbiAgaWYgKCFpZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHt9KTtcbiAgfVxuXG4gIHZhciBjb3VudCA9IDA7XG4gIHZhciBtaXNzaW5nID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbiAgZnVuY3Rpb24gYWRkVG9NaXNzaW5nKGlkLCByZXZJZCkge1xuICAgIGlmICghbWlzc2luZy5oYXMoaWQpKSB7XG4gICAgICBtaXNzaW5nLnNldChpZCwge21pc3Npbmc6IFtdfSk7XG4gICAgfVxuICAgIG1pc3NpbmcuZ2V0KGlkKS5taXNzaW5nLnB1c2gocmV2SWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0RvYyhpZCwgcmV2X3RyZWUpIHtcbiAgICAvLyBJcyB0aGlzIGZhc3QgZW5vdWdoPyBNYXliZSB3ZSBzaG91bGQgc3dpdGNoIHRvIGEgc2V0IHNpbXVsYXRlZCBieSBhIG1hcFxuICAgIHZhciBtaXNzaW5nRm9ySWQgPSByZXFbaWRdLnNsaWNlKDApO1xuICAgIHRyYXZlcnNlUmV2VHJlZShyZXZfdHJlZSwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCByZXZIYXNoLCBjdHgsXG4gICAgICBvcHRzKSB7XG4gICAgICAgIHZhciByZXYgPSBwb3MgKyAnLScgKyByZXZIYXNoO1xuICAgICAgICB2YXIgaWR4ID0gbWlzc2luZ0ZvcklkLmluZGV4T2YocmV2KTtcbiAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtaXNzaW5nRm9ySWQuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAob3B0cy5zdGF0dXMgIT09ICdhdmFpbGFibGUnKSB7XG4gICAgICAgICAgYWRkVG9NaXNzaW5nKGlkLCByZXYpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIFRyYXZlcnNpbmcgdGhlIHRyZWUgaXMgc3luY2hyb25vdXMsIHNvIG5vdyBgbWlzc2luZ0ZvcklkYCBjb250YWluc1xuICAgIC8vIHJldmlzaW9ucyB0aGF0IHdlcmUgbm90IGZvdW5kIGluIHRoZSB0cmVlXG4gICAgbWlzc2luZ0ZvcklkLmZvckVhY2goZnVuY3Rpb24gKHJldikge1xuICAgICAgYWRkVG9NaXNzaW5nKGlkLCByZXYpO1xuICAgIH0pO1xuICB9XG5cbiAgaWRzLm1hcChmdW5jdGlvbiAoaWQpIHtcbiAgICB0aGlzLl9nZXRSZXZpc2lvblRyZWUoaWQsIGZ1bmN0aW9uIChlcnIsIHJldl90cmVlKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgPT09IDQwNCAmJiBlcnIubWVzc2FnZSA9PT0gJ21pc3NpbmcnKSB7XG4gICAgICAgIG1pc3Npbmcuc2V0KGlkLCB7bWlzc2luZzogcmVxW2lkXX0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzRG9jKGlkLCByZXZfdHJlZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICgrK2NvdW50ID09PSBpZHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgTGF6eU1hcCB0byBvYmplY3RcbiAgICAgICAgdmFyIG1pc3NpbmdPYmogPSB7fTtcbiAgICAgICAgbWlzc2luZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgbWlzc2luZ09ialtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbWlzc2luZ09iaik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIHRoaXMpO1xufSk7XG5cbi8vIF9idWxrX2dldCBBUEkgZm9yIGZhc3RlciByZXBsaWNhdGlvbiwgYXMgZGVzY3JpYmVkIGluXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvdWNoZGItY2h0dHBkL3B1bGwvMzNcbi8vIEF0IHRoZSBcImFic3RyYWN0XCIgbGV2ZWwsIGl0IHdpbGwganVzdCBydW4gbXVsdGlwbGUgZ2V0KClzIGluXG4vLyBwYXJhbGxlbCwgYmVjYXVzZSB0aGlzIGlzbid0IG11Y2ggb2YgYSBwZXJmb3JtYW5jZSBjb3N0XG4vLyBmb3IgbG9jYWwgZGF0YWJhc2VzIChleGNlcHQgdGhlIGNvc3Qgb2YgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLCB3aGljaCBpc1xuLy8gc21hbGwpLiBUaGUgaHR0cCBhZGFwdGVyIG92ZXJyaWRlcyB0aGlzIGluIG9yZGVyXG4vLyB0byBkbyBhIG1vcmUgZWZmaWNpZW50IHNpbmdsZSBIVFRQIHJlcXVlc3QuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmJ1bGtHZXQgPVxuICBhZGFwdGVyRnVuKCdidWxrR2V0JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGJ1bGtHZXQodGhpcywgb3B0cywgY2FsbGJhY2spO1xufSk7XG5cbi8vIGNvbXBhY3Qgb25lIGRvY3VtZW50IGFuZCBmaXJlIGNhbGxiYWNrXG4vLyBieSBjb21wYWN0aW5nIHdlIG1lYW4gcmVtb3ZpbmcgYWxsIHJldmlzaW9ucyB3aGljaFxuLy8gYXJlIGZ1cnRoZXIgZnJvbSB0aGUgbGVhZiBpbiByZXZpc2lvbiB0cmVlIHRoYW4gbWF4X2hlaWdodFxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jb21wYWN0RG9jdW1lbnQgPVxuICBhZGFwdGVyRnVuKCdjb21wYWN0RG9jdW1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIG1heEhlaWdodCwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9nZXRSZXZpc2lvblRyZWUoZG9jSWQsIGZ1bmN0aW9uIChlcnIsIHJldlRyZWUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgdmFyIGhlaWdodCA9IGNvbXB1dGVIZWlnaHQocmV2VHJlZSk7XG4gICAgdmFyIGNhbmRpZGF0ZXMgPSBbXTtcbiAgICB2YXIgcmV2cyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKGhlaWdodCkuZm9yRWFjaChmdW5jdGlvbiAocmV2KSB7XG4gICAgICBpZiAoaGVpZ2h0W3Jldl0gPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHJldik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cmF2ZXJzZVJldlRyZWUocmV2VHJlZSwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCByZXZIYXNoLCBjdHgsIG9wdHMpIHtcbiAgICAgIHZhciByZXYgPSBwb3MgKyAnLScgKyByZXZIYXNoO1xuICAgICAgaWYgKG9wdHMuc3RhdHVzID09PSAnYXZhaWxhYmxlJyAmJiBjYW5kaWRhdGVzLmluZGV4T2YocmV2KSAhPT0gLTEpIHtcbiAgICAgICAgcmV2cy5wdXNoKHJldik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2VsZi5fZG9Db21wYWN0aW9uKGRvY0lkLCByZXZzLCBjYWxsYmFjayk7XG4gIH0pO1xufSk7XG5cbi8vIGNvbXBhY3QgdGhlIHdob2xlIGRhdGFiYXNlIHVzaW5nIHNpbmdsZSBkb2N1bWVudFxuLy8gY29tcGFjdGlvblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jb21wYWN0ID1cbiAgYWRhcHRlckZ1bignY29tcGFjdCcsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICBzZWxmLl9jb21wYWN0aW9uUXVldWUgPSBzZWxmLl9jb21wYWN0aW9uUXVldWUgfHwgW107XG4gIHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5wdXNoKHtvcHRzOiBvcHRzLCBjYWxsYmFjazogY2FsbGJhY2t9KTtcbiAgaWYgKHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICBkb05leHRDb21wYWN0aW9uKHNlbGYpO1xuICB9XG59KTtcbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuX2NvbXBhY3QgPSBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2hhbmdlc09wdHMgPSB7XG4gICAgcmV0dXJuX2RvY3M6IGZhbHNlLFxuICAgIGxhc3Rfc2VxOiBvcHRzLmxhc3Rfc2VxIHx8IDBcbiAgfTtcbiAgdmFyIHByb21pc2VzID0gW107XG5cbiAgZnVuY3Rpb24gb25DaGFuZ2Uocm93KSB7XG4gICAgcHJvbWlzZXMucHVzaChzZWxmLmNvbXBhY3REb2N1bWVudChyb3cuaWQsIDApKTtcbiAgfVxuICBmdW5jdGlvbiBvbkNvbXBsZXRlKHJlc3ApIHtcbiAgICB2YXIgbGFzdFNlcSA9IHJlc3AubGFzdF9zZXE7XG4gICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHVwc2VydChzZWxmLCAnX2xvY2FsL2NvbXBhY3Rpb24nLCBmdW5jdGlvbiBkZWx0YUZ1bmMoZG9jKSB7XG4gICAgICAgIGlmICghZG9jLmxhc3Rfc2VxIHx8IGRvYy5sYXN0X3NlcSA8IGxhc3RTZXEpIHtcbiAgICAgICAgICBkb2MubGFzdF9zZXEgPSBsYXN0U2VxO1xuICAgICAgICAgIHJldHVybiBkb2M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzb21lYm9keSBlbHNlIGdvdCBoZXJlIGZpcnN0LCBkb24ndCB1cGRhdGVcbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwge29rOiB0cnVlfSk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9XG4gIHNlbGYuY2hhbmdlcyhjaGFuZ2VzT3B0cylcbiAgICAub24oJ2NoYW5nZScsIG9uQ2hhbmdlKVxuICAgIC5vbignY29tcGxldGUnLCBvbkNvbXBsZXRlKVxuICAgIC5vbignZXJyb3InLCBjYWxsYmFjayk7XG59O1xuXG4vKiBCZWdpbiBhcGkgd3JhcHBlcnMuIFNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gc3RvcmFnZSBiZWxvbmdzIGluIHRoZVxuICAgX1ttZXRob2RdICovXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmdldCA9IGFkYXB0ZXJGdW4oJ2dldCcsIGZ1bmN0aW9uIChpZCwgb3B0cywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBjYihjcmVhdGVFcnJvcihJTlZBTElEX0lEKSk7XG4gIH1cbiAgaWYgKGlzTG9jYWxJZChpZCkgJiYgdHlwZW9mIHRoaXMuX2dldExvY2FsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldExvY2FsKGlkLCBjYik7XG4gIH1cbiAgdmFyIGxlYXZlcyA9IFtdLCBzZWxmID0gdGhpcztcblxuICBmdW5jdGlvbiBmaW5pc2hPcGVuUmV2cygpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGNvdW50ID0gbGVhdmVzLmxlbmd0aDtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNvdW50KSB7XG4gICAgICByZXR1cm4gY2IobnVsbCwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvLyBvcmRlciB3aXRoIG9wZW5fcmV2cyBpcyB1bnNwZWNpZmllZFxuICAgIGxlYXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChsZWFmKSB7XG4gICAgICBzZWxmLmdldChpZCwge1xuICAgICAgICByZXY6IGxlYWYsXG4gICAgICAgIHJldnM6IG9wdHMucmV2cyxcbiAgICAgICAgbGF0ZXN0OiBvcHRzLmxhdGVzdCxcbiAgICAgICAgYXR0YWNobWVudHM6IG9wdHMuYXR0YWNobWVudHMsXG4gICAgICAgIGJpbmFyeTogb3B0cy5iaW5hcnlcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRvYykge1xuICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgIC8vIHVzaW5nIGxhdGVzdD10cnVlIGNhbiBwcm9kdWNlIGR1cGxpY2F0ZXNcbiAgICAgICAgICB2YXIgZXhpc3Rpbmc7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXN1bHQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0W2ldLm9rICYmIHJlc3VsdFtpXS5vay5fcmV2ID09PSBkb2MuX3Jldikge1xuICAgICAgICAgICAgICBleGlzdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh7b2s6IGRvY30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh7bWlzc2luZzogbGVhZn0pO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIGlmICghY291bnQpIHtcbiAgICAgICAgICBjYihudWxsLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChvcHRzLm9wZW5fcmV2cykge1xuICAgIGlmIChvcHRzLm9wZW5fcmV2cyA9PT0gXCJhbGxcIikge1xuICAgICAgdGhpcy5fZ2V0UmV2aXNpb25UcmVlKGlkLCBmdW5jdGlvbiAoZXJyLCByZXZfdHJlZSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGxlYXZlcyA9IGNvbGxlY3RMZWF2ZXMocmV2X3RyZWUpLm1hcChmdW5jdGlvbiAobGVhZikge1xuICAgICAgICAgIHJldHVybiBsZWFmLnJldjtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbmlzaE9wZW5SZXZzKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cy5vcGVuX3JldnMpKSB7XG4gICAgICAgIGxlYXZlcyA9IG9wdHMub3Blbl9yZXZzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlYXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBsID0gbGVhdmVzW2ldO1xuICAgICAgICAgIC8vIGxvb2tzIGxpa2UgaXQncyB0aGUgb25seSB0aGluZyBjb3VjaGRiIGNoZWNrc1xuICAgICAgICAgIGlmICghKHR5cGVvZiAobCkgPT09IFwic3RyaW5nXCIgJiYgL15cXGQrLS8udGVzdChsKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihjcmVhdGVFcnJvcihJTlZBTElEX1JFVikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5pc2hPcGVuUmV2cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNiKGNyZWF0ZUVycm9yKFVOS05PV05fRVJST1IsICdmdW5jdGlvbl9jbGF1c2UnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjsgLy8gb3Blbl9yZXZzIGRvZXMgbm90IGxpa2Ugb3RoZXIgb3B0aW9uc1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2dldChpZCwgb3B0cywgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgaWYgKGVycikge1xuICAgICAgZXJyLmRvY0lkID0gaWQ7XG4gICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICB9XG5cbiAgICB2YXIgZG9jID0gcmVzdWx0LmRvYztcbiAgICB2YXIgbWV0YWRhdGEgPSByZXN1bHQubWV0YWRhdGE7XG4gICAgdmFyIGN0eCA9IHJlc3VsdC5jdHg7XG5cbiAgICBpZiAob3B0cy5jb25mbGljdHMpIHtcbiAgICAgIHZhciBjb25mbGljdHMgPSBjb2xsZWN0Q29uZmxpY3RzKG1ldGFkYXRhKTtcbiAgICAgIGlmIChjb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICAgIGRvYy5fY29uZmxpY3RzID0gY29uZmxpY3RzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0RlbGV0ZWQobWV0YWRhdGEsIGRvYy5fcmV2KSkge1xuICAgICAgZG9jLl9kZWxldGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yZXZzIHx8IG9wdHMucmV2c19pbmZvKSB7XG4gICAgICB2YXIgc3BsaXR0ZWRSZXYgPSBkb2MuX3Jldi5zcGxpdCgnLScpO1xuICAgICAgdmFyIHJldk5vICAgICAgID0gcGFyc2VJbnQoc3BsaXR0ZWRSZXZbMF0sIDEwKTtcbiAgICAgIHZhciByZXZIYXNoICAgICA9IHNwbGl0dGVkUmV2WzFdO1xuXG4gICAgICB2YXIgcGF0aHMgPSByb290VG9MZWFmKG1ldGFkYXRhLnJldl90cmVlKTtcbiAgICAgIHZhciBwYXRoID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudFBhdGggPSBwYXRoc1tpXTtcbiAgICAgICAgdmFyIGhhc2hJbmRleCA9IGN1cnJlbnRQYXRoLmlkcy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguaWQ7IH0pXG4gICAgICAgICAgLmluZGV4T2YocmV2SGFzaCk7XG4gICAgICAgIHZhciBoYXNoRm91bmRBdFJldlBvcyA9IGhhc2hJbmRleCA9PT0gKHJldk5vIC0gMSk7XG5cbiAgICAgICAgaWYgKGhhc2hGb3VuZEF0UmV2UG9zIHx8ICghcGF0aCAmJiBoYXNoSW5kZXggIT09IC0xKSkge1xuICAgICAgICAgIHBhdGggPSBjdXJyZW50UGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICBlcnIgPSBuZXcgRXJyb3IoJ2ludmFsaWQgcmV2IHRyZWUnKTtcbiAgICAgICAgZXJyLmRvY0lkID0gaWQ7XG4gICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXhPZlJldiA9IHBhdGguaWRzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5pZDsgfSlcbiAgICAgICAgLmluZGV4T2YoZG9jLl9yZXYuc3BsaXQoJy0nKVsxXSkgKyAxO1xuICAgICAgdmFyIGhvd01hbnkgPSBwYXRoLmlkcy5sZW5ndGggLSBpbmRleE9mUmV2O1xuICAgICAgcGF0aC5pZHMuc3BsaWNlKGluZGV4T2ZSZXYsIGhvd01hbnkpO1xuICAgICAgcGF0aC5pZHMucmV2ZXJzZSgpO1xuXG4gICAgICBpZiAob3B0cy5yZXZzKSB7XG4gICAgICAgIGRvYy5fcmV2aXNpb25zID0ge1xuICAgICAgICAgIHN0YXJ0OiAocGF0aC5wb3MgKyBwYXRoLmlkcy5sZW5ndGgpIC0gMSxcbiAgICAgICAgICBpZHM6IHBhdGguaWRzLm1hcChmdW5jdGlvbiAocmV2KSB7XG4gICAgICAgICAgICByZXR1cm4gcmV2LmlkO1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5yZXZzX2luZm8pIHtcbiAgICAgICAgdmFyIHBvcyA9ICBwYXRoLnBvcyArIHBhdGguaWRzLmxlbmd0aDtcbiAgICAgICAgZG9jLl9yZXZzX2luZm8gPSBwYXRoLmlkcy5tYXAoZnVuY3Rpb24gKHJldikge1xuICAgICAgICAgIHBvcy0tO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXY6IHBvcyArICctJyArIHJldi5pZCxcbiAgICAgICAgICAgIHN0YXR1czogcmV2Lm9wdHMuc3RhdHVzXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMgJiYgZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgdmFyIGF0dGFjaG1lbnRzID0gZG9jLl9hdHRhY2htZW50cztcbiAgICAgIHZhciBjb3VudCA9IE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGg7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIGRvYyk7XG4gICAgICB9XG4gICAgICBPYmplY3Qua2V5cyhhdHRhY2htZW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHRoaXMuX2dldEF0dGFjaG1lbnQoZG9jLl9pZCwga2V5LCBhdHRhY2htZW50c1trZXldLCB7XG4gICAgICAgICAgLy8gUHJldmlvdXNseSB0aGUgcmV2aXNpb24gaGFuZGxpbmcgd2FzIGRvbmUgaW4gYWRhcHRlci5qc1xuICAgICAgICAgIC8vIGdldEF0dGFjaG1lbnQsIGhvd2V2ZXIgc2luY2UgaWRiLW5leHQgZG9lc250IHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBwYXNzIHRoZSByZXYgdGhyb3VnaFxuICAgICAgICAgIHJldjogZG9jLl9yZXYsXG4gICAgICAgICAgYmluYXJ5OiBvcHRzLmJpbmFyeSxcbiAgICAgICAgICBjdHg6IGN0eFxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgdmFyIGF0dCA9IGRvYy5fYXR0YWNobWVudHNba2V5XTtcbiAgICAgICAgICBhdHQuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgZGVsZXRlIGF0dC5zdHViO1xuICAgICAgICAgIGRlbGV0ZSBhdHQubGVuZ3RoO1xuICAgICAgICAgIGlmICghLS1jb3VudCkge1xuICAgICAgICAgICAgY2IobnVsbCwgZG9jKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgc2VsZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvYy5fYXR0YWNobWVudHMsIGtleSkpIHtcbiAgICAgICAgICAgIGRvYy5fYXR0YWNobWVudHNba2V5XS5zdHViID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNiKG51bGwsIGRvYyk7XG4gICAgfVxuICB9KTtcbn0pO1xuXG4vLyBUT0RPOiBJIGRvbnQgbGlrZSB0aGlzLCBpdCBmb3JjZXMgYW4gZXh0cmEgcmVhZCBmb3IgZXZlcnlcbi8vIGF0dGFjaG1lbnQgcmVhZCBhbmQgZW5mb3JjZXMgYSBjb25mdXNpbmcgYXBpIGJldHdlZW5cbi8vIGFkYXB0ZXIuanMgYW5kIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmdldEF0dGFjaG1lbnQgPVxuICBhZGFwdGVyRnVuKCdnZXRBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKG9wdHMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgdGhpcy5fZ2V0KGRvY0lkLCBvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgaWYgKHJlcy5kb2MuX2F0dGFjaG1lbnRzICYmIHJlcy5kb2MuX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnRJZF0pIHtcbiAgICAgIG9wdHMuY3R4ID0gcmVzLmN0eDtcbiAgICAgIG9wdHMuYmluYXJ5ID0gdHJ1ZTtcbiAgICAgIHNlbGYuX2dldEF0dGFjaG1lbnQoZG9jSWQsIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmRvYy5fYXR0YWNobWVudHNbYXR0YWNobWVudElkXSwgb3B0cywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuYWxsRG9jcyA9XG4gIGFkYXB0ZXJGdW4oJ2FsbERvY3MnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBvcHRzLnNraXAgPSB0eXBlb2Ygb3B0cy5za2lwICE9PSAndW5kZWZpbmVkJyA/IG9wdHMuc2tpcCA6IDA7XG4gIGlmIChvcHRzLnN0YXJ0X2tleSkge1xuICAgIG9wdHMuc3RhcnRrZXkgPSBvcHRzLnN0YXJ0X2tleTtcbiAgfVxuICBpZiAob3B0cy5lbmRfa2V5KSB7XG4gICAgb3B0cy5lbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gIH1cbiAgaWYgKCdrZXlzJyBpbiBvcHRzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdHMua2V5cykpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgVHlwZUVycm9yKCdvcHRpb25zLmtleXMgbXVzdCBiZSBhbiBhcnJheScpKTtcbiAgICB9XG4gICAgdmFyIGluY29tcGF0aWJsZU9wdCA9XG4gICAgICBbJ3N0YXJ0a2V5JywgJ2VuZGtleScsICdrZXknXS5maWx0ZXIoZnVuY3Rpb24gKGluY29tcGF0aWJsZU9wdCkge1xuICAgICAgcmV0dXJuIGluY29tcGF0aWJsZU9wdCBpbiBvcHRzO1xuICAgIH0pWzBdO1xuICAgIGlmIChpbmNvbXBhdGlibGVPcHQpIHtcbiAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKFFVRVJZX1BBUlNFX0VSUk9SLFxuICAgICAgICAnUXVlcnkgcGFyYW1ldGVyIGAnICsgaW5jb21wYXRpYmxlT3B0ICtcbiAgICAgICAgJ2AgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBtdWx0aS1nZXQnXG4gICAgICApKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc1JlbW90ZSh0aGlzKSkge1xuICAgICAgYWxsRG9jc0tleXNQYXJzZShvcHRzKTtcbiAgICAgIGlmIChvcHRzLmtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxEb2NzKHtsaW1pdDogMH0sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5fYWxsRG9jcyhvcHRzLCBjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jaGFuZ2VzID0gZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAvLyBCeSBkZWZhdWx0IHNldCByZXR1cm5fZG9jcyB0byBmYWxzZSBpZiB0aGUgY2FsbGVyIGhhcyBvcHRzLmxpdmUgPSB0cnVlLFxuICAvLyB0aGlzIHdpbGwgcHJldmVudCB1cyBmcm9tIGNvbGxlY3RpbmcgdGhlIHNldCBvZiBjaGFuZ2VzIGluZGVmaW5pdGVseVxuICAvLyByZXN1bHRpbmcgaW4gZ3Jvd2luZyBtZW1vcnlcbiAgb3B0cy5yZXR1cm5fZG9jcyA9ICgncmV0dXJuX2RvY3MnIGluIG9wdHMpID8gb3B0cy5yZXR1cm5fZG9jcyA6ICFvcHRzLmxpdmU7XG5cbiAgcmV0dXJuIG5ldyBDaGFuZ2VzJDEodGhpcywgb3B0cywgY2FsbGJhY2spO1xufTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jbG9zZSA9IGFkYXB0ZXJGdW4oJ2Nsb3NlJywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG4gIHRoaXMuZW1pdCgnY2xvc2VkJyk7XG4gIHJldHVybiB0aGlzLl9jbG9zZShjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5pbmZvID0gYWRhcHRlckZ1bignaW5mbycsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX2luZm8oZnVuY3Rpb24gKGVyciwgaW5mbykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICAvLyBhc3N1bWUgd2Uga25vdyBiZXR0ZXIgdGhhbiB0aGUgYWRhcHRlciwgdW5sZXNzIGl0IGluZm9ybXMgdXNcbiAgICBpbmZvLmRiX25hbWUgPSBpbmZvLmRiX25hbWUgfHwgc2VsZi5uYW1lO1xuICAgIGluZm8uYXV0b19jb21wYWN0aW9uID0gISEoc2VsZi5hdXRvX2NvbXBhY3Rpb24gJiYgIWlzUmVtb3RlKHNlbGYpKTtcbiAgICBpbmZvLmFkYXB0ZXIgPSBzZWxmLmFkYXB0ZXI7XG4gICAgY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuaWQgPSBhZGFwdGVyRnVuKCdpZCcsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5faWQoY2FsbGJhY2spO1xufSk7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAodHlwZW9mIHRoaXMuX3R5cGUgPT09ICdmdW5jdGlvbicpID8gdGhpcy5fdHlwZSgpIDogdGhpcy5hZGFwdGVyO1xufTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5idWxrRG9jcyA9XG4gIGFkYXB0ZXJGdW4oJ2J1bGtEb2NzJywgZnVuY3Rpb24gKHJlcSwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHJlcSkpIHtcbiAgICByZXEgPSB7XG4gICAgICBkb2NzOiByZXFcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFyZXEgfHwgIXJlcS5kb2NzIHx8ICFBcnJheS5pc0FycmF5KHJlcS5kb2NzKSkge1xuICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihNSVNTSU5HX0JVTEtfRE9DUykpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXEuZG9jcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0eXBlb2YgcmVxLmRvY3NbaV0gIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmVxLmRvY3NbaV0pKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTk9UX0FOX09CSkVDVCkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhdHRhY2htZW50RXJyb3I7XG4gIHJlcS5kb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGF0dGFjaG1lbnRFcnJvciA9IGF0dGFjaG1lbnRFcnJvciB8fCBhdHRhY2htZW50TmFtZUVycm9yKG5hbWUpO1xuICAgICAgICBpZiAoIWRvYy5fYXR0YWNobWVudHNbbmFtZV0uY29udGVudF90eXBlKSB7XG4gICAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ3dhcm4nLCAnQXR0YWNobWVudCcsIG5hbWUsICdvbiBkb2N1bWVudCcsIGRvYy5faWQsICdpcyBtaXNzaW5nIGNvbnRlbnRfdHlwZScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChhdHRhY2htZW50RXJyb3IpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoQkFEX1JFUVVFU1QsIGF0dGFjaG1lbnRFcnJvcikpO1xuICB9XG5cbiAgaWYgKCEoJ25ld19lZGl0cycgaW4gb3B0cykpIHtcbiAgICBpZiAoJ25ld19lZGl0cycgaW4gcmVxKSB7XG4gICAgICBvcHRzLm5ld19lZGl0cyA9IHJlcS5uZXdfZWRpdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMubmV3X2VkaXRzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgYWRhcHRlciA9IHRoaXM7XG4gIGlmICghb3B0cy5uZXdfZWRpdHMgJiYgIWlzUmVtb3RlKGFkYXB0ZXIpKSB7XG4gICAgLy8gZW5zdXJlIHJldmlzaW9ucyBvZiB0aGUgc2FtZSBkb2MgYXJlIHNvcnRlZCwgc28gdGhhdFxuICAgIC8vIHRoZSBsb2NhbCBhZGFwdGVyIHByb2Nlc3NlcyB0aGVtIGNvcnJlY3RseSAoIzI5MzUpXG4gICAgcmVxLmRvY3Muc29ydChjb21wYXJlQnlJZFRoZW5SZXYpO1xuICB9XG5cbiAgY2xlYW5Eb2NzKHJlcS5kb2NzKTtcblxuICAvLyBpbiB0aGUgY2FzZSBvZiBjb25mbGljdHMsIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBfaWRzIHRvIHRoZSB1c2VyXG4gIC8vIGhvd2V2ZXIsIHRoZSB1bmRlcmx5aW5nIGFkYXB0ZXIgbWF5IGRlc3Ryb3kgdGhlIGRvY3MgYXJyYXksIHNvXG4gIC8vIGNyZWF0ZSBhIGNvcHkgaGVyZVxuICB2YXIgaWRzID0gcmVxLmRvY3MubWFwKGZ1bmN0aW9uIChkb2MpIHtcbiAgICByZXR1cm4gZG9jLl9pZDtcbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXMuX2J1bGtEb2NzKHJlcSwgb3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIGlmICghb3B0cy5uZXdfZWRpdHMpIHtcbiAgICAgIC8vIHRoaXMgaXMgd2hhdCBjb3VjaCBkb2VzIHdoZW4gbmV3X2VkaXRzIGlzIGZhbHNlXG4gICAgICByZXMgPSByZXMuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4LmVycm9yO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGFkZCBpZHMgZm9yIGVycm9yL2NvbmZsaWN0IHJlc3BvbnNlcyAobm90IHJlcXVpcmVkIGZvciBDb3VjaERCKVxuICAgIGlmICghaXNSZW1vdGUoYWRhcHRlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZXNbaV0uaWQgPSByZXNbaV0uaWQgfHwgaWRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHJlcyk7XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucmVnaXN0ZXJEZXBlbmRlbnREYXRhYmFzZSA9XG4gIGFkYXB0ZXJGdW4oJ3JlZ2lzdGVyRGVwZW5kZW50RGF0YWJhc2UnLCBmdW5jdGlvbiAoZGVwZW5kZW50RGIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spIHtcbiAgdmFyIGRiT3B0aW9ucyA9IGNsb25lKHRoaXMuX19vcHRzKTtcbiAgaWYgKHRoaXMuX19vcHRzLnZpZXdfYWRhcHRlcikge1xuICAgIGRiT3B0aW9ucy5hZGFwdGVyID0gdGhpcy5fX29wdHMudmlld19hZGFwdGVyO1xuICB9XG5cbiAgdmFyIGRlcERCID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZGVwZW5kZW50RGIsIGRiT3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZGlmZkZ1bihkb2MpIHtcbiAgICBkb2MuZGVwZW5kZW50RGJzID0gZG9jLmRlcGVuZGVudERicyB8fCB7fTtcbiAgICBpZiAoZG9jLmRlcGVuZGVudERic1tkZXBlbmRlbnREYl0pIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gdXBkYXRlIHJlcXVpcmVkXG4gICAgfVxuICAgIGRvYy5kZXBlbmRlbnREYnNbZGVwZW5kZW50RGJdID0gdHJ1ZTtcbiAgICByZXR1cm4gZG9jO1xuICB9XG4gIHVwc2VydCh0aGlzLCAnX2xvY2FsL19wb3VjaF9kZXBlbmRlbnREYnMnLCBkaWZmRnVuKVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHtkYjogZGVwREJ9KTtcbiAgICB9KS5jYXRjaChjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5kZXN0cm95ID1cbiAgYWRhcHRlckZ1bignZGVzdHJveScsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB1c2VQcmVmaXggPSAndXNlX3ByZWZpeCcgaW4gc2VsZiA/IHNlbGYudXNlX3ByZWZpeCA6IHRydWU7XG5cbiAgZnVuY3Rpb24gZGVzdHJveURiKCkge1xuICAgIC8vIGNhbGwgZGVzdHJveSBtZXRob2Qgb2YgdGhlIHBhcnRpY3VsYXIgYWRhcHRvclxuICAgIHNlbGYuX2Rlc3Ryb3kob3B0cywgZnVuY3Rpb24gKGVyciwgcmVzcCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuX2Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICBzZWxmLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcCB8fCB7ICdvayc6IHRydWUgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNSZW1vdGUoc2VsZikpIHtcbiAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGZvciBkZXBlbmRlbnQgREJzIGlmIGl0J3MgYSByZW1vdGUgREJcbiAgICByZXR1cm4gZGVzdHJveURiKCk7XG4gIH1cblxuICBzZWxmLmdldCgnX2xvY2FsL19wb3VjaF9kZXBlbmRlbnREYnMnLCBmdW5jdGlvbiAoZXJyLCBsb2NhbERvYykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7IC8vIG5vIGRlcGVuZGVuY2llc1xuICAgICAgICByZXR1cm4gZGVzdHJveURiKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBkZXBlbmRlbnREYnMgPSBsb2NhbERvYy5kZXBlbmRlbnREYnM7XG4gICAgdmFyIFBvdWNoREIgPSBzZWxmLmNvbnN0cnVjdG9yO1xuICAgIHZhciBkZWxldGVkTWFwID0gT2JqZWN0LmtleXMoZGVwZW5kZW50RGJzKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIC8vIHVzZV9wcmVmaXggaXMgb25seSBmYWxzZSBpbiB0aGUgYnJvd3NlclxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHZhciB0cnVlTmFtZSA9IHVzZVByZWZpeCA/XG4gICAgICAgIG5hbWUucmVwbGFjZShuZXcgUmVnRXhwKCdeJyArIFBvdWNoREIucHJlZml4KSwgJycpIDogbmFtZTtcbiAgICAgIHJldHVybiBuZXcgUG91Y2hEQih0cnVlTmFtZSwgc2VsZi5fX29wdHMpLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBQcm9taXNlLmFsbChkZWxldGVkTWFwKS50aGVuKGRlc3Ryb3lEYiwgY2FsbGJhY2spO1xuICB9KTtcbn0pO1xuXG5mdW5jdGlvbiBUYXNrUXVldWUoKSB7XG4gIHRoaXMuaXNSZWFkeSA9IGZhbHNlO1xuICB0aGlzLmZhaWxlZCA9IGZhbHNlO1xuICB0aGlzLnF1ZXVlID0gW107XG59XG5cblRhc2tRdWV1ZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZ1bjtcbiAgaWYgKHRoaXMuZmFpbGVkKSB7XG4gICAgd2hpbGUgKChmdW4gPSB0aGlzLnF1ZXVlLnNoaWZ0KCkpKSB7XG4gICAgICBmdW4odGhpcy5mYWlsZWQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoKGZ1biA9IHRoaXMucXVldWUuc2hpZnQoKSkpIHtcbiAgICAgIGZ1bigpO1xuICAgIH1cbiAgfVxufTtcblxuVGFza1F1ZXVlLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGVycikge1xuICB0aGlzLmZhaWxlZCA9IGVycjtcbiAgdGhpcy5leGVjdXRlKCk7XG59O1xuXG5UYXNrUXVldWUucHJvdG90eXBlLnJlYWR5ID0gZnVuY3Rpb24gKGRiKSB7XG4gIHRoaXMuaXNSZWFkeSA9IHRydWU7XG4gIHRoaXMuZGIgPSBkYjtcbiAgdGhpcy5leGVjdXRlKCk7XG59O1xuXG5UYXNrUXVldWUucHJvdG90eXBlLmFkZFRhc2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gIHRoaXMucXVldWUucHVzaChmdW4pO1xuICBpZiAodGhpcy5mYWlsZWQpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gcGFyc2VBZGFwdGVyKG5hbWUsIG9wdHMpIHtcbiAgdmFyIG1hdGNoID0gbmFtZS5tYXRjaCgvKFthLXotXSopOlxcL1xcLyguKikvKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgLy8gdGhlIGh0dHAgYWRhcHRlciBleHBlY3RzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAvaHR0cHM/Ly50ZXN0KG1hdGNoWzFdKSA/IG1hdGNoWzFdICsgJzovLycgKyBtYXRjaFsyXSA6IG1hdGNoWzJdLFxuICAgICAgYWRhcHRlcjogbWF0Y2hbMV1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGFkYXB0ZXJzID0gUG91Y2hEQi5hZGFwdGVycztcbiAgdmFyIHByZWZlcnJlZEFkYXB0ZXJzID0gUG91Y2hEQi5wcmVmZXJyZWRBZGFwdGVycztcbiAgdmFyIHByZWZpeCA9IFBvdWNoREIucHJlZml4O1xuICB2YXIgYWRhcHRlck5hbWUgPSBvcHRzLmFkYXB0ZXI7XG5cbiAgaWYgKCFhZGFwdGVyTmFtZSkgeyAvLyBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBhZGFwdGVyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmZXJyZWRBZGFwdGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgYWRhcHRlck5hbWUgPSBwcmVmZXJyZWRBZGFwdGVyc1tpXTtcbiAgICAgIC8vIGNoZWNrIGZvciBicm93c2VycyB0aGF0IGhhdmUgYmVlbiB1cGdyYWRlZCBmcm9tIHdlYnNxbC1vbmx5IHRvIHdlYnNxbCtpZGJcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGFkYXB0ZXJOYW1lID09PSAnaWRiJyAmJiAnd2Vic3FsJyBpbiBhZGFwdGVycyAmJlxuICAgICAgICAgIGhhc0xvY2FsU3RvcmFnZSgpICYmIGxvY2FsU3RvcmFnZVsnX3BvdWNoX193ZWJzcWxkYl8nICsgcHJlZml4ICsgbmFtZV0pIHtcbiAgICAgICAgLy8gbG9nIGl0LCBiZWNhdXNlIHRoaXMgY2FuIGJlIGNvbmZ1c2luZyBkdXJpbmcgZGV2ZWxvcG1lbnRcbiAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ2xvZycsICdQb3VjaERCIGlzIGRvd25ncmFkaW5nIFwiJyArIG5hbWUgKyAnXCIgdG8gV2ViU1FMIHRvJyArXG4gICAgICAgICAgJyBhdm9pZCBkYXRhIGxvc3MsIGJlY2F1c2UgaXQgd2FzIGFscmVhZHkgb3BlbmVkIHdpdGggV2ViU1FMLicpO1xuICAgICAgICBjb250aW51ZTsgLy8ga2VlcCB1c2luZyB3ZWJzcWwgdG8gYXZvaWQgdXNlciBkYXRhIGxvc3NcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhZGFwdGVyID0gYWRhcHRlcnNbYWRhcHRlck5hbWVdO1xuXG4gIC8vIGlmIGFkYXB0ZXIgaXMgaW52YWxpZCwgdGhlbiBhbiBlcnJvciB3aWxsIGJlIHRocm93biBsYXRlclxuICB2YXIgdXNlUHJlZml4ID0gKGFkYXB0ZXIgJiYgJ3VzZV9wcmVmaXgnIGluIGFkYXB0ZXIpID9cbiAgICBhZGFwdGVyLnVzZV9wcmVmaXggOiB0cnVlO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogdXNlUHJlZml4ID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSxcbiAgICBhZGFwdGVyOiBhZGFwdGVyTmFtZVxuICB9O1xufVxuXG4vLyBPSywgc28gaGVyZSdzIHRoZSBkZWFsLiBDb25zaWRlciB0aGlzIGNvZGU6XG4vLyAgICAgdmFyIGRiMSA9IG5ldyBQb3VjaERCKCdmb28nKTtcbi8vICAgICB2YXIgZGIyID0gbmV3IFBvdWNoREIoJ2ZvbycpO1xuLy8gICAgIGRiMS5kZXN0cm95KCk7XG4vLyBeIHRoZXNlIHR3byBib3RoIG5lZWQgdG8gZW1pdCAnZGVzdHJveWVkJyBldmVudHMsXG4vLyBhcyB3ZWxsIGFzIHRoZSBQb3VjaERCIGNvbnN0cnVjdG9yIGl0c2VsZi5cbi8vIFNvIHdlIGhhdmUgb25lIGRiIG9iamVjdCAod2hpY2hldmVyIG9uZSBnb3QgZGVzdHJveSgpIGNhbGxlZCBvbiBpdClcbi8vIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyB0aGUgaW5pdGlhbCBldmVudCwgd2hpY2ggdGhlbiBnZXRzIGVtaXR0ZWRcbi8vIGJ5IHRoZSBjb25zdHJ1Y3Rvciwgd2hpY2ggdGhlbiBicm9hZGNhc3RzIGl0IHRvIGFueSBvdGhlciBkYnNcbi8vIHRoYXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIHNhbWUgbmFtZS5cbmZ1bmN0aW9uIHByZXBhcmVGb3JEZXN0cnVjdGlvbihzZWxmKSB7XG5cbiAgZnVuY3Rpb24gb25EZXN0cm95ZWQoZnJvbV9jb25zdHJ1Y3Rvcikge1xuICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlZCcsIG9uQ2xvc2VkKTtcbiAgICBpZiAoIWZyb21fY29uc3RydWN0b3IpIHtcbiAgICAgIHNlbGYuY29uc3RydWN0b3IuZW1pdCgnZGVzdHJveWVkJywgc2VsZi5uYW1lKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsb3NlZCgpIHtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3llZCk7XG4gICAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCd1bnJlZicsIHNlbGYpO1xuICB9XG5cbiAgc2VsZi5vbmNlKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3llZCk7XG4gIHNlbGYub25jZSgnY2xvc2VkJywgb25DbG9zZWQpO1xuICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ3JlZicsIHNlbGYpO1xufVxuXG5pbmhlcml0cyhQb3VjaERCLCBBYnN0cmFjdFBvdWNoREIpO1xuZnVuY3Rpb24gUG91Y2hEQihuYW1lLCBvcHRzKSB7XG4gIC8vIEluIE5vZGUgb3VyIHRlc3Qgc3VpdGUgb25seSB0ZXN0cyB0aGlzIGZvciBQb3VjaEFsdCB1bmZvcnR1bmF0ZWx5XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUG91Y2hEQikpIHtcbiAgICByZXR1cm4gbmV3IFBvdWNoREIobmFtZSwgb3B0cyk7XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIGlmIChuYW1lICYmIHR5cGVvZiBuYW1lID09PSAnb2JqZWN0Jykge1xuICAgIG9wdHMgPSBuYW1lO1xuICAgIG5hbWUgPSBvcHRzLm5hbWU7XG4gICAgZGVsZXRlIG9wdHMubmFtZTtcbiAgfVxuXG4gIGlmIChvcHRzLmRldGVybWluaXN0aWNfcmV2cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0cy5kZXRlcm1pbmlzdGljX3JldnMgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fX29wdHMgPSBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgc2VsZi5hdXRvX2NvbXBhY3Rpb24gPSBvcHRzLmF1dG9fY29tcGFjdGlvbjtcbiAgc2VsZi5wcmVmaXggPSBQb3VjaERCLnByZWZpeDtcblxuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nL2ludmFsaWQgREIgbmFtZScpO1xuICB9XG5cbiAgdmFyIHByZWZpeGVkTmFtZSA9IChvcHRzLnByZWZpeCB8fCAnJykgKyBuYW1lO1xuICB2YXIgYmFja2VuZCA9IHBhcnNlQWRhcHRlcihwcmVmaXhlZE5hbWUsIG9wdHMpO1xuXG4gIG9wdHMubmFtZSA9IGJhY2tlbmQubmFtZTtcbiAgb3B0cy5hZGFwdGVyID0gb3B0cy5hZGFwdGVyIHx8IGJhY2tlbmQuYWRhcHRlcjtcblxuICBzZWxmLm5hbWUgPSBuYW1lO1xuICBzZWxmLl9hZGFwdGVyID0gb3B0cy5hZGFwdGVyO1xuICBQb3VjaERCLmVtaXQoJ2RlYnVnJywgWydhZGFwdGVyJywgJ1BpY2tlZCBhZGFwdGVyOiAnLCBvcHRzLmFkYXB0ZXJdKTtcblxuICBpZiAoIVBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXSB8fFxuICAgICAgIVBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXS52YWxpZCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFkYXB0ZXI6ICcgKyBvcHRzLmFkYXB0ZXIpO1xuICB9XG5cbiAgaWYgKG9wdHMudmlld19hZGFwdGVyKSB7XG4gICAgaWYgKCFQb3VjaERCLmFkYXB0ZXJzW29wdHMudmlld19hZGFwdGVyXSB8fFxuICAgICAgICAhUG91Y2hEQi5hZGFwdGVyc1tvcHRzLnZpZXdfYWRhcHRlcl0udmFsaWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFZpZXcgQWRhcHRlcjogJyArIG9wdHMudmlld19hZGFwdGVyKTtcbiAgICB9XG4gIH1cblxuICBBYnN0cmFjdFBvdWNoREIuY2FsbChzZWxmKTtcbiAgc2VsZi50YXNrcXVldWUgPSBuZXcgVGFza1F1ZXVlKCk7XG5cbiAgc2VsZi5hZGFwdGVyID0gb3B0cy5hZGFwdGVyO1xuXG4gIFBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXS5jYWxsKHNlbGYsIG9wdHMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gc2VsZi50YXNrcXVldWUuZmFpbChlcnIpO1xuICAgIH1cbiAgICBwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oc2VsZik7XG5cbiAgICBzZWxmLmVtaXQoJ2NyZWF0ZWQnLCBzZWxmKTtcbiAgICBQb3VjaERCLmVtaXQoJ2NyZWF0ZWQnLCBzZWxmLm5hbWUpO1xuICAgIHNlbGYudGFza3F1ZXVlLnJlYWR5KHNlbGYpO1xuICB9KTtcblxufVxuXG4vLyBBYm9ydENvbnRyb2xsZXIgd2FzIGludHJvZHVjZWQgcXVpdGUgYSB3aGlsZSBhZnRlciBmZXRjaCBhbmRcbi8vIGlzbnQgcmVxdWlyZWQgZm9yIFBvdWNoREIgdG8gZnVuY3Rpb24gc28gcG9seWZpbGwgaWYgbmVlZGVkXG52YXIgYSA9ICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAndW5kZWZpbmVkJylcbiAgICA/IEFib3J0Q29udHJvbGxlclxuICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4ge2Fib3J0OiBmdW5jdGlvbiAoKSB7fX07IH07XG5cbnZhciBmJDEgPSBmZXRjaDtcbnZhciBoID0gSGVhZGVycztcblxuUG91Y2hEQi5hZGFwdGVycyA9IHt9O1xuUG91Y2hEQi5wcmVmZXJyZWRBZGFwdGVycyA9IFtdO1xuXG5Qb3VjaERCLnByZWZpeCA9ICdfcG91Y2hfJztcblxudmFyIGV2ZW50RW1pdHRlciA9IG5ldyBFRSgpO1xuXG5mdW5jdGlvbiBzZXRVcEV2ZW50RW1pdHRlcihQb3VjaCkge1xuICBPYmplY3Qua2V5cyhFRS5wcm90b3R5cGUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICh0eXBlb2YgRUUucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIFBvdWNoW2tleV0gPSBldmVudEVtaXR0ZXJba2V5XS5iaW5kKGV2ZW50RW1pdHRlcik7XG4gICAgfVxuICB9KTtcblxuICAvLyB0aGVzZSBhcmUgY3JlYXRlZCBpbiBjb25zdHJ1Y3Rvci5qcywgYW5kIGFsbG93IHVzIHRvIG5vdGlmeSBlYWNoIERCIHdpdGhcbiAgLy8gdGhlIHNhbWUgbmFtZSB0aGF0IGl0IHdhcyBkZXN0cm95ZWQsIHZpYSB0aGUgY29uc3RydWN0b3Igb2JqZWN0XG4gIHZhciBkZXN0cnVjdExpc3RlbmVycyA9IFBvdWNoLl9kZXN0cnVjdGlvbkxpc3RlbmVycyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuXG4gIFBvdWNoLm9uKCdyZWYnLCBmdW5jdGlvbiBvbkNvbnN0cnVjdG9yUmVmKGRiKSB7XG4gICAgaWYgKCFkZXN0cnVjdExpc3RlbmVycy5oYXMoZGIubmFtZSkpIHtcbiAgICAgIGRlc3RydWN0TGlzdGVuZXJzLnNldChkYi5uYW1lLCBbXSk7XG4gICAgfVxuICAgIGRlc3RydWN0TGlzdGVuZXJzLmdldChkYi5uYW1lKS5wdXNoKGRiKTtcbiAgfSk7XG5cbiAgUG91Y2gub24oJ3VucmVmJywgZnVuY3Rpb24gb25Db25zdHJ1Y3RvclVucmVmKGRiKSB7XG4gICAgaWYgKCFkZXN0cnVjdExpc3RlbmVycy5oYXMoZGIubmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRiTGlzdCA9IGRlc3RydWN0TGlzdGVuZXJzLmdldChkYi5uYW1lKTtcbiAgICB2YXIgcG9zID0gZGJMaXN0LmluZGV4T2YoZGIpO1xuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYkxpc3Quc3BsaWNlKHBvcywgMSk7XG4gICAgaWYgKGRiTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVzdHJ1Y3RMaXN0ZW5lcnMuc2V0KGRiLm5hbWUsIGRiTGlzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RydWN0TGlzdGVuZXJzLmRlbGV0ZShkYi5uYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIFBvdWNoLm9uKCdkZXN0cm95ZWQnLCBmdW5jdGlvbiBvbkNvbnN0cnVjdG9yRGVzdHJveWVkKG5hbWUpIHtcbiAgICBpZiAoIWRlc3RydWN0TGlzdGVuZXJzLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZGJMaXN0ID0gZGVzdHJ1Y3RMaXN0ZW5lcnMuZ2V0KG5hbWUpO1xuICAgIGRlc3RydWN0TGlzdGVuZXJzLmRlbGV0ZShuYW1lKTtcbiAgICBkYkxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZGIpIHtcbiAgICAgIGRiLmVtaXQoJ2Rlc3Ryb3llZCcsdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5zZXRVcEV2ZW50RW1pdHRlcihQb3VjaERCKTtcblxuUG91Y2hEQi5hZGFwdGVyID0gZnVuY3Rpb24gKGlkLCBvYmosIGFkZFRvUHJlZmVycmVkQWRhcHRlcnMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKG9iai52YWxpZCgpKSB7XG4gICAgUG91Y2hEQi5hZGFwdGVyc1tpZF0gPSBvYmo7XG4gICAgaWYgKGFkZFRvUHJlZmVycmVkQWRhcHRlcnMpIHtcbiAgICAgIFBvdWNoREIucHJlZmVycmVkQWRhcHRlcnMucHVzaChpZCk7XG4gICAgfVxuICB9XG59O1xuXG5Qb3VjaERCLnBsdWdpbiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHsgLy8gZnVuY3Rpb24gc3R5bGUgZm9yIHBsdWdpbnNcbiAgICBvYmooUG91Y2hEQik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGx1Z2luOiBnb3QgXCInICsgb2JqICsgJ1wiLCBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbicpO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsgLy8gb2JqZWN0IHN0eWxlIGZvciBwbHVnaW5zXG4gICAgICBQb3VjaERCLnByb3RvdHlwZVtpZF0gPSBvYmpbaWRdO1xuICAgIH0pO1xuICB9XG4gIGlmICh0aGlzLl9fZGVmYXVsdHMpIHtcbiAgICBQb3VjaERCLl9fZGVmYXVsdHMgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIHRoaXMuX19kZWZhdWx0cyk7XG4gIH1cbiAgcmV0dXJuIFBvdWNoREI7XG59O1xuXG5Qb3VjaERCLmRlZmF1bHRzID0gZnVuY3Rpb24gKGRlZmF1bHRPcHRzKSB7XG4gIGZ1bmN0aW9uIFBvdWNoQWx0KG5hbWUsIG9wdHMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUG91Y2hBbHQpKSB7XG4gICAgICByZXR1cm4gbmV3IFBvdWNoQWx0KG5hbWUsIG9wdHMpO1xuICAgIH1cblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gICAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBvcHRzID0gbmFtZTtcbiAgICAgIG5hbWUgPSBvcHRzLm5hbWU7XG4gICAgICBkZWxldGUgb3B0cy5uYW1lO1xuICAgIH1cblxuICAgIG9wdHMgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIFBvdWNoQWx0Ll9fZGVmYXVsdHMsIG9wdHMpO1xuICAgIFBvdWNoREIuY2FsbCh0aGlzLCBuYW1lLCBvcHRzKTtcbiAgfVxuXG4gIGluaGVyaXRzKFBvdWNoQWx0LCBQb3VjaERCKTtcblxuICBQb3VjaEFsdC5wcmVmZXJyZWRBZGFwdGVycyA9IFBvdWNoREIucHJlZmVycmVkQWRhcHRlcnMuc2xpY2UoKTtcbiAgT2JqZWN0LmtleXMoUG91Y2hEQikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCEoa2V5IGluIFBvdWNoQWx0KSkge1xuICAgICAgUG91Y2hBbHRba2V5XSA9IFBvdWNoREJba2V5XTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIG1ha2UgZGVmYXVsdCBvcHRpb25zIHRyYW5zaXRpdmVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvdWNoZGIvcG91Y2hkYi9pc3N1ZXMvNTkyMlxuICBQb3VjaEFsdC5fX2RlZmF1bHRzID0gJGluamVjdF9PYmplY3RfYXNzaWduKHt9LCB0aGlzLl9fZGVmYXVsdHMsIGRlZmF1bHRPcHRzKTtcblxuICByZXR1cm4gUG91Y2hBbHQ7XG59O1xuXG5Qb3VjaERCLmZldGNoID0gZnVuY3Rpb24gKHVybCwgb3B0cykge1xuICByZXR1cm4gZiQxKHVybCwgb3B0cyk7XG59O1xuXG4vLyBtYW5hZ2VkIGF1dG9tYXRpY2FsbHkgYnkgc2V0LXZlcnNpb24uanNcbnZhciB2ZXJzaW9uID0gXCI3LjMuMFwiO1xuXG4vLyB0aGlzIHdvdWxkIGp1c3QgYmUgXCJyZXR1cm4gZG9jW2ZpZWxkXVwiLCBidXQgZmllbGRzXG4vLyBjYW4gYmUgXCJkZWVwXCIgZHVlIHRvIGRvdCBub3RhdGlvblxuZnVuY3Rpb24gZ2V0RmllbGRGcm9tRG9jKGRvYywgcGFyc2VkRmllbGQpIHtcbiAgdmFyIHZhbHVlID0gZG9jO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gcGFyc2VkRmllbGQubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIga2V5ID0gcGFyc2VkRmllbGRbaV07XG4gICAgdmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUkMShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbn1cblxuLy8gQ29udmVydHMgYSBzdHJpbmcgaW4gZG90IG5vdGF0aW9uIHRvIGFuIGFycmF5IG9mIGl0cyBjb21wb25lbnRzLCB3aXRoIGJhY2tzbGFzaCBlc2NhcGluZ1xuZnVuY3Rpb24gcGFyc2VGaWVsZChmaWVsZE5hbWUpIHtcbiAgLy8gZmllbGRzIG1heSBiZSBkZWVwIChlLmcuIFwiZm9vLmJhci5iYXpcIiksIHNvIHBhcnNlXG4gIHZhciBmaWVsZHMgPSBbXTtcbiAgdmFyIGN1cnJlbnQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGZpZWxkTmFtZS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBjaCA9IGZpZWxkTmFtZVtpXTtcbiAgICBpZiAoaSA+IDAgJiYgZmllbGROYW1lW2kgLSAxXSA9PT0gJ1xcXFwnICYmIChjaCA9PT0gJyQnIHx8IGNoID09PSAnLicpKSB7XG4gICAgICAvLyBlc2NhcGVkIGRlbGltaXRlclxuICAgICAgY3VycmVudCA9IGN1cnJlbnQuc3Vic3RyaW5nKDAsIGN1cnJlbnQubGVuZ3RoIC0gMSkgKyBjaDtcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnLicpIHtcbiAgICAgIC8vIFdoZW4gYC5gIGlzIG5vdCBlc2NhcGVkIChhYm92ZSksIGl0IGlzIGEgZmllbGQgZGVsaW1pdGVyXG4gICAgICBmaWVsZHMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICB9IGVsc2UgeyAvLyBub3JtYWwgY2hhcmFjdGVyXG4gICAgICBjdXJyZW50ICs9IGNoO1xuICAgIH1cbiAgfVxuICBmaWVsZHMucHVzaChjdXJyZW50KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cblxudmFyIGNvbWJpbmF0aW9uRmllbGRzID0gWyckb3InLCAnJG5vcicsICckbm90J107XG5mdW5jdGlvbiBpc0NvbWJpbmF0aW9uYWxGaWVsZChmaWVsZCkge1xuICByZXR1cm4gY29tYmluYXRpb25GaWVsZHMuaW5kZXhPZihmaWVsZCkgPiAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5KG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVswXTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUob2JqKSB7XG4gIHJldHVybiBvYmpbZ2V0S2V5KG9iaildO1xufVxuXG5cbi8vIGZsYXR0ZW4gYW4gYXJyYXkgb2Ygc2VsZWN0b3JzIGpvaW5lZCBieSBhbiAkYW5kIG9wZXJhdG9yXG5mdW5jdGlvbiBtZXJnZUFuZGVkU2VsZWN0b3JzKHNlbGVjdG9ycykge1xuXG4gIC8vIHNvcnQgdG8gZW5zdXJlIHRoYXQgZS5nLiBpZiB0aGUgdXNlciBzcGVjaWZpZWRcbiAgLy8gJGFuZDogW3skZ3Q6ICdhJ30sIHskZ3Q6ICdiJ31dLCB0aGVuIGl0J3MgY29sbGFwc2VkIGludG9cbiAgLy8ganVzdCB7JGd0OiAnYid9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGZpcnN0ID0geyRvcjogdHJ1ZSwgJG5vcjogdHJ1ZX07XG5cbiAgc2VsZWN0b3JzLmZvckVhY2goZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgT2JqZWN0LmtleXMoc2VsZWN0b3IpLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgbWF0Y2hlciA9IHNlbGVjdG9yW2ZpZWxkXTtcbiAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgbWF0Y2hlciA9IHskZXE6IG1hdGNoZXJ9O1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNDb21iaW5hdGlvbmFsRmllbGQoZmllbGQpKSB7XG4gICAgICAgIC8vIG9yLCBub3JcbiAgICAgICAgaWYgKG1hdGNoZXIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGlmIChmaXJzdFtmaWVsZF0pIHtcbiAgICAgICAgICAgIGZpcnN0W2ZpZWxkXSA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzW2ZpZWxkXSA9IG1hdGNoZXI7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICAgICAgICByZXNbZmllbGRdLmZvckVhY2goZnVuY3Rpb24gKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtYXRjaGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgdmFyIG0gPSBtYXRjaGVyW2tleV07XG4gICAgICAgICAgICAgIHZhciBsb25nZXN0ID0gTWF0aC5tYXgoT2JqZWN0LmtleXMoZXhpc3RpbmcpLmxlbmd0aCwgT2JqZWN0LmtleXMobSkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgdmFyIG1lcmdlZCA9IG1lcmdlQW5kZWRTZWxlY3RvcnMoW2V4aXN0aW5nLCBtXSk7XG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA8PSBsb25nZXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHNpdHVhdGlvbiBsaWtlOiAoYSA6eyRlcSA6MX0gfHwgLi4uKSAmJiAoYSB7JGVxOiAyfSB8fCAuLi4pXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2luZyB3b3VsZCBwcm9kdWNlIGEgJGVxIDIgd2hlbiBhY3R1YWxseSB3ZSBzaG91bGRuJ3QgZXZlciBtYXRjaCBhZ2FpbnN0IHRoZXNlIG1lcmdlZCBjb25kaXRpb25zXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2VkIHNob3VsZCBhbHdheXMgY29udGFpbiBtb3JlIHZhbHVlcyB0byBiZSB2YWxpZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbnRyaWVzLnB1c2gobWVyZ2VkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc1tmaWVsZF0gPSBlbnRyaWVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vdFxuICAgICAgICAgIHJlc1tmaWVsZF0gPSBtZXJnZUFuZGVkU2VsZWN0b3JzKFttYXRjaGVyXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBmaWVsZE1hdGNoZXJzID0gcmVzW2ZpZWxkXSA9IHJlc1tmaWVsZF0gfHwge307XG4gICAgICAgIE9iamVjdC5rZXlzKG1hdGNoZXIpLmZvckVhY2goZnVuY3Rpb24gKG9wZXJhdG9yKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gbWF0Y2hlcltvcGVyYXRvcl07XG5cbiAgICAgICAgICBpZiAob3BlcmF0b3IgPT09ICckZ3QnIHx8IG9wZXJhdG9yID09PSAnJGd0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZUd0R3RlKG9wZXJhdG9yLCB2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gJyRsdCcgfHwgb3BlcmF0b3IgPT09ICckbHRlJykge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlTHRMdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSAnJG5lJykge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlTmUodmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09ICckZXEnKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VFcSh2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gXCIkcmVnZXhcIikge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlUmVnZXgodmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuXG5cbi8vIGNvbGxhcHNlIGxvZ2ljYWxseSBlcXVpdmFsZW50IGd0L2d0ZSB2YWx1ZXNcbmZ1bmN0aW9uIG1lcmdlR3RHdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kZXEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nXG4gIH1cbiAgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRndGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSAnJGd0ZScpIHtcbiAgICAgIGlmICh2YWx1ZSA+IGZpZWxkTWF0Y2hlcnMuJGd0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlID49IGZpZWxkTWF0Y2hlcnMuJGd0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRndGU7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRndCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob3BlcmF0b3IgPT09ICckZ3RlJykge1xuICAgICAgaWYgKHZhbHVlID4gZmllbGRNYXRjaGVycy4kZ3QpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBkZWxldGUgZmllbGRNYXRjaGVycy4kZ3Q7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlID4gZmllbGRNYXRjaGVycy4kZ3QpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBmaWVsZE1hdGNoZXJzLiRndCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICB9XG59XG5cbi8vIGNvbGxhcHNlIGxvZ2ljYWxseSBlcXVpdmFsZW50IGx0L2x0ZSB2YWx1ZXNcbmZ1bmN0aW9uIG1lcmdlTHRMdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kZXEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nXG4gIH1cbiAgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRsdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSAnJGx0ZScpIHtcbiAgICAgIGlmICh2YWx1ZSA8IGZpZWxkTWF0Y2hlcnMuJGx0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlIDw9IGZpZWxkTWF0Y2hlcnMuJGx0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRsdGU7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob3BlcmF0b3IgPT09ICckbHRlJykge1xuICAgICAgaWYgKHZhbHVlIDwgZmllbGRNYXRjaGVycy4kbHQpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBkZWxldGUgZmllbGRNYXRjaGVycy4kbHQ7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlIDwgZmllbGRNYXRjaGVycy4kbHQpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBmaWVsZE1hdGNoZXJzLiRsdCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICB9XG59XG5cbi8vIGNvbWJpbmUgJG5lIHZhbHVlcyBpbnRvIG9uZSBhcnJheVxuZnVuY3Rpb24gbWVyZ2VOZSh2YWx1ZSwgZmllbGRNYXRjaGVycykge1xuICBpZiAoJyRuZScgaW4gZmllbGRNYXRjaGVycykge1xuICAgIC8vIHRoZXJlIGFyZSBtYW55IHRoaW5ncyB0aGlzIGNvdWxkIFwibm90XCIgYmVcbiAgICBmaWVsZE1hdGNoZXJzLiRuZS5wdXNoKHZhbHVlKTtcbiAgfSBlbHNlIHsgLy8gZG9lc24ndCBleGlzdCB5ZXRcbiAgICBmaWVsZE1hdGNoZXJzLiRuZSA9IFt2YWx1ZV07XG4gIH1cbn1cblxuLy8gYWRkICRlcSBpbnRvIHRoZSBtaXhcbmZ1bmN0aW9uIG1lcmdlRXEodmFsdWUsIGZpZWxkTWF0Y2hlcnMpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgbGVzcyBzcGVjaWZpY2l0eSB0aGFuIHRoZSAkZXFcbiAgLy8gVE9ETzogY2hlY2sgZm9yIHVzZXIgZXJyb3JzIGhlcmVcbiAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGd0O1xuICBkZWxldGUgZmllbGRNYXRjaGVycy4kZ3RlO1xuICBkZWxldGUgZmllbGRNYXRjaGVycy4kbHQ7XG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRsdGU7XG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRuZTtcbiAgZmllbGRNYXRjaGVycy4kZXEgPSB2YWx1ZTtcbn1cblxuLy8gY29tYmluZSAkcmVnZXggdmFsdWVzIGludG8gb25lIGFycmF5XG5mdW5jdGlvbiBtZXJnZVJlZ2V4KHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICgnJHJlZ2V4JyBpbiBmaWVsZE1hdGNoZXJzKSB7XG4gICAgLy8gYSB2YWx1ZSBjb3VsZCBtYXRjaCBtdWx0aXBsZSByZWdleGVzXG4gICAgZmllbGRNYXRjaGVycy4kcmVnZXgucHVzaCh2YWx1ZSk7XG4gIH0gZWxzZSB7IC8vIGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgZmllbGRNYXRjaGVycy4kcmVnZXggPSBbdmFsdWVdO1xuICB9XG59XG5cbi8vIzc0NTg6IGV4ZWN1dGUgZnVuY3Rpb24gbWVyZ2VBbmRlZFNlbGVjdG9ycyBvbiBuZXN0ZWQgJGFuZFxuZnVuY3Rpb24gbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZChvYmopIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmpbaV1bJyRhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICBvYmpbaV0gPSBtZXJnZUFuZGVkU2VsZWN0b3JzKG9ialtpXVsnJGFuZCddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZCh2YWx1ZSk7IC8vIDwtIHJlY3Vyc2l2ZSBjYWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cblxuLy8jNzQ1ODogZGV0ZXJtaW5lIGlkICRhbmQgaXMgcHJlc2VudCBpbiBzZWxlY3RvciAoYXQgYW55IGxldmVsKVxuZnVuY3Rpb24gaXNBbmRJblNlbGVjdG9yKG9iaiwgaXNBbmQpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAocHJvcCA9PT0gJyRhbmQnKSB7XG4gICAgICAgICAgICBpc0FuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaXNBbmQgPSBpc0FuZEluU2VsZWN0b3IodmFsdWUsIGlzQW5kKTsgLy8gPC0gcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNBbmQ7XG59XG5cbi8vXG4vLyBub3JtYWxpemUgdGhlIHNlbGVjdG9yXG4vL1xuZnVuY3Rpb24gbWFzc2FnZVNlbGVjdG9yKGlucHV0KSB7XG4gIHZhciByZXN1bHQgPSBjbG9uZShpbnB1dCk7XG4gIHZhciB3YXNBbmRlZCA9IGZhbHNlO1xuICAgIC8vIzc0NTg6IGlmICRhbmQgaXMgcHJlc2VudCBpbiBzZWxlY3RvciAoYXQgYW55IGxldmVsKSBtZXJnZSBuZXN0ZWQgJGFuZFxuICAgIGlmIChpc0FuZEluU2VsZWN0b3IocmVzdWx0LCBmYWxzZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZChyZXN1bHQpO1xuICAgICAgICBpZiAoJyRhbmQnIGluIHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbWVyZ2VBbmRlZFNlbGVjdG9ycyhyZXN1bHRbJyRhbmQnXSk7XG4gICAgICAgIH1cbiAgICAgICAgd2FzQW5kZWQgPSB0cnVlO1xuICAgIH1cblxuICBbJyRvcicsICckbm9yJ10uZm9yRWFjaChmdW5jdGlvbiAob3JPck5vcikge1xuICAgIGlmIChvck9yTm9yIGluIHJlc3VsdCkge1xuICAgICAgLy8gbWVzc2FnZSBlYWNoIGluZGl2aWR1YWwgc2VsZWN0b3JcbiAgICAgIC8vIGUuZy4ge2ZvbzogJ2Jhcid9IGJlY29tZXMge2ZvbzogeyRlcTogJ2Jhcid9fVxuICAgICAgcmVzdWx0W29yT3JOb3JdLmZvckVhY2goZnVuY3Rpb24gKHN1YlNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBmaWVsZHMgPSBPYmplY3Qua2V5cyhzdWJTZWxlY3Rvcik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgIHZhciBtYXRjaGVyID0gc3ViU2VsZWN0b3JbZmllbGRdO1xuICAgICAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ29iamVjdCcgfHwgbWF0Y2hlciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc3ViU2VsZWN0b3JbZmllbGRdID0geyRlcTogbWF0Y2hlcn07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmICgnJG5vdCcgaW4gcmVzdWx0KSB7XG4gICAgLy9UaGlzIGZlZWxzIGEgbGl0dGxlIGxpa2UgZm9yY2luZywgYnV0IGl0IHdpbGwgd29yayBmb3Igbm93LFxuICAgIC8vSSB3b3VsZCBsaWtlIHRvIGNvbWUgYmFjayB0byB0aGlzIGFuZCBtYWtlIHRoZSBtZXJnaW5nIG9mIHNlbGVjdG9ycyBhIGxpdHRsZSBtb3JlIGdlbmVyaWNcbiAgICByZXN1bHRbJyRub3QnXSA9IG1lcmdlQW5kZWRTZWxlY3RvcnMoW3Jlc3VsdFsnJG5vdCddXSk7XG4gIH1cblxuICB2YXIgZmllbGRzID0gT2JqZWN0LmtleXMocmVzdWx0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICB2YXIgbWF0Y2hlciA9IHJlc3VsdFtmaWVsZF07XG5cbiAgICBpZiAodHlwZW9mIG1hdGNoZXIgIT09ICdvYmplY3QnIHx8IG1hdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIG1hdGNoZXIgPSB7JGVxOiBtYXRjaGVyfTtcbiAgICB9IGVsc2UgaWYgKCF3YXNBbmRlZCkge1xuICAgICAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUgcGxhY2VkIGluIGFuIGFycmF5IGJlY2F1c2UgdGhlc2Ugb3BlcmF0b3JzIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGZpZWxkXG4gICAgICAvLyB3aGVuICRhbmQgaXMgdXNlZCwgbWVyZ2VBbmRlZFNlbGVjdG9ycyB0YWtlcyBjYXJlIG9mIHB1dHRpbmcgdGhlbSBpbnRvIGFycmF5cywgb3RoZXJ3aXNlIGl0J3MgZG9uZSBoZXJlOlxuICAgICAgaWYgKCckbmUnIGluIG1hdGNoZXIpIHtcbiAgICAgICAgbWF0Y2hlci4kbmUgPSBbbWF0Y2hlci4kbmVdO1xuICAgICAgfVxuICAgICAgaWYgKCckcmVnZXgnIGluIG1hdGNoZXIpIHtcbiAgICAgICAgbWF0Y2hlci4kcmVnZXggPSBbbWF0Y2hlci4kcmVnZXhdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHRbZmllbGRdID0gbWF0Y2hlcjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHBhZChzdHIsIHBhZFdpdGgsIHVwVG9MZW5ndGgpIHtcbiAgdmFyIHBhZGRpbmcgPSAnJztcbiAgdmFyIHRhcmdldExlbmd0aCA9IHVwVG9MZW5ndGggLSBzdHIubGVuZ3RoO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB3aGlsZSAocGFkZGluZy5sZW5ndGggPCB0YXJnZXRMZW5ndGgpIHtcbiAgICBwYWRkaW5nICs9IHBhZFdpdGg7XG4gIH1cbiAgcmV0dXJuIHBhZGRpbmc7XG59XG5cbmZ1bmN0aW9uIHBhZExlZnQoc3RyLCBwYWRXaXRoLCB1cFRvTGVuZ3RoKSB7XG4gIHZhciBwYWRkaW5nID0gcGFkKHN0ciwgcGFkV2l0aCwgdXBUb0xlbmd0aCk7XG4gIHJldHVybiBwYWRkaW5nICsgc3RyO1xufVxuXG52YXIgTUlOX01BR05JVFVERSA9IC0zMjQ7IC8vIHZlcmlmaWVkIGJ5IC1OdW1iZXIuTUlOX1ZBTFVFXG52YXIgTUFHTklUVURFX0RJR0lUUyA9IDM7IC8vIGRpdHRvXG52YXIgU0VQID0gJyc7IC8vIHNldCB0byAnXycgZm9yIGVhc2llciBkZWJ1Z2dpbmdcblxuZnVuY3Rpb24gY29sbGF0ZShhLCBiKSB7XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGEgPSBub3JtYWxpemVLZXkoYSk7XG4gIGIgPSBub3JtYWxpemVLZXkoYik7XG5cbiAgdmFyIGFpID0gY29sbGF0aW9uSW5kZXgoYSk7XG4gIHZhciBiaSA9IGNvbGxhdGlvbkluZGV4KGIpO1xuICBpZiAoKGFpIC0gYmkpICE9PSAwKSB7XG4gICAgcmV0dXJuIGFpIC0gYmk7XG4gIH1cbiAgc3dpdGNoICh0eXBlb2YgYSkge1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IDE7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiBzdHJpbmdDb2xsYXRlKGEsIGIpO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGEpID8gYXJyYXlDb2xsYXRlKGEsIGIpIDogb2JqZWN0Q29sbGF0ZShhLCBiKTtcbn1cblxuLy8gY291Y2ggY29uc2lkZXJzIG51bGwvTmFOL0luZmluaXR5Ly1JbmZpbml0eSA9PT0gdW5kZWZpbmVkLFxuLy8gZm9yIHRoZSBwdXJwb3NlcyBvZiBtYXByZWR1Y2UgaW5kZXhlcy4gYWxzbywgZGF0ZXMgZ2V0IHN0cmluZ2lmaWVkLlxuZnVuY3Rpb24gbm9ybWFsaXplS2V5KGtleSkge1xuICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGlmIChrZXkgPT09IEluZmluaXR5IHx8IGtleSA9PT0gLUluZmluaXR5IHx8IGlzTmFOKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5O1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB2YXIgb3JpZ0tleSA9IGtleTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgdmFyIGxlbiA9IGtleS5sZW5ndGg7XG4gICAgICAgIGtleSA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAga2V5W2ldID0gbm9ybWFsaXplS2V5KG9yaWdLZXlbaV0pO1xuICAgICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgfSBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBrZXkudG9KU09OKCk7XG4gICAgICB9IGVsc2UgaWYgKGtleSAhPT0gbnVsbCkgeyAvLyBnZW5lcmljIG9iamVjdFxuICAgICAgICBrZXkgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBvcmlnS2V5KSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcmlnS2V5LCBrKSkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9yaWdLZXlba107XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAga2V5W2tdID0gbm9ybWFsaXplS2V5KHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGtleTtcbn1cblxuZnVuY3Rpb24gaW5kZXhpZnkoa2V5KSB7XG4gIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4ga2V5ID8gMSA6IDA7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gbnVtVG9JbmRleGFibGVTdHJpbmcoa2V5KTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIC8vIFdlJ3ZlIHRvIGJlIHN1cmUgdGhhdCBrZXkgZG9lcyBub3QgY29udGFpbiBcXHUwMDAwXG4gICAgICAgIC8vIERvIG9yZGVyLXByZXNlcnZpbmcgcmVwbGFjZW1lbnRzOlxuICAgICAgICAvLyAwIC0+IDEsIDFcbiAgICAgICAgLy8gMSAtPiAxLCAyXG4gICAgICAgIC8vIDIgLT4gMiwgMlxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHJldHVybiBrZXlcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMi9nLCAnXFx1MDAwMlxcdTAwMDInKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXHUwMDAxL2csICdcXHUwMDAxXFx1MDAwMicpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDAvZywgJ1xcdTAwMDFcXHUwMDAxJyk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29udHJvbC1yZWdleCAqL1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGtleSk7XG4gICAgICAgIHZhciBhcnIgPSBpc0FycmF5ID8ga2V5IDogT2JqZWN0LmtleXMoa2V5KTtcbiAgICAgICAgdmFyIGkgPSAtMTtcbiAgICAgICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9JbmRleGFibGVTdHJpbmcoYXJyW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgICAgICAgICAgdmFyIG9iaktleSA9IGFycltpXTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0luZGV4YWJsZVN0cmluZyhvYmpLZXkpICtcbiAgICAgICAgICAgICAgICB0b0luZGV4YWJsZVN0cmluZyhrZXlbb2JqS2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuLy8gY29udmVydCB0aGUgZ2l2ZW4ga2V5IHRvIGEgc3RyaW5nIHRoYXQgd291bGQgYmUgYXBwcm9wcmlhdGVcbi8vIGZvciBsZXhpY2FsIHNvcnRpbmcsIGUuZy4gd2l0aGluIGEgZGF0YWJhc2UsIHdoZXJlIHRoZVxuLy8gc29ydGluZyBpcyB0aGUgc2FtZSBnaXZlbiBieSB0aGUgY29sbGF0ZSgpIGZ1bmN0aW9uLlxuZnVuY3Rpb24gdG9JbmRleGFibGVTdHJpbmcoa2V5KSB7XG4gIHZhciB6ZXJvID0gJ1xcdTAwMDAnO1xuICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcbiAgcmV0dXJuIGNvbGxhdGlvbkluZGV4KGtleSkgKyBTRVAgKyBpbmRleGlmeShrZXkpICsgemVybztcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1iZXIoc3RyLCBpKSB7XG4gIHZhciBvcmlnaW5hbElkeCA9IGk7XG4gIHZhciBudW07XG4gIHZhciB6ZXJvID0gc3RyW2ldID09PSAnMSc7XG4gIGlmICh6ZXJvKSB7XG4gICAgbnVtID0gMDtcbiAgICBpKys7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5lZyA9IHN0cltpXSA9PT0gJzAnO1xuICAgIGkrKztcbiAgICB2YXIgbnVtQXNTdHJpbmcgPSAnJztcbiAgICB2YXIgbWFnQXNTdHJpbmcgPSBzdHIuc3Vic3RyaW5nKGksIGkgKyBNQUdOSVRVREVfRElHSVRTKTtcbiAgICB2YXIgbWFnbml0dWRlID0gcGFyc2VJbnQobWFnQXNTdHJpbmcsIDEwKSArIE1JTl9NQUdOSVRVREU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobmVnKSB7XG4gICAgICBtYWduaXR1ZGUgPSAtbWFnbml0dWRlO1xuICAgIH1cbiAgICBpICs9IE1BR05JVFVERV9ESUdJVFM7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHZhciBjaCA9IHN0cltpXTtcbiAgICAgIGlmIChjaCA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbnVtQXNTdHJpbmcgKz0gY2g7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIG51bUFzU3RyaW5nID0gbnVtQXNTdHJpbmcuc3BsaXQoJy4nKTtcbiAgICBpZiAobnVtQXNTdHJpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgICBudW0gPSBwYXJzZUludChudW1Bc1N0cmluZywgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgbnVtID0gcGFyc2VGbG9hdChudW1Bc1N0cmluZ1swXSArICcuJyArIG51bUFzU3RyaW5nWzFdKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobmVnKSB7XG4gICAgICBudW0gPSBudW0gLSAxMDtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobWFnbml0dWRlICE9PSAwKSB7XG4gICAgICAvLyBwYXJzZUZsb2F0IGlzIG1vcmUgcmVsaWFibGUgdGhhbiBwb3cgZHVlIHRvIHJvdW5kaW5nIGVycm9yc1xuICAgICAgLy8gZS5nLiBOdW1iZXIuTUFYX1ZBTFVFIHdvdWxkIHJldHVybiBJbmZpbml0eSBpZiB3ZSBkaWRcbiAgICAgIC8vIG51bSAqIE1hdGgucG93KDEwLCBtYWduaXR1ZGUpO1xuICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0gKyAnZScgKyBtYWduaXR1ZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge251bTogbnVtLCBsZW5ndGggOiBpIC0gb3JpZ2luYWxJZHh9O1xufVxuXG4vLyBtb3ZlIHVwIHRoZSBzdGFjayB3aGlsZSBwYXJzaW5nXG4vLyB0aGlzIGZ1bmN0aW9uIG1vdmVkIG91dHNpZGUgb2YgcGFyc2VJbmRleGFibGVTdHJpbmcgZm9yIHBlcmZvcm1hbmNlXG5mdW5jdGlvbiBwb3Aoc3RhY2ssIG1ldGFTdGFjaykge1xuICB2YXIgb2JqID0gc3RhY2sucG9wKCk7XG5cbiAgaWYgKG1ldGFTdGFjay5sZW5ndGgpIHtcbiAgICB2YXIgbGFzdE1ldGFFbGVtZW50ID0gbWV0YVN0YWNrW21ldGFTdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAob2JqID09PSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudCkge1xuICAgICAgLy8gcG9wcGluZyBhIG1ldGEtZWxlbWVudCwgZS5nLiBhbiBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgYW5vdGhlciBvYmplY3RcbiAgICAgIG1ldGFTdGFjay5wb3AoKTtcbiAgICAgIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIHZhciBlbGVtZW50ID0gbGFzdE1ldGFFbGVtZW50LmVsZW1lbnQ7XG4gICAgdmFyIGxhc3RFbGVtZW50SW5kZXggPSBsYXN0TWV0YUVsZW1lbnQuaW5kZXg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQucHVzaChvYmopO1xuICAgIH0gZWxzZSBpZiAobGFzdEVsZW1lbnRJbmRleCA9PT0gc3RhY2subGVuZ3RoIC0gMikgeyAvLyBvYmogd2l0aCBrZXkrdmFsdWVcbiAgICAgIHZhciBrZXkgPSBzdGFjay5wb3AoKTtcbiAgICAgIGVsZW1lbnRba2V5XSA9IG9iajtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhY2sucHVzaChvYmopOyAvLyBvYmogd2l0aCBrZXkgb25seVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUluZGV4YWJsZVN0cmluZyhzdHIpIHtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBtZXRhU3RhY2sgPSBbXTsgLy8gc3RhY2sgZm9yIGFycmF5cyBhbmQgb2JqZWN0c1xuICB2YXIgaSA9IDA7XG5cbiAgLyplc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiBbXCJlcnJvclwiLCB7IFwiY2hlY2tMb29wc1wiOiBmYWxzZSB9XSovXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIGNvbGxhdGlvbkluZGV4ID0gc3RyW2krK107XG4gICAgaWYgKGNvbGxhdGlvbkluZGV4ID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9wKHN0YWNrLCBtZXRhU3RhY2spO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoIChjb2xsYXRpb25JbmRleCkge1xuICAgICAgY2FzZSAnMSc6XG4gICAgICAgIHN0YWNrLnB1c2gobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMic6XG4gICAgICAgIHN0YWNrLnB1c2goc3RyW2ldID09PSAnMScpO1xuICAgICAgICBpKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMyc6XG4gICAgICAgIHZhciBwYXJzZWROdW0gPSBwYXJzZU51bWJlcihzdHIsIGkpO1xuICAgICAgICBzdGFjay5wdXNoKHBhcnNlZE51bS5udW0pO1xuICAgICAgICBpICs9IHBhcnNlZE51bS5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnNCc6XG4gICAgICAgIHZhciBwYXJzZWRTdHIgPSAnJztcbiAgICAgICAgLyplc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiBbXCJlcnJvclwiLCB7IFwiY2hlY2tMb29wc1wiOiBmYWxzZSB9XSovXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdmFyIGNoID0gc3RyW2ldO1xuICAgICAgICAgIGlmIChjaCA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyc2VkU3RyICs9IGNoO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBwZXJmb3JtIHRoZSByZXZlcnNlIG9mIHRoZSBvcmRlci1wcmVzZXJ2aW5nIHJlcGxhY2VtZW50XG4gICAgICAgIC8vIGFsZ29yaXRobSAoc2VlIGFib3ZlKVxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHBhcnNlZFN0ciA9IHBhcnNlZFN0ci5yZXBsYWNlKC9cXHUwMDAxXFx1MDAwMS9nLCAnXFx1MDAwMCcpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDFcXHUwMDAyL2csICdcXHUwMDAxJylcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMlxcdTAwMDIvZywgJ1xcdTAwMDInKTtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHN0YWNrLnB1c2gocGFyc2VkU3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc1JzpcbiAgICAgICAgdmFyIGFycmF5RWxlbWVudCA9IHsgZWxlbWVudDogW10sIGluZGV4OiBzdGFjay5sZW5ndGggfTtcbiAgICAgICAgc3RhY2sucHVzaChhcnJheUVsZW1lbnQuZWxlbWVudCk7XG4gICAgICAgIG1ldGFTdGFjay5wdXNoKGFycmF5RWxlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnNic6XG4gICAgICAgIHZhciBvYmpFbGVtZW50ID0geyBlbGVtZW50OiB7fSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKG9iakVsZW1lbnQuZWxlbWVudCk7XG4gICAgICAgIG1ldGFTdGFjay5wdXNoKG9iakVsZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2JhZCBjb2xsYXRpb25JbmRleCBvciB1bmV4cGVjdGVkbHkgcmVhY2hlZCBlbmQgb2YgaW5wdXQ6ICcgK1xuICAgICAgICAgICAgY29sbGF0aW9uSW5kZXgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcnJheUNvbGxhdGUoYSwgYikge1xuICB2YXIgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBzb3J0ID0gY29sbGF0ZShhW2ldLCBiW2ldKTtcbiAgICBpZiAoc29ydCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAoYS5sZW5ndGggPT09IGIubGVuZ3RoKSA/IDAgOlxuICAgIChhLmxlbmd0aCA+IGIubGVuZ3RoKSA/IDEgOiAtMTtcbn1cbmZ1bmN0aW9uIHN0cmluZ0NvbGxhdGUoYSwgYikge1xuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYWxlaGFydmV5L3BvdWNoZGIvaXNzdWVzLzQwXG4gIC8vIFRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENvdWNoREIgaW1wbGVtZW50YXRpb24sIGJ1dCBpdHMgdGhlXG4gIC8vIGJlc3Qgd2UgY2FuIGRvIGZvciBub3dcbiAgcmV0dXJuIChhID09PSBiKSA/IDAgOiAoKGEgPiBiKSA/IDEgOiAtMSk7XG59XG5mdW5jdGlvbiBvYmplY3RDb2xsYXRlKGEsIGIpIHtcbiAgdmFyIGFrID0gT2JqZWN0LmtleXMoYSksIGJrID0gT2JqZWN0LmtleXMoYik7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihhay5sZW5ndGgsIGJrLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAvLyBGaXJzdCBzb3J0IHRoZSBrZXlzXG4gICAgdmFyIHNvcnQgPSBjb2xsYXRlKGFrW2ldLCBia1tpXSk7XG4gICAgaWYgKHNvcnQgIT09IDApIHtcbiAgICAgIHJldHVybiBzb3J0O1xuICAgIH1cbiAgICAvLyBpZiB0aGUga2V5cyBhcmUgZXF1YWwgc29ydCB0aGUgdmFsdWVzXG4gICAgc29ydCA9IGNvbGxhdGUoYVtha1tpXV0sIGJbYmtbaV1dKTtcbiAgICBpZiAoc29ydCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuXG4gIH1cbiAgcmV0dXJuIChhay5sZW5ndGggPT09IGJrLmxlbmd0aCkgPyAwIDpcbiAgICAoYWsubGVuZ3RoID4gYmsubGVuZ3RoKSA/IDEgOiAtMTtcbn1cbi8vIFRoZSBjb2xsYXRpb24gaXMgZGVmaW5lZCBieSBlcmxhbmdzIG9yZGVyZWQgdGVybXNcbi8vIHRoZSBhdG9tcyBudWxsLCB0cnVlLCBmYWxzZSBjb21lIGZpcnN0LCB0aGVuIG51bWJlcnMsIHN0cmluZ3MsXG4vLyBhcnJheXMsIHRoZW4gb2JqZWN0c1xuLy8gbnVsbC91bmRlZmluZWQvTmFOL0luZmluaXR5Ly1JbmZpbml0eSBhcmUgYWxsIGNvbnNpZGVyZWQgbnVsbFxuZnVuY3Rpb24gY29sbGF0aW9uSW5kZXgoeCkge1xuICB2YXIgaWQgPSBbJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ3N0cmluZycsICdvYmplY3QnXTtcbiAgdmFyIGlkeCA9IGlkLmluZGV4T2YodHlwZW9mIHgpO1xuICAvL2ZhbHNlIGlmIC0xIG90aGVyd2lzZSB0cnVlLCBidXQgZmFzdCEhISExXG4gIGlmICh+aWR4KSB7XG4gICAgaWYgKHggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgcmV0dXJuIDU7XG4gICAgfVxuICAgIHJldHVybiBpZHggPCAzID8gKGlkeCArIDIpIDogKGlkeCArIDMpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIDU7XG4gIH1cbn1cblxuLy8gY29udmVyc2lvbjpcbi8vIHggeXl5IHp6Li4uenpcbi8vIHggPSAwIGZvciBuZWdhdGl2ZSwgMSBmb3IgMCwgMiBmb3IgcG9zaXRpdmVcbi8vIHkgPSBleHBvbmVudCAoZm9yIG5lZ2F0aXZlIG51bWJlcnMgbmVnYXRlZCkgbW92ZWQgc28gdGhhdCBpdCdzID49IDBcbi8vIHogPSBtYW50aXNzZVxuZnVuY3Rpb24gbnVtVG9JbmRleGFibGVTdHJpbmcobnVtKSB7XG5cbiAgaWYgKG51bSA9PT0gMCkge1xuICAgIHJldHVybiAnMSc7XG4gIH1cblxuICAvLyBjb252ZXJ0IG51bWJlciB0byBleHBvbmVudGlhbCBmb3JtYXQgZm9yIGVhc2llciBhbmRcbiAgLy8gbW9yZSBzdWNjaW5jdCBzdHJpbmcgc29ydGluZ1xuICB2YXIgZXhwRm9ybWF0ID0gbnVtLnRvRXhwb25lbnRpYWwoKS5zcGxpdCgvZVxcKz8vKTtcbiAgdmFyIG1hZ25pdHVkZSA9IHBhcnNlSW50KGV4cEZvcm1hdFsxXSwgMTApO1xuXG4gIHZhciBuZWcgPSBudW0gPCAwO1xuXG4gIHZhciByZXN1bHQgPSBuZWcgPyAnMCcgOiAnMic7XG5cbiAgLy8gZmlyc3Qgc29ydCBieSBtYWduaXR1ZGVcbiAgLy8gaXQncyBlYXNpZXIgaWYgYWxsIG1hZ25pdHVkZXMgYXJlIHBvc2l0aXZlXG4gIHZhciBtYWdGb3JDb21wYXJpc29uID0gKChuZWcgPyAtbWFnbml0dWRlIDogbWFnbml0dWRlKSAtIE1JTl9NQUdOSVRVREUpO1xuICB2YXIgbWFnU3RyaW5nID0gcGFkTGVmdCgobWFnRm9yQ29tcGFyaXNvbikudG9TdHJpbmcoKSwgJzAnLCBNQUdOSVRVREVfRElHSVRTKTtcblxuICByZXN1bHQgKz0gU0VQICsgbWFnU3RyaW5nO1xuXG4gIC8vIHRoZW4gc29ydCBieSB0aGUgZmFjdG9yXG4gIHZhciBmYWN0b3IgPSBNYXRoLmFicyhwYXJzZUZsb2F0KGV4cEZvcm1hdFswXSkpOyAvLyBbMS4uMTApXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChuZWcpIHsgLy8gZm9yIG5lZ2F0aXZlIHJldmVyc2Ugb3JkZXJpbmdcbiAgICBmYWN0b3IgPSAxMCAtIGZhY3RvcjtcbiAgfVxuXG4gIHZhciBmYWN0b3JTdHIgPSBmYWN0b3IudG9GaXhlZCgyMCk7XG5cbiAgLy8gc3RyaXAgemVyb3MgZnJvbSB0aGUgZW5kXG4gIGZhY3RvclN0ciA9IGZhY3RvclN0ci5yZXBsYWNlKC9cXC4/MCskLywgJycpO1xuXG4gIHJlc3VsdCArPSBTRVAgKyBmYWN0b3JTdHI7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gY3JlYXRlIGEgY29tcGFyYXRvciBiYXNlZCBvbiB0aGUgc29ydCBvYmplY3RcbmZ1bmN0aW9uIGNyZWF0ZUZpZWxkU29ydGVyKHNvcnQpIHtcblxuICBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoZG9jKSB7XG4gICAgcmV0dXJuIHNvcnQubWFwKGZ1bmN0aW9uIChzb3J0aW5nKSB7XG4gICAgICB2YXIgZmllbGROYW1lID0gZ2V0S2V5KHNvcnRpbmcpO1xuICAgICAgdmFyIHBhcnNlZEZpZWxkID0gcGFyc2VGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgdmFyIGRvY0ZpZWxkVmFsdWUgPSBnZXRGaWVsZEZyb21Eb2MoZG9jLCBwYXJzZWRGaWVsZCk7XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoYVJvdywgYlJvdykge1xuICAgIHZhciBhRmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoYVJvdy5kb2MpO1xuICAgIHZhciBiRmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoYlJvdy5kb2MpO1xuICAgIHZhciBjb2xsYXRpb24gPSBjb2xsYXRlKGFGaWVsZFZhbHVlcywgYkZpZWxkVmFsdWVzKTtcbiAgICBpZiAoY29sbGF0aW9uICE9PSAwKSB7XG4gICAgICByZXR1cm4gY29sbGF0aW9uO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHdoYXQgbWFuZ28gc2VlbXMgdG8gZG9cbiAgICByZXR1cm4gY29tcGFyZSQxKGFSb3cuZG9jLl9pZCwgYlJvdy5kb2MuX2lkKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmlsdGVySW5NZW1vcnlGaWVsZHMocm93cywgcmVxdWVzdERlZiwgaW5NZW1vcnlGaWVsZHMpIHtcbiAgcm93cyA9IHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICByZXR1cm4gcm93RmlsdGVyKHJvdy5kb2MsIHJlcXVlc3REZWYuc2VsZWN0b3IsIGluTWVtb3J5RmllbGRzKTtcbiAgfSk7XG5cbiAgaWYgKHJlcXVlc3REZWYuc29ydCkge1xuICAgIC8vIGluLW1lbW9yeSBzb3J0XG4gICAgdmFyIGZpZWxkU29ydGVyID0gY3JlYXRlRmllbGRTb3J0ZXIocmVxdWVzdERlZi5zb3J0KTtcbiAgICByb3dzID0gcm93cy5zb3J0KGZpZWxkU29ydGVyKTtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3REZWYuc29ydFswXSAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgZ2V0VmFsdWUocmVxdWVzdERlZi5zb3J0WzBdKSA9PT0gJ2Rlc2MnKSB7XG4gICAgICByb3dzID0gcm93cy5yZXZlcnNlKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCdsaW1pdCcgaW4gcmVxdWVzdERlZiB8fCAnc2tpcCcgaW4gcmVxdWVzdERlZikge1xuICAgIC8vIGhhdmUgdG8gZG8gdGhlIGxpbWl0IGluLW1lbW9yeVxuICAgIHZhciBza2lwID0gcmVxdWVzdERlZi5za2lwIHx8IDA7XG4gICAgdmFyIGxpbWl0ID0gKCdsaW1pdCcgaW4gcmVxdWVzdERlZiA/IHJlcXVlc3REZWYubGltaXQgOiByb3dzLmxlbmd0aCkgKyBza2lwO1xuICAgIHJvd3MgPSByb3dzLnNsaWNlKHNraXAsIGxpbWl0KTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gcm93RmlsdGVyKGRvYywgc2VsZWN0b3IsIGluTWVtb3J5RmllbGRzKSB7XG4gIHJldHVybiBpbk1lbW9yeUZpZWxkcy5ldmVyeShmdW5jdGlvbiAoZmllbGQpIHtcbiAgICB2YXIgbWF0Y2hlciA9IHNlbGVjdG9yW2ZpZWxkXTtcbiAgICB2YXIgcGFyc2VkRmllbGQgPSBwYXJzZUZpZWxkKGZpZWxkKTtcbiAgICB2YXIgZG9jRmllbGRWYWx1ZSA9IGdldEZpZWxkRnJvbURvYyhkb2MsIHBhcnNlZEZpZWxkKTtcbiAgICBpZiAoaXNDb21iaW5hdGlvbmFsRmllbGQoZmllbGQpKSB7XG4gICAgICByZXR1cm4gbWF0Y2hDb21pbmF0aW9uYWxTZWxlY3RvcihmaWVsZCwgbWF0Y2hlciwgZG9jKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hTZWxlY3RvcihtYXRjaGVyLCBkb2MsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoU2VsZWN0b3IobWF0Y2hlciwgZG9jLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICBpZiAoIW1hdGNoZXIpIHtcbiAgICAvLyBubyBmaWx0ZXJpbmcgbmVjZXNzYXJ5OyB0aGlzIGZpZWxkIGlzIGp1c3QgbmVlZGVkIGZvciBzb3J0aW5nXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBpcyBtYXRjaGVyIGFuIG9iamVjdCwgaWYgc28gY29udGludWUgcmVjdXJzaW9uXG4gIGlmICh0eXBlb2YgbWF0Y2hlciA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWF0Y2hlcikuZXZlcnkoZnVuY3Rpb24gKG1heWJlVXNlck9wZXJhdG9yKSB7XG4gICAgICB2YXIgdXNlclZhbHVlID0gbWF0Y2hlclsgbWF5YmVVc2VyT3BlcmF0b3IgXTtcbiAgICAgIC8vIGV4cGxpY2l0IG9wZXJhdG9yXG4gICAgICBpZiAobWF5YmVVc2VyT3BlcmF0b3IuaW5kZXhPZihcIiRcIikgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoKG1heWJlVXNlck9wZXJhdG9yLCBkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHN1YlBhcnNlZEZpZWxkID0gcGFyc2VGaWVsZChtYXliZVVzZXJPcGVyYXRvcik7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRvY0ZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHR5cGVvZiB1c2VyVmFsdWUgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBzdWJQYXJzZWRGaWVsZC5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIG9yIGdldEZpZWxkRnJvbURvYyB3aWxsIHRocm93XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN1YkRvY0ZpZWxkVmFsdWUgPSBnZXRGaWVsZEZyb21Eb2MoZG9jRmllbGRWYWx1ZSwgc3ViUGFyc2VkRmllbGQpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdXNlclZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gZmllbGQgdmFsdWUgaXMgYW4gb2JqZWN0IHRoYXQgbWlnaHQgY29udGFpbiBtb3JlIG9wZXJhdG9yc1xuICAgICAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgc3ViRG9jRmllbGRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbXBsaWNpdCBvcGVyYXRvclxuICAgICAgICByZXR1cm4gbWF0Y2goXCIkZXFcIiwgZG9jLCB1c2VyVmFsdWUsIHN1YlBhcnNlZEZpZWxkLCBzdWJEb2NGaWVsZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIG5vIG1vcmUgZGVwdGgsIE5vIG5lZWQgdG8gcmVjdXJzZSBmdXJ0aGVyXG4gIHJldHVybiBtYXRjaGVyID09PSBkb2NGaWVsZFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtYXRjaENvbWluYXRpb25hbFNlbGVjdG9yKGZpZWxkLCBtYXRjaGVyLCBkb2MpIHtcblxuICBpZiAoZmllbGQgPT09ICckb3InKSB7XG4gICAgcmV0dXJuIG1hdGNoZXIuc29tZShmdW5jdGlvbiAob3JNYXRjaGVycykge1xuICAgICAgcmV0dXJuIHJvd0ZpbHRlcihkb2MsIG9yTWF0Y2hlcnMsIE9iamVjdC5rZXlzKG9yTWF0Y2hlcnMpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChmaWVsZCA9PT0gJyRub3QnKSB7XG4gICAgcmV0dXJuICFyb3dGaWx0ZXIoZG9jLCBtYXRjaGVyLCBPYmplY3Qua2V5cyhtYXRjaGVyKSk7XG4gIH1cblxuICAvL2Akbm9yYFxuICByZXR1cm4gIW1hdGNoZXIuZmluZChmdW5jdGlvbiAob3JNYXRjaGVycykge1xuICAgIHJldHVybiByb3dGaWx0ZXIoZG9jLCBvck1hdGNoZXJzLCBPYmplY3Qua2V5cyhvck1hdGNoZXJzKSk7XG4gIH0pO1xuXG59XG5cbmZ1bmN0aW9uIG1hdGNoKHVzZXJPcGVyYXRvciwgZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gIGlmICghbWF0Y2hlcnNbdXNlck9wZXJhdG9yXSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIG9wZXJhdG9yIFwiJyArIHVzZXJPcGVyYXRvciArXG4gICAgICAnXCIgLSBzaG91bGQgYmUgb25lIG9mICRlcSwgJGx0ZSwgJGx0LCAkZ3QsICRndGUsICRleGlzdHMsICRuZSwgJGluLCAnICtcbiAgICAgICckbmluLCAkc2l6ZSwgJG1vZCwgJHJlZ2V4LCAkZWxlbU1hdGNoLCAkdHlwZSwgJGFsbE1hdGNoIG9yICRhbGwnKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlcnNbdXNlck9wZXJhdG9yXShkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgZG9jRmllbGRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jRmllbGRWYWx1ZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgZG9jRmllbGRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIG1vZEZpZWxkKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICBpZiAodHlwZW9mIGRvY0ZpZWxkVmFsdWUgIT09IFwibnVtYmVyXCIgfHxcbiAgICBwYXJzZUludChkb2NGaWVsZFZhbHVlLCAxMCkgIT09IGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZGl2aXNvciA9IHVzZXJWYWx1ZVswXTtcbiAgdmFyIG1vZCA9IHVzZXJWYWx1ZVsxXTtcblxuICByZXR1cm4gZG9jRmllbGRWYWx1ZSAlIGRpdmlzb3IgPT09IG1vZDtcbn1cblxuZnVuY3Rpb24gYXJyYXlDb250YWluc1ZhbHVlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICByZXR1cm4gdXNlclZhbHVlLnNvbWUoZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmIChkb2NGaWVsZFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLnNvbWUoZnVuY3Rpb24gKGRvY0ZpZWxkVmFsdWVJdGVtKSB7XG4gICAgICAgIHJldHVybiBjb2xsYXRlKHZhbCwgZG9jRmllbGRWYWx1ZUl0ZW0pID09PSAwO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbGxhdGUodmFsLCBkb2NGaWVsZFZhbHVlKSA9PT0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q29udGFpbnNBbGxWYWx1ZXMoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIHJldHVybiB1c2VyVmFsdWUuZXZlcnkoZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLnNvbWUoZnVuY3Rpb24gKGRvY0ZpZWxkVmFsdWVJdGVtKSB7XG4gICAgICByZXR1cm4gY29sbGF0ZSh2YWwsIGRvY0ZpZWxkVmFsdWVJdGVtKSA9PT0gMDtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFycmF5U2l6ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIHtcbiAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUubGVuZ3RoID09PSB1c2VyVmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlZ2V4TWF0Y2goZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIHZhciByZSA9IG5ldyBSZWdFeHAodXNlclZhbHVlKTtcblxuICByZXR1cm4gcmUudGVzdChkb2NGaWVsZFZhbHVlKTtcbn1cblxuZnVuY3Rpb24gdHlwZU1hdGNoKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuXG4gIHN3aXRjaCAodXNlclZhbHVlKSB7XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZSA9PT0gbnVsbDtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB0eXBlb2YgKGRvY0ZpZWxkVmFsdWUpID09PSAnYm9vbGVhbic7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiB0eXBlb2YgKGRvY0ZpZWxkVmFsdWUpID09PSAnbnVtYmVyJztcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHR5cGVvZiAoZG9jRmllbGRWYWx1ZSkgPT09ICdzdHJpbmcnO1xuICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlIGluc3RhbmNlb2YgQXJyYXk7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHJldHVybiAoe30pLnRvU3RyaW5nLmNhbGwoZG9jRmllbGRWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuICB9XG59XG5cbnZhciBtYXRjaGVycyA9IHtcblxuICAnJGVsZW1NYXRjaCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZG9jRmllbGRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZG9jRmllbGRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRvY0ZpZWxkVmFsdWVbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHJvd0ZpbHRlcih2YWwsIHVzZXJWYWx1ZSwgT2JqZWN0LmtleXModXNlclZhbHVlKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgdmFsKTtcbiAgICB9KTtcbiAgfSxcblxuICAnJGFsbE1hdGNoJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkb2NGaWVsZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKGRvY0ZpZWxkVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkb2NGaWVsZFZhbHVlWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUuZXZlcnkoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gcm93RmlsdGVyKHZhbCwgdXNlclZhbHVlLCBPYmplY3Qua2V5cyh1c2VyVmFsdWUpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLmV2ZXJ5KGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgdmFsKTtcbiAgICB9KTtcbiAgfSxcblxuICAnJGVxJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA9PT0gMDtcbiAgfSxcblxuICAnJGd0ZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPj0gMDtcbiAgfSxcblxuICAnJGd0JzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA+IDA7XG4gIH0sXG5cbiAgJyRsdGUnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSkgJiYgY29sbGF0ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIDw9IDA7XG4gIH0sXG5cbiAgJyRsdCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPCAwO1xuICB9LFxuXG4gICckZXhpc3RzJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIC8vYSBmaWVsZCB0aGF0IGlzIG51bGwgaXMgc3RpbGwgY29uc2lkZXJlZCB0byBleGlzdFxuICAgIGlmICh1c2VyVmFsdWUpIHtcbiAgICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiAhZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKTtcbiAgfSxcblxuICAnJG1vZCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiYgbW9kRmllbGQoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJG5lJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiB1c2VyVmFsdWUuZXZlcnkoZnVuY3Rpb24gKG5lVmFsdWUpIHtcbiAgICAgIHJldHVybiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIG5lVmFsdWUpICE9PSAwO1xuICAgIH0pO1xuICB9LFxuICAnJGluJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJiBhcnJheUNvbnRhaW5zVmFsdWUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJG5pbic6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiYgIWFycmF5Q29udGFpbnNWYWx1ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckc2l6ZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoZG9jRmllbGRWYWx1ZSkgJiZcbiAgICAgIGFycmF5U2l6ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckYWxsJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRvY0ZpZWxkVmFsdWUpICYmIGFycmF5Q29udGFpbnNBbGxWYWx1ZXMoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJHJlZ2V4JzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJlxuICAgICAgdHlwZW9mIGRvY0ZpZWxkVmFsdWUgPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgdXNlclZhbHVlLmV2ZXJ5KGZ1bmN0aW9uIChyZWdleFZhbHVlKSB7XG4gICAgICAgIHJldHVybiByZWdleE1hdGNoKGRvY0ZpZWxkVmFsdWUsIHJlZ2V4VmFsdWUpO1xuICAgICAgfSk7XG4gIH0sXG5cbiAgJyR0eXBlJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiB0eXBlTWF0Y2goZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfVxufTtcblxuLy8gcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGRvYyBtYXRjaGVzIHRoZSBzdXBwbGllZCBzZWxlY3RvclxuZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yKGRvYywgc2VsZWN0b3IpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICdvYmplY3QnKSB7XG4gICAgLy8gbWF0Y2ggdGhlIENvdWNoREIgZXJyb3IgbWVzc2FnZVxuICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0b3IgZXJyb3I6IGV4cGVjdGVkIGEgSlNPTiBvYmplY3QnKTtcbiAgfVxuXG4gIHNlbGVjdG9yID0gbWFzc2FnZVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgdmFyIHJvdyA9IHtcbiAgICAnZG9jJzogZG9jXG4gIH07XG5cbiAgdmFyIHJvd3NNYXRjaGVkID0gZmlsdGVySW5NZW1vcnlGaWVsZHMoW3Jvd10sIHsgJ3NlbGVjdG9yJzogc2VsZWN0b3IgfSwgT2JqZWN0LmtleXMoc2VsZWN0b3IpKTtcbiAgcmV0dXJuIHJvd3NNYXRjaGVkICYmIHJvd3NNYXRjaGVkLmxlbmd0aCA9PT0gMTtcbn1cblxuZnVuY3Rpb24gZXZhbEZpbHRlcihpbnB1dCkge1xuICByZXR1cm4gc2NvcGVFdmFsKCdcInVzZSBzdHJpY3RcIjtcXG5yZXR1cm4gJyArIGlucHV0ICsgJzsnLCB7fSk7XG59XG5cbmZ1bmN0aW9uIGV2YWxWaWV3KGlucHV0KSB7XG4gIHZhciBjb2RlID0gW1xuICAgICdyZXR1cm4gZnVuY3Rpb24oZG9jKSB7JyxcbiAgICAnICBcInVzZSBzdHJpY3RcIjsnLFxuICAgICcgIHZhciBlbWl0dGVkID0gZmFsc2U7JyxcbiAgICAnICB2YXIgZW1pdCA9IGZ1bmN0aW9uIChhLCBiKSB7JyxcbiAgICAnICAgIGVtaXR0ZWQgPSB0cnVlOycsXG4gICAgJyAgfTsnLFxuICAgICcgIHZhciB2aWV3ID0gJyArIGlucHV0ICsgJzsnLFxuICAgICcgIHZpZXcoZG9jKTsnLFxuICAgICcgIGlmIChlbWl0dGVkKSB7JyxcbiAgICAnICAgIHJldHVybiB0cnVlOycsXG4gICAgJyAgfScsXG4gICAgJ307J1xuICBdLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBzY29wZUV2YWwoY29kZSwge30pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZShvcHRzLCBjYWxsYmFjaykge1xuICBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgIGlmIChvcHRzLmZpbHRlciAmJiBvcHRzLmZpbHRlciAhPT0gJ19zZWxlY3RvcicpIHtcbiAgICAgIHZhciBmaWx0ZXJOYW1lID0gdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnc3RyaW5nJyA/XG4gICAgICAgIG9wdHMuZmlsdGVyIDogJ2Z1bmN0aW9uJztcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ3NlbGVjdG9yIGludmFsaWQgZm9yIGZpbHRlciBcIicgKyBmaWx0ZXJOYW1lICsgJ1wiJykpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjaygpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUob3B0cykge1xuICBpZiAob3B0cy52aWV3ICYmICFvcHRzLmZpbHRlcikge1xuICAgIG9wdHMuZmlsdGVyID0gJ192aWV3JztcbiAgfVxuXG4gIGlmIChvcHRzLnNlbGVjdG9yICYmICFvcHRzLmZpbHRlcikge1xuICAgIG9wdHMuZmlsdGVyID0gJ19zZWxlY3Rvcic7XG4gIH1cblxuICBpZiAob3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnc3RyaW5nJykge1xuICAgIGlmIChvcHRzLmZpbHRlciA9PT0gJ192aWV3Jykge1xuICAgICAgb3B0cy52aWV3ID0gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMudmlldyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMuZmlsdGVyID0gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMuZmlsdGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkRmlsdGVyKGNoYW5nZXNIYW5kbGVyLCBvcHRzKSB7XG4gIHJldHVybiBvcHRzLmZpbHRlciAmJiB0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdzdHJpbmcnICYmXG4gICAgIW9wdHMuZG9jX2lkcyAmJiAhaXNSZW1vdGUoY2hhbmdlc0hhbmRsZXIuZGIpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXIoY2hhbmdlc0hhbmRsZXIsIG9wdHMpIHtcbiAgdmFyIGNhbGxiYWNrID0gb3B0cy5jb21wbGV0ZTtcbiAgaWYgKG9wdHMuZmlsdGVyID09PSAnX3ZpZXcnKSB7XG4gICAgaWYgKCFvcHRzLnZpZXcgfHwgdHlwZW9mIG9wdHMudmlldyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihCQURfUkVRVUVTVCxcbiAgICAgICAgJ2B2aWV3YCBmaWx0ZXIgcGFyYW1ldGVyIG5vdCBmb3VuZCBvciBpbnZhbGlkLicpO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIC8vIGZldGNoIGEgdmlldyBmcm9tIGEgZGVzaWduIGRvYywgbWFrZSBpdCBiZWhhdmUgbGlrZSBhIGZpbHRlclxuICAgIHZhciB2aWV3TmFtZSA9IHBhcnNlRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMudmlldyk7XG4gICAgY2hhbmdlc0hhbmRsZXIuZGIuZ2V0KCdfZGVzaWduLycgKyB2aWV3TmFtZVswXSwgZnVuY3Rpb24gKGVyciwgZGRvYykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlc0hhbmRsZXIuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpKTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXBGdW4gPSBkZG9jICYmIGRkb2Mudmlld3MgJiYgZGRvYy52aWV3c1t2aWV3TmFtZVsxXV0gJiZcbiAgICAgICAgZGRvYy52aWV3c1t2aWV3TmFtZVsxXV0ubWFwO1xuICAgICAgaWYgKCFtYXBGdW4pIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLFxuICAgICAgICAgIChkZG9jLnZpZXdzID8gJ21pc3NpbmcganNvbiBrZXk6ICcgKyB2aWV3TmFtZVsxXSA6XG4gICAgICAgICAgICAnbWlzc2luZyBqc29uIGtleTogdmlld3MnKSkpO1xuICAgICAgfVxuICAgICAgb3B0cy5maWx0ZXIgPSBldmFsVmlldyhtYXBGdW4pO1xuICAgICAgY2hhbmdlc0hhbmRsZXIuZG9DaGFuZ2VzKG9wdHMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKG9wdHMuc2VsZWN0b3IpIHtcbiAgICBvcHRzLmZpbHRlciA9IGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgIHJldHVybiBtYXRjaGVzU2VsZWN0b3IoZG9jLCBvcHRzLnNlbGVjdG9yKTtcbiAgICB9O1xuICAgIGNoYW5nZXNIYW5kbGVyLmRvQ2hhbmdlcyhvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBmZXRjaCBhIGZpbHRlciBmcm9tIGEgZGVzaWduIGRvY1xuICAgIHZhciBmaWx0ZXJOYW1lID0gcGFyc2VEZXNpZ25Eb2NGdW5jdGlvbk5hbWUob3B0cy5maWx0ZXIpO1xuICAgIGNoYW5nZXNIYW5kbGVyLmRiLmdldCgnX2Rlc2lnbi8nICsgZmlsdGVyTmFtZVswXSwgZnVuY3Rpb24gKGVyciwgZGRvYykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlc0hhbmRsZXIuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpKTtcbiAgICAgIH1cbiAgICAgIHZhciBmaWx0ZXJGdW4gPSBkZG9jICYmIGRkb2MuZmlsdGVycyAmJiBkZG9jLmZpbHRlcnNbZmlsdGVyTmFtZVsxXV07XG4gICAgICBpZiAoIWZpbHRlckZ1bikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsXG4gICAgICAgICAgKChkZG9jICYmIGRkb2MuZmlsdGVycykgPyAnbWlzc2luZyBqc29uIGtleTogJyArIGZpbHRlck5hbWVbMV1cbiAgICAgICAgICAgIDogJ21pc3NpbmcganNvbiBrZXk6IGZpbHRlcnMnKSkpO1xuICAgICAgfVxuICAgICAgb3B0cy5maWx0ZXIgPSBldmFsRmlsdGVyKGZpbHRlckZ1bik7XG4gICAgICBjaGFuZ2VzSGFuZGxlci5kb0NoYW5nZXMob3B0cyk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlDaGFuZ2VzRmlsdGVyUGx1Z2luKFBvdWNoREIpIHtcbiAgUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbiA9IHtcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgbm9ybWFsaXplOiBub3JtYWxpemUsXG4gICAgc2hvdWxkRmlsdGVyOiBzaG91bGRGaWx0ZXIsXG4gICAgZmlsdGVyOiBmaWx0ZXJcbiAgfTtcbn1cblxuLy8gVE9ETzogcmVtb3ZlIGZyb20gcG91Y2hkYi1jb3JlIChicmVha2luZylcblBvdWNoREIucGx1Z2luKGFwcGx5Q2hhbmdlc0ZpbHRlclBsdWdpbik7XG5cblBvdWNoREIudmVyc2lvbiA9IHZlcnNpb247XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KGFycmF5KSB7XG4gIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgaXRlbSkge1xuICAgIG9ialtpdGVtXSA9IHRydWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufVxuLy8gTGlzdCBvZiB0b3AgbGV2ZWwgcmVzZXJ2ZWQgd29yZHMgZm9yIGRvY1xudmFyIHJlc2VydmVkV29yZHMgPSB0b09iamVjdChbXG4gICdfaWQnLFxuICAnX3JldicsXG4gICdfYWNjZXNzJyxcbiAgJ19hdHRhY2htZW50cycsXG4gICdfZGVsZXRlZCcsXG4gICdfcmV2aXNpb25zJyxcbiAgJ19yZXZzX2luZm8nLFxuICAnX2NvbmZsaWN0cycsXG4gICdfZGVsZXRlZF9jb25mbGljdHMnLFxuICAnX2xvY2FsX3NlcScsXG4gICdfcmV2X3RyZWUnLFxuICAvLyByZXBsaWNhdGlvbiBkb2N1bWVudHNcbiAgJ19yZXBsaWNhdGlvbl9pZCcsXG4gICdfcmVwbGljYXRpb25fc3RhdGUnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlX3RpbWUnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlX3JlYXNvbicsXG4gICdfcmVwbGljYXRpb25fc3RhdHMnLFxuICAvLyBTcGVjaWZpYyB0byBDb3VjaGJhc2UgU3luYyBHYXRld2F5XG4gICdfcmVtb3ZlZCdcbl0pO1xuXG4vLyBMaXN0IG9mIHJlc2VydmVkIHdvcmRzIHRoYXQgc2hvdWxkIGVuZCB1cCBpbiB0aGUgZG9jdW1lbnRcbnZhciBkYXRhV29yZHMgPSB0b09iamVjdChbXG4gICdfYWNjZXNzJyxcbiAgJ19hdHRhY2htZW50cycsXG4gIC8vIHJlcGxpY2F0aW9uIGRvY3VtZW50c1xuICAnX3JlcGxpY2F0aW9uX2lkJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0ZScsXG4gICdfcmVwbGljYXRpb25fc3RhdGVfdGltZScsXG4gICdfcmVwbGljYXRpb25fc3RhdGVfcmVhc29uJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0cydcbl0pO1xuXG5mdW5jdGlvbiBwYXJzZVJldmlzaW9uSW5mbyhyZXYpIHtcbiAgaWYgKCEvXlxcZCstLy50ZXN0KHJldikpIHtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3IoSU5WQUxJRF9SRVYpO1xuICB9XG4gIHZhciBpZHggPSByZXYuaW5kZXhPZignLScpO1xuICB2YXIgbGVmdCA9IHJldi5zdWJzdHJpbmcoMCwgaWR4KTtcbiAgdmFyIHJpZ2h0ID0gcmV2LnN1YnN0cmluZyhpZHggKyAxKTtcbiAgcmV0dXJuIHtcbiAgICBwcmVmaXg6IHBhcnNlSW50KGxlZnQsIDEwKSxcbiAgICBpZDogcmlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWFrZVJldlRyZWVGcm9tUmV2aXNpb25zKHJldmlzaW9ucywgb3B0cykge1xuICB2YXIgcG9zID0gcmV2aXNpb25zLnN0YXJ0IC0gcmV2aXNpb25zLmlkcy5sZW5ndGggKyAxO1xuXG4gIHZhciByZXZpc2lvbklkcyA9IHJldmlzaW9ucy5pZHM7XG4gIHZhciBpZHMgPSBbcmV2aXNpb25JZHNbMF0sIG9wdHMsIFtdXTtcblxuICBmb3IgKHZhciBpID0gMSwgbGVuID0gcmV2aXNpb25JZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZHMgPSBbcmV2aXNpb25JZHNbaV0sIHtzdGF0dXM6ICdtaXNzaW5nJ30sIFtpZHNdXTtcbiAgfVxuXG4gIHJldHVybiBbe1xuICAgIHBvczogcG9zLFxuICAgIGlkczogaWRzXG4gIH1dO1xufVxuXG4vLyBQcmVwcm9jZXNzIGRvY3VtZW50cywgcGFyc2UgdGhlaXIgcmV2aXNpb25zLCBhc3NpZ24gYW4gaWQgYW5kIGFcbi8vIHJldmlzaW9uIGZvciBuZXcgd3JpdGVzIHRoYXQgYXJlIG1pc3NpbmcgdGhlbSwgZXRjXG5mdW5jdGlvbiBwYXJzZURvYyhkb2MsIG5ld0VkaXRzLCBkYk9wdHMpIHtcbiAgaWYgKCFkYk9wdHMpIHtcbiAgICBkYk9wdHMgPSB7XG4gICAgICBkZXRlcm1pbmlzdGljX3JldnM6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgdmFyIG5SZXZOdW07XG4gIHZhciBuZXdSZXZJZDtcbiAgdmFyIHJldkluZm87XG4gIHZhciBvcHRzID0ge3N0YXR1czogJ2F2YWlsYWJsZSd9O1xuICBpZiAoZG9jLl9kZWxldGVkKSB7XG4gICAgb3B0cy5kZWxldGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChuZXdFZGl0cykge1xuICAgIGlmICghZG9jLl9pZCkge1xuICAgICAgZG9jLl9pZCA9IHV1aWQoKTtcbiAgICB9XG4gICAgbmV3UmV2SWQgPSByZXYkJDEoZG9jLCBkYk9wdHMuZGV0ZXJtaW5pc3RpY19yZXZzKTtcbiAgICBpZiAoZG9jLl9yZXYpIHtcbiAgICAgIHJldkluZm8gPSBwYXJzZVJldmlzaW9uSW5mbyhkb2MuX3Jldik7XG4gICAgICBpZiAocmV2SW5mby5lcnJvcikge1xuICAgICAgICByZXR1cm4gcmV2SW5mbztcbiAgICAgIH1cbiAgICAgIGRvYy5fcmV2X3RyZWUgPSBbe1xuICAgICAgICBwb3M6IHJldkluZm8ucHJlZml4LFxuICAgICAgICBpZHM6IFtyZXZJbmZvLmlkLCB7c3RhdHVzOiAnbWlzc2luZyd9LCBbW25ld1JldklkLCBvcHRzLCBbXV1dXVxuICAgICAgfV07XG4gICAgICBuUmV2TnVtID0gcmV2SW5mby5wcmVmaXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MuX3Jldl90cmVlID0gW3tcbiAgICAgICAgcG9zOiAxLFxuICAgICAgICBpZHMgOiBbbmV3UmV2SWQsIG9wdHMsIFtdXVxuICAgICAgfV07XG4gICAgICBuUmV2TnVtID0gMTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRvYy5fcmV2aXNpb25zKSB7XG4gICAgICBkb2MuX3Jldl90cmVlID0gbWFrZVJldlRyZWVGcm9tUmV2aXNpb25zKGRvYy5fcmV2aXNpb25zLCBvcHRzKTtcbiAgICAgIG5SZXZOdW0gPSBkb2MuX3JldmlzaW9ucy5zdGFydDtcbiAgICAgIG5ld1JldklkID0gZG9jLl9yZXZpc2lvbnMuaWRzWzBdO1xuICAgIH1cbiAgICBpZiAoIWRvYy5fcmV2X3RyZWUpIHtcbiAgICAgIHJldkluZm8gPSBwYXJzZVJldmlzaW9uSW5mbyhkb2MuX3Jldik7XG4gICAgICBpZiAocmV2SW5mby5lcnJvcikge1xuICAgICAgICByZXR1cm4gcmV2SW5mbztcbiAgICAgIH1cbiAgICAgIG5SZXZOdW0gPSByZXZJbmZvLnByZWZpeDtcbiAgICAgIG5ld1JldklkID0gcmV2SW5mby5pZDtcbiAgICAgIGRvYy5fcmV2X3RyZWUgPSBbe1xuICAgICAgICBwb3M6IG5SZXZOdW0sXG4gICAgICAgIGlkczogW25ld1JldklkLCBvcHRzLCBbXV1cbiAgICAgIH1dO1xuICAgIH1cbiAgfVxuXG4gIGludmFsaWRJZEVycm9yKGRvYy5faWQpO1xuXG4gIGRvYy5fcmV2ID0gblJldk51bSArICctJyArIG5ld1JldklkO1xuXG4gIHZhciByZXN1bHQgPSB7bWV0YWRhdGEgOiB7fSwgZGF0YSA6IHt9fTtcbiAgZm9yICh2YXIga2V5IGluIGRvYykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkb2MsIGtleSkpIHtcbiAgICAgIHZhciBzcGVjaWFsS2V5ID0ga2V5WzBdID09PSAnXyc7XG4gICAgICBpZiAoc3BlY2lhbEtleSAmJiAhcmVzZXJ2ZWRXb3Jkc1trZXldKSB7XG4gICAgICAgIHZhciBlcnJvciA9IGNyZWF0ZUVycm9yKERPQ19WQUxJREFUSU9OLCBrZXkpO1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gRE9DX1ZBTElEQVRJT04ubWVzc2FnZSArICc6ICcgKyBrZXk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBlbHNlIGlmIChzcGVjaWFsS2V5ICYmICFkYXRhV29yZHNba2V5XSkge1xuICAgICAgICByZXN1bHQubWV0YWRhdGFba2V5LnNsaWNlKDEpXSA9IGRvY1trZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmRhdGFba2V5XSA9IGRvY1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwYXJzZUJhc2U2NChkYXRhKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXNBdG9iKGRhdGEpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKEJBRF9BUkcsXG4gICAgICAnQXR0YWNobWVudCBpcyBub3QgYSB2YWxpZCBiYXNlNjQgc3RyaW5nJyk7XG4gICAgcmV0dXJuIHtlcnJvcjogZXJyfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwcm9jZXNzU3RyaW5nKGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIHZhciBhc0JpbmFyeSA9IHBhcnNlQmFzZTY0KGF0dC5kYXRhKTtcbiAgaWYgKGFzQmluYXJ5LmVycm9yKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGFzQmluYXJ5LmVycm9yKTtcbiAgfVxuXG4gIGF0dC5sZW5ndGggPSBhc0JpbmFyeS5sZW5ndGg7XG4gIGlmIChibG9iVHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgYXR0LmRhdGEgPSBiaW5TdHJpbmdUb0JsdWZmZXIoYXNCaW5hcnksIGF0dC5jb250ZW50X3R5cGUpO1xuICB9IGVsc2UgaWYgKGJsb2JUeXBlID09PSAnYmFzZTY0Jykge1xuICAgIGF0dC5kYXRhID0gdGhpc0J0b2EoYXNCaW5hcnkpO1xuICB9IGVsc2UgeyAvLyBiaW5hcnlcbiAgICBhdHQuZGF0YSA9IGFzQmluYXJ5O1xuICB9XG4gIGJpbmFyeU1kNShhc0JpbmFyeSwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGF0dC5kaWdlc3QgPSAnbWQ1LScgKyByZXN1bHQ7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NCbG9iKGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIGJpbmFyeU1kNShhdHQuZGF0YSwgZnVuY3Rpb24gKG1kNSkge1xuICAgIGF0dC5kaWdlc3QgPSAnbWQ1LScgKyBtZDU7XG4gICAgLy8gc2l6ZSBpcyBmb3IgYmxvYnMgKGJyb3dzZXIpLCBsZW5ndGggaXMgZm9yIGJ1ZmZlcnMgKG5vZGUpXG4gICAgYXR0Lmxlbmd0aCA9IGF0dC5kYXRhLnNpemUgfHwgYXR0LmRhdGEubGVuZ3RoIHx8IDA7XG4gICAgaWYgKGJsb2JUeXBlID09PSAnYmluYXJ5Jykge1xuICAgICAgYmxvYlRvQmluYXJ5U3RyaW5nKGF0dC5kYXRhLCBmdW5jdGlvbiAoYmluU3RyaW5nKSB7XG4gICAgICAgIGF0dC5kYXRhID0gYmluU3RyaW5nO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChibG9iVHlwZSA9PT0gJ2Jhc2U2NCcpIHtcbiAgICAgIGJsb2JUb0Jhc2U2NChhdHQuZGF0YSwgZnVuY3Rpb24gKGI2NCkge1xuICAgICAgICBhdHQuZGF0YSA9IGI2NDtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NBdHRhY2htZW50KGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIGlmIChhdHQuc3R1Yikge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG4gIGlmICh0eXBlb2YgYXR0LmRhdGEgPT09ICdzdHJpbmcnKSB7IC8vIGlucHV0IGlzIGEgYmFzZTY0IHN0cmluZ1xuICAgIHByZXByb2Nlc3NTdHJpbmcoYXR0LCBibG9iVHlwZSwgY2FsbGJhY2spO1xuICB9IGVsc2UgeyAvLyBpbnB1dCBpcyBhIGJsb2JcbiAgICBwcmVwcm9jZXNzQmxvYihhdHQsIGJsb2JUeXBlLCBjYWxsYmFjayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzKGRvY0luZm9zLCBibG9iVHlwZSwgY2FsbGJhY2spIHtcblxuICBpZiAoIWRvY0luZm9zLmxlbmd0aCkge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgdmFyIGRvY3YgPSAwO1xuICB2YXIgb3ZlcmFsbEVycjtcblxuICBkb2NJbmZvcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2NJbmZvKSB7XG4gICAgdmFyIGF0dGFjaG1lbnRzID0gZG9jSW5mby5kYXRhICYmIGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMgP1xuICAgICAgT2JqZWN0LmtleXMoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cykgOiBbXTtcbiAgICB2YXIgcmVjdiA9IDA7XG5cbiAgICBpZiAoIWF0dGFjaG1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzZWRBdHRhY2htZW50KGVycikge1xuICAgICAgb3ZlcmFsbEVyciA9IGVycjtcbiAgICAgIHJlY3YrKztcbiAgICAgIGlmIChyZWN2ID09PSBhdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMsIGtleSkpIHtcbiAgICAgICAgcHJlcHJvY2Vzc0F0dGFjaG1lbnQoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50c1trZXldLFxuICAgICAgICAgIGJsb2JUeXBlLCBwcm9jZXNzZWRBdHRhY2htZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgZG9jdisrO1xuICAgIGlmIChkb2NJbmZvcy5sZW5ndGggPT09IGRvY3YpIHtcbiAgICAgIGlmIChvdmVyYWxsRXJyKSB7XG4gICAgICAgIGNhbGxiYWNrKG92ZXJhbGxFcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRG9jKHJldkxpbWl0LCBwcmV2LCBkb2NJbmZvLCByZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgIGksIGNiLCB3cml0ZURvYywgbmV3RWRpdHMpIHtcblxuICBpZiAocmV2RXhpc3RzKHByZXYucmV2X3RyZWUsIGRvY0luZm8ubWV0YWRhdGEucmV2KSAmJiAhbmV3RWRpdHMpIHtcbiAgICByZXN1bHRzW2ldID0gZG9jSW5mbztcbiAgICByZXR1cm4gY2IoKTtcbiAgfVxuXG4gIC8vIHNvbWV0aW1lcyB0aGlzIGlzIHByZS1jYWxjdWxhdGVkLiBoaXN0b3JpY2FsbHkgbm90IGFsd2F5c1xuICB2YXIgcHJldmlvdXNXaW5uaW5nUmV2ID0gcHJldi53aW5uaW5nUmV2IHx8IHdpbm5pbmdSZXYocHJldik7XG4gIHZhciBwcmV2aW91c2x5RGVsZXRlZCA9ICdkZWxldGVkJyBpbiBwcmV2ID8gcHJldi5kZWxldGVkIDpcbiAgICBpc0RlbGV0ZWQocHJldiwgcHJldmlvdXNXaW5uaW5nUmV2KTtcbiAgdmFyIGRlbGV0ZWQgPSAnZGVsZXRlZCcgaW4gZG9jSW5mby5tZXRhZGF0YSA/IGRvY0luZm8ubWV0YWRhdGEuZGVsZXRlZCA6XG4gICAgaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEpO1xuICB2YXIgaXNSb290ID0gL14xLS8udGVzdChkb2NJbmZvLm1ldGFkYXRhLnJldik7XG5cbiAgaWYgKHByZXZpb3VzbHlEZWxldGVkICYmICFkZWxldGVkICYmIG5ld0VkaXRzICYmIGlzUm9vdCkge1xuICAgIHZhciBuZXdEb2MgPSBkb2NJbmZvLmRhdGE7XG4gICAgbmV3RG9jLl9yZXYgPSBwcmV2aW91c1dpbm5pbmdSZXY7XG4gICAgbmV3RG9jLl9pZCA9IGRvY0luZm8ubWV0YWRhdGEuaWQ7XG4gICAgZG9jSW5mbyA9IHBhcnNlRG9jKG5ld0RvYywgbmV3RWRpdHMpO1xuICB9XG5cbiAgdmFyIG1lcmdlZCA9IG1lcmdlKHByZXYucmV2X3RyZWUsIGRvY0luZm8ubWV0YWRhdGEucmV2X3RyZWVbMF0sIHJldkxpbWl0KTtcblxuICB2YXIgaW5Db25mbGljdCA9IG5ld0VkaXRzICYmICgoXG4gICAgKHByZXZpb3VzbHlEZWxldGVkICYmIGRlbGV0ZWQgJiYgbWVyZ2VkLmNvbmZsaWN0cyAhPT0gJ25ld19sZWFmJykgfHxcbiAgICAoIXByZXZpb3VzbHlEZWxldGVkICYmIG1lcmdlZC5jb25mbGljdHMgIT09ICduZXdfbGVhZicpIHx8XG4gICAgKHByZXZpb3VzbHlEZWxldGVkICYmICFkZWxldGVkICYmIG1lcmdlZC5jb25mbGljdHMgPT09ICduZXdfYnJhbmNoJykpKTtcblxuICBpZiAoaW5Db25mbGljdCkge1xuICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgIHJlc3VsdHNbaV0gPSBlcnI7XG4gICAgcmV0dXJuIGNiKCk7XG4gIH1cblxuICB2YXIgbmV3UmV2ID0gZG9jSW5mby5tZXRhZGF0YS5yZXY7XG4gIGRvY0luZm8ubWV0YWRhdGEucmV2X3RyZWUgPSBtZXJnZWQudHJlZTtcbiAgZG9jSW5mby5zdGVtbWVkUmV2cyA9IG1lcmdlZC5zdGVtbWVkUmV2cyB8fCBbXTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHByZXYucmV2X21hcCkge1xuICAgIGRvY0luZm8ubWV0YWRhdGEucmV2X21hcCA9IHByZXYucmV2X21hcDsgLy8gdXNlZCBvbmx5IGJ5IGxldmVsZGJcbiAgfVxuXG4gIC8vIHJlY2FsY3VsYXRlXG4gIHZhciB3aW5uaW5nUmV2JCQxID0gd2lubmluZ1Jldihkb2NJbmZvLm1ldGFkYXRhKTtcbiAgdmFyIHdpbm5pbmdSZXZJc0RlbGV0ZWQgPSBpc0RlbGV0ZWQoZG9jSW5mby5tZXRhZGF0YSwgd2lubmluZ1JldiQkMSk7XG5cbiAgLy8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZG9jdW1lbnRzIHRoYXQgd2VyZSBhZGRlZC9yZW1vdmVkLFxuICAvLyBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0b3RhbF9yb3dzL2RvY19jb3VudFxuICB2YXIgZGVsdGEgPSAocHJldmlvdXNseURlbGV0ZWQgPT09IHdpbm5pbmdSZXZJc0RlbGV0ZWQpID8gMCA6XG4gICAgcHJldmlvdXNseURlbGV0ZWQgPCB3aW5uaW5nUmV2SXNEZWxldGVkID8gLTEgOiAxO1xuXG4gIHZhciBuZXdSZXZJc0RlbGV0ZWQ7XG4gIGlmIChuZXdSZXYgPT09IHdpbm5pbmdSZXYkJDEpIHtcbiAgICAvLyBpZiB0aGUgbmV3IHJldiBpcyB0aGUgc2FtZSBhcyB0aGUgd2lubmluZyByZXYsIHdlIGNhbiByZXVzZSB0aGF0IHZhbHVlXG4gICAgbmV3UmV2SXNEZWxldGVkID0gd2lubmluZ1JldklzRGVsZXRlZDtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiB0aGV5J3JlIG5vdCB0aGUgc2FtZSwgdGhlbiB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlXG4gICAgbmV3UmV2SXNEZWxldGVkID0gaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEsIG5ld1Jldik7XG4gIH1cblxuICB3cml0ZURvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLCBuZXdSZXZJc0RlbGV0ZWQsXG4gICAgdHJ1ZSwgZGVsdGEsIGksIGNiKTtcbn1cblxuZnVuY3Rpb24gcm9vdElzTWlzc2luZyhkb2NJbmZvKSB7XG4gIHJldHVybiBkb2NJbmZvLm1ldGFkYXRhLnJldl90cmVlWzBdLmlkc1sxXS5zdGF0dXMgPT09ICdtaXNzaW5nJztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0RvY3MocmV2TGltaXQsIGRvY0luZm9zLCBhcGksIGZldGNoZWREb2NzLCB0eCwgcmVzdWx0cyxcbiAgICAgICAgICAgICAgICAgICAgIHdyaXRlRG9jLCBvcHRzLCBvdmVyYWxsQ2FsbGJhY2spIHtcblxuICAvLyBEZWZhdWx0IHRvIDEwMDAgbG9jYWxseVxuICByZXZMaW1pdCA9IHJldkxpbWl0IHx8IDEwMDA7XG5cbiAgZnVuY3Rpb24gaW5zZXJ0RG9jKGRvY0luZm8sIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG4gICAgLy8gQ2FudCBpbnNlcnQgbmV3IGRlbGV0ZWQgZG9jdW1lbnRzXG4gICAgdmFyIHdpbm5pbmdSZXYkJDEgPSB3aW5uaW5nUmV2KGRvY0luZm8ubWV0YWRhdGEpO1xuICAgIHZhciBkZWxldGVkID0gaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEsIHdpbm5pbmdSZXYkJDEpO1xuICAgIGlmICgnd2FzX2RlbGV0ZScgaW4gb3B0cyAmJiBkZWxldGVkKSB7XG4gICAgICByZXN1bHRzW3Jlc3VsdHNJZHhdID0gY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsICdkZWxldGVkJyk7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICAvLyA0NzEyIC0gZGV0ZWN0IHdoZXRoZXIgYSBuZXcgZG9jdW1lbnQgd2FzIGluc2VydGVkIHdpdGggYSBfcmV2XG4gICAgdmFyIGluQ29uZmxpY3QgPSBuZXdFZGl0cyAmJiByb290SXNNaXNzaW5nKGRvY0luZm8pO1xuXG4gICAgaWYgKGluQ29uZmxpY3QpIHtcbiAgICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgICAgcmVzdWx0c1tyZXN1bHRzSWR4XSA9IGVycjtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHZhciBkZWx0YSA9IGRlbGV0ZWQgPyAwIDogMTtcblxuICAgIHdyaXRlRG9jKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIGRlbGV0ZWQsIGRlbGV0ZWQsIGZhbHNlLFxuICAgICAgZGVsdGEsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHZhciBuZXdFZGl0cyA9IG9wdHMubmV3X2VkaXRzO1xuICB2YXIgaWRzVG9Eb2NzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbiAgdmFyIGRvY3NEb25lID0gMDtcbiAgdmFyIGRvY3NUb0RvID0gZG9jSW5mb3MubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNoZWNrQWxsRG9jc0RvbmUoKSB7XG4gICAgaWYgKCsrZG9jc0RvbmUgPT09IGRvY3NUb0RvICYmIG92ZXJhbGxDYWxsYmFjaykge1xuICAgICAgb3ZlcmFsbENhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZG9jSW5mb3MuZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudERvYywgcmVzdWx0c0lkeCkge1xuXG4gICAgaWYgKGN1cnJlbnREb2MuX2lkICYmIGlzTG9jYWxJZChjdXJyZW50RG9jLl9pZCkpIHtcbiAgICAgIHZhciBmdW4gPSBjdXJyZW50RG9jLl9kZWxldGVkID8gJ19yZW1vdmVMb2NhbCcgOiAnX3B1dExvY2FsJztcbiAgICAgIGFwaVtmdW5dKGN1cnJlbnREb2MsIHtjdHg6IHR4fSwgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIHJlc3VsdHNbcmVzdWx0c0lkeF0gPSBlcnIgfHwgcmVzO1xuICAgICAgICBjaGVja0FsbERvY3NEb25lKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaWQgPSBjdXJyZW50RG9jLm1ldGFkYXRhLmlkO1xuICAgIGlmIChpZHNUb0RvY3MuaGFzKGlkKSkge1xuICAgICAgZG9jc1RvRG8tLTsgLy8gZHVwbGljYXRlXG4gICAgICBpZHNUb0RvY3MuZ2V0KGlkKS5wdXNoKFtjdXJyZW50RG9jLCByZXN1bHRzSWR4XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkc1RvRG9jcy5zZXQoaWQsIFtbY3VycmVudERvYywgcmVzdWx0c0lkeF1dKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGluIHRoZSBjYXNlIG9mIG5ld19lZGl0cywgdGhlIHVzZXIgY2FuIHByb3ZpZGUgbXVsdGlwbGUgZG9jc1xuICAvLyB3aXRoIHRoZSBzYW1lIGlkLiB0aGVzZSBuZWVkIHRvIGJlIHByb2Nlc3NlZCBzZXF1ZW50aWFsbHlcbiAgaWRzVG9Eb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvY3MsIGlkKSB7XG4gICAgdmFyIG51bURvbmUgPSAwO1xuXG4gICAgZnVuY3Rpb24gZG9jV3JpdHRlbigpIHtcbiAgICAgIGlmICgrK251bURvbmUgPCBkb2NzLmxlbmd0aCkge1xuICAgICAgICBuZXh0RG9jKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja0FsbERvY3NEb25lKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5leHREb2MoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBkb2NzW251bURvbmVdO1xuICAgICAgdmFyIGN1cnJlbnREb2MgPSB2YWx1ZVswXTtcbiAgICAgIHZhciByZXN1bHRzSWR4ID0gdmFsdWVbMV07XG5cbiAgICAgIGlmIChmZXRjaGVkRG9jcy5oYXMoaWQpKSB7XG4gICAgICAgIHVwZGF0ZURvYyhyZXZMaW1pdCwgZmV0Y2hlZERvY3MuZ2V0KGlkKSwgY3VycmVudERvYywgcmVzdWx0cyxcbiAgICAgICAgICByZXN1bHRzSWR4LCBkb2NXcml0dGVuLCB3cml0ZURvYywgbmV3RWRpdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRW5zdXJlIHN0ZW1taW5nIGFwcGxpZXMgdG8gbmV3IHdyaXRlcyBhcyB3ZWxsXG4gICAgICAgIHZhciBtZXJnZWQgPSBtZXJnZShbXSwgY3VycmVudERvYy5tZXRhZGF0YS5yZXZfdHJlZVswXSwgcmV2TGltaXQpO1xuICAgICAgICBjdXJyZW50RG9jLm1ldGFkYXRhLnJldl90cmVlID0gbWVyZ2VkLnRyZWU7XG4gICAgICAgIGN1cnJlbnREb2Muc3RlbW1lZFJldnMgPSBtZXJnZWQuc3RlbW1lZFJldnMgfHwgW107XG4gICAgICAgIGluc2VydERvYyhjdXJyZW50RG9jLCByZXN1bHRzSWR4LCBkb2NXcml0dGVuKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbmV4dERvYygpO1xuICB9KTtcbn1cblxuLy8gSW5kZXhlZERCIHJlcXVpcmVzIGEgdmVyc2lvbmVkIGRhdGFiYXNlIHN0cnVjdHVyZSwgc28gd2UgdXNlIHRoZVxuLy8gdmVyc2lvbiBoZXJlIHRvIG1hbmFnZSBtaWdyYXRpb25zLlxudmFyIEFEQVBURVJfVkVSU0lPTiA9IDU7XG5cbi8vIFRoZSBvYmplY3Qgc3RvcmVzIGNyZWF0ZWQgZm9yIGVhY2ggZGF0YWJhc2Vcbi8vIERPQ19TVE9SRSBzdG9yZXMgdGhlIGRvY3VtZW50IG1ldGEgZGF0YSwgaXRzIHJldmlzaW9uIGhpc3RvcnkgYW5kIHN0YXRlXG4vLyBLZXllZCBieSBkb2N1bWVudCBpZFxudmFyIERPQ19TVE9SRSA9ICdkb2N1bWVudC1zdG9yZSc7XG4vLyBCWV9TRVFfU1RPUkUgc3RvcmVzIGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQsIGtleWVkIGJ5IGl0c1xuLy8gc2VxdWVuY2UgaWRcbnZhciBCWV9TRVFfU1RPUkUgPSAnYnktc2VxdWVuY2UnO1xuLy8gV2hlcmUgd2Ugc3RvcmUgYXR0YWNobWVudHNcbnZhciBBVFRBQ0hfU1RPUkUgPSAnYXR0YWNoLXN0b3JlJztcbi8vIFdoZXJlIHdlIHN0b3JlIG1hbnktdG8tbWFueSByZWxhdGlvbnNcbi8vIGJldHdlZW4gYXR0YWNobWVudCBkaWdlc3RzIGFuZCBzZXFzXG52YXIgQVRUQUNIX0FORF9TRVFfU1RPUkUgPSAnYXR0YWNoLXNlcS1zdG9yZSc7XG5cbi8vIFdoZXJlIHdlIHN0b3JlIGRhdGFiYXNlLXdpZGUgbWV0YSBkYXRhIGluIGEgc2luZ2xlIHJlY29yZFxuLy8ga2V5ZWQgYnkgaWQ6IE1FVEFfU1RPUkVcbnZhciBNRVRBX1NUT1JFID0gJ21ldGEtc3RvcmUnO1xuLy8gV2hlcmUgd2Ugc3RvcmUgbG9jYWwgZG9jdW1lbnRzXG52YXIgTE9DQUxfU1RPUkUgPSAnbG9jYWwtc3RvcmUnO1xuLy8gV2hlcmUgd2UgZGV0ZWN0IGJsb2Igc3VwcG9ydFxudmFyIERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUgPSAnZGV0ZWN0LWJsb2Itc3VwcG9ydCc7XG5cbmZ1bmN0aW9uIHNhZmVKc29uUGFyc2Uoc3RyKSB7XG4gIC8vIFRoaXMgdHJ5L2NhdGNoIGd1YXJkcyBhZ2FpbnN0IHN0YWNrIG92ZXJmbG93IGVycm9ycy5cbiAgLy8gSlNPTi5wYXJzZSgpIGlzIGZhc3RlciB0aGFuIHZ1dnV6ZWxhLnBhcnNlKCkgYnV0IHZ1dnV6ZWxhXG4gIC8vIGNhbm5vdCBvdmVyZmxvdy5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdnV2dXplbGEucGFyc2Uoc3RyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlSnNvblN0cmluZ2lmeShqc29uKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzb24pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdnV2dXplbGEuc3RyaW5naWZ5KGpzb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlkYkVycm9yKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAndW5rbm93bl9lcnJvcic7XG4gICAgaWYgKGV2dC50YXJnZXQgJiYgZXZ0LnRhcmdldC5lcnJvcikge1xuICAgICAgbWVzc2FnZSA9IGV2dC50YXJnZXQuZXJyb3IubmFtZSB8fCBldnQudGFyZ2V0LmVycm9yLm1lc3NhZ2U7XG4gICAgfVxuICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKElEQl9FUlJPUiwgbWVzc2FnZSwgZXZ0LnR5cGUpKTtcbiAgfTtcbn1cblxuLy8gVW5mb3J0dW5hdGVseSwgdGhlIG1ldGFkYXRhIGhhcyB0byBiZSBzdHJpbmdpZmllZFxuLy8gd2hlbiBpdCBpcyBwdXQgaW50byB0aGUgZGF0YWJhc2UsIGJlY2F1c2Ugb3RoZXJ3aXNlXG4vLyBJbmRleGVkREIgY2FuIHRocm93IGVycm9ycyBmb3IgZGVlcGx5LW5lc3RlZCBvYmplY3RzLlxuLy8gT3JpZ2luYWxseSB3ZSBqdXN0IHVzZWQgSlNPTi5wYXJzZS9KU09OLnN0cmluZ2lmeTsgbm93XG4vLyB3ZSB1c2UgdGhpcyBjdXN0b20gdnV2dXplbGEgbGlicmFyeSB0aGF0IGF2b2lkcyByZWN1cnNpb24uXG4vLyBJZiB3ZSBjb3VsZCBkbyBpdCBhbGwgb3ZlciBhZ2Fpbiwgd2UnZCBwcm9iYWJseSB1c2UgYVxuLy8gZm9ybWF0IGZvciB0aGUgcmV2aXNpb24gdHJlZXMgb3RoZXIgdGhhbiBKU09OLlxuZnVuY3Rpb24gZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEsIHdpbm5pbmdSZXYsIGRlbGV0ZWQpIHtcbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBzYWZlSnNvblN0cmluZ2lmeShtZXRhZGF0YSksXG4gICAgd2lubmluZ1Jldjogd2lubmluZ1JldixcbiAgICBkZWxldGVkT3JMb2NhbDogZGVsZXRlZCA/ICcxJyA6ICcwJyxcbiAgICBzZXE6IG1ldGFkYXRhLnNlcSwgLy8gaGlnaGVzdCBzZXEgZm9yIHRoaXMgZG9jXG4gICAgaWQ6IG1ldGFkYXRhLmlkXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlY29kZU1ldGFkYXRhKHN0b3JlZE9iamVjdCkge1xuICBpZiAoIXN0b3JlZE9iamVjdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBtZXRhZGF0YSA9IHNhZmVKc29uUGFyc2Uoc3RvcmVkT2JqZWN0LmRhdGEpO1xuICBtZXRhZGF0YS53aW5uaW5nUmV2ID0gc3RvcmVkT2JqZWN0Lndpbm5pbmdSZXY7XG4gIG1ldGFkYXRhLmRlbGV0ZWQgPSBzdG9yZWRPYmplY3QuZGVsZXRlZE9yTG9jYWwgPT09ICcxJztcbiAgbWV0YWRhdGEuc2VxID0gc3RvcmVkT2JqZWN0LnNlcTtcbiAgcmV0dXJuIG1ldGFkYXRhO1xufVxuXG4vLyByZWFkIHRoZSBkb2MgYmFjayBvdXQgZnJvbSB0aGUgZGF0YWJhc2UuIHdlIGRvbid0IHN0b3JlIHRoZVxuLy8gX2lkIG9yIF9yZXYgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgX2RvY19pZF9yZXYuXG5mdW5jdGlvbiBkZWNvZGVEb2MoZG9jKSB7XG4gIGlmICghZG9jKSB7XG4gICAgcmV0dXJuIGRvYztcbiAgfVxuICB2YXIgaWR4ID0gZG9jLl9kb2NfaWRfcmV2Lmxhc3RJbmRleE9mKCc6Jyk7XG4gIGRvYy5faWQgPSBkb2MuX2RvY19pZF9yZXYuc3Vic3RyaW5nKDAsIGlkeCAtIDEpO1xuICBkb2MuX3JldiA9IGRvYy5fZG9jX2lkX3Jldi5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gIGRlbGV0ZSBkb2MuX2RvY19pZF9yZXY7XG4gIHJldHVybiBkb2M7XG59XG5cbi8vIFJlYWQgYSBibG9iIGZyb20gdGhlIGRhdGFiYXNlLCBlbmNvZGluZyBhcyBuZWNlc3Nhcnlcbi8vIGFuZCB0cmFuc2xhdGluZyBmcm9tIGJhc2U2NCBpZiB0aGUgSURCIGRvZXNuJ3Qgc3VwcG9ydFxuLy8gbmF0aXZlIEJsb2JzXG5mdW5jdGlvbiByZWFkQmxvYkRhdGEoYm9keSwgdHlwZSwgYXNCbG9iLCBjYWxsYmFjaykge1xuICBpZiAoYXNCbG9iKSB7XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICBjYWxsYmFjayhjcmVhdGVCbG9iKFsnJ10sIHt0eXBlOiB0eXBlfSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgIT09ICdzdHJpbmcnKSB7IC8vIHdlIGhhdmUgYmxvYiBzdXBwb3J0XG4gICAgICBjYWxsYmFjayhib2R5KTtcbiAgICB9IGVsc2UgeyAvLyBubyBibG9iIHN1cHBvcnRcbiAgICAgIGNhbGxiYWNrKGI2NFRvQmx1ZmZlcihib2R5LCB0eXBlKSk7XG4gICAgfVxuICB9IGVsc2UgeyAvLyBhcyBiYXNlNjQgc3RyaW5nXG4gICAgaWYgKCFib2R5KSB7XG4gICAgICBjYWxsYmFjaygnJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycpIHsgLy8gd2UgaGF2ZSBibG9iIHN1cHBvcnRcbiAgICAgIHJlYWRBc0JpbmFyeVN0cmluZyhib2R5LCBmdW5jdGlvbiAoYmluYXJ5KSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXNCdG9hKGJpbmFyeSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHsgLy8gbm8gYmxvYiBzdXBwb3J0XG4gICAgICBjYWxsYmFjayhib2R5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmV0Y2hBdHRhY2htZW50c0lmTmVjZXNzYXJ5KGRvYywgb3B0cywgdHhuLCBjYikge1xuICB2YXIgYXR0YWNobWVudHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzIHx8IHt9KTtcbiAgaWYgKCFhdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY2IgJiYgY2IoKTtcbiAgfVxuICB2YXIgbnVtRG9uZSA9IDA7XG5cbiAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgIGlmICgrK251bURvbmUgPT09IGF0dGFjaG1lbnRzLmxlbmd0aCAmJiBjYikge1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaEF0dGFjaG1lbnQoZG9jLCBhdHQpIHtcbiAgICB2YXIgYXR0T2JqID0gZG9jLl9hdHRhY2htZW50c1thdHRdO1xuICAgIHZhciBkaWdlc3QgPSBhdHRPYmouZGlnZXN0O1xuICAgIHZhciByZXEgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKS5nZXQoZGlnZXN0KTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGF0dE9iai5ib2R5ID0gZS50YXJnZXQucmVzdWx0LmJvZHk7XG4gICAgICBjaGVja0RvbmUoKTtcbiAgICB9O1xuICB9XG5cbiAgYXR0YWNobWVudHMuZm9yRWFjaChmdW5jdGlvbiAoYXR0KSB7XG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgIGZldGNoQXR0YWNobWVudChkb2MsIGF0dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvYy5fYXR0YWNobWVudHNbYXR0XS5zdHViID0gdHJ1ZTtcbiAgICAgIGNoZWNrRG9uZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIElEQi1zcGVjaWZpYyBwb3N0cHJvY2Vzc2luZyBuZWNlc3NhcnkgYmVjYXVzZVxuLy8gd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHdlIHN0b3JlZCBhIHRydWUgQmxvYiBvclxuLy8gYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcsIGFuZCBpZiBpdCdzIGEgQmxvYiBpdFxuLy8gbmVlZHMgdG8gYmUgcmVhZCBvdXRzaWRlIG9mIHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG5mdW5jdGlvbiBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMsIGFzQmxvYikge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocmVzdWx0cy5tYXAoZnVuY3Rpb24gKHJvdykge1xuICAgIGlmIChyb3cuZG9jICYmIHJvdy5kb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICB2YXIgYXR0TmFtZXMgPSBPYmplY3Qua2V5cyhyb3cuZG9jLl9hdHRhY2htZW50cyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYXR0TmFtZXMubWFwKGZ1bmN0aW9uIChhdHQpIHtcbiAgICAgICAgdmFyIGF0dE9iaiA9IHJvdy5kb2MuX2F0dGFjaG1lbnRzW2F0dF07XG4gICAgICAgIGlmICghKCdib2R5JyBpbiBhdHRPYmopKSB7IC8vIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBib2R5ID0gYXR0T2JqLmJvZHk7XG4gICAgICAgIHZhciB0eXBlID0gYXR0T2JqLmNvbnRlbnRfdHlwZTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVhZEJsb2JEYXRhKGJvZHksIHR5cGUsIGFzQmxvYiwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHJvdy5kb2MuX2F0dGFjaG1lbnRzW2F0dF0gPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oXG4gICAgICAgICAgICAgIHBpY2soYXR0T2JqLCBbJ2RpZ2VzdCcsICdjb250ZW50X3R5cGUnXSksXG4gICAgICAgICAgICAgIHtkYXRhOiBkYXRhfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhY3RSZXZzKHJldnMsIGRvY0lkLCB0eG4pIHtcblxuICB2YXIgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMgPSBbXTtcbiAgdmFyIHNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gIHZhciBhdHRTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfU1RPUkUpO1xuICB2YXIgYXR0QW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuICB2YXIgY291bnQgPSByZXZzLmxlbmd0aDtcblxuICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgY291bnQtLTtcbiAgICBpZiAoIWNvdW50KSB7IC8vIGRvbmUgcHJvY2Vzc2luZyBhbGwgcmV2c1xuICAgICAgZGVsZXRlT3JwaGFuZWRBdHRhY2htZW50cygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGV0ZU9ycGhhbmVkQXR0YWNobWVudHMoKSB7XG4gICAgaWYgKCFwb3NzaWJseU9ycGhhbmVkRGlnZXN0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMuZm9yRWFjaChmdW5jdGlvbiAoZGlnZXN0KSB7XG4gICAgICB2YXIgY291bnRSZXEgPSBhdHRBbmRTZXFTdG9yZS5pbmRleCgnZGlnZXN0U2VxJykuY291bnQoXG4gICAgICAgIElEQktleVJhbmdlLmJvdW5kKFxuICAgICAgICAgIGRpZ2VzdCArICc6OicsIGRpZ2VzdCArICc6OlxcdWZmZmYnLCBmYWxzZSwgZmFsc2UpKTtcbiAgICAgIGNvdW50UmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBjb3VudCA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICAgIC8vIG9ycGhhbmVkXG4gICAgICAgICAgYXR0U3RvcmUuZGVsZXRlKGRpZ2VzdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXZzLmZvckVhY2goZnVuY3Rpb24gKHJldikge1xuICAgIHZhciBpbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICAgIHZhciBrZXkgPSBkb2NJZCArIFwiOjpcIiArIHJldjtcbiAgICBpbmRleC5nZXRLZXkoa2V5KS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHNlcSA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICh0eXBlb2Ygc2VxICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gY2hlY2tEb25lKCk7XG4gICAgICB9XG4gICAgICBzZXFTdG9yZS5kZWxldGUoc2VxKTtcblxuICAgICAgdmFyIGN1cnNvciA9IGF0dEFuZFNlcVN0b3JlLmluZGV4KCdzZXEnKVxuICAgICAgICAub3BlbkN1cnNvcihJREJLZXlSYW5nZS5vbmx5KHNlcSkpO1xuXG4gICAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgdmFyIGRpZ2VzdCA9IGN1cnNvci52YWx1ZS5kaWdlc3RTZXEuc3BsaXQoJzo6JylbMF07XG4gICAgICAgICAgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMucHVzaChkaWdlc3QpO1xuICAgICAgICAgIGF0dEFuZFNlcVN0b3JlLmRlbGV0ZShjdXJzb3IucHJpbWFyeUtleSk7XG4gICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgIH0gZWxzZSB7IC8vIGRvbmVcbiAgICAgICAgICBjaGVja0RvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgc3RvcmVzLCBtb2RlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4bjogaWRiLnRyYW5zYWN0aW9uKHN0b3JlcywgbW9kZSlcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGVyclxuICAgIH07XG4gIH1cbn1cblxudmFyIGNoYW5nZXNIYW5kbGVyID0gbmV3IENoYW5nZXMoKTtcblxuZnVuY3Rpb24gaWRiQnVsa0RvY3MoZGJPcHRzLCByZXEsIG9wdHMsIGFwaSwgaWRiLCBjYWxsYmFjaykge1xuICB2YXIgZG9jSW5mb3MgPSByZXEuZG9jcztcbiAgdmFyIHR4bjtcbiAgdmFyIGRvY1N0b3JlO1xuICB2YXIgYnlTZXFTdG9yZTtcbiAgdmFyIGF0dGFjaFN0b3JlO1xuICB2YXIgYXR0YWNoQW5kU2VxU3RvcmU7XG4gIHZhciBtZXRhU3RvcmU7XG4gIHZhciBkb2NJbmZvRXJyb3I7XG4gIHZhciBtZXRhRG9jO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkb2NJbmZvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBkb2MgPSBkb2NJbmZvc1tpXTtcbiAgICBpZiAoZG9jLl9pZCAmJiBpc0xvY2FsSWQoZG9jLl9pZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBkb2MgPSBkb2NJbmZvc1tpXSA9IHBhcnNlRG9jKGRvYywgb3B0cy5uZXdfZWRpdHMsIGRiT3B0cyk7XG4gICAgaWYgKGRvYy5lcnJvciAmJiAhZG9jSW5mb0Vycm9yKSB7XG4gICAgICBkb2NJbmZvRXJyb3IgPSBkb2M7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRvY0luZm9FcnJvcikge1xuICAgIHJldHVybiBjYWxsYmFjayhkb2NJbmZvRXJyb3IpO1xuICB9XG5cbiAgdmFyIGFsbERvY3NQcm9jZXNzZWQgPSBmYWxzZTtcbiAgdmFyIGRvY0NvdW50RGVsdGEgPSAwO1xuICB2YXIgcmVzdWx0cyA9IG5ldyBBcnJheShkb2NJbmZvcy5sZW5ndGgpO1xuICB2YXIgZmV0Y2hlZERvY3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgdmFyIHByZWNvbmRpdGlvbkVycm9yZWQgPSBmYWxzZTtcbiAgdmFyIGJsb2JUeXBlID0gYXBpLl9tZXRhLmJsb2JTdXBwb3J0ID8gJ2Jsb2InIDogJ2Jhc2U2NCc7XG5cbiAgcHJlcHJvY2Vzc0F0dGFjaG1lbnRzKGRvY0luZm9zLCBibG9iVHlwZSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICBzdGFydFRyYW5zYWN0aW9uKCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oKSB7XG5cbiAgICB2YXIgc3RvcmVzID0gW1xuICAgICAgRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsXG4gICAgICBBVFRBQ0hfU1RPUkUsXG4gICAgICBMT0NBTF9TVE9SRSwgQVRUQUNIX0FORF9TRVFfU1RPUkUsXG4gICAgICBNRVRBX1NUT1JFXG4gICAgXTtcbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgc3RvcmVzLCAncmVhZHdyaXRlJyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgdHhuLm9udGltZW91dCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICB0eG4ub25jb21wbGV0ZSA9IGNvbXBsZXRlO1xuICAgIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgYnlTZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICAgIGF0dGFjaFN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSk7XG4gICAgYXR0YWNoQW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuICAgIG1ldGFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKTtcblxuICAgIG1ldGFTdG9yZS5nZXQoTUVUQV9TVE9SRSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1ldGFEb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICB1cGRhdGVEb2NDb3VudElmUmVhZHkoKTtcbiAgICB9O1xuXG4gICAgdmVyaWZ5QXR0YWNobWVudHMoZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBwcmVjb25kaXRpb25FcnJvcmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgICBmZXRjaEV4aXN0aW5nRG9jcygpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25BbGxEb2NzUHJvY2Vzc2VkKCkge1xuICAgIGFsbERvY3NQcm9jZXNzZWQgPSB0cnVlO1xuICAgIHVwZGF0ZURvY0NvdW50SWZSZWFkeSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaWRiUHJvY2Vzc0RvY3MoKSB7XG4gICAgcHJvY2Vzc0RvY3MoZGJPcHRzLnJldnNfbGltaXQsIGRvY0luZm9zLCBhcGksIGZldGNoZWREb2NzLFxuICAgICAgICAgICAgICAgIHR4biwgcmVzdWx0cywgd3JpdGVEb2MsIG9wdHMsIG9uQWxsRG9jc1Byb2Nlc3NlZCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVEb2NDb3VudElmUmVhZHkoKSB7XG4gICAgaWYgKCFtZXRhRG9jIHx8ICFhbGxEb2NzUHJvY2Vzc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGNhY2hpbmcgdGhlIGRvY0NvdW50IHNhdmVzIGEgbG90IG9mIHRpbWUgaW4gYWxsRG9jcygpIGFuZFxuICAgIC8vIGluZm8oKSwgd2hpY2ggaXMgd2h5IHdlIGdvIHRvIGFsbCB0aGUgdHJvdWJsZSBvZiBkb2luZyB0aGlzXG4gICAgbWV0YURvYy5kb2NDb3VudCArPSBkb2NDb3VudERlbHRhO1xuICAgIG1ldGFTdG9yZS5wdXQobWV0YURvYyk7XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaEV4aXN0aW5nRG9jcygpIHtcblxuICAgIGlmICghZG9jSW5mb3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG51bUZldGNoZWQgPSAwO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgICAgaWYgKCsrbnVtRmV0Y2hlZCA9PT0gZG9jSW5mb3MubGVuZ3RoKSB7XG4gICAgICAgIGlkYlByb2Nlc3NEb2NzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZE1ldGFkYXRhKGV2ZW50KSB7XG4gICAgICB2YXIgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShldmVudC50YXJnZXQucmVzdWx0KTtcblxuICAgICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgIGZldGNoZWREb2NzLnNldChtZXRhZGF0YS5pZCwgbWV0YWRhdGEpO1xuICAgICAgfVxuICAgICAgY2hlY2tEb25lKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRvY0luZm9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgZG9jSW5mbyA9IGRvY0luZm9zW2ldO1xuICAgICAgaWYgKGRvY0luZm8uX2lkICYmIGlzTG9jYWxJZChkb2NJbmZvLl9pZCkpIHtcbiAgICAgICAgY2hlY2tEb25lKCk7IC8vIHNraXAgbG9jYWwgZG9jc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXEgPSBkb2NTdG9yZS5nZXQoZG9jSW5mby5tZXRhZGF0YS5pZCk7XG4gICAgICByZXEub25zdWNjZXNzID0gcmVhZE1ldGFkYXRhO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgIGlmIChwcmVjb25kaXRpb25FcnJvcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2hhbmdlc0hhbmRsZXIubm90aWZ5KGFwaS5fbWV0YS5uYW1lKTtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZlcmlmeUF0dGFjaG1lbnQoZGlnZXN0LCBjYWxsYmFjaykge1xuXG4gICAgdmFyIHJlcSA9IGF0dGFjaFN0b3JlLmdldChkaWdlc3QpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFlLnRhcmdldC5yZXN1bHQpIHtcbiAgICAgICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfU1RVQixcbiAgICAgICAgICAndW5rbm93biBzdHViIGF0dGFjaG1lbnQgd2l0aCBkaWdlc3QgJyArXG4gICAgICAgICAgZGlnZXN0KTtcbiAgICAgICAgZXJyLnN0YXR1cyA9IDQxMjtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZlcmlmeUF0dGFjaG1lbnRzKGZpbmlzaCkge1xuXG5cbiAgICB2YXIgZGlnZXN0cyA9IFtdO1xuICAgIGRvY0luZm9zLmZvckVhY2goZnVuY3Rpb24gKGRvY0luZm8pIHtcbiAgICAgIGlmIChkb2NJbmZvLmRhdGEgJiYgZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cykge1xuICAgICAgICBPYmplY3Qua2V5cyhkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgICAgICAgIHZhciBhdHQgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lXTtcbiAgICAgICAgICBpZiAoYXR0LnN0dWIpIHtcbiAgICAgICAgICAgIGRpZ2VzdHMucHVzaChhdHQuZGlnZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghZGlnZXN0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmaW5pc2goKTtcbiAgICB9XG4gICAgdmFyIG51bURvbmUgPSAwO1xuICAgIHZhciBlcnI7XG5cbiAgICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgICBpZiAoKytudW1Eb25lID09PSBkaWdlc3RzLmxlbmd0aCkge1xuICAgICAgICBmaW5pc2goZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZGlnZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChkaWdlc3QpIHtcbiAgICAgIHZlcmlmeUF0dGFjaG1lbnQoZGlnZXN0LCBmdW5jdGlvbiAoYXR0RXJyKSB7XG4gICAgICAgIGlmIChhdHRFcnIgJiYgIWVycikge1xuICAgICAgICAgIGVyciA9IGF0dEVycjtcbiAgICAgICAgfVxuICAgICAgICBjaGVja0RvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVEb2MoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgd2lubmluZ1JldklzRGVsZXRlZCwgbmV3UmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICBpc1VwZGF0ZSwgZGVsdGEsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG5cbiAgICBkb2NJbmZvLm1ldGFkYXRhLndpbm5pbmdSZXYgPSB3aW5uaW5nUmV2JCQxO1xuICAgIGRvY0luZm8ubWV0YWRhdGEuZGVsZXRlZCA9IHdpbm5pbmdSZXZJc0RlbGV0ZWQ7XG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuICAgIGRvYy5faWQgPSBkb2NJbmZvLm1ldGFkYXRhLmlkO1xuICAgIGRvYy5fcmV2ID0gZG9jSW5mby5tZXRhZGF0YS5yZXY7XG5cbiAgICBpZiAobmV3UmV2SXNEZWxldGVkKSB7XG4gICAgICBkb2MuX2RlbGV0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBoYXNBdHRhY2htZW50cyA9IGRvYy5fYXR0YWNobWVudHMgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpLmxlbmd0aDtcbiAgICBpZiAoaGFzQXR0YWNobWVudHMpIHtcbiAgICAgIHJldHVybiB3cml0ZUF0dGFjaG1lbnRzKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIHdpbm5pbmdSZXZJc0RlbGV0ZWQsXG4gICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZG9jQ291bnREZWx0YSArPSBkZWx0YTtcbiAgICB1cGRhdGVEb2NDb3VudElmUmVhZHkoKTtcblxuICAgIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuICAgIHZhciBtZXRhZGF0YSA9IGRvY0luZm8ubWV0YWRhdGE7XG5cbiAgICBkb2MuX2RvY19pZF9yZXYgPSBtZXRhZGF0YS5pZCArICc6OicgKyBtZXRhZGF0YS5yZXY7XG4gICAgZGVsZXRlIGRvYy5faWQ7XG4gICAgZGVsZXRlIGRvYy5fcmV2O1xuXG4gICAgZnVuY3Rpb24gYWZ0ZXJQdXREb2MoZSkge1xuICAgICAgdmFyIHJldnNUb0RlbGV0ZSA9IGRvY0luZm8uc3RlbW1lZFJldnMgfHwgW107XG5cbiAgICAgIGlmIChpc1VwZGF0ZSAmJiBhcGkuYXV0b19jb21wYWN0aW9uKSB7XG4gICAgICAgIHJldnNUb0RlbGV0ZSA9IHJldnNUb0RlbGV0ZS5jb25jYXQoY29tcGFjdFRyZWUoZG9jSW5mby5tZXRhZGF0YSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmV2c1RvRGVsZXRlICYmIHJldnNUb0RlbGV0ZS5sZW5ndGgpIHtcbiAgICAgICAgY29tcGFjdFJldnMocmV2c1RvRGVsZXRlLCBkb2NJbmZvLm1ldGFkYXRhLmlkLCB0eG4pO1xuICAgICAgfVxuXG4gICAgICBtZXRhZGF0YS5zZXEgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAvLyBDdXJyZW50IF9yZXYgaXMgY2FsY3VsYXRlZCBmcm9tIF9yZXZfdHJlZSBvbiByZWFkXG4gICAgICAvLyBkZWxldGUgbWV0YWRhdGEucmV2O1xuICAgICAgdmFyIG1ldGFkYXRhVG9TdG9yZSA9IGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhLCB3aW5uaW5nUmV2JCQxLFxuICAgICAgICB3aW5uaW5nUmV2SXNEZWxldGVkKTtcbiAgICAgIHZhciBtZXRhRGF0YVJlcSA9IGRvY1N0b3JlLnB1dChtZXRhZGF0YVRvU3RvcmUpO1xuICAgICAgbWV0YURhdGFSZXEub25zdWNjZXNzID0gYWZ0ZXJQdXRNZXRhZGF0YTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZnRlclB1dERvY0Vycm9yKGUpIHtcbiAgICAgIC8vIENvbnN0cmFpbnRFcnJvciwgbmVlZCB0byB1cGRhdGUsIG5vdCBwdXQgKHNlZSAjMTYzOCBmb3IgZGV0YWlscylcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gYXZvaWQgdHJhbnNhY3Rpb24gYWJvcnRcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIG9uZXJyb3JcbiAgICAgIHZhciBpbmRleCA9IGJ5U2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG4gICAgICB2YXIgZ2V0S2V5UmVxID0gaW5kZXguZ2V0S2V5KGRvYy5fZG9jX2lkX3Jldik7XG4gICAgICBnZXRLZXlSZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHB1dFJlcSA9IGJ5U2VxU3RvcmUucHV0KGRvYywgZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgcHV0UmVxLm9uc3VjY2VzcyA9IGFmdGVyUHV0RG9jO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZnRlclB1dE1ldGFkYXRhKCkge1xuICAgICAgcmVzdWx0c1tyZXN1bHRzSWR4XSA9IHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGlkOiBtZXRhZGF0YS5pZCxcbiAgICAgICAgcmV2OiBtZXRhZGF0YS5yZXZcbiAgICAgIH07XG4gICAgICBmZXRjaGVkRG9jcy5zZXQoZG9jSW5mby5tZXRhZGF0YS5pZCwgZG9jSW5mby5tZXRhZGF0YSk7XG4gICAgICBpbnNlcnRBdHRhY2htZW50TWFwcGluZ3MoZG9jSW5mbywgbWV0YWRhdGEuc2VxLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgdmFyIHB1dFJlcSA9IGJ5U2VxU3RvcmUucHV0KGRvYyk7XG5cbiAgICBwdXRSZXEub25zdWNjZXNzID0gYWZ0ZXJQdXREb2M7XG4gICAgcHV0UmVxLm9uZXJyb3IgPSBhZnRlclB1dERvY0Vycm9yO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVBdHRhY2htZW50cyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjaykge1xuXG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuXG4gICAgdmFyIG51bURvbmUgPSAwO1xuICAgIHZhciBhdHRhY2htZW50cyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpO1xuXG4gICAgZnVuY3Rpb24gY29sbGVjdFJlc3VsdHMoKSB7XG4gICAgICBpZiAobnVtRG9uZSA9PT0gYXR0YWNobWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXR0YWNobWVudFNhdmVkKCkge1xuICAgICAgbnVtRG9uZSsrO1xuICAgICAgY29sbGVjdFJlc3VsdHMoKTtcbiAgICB9XG5cbiAgICBhdHRhY2htZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBhdHQgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2tleV07XG4gICAgICBpZiAoIWF0dC5zdHViKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXR0LmRhdGE7XG4gICAgICAgIGRlbGV0ZSBhdHQuZGF0YTtcbiAgICAgICAgYXR0LnJldnBvcyA9IHBhcnNlSW50KHdpbm5pbmdSZXYkJDEsIDEwKTtcbiAgICAgICAgdmFyIGRpZ2VzdCA9IGF0dC5kaWdlc3Q7XG4gICAgICAgIHNhdmVBdHRhY2htZW50KGRpZ2VzdCwgZGF0YSwgYXR0YWNobWVudFNhdmVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bURvbmUrKztcbiAgICAgICAgY29sbGVjdFJlc3VsdHMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIG1hcCBzZXFzIHRvIGF0dGFjaG1lbnQgZGlnZXN0cywgd2hpY2hcbiAgLy8gd2Ugd2lsbCBuZWVkIGxhdGVyIGR1cmluZyBjb21wYWN0aW9uXG4gIGZ1bmN0aW9uIGluc2VydEF0dGFjaG1lbnRNYXBwaW5ncyhkb2NJbmZvLCBzZXEsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgYXR0c0FkZGVkID0gMDtcbiAgICB2YXIgYXR0c1RvQWRkID0gT2JqZWN0LmtleXMoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cyB8fCB7fSk7XG5cbiAgICBpZiAoIWF0dHNUb0FkZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICAgIGlmICgrK2F0dHNBZGRlZCA9PT0gYXR0c1RvQWRkLmxlbmd0aCkge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZChhdHQpIHtcbiAgICAgIHZhciBkaWdlc3QgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2F0dF0uZGlnZXN0O1xuICAgICAgdmFyIHJlcSA9IGF0dGFjaEFuZFNlcVN0b3JlLnB1dCh7XG4gICAgICAgIHNlcTogc2VxLFxuICAgICAgICBkaWdlc3RTZXE6IGRpZ2VzdCArICc6OicgKyBzZXFcbiAgICAgIH0pO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gY2hlY2tEb25lO1xuICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyB0aGlzIGNhbGxiYWNrIGlzIGZvciBhIGNvbnN0YWludCBlcnJvciwgd2hpY2ggd2UgaWdub3JlXG4gICAgICAgIC8vIGJlY2F1c2UgdGhpcyBkb2NpZC9yZXYgaGFzIGFscmVhZHkgYmVlbiBhc3NvY2lhdGVkIHdpdGhcbiAgICAgICAgLy8gdGhlIGRpZ2VzdCAoZS5nLiB3aGVuIG5ld19lZGl0cyA9PSBmYWxzZSlcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBhYm9ydFxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBvbmVycm9yXG4gICAgICAgIGNoZWNrRG9uZSgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRzVG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZChhdHRzVG9BZGRbaV0pOyAvLyBkbyBpbiBwYXJhbGxlbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVBdHRhY2htZW50KGRpZ2VzdCwgZGF0YSwgY2FsbGJhY2spIHtcblxuXG4gICAgdmFyIGdldEtleVJlcSA9IGF0dGFjaFN0b3JlLmNvdW50KGRpZ2VzdCk7XG4gICAgZ2V0S2V5UmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgY291bnQgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7IC8vIGFscmVhZHkgZXhpc3RzXG4gICAgICB9XG4gICAgICB2YXIgbmV3QXR0ID0ge1xuICAgICAgICBkaWdlc3Q6IGRpZ2VzdCxcbiAgICAgICAgYm9keTogZGF0YVxuICAgICAgfTtcbiAgICAgIHZhciBwdXRSZXEgPSBhdHRhY2hTdG9yZS5wdXQobmV3QXR0KTtcbiAgICAgIHB1dFJlcS5vbnN1Y2Nlc3MgPSBjYWxsYmFjaztcbiAgICB9O1xuICB9XG59XG5cbi8vIEFic3RyYWN0aW9uIG92ZXIgSURCQ3Vyc29yIGFuZCBnZXRBbGwoKS9nZXRBbGxLZXlzKCkgdGhhdCBhbGxvd3MgdXMgdG8gYmF0Y2ggb3VyIG9wZXJhdGlvbnNcbi8vIHdoaWxlIGZhbGxpbmcgYmFjayB0byBhIG5vcm1hbCBJREJDdXJzb3Igb3BlcmF0aW9uIG9uIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBnZXRBbGwoKSBvclxuLy8gZ2V0QWxsS2V5cygpLiBUaGlzIGFsbG93cyBmb3IgYSBtdWNoIGZhc3RlciBpbXBsZW1lbnRhdGlvbiB0aGFuIGp1c3Qgc3RyYWlnaHQtdXAgY3Vyc29ycywgYmVjYXVzZVxuLy8gd2UncmUgbm90IHByb2Nlc3NpbmcgZWFjaCBkb2N1bWVudCBvbmUtYXQtYS10aW1lLlxuZnVuY3Rpb24gcnVuQmF0Y2hlZEN1cnNvcihvYmplY3RTdG9yZSwga2V5UmFuZ2UsIGRlc2NlbmRpbmcsIGJhdGNoU2l6ZSwgb25CYXRjaCkge1xuXG4gIGlmIChiYXRjaFNpemUgPT09IC0xKSB7XG4gICAgYmF0Y2hTaXplID0gMTAwMDtcbiAgfVxuXG4gIC8vIEJhaWwgb3V0IG9mIGdldEFsbCgpL2dldEFsbEtleXMoKSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICAvLyAxKSBlaXRoZXIgbWV0aG9kIGlzIHVuc3VwcG9ydGVkIC0gd2UgbmVlZCBib3RoXG4gIC8vIDIpIGJhdGNoU2l6ZSBpcyAxIChtaWdodCBhcyB3ZWxsIHVzZSBJREJDdXJzb3IpXG4gIC8vIDMpIGRlc2NlbmRpbmcg4oCTIG5vIHJlYWwgd2F5IHRvIGRvIHRoaXMgdmlhIGdldEFsbCgpL2dldEFsbEtleXMoKVxuXG4gIHZhciB1c2VHZXRBbGwgPSB0eXBlb2Ygb2JqZWN0U3RvcmUuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdFN0b3JlLmdldEFsbEtleXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICBiYXRjaFNpemUgPiAxICYmICFkZXNjZW5kaW5nO1xuXG4gIHZhciBrZXlzQmF0Y2g7XG4gIHZhciB2YWx1ZXNCYXRjaDtcbiAgdmFyIHBzZXVkb0N1cnNvcjtcblxuICBmdW5jdGlvbiBvbkdldEFsbChlKSB7XG4gICAgdmFsdWVzQmF0Y2ggPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKGtleXNCYXRjaCkge1xuICAgICAgb25CYXRjaChrZXlzQmF0Y2gsIHZhbHVlc0JhdGNoLCBwc2V1ZG9DdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uR2V0QWxsS2V5cyhlKSB7XG4gICAga2V5c0JhdGNoID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmICh2YWx1ZXNCYXRjaCkge1xuICAgICAgb25CYXRjaChrZXlzQmF0Y2gsIHZhbHVlc0JhdGNoLCBwc2V1ZG9DdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVlUHNldWRvQ3Vyc29yKCkge1xuICAgIGlmICgha2V5c0JhdGNoLmxlbmd0aCkgeyAvLyBubyBtb3JlIHJlc3VsdHNcbiAgICAgIHJldHVybiBvbkJhdGNoKCk7XG4gICAgfVxuICAgIC8vIGZldGNoIG5leHQgYmF0Y2gsIGV4Y2x1c2l2ZSBzdGFydFxuICAgIHZhciBsYXN0S2V5ID0ga2V5c0JhdGNoW2tleXNCYXRjaC5sZW5ndGggLSAxXTtcbiAgICB2YXIgbmV3S2V5UmFuZ2U7XG4gICAgaWYgKGtleVJhbmdlICYmIGtleVJhbmdlLnVwcGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXdLZXlSYW5nZSA9IElEQktleVJhbmdlLmJvdW5kKGxhc3RLZXksIGtleVJhbmdlLnVwcGVyLFxuICAgICAgICAgIHRydWUsIGtleVJhbmdlLnVwcGVyT3Blbik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09IFwiRGF0YUVycm9yXCIgJiYgZS5jb2RlID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG9uQmF0Y2goKTsgLy8gd2UncmUgZG9uZSwgc3RhcnRrZXkgYW5kIGVuZGtleSBhcmUgZXF1YWxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdLZXlSYW5nZSA9IElEQktleVJhbmdlLmxvd2VyQm91bmQobGFzdEtleSwgdHJ1ZSk7XG4gICAgfVxuICAgIGtleVJhbmdlID0gbmV3S2V5UmFuZ2U7XG4gICAga2V5c0JhdGNoID0gbnVsbDtcbiAgICB2YWx1ZXNCYXRjaCA9IG51bGw7XG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlLCBiYXRjaFNpemUpLm9uc3VjY2VzcyA9IG9uR2V0QWxsO1xuICAgIG9iamVjdFN0b3JlLmdldEFsbEtleXMoa2V5UmFuZ2UsIGJhdGNoU2l6ZSkub25zdWNjZXNzID0gb25HZXRBbGxLZXlzO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DdXJzb3IoZSkge1xuICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKCFjdXJzb3IpIHsgLy8gZG9uZVxuICAgICAgcmV0dXJuIG9uQmF0Y2goKTtcbiAgICB9XG4gICAgLy8gcmVndWxhciBJREJDdXJzb3IgYWN0cyBsaWtlIGEgYmF0Y2ggd2hlcmUgYmF0Y2ggc2l6ZSBpcyBhbHdheXMgMVxuICAgIG9uQmF0Y2goW2N1cnNvci5rZXldLCBbY3Vyc29yLnZhbHVlXSwgY3Vyc29yKTtcbiAgfVxuXG4gIGlmICh1c2VHZXRBbGwpIHtcbiAgICBwc2V1ZG9DdXJzb3IgPSB7XCJjb250aW51ZVwiOiBjb250aW51ZVBzZXVkb0N1cnNvcn07XG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlLCBiYXRjaFNpemUpLm9uc3VjY2VzcyA9IG9uR2V0QWxsO1xuICAgIG9iamVjdFN0b3JlLmdldEFsbEtleXMoa2V5UmFuZ2UsIGJhdGNoU2l6ZSkub25zdWNjZXNzID0gb25HZXRBbGxLZXlzO1xuICB9IGVsc2UgaWYgKGRlc2NlbmRpbmcpIHtcbiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlLCAncHJldicpLm9uc3VjY2VzcyA9IG9uQ3Vyc29yO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2UpLm9uc3VjY2VzcyA9IG9uQ3Vyc29yO1xuICB9XG59XG5cbi8vIHNpbXBsZSBzaGltIGZvciBvYmplY3RTdG9yZS5nZXRBbGwoKSwgZmFsbGluZyBiYWNrIHRvIElEQkN1cnNvclxuZnVuY3Rpb24gZ2V0QWxsKG9iamVjdFN0b3JlLCBrZXlSYW5nZSwgb25TdWNjZXNzKSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0U3RvcmUuZ2V0QWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gdXNlIG5hdGl2ZSBnZXRBbGxcbiAgICBvYmplY3RTdG9yZS5nZXRBbGwoa2V5UmFuZ2UpLm9uc3VjY2VzcyA9IG9uU3VjY2VzcztcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZmFsbCBiYWNrIHRvIGN1cnNvcnNcbiAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIG9uQ3Vyc29yKGUpIHtcbiAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmIChjdXJzb3IpIHtcbiAgICAgIHZhbHVlcy5wdXNoKGN1cnNvci52YWx1ZSk7XG4gICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25TdWNjZXNzKHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgcmVzdWx0OiB2YWx1ZXNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSkub25zdWNjZXNzID0gb25DdXJzb3I7XG59XG5cbmZ1bmN0aW9uIGFsbERvY3NLZXlzKGtleXMsIGRvY1N0b3JlLCBvbkJhdGNoKSB7XG4gIC8vIEl0J3Mgbm90IGd1YXJhbnRlZCB0byBiZSByZXR1cm5lZCBpbiByaWdodCBvcmRlciAgXG4gIHZhciB2YWx1ZXNCYXRjaCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gIHZhciBjb3VudCA9IDA7XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5LCBpbmRleCkge1xuICAgIGRvY1N0b3JlLmdldChrZXkpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5yZXN1bHQpIHtcbiAgICAgICAgdmFsdWVzQmF0Y2hbaW5kZXhdID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc0JhdGNoW2luZGV4XSA9IHtrZXk6IGtleSwgZXJyb3I6ICdub3RfZm91bmQnfTtcbiAgICAgIH1cbiAgICAgIGNvdW50Kys7XG4gICAgICBpZiAoY291bnQgPT09IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIG9uQmF0Y2goa2V5cywgdmFsdWVzQmF0Y2gsIHt9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5UmFuZ2Uoc3RhcnQsIGVuZCwgaW5jbHVzaXZlRW5kLCBrZXksIGRlc2NlbmRpbmcpIHtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICBpZiAoZGVzY2VuZGluZykge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoZW5kLCBzdGFydCwgIWluY2x1c2l2ZUVuZCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQsIGZhbHNlLCAhaW5jbHVzaXZlRW5kKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgICBpZiAoZGVzY2VuZGluZykge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UudXBwZXJCb3VuZChzdGFydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChzdGFydCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmQpIHtcbiAgICAgIGlmIChkZXNjZW5kaW5nKSB7XG4gICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5sb3dlckJvdW5kKGVuZCwgIWluY2x1c2l2ZUVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UudXBwZXJCb3VuZChlbmQsICFpbmNsdXNpdmVFbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5KSB7XG4gICAgICByZXR1cm4gSURCS2V5UmFuZ2Uub25seShrZXkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpZGJBbGxEb2NzKG9wdHMsIGlkYiwgY2FsbGJhY2spIHtcbiAgdmFyIHN0YXJ0ID0gJ3N0YXJ0a2V5JyBpbiBvcHRzID8gb3B0cy5zdGFydGtleSA6IGZhbHNlO1xuICB2YXIgZW5kID0gJ2VuZGtleScgaW4gb3B0cyA/IG9wdHMuZW5ka2V5IDogZmFsc2U7XG4gIHZhciBrZXkgPSAna2V5JyBpbiBvcHRzID8gb3B0cy5rZXkgOiBmYWxzZTtcbiAgdmFyIGtleXMgPSAna2V5cycgaW4gb3B0cyA/IG9wdHMua2V5cyA6IGZhbHNlOyBcbiAgdmFyIHNraXAgPSBvcHRzLnNraXAgfHwgMDtcbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgPT09ICdudW1iZXInID8gb3B0cy5saW1pdCA6IC0xO1xuICB2YXIgaW5jbHVzaXZlRW5kID0gb3B0cy5pbmNsdXNpdmVfZW5kICE9PSBmYWxzZTtcblxuICB2YXIga2V5UmFuZ2UgOyBcbiAgdmFyIGtleVJhbmdlRXJyb3I7XG4gIGlmICgha2V5cykge1xuICAgIGtleVJhbmdlID0gY3JlYXRlS2V5UmFuZ2Uoc3RhcnQsIGVuZCwgaW5jbHVzaXZlRW5kLCBrZXksIG9wdHMuZGVzY2VuZGluZyk7XG4gICAga2V5UmFuZ2VFcnJvciA9IGtleVJhbmdlICYmIGtleVJhbmdlLmVycm9yO1xuICAgIGlmIChrZXlSYW5nZUVycm9yICYmIFxuICAgICAgIShrZXlSYW5nZUVycm9yLm5hbWUgPT09IFwiRGF0YUVycm9yXCIgJiYga2V5UmFuZ2VFcnJvci5jb2RlID09PSAwKSkge1xuICAgICAgLy8gRGF0YUVycm9yIHdpdGggZXJyb3IgY29kZSAwIGluZGljYXRlcyBzdGFydCBpcyBsZXNzIHRoYW4gZW5kLCBzb1xuICAgICAgLy8gY2FuIGp1c3QgZG8gYW4gZW1wdHkgcXVlcnkuIEVsc2UgbmVlZCB0byB0aHJvd1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKElEQl9FUlJPUixcbiAgICAgICAga2V5UmFuZ2VFcnJvci5uYW1lLCBrZXlSYW5nZUVycm9yLm1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RvcmVzID0gW0RPQ19TVE9SRSwgQllfU0VRX1NUT1JFLCBNRVRBX1NUT1JFXTtcblxuICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgIHN0b3Jlcy5wdXNoKEFUVEFDSF9TVE9SRSk7XG4gIH1cbiAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIHN0b3JlcywgJ3JlYWRvbmx5Jyk7XG4gIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgfVxuICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgdHhuLm9uY29tcGxldGUgPSBvblR4bkNvbXBsZXRlO1xuICB0eG4ub25hYm9ydCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gIHZhciBzZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICB2YXIgbWV0YVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpO1xuICB2YXIgZG9jSWRSZXZJbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgZG9jQ291bnQ7XG4gIHZhciB1cGRhdGVTZXE7XG5cbiAgbWV0YVN0b3JlLmdldChNRVRBX1NUT1JFKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgIGRvY0NvdW50ID0gZS50YXJnZXQucmVzdWx0LmRvY0NvdW50O1xuICB9O1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgZ2V0TWF4VXBkYXRlU2VxKHNlcVN0b3JlLCBmdW5jdGlvbiAoZSkgeyBcbiAgICAgIGlmIChlLnRhcmdldC5yZXN1bHQgJiYgZS50YXJnZXQucmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXBkYXRlU2VxID0gZS50YXJnZXQucmVzdWx0WzBdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWF4VXBkYXRlU2VxKG9iamVjdFN0b3JlLCBvblN1Y2Nlc3MpIHtcbiAgICBmdW5jdGlvbiBvbkN1cnNvcihlKSB7XG4gICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgdmFyIG1heEtleSA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjdXJzb3IgJiYgY3Vyc29yLmtleSkge1xuICAgICAgICBtYXhLZXkgPSBjdXJzb3Iua2V5O1xuICAgICAgfSBcbiAgICAgIHJldHVybiBvblN1Y2Nlc3Moe1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICByZXN1bHQ6IFttYXhLZXldXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKG51bGwsICdwcmV2Jykub25zdWNjZXNzID0gb25DdXJzb3I7XG4gIH1cblxuICAvLyBpZiB0aGUgdXNlciBzcGVjaWZpZXMgaW5jbHVkZV9kb2NzPXRydWUsIHRoZW4gd2UgZG9uJ3RcbiAgLy8gd2FudCB0byBibG9jayB0aGUgbWFpbiBjdXJzb3Igd2hpbGUgd2UncmUgZmV0Y2hpbmcgdGhlIGRvY1xuICBmdW5jdGlvbiBmZXRjaERvY0FzeW5jaHJvbm91c2x5KG1ldGFkYXRhLCByb3csIHdpbm5pbmdSZXYkJDEpIHtcbiAgICB2YXIga2V5ID0gbWV0YWRhdGEuaWQgKyBcIjo6XCIgKyB3aW5uaW5nUmV2JCQxO1xuICAgIGRvY0lkUmV2SW5kZXguZ2V0KGtleSkub25zdWNjZXNzID0gIGZ1bmN0aW9uIG9uR2V0RG9jKGUpIHtcbiAgICAgIHJvdy5kb2MgPSBkZWNvZGVEb2MoZS50YXJnZXQucmVzdWx0KSB8fCB7fTtcbiAgICAgIGlmIChvcHRzLmNvbmZsaWN0cykge1xuICAgICAgICB2YXIgY29uZmxpY3RzID0gY29sbGVjdENvbmZsaWN0cyhtZXRhZGF0YSk7XG4gICAgICAgIGlmIChjb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICAgICAgcm93LmRvYy5fY29uZmxpY3RzID0gY29uZmxpY3RzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmZXRjaEF0dGFjaG1lbnRzSWZOZWNlc3Nhcnkocm93LmRvYywgb3B0cywgdHhuKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYWxsRG9jc0lubmVyKHdpbm5pbmdSZXYkJDEsIG1ldGFkYXRhKSB7XG4gICAgdmFyIHJvdyA9IHtcbiAgICAgIGlkOiBtZXRhZGF0YS5pZCxcbiAgICAgIGtleTogbWV0YWRhdGEuaWQsXG4gICAgICB2YWx1ZToge1xuICAgICAgICByZXY6IHdpbm5pbmdSZXYkJDFcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBkZWxldGVkID0gbWV0YWRhdGEuZGVsZXRlZDtcbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgaWYgKGtleXMpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJvdyk7XG4gICAgICAgIC8vIGRlbGV0ZWQgZG9jcyBhcmUgb2theSB3aXRoIFwia2V5c1wiIHJlcXVlc3RzXG4gICAgICAgIHJvdy52YWx1ZS5kZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgcm93LmRvYyA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChza2lwLS0gPD0gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHJvdyk7XG4gICAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgICAgZmV0Y2hEb2NBc3luY2hyb25vdXNseShtZXRhZGF0YSwgcm93LCB3aW5uaW5nUmV2JCQxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzQmF0Y2goYmF0Y2hWYWx1ZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYmF0Y2hWYWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gbGltaXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2YXIgYmF0Y2hWYWx1ZSA9IGJhdGNoVmFsdWVzW2ldO1xuICAgICAgaWYgKGJhdGNoVmFsdWUuZXJyb3IgJiYga2V5cykge1xuICAgICAgICAvLyBrZXkgd2FzIG5vdCBmb3VuZCB3aXRoIFwia2V5c1wiIHJlcXVlc3RzXG4gICAgICAgIHJlc3VsdHMucHVzaChiYXRjaFZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShiYXRjaFZhbHVlKTtcbiAgICAgIHZhciB3aW5uaW5nUmV2JCQxID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgIGFsbERvY3NJbm5lcih3aW5uaW5nUmV2JCQxLCBtZXRhZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25CYXRjaChiYXRjaEtleXMsIGJhdGNoVmFsdWVzLCBjdXJzb3IpIHtcbiAgICBpZiAoIWN1cnNvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzQmF0Y2goYmF0Y2hWYWx1ZXMpO1xuICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8IGxpbWl0KSB7XG4gICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkdldEFsbChlKSB7XG4gICAgdmFyIHZhbHVlcyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICBwcm9jZXNzQmF0Y2godmFsdWVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUmVzdWx0c1JlYWR5KCkge1xuICAgIHZhciByZXR1cm5WYWwgPSB7XG4gICAgICB0b3RhbF9yb3dzOiBkb2NDb3VudCxcbiAgICAgIG9mZnNldDogb3B0cy5za2lwLFxuICAgICAgcm93czogcmVzdWx0c1xuICAgIH07XG4gICAgXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSAmJiB1cGRhdGVTZXEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuVmFsLnVwZGF0ZV9zZXEgPSB1cGRhdGVTZXE7XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwsIHJldHVyblZhbCk7XG4gIH1cblxuICBmdW5jdGlvbiBvblR4bkNvbXBsZXRlKCkge1xuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMsIG9wdHMuYmluYXJ5KS50aGVuKG9uUmVzdWx0c1JlYWR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25SZXN1bHRzUmVhZHkoKTtcbiAgICB9XG4gIH1cblxuICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IHJlcXVlc3RzIGlmIHN0YXJ0ID4gZW5kIG9yIGxpbWl0ID09PSAwXG4gIGlmIChrZXlSYW5nZUVycm9yIHx8IGxpbWl0ID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChrZXlzKSB7XG4gICAgcmV0dXJuIGFsbERvY3NLZXlzKG9wdHMua2V5cywgZG9jU3RvcmUsIG9uQmF0Y2gpO1xuICB9XG4gIGlmIChsaW1pdCA9PT0gLTEpIHsgLy8ganVzdCBmZXRjaCBldmVyeXRoaW5nXG4gICAgcmV0dXJuIGdldEFsbChkb2NTdG9yZSwga2V5UmFuZ2UsIG9uR2V0QWxsKTtcbiAgfVxuICAvLyBlbHNlIGRvIGEgY3Vyc29yXG4gIC8vIGNob29zZSBhIGJhdGNoIHNpemUgYmFzZWQgb24gdGhlIHNraXAsIHNpbmNlIHdlJ2xsIG5lZWQgdG8gc2tpcCB0aGF0IG1hbnlcbiAgcnVuQmF0Y2hlZEN1cnNvcihkb2NTdG9yZSwga2V5UmFuZ2UsIG9wdHMuZGVzY2VuZGluZywgbGltaXQgKyBza2lwLCBvbkJhdGNoKTtcbn1cblxuLy9cbi8vIEJsb2JzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGFsbCB2ZXJzaW9ucyBvZiBJbmRleGVkREIsIG5vdGFibHlcbi8vIENocm9tZSA8MzcgYW5kIEFuZHJvaWQgPDUuIEluIHRob3NlIHZlcnNpb25zLCBzdG9yaW5nIGEgYmxvYiB3aWxsIHRocm93LlxuLy9cbi8vIFZhcmlvdXMgb3RoZXIgYmxvYiBidWdzIGV4aXN0IGluIENocm9tZSB2MzctNDIgKGluY2x1c2l2ZSkuXG4vLyBEZXRlY3RpbmcgdGhlbSBpcyBleHBlbnNpdmUgYW5kIGNvbmZ1c2luZyB0byB1c2VycywgYW5kIENocm9tZSAzNy00MlxuLy8gaXMgYXQgdmVyeSBsb3cgdXNhZ2Ugd29ybGR3aWRlLCBzbyB3ZSBkbyBhIGhhY2t5IHVzZXJBZ2VudCBjaGVjayBpbnN0ZWFkLlxuLy9cbi8vIGNvbnRlbnQtdHlwZSBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00MDgxMjBcbi8vIDQwNCBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDc5MTZcbi8vIEZpbGVSZWFkZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ3ODM2XG4vL1xuZnVuY3Rpb24gY2hlY2tCbG9iU3VwcG9ydCh0eG4pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgdmFyIGJsb2IkJDEgPSBjcmVhdGVCbG9iKFsnJ10pO1xuICAgIHZhciByZXEgPSB0eG4ub2JqZWN0U3RvcmUoREVURUNUX0JMT0JfU1VQUE9SVF9TVE9SRSkucHV0KGJsb2IkJDEsICdrZXknKTtcblxuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbWF0Y2hlZENocm9tZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgICAgdmFyIG1hdGNoZWRFZGdlID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLy8pO1xuICAgICAgLy8gTVMgRWRnZSBwcmV0ZW5kcyB0byBiZSBDaHJvbWUgNDI6XG4gICAgICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2hoODY5MzAxJTI4dj12cy44NSUyOS5hc3B4XG4gICAgICByZXNvbHZlKG1hdGNoZWRFZGdlIHx8ICFtYXRjaGVkQ2hyb21lIHx8XG4gICAgICAgIHBhcnNlSW50KG1hdGNoZWRDaHJvbWVbMV0sIDEwKSA+PSA0Myk7XG4gICAgfTtcblxuICAgIHJlcS5vbmVycm9yID0gdHhuLm9uYWJvcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gSWYgdGhlIHRyYW5zYWN0aW9uIGFib3J0cyBub3cgaXRzIGR1ZSB0byBub3QgYmVpbmcgYWJsZSB0b1xuICAgICAgLy8gd3JpdGUgdG8gdGhlIGRhdGFiYXNlLCBsaWtlbHkgZHVlIHRvIHRoZSBkaXNrIGJlaW5nIGZ1bGxcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9O1xuICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBlcnJvciwgc28gYXNzdW1lIHVuc3VwcG9ydGVkXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb3VudERvY3ModHhuLCBjYikge1xuICB2YXIgaW5kZXggPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKS5pbmRleCgnZGVsZXRlZE9yTG9jYWwnKTtcbiAgaW5kZXguY291bnQoSURCS2V5UmFuZ2Uub25seSgnMCcpKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgIGNiKGUudGFyZ2V0LnJlc3VsdCk7XG4gIH07XG59XG5cbi8vIFRoaXMgdGFzayBxdWV1ZSBlbnN1cmVzIHRoYXQgSURCIG9wZW4gY2FsbHMgYXJlIGRvbmUgaW4gdGhlaXIgb3duIHRpY2tcblxudmFyIHJ1bm5pbmcgPSBmYWxzZTtcbnZhciBxdWV1ZSA9IFtdO1xuXG5mdW5jdGlvbiB0cnlDb2RlKGZ1biwgZXJyLCByZXMsIFBvdWNoREIpIHtcbiAgdHJ5IHtcbiAgICBmdW4oZXJyLCByZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBTaG91bGRuJ3QgaGFwcGVuLCBidXQgaW4gc29tZSBvZGQgY2FzZXNcbiAgICAvLyBJbmRleGVkREIgaW1wbGVtZW50YXRpb25zIG1pZ2h0IHRocm93IGEgc3luY1xuICAgIC8vIGVycm9yLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCBhdCBsZWFzdCBsb2cgaXQuXG4gICAgUG91Y2hEQi5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlOZXh0KCkge1xuICBpZiAocnVubmluZyB8fCAhcXVldWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJ1bm5pbmcgPSB0cnVlO1xuICBxdWV1ZS5zaGlmdCgpKCk7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVUYXNrKGFjdGlvbiwgY2FsbGJhY2ssIFBvdWNoREIpIHtcbiAgcXVldWUucHVzaChmdW5jdGlvbiBydW5BY3Rpb24oKSB7XG4gICAgYWN0aW9uKGZ1bmN0aW9uIHJ1bkNhbGxiYWNrKGVyciwgcmVzKSB7XG4gICAgICB0cnlDb2RlKGNhbGxiYWNrLCBlcnIsIHJlcywgUG91Y2hEQik7XG4gICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gcnVuTmV4dCgpIHtcbiAgICAgICAgYXBwbHlOZXh0KFBvdWNoREIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuICBhcHBseU5leHQoKTtcbn1cblxuZnVuY3Rpb24gY2hhbmdlcyhvcHRzLCBhcGksIGRiTmFtZSwgaWRiKSB7XG4gIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICBpZiAob3B0cy5jb250aW51b3VzKSB7XG4gICAgdmFyIGlkID0gZGJOYW1lICsgJzonICsgdXVpZCgpO1xuICAgIGNoYW5nZXNIYW5kbGVyLmFkZExpc3RlbmVyKGRiTmFtZSwgaWQsIGFwaSwgb3B0cyk7XG4gICAgY2hhbmdlc0hhbmRsZXIubm90aWZ5KGRiTmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFuZ2VzSGFuZGxlci5yZW1vdmVMaXN0ZW5lcihkYk5hbWUsIGlkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGRvY0lkcyA9IG9wdHMuZG9jX2lkcyAmJiBuZXcgRXhwb3J0ZWRTZXQob3B0cy5kb2NfaWRzKTtcblxuICBvcHRzLnNpbmNlID0gb3B0cy5zaW5jZSB8fCAwO1xuICB2YXIgbGFzdFNlcSA9IG9wdHMuc2luY2U7XG5cbiAgdmFyIGxpbWl0ID0gJ2xpbWl0JyBpbiBvcHRzID8gb3B0cy5saW1pdCA6IC0xO1xuICBpZiAobGltaXQgPT09IDApIHtcbiAgICBsaW1pdCA9IDE7IC8vIHBlciBDb3VjaERCIF9jaGFuZ2VzIHNwZWNcbiAgfVxuXG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBudW1SZXN1bHRzID0gMDtcbiAgdmFyIGZpbHRlciA9IGZpbHRlckNoYW5nZShvcHRzKTtcbiAgdmFyIGRvY0lkc1RvTWV0YWRhdGEgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcblxuICB2YXIgdHhuO1xuICB2YXIgYnlTZXFTdG9yZTtcbiAgdmFyIGRvY1N0b3JlO1xuICB2YXIgZG9jSWRSZXZJbmRleDtcblxuICBmdW5jdGlvbiBvbkJhdGNoKGJhdGNoS2V5cywgYmF0Y2hWYWx1ZXMsIGN1cnNvcikge1xuICAgIGlmICghY3Vyc29yIHx8ICFiYXRjaEtleXMubGVuZ3RoKSB7IC8vIGRvbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgd2lubmluZ0RvY3MgPSBuZXcgQXJyYXkoYmF0Y2hLZXlzLmxlbmd0aCk7XG4gICAgdmFyIG1ldGFkYXRhcyA9IG5ldyBBcnJheShiYXRjaEtleXMubGVuZ3RoKTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NNZXRhZGF0YUFuZFdpbm5pbmdEb2MobWV0YWRhdGEsIHdpbm5pbmdEb2MpIHtcbiAgICAgIHZhciBjaGFuZ2UgPSBvcHRzLnByb2Nlc3NDaGFuZ2Uod2lubmluZ0RvYywgbWV0YWRhdGEsIG9wdHMpO1xuICAgICAgbGFzdFNlcSA9IGNoYW5nZS5zZXEgPSBtZXRhZGF0YS5zZXE7XG5cbiAgICAgIHZhciBmaWx0ZXJlZCA9IGZpbHRlcihjaGFuZ2UpO1xuICAgICAgaWYgKHR5cGVvZiBmaWx0ZXJlZCA9PT0gJ29iamVjdCcpIHsgLy8gYW55dGhpbmcgYnV0IHRydWUvZmFsc2UgaW5kaWNhdGVzIGVycm9yXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChmaWx0ZXJlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZmlsdGVyZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgbnVtUmVzdWx0cysrO1xuICAgICAgaWYgKG9wdHMucmV0dXJuX2RvY3MpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGNoYW5nZSk7XG4gICAgICB9XG4gICAgICAvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50IGltbWVkaWF0ZWx5XG4gICAgICAvLyBmb3IgdGhlIGJlbmVmaXQgb2YgbGl2ZSBsaXN0ZW5lcnNcbiAgICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGZldGNoQXR0YWNobWVudHNJZk5lY2Vzc2FyeSh3aW5uaW5nRG9jLCBvcHRzLCB0eG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHBvc3RQcm9jZXNzQXR0YWNobWVudHMoW2NoYW5nZV0sIG9wdHMuYmluYXJ5KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShjaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQmF0Y2hEb25lKCkge1xuICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gd2lubmluZ0RvY3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKG51bVJlc3VsdHMgPT09IGxpbWl0KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpbm5pbmdEb2MgPSB3aW5uaW5nRG9jc1tpXTtcbiAgICAgICAgaWYgKCF3aW5uaW5nRG9jKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1ldGFkYXRhID0gbWV0YWRhdGFzW2ldO1xuICAgICAgICBwcm9taXNlcy5wdXNoKHByb2Nlc3NNZXRhZGF0YUFuZFdpbm5pbmdEb2MobWV0YWRhdGEsIHdpbm5pbmdEb2MpKTtcbiAgICAgIH1cblxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNoYW5nZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBpZiAoY2hhbmdlc1tpXSkge1xuICAgICAgICAgICAgb3B0cy5vbkNoYW5nZShjaGFuZ2VzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKG9wdHMuY29tcGxldGUpO1xuXG4gICAgICBpZiAobnVtUmVzdWx0cyAhPT0gbGltaXQpIHtcbiAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggYWxsIG1ldGFkYXRhcy93aW5uaW5nZG9jcyBmcm9tIHRoaXMgYmF0Y2ggaW4gcGFyYWxsZWwsIHRoZW4gcHJvY2Vzc1xuICAgIC8vIHRoZW0gYWxsIG9ubHkgb25jZSBhbGwgZGF0YSBoYXMgYmVlbiBjb2xsZWN0ZWQuIFRoaXMgaXMgZG9uZSBpbiBwYXJhbGxlbFxuICAgIC8vIGJlY2F1c2UgaXQncyBmYXN0ZXIgdGhhbiBkb2luZyBpdCBvbmUtYXQtYS10aW1lLlxuICAgIHZhciBudW1Eb25lID0gMDtcbiAgICBiYXRjaFZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgdmFyIGRvYyA9IGRlY29kZURvYyh2YWx1ZSk7XG4gICAgICB2YXIgc2VxID0gYmF0Y2hLZXlzW2ldO1xuICAgICAgZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEoZG9jLCBzZXEsIGZ1bmN0aW9uIChtZXRhZGF0YSwgd2lubmluZ0RvYykge1xuICAgICAgICBtZXRhZGF0YXNbaV0gPSBtZXRhZGF0YTtcbiAgICAgICAgd2lubmluZ0RvY3NbaV0gPSB3aW5uaW5nRG9jO1xuICAgICAgICBpZiAoKytudW1Eb25lID09PSBiYXRjaEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgb25CYXRjaERvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkdldE1ldGFkYXRhKGRvYywgc2VxLCBtZXRhZGF0YSwgY2IpIHtcbiAgICBpZiAobWV0YWRhdGEuc2VxICE9PSBzZXEpIHtcbiAgICAgIC8vIHNvbWUgb3RoZXIgc2VxIGlzIGxhdGVyXG4gICAgICByZXR1cm4gY2IoKTtcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEud2lubmluZ1JldiA9PT0gZG9jLl9yZXYpIHtcbiAgICAgIC8vIHRoaXMgaXMgdGhlIHdpbm5pbmcgZG9jXG4gICAgICByZXR1cm4gY2IobWV0YWRhdGEsIGRvYyk7XG4gICAgfVxuXG4gICAgLy8gZmV0Y2ggd2lubmluZyBkb2MgaW4gc2VwYXJhdGUgcmVxdWVzdFxuICAgIHZhciBkb2NJZFJldiA9IGRvYy5faWQgKyAnOjonICsgbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICB2YXIgcmVxID0gZG9jSWRSZXZJbmRleC5nZXQoZG9jSWRSZXYpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgY2IobWV0YWRhdGEsIGRlY29kZURvYyhlLnRhcmdldC5yZXN1bHQpKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEoZG9jLCBzZXEsIGNiKSB7XG4gICAgaWYgKGRvY0lkcyAmJiAhZG9jSWRzLmhhcyhkb2MuX2lkKSkge1xuICAgICAgcmV0dXJuIGNiKCk7XG4gICAgfVxuXG4gICAgdmFyIG1ldGFkYXRhID0gZG9jSWRzVG9NZXRhZGF0YS5nZXQoZG9jLl9pZCk7XG4gICAgaWYgKG1ldGFkYXRhKSB7IC8vIGNhY2hlZFxuICAgICAgcmV0dXJuIG9uR2V0TWV0YWRhdGEoZG9jLCBzZXEsIG1ldGFkYXRhLCBjYik7XG4gICAgfVxuICAgIC8vIG1ldGFkYXRhIG5vdCBjYWNoZWQsIGhhdmUgdG8gZ28gZmV0Y2ggaXRcbiAgICBkb2NTdG9yZS5nZXQoZG9jLl9pZCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1ldGFkYXRhID0gZGVjb2RlTWV0YWRhdGEoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgIGRvY0lkc1RvTWV0YWRhdGEuc2V0KGRvYy5faWQsIG1ldGFkYXRhKTtcbiAgICAgIG9uR2V0TWV0YWRhdGEoZG9jLCBzZXEsIG1ldGFkYXRhLCBjYik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICBvcHRzLmNvbXBsZXRlKG51bGwsIHtcbiAgICAgIHJlc3VsdHM6IHJlc3VsdHMsXG4gICAgICBsYXN0X3NlcTogbGFzdFNlcVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25UeG5Db21wbGV0ZSgpIHtcbiAgICBpZiAoIW9wdHMuY29udGludW91cyAmJiBvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICAvLyBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgcG9zdFByb2Nlc3Npbmcgd2FzIGFscmVhZHkgZG9uZSxcbiAgICAgIC8vIHNvIGRvIGl0IGFnYWluXG4gICAgICBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMpLnRoZW4oZmluaXNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmluaXNoKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIG9iamVjdFN0b3JlcyA9IFtET0NfU1RPUkUsIEJZX1NFUV9TVE9SRV07XG4gIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgb2JqZWN0U3RvcmVzLnB1c2goQVRUQUNIX1NUT1JFKTtcbiAgfVxuICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgb2JqZWN0U3RvcmVzLCAncmVhZG9ubHknKTtcbiAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgIHJldHVybiBvcHRzLmNvbXBsZXRlKHR4blJlc3VsdC5lcnJvcik7XG4gIH1cbiAgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihvcHRzLmNvbXBsZXRlKTtcbiAgdHhuLm9uY29tcGxldGUgPSBvblR4bkNvbXBsZXRlO1xuXG4gIGJ5U2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgZG9jU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKTtcbiAgZG9jSWRSZXZJbmRleCA9IGJ5U2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG5cbiAgdmFyIGtleVJhbmdlID0gKG9wdHMuc2luY2UgJiYgIW9wdHMuZGVzY2VuZGluZykgP1xuICAgIElEQktleVJhbmdlLmxvd2VyQm91bmQob3B0cy5zaW5jZSwgdHJ1ZSkgOiBudWxsO1xuXG4gIHJ1bkJhdGNoZWRDdXJzb3IoYnlTZXFTdG9yZSwga2V5UmFuZ2UsIG9wdHMuZGVzY2VuZGluZywgbGltaXQsIG9uQmF0Y2gpO1xufVxuXG52YXIgY2FjaGVkREJzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG52YXIgYmxvYlN1cHBvcnRQcm9taXNlO1xudmFyIG9wZW5SZXFMaXN0ID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbmZ1bmN0aW9uIElkYlBvdWNoKG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBhcGkgPSB0aGlzO1xuXG4gIGVucXVldWVUYXNrKGZ1bmN0aW9uICh0aGlzQ2FsbGJhY2spIHtcbiAgICBpbml0KGFwaSwgb3B0cywgdGhpc0NhbGxiYWNrKTtcbiAgfSwgY2FsbGJhY2ssIGFwaS5jb25zdHJ1Y3Rvcik7XG59XG5cbmZ1bmN0aW9uIGluaXQoYXBpLCBvcHRzLCBjYWxsYmFjaykge1xuXG4gIHZhciBkYk5hbWUgPSBvcHRzLm5hbWU7XG5cbiAgdmFyIGlkYiA9IG51bGw7XG4gIHZhciBpZGJHbG9iYWxGYWlsdXJlRXJyb3IgPSBudWxsO1xuICBhcGkuX21ldGEgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGVucmljaENhbGxiYWNrRXJyb3IoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHtcbiAgICAgIGlmIChlcnJvciAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICFlcnJvci5yZWFzb24pIHtcbiAgICAgICAgaWYgKGlkYkdsb2JhbEZhaWx1cmVFcnJvcikge1xuICAgICAgICAgIGVycm9yLnJlYXNvbiA9IGlkYkdsb2JhbEZhaWx1cmVFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0KTtcbiAgICB9O1xuICB9XG5cbiAgLy8gY2FsbGVkIHdoZW4gY3JlYXRpbmcgYSBmcmVzaCBuZXcgZGF0YWJhc2VcbiAgZnVuY3Rpb24gY3JlYXRlU2NoZW1hKGRiKSB7XG4gICAgdmFyIGRvY1N0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoRE9DX1NUT1JFLCB7a2V5UGF0aCA6ICdpZCd9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShCWV9TRVFfU1RPUkUsIHthdXRvSW5jcmVtZW50OiB0cnVlfSlcbiAgICAgIC5jcmVhdGVJbmRleCgnX2RvY19pZF9yZXYnLCAnX2RvY19pZF9yZXYnLCB7dW5pcXVlOiB0cnVlfSk7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFLCB7a2V5UGF0aDogJ2RpZ2VzdCd9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShNRVRBX1NUT1JFLCB7a2V5UGF0aDogJ2lkJywgYXV0b0luY3JlbWVudDogZmFsc2V9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShERVRFQ1RfQkxPQl9TVVBQT1JUX1NUT1JFKTtcblxuICAgIC8vIGFkZGVkIGluIHYyXG4gICAgZG9jU3RvcmUuY3JlYXRlSW5kZXgoJ2RlbGV0ZWRPckxvY2FsJywgJ2RlbGV0ZWRPckxvY2FsJywge3VuaXF1ZSA6IGZhbHNlfSk7XG5cbiAgICAvLyBhZGRlZCBpbiB2M1xuICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKExPQ0FMX1NUT1JFLCB7a2V5UGF0aDogJ19pZCd9KTtcblxuICAgIC8vIGFkZGVkIGluIHY0XG4gICAgdmFyIGF0dEFuZFNlcVN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUsXG4gICAgICB7YXV0b0luY3JlbWVudDogdHJ1ZX0pO1xuICAgIGF0dEFuZFNlcVN0b3JlLmNyZWF0ZUluZGV4KCdzZXEnLCAnc2VxJyk7XG4gICAgYXR0QW5kU2VxU3RvcmUuY3JlYXRlSW5kZXgoJ2RpZ2VzdFNlcScsICdkaWdlc3RTZXEnLCB7dW5pcXVlOiB0cnVlfSk7XG4gIH1cblxuICAvLyBtaWdyYXRpb24gdG8gdmVyc2lvbiAyXG4gIC8vIHVuZm9ydHVuYXRlbHkgXCJkZWxldGVkT3JMb2NhbFwiIGlzIGEgbWlzbm9tZXIgbm93IHRoYXQgd2Ugbm8gbG9uZ2VyXG4gIC8vIHN0b3JlIGxvY2FsIGRvY3MgaW4gdGhlIG1haW4gZG9jLXN0b3JlLCBidXQgd2hhZGR5YWdvbm5hZG9cbiAgZnVuY3Rpb24gYWRkRGVsZXRlZE9yTG9jYWxJbmRleCh0eG4sIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgZG9jU3RvcmUuY3JlYXRlSW5kZXgoJ2RlbGV0ZWRPckxvY2FsJywgJ2RlbGV0ZWRPckxvY2FsJywge3VuaXF1ZSA6IGZhbHNlfSk7XG5cbiAgICBkb2NTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgY3Vyc29yID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gY3Vyc29yLnZhbHVlO1xuICAgICAgICB2YXIgZGVsZXRlZCA9IGlzRGVsZXRlZChtZXRhZGF0YSk7XG4gICAgICAgIG1ldGFkYXRhLmRlbGV0ZWRPckxvY2FsID0gZGVsZXRlZCA/IFwiMVwiIDogXCIwXCI7XG4gICAgICAgIGRvY1N0b3JlLnB1dChtZXRhZGF0YSk7XG4gICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gMyAocGFydCAxKVxuICBmdW5jdGlvbiBjcmVhdGVMb2NhbFN0b3JlU2NoZW1hKGRiKSB7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUsIHtrZXlQYXRoOiAnX2lkJ30pXG4gICAgICAuY3JlYXRlSW5kZXgoJ19kb2NfaWRfcmV2JywgJ19kb2NfaWRfcmV2Jywge3VuaXF1ZTogdHJ1ZX0pO1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gMyAocGFydCAyKVxuICBmdW5jdGlvbiBtaWdyYXRlTG9jYWxTdG9yZSh0eG4sIGNiKSB7XG4gICAgdmFyIGxvY2FsU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUpO1xuICAgIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuICAgIHZhciBzZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuXG4gICAgdmFyIGN1cnNvciA9IGRvY1N0b3JlLm9wZW5DdXJzb3IoKTtcbiAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgY3Vyc29yID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gY3Vyc29yLnZhbHVlO1xuICAgICAgICB2YXIgZG9jSWQgPSBtZXRhZGF0YS5pZDtcbiAgICAgICAgdmFyIGxvY2FsID0gaXNMb2NhbElkKGRvY0lkKTtcbiAgICAgICAgdmFyIHJldiA9IHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuICAgICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgICB2YXIgZG9jSWRSZXYgPSBkb2NJZCArIFwiOjpcIiArIHJldjtcbiAgICAgICAgICAvLyByZW1vdmUgYWxsIHNlcSBlbnRyaWVzXG4gICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jSWRcbiAgICAgICAgICB2YXIgc3RhcnQgPSBkb2NJZCArIFwiOjpcIjtcbiAgICAgICAgICB2YXIgZW5kID0gZG9jSWQgKyBcIjo6flwiO1xuICAgICAgICAgIHZhciBpbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICAgICAgICAgIHZhciByYW5nZSA9IElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgdmFyIHNlcUN1cnNvciA9IGluZGV4Lm9wZW5DdXJzb3IocmFuZ2UpO1xuICAgICAgICAgIHNlcUN1cnNvci5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgc2VxQ3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgaWYgKCFzZXFDdXJzb3IpIHtcbiAgICAgICAgICAgICAgLy8gZG9uZVxuICAgICAgICAgICAgICBkb2NTdG9yZS5kZWxldGUoY3Vyc29yLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBkYXRhID0gc2VxQ3Vyc29yLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZGF0YS5fZG9jX2lkX3JldiA9PT0gZG9jSWRSZXYpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JlLnB1dChkYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXFTdG9yZS5kZWxldGUoc2VxQ3Vyc29yLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICBzZXFDdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNiKSB7XG4gICAgICAgIGNiKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDQgKHBhcnQgMSlcbiAgZnVuY3Rpb24gYWRkQXR0YWNoQW5kU2VxU3RvcmUoZGIpIHtcbiAgICB2YXIgYXR0QW5kU2VxU3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShBVFRBQ0hfQU5EX1NFUV9TVE9SRSxcbiAgICAgIHthdXRvSW5jcmVtZW50OiB0cnVlfSk7XG4gICAgYXR0QW5kU2VxU3RvcmUuY3JlYXRlSW5kZXgoJ3NlcScsICdzZXEnKTtcbiAgICBhdHRBbmRTZXFTdG9yZS5jcmVhdGVJbmRleCgnZGlnZXN0U2VxJywgJ2RpZ2VzdFNlcScsIHt1bmlxdWU6IHRydWV9KTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDQgKHBhcnQgMilcbiAgZnVuY3Rpb24gbWlncmF0ZUF0dHNBbmRTZXFzKHR4biwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgICB2YXIgYXR0U3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKTtcbiAgICB2YXIgYXR0QW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuXG4gICAgLy8gbmVlZCB0byBhY3R1YWxseSBwb3B1bGF0ZSB0aGUgdGFibGUuIHRoaXMgaXMgdGhlIGV4cGVuc2l2ZSBwYXJ0LFxuICAgIC8vIHNvIGFzIGFuIG9wdGltaXphdGlvbiwgY2hlY2sgZmlyc3QgdGhhdCB0aGlzIGRhdGFiYXNlIGV2ZW5cbiAgICAvLyBjb250YWlucyBhdHRhY2htZW50c1xuICAgIHZhciByZXEgPSBhdHRTdG9yZS5jb3VudCgpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGNvdW50ID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsgLy8gZG9uZVxuICAgICAgfVxuXG4gICAgICBzZXFTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFjdXJzb3IpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsgLy8gZG9uZVxuICAgICAgICB9XG4gICAgICAgIHZhciBkb2MgPSBjdXJzb3IudmFsdWU7XG4gICAgICAgIHZhciBzZXEgPSBjdXJzb3IucHJpbWFyeUtleTtcbiAgICAgICAgdmFyIGF0dHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzIHx8IHt9KTtcbiAgICAgICAgdmFyIGRpZ2VzdE1hcCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGF0dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgYXR0ID0gZG9jLl9hdHRhY2htZW50c1thdHRzW2pdXTtcbiAgICAgICAgICBkaWdlc3RNYXBbYXR0LmRpZ2VzdF0gPSB0cnVlOyAvLyB1bmlxIGRpZ2VzdHMsIGp1c3QgaW4gY2FzZVxuICAgICAgICB9XG4gICAgICAgIHZhciBkaWdlc3RzID0gT2JqZWN0LmtleXMoZGlnZXN0TWFwKTtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGRpZ2VzdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgZGlnZXN0ID0gZGlnZXN0c1tqXTtcbiAgICAgICAgICBhdHRBbmRTZXFTdG9yZS5wdXQoe1xuICAgICAgICAgICAgc2VxOiBzZXEsXG4gICAgICAgICAgICBkaWdlc3RTZXE6IGRpZ2VzdCArICc6OicgKyBzZXFcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDVcbiAgLy8gSW5zdGVhZCBvZiByZWx5aW5nIG9uIG9uLXRoZS1mbHkgbWlncmF0aW9uIG9mIG1ldGFkYXRhLFxuICAvLyB0aGlzIGJyaW5ncyB0aGUgZG9jLXN0b3JlIHRvIGl0cyBtb2Rlcm4gZm9ybTpcbiAgLy8gLSBtZXRhZGF0YS53aW5uaW5ncmV2XG4gIC8vIC0gbWV0YWRhdGEuc2VxXG4gIC8vIC0gc3RyaW5naWZ5IHRoZSBtZXRhZGF0YSB3aGVuIHN0b3JpbmcgaXRcbiAgZnVuY3Rpb24gbWlncmF0ZU1ldGFkYXRhKHR4bikge1xuXG4gICAgZnVuY3Rpb24gZGVjb2RlTWV0YWRhdGFDb21wYXQoc3RvcmVkT2JqZWN0KSB7XG4gICAgICBpZiAoIXN0b3JlZE9iamVjdC5kYXRhKSB7XG4gICAgICAgIC8vIG9sZCBmb3JtYXQsIHdoZW4gd2UgZGlkbid0IHN0b3JlIGl0IHN0cmluZ2lmaWVkXG4gICAgICAgIHN0b3JlZE9iamVjdC5kZWxldGVkID0gc3RvcmVkT2JqZWN0LmRlbGV0ZWRPckxvY2FsID09PSAnMSc7XG4gICAgICAgIHJldHVybiBzdG9yZWRPYmplY3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVjb2RlTWV0YWRhdGEoc3RvcmVkT2JqZWN0KTtcbiAgICB9XG5cbiAgICAvLyBlbnN1cmUgdGhhdCBldmVyeSBtZXRhZGF0YSBoYXMgYSB3aW5uaW5nUmV2IGFuZCBzZXEsXG4gICAgLy8gd2hpY2ggd2FzIHByZXZpb3VzbHkgY3JlYXRlZCBvbi10aGUtZmx5IGJ1dCBiZXR0ZXIgdG8gbWlncmF0ZVxuICAgIHZhciBieVNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gICAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgdmFyIGN1cnNvciA9IGRvY1N0b3JlLm9wZW5DdXJzb3IoKTtcbiAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoIWN1cnNvcikge1xuICAgICAgICByZXR1cm47IC8vIGRvbmVcbiAgICAgIH1cbiAgICAgIHZhciBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhQ29tcGF0KGN1cnNvci52YWx1ZSk7XG5cbiAgICAgIG1ldGFkYXRhLndpbm5pbmdSZXYgPSBtZXRhZGF0YS53aW5uaW5nUmV2IHx8XG4gICAgICAgIHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuXG4gICAgICBmdW5jdGlvbiBmZXRjaE1ldGFkYXRhU2VxKCkge1xuICAgICAgICAvLyBtZXRhZGF0YS5zZXEgd2FzIGFkZGVkIHBvc3QtMy4yLjAsIHNvIGlmIGl0J3MgbWlzc2luZyxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBmZXRjaCBpdCBtYW51YWxseVxuICAgICAgICB2YXIgc3RhcnQgPSBtZXRhZGF0YS5pZCArICc6Oic7XG4gICAgICAgIHZhciBlbmQgPSBtZXRhZGF0YS5pZCArICc6OlxcdWZmZmYnO1xuICAgICAgICB2YXIgcmVxID0gYnlTZXFTdG9yZS5pbmRleCgnX2RvY19pZF9yZXYnKS5vcGVuQ3Vyc29yKFxuICAgICAgICAgIElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQpKTtcblxuICAgICAgICB2YXIgbWV0YWRhdGFTZXEgPSAwO1xuICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgIGlmICghY3Vyc29yKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5zZXEgPSBtZXRhZGF0YVNlcTtcbiAgICAgICAgICAgIHJldHVybiBvbkdldE1ldGFkYXRhU2VxKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBzZXEgPSBjdXJzb3IucHJpbWFyeUtleTtcbiAgICAgICAgICBpZiAoc2VxID4gbWV0YWRhdGFTZXEpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhU2VxID0gc2VxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25HZXRNZXRhZGF0YVNlcSgpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhVG9TdG9yZSA9IGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhLFxuICAgICAgICAgIG1ldGFkYXRhLndpbm5pbmdSZXYsIG1ldGFkYXRhLmRlbGV0ZWQpO1xuXG4gICAgICAgIHZhciByZXEgPSBkb2NTdG9yZS5wdXQobWV0YWRhdGFUb1N0b3JlKTtcbiAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGFkYXRhLnNlcSkge1xuICAgICAgICByZXR1cm4gb25HZXRNZXRhZGF0YVNlcSgpO1xuICAgICAgfVxuXG4gICAgICBmZXRjaE1ldGFkYXRhU2VxKCk7XG4gICAgfTtcblxuICB9XG5cbiAgYXBpLl9yZW1vdGUgPSBmYWxzZTtcbiAgYXBpLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdpZGInO1xuICB9O1xuXG4gIGFwaS5faWQgPSB0b1Byb21pc2UoZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sobnVsbCwgYXBpLl9tZXRhLmluc3RhbmNlSWQpO1xuICB9KTtcblxuICBhcGkuX2J1bGtEb2NzID0gZnVuY3Rpb24gaWRiX2J1bGtEb2NzKHJlcSwgcmVxT3B0cywgY2FsbGJhY2spIHtcbiAgICBpZGJCdWxrRG9jcyhvcHRzLCByZXEsIHJlcU9wdHMsIGFwaSwgaWRiLCBlbnJpY2hDYWxsYmFja0Vycm9yKGNhbGxiYWNrKSk7XG4gIH07XG5cbiAgLy8gRmlyc3Qgd2UgbG9vayB1cCB0aGUgbWV0YWRhdGEgaW4gdGhlIGlkcyBkYXRhYmFzZSwgdGhlbiB3ZSBmZXRjaCB0aGVcbiAgLy8gY3VycmVudCByZXZpc2lvbihzKSBmcm9tIHRoZSBieSBzZXF1ZW5jZSBzdG9yZVxuICBhcGkuX2dldCA9IGZ1bmN0aW9uIGlkYl9nZXQoaWQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRvYztcbiAgICB2YXIgbWV0YWRhdGE7XG4gICAgdmFyIGVycjtcbiAgICB2YXIgdHhuID0gb3B0cy5jdHg7XG4gICAgaWYgKCF0eG4pIHtcbiAgICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLFxuICAgICAgICBbRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsIEFUVEFDSF9TVE9SRV0sICdyZWFkb25seScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgY2FsbGJhY2soZXJyLCB7ZG9jOiBkb2MsIG1ldGFkYXRhOiBtZXRhZGF0YSwgY3R4OiB0eG59KTtcbiAgICB9XG5cbiAgICB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKS5nZXQoaWQpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAvLyB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSByZXN1bHQgaGVyZSBpZjpcbiAgICAgIC8vIDEuIHRoZXJlIGlzIG5vIHN1Y2ggZG9jdW1lbnRcbiAgICAgIC8vIDIuIHRoZSBkb2N1bWVudCBpcyBkZWxldGVkIGFuZCB3ZSBkb24ndCBhc2sgYWJvdXQgc3BlY2lmaWMgcmV2XG4gICAgICAvLyBXaGVuIHdlIGFzayB3aXRoIG9wdHMucmV2IHdlIGV4cGVjdCB0aGUgYW5zd2VyIHRvIGJlIGVpdGhlclxuICAgICAgLy8gZG9jIChwb3NzaWJseSB3aXRoIF9kZWxldGVkPXRydWUpIG9yIG1pc3NpbmcgZXJyb3JcbiAgICAgIGlmICghbWV0YWRhdGEpIHtcbiAgICAgICAgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsICdtaXNzaW5nJyk7XG4gICAgICAgIHJldHVybiBmaW5pc2goKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJldjtcbiAgICAgIGlmICghb3B0cy5yZXYpIHtcbiAgICAgICAgcmV2ID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgICAgdmFyIGRlbGV0ZWQgPSBpc0RlbGV0ZWQobWV0YWRhdGEpO1xuICAgICAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgICAgIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLCBcImRlbGV0ZWRcIik7XG4gICAgICAgICAgcmV0dXJuIGZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXYgPSBvcHRzLmxhdGVzdCA/IGxhdGVzdChvcHRzLnJldiwgbWV0YWRhdGEpIDogb3B0cy5yZXY7XG4gICAgICB9XG5cbiAgICAgIHZhciBvYmplY3RTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICAgICAgdmFyIGtleSA9IG1ldGFkYXRhLmlkICsgJzo6JyArIHJldjtcblxuICAgICAgb2JqZWN0U3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2JykuZ2V0KGtleSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgZG9jID0gZGVjb2RlRG9jKGRvYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICBlcnIgPSBjcmVhdGVFcnJvcihNSVNTSU5HX0RPQywgJ21pc3NpbmcnKTtcbiAgICAgICAgICByZXR1cm4gZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoKCk7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG5cbiAgYXBpLl9nZXRBdHRhY2htZW50ID0gZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2hJZCwgYXR0YWNobWVudCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICB2YXIgdHhuO1xuICAgIGlmIChvcHRzLmN0eCkge1xuICAgICAgdHhuID0gb3B0cy5jdHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLFxuICAgICAgICBbRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsIEFUVEFDSF9TVE9SRV0sICdyZWFkb25seScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgfVxuICAgIHZhciBkaWdlc3QgPSBhdHRhY2htZW50LmRpZ2VzdDtcbiAgICB2YXIgdHlwZSA9IGF0dGFjaG1lbnQuY29udGVudF90eXBlO1xuXG4gICAgdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSkuZ2V0KGRpZ2VzdCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBib2R5ID0gZS50YXJnZXQucmVzdWx0LmJvZHk7XG4gICAgICByZWFkQmxvYkRhdGEoYm9keSwgdHlwZSwgb3B0cy5iaW5hcnksIGZ1bmN0aW9uIChibG9iRGF0YSkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBibG9iRGF0YSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIGFwaS5faW5mbyA9IGZ1bmN0aW9uIGlkYl9pbmZvKGNhbGxiYWNrKSB7XG4gICAgdmFyIHVwZGF0ZVNlcTtcbiAgICB2YXIgZG9jQ291bnQ7XG5cbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW01FVEFfU1RPUkUsIEJZX1NFUV9TVE9SRV0sICdyZWFkb25seScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgICB0eG4ub2JqZWN0U3RvcmUoTUVUQV9TVE9SRSkuZ2V0KE1FVEFfU1RPUkUpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBkb2NDb3VudCA9IGUudGFyZ2V0LnJlc3VsdC5kb2NDb3VudDtcbiAgICB9O1xuICAgIHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpLm9wZW5DdXJzb3IobnVsbCwgJ3ByZXYnKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIHVwZGF0ZVNlcSA9IGN1cnNvciA/IGN1cnNvci5rZXkgOiAwO1xuICAgIH07XG5cbiAgICB0eG4ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgZG9jX2NvdW50OiBkb2NDb3VudCxcbiAgICAgICAgdXBkYXRlX3NlcTogdXBkYXRlU2VxLFxuICAgICAgICAvLyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlkYl9hdHRhY2htZW50X2Zvcm1hdDogKGFwaS5fbWV0YS5ibG9iU3VwcG9ydCA/ICdiaW5hcnknIDogJ2Jhc2U2NCcpXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIGFwaS5fYWxsRG9jcyA9IGZ1bmN0aW9uIGlkYl9hbGxEb2NzKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWRiQWxsRG9jcyhvcHRzLCBpZGIsIGVucmljaENhbGxiYWNrRXJyb3IoY2FsbGJhY2spKTtcbiAgfTtcblxuICBhcGkuX2NoYW5nZXMgPSBmdW5jdGlvbiBpZGJDaGFuZ2VzKG9wdHMpIHtcbiAgICByZXR1cm4gY2hhbmdlcyhvcHRzLCBhcGksIGRiTmFtZSwgaWRiKTtcbiAgfTtcblxuICBhcGkuX2Nsb3NlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9JbmRleGVkREIvSURCRGF0YWJhc2UjY2xvc2VcbiAgICAvLyBcIlJldHVybnMgaW1tZWRpYXRlbHkgYW5kIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBpbiBhIHNlcGFyYXRlIHRocmVhZC4uLlwiXG4gICAgaWRiLmNsb3NlKCk7XG4gICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH07XG5cbiAgYXBpLl9nZXRSZXZpc2lvblRyZWUgPSBmdW5jdGlvbiAoZG9jSWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtET0NfU1RPUkVdLCAncmVhZG9ubHknKTtcbiAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICB9XG4gICAgdmFyIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgdmFyIHJlcSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpLmdldChkb2NJZCk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGRvYyA9IGRlY29kZU1ldGFkYXRhKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRvYy5yZXZfdHJlZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgcmV2aXNpb25zIG9mIGRvY3VtZW50IGRvY0lkXG4gIC8vIHdoaWNoIGFyZSBsaXN0ZWQgaW4gcmV2cyBhbmQgc2V0cyB0aGlzIGRvY3VtZW50XG4gIC8vIHJldmlzaW9uIHRvIHRvIHJldl90cmVlXG4gIGFwaS5fZG9Db21wYWN0aW9uID0gZnVuY3Rpb24gKGRvY0lkLCByZXZzLCBjYWxsYmFjaykge1xuICAgIHZhciBzdG9yZXMgPSBbXG4gICAgICBET0NfU1RPUkUsXG4gICAgICBCWV9TRVFfU1RPUkUsXG4gICAgICBBVFRBQ0hfU1RPUkUsXG4gICAgICBBVFRBQ0hfQU5EX1NFUV9TVE9SRVxuICAgIF07XG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIHN0b3JlcywgJ3JlYWR3cml0ZScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcblxuICAgIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuXG4gICAgZG9jU3RvcmUuZ2V0KGRvY0lkKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgdHJhdmVyc2VSZXZUcmVlKG1ldGFkYXRhLnJldl90cmVlLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZIYXNoLCBjdHgsIG9wdHMpIHtcbiAgICAgICAgdmFyIHJldiA9IHBvcyArICctJyArIHJldkhhc2g7XG4gICAgICAgIGlmIChyZXZzLmluZGV4T2YocmV2KSAhPT0gLTEpIHtcbiAgICAgICAgICBvcHRzLnN0YXR1cyA9ICdtaXNzaW5nJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb21wYWN0UmV2cyhyZXZzLCBkb2NJZCwgdHhuKTtcbiAgICAgIHZhciB3aW5uaW5nUmV2JCQxID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgIHZhciBkZWxldGVkID0gbWV0YWRhdGEuZGVsZXRlZDtcbiAgICAgIHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpLnB1dChcbiAgICAgICAgZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEsIHdpbm5pbmdSZXYkJDEsIGRlbGV0ZWQpKTtcbiAgICB9O1xuICAgIHR4bi5vbmFib3J0ID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgIHR4bi5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xuICB9O1xuXG5cbiAgYXBpLl9nZXRMb2NhbCA9IGZ1bmN0aW9uIChpZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW0xPQ0FMX1NUT1JFXSwgJ3JlYWRvbmx5Jyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHZhciB0eCA9IHR4blJlc3VsdC50eG47XG4gICAgdmFyIHJlcSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKS5nZXQoaWQpO1xuXG4gICAgcmVxLm9uZXJyb3IgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBkb2NbJ19kb2NfaWRfcmV2J107IC8vIGZvciBiYWNrd2FyZHMgY29tcGF0XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRvYyk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX3B1dExvY2FsID0gZnVuY3Rpb24gKGRvYywgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgZGVsZXRlIGRvYy5fcmV2aXNpb25zOyAvLyBpZ25vcmUgdGhpcywgdHJ1c3QgdGhlIHJldlxuICAgIHZhciBvbGRSZXYgPSBkb2MuX3JldjtcbiAgICB2YXIgaWQgPSBkb2MuX2lkO1xuICAgIGlmICghb2xkUmV2KSB7XG4gICAgICBkb2MuX3JldiA9ICcwLTEnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MuX3JldiA9ICcwLScgKyAocGFyc2VJbnQob2xkUmV2LnNwbGl0KCctJylbMV0sIDEwKSArIDEpO1xuICAgIH1cblxuICAgIHZhciB0eCA9IG9wdHMuY3R4O1xuICAgIHZhciByZXQ7XG4gICAgaWYgKCF0eCkge1xuICAgICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtMT0NBTF9TVE9SRV0sICdyZWFkd3JpdGUnKTtcbiAgICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgICB9XG4gICAgICB0eCA9IHR4blJlc3VsdC50eG47XG4gICAgICB0eC5vbmVycm9yID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgICAgdHgub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG9TdG9yZSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKTtcbiAgICB2YXIgcmVxO1xuICAgIGlmIChvbGRSZXYpIHtcbiAgICAgIHJlcSA9IG9TdG9yZS5nZXQoaWQpO1xuICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBvbGREb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGlmICghb2xkRG9jIHx8IG9sZERvYy5fcmV2ICE9PSBvbGRSZXYpIHtcbiAgICAgICAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gdXBkYXRlXG4gICAgICAgICAgdmFyIHJlcSA9IG9TdG9yZS5wdXQoZG9jKTtcbiAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0ID0ge29rOiB0cnVlLCBpZDogZG9jLl9pZCwgcmV2OiBkb2MuX3Jldn07XG4gICAgICAgICAgICBpZiAob3B0cy5jdHgpIHsgLy8gcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgeyAvLyBuZXcgZG9jXG4gICAgICByZXEgPSBvU3RvcmUuYWRkKGRvYyk7XG4gICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIC8vIGNvbnN0cmFpbnQgZXJyb3IsIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKFJFVl9DT05GTElDVCkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIGFib3J0XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIG9uZXJyb3JcbiAgICAgIH07XG4gICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXQgPSB7b2s6IHRydWUsIGlkOiBkb2MuX2lkLCByZXY6IGRvYy5fcmV2fTtcbiAgICAgICAgaWYgKG9wdHMuY3R4KSB7IC8vIHJldHVybiBpbW1lZGlhdGVseVxuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIGFwaS5fcmVtb3ZlTG9jYWwgPSBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICB2YXIgdHggPSBvcHRzLmN0eDtcbiAgICBpZiAoIXR4KSB7XG4gICAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW0xPQ0FMX1NUT1JFXSwgJ3JlYWR3cml0ZScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4ID0gdHhuUmVzdWx0LnR4bjtcbiAgICAgIHR4Lm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgcmV0O1xuICAgIHZhciBpZCA9IGRvYy5faWQ7XG4gICAgdmFyIG9TdG9yZSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKTtcbiAgICB2YXIgcmVxID0gb1N0b3JlLmdldChpZCk7XG5cbiAgICByZXEub25lcnJvciA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbGREb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoIW9sZERvYyB8fCBvbGREb2MuX3JldiAhPT0gZG9jLl9yZXYpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9TdG9yZS5kZWxldGUoaWQpO1xuICAgICAgICByZXQgPSB7b2s6IHRydWUsIGlkOiBpZCwgcmV2OiAnMC0wJ307XG4gICAgICAgIGlmIChvcHRzLmN0eCkgeyAvLyByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgICBjaGFuZ2VzSGFuZGxlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZGJOYW1lKTtcblxuICAgIC8vQ2xvc2Ugb3BlbiByZXF1ZXN0IGZvciBcImRiTmFtZVwiIGRhdGFiYXNlIHRvIGZpeCBpZSBkZWxheS5cbiAgICB2YXIgb3BlblJlcSA9IG9wZW5SZXFMaXN0LmdldChkYk5hbWUpO1xuICAgIGlmIChvcGVuUmVxICYmIG9wZW5SZXEucmVzdWx0KSB7XG4gICAgICBvcGVuUmVxLnJlc3VsdC5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH1cbiAgICB2YXIgcmVxID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKGRiTmFtZSk7XG5cbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy9SZW1vdmUgb3BlbiByZXF1ZXN0IGZyb20gdGhlIGxpc3QuXG4gICAgICBvcGVuUmVxTGlzdC5kZWxldGUoZGJOYW1lKTtcbiAgICAgIGlmIChoYXNMb2NhbFN0b3JhZ2UoKSAmJiAoZGJOYW1lIGluIGxvY2FsU3RvcmFnZSkpIHtcbiAgICAgICAgZGVsZXRlIGxvY2FsU3RvcmFnZVtkYk5hbWVdO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgeyAnb2snOiB0cnVlIH0pO1xuICAgIH07XG5cbiAgICByZXEub25lcnJvciA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgfTtcblxuICB2YXIgY2FjaGVkID0gY2FjaGVkREJzLmdldChkYk5hbWUpO1xuXG4gIGlmIChjYWNoZWQpIHtcbiAgICBpZGIgPSBjYWNoZWQuaWRiO1xuICAgIGFwaS5fbWV0YSA9IGNhY2hlZC5nbG9iYWw7XG4gICAgcmV0dXJuIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCBhcGkpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHJlcSA9IGluZGV4ZWREQi5vcGVuKGRiTmFtZSwgQURBUFRFUl9WRVJTSU9OKTtcbiAgb3BlblJlcUxpc3Quc2V0KGRiTmFtZSwgcmVxKTtcblxuICByZXEub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgZGIgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKGUub2xkVmVyc2lvbiA8IDEpIHtcbiAgICAgIHJldHVybiBjcmVhdGVTY2hlbWEoZGIpOyAvLyBuZXcgZGIsIGluaXRpYWwgc2NoZW1hXG4gICAgfVxuICAgIC8vIGRvIG1pZ3JhdGlvbnNcblxuICAgIHZhciB0eG4gPSBlLmN1cnJlbnRUYXJnZXQudHJhbnNhY3Rpb247XG4gICAgLy8gdGhlc2UgbWlncmF0aW9ucyBoYXZlIHRvIGJlIGRvbmUgaW4gdGhpcyBmdW5jdGlvbiwgYmVmb3JlXG4gICAgLy8gY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgZXZlbnQgbG9vcCwgYmVjYXVzZSBJbmRleGVkREJcblxuICAgIGlmIChlLm9sZFZlcnNpb24gPCAzKSB7XG4gICAgICBjcmVhdGVMb2NhbFN0b3JlU2NoZW1hKGRiKTsgLy8gdjIgLT4gdjNcbiAgICB9XG4gICAgaWYgKGUub2xkVmVyc2lvbiA8IDQpIHtcbiAgICAgIGFkZEF0dGFjaEFuZFNlcVN0b3JlKGRiKTsgLy8gdjMgLT4gdjRcbiAgICB9XG5cbiAgICB2YXIgbWlncmF0aW9ucyA9IFtcbiAgICAgIGFkZERlbGV0ZWRPckxvY2FsSW5kZXgsIC8vIHYxIC0+IHYyXG4gICAgICBtaWdyYXRlTG9jYWxTdG9yZSwgICAgICAvLyB2MiAtPiB2M1xuICAgICAgbWlncmF0ZUF0dHNBbmRTZXFzLCAgICAgLy8gdjMgLT4gdjRcbiAgICAgIG1pZ3JhdGVNZXRhZGF0YSAgICAgICAgIC8vIHY0IC0+IHY1XG4gICAgXTtcblxuICAgIHZhciBpID0gZS5vbGRWZXJzaW9uO1xuXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHZhciBtaWdyYXRpb24gPSBtaWdyYXRpb25zW2kgLSAxXTtcbiAgICAgIGkrKztcbiAgICAgIGlmIChtaWdyYXRpb24pIHtcbiAgICAgICAgbWlncmF0aW9uKHR4biwgbmV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xuXG4gIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuXG4gICAgaWRiID0gZS50YXJnZXQucmVzdWx0O1xuXG4gICAgaWRiLm9udmVyc2lvbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlkYi5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH07XG5cbiAgICBpZGIub25hYm9ydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLCAnRGF0YWJhc2UgaGFzIGEgZ2xvYmFsIGZhaWx1cmUnLCBlLnRhcmdldC5lcnJvcik7XG4gICAgICBpZGJHbG9iYWxGYWlsdXJlRXJyb3IgPSBlLnRhcmdldC5lcnJvcjtcbiAgICAgIGlkYi5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH07XG5cbiAgICAvLyBEbyBhIGZldyBzZXR1cCBvcGVyYXRpb25zIChpbiBwYXJhbGxlbCBhcyBtdWNoIGFzIHBvc3NpYmxlKTpcbiAgICAvLyAxLiBGZXRjaCBtZXRhIGRvY1xuICAgIC8vIDIuIENoZWNrIGJsb2Igc3VwcG9ydFxuICAgIC8vIDMuIENhbGN1bGF0ZSBkb2NDb3VudFxuICAgIC8vIDQuIEdlbmVyYXRlIGFuIGluc3RhbmNlSWQgaWYgbmVjZXNzYXJ5XG4gICAgLy8gNS4gU3RvcmUgZG9jQ291bnQgYW5kIGluc3RhbmNlSWQgb24gbWV0YSBkb2NcblxuICAgIHZhciB0eG4gPSBpZGIudHJhbnNhY3Rpb24oW1xuICAgICAgTUVUQV9TVE9SRSxcbiAgICAgIERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUsXG4gICAgICBET0NfU1RPUkVcbiAgICBdLCAncmVhZHdyaXRlJyk7XG5cbiAgICB2YXIgc3RvcmVkTWV0YURvYyA9IGZhbHNlO1xuICAgIHZhciBtZXRhRG9jO1xuICAgIHZhciBkb2NDb3VudDtcbiAgICB2YXIgYmxvYlN1cHBvcnQ7XG4gICAgdmFyIGluc3RhbmNlSWQ7XG5cbiAgICBmdW5jdGlvbiBjb21wbGV0ZVNldHVwKCkge1xuICAgICAgaWYgKHR5cGVvZiBibG9iU3VwcG9ydCA9PT0gJ3VuZGVmaW5lZCcgfHwgIXN0b3JlZE1ldGFEb2MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLl9tZXRhID0ge1xuICAgICAgICBuYW1lOiBkYk5hbWUsXG4gICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlSWQsXG4gICAgICAgIGJsb2JTdXBwb3J0OiBibG9iU3VwcG9ydFxuICAgICAgfTtcblxuICAgICAgY2FjaGVkREJzLnNldChkYk5hbWUsIHtcbiAgICAgICAgaWRiOiBpZGIsXG4gICAgICAgIGdsb2JhbDogYXBpLl9tZXRhXG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGFwaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RvcmVNZXRhRG9jSWZSZWFkeSgpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jQ291bnQgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBtZXRhRG9jID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaW5zdGFuY2VLZXkgPSBkYk5hbWUgKyAnX2lkJztcbiAgICAgIGlmIChpbnN0YW5jZUtleSBpbiBtZXRhRG9jKSB7XG4gICAgICAgIGluc3RhbmNlSWQgPSBtZXRhRG9jW2luc3RhbmNlS2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGFEb2NbaW5zdGFuY2VLZXldID0gaW5zdGFuY2VJZCA9IHV1aWQoKTtcbiAgICAgIH1cbiAgICAgIG1ldGFEb2MuZG9jQ291bnQgPSBkb2NDb3VudDtcbiAgICAgIHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKS5wdXQobWV0YURvYyk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBmZXRjaCBvciBnZW5lcmF0ZSB0aGUgaW5zdGFuY2VJZFxuICAgIC8vXG4gICAgdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpLmdldChNRVRBX1NUT1JFKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgbWV0YURvYyA9IGUudGFyZ2V0LnJlc3VsdCB8fCB7IGlkOiBNRVRBX1NUT1JFIH07XG4gICAgICBzdG9yZU1ldGFEb2NJZlJlYWR5KCk7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gY291bnREb2NzXG4gICAgLy9cbiAgICBjb3VudERvY3ModHhuLCBmdW5jdGlvbiAoY291bnQpIHtcbiAgICAgIGRvY0NvdW50ID0gY291bnQ7XG4gICAgICBzdG9yZU1ldGFEb2NJZlJlYWR5KCk7XG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIGNoZWNrIGJsb2Igc3VwcG9ydFxuICAgIC8vXG4gICAgaWYgKCFibG9iU3VwcG9ydFByb21pc2UpIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSBibG9iIHN1cHBvcnQgaXMgb25seSBjaGVja2VkIG9uY2VcbiAgICAgIGJsb2JTdXBwb3J0UHJvbWlzZSA9IGNoZWNrQmxvYlN1cHBvcnQodHhuKTtcbiAgICB9XG5cbiAgICBibG9iU3VwcG9ydFByb21pc2UudGhlbihmdW5jdGlvbiAodmFsKSB7XG4gICAgICBibG9iU3VwcG9ydCA9IHZhbDtcbiAgICAgIGNvbXBsZXRlU2V0dXAoKTtcbiAgICB9KTtcblxuICAgIC8vIG9ubHkgd2hlbiB0aGUgbWV0YWRhdGEgcHV0IHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsXG4gICAgLy8gY29uc2lkZXIgdGhlIHNldHVwIGRvbmVcbiAgICB0eG4ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHN0b3JlZE1ldGFEb2MgPSB0cnVlO1xuICAgICAgY29tcGxldGVTZXR1cCgpO1xuICAgIH07XG4gICAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gIH07XG5cbiAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBtc2cgPSBlLnRhcmdldC5lcnJvciAmJiBlLnRhcmdldC5lcnJvci5tZXNzYWdlO1xuXG4gICAgaWYgKCFtc2cpIHtcbiAgICAgIG1zZyA9ICdGYWlsZWQgdG8gb3BlbiBpbmRleGVkREIsIGFyZSB5b3UgaW4gcHJpdmF0ZSBicm93c2luZyBtb2RlPyc7XG4gICAgfSBlbHNlIGlmIChtc2cuaW5kZXhPZihcInN0b3JlZCBkYXRhYmFzZSBpcyBhIGhpZ2hlciB2ZXJzaW9uXCIpICE9PSAtMSkge1xuICAgICAgbXNnID0gbmV3IEVycm9yKCdUaGlzIERCIHdhcyBjcmVhdGVkIHdpdGggdGhlIG5ld2VyIFwiaW5kZXhlZGRiXCIgYWRhcHRlciwgYnV0IHlvdSBhcmUgdHJ5aW5nIHRvIG9wZW4gaXQgd2l0aCB0aGUgb2xkZXIgXCJpZGJcIiBhZGFwdGVyJyk7XG4gICAgfVxuXG4gICAgZ3VhcmRlZENvbnNvbGUoJ2Vycm9yJywgbXNnKTtcbiAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihJREJfRVJST1IsIG1zZykpO1xuICB9O1xufVxuXG5JZGJQb3VjaC52YWxpZCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRm9sbG93aW5nICM3MDg1IGJ1Z2d5IGlkYiB2ZXJzaW9ucyAodHlwaWNhbGx5IFNhZmFyaSA8IDEwLjEpIGFyZVxuICAvLyBjb25zaWRlcmVkIHZhbGlkLlxuXG4gIC8vIE9uIEZpcmVmb3ggU2VjdXJpdHlFcnJvciBpcyB0aHJvd24gd2hpbGUgcmVmZXJlbmNpbmcgaW5kZXhlZERCIGlmIGNvb2tpZXNcbiAgLy8gYXJlIG5vdCBhbGxvd2VkLiBgdHlwZW9mIGluZGV4ZWREQmAgYWxzbyB0cmlnZ2VycyB0aGUgZXJyb3IuXG4gIHRyeSB7XG4gICAgLy8gc29tZSBvdXRkYXRlZCBpbXBsZW1lbnRhdGlvbnMgb2YgSURCIHRoYXQgYXBwZWFyIG9uIFNhbXN1bmdcbiAgICAvLyBhbmQgSFRDIEFuZHJvaWQgZGV2aWNlcyA8NC40IGFyZSBtaXNzaW5nIElEQktleVJhbmdlXG4gICAgcmV0dXJuIHR5cGVvZiBpbmRleGVkREIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBJREJLZXlSYW5nZSAhPT0gJ3VuZGVmaW5lZCc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIElEQlBvdWNoIChQb3VjaERCKSB7XG4gIFBvdWNoREIuYWRhcHRlcignaWRiJywgSWRiUG91Y2gsIHRydWUpO1xufVxuXG4vLyBkZWFkIHNpbXBsZSBwcm9taXNlIHBvb2wsIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS90aW1kcC9lczYtcHJvbWlzZS1wb29sXG4vLyBidXQgbXVjaCBzbWFsbGVyIGluIGNvZGUgc2l6ZS4gbGltaXRzIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBwcm9taXNlcyB0aGF0IGFyZSBleGVjdXRlZFxuXG5cbmZ1bmN0aW9uIHBvb2wocHJvbWlzZUZhY3RvcmllcywgbGltaXQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcnVubmluZyA9IDA7XG4gICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgIHZhciBkb25lID0gMDtcbiAgICB2YXIgbGVuID0gcHJvbWlzZUZhY3Rvcmllcy5sZW5ndGg7XG4gICAgdmFyIGVycjtcblxuICAgIGZ1bmN0aW9uIHJ1bk5leHQoKSB7XG4gICAgICBydW5uaW5nKys7XG4gICAgICBwcm9taXNlRmFjdG9yaWVzW2N1cnJlbnQrK10oKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9OZXh0KCkge1xuICAgICAgaWYgKCsrZG9uZSA9PT0gbGVuKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydW5OZXh0QmF0Y2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoKSB7XG4gICAgICBydW5uaW5nLS07XG4gICAgICBkb05leHQoKTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGZ1bmN0aW9uIG9uRXJyb3IodGhpc0Vycikge1xuICAgICAgcnVubmluZy0tO1xuICAgICAgZXJyID0gZXJyIHx8IHRoaXNFcnI7XG4gICAgICBkb05leHQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5OZXh0QmF0Y2goKSB7XG4gICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIGN1cnJlbnQgPCBsZW4pIHtcbiAgICAgICAgcnVuTmV4dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJ1bk5leHRCYXRjaCgpO1xuICB9KTtcbn1cblxudmFyIENIQU5HRVNfQkFUQ0hfU0laRSA9IDI1O1xudmFyIE1BWF9TSU1VTFRBTkVPVVNfUkVWUyA9IDUwO1xudmFyIENIQU5HRVNfVElNRU9VVF9CVUZGRVIgPSA1MDAwO1xudmFyIERFRkFVTFRfSEVBUlRCRUFUID0gMTAwMDA7XG5cbnZhciBzdXBwb3J0c0J1bGtHZXRNYXAgPSB7fTtcblxuZnVuY3Rpb24gcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIocm93KSB7XG4gIHZhciBkb2MgPSByb3cuZG9jIHx8IHJvdy5vaztcbiAgdmFyIGF0dHMgPSBkb2MgJiYgZG9jLl9hdHRhY2htZW50cztcbiAgaWYgKCFhdHRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIE9iamVjdC5rZXlzKGF0dHMpLmZvckVhY2goZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgIGF0dC5kYXRhID0gYjY0VG9CbHVmZmVyKGF0dC5kYXRhLCBhdHQuY29udGVudF90eXBlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuY29kZURvY0lkKGlkKSB7XG4gIGlmICgvXl9kZXNpZ24vLnRlc3QoaWQpKSB7XG4gICAgcmV0dXJuICdfZGVzaWduLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQuc2xpY2UoOCkpO1xuICB9XG4gIGlmICgvXl9sb2NhbC8udGVzdChpZCkpIHtcbiAgICByZXR1cm4gJ19sb2NhbC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkLnNsaWNlKDcpKTtcbiAgfVxuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGlkKTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEoZG9jKSB7XG4gIGlmICghZG9jLl9hdHRhY2htZW50cyB8fCAhT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgYXR0YWNobWVudCA9IGRvYy5fYXR0YWNobWVudHNba2V5XTtcbiAgICBpZiAoYXR0YWNobWVudC5kYXRhICYmIHR5cGVvZiBhdHRhY2htZW50LmRhdGEgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgYmxvYlRvQmFzZTY0KGF0dGFjaG1lbnQuZGF0YSwgcmVzb2x2ZSk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChiNjQpIHtcbiAgICAgICAgYXR0YWNobWVudC5kYXRhID0gYjY0O1xuICAgICAgfSk7XG4gICAgfVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGhhc1VybFByZWZpeChvcHRzKSB7XG4gIGlmICghb3B0cy5wcmVmaXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvY29sID0gcGFyc2VVcmkob3B0cy5wcmVmaXgpLnByb3RvY29sO1xuICByZXR1cm4gcHJvdG9jb2wgPT09ICdodHRwJyB8fCBwcm90b2NvbCA9PT0gJ2h0dHBzJztcbn1cblxuLy8gR2V0IGFsbCB0aGUgaW5mb3JtYXRpb24geW91IHBvc3NpYmx5IGNhbiBhYm91dCB0aGUgVVJJIGdpdmVuIGJ5IG5hbWUgYW5kXG4vLyByZXR1cm4gaXQgYXMgYSBzdWl0YWJsZSBvYmplY3QuXG5mdW5jdGlvbiBnZXRIb3N0KG5hbWUsIG9wdHMpIHtcbiAgLy8gZW5jb2RlIGRiIG5hbWUgaWYgb3B0cy5wcmVmaXggaXMgYSB1cmwgKCM1NTc0KVxuICBpZiAoaGFzVXJsUHJlZml4KG9wdHMpKSB7XG4gICAgdmFyIGRiTmFtZSA9IG9wdHMubmFtZS5zdWJzdHIob3B0cy5wcmVmaXgubGVuZ3RoKTtcbiAgICAvLyBFbnN1cmUgcHJlZml4IGhhcyBhIHRyYWlsaW5nIHNsYXNoXG4gICAgdmFyIHByZWZpeCA9IG9wdHMucHJlZml4LnJlcGxhY2UoL1xcLz8kLywgJy8nKTtcbiAgICBuYW1lID0gcHJlZml4ICsgZW5jb2RlVVJJQ29tcG9uZW50KGRiTmFtZSk7XG4gIH1cblxuICB2YXIgdXJpID0gcGFyc2VVcmkobmFtZSk7XG4gIGlmICh1cmkudXNlciB8fCB1cmkucGFzc3dvcmQpIHtcbiAgICB1cmkuYXV0aCA9IHt1c2VybmFtZTogdXJpLnVzZXIsIHBhc3N3b3JkOiB1cmkucGFzc3dvcmR9O1xuICB9XG5cbiAgLy8gU3BsaXQgdGhlIHBhdGggcGFydCBvZiB0aGUgVVJJIGludG8gcGFydHMgdXNpbmcgJy8nIGFzIHRoZSBkZWxpbWl0ZXJcbiAgLy8gYWZ0ZXIgcmVtb3ZpbmcgYW55IGxlYWRpbmcgJy8nIGFuZCBhbnkgdHJhaWxpbmcgJy8nXG4gIHZhciBwYXJ0cyA9IHVyaS5wYXRoLnJlcGxhY2UoLyheXFwvfFxcLyQpL2csICcnKS5zcGxpdCgnLycpO1xuXG4gIHVyaS5kYiA9IHBhcnRzLnBvcCgpO1xuICAvLyBQcmV2ZW50IGRvdWJsZSBlbmNvZGluZyBvZiBVUkkgY29tcG9uZW50XG4gIGlmICh1cmkuZGIuaW5kZXhPZignJScpID09PSAtMSkge1xuICAgIHVyaS5kYiA9IGVuY29kZVVSSUNvbXBvbmVudCh1cmkuZGIpO1xuICB9XG5cbiAgdXJpLnBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgcmV0dXJuIHVyaTtcbn1cblxuLy8gR2VuZXJhdGUgYSBVUkwgd2l0aCB0aGUgaG9zdCBkYXRhIGdpdmVuIGJ5IG9wdHMgYW5kIHRoZSBnaXZlbiBwYXRoXG5mdW5jdGlvbiBnZW5EQlVybChvcHRzLCBwYXRoKSB7XG4gIHJldHVybiBnZW5Vcmwob3B0cywgb3B0cy5kYiArICcvJyArIHBhdGgpO1xufVxuXG4vLyBHZW5lcmF0ZSBhIFVSTCB3aXRoIHRoZSBob3N0IGRhdGEgZ2l2ZW4gYnkgb3B0cyBhbmQgdGhlIGdpdmVuIHBhdGhcbmZ1bmN0aW9uIGdlblVybChvcHRzLCBwYXRoKSB7XG4gIC8vIElmIHRoZSBob3N0IGFscmVhZHkgaGFzIGEgcGF0aCwgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSBwYXRoIGRlbGltaXRlclxuICAvLyBPdGhlcndpc2UsIHRoZSBwYXRoIGRlbGltaXRlciBpcyB0aGUgZW1wdHkgc3RyaW5nXG4gIHZhciBwYXRoRGVsID0gIW9wdHMucGF0aCA/ICcnIDogJy8nO1xuXG4gIC8vIElmIHRoZSBob3N0IGFscmVhZHkgaGFzIGEgcGF0aCwgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSBwYXRoIGRlbGltaXRlclxuICAvLyBPdGhlcndpc2UsIHRoZSBwYXRoIGRlbGltaXRlciBpcyB0aGUgZW1wdHkgc3RyaW5nXG4gIHJldHVybiBvcHRzLnByb3RvY29sICsgJzovLycgKyBvcHRzLmhvc3QgK1xuICAgICAgICAgKG9wdHMucG9ydCA/ICgnOicgKyBvcHRzLnBvcnQpIDogJycpICtcbiAgICAgICAgICcvJyArIG9wdHMucGF0aCArIHBhdGhEZWwgKyBwYXRoO1xufVxuXG5mdW5jdGlvbiBwYXJhbXNUb1N0cihwYXJhbXMpIHtcbiAgcmV0dXJuICc/JyArIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgcmV0dXJuIGsgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zW2tdKTtcbiAgfSkuam9pbignJicpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRDYWNoZUJ1c3Qob3B0cykge1xuICB2YXIgdWEgPSAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCkgP1xuICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpIDogJyc7XG4gIHZhciBpc0lFID0gdWEuaW5kZXhPZignbXNpZScpICE9PSAtMTtcbiAgdmFyIGlzVHJpZGVudCA9IHVhLmluZGV4T2YoJ3RyaWRlbnQnKSAhPT0gLTE7XG4gIHZhciBpc0VkZ2UgPSB1YS5pbmRleE9mKCdlZGdlJykgIT09IC0xO1xuICB2YXIgaXNHRVQgPSAhKCdtZXRob2QnIGluIG9wdHMpIHx8IG9wdHMubWV0aG9kID09PSAnR0VUJztcbiAgcmV0dXJuIChpc0lFIHx8IGlzVHJpZGVudCB8fCBpc0VkZ2UpICYmIGlzR0VUO1xufVxuXG4vLyBJbXBsZW1lbnRzIHRoZSBQb3VjaERCIEFQSSBmb3IgZGVhbGluZyB3aXRoIENvdWNoREIgaW5zdGFuY2VzIG92ZXIgSFRUUFxuZnVuY3Rpb24gSHR0cFBvdWNoKG9wdHMsIGNhbGxiYWNrKSB7XG5cbiAgLy8gVGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBIdHRwUG91Y2hcbiAgdmFyIGFwaSA9IHRoaXM7XG5cbiAgdmFyIGhvc3QgPSBnZXRIb3N0KG9wdHMubmFtZSwgb3B0cyk7XG4gIHZhciBkYlVybCA9IGdlbkRCVXJsKGhvc3QsICcnKTtcblxuICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgdmFyIG91ckZldGNoID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IG5ldyBoKCk7XG5cbiAgICBvcHRpb25zLmNyZWRlbnRpYWxzID0gJ2luY2x1ZGUnO1xuXG4gICAgaWYgKG9wdHMuYXV0aCB8fCBob3N0LmF1dGgpIHtcbiAgICAgIHZhciBuQXV0aCA9IG9wdHMuYXV0aCB8fCBob3N0LmF1dGg7XG4gICAgICB2YXIgc3RyID0gbkF1dGgudXNlcm5hbWUgKyAnOicgKyBuQXV0aC5wYXNzd29yZDtcbiAgICAgIHZhciB0b2tlbiA9IHRoaXNCdG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyB0b2tlbik7XG4gICAgfVxuXG4gICAgdmFyIGhlYWRlcnMgPSBvcHRzLmhlYWRlcnMgfHwge307XG4gICAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuYXBwZW5kKGtleSwgaGVhZGVyc1trZXldKTtcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzaG91bGRDYWNoZUJ1c3Qob3B0aW9ucykpIHtcbiAgICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgJ19ub25jZT0nICsgRGF0ZS5ub3coKTtcbiAgICB9XG5cbiAgICB2YXIgZmV0Y2hGdW4gPSBvcHRzLmZldGNoIHx8IGYkMTtcbiAgICByZXR1cm4gZmV0Y2hGdW4odXJsLCBvcHRpb25zKTtcbiAgfTtcblxuICBmdW5jdGlvbiBhZGFwdGVyRnVuJCQxKG5hbWUsIGZ1bikge1xuICAgIHJldHVybiBhZGFwdGVyRnVuKG5hbWUsIGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgICAgc2V0dXAoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgfSk7XG4gICAgfSkpLmJpbmQoYXBpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoSlNPTih1cmwsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwgbmV3IGgoKTtcblxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzLmdldCgnQWNjZXB0JykpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91ckZldGNoKHVybCwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJlc3VsdC5vayA9IHJlc3BvbnNlLm9rO1xuICAgICAgcmVzdWx0LnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoanNvbikge1xuICAgICAgcmVzdWx0LmRhdGEgPSBqc29uO1xuICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgcmVzdWx0LmRhdGEuc3RhdHVzID0gcmVzdWx0LnN0YXR1cztcbiAgICAgICAgdmFyIGVyciA9IGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UocmVzdWx0LmRhdGEpO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0LmRhdGEpKSB7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gcmVzdWx0LmRhdGEubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgaWYgKHYuZXJyb3IgfHwgdi5taXNzaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZSh2KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdC5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgc2V0dXBQcm9taXNlO1xuXG4gIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgIGlmIChvcHRzLnNraXBfc2V0dXApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIHNldHVwIGluIHByb2Nlc3Mgb3IgcHJldmlvdXMgc3VjY2Vzc2Z1bCBzZXR1cFxuICAgIC8vIGRvbmUgdGhlbiB3ZSB3aWxsIHVzZSB0aGF0XG4gICAgLy8gSWYgcHJldmlvdXMgc2V0dXBzIGhhdmUgYmVlbiByZWplY3RlZCB3ZSB3aWxsIHRyeSBhZ2FpblxuICAgIGlmIChzZXR1cFByb21pc2UpIHtcbiAgICAgIHJldHVybiBzZXR1cFByb21pc2U7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9taXNlID0gZmV0Y2hKU09OKGRiVXJsKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgJiYgZXJyLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIC8vIERvZXNudCBleGlzdCwgY3JlYXRlIGl0XG4gICAgICAgIGV4cGxhaW5FcnJvcig0MDQsICdQb3VjaERCIGlzIGp1c3QgZGV0ZWN0aW5nIGlmIHRoZSByZW1vdGUgZXhpc3RzLicpO1xuICAgICAgICByZXR1cm4gZmV0Y2hKU09OKGRiVXJsLCB7bWV0aG9kOiAnUFVUJ30pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgLy8gSWYgd2UgdHJ5IHRvIGNyZWF0ZSBhIGRhdGFiYXNlIHRoYXQgYWxyZWFkeSBleGlzdHMsIHNraXBwZWQgaW5cbiAgICAgIC8vIGlzdGFuYnVsIHNpbmNlIGl0cyBjYXRjaGluZyBhIHJhY2UgY29uZGl0aW9uLlxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgJiYgZXJyLnN0YXR1cyA9PT0gNDEyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfSk7XG5cbiAgICBzZXR1cFByb21pc2UuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgc2V0dXBQcm9taXNlID0gbnVsbDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzZXR1cFByb21pc2U7XG4gIH1cblxuICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKG51bGwsIGFwaSk7XG4gIH0pO1xuXG4gIGFwaS5fcmVtb3RlID0gdHJ1ZTtcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBhcGkudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ2h0dHAnO1xuICB9O1xuXG4gIGFwaS5pZCA9IGFkYXB0ZXJGdW4kJDEoJ2lkJywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgb3VyRmV0Y2goZ2VuVXJsKGhvc3QsICcnKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgLy8gQmFkIHJlc3BvbnNlIG9yIG1pc3NpbmcgYHV1aWRgIHNob3VsZCBub3QgcHJldmVudCBJRCBnZW5lcmF0aW9uLlxuICAgICAgdmFyIHV1aWQkJDEgPSAocmVzdWx0ICYmIHJlc3VsdC51dWlkKSA/XG4gICAgICAgICAgKHJlc3VsdC51dWlkICsgaG9zdC5kYikgOiBnZW5EQlVybChob3N0LCAnJyk7XG4gICAgICBjYWxsYmFjayhudWxsLCB1dWlkJCQxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gdGhlIGhvc3QgY2FsbGluZyB0aGUgY291Y2hkYiBfY29tcGFjdCBmdW5jdGlvblxuICAvLyAgICB2ZXJzaW9uOiBUaGUgdmVyc2lvbiBvZiBDb3VjaERCIGl0IGlzIHJ1bm5pbmdcbiAgYXBpLmNvbXBhY3QgPSBhZGFwdGVyRnVuJCQxKCdjb21wYWN0JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX2NvbXBhY3QnKSwge21ldGhvZDogJ1BPU1QnfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBwaW5nKCkge1xuICAgICAgICBhcGkuaW5mbyhmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgICAvLyBDb3VjaERCIG1heSBzZW5kIGEgXCJjb21wYWN0X3J1bm5pbmc6dHJ1ZVwiIGlmIGl0J3NcbiAgICAgICAgICAvLyBhbHJlYWR5IGNvbXBhY3RpbmcuIFBvdWNoREIgU2VydmVyIGRvZXNuJ3QuXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAocmVzICYmICFyZXMuY29tcGFjdF9ydW5uaW5nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7b2s6IHRydWV9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChwaW5nLCBvcHRzLmludGVydmFsIHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFBpbmcgdGhlIGh0dHAgaWYgaXQncyBmaW5pc2hlZCBjb21wYWN0aW9uXG4gICAgICBwaW5nKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGFwaS5idWxrR2V0ID0gYWRhcHRlckZ1bignYnVsa0dldCcsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvQnVsa0dldChjYikge1xuICAgICAgdmFyIHBhcmFtcyA9IHt9O1xuICAgICAgaWYgKG9wdHMucmV2cykge1xuICAgICAgICBwYXJhbXMucmV2cyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBwYXJhbXMuYXR0YWNobWVudHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMubGF0ZXN0KSB7XG4gICAgICAgIHBhcmFtcy5sYXRlc3QgPSB0cnVlO1xuICAgICAgfVxuICAgICAgZmV0Y2hKU09OKGdlbkRCVXJsKGhvc3QsICdfYnVsa19nZXQnICsgcGFyYW1zVG9TdHIocGFyYW1zKSksIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZG9jczogb3B0cy5kb2NzfSlcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAob3B0cy5hdHRhY2htZW50cyAmJiBvcHRzLmJpbmFyeSkge1xuICAgICAgICAgIHJlc3VsdC5kYXRhLnJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICByZXMuZG9jcy5mb3JFYWNoKHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYihudWxsLCByZXN1bHQuZGF0YSk7XG4gICAgICB9KS5jYXRjaChjYik7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBmdW5jdGlvbiBkb0J1bGtHZXRTaGltKCkge1xuICAgICAgLy8gYXZvaWQgXCJ1cmwgdG9vIGxvbmcgZXJyb3JcIiBieSBzcGxpdHRpbmcgdXAgaW50byBtdWx0aXBsZSByZXF1ZXN0c1xuICAgICAgdmFyIGJhdGNoU2l6ZSA9IE1BWF9TSU1VTFRBTkVPVVNfUkVWUztcbiAgICAgIHZhciBudW1CYXRjaGVzID0gTWF0aC5jZWlsKG9wdHMuZG9jcy5sZW5ndGggLyBiYXRjaFNpemUpO1xuICAgICAgdmFyIG51bURvbmUgPSAwO1xuICAgICAgdmFyIHJlc3VsdHMgPSBuZXcgQXJyYXkobnVtQmF0Y2hlcyk7XG5cbiAgICAgIGZ1bmN0aW9uIG9uUmVzdWx0KGJhdGNoTnVtKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgICAvLyBlcnIgaXMgaW1wb3NzaWJsZSBiZWNhdXNlIHNoaW0gcmV0dXJucyBhIGxpc3Qgb2YgZXJycyBpbiB0aGF0IGNhc2VcbiAgICAgICAgICByZXN1bHRzW2JhdGNoTnVtXSA9IHJlcy5yZXN1bHRzO1xuICAgICAgICAgIGlmICgrK251bURvbmUgPT09IG51bUJhdGNoZXMpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtyZXN1bHRzOiBmbGF0dGVuKHJlc3VsdHMpfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUJhdGNoZXM7IGkrKykge1xuICAgICAgICB2YXIgc3ViT3B0cyA9IHBpY2sob3B0cywgWydyZXZzJywgJ2F0dGFjaG1lbnRzJywgJ2JpbmFyeScsICdsYXRlc3QnXSk7XG4gICAgICAgIHN1Yk9wdHMuZG9jcyA9IG9wdHMuZG9jcy5zbGljZShpICogYmF0Y2hTaXplLFxuICAgICAgICAgIE1hdGgubWluKG9wdHMuZG9jcy5sZW5ndGgsIChpICsgMSkgKiBiYXRjaFNpemUpKTtcbiAgICAgICAgYnVsa0dldChzZWxmLCBzdWJPcHRzLCBvblJlc3VsdChpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbWFyayB0aGUgd2hvbGUgZGF0YWJhc2UgYXMgZWl0aGVyIHN1cHBvcnRpbmcgb3Igbm90IHN1cHBvcnRpbmcgX2J1bGtfZ2V0XG4gICAgdmFyIGRiVXJsID0gZ2VuVXJsKGhvc3QsICcnKTtcbiAgICB2YXIgc3VwcG9ydHNCdWxrR2V0ID0gc3VwcG9ydHNCdWxrR2V0TWFwW2RiVXJsXTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHR5cGVvZiBzdXBwb3J0c0J1bGtHZXQgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBkYXRhYmFzZSBzdXBwb3J0cyBfYnVsa19nZXRcbiAgICAgIGRvQnVsa0dldChmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHN1cHBvcnRzQnVsa0dldE1hcFtkYlVybF0gPSBmYWxzZTtcbiAgICAgICAgICBleHBsYWluRXJyb3IoXG4gICAgICAgICAgICBlcnIuc3RhdHVzLFxuICAgICAgICAgICAgJ1BvdWNoREIgaXMganVzdCBkZXRlY3RpbmcgaWYgdGhlIHJlbW90ZSAnICtcbiAgICAgICAgICAgICdzdXBwb3J0cyB0aGUgX2J1bGtfZ2V0IEFQSS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkb0J1bGtHZXRTaGltKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VwcG9ydHNCdWxrR2V0TWFwW2RiVXJsXSA9IHRydWU7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0c0J1bGtHZXQpIHtcbiAgICAgIGRvQnVsa0dldChjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvQnVsa0dldFNoaW0oKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENhbGxzIEdFVCBvbiB0aGUgaG9zdCwgd2hpY2ggZ2V0cyBiYWNrIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZ1xuICAvLyAgICBjb3VjaGRiOiBBIHdlbGNvbWUgc3RyaW5nXG4gIC8vICAgIHZlcnNpb246IFRoZSB2ZXJzaW9uIG9mIENvdWNoREIgaXQgaXMgcnVubmluZ1xuICBhcGkuX2luZm8gPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG91ckZldGNoKGdlbkRCVXJsKGhvc3QsICcnKSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoaW5mbykge1xuICAgICAgaW5mby5ob3N0ID0gZ2VuREJVcmwoaG9zdCwgJycpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9O1xuXG4gIGFwaS5mZXRjaCA9IGZ1bmN0aW9uIChwYXRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdXJsID0gcGF0aC5zdWJzdHJpbmcoMCwgMSkgPT09ICcvJyA/XG4gICAgICAgIGdlblVybChob3N0LCBwYXRoLnN1YnN0cmluZygxKSkgOlxuICAgICAgICBnZW5EQlVybChob3N0LCBwYXRoKTtcbiAgICAgIHJldHVybiBvdXJGZXRjaCh1cmwsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEdldCB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQgZnJvbSB0aGUgZGF0YWJhc2UgZ2l2ZW4gYnkgaG9zdC5cbiAgLy8gVGhlIGlkIGNvdWxkIGJlIHNvbGVseSB0aGUgX2lkIGluIHRoZSBkYXRhYmFzZSwgb3IgaXQgbWF5IGJlIGFcbiAgLy8gX2Rlc2lnbi9JRCBvciBfbG9jYWwvSUQgcGF0aFxuICBhcGkuZ2V0ID0gYWRhcHRlckZ1biQkMSgnZ2V0JywgZnVuY3Rpb24gKGlkLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIC8vIElmIG5vIG9wdGlvbnMgd2VyZSBnaXZlbiwgc2V0IHRoZSBjYWxsYmFjayB0byB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgICAvLyBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBHRVQgcmVxdWVzdFxuICAgIHZhciBwYXJhbXMgPSB7fTtcblxuICAgIGlmIChvcHRzLnJldnMpIHtcbiAgICAgIHBhcmFtcy5yZXZzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yZXZzX2luZm8pIHtcbiAgICAgIHBhcmFtcy5yZXZzX2luZm8gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmxhdGVzdCkge1xuICAgICAgcGFyYW1zLmxhdGVzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMub3Blbl9yZXZzKSB7XG4gICAgICBpZiAob3B0cy5vcGVuX3JldnMgIT09IFwiYWxsXCIpIHtcbiAgICAgICAgb3B0cy5vcGVuX3JldnMgPSBKU09OLnN0cmluZ2lmeShvcHRzLm9wZW5fcmV2cyk7XG4gICAgICB9XG4gICAgICBwYXJhbXMub3Blbl9yZXZzID0gb3B0cy5vcGVuX3JldnM7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucmV2KSB7XG4gICAgICBwYXJhbXMucmV2ID0gb3B0cy5yZXY7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gb3B0cy5jb25mbGljdHM7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgcGFyYW1zLnVwZGF0ZV9zZXEgPSBvcHRzLnVwZGF0ZV9zZXE7XG4gICAgfVxuXG4gICAgaWQgPSBlbmNvZGVEb2NJZChpZCk7XG5cbiAgICBmdW5jdGlvbiBmZXRjaEF0dGFjaG1lbnRzKGRvYykge1xuICAgICAgdmFyIGF0dHMgPSBkb2MuX2F0dGFjaG1lbnRzO1xuICAgICAgdmFyIGZpbGVuYW1lcyA9IGF0dHMgJiYgT2JqZWN0LmtleXMoYXR0cyk7XG4gICAgICBpZiAoIWF0dHMgfHwgIWZpbGVuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gd2UgZmV0Y2ggdGhlc2UgbWFudWFsbHkgaW4gc2VwYXJhdGUgWEhScywgYmVjYXVzZVxuICAgICAgLy8gU3luYyBHYXRld2F5IHdvdWxkIG5vcm1hbGx5IHNlbmQgaXQgYmFjayBhcyBtdWx0aXBhcnQvbWl4ZWQsXG4gICAgICAvLyB3aGljaCB3ZSBjYW5ub3QgcGFyc2UuIEFsc28sIHRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhblxuICAgICAgLy8gcmVjZWl2aW5nIGF0dGFjaG1lbnRzIGFzIGJhc2U2NC1lbmNvZGVkIHN0cmluZ3MuXG4gICAgICBmdW5jdGlvbiBmZXRjaERhdGEoZmlsZW5hbWUpIHtcbiAgICAgICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgICAgICB2YXIgcGF0aCA9IGVuY29kZURvY0lkKGRvYy5faWQpICsgJy8nICsgZW5jb2RlQXR0YWNobWVudElkKGZpbGVuYW1lKSArXG4gICAgICAgICAgICAnP3Jldj0nICsgZG9jLl9yZXY7XG4gICAgICAgIHJldHVybiBvdXJGZXRjaChnZW5EQlVybChob3N0LCBwYXRoKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBpZiAoJ2J1ZmZlcicgaW4gcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5idWZmZXIoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gICAgICAgICAgaWYgKG9wdHMuYmluYXJ5KSB7XG4gICAgICAgICAgICB2YXIgdHlwZUZpZWxkRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmxvYi5fX3Byb3RvX18sICd0eXBlJyk7XG4gICAgICAgICAgICBpZiAoIXR5cGVGaWVsZERlc2NyaXB0b3IgfHwgdHlwZUZpZWxkRGVzY3JpcHRvci5zZXQpIHtcbiAgICAgICAgICAgICAgYmxvYi50eXBlID0gYXR0LmNvbnRlbnRfdHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBibG9iO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIGJsb2JUb0Jhc2U2NChibG9iLCByZXNvbHZlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHQuc3R1YjtcbiAgICAgICAgICBkZWxldGUgYXR0Lmxlbmd0aDtcbiAgICAgICAgICBhdHQuZGF0YSA9IGRhdGE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvbWlzZUZhY3RvcmllcyA9IGZpbGVuYW1lcy5tYXAoZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YShmaWxlbmFtZSk7XG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhpcyBsaW1pdHMgdGhlIG51bWJlciBvZiBwYXJhbGxlbCB4aHIgcmVxdWVzdHMgdG8gNSBhbnkgdGltZVxuICAgICAgLy8gdG8gYXZvaWQgaXNzdWVzIHdpdGggbWF4aW11bSBicm93c2VyIHJlcXVlc3QgbGltaXRzXG4gICAgICByZXR1cm4gcG9vbChwcm9taXNlRmFjdG9yaWVzLCA1KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmZXRjaEFsbEF0dGFjaG1lbnRzKGRvY09yRG9jcykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZG9jT3JEb2NzKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZG9jT3JEb2NzLm1hcChmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5vaykge1xuICAgICAgICAgICAgcmV0dXJuIGZldGNoQXR0YWNobWVudHMoZG9jLm9rKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmZXRjaEF0dGFjaG1lbnRzKGRvY09yRG9jcyk7XG4gICAgfVxuXG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGlkICsgcGFyYW1zVG9TdHIocGFyYW1zKSk7XG4gICAgZmV0Y2hKU09OKHVybCkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoQWxsQXR0YWNobWVudHMocmVzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzLmRhdGEpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUuZG9jSWQgPSBpZDtcbiAgICAgIGNhbGxiYWNrKGUpO1xuICAgIH0pO1xuICB9KTtcblxuXG4gIC8vIERlbGV0ZSB0aGUgZG9jdW1lbnQgZ2l2ZW4gYnkgZG9jIGZyb20gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIGFwaS5yZW1vdmUgPSBhZGFwdGVyRnVuJCQxKCdyZW1vdmUnLCBmdW5jdGlvbiAoZG9jT3JJZCwgb3B0c09yUmV2LCBvcHRzLCBjYikge1xuICAgIHZhciBkb2M7XG4gICAgaWYgKHR5cGVvZiBvcHRzT3JSZXYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpZCwgcmV2LCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgICAgZG9jID0ge1xuICAgICAgICBfaWQ6IGRvY09ySWQsXG4gICAgICAgIF9yZXY6IG9wdHNPclJldlxuICAgICAgfTtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IG9wdHM7XG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG9jLCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgICAgZG9jID0gZG9jT3JJZDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0c09yUmV2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNiID0gb3B0c09yUmV2O1xuICAgICAgICBvcHRzID0ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYiA9IG9wdHM7XG4gICAgICAgIG9wdHMgPSBvcHRzT3JSZXY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJldiA9IChkb2MuX3JldiB8fCBvcHRzLnJldik7XG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGVuY29kZURvY0lkKGRvYy5faWQpKSArICc/cmV2PScgKyByZXY7XG5cbiAgICBmZXRjaEpTT04odXJsLCB7bWV0aG9kOiAnREVMRVRFJ30sIGNiKS5jYXRjaChjYik7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGVuY29kZUF0dGFjaG1lbnRJZChhdHRhY2htZW50SWQpIHtcbiAgICByZXR1cm4gYXR0YWNobWVudElkLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgYXR0YWNobWVudFxuICBhcGkuZ2V0QXR0YWNobWVudCA9IGFkYXB0ZXJGdW4kJDEoJ2dldEF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIHZhciBwYXJhbXMgPSBvcHRzLnJldiA/ICgnP3Jldj0nICsgb3B0cy5yZXYpIDogJyc7XG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGVuY29kZURvY0lkKGRvY0lkKSkgKyAnLycgK1xuICAgICAgICBlbmNvZGVBdHRhY2htZW50SWQoYXR0YWNobWVudElkKSArIHBhcmFtcztcbiAgICB2YXIgY29udGVudFR5cGU7XG4gICAgb3VyRmV0Y2godXJsLCB7bWV0aG9kOiAnR0VUJ30pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICFwcm9jZXNzLmJyb3dzZXIgJiYgdHlwZW9mIHJlc3BvbnNlLmJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5idWZmZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gICAgICAvLyBUT0RPOiBhbHNvIHJlbW92ZVxuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAhcHJvY2Vzcy5icm93c2VyKSB7XG4gICAgICAgIGJsb2IudHlwZSA9IGNvbnRlbnRUeXBlO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgYmxvYik7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gUmVtb3ZlIHRoZSBhdHRhY2htZW50IGdpdmVuIGJ5IHRoZSBpZCBhbmQgcmV2XG4gIGFwaS5yZW1vdmVBdHRhY2htZW50ID0gIGFkYXB0ZXJGdW4kJDEoJ3JlbW92ZUF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaykge1xuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBlbmNvZGVEb2NJZChkb2NJZCkgKyAnLycgK1xuICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVBdHRhY2htZW50SWQoYXR0YWNobWVudElkKSkgKyAnP3Jldj0nICsgcmV2O1xuICAgIGZldGNoSlNPTih1cmwsIHttZXRob2Q6ICdERUxFVEUnfSwgY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG5cbiAgLy8gQWRkIHRoZSBhdHRhY2htZW50IGdpdmVuIGJ5IGJsb2IgYW5kIGl0cyBjb250ZW50VHlwZSBwcm9wZXJ0eVxuICAvLyB0byB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQsIHRoZSByZXZpc2lvbiBnaXZlbiBieSByZXYsIGFuZFxuICAvLyBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIGFwaS5wdXRBdHRhY2htZW50ID0gYWRhcHRlckZ1biQkMSgncHV0QXR0YWNobWVudCcsIGZ1bmN0aW9uIChkb2NJZCwgYXR0YWNobWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2LCBibG9iLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gdHlwZTtcbiAgICAgIHR5cGUgPSBibG9iO1xuICAgICAgYmxvYiA9IHJldjtcbiAgICAgIHJldiA9IG51bGw7XG4gICAgfVxuICAgIHZhciBpZCA9IGVuY29kZURvY0lkKGRvY0lkKSArICcvJyArIGVuY29kZUF0dGFjaG1lbnRJZChhdHRhY2htZW50SWQpO1xuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBpZCk7XG4gICAgaWYgKHJldikge1xuICAgICAgdXJsICs9ICc/cmV2PScgKyByZXY7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gaW5wdXQgaXMgYXNzdW1lZCB0byBiZSBhIGJhc2U2NCBzdHJpbmdcbiAgICAgIHZhciBiaW5hcnk7XG4gICAgICB0cnkge1xuICAgICAgICBiaW5hcnkgPSB0aGlzQXRvYihibG9iKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoQkFEX0FSRyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBdHRhY2htZW50IGlzIG5vdCBhIHZhbGlkIGJhc2U2NCBzdHJpbmcnKSk7XG4gICAgICB9XG4gICAgICBibG9iID0gYmluYXJ5ID8gYmluU3RyaW5nVG9CbHVmZmVyKGJpbmFyeSwgdHlwZSkgOiAnJztcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGF0dGFjaG1lbnRcbiAgICBmZXRjaEpTT04odXJsLCB7XG4gICAgICBoZWFkZXJzOiBuZXcgaCh7J0NvbnRlbnQtVHlwZSc6IHR5cGV9KSxcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICBib2R5OiBibG9iXG4gICAgfSwgY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG5cbiAgLy8gVXBkYXRlL2NyZWF0ZSBtdWx0aXBsZSBkb2N1bWVudHMgZ2l2ZW4gYnkgcmVxIGluIHRoZSBkYXRhYmFzZVxuICAvLyBnaXZlbiBieSBob3N0LlxuICBhcGkuX2J1bGtEb2NzID0gZnVuY3Rpb24gKHJlcSwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAvLyBJZiBuZXdfZWRpdHM9ZmFsc2UgdGhlbiBpdCBwcmV2ZW50cyB0aGUgZGF0YWJhc2UgZnJvbSBjcmVhdGluZ1xuICAgIC8vIG5ldyByZXZpc2lvbiBudW1iZXJzIGZvciB0aGUgZG9jdW1lbnRzLiBJbnN0ZWFkIGl0IGp1c3QgdXNlc1xuICAgIC8vIHRoZSBvbGQgb25lcy4gVGhpcyBpcyB1c2VkIGluIGRhdGFiYXNlIHJlcGxpY2F0aW9uLlxuICAgIHJlcS5uZXdfZWRpdHMgPSBvcHRzLm5ld19lZGl0cztcblxuICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVxLmRvY3MubWFwKHByZXByb2Nlc3NBdHRhY2htZW50cyQxKSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVcGRhdGUvY3JlYXRlIHRoZSBkb2N1bWVudHNcbiAgICAgIHJldHVybiBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJ19idWxrX2RvY3MnKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxKVxuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH0pLmNhdGNoKGNhbGxiYWNrKTtcbiAgfTtcblxuXG4gIC8vIFVwZGF0ZS9jcmVhdGUgZG9jdW1lbnRcbiAgYXBpLl9wdXQgPSBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEoZG9jKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgZW5jb2RlRG9jSWQoZG9jLl9pZCkpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRvYylcbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0LmRhdGEpO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGVyci5kb2NJZCA9IGRvYyAmJiBkb2MuX2lkO1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgfTtcblxuXG4gIC8vIEdldCBhIGxpc3Rpbmcgb2YgdGhlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgZ2l2ZW5cbiAgLy8gYnkgaG9zdCBhbmQgb3JkZXJlZCBieSBpbmNyZWFzaW5nIGlkLlxuICBhcGkuYWxsRG9jcyA9IGFkYXB0ZXJGdW4kJDEoJ2FsbERvY3MnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gICAgLy8gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgR0VUIHJlcXVlc3RcbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgdmFyIGJvZHk7XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnO1xuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICBwYXJhbXMudXBkYXRlX3NlcSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGVzY2VuZGluZykge1xuICAgICAgcGFyYW1zLmRlc2NlbmRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgcGFyYW1zLmluY2x1ZGVfZG9jcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gYWRkZWQgaW4gQ291Y2hEQiAxLjYuMFxuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBwYXJhbXMuYXR0YWNobWVudHMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmtleSkge1xuICAgICAgcGFyYW1zLmtleSA9IEpTT04uc3RyaW5naWZ5KG9wdHMua2V5KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zdGFydF9rZXkpIHtcbiAgICAgIG9wdHMuc3RhcnRrZXkgPSBvcHRzLnN0YXJ0X2tleTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zdGFydGtleSkge1xuICAgICAgcGFyYW1zLnN0YXJ0a2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5zdGFydGtleSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5kX2tleSkge1xuICAgICAgb3B0cy5lbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5ka2V5KSB7XG4gICAgICBwYXJhbXMuZW5ka2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5lbmRrZXkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5pbmNsdXNpdmVfZW5kICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmluY2x1c2l2ZV9lbmQgPSAhIW9wdHMuaW5jbHVzaXZlX2VuZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMubGltaXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMubGltaXQgPSBvcHRzLmxpbWl0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5za2lwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLnNraXAgPSBvcHRzLnNraXA7XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtU3RyID0gcGFyYW1zVG9TdHIocGFyYW1zKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0cy5rZXlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbWV0aG9kID0gJ1BPU1QnO1xuICAgICAgYm9keSA9IHtrZXlzOiBvcHRzLmtleXN9O1xuICAgIH1cblxuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX2FsbF9kb2NzJyArIHBhcmFtU3RyKSwge1xuICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcyAmJiBvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuYmluYXJ5KSB7XG4gICAgICAgIHJlc3VsdC5kYXRhLnJvd3MuZm9yRWFjaChyZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlcik7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQuZGF0YSk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcblxuICAvLyBHZXQgYSBsaXN0IG9mIGNoYW5nZXMgbWFkZSB0byBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIC8vIFRPRE8gQWNjb3JkaW5nIHRvIHRoZSBSRUFETUUsIHRoZXJlIHNob3VsZCBiZSB0d28gb3RoZXIgbWV0aG9kcyBoZXJlLFxuICAvLyBhcGkuY2hhbmdlcy5hZGRMaXN0ZW5lciBhbmQgYXBpLmNoYW5nZXMucmVtb3ZlTGlzdGVuZXIuXG4gIGFwaS5fY2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cbiAgICAvLyBXZSBpbnRlcm5hbGx5IHBhZ2UgdGhlIHJlc3VsdHMgb2YgYSBjaGFuZ2VzIHJlcXVlc3QsIHRoaXMgbWVhbnNcbiAgICAvLyBpZiB0aGVyZSBpcyBhIGxhcmdlIHNldCBvZiBjaGFuZ2VzIHRvIGJlIHJldHVybmVkIHdlIGNhbiBzdGFydFxuICAgIC8vIHByb2Nlc3NpbmcgdGhlbSBxdWlja2VyIGluc3RlYWQgb2Ygd2FpdGluZyBvbiB0aGUgZW50aXJlXG4gICAgLy8gc2V0IG9mIGNoYW5nZXMgdG8gcmV0dXJuIGFuZCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlbSBhdCBvbmNlXG4gICAgdmFyIGJhdGNoU2l6ZSA9ICdiYXRjaF9zaXplJyBpbiBvcHRzID8gb3B0cy5iYXRjaF9zaXplIDogQ0hBTkdFU19CQVRDSF9TSVpFO1xuXG4gICAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gICAgaWYgKG9wdHMuY29udGludW91cyAmJiAhKCdoZWFydGJlYXQnIGluIG9wdHMpKSB7XG4gICAgICBvcHRzLmhlYXJ0YmVhdCA9IERFRkFVTFRfSEVBUlRCRUFUO1xuICAgIH1cblxuICAgIHZhciByZXF1ZXN0VGltZW91dCA9ICgndGltZW91dCcgaW4gb3B0cykgPyBvcHRzLnRpbWVvdXQgOiAzMCAqIDEwMDA7XG5cbiAgICAvLyBlbnN1cmUgQ0hBTkdFU19USU1FT1VUX0JVRkZFUiBhcHBsaWVzXG4gICAgaWYgKCd0aW1lb3V0JyBpbiBvcHRzICYmIG9wdHMudGltZW91dCAmJlxuICAgICAgKHJlcXVlc3RUaW1lb3V0IC0gb3B0cy50aW1lb3V0KSA8IENIQU5HRVNfVElNRU9VVF9CVUZGRVIpIHtcbiAgICAgICAgcmVxdWVzdFRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgKyBDSEFOR0VTX1RJTUVPVVRfQlVGRkVSO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICgnaGVhcnRiZWF0JyBpbiBvcHRzICYmIG9wdHMuaGVhcnRiZWF0ICYmXG4gICAgICAgKHJlcXVlc3RUaW1lb3V0IC0gb3B0cy5oZWFydGJlYXQpIDwgQ0hBTkdFU19USU1FT1VUX0JVRkZFUikge1xuICAgICAgICByZXF1ZXN0VGltZW91dCA9IG9wdHMuaGVhcnRiZWF0ICsgQ0hBTkdFU19USU1FT1VUX0JVRkZFUjtcbiAgICB9XG5cbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgaWYgKCd0aW1lb3V0JyBpbiBvcHRzICYmIG9wdHMudGltZW91dCkge1xuICAgICAgcGFyYW1zLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQ7XG4gICAgfVxuXG4gICAgdmFyIGxpbWl0ID0gKHR5cGVvZiBvcHRzLmxpbWl0ICE9PSAndW5kZWZpbmVkJykgPyBvcHRzLmxpbWl0IDogZmFsc2U7XG4gICAgdmFyIGxlZnRUb0ZldGNoID0gbGltaXQ7XG5cbiAgICBpZiAob3B0cy5zdHlsZSkge1xuICAgICAgcGFyYW1zLnN0eWxlID0gb3B0cy5zdHlsZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MgfHwgb3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwYXJhbXMuaW5jbHVkZV9kb2NzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgcGFyYW1zLmF0dGFjaG1lbnRzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jb250aW51b3VzKSB7XG4gICAgICBwYXJhbXMuZmVlZCA9ICdsb25ncG9sbCc7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuc2VxX2ludGVydmFsKSB7XG4gICAgICBwYXJhbXMuc2VxX2ludGVydmFsID0gb3B0cy5zZXFfaW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICBwYXJhbXMuZGVzY2VuZGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgcGFyYW1zLnVwZGF0ZV9zZXEgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICgnaGVhcnRiZWF0JyBpbiBvcHRzKSB7XG4gICAgICAvLyBJZiB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzIGZhbHNlLCBpdCBkaXNhYmxlcyB0aGUgZGVmYXVsdCBoZWFydGJlYXRcbiAgICAgIGlmIChvcHRzLmhlYXJ0YmVhdCkge1xuICAgICAgICBwYXJhbXMuaGVhcnRiZWF0ID0gb3B0cy5oZWFydGJlYXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZmlsdGVyICYmIHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBhcmFtcy5maWx0ZXIgPSBvcHRzLmZpbHRlcjtcbiAgICB9XG5cbiAgICBpZiAob3B0cy52aWV3ICYmIHR5cGVvZiBvcHRzLnZpZXcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXJhbXMuZmlsdGVyID0gJ192aWV3JztcbiAgICAgIHBhcmFtcy52aWV3ID0gb3B0cy52aWV3O1xuICAgIH1cblxuICAgIC8vIElmIG9wdHMucXVlcnlfcGFyYW1zIGV4aXN0cywgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjaGFuZ2VzIHJlcXVlc3QuXG4gICAgLy8gVGhlc2UgcGFyYW1ldGVycyBtYXkgYmUgdXNlZCBieSB0aGUgZmlsdGVyIG9uIHRoZSBzb3VyY2UgZGF0YWJhc2UuXG4gICAgaWYgKG9wdHMucXVlcnlfcGFyYW1zICYmIHR5cGVvZiBvcHRzLnF1ZXJ5X3BhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gb3B0cy5xdWVyeV9wYXJhbXMpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRzLnF1ZXJ5X3BhcmFtcywgcGFyYW1fbmFtZSkpIHtcbiAgICAgICAgICBwYXJhbXNbcGFyYW1fbmFtZV0gPSBvcHRzLnF1ZXJ5X3BhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtZXRob2QgPSAnR0VUJztcbiAgICB2YXIgYm9keTtcblxuICAgIGlmIChvcHRzLmRvY19pZHMpIHtcbiAgICAgIC8vIHNldCB0aGlzIGF1dG9tYWdpY2FsbHkgZm9yIHRoZSB1c2VyOyBpdCdzIGFubm95aW5nIHRoYXQgY291Y2hkYlxuICAgICAgLy8gcmVxdWlyZXMgYm90aCBhIFwiZmlsdGVyXCIgYW5kIGEgXCJkb2NfaWRzXCIgcGFyYW0uXG4gICAgICBwYXJhbXMuZmlsdGVyID0gJ19kb2NfaWRzJztcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgIGJvZHkgPSB7ZG9jX2lkczogb3B0cy5kb2NfaWRzIH07XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZWxzZSBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgICAgLy8gc2V0IHRoaXMgYXV0b21hZ2ljYWxseSBmb3IgdGhlIHVzZXIsIHNpbWlsYXIgdG8gYWJvdmVcbiAgICAgIHBhcmFtcy5maWx0ZXIgPSAnX3NlbGVjdG9yJztcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgIGJvZHkgPSB7c2VsZWN0b3I6IG9wdHMuc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICB2YXIgY29udHJvbGxlciA9IG5ldyBhKCk7XG4gICAgdmFyIGxhc3RGZXRjaGVkU2VxO1xuXG4gICAgLy8gR2V0IGFsbCB0aGUgY2hhbmdlcyBzdGFydGluZyB3dGloIHRoZSBvbmUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXG4gICAgLy8gc2VxdWVuY2UgbnVtYmVyIGdpdmVuIGJ5IHNpbmNlLlxuICAgIHZhciBmZXRjaERhdGEgPSBmdW5jdGlvbiAoc2luY2UsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5zaW5jZSA9IHNpbmNlO1xuICAgICAgLy8gXCJzaW5jZVwiIGNhbiBiZSBhbnkga2luZCBvZiBqc29uIG9iamVjdCBpbiBDbG91ZGFudC9Db3VjaERCIDIueFxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmICh0eXBlb2YgcGFyYW1zLnNpbmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHBhcmFtcy5zaW5jZSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcy5zaW5jZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLmRlc2NlbmRpbmcpIHtcbiAgICAgICAgaWYgKGxpbWl0KSB7XG4gICAgICAgICAgcGFyYW1zLmxpbWl0ID0gbGVmdFRvRmV0Y2g7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcy5saW1pdCA9ICghbGltaXQgfHwgbGVmdFRvRmV0Y2ggPiBiYXRjaFNpemUpID9cbiAgICAgICAgICBiYXRjaFNpemUgOiBsZWZ0VG9GZXRjaDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBvcHRpb25zIGZvciB0aGUgYWpheCBjYWxsXG4gICAgICB2YXIgdXJsID0gZ2VuREJVcmwoaG9zdCwgJ19jaGFuZ2VzJyArIHBhcmFtc1RvU3RyKHBhcmFtcykpO1xuICAgICAgdmFyIGZldGNoT3B0cyA9IHtcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgICB9O1xuICAgICAgbGFzdEZldGNoZWRTZXEgPSBzaW5jZTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBjaGFuZ2VzXG4gICAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmV0Y2hKU09OKHVybCwgZmV0Y2hPcHRzLCBjYWxsYmFjayk7XG4gICAgICB9KS5jYXRjaChjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIC8vIElmIG9wdHMuc2luY2UgZXhpc3RzLCBnZXQgYWxsIHRoZSBjaGFuZ2VzIGZyb20gdGhlIHNlcXVlbmNlXG4gICAgLy8gbnVtYmVyIGdpdmVuIGJ5IG9wdHMuc2luY2UuIE90aGVyd2lzZSwgZ2V0IGFsbCB0aGUgY2hhbmdlc1xuICAgIC8vIGZyb20gdGhlIHNlcXVlbmNlIG51bWJlciAwLlxuICAgIHZhciByZXN1bHRzID0ge3Jlc3VsdHM6IFtdfTtcblxuICAgIHZhciBmZXRjaGVkID0gZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciByYXdfcmVzdWx0c19sZW5ndGggPSAwO1xuICAgICAgLy8gSWYgdGhlIHJlc3VsdCBvZiB0aGUgYWpheCBjYWxsIChyZXMpIGNvbnRhaW5zIGNoYW5nZXMgKHJlcy5yZXN1bHRzKVxuICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0cykge1xuICAgICAgICByYXdfcmVzdWx0c19sZW5ndGggPSByZXMucmVzdWx0cy5sZW5ndGg7XG4gICAgICAgIHJlc3VsdHMubGFzdF9zZXEgPSByZXMubGFzdF9zZXE7XG4gICAgICAgIHZhciBwZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdmFyIGxhc3RTZXEgPSBudWxsO1xuICAgICAgICAvLyBBdHRhY2ggJ3BlbmRpbmcnIHByb3BlcnR5IGlmIHNlcnZlciBzdXBwb3J0cyBpdCAoQ291Y2hEQiAyLjArKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHR5cGVvZiByZXMucGVuZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBwZW5kaW5nID0gcmVzLnBlbmRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRzLmxhc3Rfc2VxID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVzdWx0cy5sYXN0X3NlcSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsYXN0U2VxID0gcmVzdWx0cy5sYXN0X3NlcTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgZWFjaCBjaGFuZ2VcbiAgICAgICAgdmFyIHJlcSA9IHt9O1xuICAgICAgICByZXEucXVlcnkgPSBvcHRzLnF1ZXJ5X3BhcmFtcztcbiAgICAgICAgcmVzLnJlc3VsdHMgPSByZXMucmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICBsZWZ0VG9GZXRjaC0tO1xuICAgICAgICAgIHZhciByZXQgPSBmaWx0ZXJDaGFuZ2Uob3B0cykoYyk7XG4gICAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgICAgaWYgKG9wdHMuaW5jbHVkZV9kb2NzICYmIG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5iaW5hcnkpIHtcbiAgICAgICAgICAgICAgcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIoYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0cy5yZXR1cm5fZG9jcykge1xuICAgICAgICAgICAgICByZXN1bHRzLnJlc3VsdHMucHVzaChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdHMub25DaGFuZ2UoYywgcGVuZGluZywgbGFzdFNlcSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBlcnJvciwgc3RvcCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMgYW5kIGNhbGxcbiAgICAgICAgLy8gb3B0cy5jb21wbGV0ZVxuICAgICAgICBvcHRzLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICBvcHRzLmNvbXBsZXRlKGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNoYW5nZXMgZmVlZCBtYXkgaGF2ZSB0aW1lZCBvdXQgd2l0aCBubyByZXN1bHRzXG4gICAgICAvLyBpZiBzbyByZXVzZSBsYXN0IHVwZGF0ZSBzZXF1ZW5jZVxuICAgICAgaWYgKHJlcyAmJiByZXMubGFzdF9zZXEpIHtcbiAgICAgICAgbGFzdEZldGNoZWRTZXEgPSByZXMubGFzdF9zZXE7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaW5pc2hlZCA9IChsaW1pdCAmJiBsZWZ0VG9GZXRjaCA8PSAwKSB8fFxuICAgICAgICAocmVzICYmIHJhd19yZXN1bHRzX2xlbmd0aCA8IGJhdGNoU2l6ZSkgfHxcbiAgICAgICAgKG9wdHMuZGVzY2VuZGluZyk7XG5cbiAgICAgIGlmICgob3B0cy5jb250aW51b3VzICYmICEobGltaXQgJiYgbGVmdFRvRmV0Y2ggPD0gMCkpIHx8ICFmaW5pc2hlZCkge1xuICAgICAgICAvLyBRdWV1ZSBhIGNhbGwgdG8gZmV0Y2ggYWdhaW4gd2l0aCB0aGUgbmV3ZXN0IHNlcXVlbmNlIG51bWJlclxuICAgICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkgeyBmZXRjaERhdGEobGFzdEZldGNoZWRTZXEsIGZldGNoZWQpOyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdlJ3JlIGRvbmUsIGNhbGwgdGhlIGNhbGxiYWNrXG4gICAgICAgIG9wdHMuY29tcGxldGUobnVsbCwgcmVzdWx0cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZldGNoRGF0YShvcHRzLnNpbmNlIHx8IDAsIGZldGNoZWQpO1xuXG4gICAgLy8gUmV0dXJuIGEgbWV0aG9kIHRvIGNhbmNlbCB0aGlzIG1ldGhvZCBmcm9tIHByb2Nlc3NpbmcgYW55IG1vcmVcbiAgICByZXR1cm4ge1xuICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9wdHMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIC8vIEdpdmVuIGEgc2V0IG9mIGRvY3VtZW50L3JldmlzaW9uIElEcyAoZ2l2ZW4gYnkgcmVxKSwgdGV0cyB0aGUgc3Vic2V0IG9mXG4gIC8vIHRob3NlIHRoYXQgZG8gTk9UIGNvcnJlc3BvbmQgdG8gcmV2aXNpb25zIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuXG4gIC8vIFNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL2NvdWNoZGIvSHR0cFBvc3RSZXZzRGlmZlxuICBhcGkucmV2c0RpZmYgPSBhZGFwdGVyRnVuJCQxKCdyZXZzRGlmZicsIGZ1bmN0aW9uIChyZXEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgLy8gSWYgbm8gb3B0aW9ucyB3ZXJlIGdpdmVuLCBzZXQgdGhlIGNhbGxiYWNrIHRvIGJlIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBtaXNzaW5nIGRvY3VtZW50L3JldmlzaW9uIElEc1xuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX3JldnNfZGlmZicpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcSlcbiAgICB9LCBjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcblxuICBhcGkuX2Nsb3NlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfTtcblxuICBhcGkuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJycpLCB7bWV0aG9kOiAnREVMRVRFJ30pLnRoZW4oZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGpzb24pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB7b2s6IHRydWV9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59XG5cbi8vIEh0dHBQb3VjaCBpcyBhIHZhbGlkIGFkYXB0ZXIuXG5IdHRwUG91Y2gudmFsaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gSHR0cFBvdWNoJDEgKFBvdWNoREIpIHtcbiAgUG91Y2hEQi5hZGFwdGVyKCdodHRwJywgSHR0cFBvdWNoLCBmYWxzZSk7XG4gIFBvdWNoREIuYWRhcHRlcignaHR0cHMnLCBIdHRwUG91Y2gsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gUXVlcnlQYXJzZUVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5zdGF0dXMgPSA0MDA7XG4gIHRoaXMubmFtZSA9ICdxdWVyeV9wYXJzZV9lcnJvcic7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMuZXJyb3IgPSB0cnVlO1xuICB0cnkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFF1ZXJ5UGFyc2VFcnJvcik7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbmluaGVyaXRzKFF1ZXJ5UGFyc2VFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBOb3RGb3VuZEVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5zdGF0dXMgPSA0MDQ7XG4gIHRoaXMubmFtZSA9ICdub3RfZm91bmQnO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBOb3RGb3VuZEVycm9yKTtcbiAgfSBjYXRjaCAoZSkge31cbn1cblxuaW5oZXJpdHMoTm90Rm91bmRFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBCdWlsdEluRXJyb3IobWVzc2FnZSkge1xuICB0aGlzLnN0YXR1cyA9IDUwMDtcbiAgdGhpcy5uYW1lID0gJ2ludmFsaWRfdmFsdWUnO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBCdWlsdEluRXJyb3IpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5pbmhlcml0cyhCdWlsdEluRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gcHJvbWlzZWRDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2spIHtcbiAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrKHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gY2FsbGJhY2tpZnkoZnVuKSB7XG4gIHJldHVybiBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICB2YXIgY2IgPSBhcmdzLnBvcCgpO1xuICAgIHZhciBwcm9taXNlID0gZnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb21pc2VkQ2FsbGJhY2socHJvbWlzZSwgY2IpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSk7XG59XG5cbi8vIFByb21pc2UgZmluYWxseSB1dGlsIHNpbWlsYXIgdG8gUS5maW5hbGx5XG5mdW5jdGlvbiBmaW4ocHJvbWlzZSwgZmluYWxQcm9taXNlRmFjdG9yeSkge1xuICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICByZXR1cm4gZmluYWxQcm9taXNlRmFjdG9yeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIHJldHVybiBmaW5hbFByb21pc2VGYWN0b3J5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyByZWFzb247XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXF1ZW50aWFsaXplKHF1ZXVlLCBwcm9taXNlRmFjdG9yeSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gcXVldWUuYWRkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlRmFjdG9yeS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuLy8gdW5pcSBhbiBhcnJheSBvZiBzdHJpbmdzLCBvcmRlciBub3QgZ3VhcmFudGVlZFxuLy8gc2ltaWxhciB0byB1bmRlcnNjb3JlL2xvZGFzaCBfLnVuaXFcbmZ1bmN0aW9uIHVuaXEoYXJyKSB7XG4gIHZhciB0aGVTZXQgPSBuZXcgRXhwb3J0ZWRTZXQoYXJyKTtcbiAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSh0aGVTZXQuc2l6ZSk7XG4gIHZhciBpbmRleCA9IC0xO1xuICB0aGVTZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1hcFRvS2V5c0FycmF5KG1hcCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KG1hcC5zaXplKTtcbiAgdmFyIGluZGV4ID0gLTE7XG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0ga2V5O1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVpbHRJbkVycm9yKG5hbWUpIHtcbiAgdmFyIG1lc3NhZ2UgPSAnYnVpbHRpbiAnICsgbmFtZSArXG4gICAgJyBmdW5jdGlvbiByZXF1aXJlcyBtYXAgdmFsdWVzIHRvIGJlIG51bWJlcnMnICtcbiAgICAnIG9yIG51bWJlciBhcnJheXMnO1xuICByZXR1cm4gbmV3IEJ1aWx0SW5FcnJvcihtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gc3VtKHZhbHVlcykge1xuICB2YXIgcmVzdWx0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBudW0gPSB2YWx1ZXNbaV07XG4gICAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShudW0pKSB7XG4gICAgICAgIC8vIGxpc3RzIG9mIG51bWJlcnMgYXJlIGFsc28gYWxsb3dlZCwgc3VtIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICByZXN1bHQgPSB0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJyA/IFtyZXN1bHRdIDogcmVzdWx0O1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgakxlbiA9IG51bS5sZW5ndGg7IGogPCBqTGVuOyBqKyspIHtcbiAgICAgICAgICB2YXIgak51bSA9IG51bVtqXTtcbiAgICAgICAgICBpZiAodHlwZW9mIGpOdW0gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVCdWlsdEluRXJyb3IoJ19zdW0nKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHRbal0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChqTnVtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0W2pdICs9IGpOdW07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAvLyBub3QgYXJyYXkvbnVtYmVyXG4gICAgICAgIHRocm93IGNyZWF0ZUJ1aWx0SW5FcnJvcignX3N1bScpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJlc3VsdCArPSBudW07XG4gICAgfSBlbHNlIHsgLy8gYWRkIG51bWJlciB0byBhcnJheVxuICAgICAgcmVzdWx0WzBdICs9IG51bTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIGxvZyA9IGd1YXJkZWRDb25zb2xlLmJpbmQobnVsbCwgJ2xvZycpO1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIHRvSlNPTiA9IEpTT04ucGFyc2U7XG5cbmZ1bmN0aW9uIGV2YWxGdW5jdGlvbldpdGhFdmFsKGZ1bmMsIGVtaXQpIHtcbiAgcmV0dXJuIHNjb3BlRXZhbChcbiAgICBcInJldHVybiAoXCIgKyBmdW5jLnJlcGxhY2UoLztcXHMqJC8sIFwiXCIpICsgXCIpO1wiLFxuICAgIHtcbiAgICAgIGVtaXQ6IGVtaXQsXG4gICAgICBzdW06IHN1bSxcbiAgICAgIGxvZzogbG9nLFxuICAgICAgaXNBcnJheTogaXNBcnJheSxcbiAgICAgIHRvSlNPTjogdG9KU09OXG4gICAgfVxuICApO1xufVxuXG4vKlxuICogU2ltcGxlIHRhc2sgcXVldWUgdG8gc2VxdWVudGlhbGl6ZSBhY3Rpb25zLiBBc3N1bWVzXG4gKiBjYWxsYmFja3Mgd2lsbCBldmVudHVhbGx5IGZpcmUgKG9uY2UpLlxuICovXG5cblxuZnVuY3Rpb24gVGFza1F1ZXVlJDEoKSB7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsKSB7ZnVsZmlsbCgpOyB9KTtcbn1cblRhc2tRdWV1ZSQxLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAocHJvbWlzZUZhY3RvcnkpIHtcbiAgdGhpcy5wcm9taXNlID0gdGhpcy5wcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBqdXN0IHJlY292ZXJcbiAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb21pc2VGYWN0b3J5KCk7XG4gIH0pO1xuICByZXR1cm4gdGhpcy5wcm9taXNlO1xufTtcblRhc2tRdWV1ZSQxLnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnByb21pc2U7XG59O1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkoaW5wdXQpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJzsgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3IgZW1wdHkgcmVkdWNlXG4gIH1cbiAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXQgd2l0aCBtYXByZWR1Y2UsIGZ1bmN0aW9ucy9zdHJpbmdzIGFyZSBzdHJpbmdpZmllZFxuICAvLyBhcy1pcy4gZXZlcnl0aGluZyBlbHNlIGlzIEpTT04tc3RyaW5naWZpZWQuXG4gIHN3aXRjaCAodHlwZW9mIGlucHV0KSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgLy8gZS5nLiBhIG1hcHJlZHVjZSBtYXBcbiAgICAgIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAvLyBlLmcuIGEgbWFwcmVkdWNlIGJ1aWx0LWluIF9yZWR1Y2UgZnVuY3Rpb25cbiAgICAgIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlLmcuIGEgSlNPTiBvYmplY3QgaW4gdGhlIGNhc2Ugb2YgbWFuZ28gcXVlcmllc1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGlucHV0KTtcbiAgfVxufVxuXG4vKiBjcmVhdGUgYSBzdHJpbmcgc2lnbmF0dXJlIGZvciBhIHZpZXcgc28gd2UgY2FuIGNhY2hlIGl0IGFuZCB1bmlxIGl0ICovXG5mdW5jdGlvbiBjcmVhdGVWaWV3U2lnbmF0dXJlKG1hcEZ1biwgcmVkdWNlRnVuKSB7XG4gIC8vIHRoZSBcInVuZGVmaW5lZFwiIHBhcnQgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIHJldHVybiBzdHJpbmdpZnkobWFwRnVuKSArIHN0cmluZ2lmeShyZWR1Y2VGdW4pICsgJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpZXcoc291cmNlREIsIHZpZXdOYW1lLCBtYXBGdW4sIHJlZHVjZUZ1biwgdGVtcG9yYXJ5LCBsb2NhbERvY05hbWUpIHtcbiAgdmFyIHZpZXdTaWduYXR1cmUgPSBjcmVhdGVWaWV3U2lnbmF0dXJlKG1hcEZ1biwgcmVkdWNlRnVuKTtcblxuICB2YXIgY2FjaGVkVmlld3M7XG4gIGlmICghdGVtcG9yYXJ5KSB7XG4gICAgLy8gY2FjaGUgdGhpcyB0byBlbnN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHVwZGF0ZSB0aGUgc2FtZSB2aWV3IHR3aWNlXG4gICAgY2FjaGVkVmlld3MgPSBzb3VyY2VEQi5fY2FjaGVkVmlld3MgPSBzb3VyY2VEQi5fY2FjaGVkVmlld3MgfHwge307XG4gICAgaWYgKGNhY2hlZFZpZXdzW3ZpZXdTaWduYXR1cmVdKSB7XG4gICAgICByZXR1cm4gY2FjaGVkVmlld3Nbdmlld1NpZ25hdHVyZV07XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb21pc2VGb3JWaWV3ID0gc291cmNlREIuaW5mbygpLnRoZW4oZnVuY3Rpb24gKGluZm8pIHtcblxuICAgIHZhciBkZXBEYk5hbWUgPSBpbmZvLmRiX25hbWUgKyAnLW1ydmlldy0nICtcbiAgICAgICh0ZW1wb3JhcnkgPyAndGVtcCcgOiBzdHJpbmdNZDUodmlld1NpZ25hdHVyZSkpO1xuXG4gICAgLy8gc2F2ZSB0aGUgdmlldyBuYW1lIGluIHRoZSBzb3VyY2UgZGIgc28gaXQgY2FuIGJlIGNsZWFuZWQgdXAgaWYgbmVjZXNzYXJ5XG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgX2Rlc2lnbiBkb2MgaXMgZGVsZXRlZCwgcmVtb3ZlIGFsbCBhc3NvY2lhdGVkIHZpZXcgZGF0YSlcbiAgICBmdW5jdGlvbiBkaWZmRnVuY3Rpb24oZG9jKSB7XG4gICAgICBkb2Mudmlld3MgPSBkb2Mudmlld3MgfHwge307XG4gICAgICB2YXIgZnVsbFZpZXdOYW1lID0gdmlld05hbWU7XG4gICAgICBpZiAoZnVsbFZpZXdOYW1lLmluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgICAgZnVsbFZpZXdOYW1lID0gdmlld05hbWUgKyAnLycgKyB2aWV3TmFtZTtcbiAgICAgIH1cbiAgICAgIHZhciBkZXBEYnMgPSBkb2Mudmlld3NbZnVsbFZpZXdOYW1lXSA9IGRvYy52aWV3c1tmdWxsVmlld05hbWVdIHx8IHt9O1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZGVwRGJzW2RlcERiTmFtZV0pIHtcbiAgICAgICAgcmV0dXJuOyAvLyBubyB1cGRhdGUgbmVjZXNzYXJ5XG4gICAgICB9XG4gICAgICBkZXBEYnNbZGVwRGJOYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZG9jO1xuICAgIH1cbiAgICByZXR1cm4gdXBzZXJ0KHNvdXJjZURCLCAnX2xvY2FsLycgKyBsb2NhbERvY05hbWUsIGRpZmZGdW5jdGlvbikudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc291cmNlREIucmVnaXN0ZXJEZXBlbmRlbnREYXRhYmFzZShkZXBEYk5hbWUpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB2YXIgZGIgPSByZXMuZGI7XG4gICAgICAgIGRiLmF1dG9fY29tcGFjdGlvbiA9IHRydWU7XG4gICAgICAgIHZhciB2aWV3ID0ge1xuICAgICAgICAgIG5hbWU6IGRlcERiTmFtZSxcbiAgICAgICAgICBkYjogZGIsXG4gICAgICAgICAgc291cmNlREI6IHNvdXJjZURCLFxuICAgICAgICAgIGFkYXB0ZXI6IHNvdXJjZURCLmFkYXB0ZXIsXG4gICAgICAgICAgbWFwRnVuOiBtYXBGdW4sXG4gICAgICAgICAgcmVkdWNlRnVuOiByZWR1Y2VGdW5cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZpZXcuZGIuZ2V0KCdfbG9jYWwvbGFzdFNlcScpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChsYXN0U2VxRG9jKSB7XG4gICAgICAgICAgdmlldy5zZXEgPSBsYXN0U2VxRG9jID8gbGFzdFNlcURvYy5zZXEgOiAwO1xuICAgICAgICAgIGlmIChjYWNoZWRWaWV3cykge1xuICAgICAgICAgICAgdmlldy5kYi5vbmNlKCdkZXN0cm95ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZWRWaWV3c1t2aWV3U2lnbmF0dXJlXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmlldztcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKGNhY2hlZFZpZXdzKSB7XG4gICAgY2FjaGVkVmlld3Nbdmlld1NpZ25hdHVyZV0gPSBwcm9taXNlRm9yVmlldztcbiAgfVxuICByZXR1cm4gcHJvbWlzZUZvclZpZXc7XG59XG5cbnZhciBwZXJzaXN0ZW50UXVldWVzID0ge307XG52YXIgdGVtcFZpZXdRdWV1ZSA9IG5ldyBUYXNrUXVldWUkMSgpO1xudmFyIENIQU5HRVNfQkFUQ0hfU0laRSQxID0gNTA7XG5cbmZ1bmN0aW9uIHBhcnNlVmlld05hbWUobmFtZSkge1xuICAvLyBjYW4gYmUgZWl0aGVyICdkZG9jbmFtZS92aWV3bmFtZScgb3IganVzdCAndmlld25hbWUnXG4gIC8vICh3aGVyZSB0aGUgZGRvYyBuYW1lIGlzIHRoZSBzYW1lKVxuICByZXR1cm4gbmFtZS5pbmRleE9mKCcvJykgPT09IC0xID8gW25hbWUsIG5hbWVdIDogbmFtZS5zcGxpdCgnLycpO1xufVxuXG5mdW5jdGlvbiBpc0dlbk9uZShjaGFuZ2VzKSB7XG4gIC8vIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgY2hhbmdlIGlzIDEtXG4gIC8vIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgbGVhZnNcbiAgcmV0dXJuIGNoYW5nZXMubGVuZ3RoID09PSAxICYmIC9eMS0vLnRlc3QoY2hhbmdlc1swXS5yZXYpO1xufVxuXG5mdW5jdGlvbiBlbWl0RXJyb3IoZGIsIGUpIHtcbiAgdHJ5IHtcbiAgICBkYi5lbWl0KCdlcnJvcicsIGUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLFxuICAgICAgJ1RoZSB1c2VyXFwncyBtYXAvcmVkdWNlIGZ1bmN0aW9uIHRocmV3IGFuIHVuY2F1Z2h0IGVycm9yLlxcbicgK1xuICAgICAgJ1lvdSBjYW4gZGVidWcgdGhpcyBlcnJvciBieSBkb2luZzpcXG4nICtcbiAgICAgICdteURhdGFiYXNlLm9uKFxcJ2Vycm9yXFwnLCBmdW5jdGlvbiAoZXJyKSB7IGRlYnVnZ2VyOyB9KTtcXG4nICtcbiAgICAgICdQbGVhc2UgZG91YmxlLWNoZWNrIHlvdXIgbWFwL3JlZHVjZSBmdW5jdGlvbi4nKTtcbiAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLCBlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gXCJhYnN0cmFjdFwiIG1hcHJlZHVjZSBvYmplY3Qgb2YgdGhlIGZvcm06XG4gKlxuICogICB7XG4gKiAgICAgcXVlcnk6IHF1ZXJ5RnVuLFxuICogICAgIHZpZXdDbGVhbnVwOiB2aWV3Q2xlYW51cEZ1blxuICogICB9XG4gKlxuICogQXJndW1lbnRzIGFyZTpcbiAqXG4gKiBsb2NhbERvYzogc3RyaW5nXG4gKiAgIFRoaXMgaXMgZm9yIHRoZSBsb2NhbCBkb2MgdGhhdCBnZXRzIHNhdmVkIGluIG9yZGVyIHRvIHRyYWNrIHRoZVxuICogICBcImRlcGVuZGVudFwiIERCcyBhbmQgY2xlYW4gdGhlbSB1cCBmb3Igdmlld0NsZWFudXAuIEl0IHNob3VsZCBiZVxuICogICB1bmlxdWUsIHNvIHRoYXQgaW5kZXhlciBwbHVnaW5zIGRvbid0IGNvbGxpZGUgd2l0aCBlYWNoIG90aGVyLlxuICogbWFwcGVyOiBmdW5jdGlvbiAobWFwRnVuRGVmLCBlbWl0KVxuICogICBSZXR1cm5zIGEgbWFwIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBtYXBGdW5EZWYsIHdoaWNoIGluIHRoZSBjYXNlIG9mXG4gKiAgIG5vcm1hbCBtYXAvcmVkdWNlIGlzIGp1c3QgdGhlIGRlLXN0cmluZ2lmaWVkIGZ1bmN0aW9uLCBidXQgbWF5IGJlXG4gKiAgIHNvbWV0aGluZyBlbHNlLCBzdWNoIGFzIGFuIG9iamVjdCBpbiB0aGUgY2FzZSBvZiBwb3VjaGRiLWZpbmQuXG4gKiByZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlRnVuRGVmKVxuICogICBEaXR0bywgYnV0IGZvciByZWR1Y2luZy4gTW9kdWxlcyBkb24ndCBoYXZlIHRvIHN1cHBvcnQgcmVkdWNpbmdcbiAqICAgKGUuZy4gcG91Y2hkYi1maW5kKS5cbiAqIGRkb2NWYWxpZGF0b3I6IGZ1bmN0aW9uIChkZG9jLCB2aWV3TmFtZSlcbiAqICAgVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBkZG9jIG9yIHZpZXdOYW1lIGlzIG5vdCB2YWxpZC5cbiAqICAgVGhpcyBjb3VsZCBiZSBhIHdheSB0byBjb21tdW5pY2F0ZSB0byB0aGUgdXNlciB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGVcbiAqICAgaW5kZXhlciBpcyBpbnZhbGlkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBYnN0cmFjdE1hcFJlZHVjZShsb2NhbERvY05hbWUsIG1hcHBlciwgcmVkdWNlciwgZGRvY1ZhbGlkYXRvcikge1xuXG4gIGZ1bmN0aW9uIHRyeU1hcChkYiwgZnVuLCBkb2MpIHtcbiAgICAvLyBlbWl0IGFuIGV2ZW50IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB0aHJvd24gYnkgYSBtYXAgZnVuY3Rpb24uXG4gICAgLy8gcHV0dGluZyB0cnkvY2F0Y2hlcyBpbiBhIHNpbmdsZSBmdW5jdGlvbiBhbHNvIGF2b2lkcyBkZW9wdGltaXphdGlvbnMuXG4gICAgdHJ5IHtcbiAgICAgIGZ1bihkb2MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVtaXRFcnJvcihkYiwgZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJ5UmVkdWNlKGRiLCBmdW4sIGtleXMsIHZhbHVlcywgcmVyZWR1Y2UpIHtcbiAgICAvLyBzYW1lIGFzIGFib3ZlLCBidXQgcmV0dXJuaW5nIHRoZSByZXN1bHQgb3IgYW4gZXJyb3IuIHRoZXJlIGFyZSB0d28gc2VwYXJhdGVcbiAgICAvLyBmdW5jdGlvbnMgdG8gYXZvaWQgZXh0cmEgbWVtb3J5IGFsbG9jYXRpb25zIHNpbmNlIHRoZSB0cnlDb2RlKCkgY2FzZSBpcyB1c2VkXG4gICAgLy8gZm9yIGN1c3RvbSBtYXAgZnVuY3Rpb25zIChjb21tb24pIHZzIHRoaXMgZnVuY3Rpb24sIHdoaWNoIGlzIG9ubHkgdXNlZCBmb3JcbiAgICAvLyBjdXN0b20gcmVkdWNlIGZ1bmN0aW9ucyAocmFyZSlcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtvdXRwdXQgOiBmdW4oa2V5cywgdmFsdWVzLCByZXJlZHVjZSl9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVtaXRFcnJvcihkYiwgZSk7XG4gICAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzb3J0QnlLZXlUaGVuVmFsdWUoeCwgeSkge1xuICAgIHZhciBrZXlDb21wYXJlID0gY29sbGF0ZSh4LmtleSwgeS5rZXkpO1xuICAgIHJldHVybiBrZXlDb21wYXJlICE9PSAwID8ga2V5Q29tcGFyZSA6IGNvbGxhdGUoeC52YWx1ZSwgeS52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzbGljZVJlc3VsdHMocmVzdWx0cywgbGltaXQsIHNraXApIHtcbiAgICBza2lwID0gc2tpcCB8fCAwO1xuICAgIGlmICh0eXBlb2YgbGltaXQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5zbGljZShza2lwLCBsaW1pdCArIHNraXApO1xuICAgIH0gZWxzZSBpZiAoc2tpcCA+IDApIHtcbiAgICAgIHJldHVybiByZXN1bHRzLnNsaWNlKHNraXApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJvd1RvRG9jSWQocm93KSB7XG4gICAgdmFyIHZhbCA9IHJvdy52YWx1ZTtcbiAgICAvLyBVc2VycyBjYW4gZXhwbGljaXRseSBzcGVjaWZ5IGEgam9pbmVkIGRvYyBfaWQsIG9yIGl0XG4gICAgLy8gZGVmYXVsdHMgdG8gdGhlIGRvYyBfaWQgdGhhdCBlbWl0dGVkIHRoZSBrZXkvdmFsdWUuXG4gICAgdmFyIGRvY0lkID0gKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwuX2lkKSB8fCByb3cuaWQ7XG4gICAgcmV0dXJuIGRvY0lkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIocmVzKSB7XG4gICAgcmVzLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICB2YXIgYXR0cyA9IHJvdy5kb2MgJiYgcm93LmRvYy5fYXR0YWNobWVudHM7XG4gICAgICBpZiAoIWF0dHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmtleXMoYXR0cykuZm9yRWFjaChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICAgICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgICAgICBhdHRzW2ZpbGVuYW1lXS5kYXRhID0gYjY0VG9CbHVmZmVyKGF0dC5kYXRhLCBhdHQuY29udGVudF90eXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcyAmJiBvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuYmluYXJ5KSB7XG4gICAgICAgIHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKHJlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhZGRIdHRwUGFyYW0ocGFyYW1OYW1lLCBvcHRzLCBwYXJhbXMsIGFzSnNvbikge1xuICAgIC8vIGFkZCBhbiBodHRwIHBhcmFtIGZyb20gb3B0cyB0byBwYXJhbXMsIG9wdGlvbmFsbHkganNvbi1lbmNvZGVkXG4gICAgdmFyIHZhbCA9IG9wdHNbcGFyYW1OYW1lXTtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChhc0pzb24pIHtcbiAgICAgICAgdmFsID0gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHZhbCkpO1xuICAgICAgfVxuICAgICAgcGFyYW1zLnB1c2gocGFyYW1OYW1lICsgJz0nICsgdmFsKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb2VyY2VJbnRlZ2VyKGludGVnZXJDYW5kaWRhdGUpIHtcbiAgICBpZiAodHlwZW9mIGludGVnZXJDYW5kaWRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgYXNOdW1iZXIgPSBOdW1iZXIoaW50ZWdlckNhbmRpZGF0ZSk7XG4gICAgICAvLyBwcmV2ZW50cyBlLmcuICcxZm9vJyBvciAnMS4xJyBiZWluZyBjb2VyY2VkIHRvIDFcbiAgICAgIGlmICghaXNOYU4oYXNOdW1iZXIpICYmIGFzTnVtYmVyID09PSBwYXJzZUludChpbnRlZ2VyQ2FuZGlkYXRlLCAxMCkpIHtcbiAgICAgICAgcmV0dXJuIGFzTnVtYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGludGVnZXJDYW5kaWRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29lcmNlT3B0aW9ucyhvcHRzKSB7XG4gICAgb3B0cy5ncm91cF9sZXZlbCA9IGNvZXJjZUludGVnZXIob3B0cy5ncm91cF9sZXZlbCk7XG4gICAgb3B0cy5saW1pdCA9IGNvZXJjZUludGVnZXIob3B0cy5saW1pdCk7XG4gICAgb3B0cy5za2lwID0gY29lcmNlSW50ZWdlcihvcHRzLnNraXApO1xuICAgIHJldHVybiBvcHRzO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tQb3NpdGl2ZUludGVnZXIobnVtYmVyKSB7XG4gICAgaWYgKG51bWJlcikge1xuICAgICAgaWYgKHR5cGVvZiBudW1iZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiAgbmV3IFF1ZXJ5UGFyc2VFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgaW50ZWdlcjogXCInICtcbiAgICAgICAgICBudW1iZXIgKyAnXCInKTtcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlQYXJzZUVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBwb3NpdGl2ZSBpbnRlZ2VyOiAnICtcbiAgICAgICAgICAnXCInICsgbnVtYmVyICsgJ1wiJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tRdWVyeVBhcnNlRXJyb3Iob3B0aW9ucywgZnVuKSB7XG4gICAgdmFyIHN0YXJ0a2V5TmFtZSA9IG9wdGlvbnMuZGVzY2VuZGluZyA/ICdlbmRrZXknIDogJ3N0YXJ0a2V5JztcbiAgICB2YXIgZW5ka2V5TmFtZSA9IG9wdGlvbnMuZGVzY2VuZGluZyA/ICdzdGFydGtleScgOiAnZW5ka2V5JztcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uc1tzdGFydGtleU5hbWVdICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIG9wdGlvbnNbZW5ka2V5TmFtZV0gIT09ICd1bmRlZmluZWQnICYmXG4gICAgICBjb2xsYXRlKG9wdGlvbnNbc3RhcnRrZXlOYW1lXSwgb3B0aW9uc1tlbmRrZXlOYW1lXSkgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUVycm9yKCdObyByb3dzIGNhbiBtYXRjaCB5b3VyIGtleSByYW5nZSwgJyArXG4gICAgICAgICdyZXZlcnNlIHlvdXIgc3RhcnRfa2V5IGFuZCBlbmRfa2V5IG9yIHNldCB7ZGVzY2VuZGluZyA6IHRydWV9Jyk7XG4gICAgfSBlbHNlIGlmIChmdW4ucmVkdWNlICYmIG9wdGlvbnMucmVkdWNlICE9PSBmYWxzZSkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICAgIHRocm93IG5ldyBRdWVyeVBhcnNlRXJyb3IoJ3tpbmNsdWRlX2RvY3M6dHJ1ZX0gaXMgaW52YWxpZCBmb3IgcmVkdWNlJyk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMua2V5cyAmJiBvcHRpb25zLmtleXMubGVuZ3RoID4gMSAmJlxuICAgICAgICAhb3B0aW9ucy5ncm91cCAmJiAhb3B0aW9ucy5ncm91cF9sZXZlbCkge1xuICAgICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUVycm9yKCdNdWx0aS1rZXkgZmV0Y2hlcyBmb3IgcmVkdWNlIHZpZXdzIG11c3QgdXNlICcgK1xuICAgICAgICAgICd7Z3JvdXA6IHRydWV9Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIFsnZ3JvdXBfbGV2ZWwnLCAnbGltaXQnLCAnc2tpcCddLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbk5hbWUpIHtcbiAgICAgIHZhciBlcnJvciA9IGNoZWNrUG9zaXRpdmVJbnRlZ2VyKG9wdGlvbnNbb3B0aW9uTmFtZV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaHR0cFF1ZXJ5KGRiLCBmdW4sIG9wdHMpIHtcbiAgICAvLyBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBQVVQgcmVxdWVzdFxuICAgIHZhciBwYXJhbXMgPSBbXTtcbiAgICB2YXIgYm9keTtcbiAgICB2YXIgbWV0aG9kID0gJ0dFVCc7XG4gICAgdmFyIG9rLCBzdGF0dXM7XG5cbiAgICAvLyBJZiBvcHRzLnJlZHVjZSBleGlzdHMgYW5kIGlzIGRlZmluZWQsIHRoZW4gYWRkIGl0IHRvIHRoZSBsaXN0XG4gICAgLy8gb2YgcGFyYW1ldGVycy5cbiAgICAvLyBJZiByZWR1Y2U9ZmFsc2UgdGhlbiB0aGUgcmVzdWx0cyBhcmUgdGhhdCBvZiBvbmx5IHRoZSBtYXAgZnVuY3Rpb25cbiAgICAvLyBub3QgdGhlIGZpbmFsIHJlc3VsdCBvZiBtYXAgYW5kIHJlZHVjZS5cbiAgICBhZGRIdHRwUGFyYW0oJ3JlZHVjZScsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdpbmNsdWRlX2RvY3MnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnYXR0YWNobWVudHMnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnbGltaXQnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnZGVzY2VuZGluZycsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdncm91cCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdncm91cF9sZXZlbCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdza2lwJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ3N0YWxlJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2NvbmZsaWN0cycsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdzdGFydGtleScsIG9wdHMsIHBhcmFtcywgdHJ1ZSk7XG4gICAgYWRkSHR0cFBhcmFtKCdzdGFydF9rZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgnZW5ka2V5Jywgb3B0cywgcGFyYW1zLCB0cnVlKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2VuZF9rZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgnaW5jbHVzaXZlX2VuZCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdrZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgndXBkYXRlX3NlcScsIG9wdHMsIHBhcmFtcyk7XG5cbiAgICAvLyBGb3JtYXQgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBpbnRvIGEgdmFsaWQgVVJJIHF1ZXJ5IHN0cmluZ1xuICAgIHBhcmFtcyA9IHBhcmFtcy5qb2luKCcmJyk7XG4gICAgcGFyYW1zID0gcGFyYW1zID09PSAnJyA/ICcnIDogJz8nICsgcGFyYW1zO1xuXG4gICAgLy8gSWYga2V5cyBhcmUgc3VwcGxpZWQsIGlzc3VlIGEgUE9TVCB0byBjaXJjdW12ZW50IEdFVCBxdWVyeSBzdHJpbmcgbGltaXRzXG4gICAgLy8gc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY291Y2hkYi9IVFRQX3ZpZXdfQVBJI1F1ZXJ5aW5nX09wdGlvbnNcbiAgICBpZiAodHlwZW9mIG9wdHMua2V5cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBNQVhfVVJMX0xFTkdUSCA9IDIwMDA7XG4gICAgICAvLyBhY2NvcmRpbmcgdG8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDE3MTg0LzY4MDc0MixcbiAgICAgIC8vIHRoZSBkZSBmYWN0byBVUkwgbGVuZ3RoIGxpbWl0IGlzIDIwMDAgY2hhcmFjdGVyc1xuXG4gICAgICB2YXIga2V5c0FzU3RyaW5nID1cbiAgICAgICAgJ2tleXM9JyArIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvcHRzLmtleXMpKTtcbiAgICAgIGlmIChrZXlzQXNTdHJpbmcubGVuZ3RoICsgcGFyYW1zLmxlbmd0aCArIDEgPD0gTUFYX1VSTF9MRU5HVEgpIHtcbiAgICAgICAgLy8gSWYgdGhlIGtleXMgYXJlIHNob3J0IGVub3VnaCwgZG8gYSBHRVQuIHdlIGRvIHRoaXMgdG8gd29yayBhcm91bmRcbiAgICAgICAgLy8gU2FmYXJpIG5vdCB1bmRlcnN0YW5kaW5nIDMwNHMgb24gUE9TVHMgKHNlZSBwb3VjaGRiL3BvdWNoZGIjMTIzOSlcbiAgICAgICAgcGFyYW1zICs9IChwYXJhbXNbMF0gPT09ICc/JyA/ICcmJyA6ICc/JykgKyBrZXlzQXNTdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGJvZHkgPSB7a2V5czogb3B0cy5rZXlzfTtcbiAgICAgICAgfSBlbHNlIHsgLy8gZnVuIGlzIHttYXAgOiBtYXBmdW59LCBzbyBhcHBlbmQgdG8gdGhpc1xuICAgICAgICAgIGZ1bi5rZXlzID0gb3B0cy5rZXlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIHJlZmVyZW5jaW5nIGEgcXVlcnkgZGVmaW5lZCBpbiB0aGUgZGVzaWduIGRvY1xuICAgIGlmICh0eXBlb2YgZnVuID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIHBhcnRzID0gcGFyc2VWaWV3TmFtZShmdW4pO1xuICAgICAgcmV0dXJuIGRiLmZldGNoKCdfZGVzaWduLycgKyBwYXJ0c1swXSArICcvX3ZpZXcvJyArIHBhcnRzWzFdICsgcGFyYW1zLCB7XG4gICAgICAgIGhlYWRlcnM6IG5ldyBoKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSksXG4gICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgb2sgPSByZXNwb25zZS5vaztcbiAgICAgICAgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICByZXN1bHQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICAgIHRocm93IGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmYWlsIHRoZSBlbnRpcmUgcmVxdWVzdCBpZiB0aGUgcmVzdWx0IGNvbnRhaW5zIGFuIGVycm9yXG4gICAgICAgIHJlc3VsdC5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChyb3cudmFsdWUgJiYgcm93LnZhbHVlLmVycm9yICYmIHJvdy52YWx1ZS5lcnJvciA9PT0gXCJidWlsdGluX3JlZHVjZV9lcnJvclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Iocm93LnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLnRoZW4ocG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSk7XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIHVzaW5nIGEgdGVtcG9yYXJ5IHZpZXcsIHRlcnJpYmxlIGZvciBwZXJmb3JtYW5jZSwgZ29vZCBmb3IgdGVzdGluZ1xuICAgIGJvZHkgPSBib2R5IHx8IHt9O1xuICAgIE9iamVjdC5rZXlzKGZ1bikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmdW5ba2V5XSkpIHtcbiAgICAgICAgYm9keVtrZXldID0gZnVuW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5W2tleV0gPSBmdW5ba2V5XS50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRiLmZldGNoKCdfdGVtcF92aWV3JyArIHBhcmFtcywge1xuICAgICAgaGVhZGVyczogbmV3IGgoeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9KSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBvayA9IHJlc3BvbnNlLm9rO1xuICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICByZXN1bHQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aHJvdyBnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLnRoZW4ocG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSk7XG4gIH1cblxuICAvLyBjdXN0b20gYWRhcHRlcnMgY2FuIGRlZmluZSB0aGVpciBvd24gYXBpLl9xdWVyeVxuICAvLyBhbmQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZnVuY3Rpb24gY3VzdG9tUXVlcnkoZGIsIGZ1biwgb3B0cykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBkYi5fcXVlcnkoZnVuLCBvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGN1c3RvbSBhZGFwdGVycyBjYW4gZGVmaW5lIHRoZWlyIG93biBhcGkuX3ZpZXdDbGVhbnVwXG4gIC8vIGFuZCBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmdW5jdGlvbiBjdXN0b21WaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBkYi5fdmlld0NsZWFudXAoZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0c1RvKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocmVhc29uLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gcmV0dXJucyBhIHByb21pc2UgZm9yIGEgbGlzdCBvZiBkb2NzIHRvIHVwZGF0ZSwgYmFzZWQgb24gdGhlIGlucHV0IGRvY0lkLlxuICAvLyB0aGUgb3JkZXIgZG9lc24ndCBtYXR0ZXIsIGJlY2F1c2UgcG9zdC0zLjIuMCwgYnVsa0RvY3NcbiAgLy8gaXMgYW4gYXRvbWljIG9wZXJhdGlvbiBpbiBhbGwgdGhyZWUgYWRhcHRlcnMuXG4gIGZ1bmN0aW9uIGdldERvY3NUb1BlcnNpc3QoZG9jSWQsIHZpZXcsIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKSB7XG4gICAgdmFyIG1ldGFEb2NJZCA9ICdfbG9jYWwvZG9jXycgKyBkb2NJZDtcbiAgICB2YXIgZGVmYXVsdE1ldGFEb2MgPSB7X2lkOiBtZXRhRG9jSWQsIGtleXM6IFtdfTtcbiAgICB2YXIgZG9jRGF0YSA9IGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLmdldChkb2NJZCk7XG4gICAgdmFyIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyA9IGRvY0RhdGFbMF07XG4gICAgdmFyIGNoYW5nZXMgPSBkb2NEYXRhWzFdO1xuXG4gICAgZnVuY3Rpb24gZ2V0TWV0YURvYygpIHtcbiAgICAgIGlmIChpc0dlbk9uZShjaGFuZ2VzKSkge1xuICAgICAgICAvLyBnZW5lcmF0aW9uIDEsIHNvIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGluaXRpYWwgc3RhdGVcbiAgICAgICAgLy8gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKGF2b2lkcyB1bm5lY2Vzc2FyeSBHRVRzKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRlZmF1bHRNZXRhRG9jKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2aWV3LmRiLmdldChtZXRhRG9jSWQpLmNhdGNoKGRlZmF1bHRzVG8oZGVmYXVsdE1ldGFEb2MpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRLZXlWYWx1ZURvY3MobWV0YURvYykge1xuICAgICAgaWYgKCFtZXRhRG9jLmtleXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIG5vIGtleXMsIG5vIG5lZWQgZm9yIGEgbG9va3VwXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe3Jvd3M6IFtdfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmlldy5kYi5hbGxEb2NzKHtcbiAgICAgICAga2V5czogbWV0YURvYy5rZXlzLFxuICAgICAgICBpbmNsdWRlX2RvY3M6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NLZXlWYWx1ZURvY3MobWV0YURvYywga3ZEb2NzUmVzKSB7XG4gICAgICB2YXIga3ZEb2NzID0gW107XG4gICAgICB2YXIgb2xkS2V5cyA9IG5ldyBFeHBvcnRlZFNldCgpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0ga3ZEb2NzUmVzLnJvd3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHJvdyA9IGt2RG9jc1Jlcy5yb3dzW2ldO1xuICAgICAgICB2YXIgZG9jID0gcm93LmRvYztcbiAgICAgICAgaWYgKCFkb2MpIHsgLy8gZGVsZXRlZFxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGt2RG9jcy5wdXNoKGRvYyk7XG4gICAgICAgIG9sZEtleXMuYWRkKGRvYy5faWQpO1xuICAgICAgICBkb2MuX2RlbGV0ZWQgPSAhaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLmhhcyhkb2MuX2lkKTtcbiAgICAgICAgaWYgKCFkb2MuX2RlbGV0ZWQpIHtcbiAgICAgICAgICB2YXIga2V5VmFsdWUgPSBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMuZ2V0KGRvYy5faWQpO1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIGtleVZhbHVlKSB7XG4gICAgICAgICAgICBkb2MudmFsdWUgPSBrZXlWYWx1ZS52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBuZXdLZXlzID0gbWFwVG9LZXlzQXJyYXkoaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzKTtcbiAgICAgIG5ld0tleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghb2xkS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIC8vIG5ldyBkb2NcbiAgICAgICAgICB2YXIga3ZEb2MgPSB7XG4gICAgICAgICAgICBfaWQ6IGtleVxuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIGtleVZhbHVlID0gaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLmdldChrZXkpO1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIGtleVZhbHVlKSB7XG4gICAgICAgICAgICBrdkRvYy52YWx1ZSA9IGtleVZhbHVlLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrdkRvY3MucHVzaChrdkRvYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbWV0YURvYy5rZXlzID0gdW5pcShuZXdLZXlzLmNvbmNhdChtZXRhRG9jLmtleXMpKTtcbiAgICAgIGt2RG9jcy5wdXNoKG1ldGFEb2MpO1xuXG4gICAgICByZXR1cm4ga3ZEb2NzO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRNZXRhRG9jKCkudGhlbihmdW5jdGlvbiAobWV0YURvYykge1xuICAgICAgcmV0dXJuIGdldEtleVZhbHVlRG9jcyhtZXRhRG9jKS50aGVuKGZ1bmN0aW9uIChrdkRvY3NSZXMpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NLZXlWYWx1ZURvY3MobWV0YURvYywga3ZEb2NzUmVzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdXBkYXRlcyBhbGwgZW1pdHRlZCBrZXkvdmFsdWUgZG9jcyBhbmQgbWV0YURvY3MgaW4gdGhlIG1ydmlldyBkYXRhYmFzZVxuICAvLyBmb3IgdGhlIGdpdmVuIGJhdGNoIG9mIGRvY3VtZW50cyBmcm9tIHRoZSBzb3VyY2UgZGF0YWJhc2VcbiAgZnVuY3Rpb24gc2F2ZUtleVZhbHVlcyh2aWV3LCBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cywgc2VxKSB7XG4gICAgdmFyIHNlcURvY0lkID0gJ19sb2NhbC9sYXN0U2VxJztcbiAgICByZXR1cm4gdmlldy5kYi5nZXQoc2VxRG9jSWQpXG4gICAgICAuY2F0Y2goZGVmYXVsdHNUbyh7X2lkOiBzZXFEb2NJZCwgc2VxOiAwfSkpXG4gICAgICAudGhlbihmdW5jdGlvbiAobGFzdFNlcURvYykge1xuICAgICAgICB2YXIgZG9jSWRzID0gbWFwVG9LZXlzQXJyYXkoZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZG9jSWRzLm1hcChmdW5jdGlvbiAoZG9jSWQpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RG9jc1RvUGVyc2lzdChkb2NJZCwgdmlldywgZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMpO1xuICAgICAgICB9KSkudGhlbihmdW5jdGlvbiAobGlzdE9mRG9jc1RvUGVyc2lzdCkge1xuICAgICAgICAgIHZhciBkb2NzVG9QZXJzaXN0ID0gZmxhdHRlbihsaXN0T2ZEb2NzVG9QZXJzaXN0KTtcbiAgICAgICAgICBsYXN0U2VxRG9jLnNlcSA9IHNlcTtcbiAgICAgICAgICBkb2NzVG9QZXJzaXN0LnB1c2gobGFzdFNlcURvYyk7XG4gICAgICAgICAgLy8gd3JpdGUgYWxsIGRvY3MgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLCB1cGRhdGUgdGhlIHNlcSBvbmNlXG4gICAgICAgICAgcmV0dXJuIHZpZXcuZGIuYnVsa0RvY3Moe2RvY3MgOiBkb2NzVG9QZXJzaXN0fSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRRdWV1ZSh2aWV3KSB7XG4gICAgdmFyIHZpZXdOYW1lID0gdHlwZW9mIHZpZXcgPT09ICdzdHJpbmcnID8gdmlldyA6IHZpZXcubmFtZTtcbiAgICB2YXIgcXVldWUgPSBwZXJzaXN0ZW50UXVldWVzW3ZpZXdOYW1lXTtcbiAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICBxdWV1ZSA9IHBlcnNpc3RlbnRRdWV1ZXNbdmlld05hbWVdID0gbmV3IFRhc2tRdWV1ZSQxKCk7XG4gICAgfVxuICAgIHJldHVybiBxdWV1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXcodmlldywgb3B0cykge1xuICAgIHJldHVybiBzZXF1ZW50aWFsaXplKGdldFF1ZXVlKHZpZXcpLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdXBkYXRlVmlld0luUXVldWUodmlldywgb3B0cyk7XG4gICAgfSkoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXdJblF1ZXVlKHZpZXcsIG9wdHMpIHtcbiAgICAvLyBiaW5kIHRoZSBlbWl0IGZ1bmN0aW9uIG9uY2VcbiAgICB2YXIgbWFwUmVzdWx0cztcbiAgICB2YXIgZG9jO1xuXG4gICAgZnVuY3Rpb24gZW1pdChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb3V0cHV0ID0ge2lkOiBkb2MuX2lkLCBrZXk6IG5vcm1hbGl6ZUtleShrZXkpfTtcbiAgICAgIC8vIERvbid0IGV4cGxpY2l0bHkgc3RvcmUgdGhlIHZhbHVlIHVubGVzcyBpdCdzIGRlZmluZWQgYW5kIG5vbi1udWxsLlxuICAgICAgLy8gVGhpcyBzYXZlcyBvbiBzdG9yYWdlIHNwYWNlLCBiZWNhdXNlIG9mdGVuIHBlb3BsZSBkb24ndCB1c2UgaXQuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXQudmFsdWUgPSBub3JtYWxpemVLZXkodmFsdWUpO1xuICAgICAgfVxuICAgICAgbWFwUmVzdWx0cy5wdXNoKG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIG1hcEZ1biA9IG1hcHBlcih2aWV3Lm1hcEZ1biwgZW1pdCk7XG5cbiAgICB2YXIgY3VycmVudFNlcSA9IHZpZXcuc2VxIHx8IDA7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQ2hhbmdlKGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLCBzZXEpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzYXZlS2V5VmFsdWVzKHZpZXcsIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLCBzZXEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgaW5kZXhlZF9kb2NzID0gMDtcbiAgICBsZXQgcHJvZ3Jlc3MgPSB7XG4gICAgICB2aWV3OiB2aWV3Lm5hbWUsXG4gICAgICBpbmRleGVkX2RvY3M6IGluZGV4ZWRfZG9jc1xuICAgIH07XG4gICAgdmlldy5zb3VyY2VEQi5lbWl0KCdpbmRleGluZycsIHByb2dyZXNzKTtcblxuICAgIHZhciBxdWV1ZSA9IG5ldyBUYXNrUXVldWUkMSgpO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc05leHRCYXRjaCgpIHtcbiAgICAgIHJldHVybiB2aWV3LnNvdXJjZURCLmNoYW5nZXMoe1xuICAgICAgICByZXR1cm5fZG9jczogdHJ1ZSxcbiAgICAgICAgY29uZmxpY3RzOiB0cnVlLFxuICAgICAgICBpbmNsdWRlX2RvY3M6IHRydWUsXG4gICAgICAgIHN0eWxlOiAnYWxsX2RvY3MnLFxuICAgICAgICBzaW5jZTogY3VycmVudFNlcSxcbiAgICAgICAgbGltaXQ6IG9wdHMuY2hhbmdlc19iYXRjaF9zaXplXG4gICAgICB9KS50aGVuKHByb2Nlc3NCYXRjaCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoKHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IHJlc3BvbnNlLnJlc3VsdHM7XG4gICAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyA9IGNyZWF0ZURvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKHJlc3VsdHMpO1xuICAgICAgcXVldWUuYWRkKHByb2Nlc3NDaGFuZ2UoZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMsIGN1cnJlbnRTZXEpKTtcblxuICAgICAgaW5kZXhlZF9kb2NzID0gaW5kZXhlZF9kb2NzICsgcmVzdWx0cy5sZW5ndGg7XG4gICAgICBsZXQgcHJvZ3Jlc3MgPSB7XG4gICAgICAgIHZpZXc6IHZpZXcubmFtZSxcbiAgICAgICAgbGFzdF9zZXE6IHJlc3BvbnNlLmxhc3Rfc2VxLFxuICAgICAgICByZXN1bHRzX2NvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgICAgaW5kZXhlZF9kb2NzOiBpbmRleGVkX2RvY3NcbiAgICAgIH07XG4gICAgICB2aWV3LnNvdXJjZURCLmVtaXQoJ2luZGV4aW5nJywgcHJvZ3Jlc3MpO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPCBvcHRzLmNoYW5nZXNfYmF0Y2hfc2l6ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvY2Vzc05leHRCYXRjaCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKHJlc3VsdHMpIHtcbiAgICAgIHZhciBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IHJlc3VsdHNbaV07XG4gICAgICAgIGlmIChjaGFuZ2UuZG9jLl9pZFswXSAhPT0gJ18nKSB7XG4gICAgICAgICAgbWFwUmVzdWx0cyA9IFtdO1xuICAgICAgICAgIGRvYyA9IGNoYW5nZS5kb2M7XG5cbiAgICAgICAgICBpZiAoIWRvYy5fZGVsZXRlZCkge1xuICAgICAgICAgICAgdHJ5TWFwKHZpZXcuc291cmNlREIsIG1hcEZ1biwgZG9jKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwUmVzdWx0cy5zb3J0KHNvcnRCeUtleVRoZW5WYWx1ZSk7XG5cbiAgICAgICAgICB2YXIgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzID0gY3JlYXRlSW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzKG1hcFJlc3VsdHMpO1xuICAgICAgICAgIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLnNldChjaGFuZ2UuZG9jLl9pZCwgW1xuICAgICAgICAgICAgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLFxuICAgICAgICAgICAgY2hhbmdlLmNoYW5nZXNcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50U2VxID0gY2hhbmdlLnNlcTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMobWFwUmVzdWx0cykge1xuICAgICAgdmFyIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICAgICAgdmFyIGxhc3RLZXk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbWFwUmVzdWx0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgZW1pdHRlZEtleVZhbHVlID0gbWFwUmVzdWx0c1tpXTtcbiAgICAgICAgdmFyIGNvbXBsZXhLZXkgPSBbZW1pdHRlZEtleVZhbHVlLmtleSwgZW1pdHRlZEtleVZhbHVlLmlkXTtcbiAgICAgICAgaWYgKGkgPiAwICYmIGNvbGxhdGUoZW1pdHRlZEtleVZhbHVlLmtleSwgbGFzdEtleSkgPT09IDApIHtcbiAgICAgICAgICBjb21wbGV4S2V5LnB1c2goaSk7IC8vIGR1cCBrZXkraWQsIHNvIG1ha2UgaXQgdW5pcXVlXG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLnNldCh0b0luZGV4YWJsZVN0cmluZyhjb21wbGV4S2V5KSwgZW1pdHRlZEtleVZhbHVlKTtcbiAgICAgICAgbGFzdEtleSA9IGVtaXR0ZWRLZXlWYWx1ZS5rZXk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzTmV4dEJhdGNoKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcXVldWUuZmluaXNoKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2aWV3LnNlcSA9IGN1cnJlbnRTZXE7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWR1Y2VWaWV3KHZpZXcsIHJlc3VsdHMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5ncm91cF9sZXZlbCA9PT0gMCkge1xuICAgICAgZGVsZXRlIG9wdGlvbnMuZ3JvdXBfbGV2ZWw7XG4gICAgfVxuXG4gICAgdmFyIHNob3VsZEdyb3VwID0gb3B0aW9ucy5ncm91cCB8fCBvcHRpb25zLmdyb3VwX2xldmVsO1xuXG4gICAgdmFyIHJlZHVjZUZ1biA9IHJlZHVjZXIodmlldy5yZWR1Y2VGdW4pO1xuXG4gICAgdmFyIGdyb3VwcyA9IFtdO1xuICAgIHZhciBsdmwgPSBpc05hTihvcHRpb25zLmdyb3VwX2xldmVsKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6XG4gICAgICBvcHRpb25zLmdyb3VwX2xldmVsO1xuICAgIHJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGxhc3QgPSBncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIGdyb3VwS2V5ID0gc2hvdWxkR3JvdXAgPyBlLmtleSA6IG51bGw7XG5cbiAgICAgIC8vIG9ubHkgc2V0IGdyb3VwX2xldmVsIGZvciBhcnJheSBrZXlzXG4gICAgICBpZiAoc2hvdWxkR3JvdXAgJiYgQXJyYXkuaXNBcnJheShncm91cEtleSkpIHtcbiAgICAgICAgZ3JvdXBLZXkgPSBncm91cEtleS5zbGljZSgwLCBsdmwpO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdCAmJiBjb2xsYXRlKGxhc3QuZ3JvdXBLZXksIGdyb3VwS2V5KSA9PT0gMCkge1xuICAgICAgICBsYXN0LmtleXMucHVzaChbZS5rZXksIGUuaWRdKTtcbiAgICAgICAgbGFzdC52YWx1ZXMucHVzaChlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZ3JvdXBzLnB1c2goe1xuICAgICAgICBrZXlzOiBbW2Uua2V5LCBlLmlkXV0sXG4gICAgICAgIHZhbHVlczogW2UudmFsdWVdLFxuICAgICAgICBncm91cEtleTogZ3JvdXBLZXlcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlc3VsdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgZSA9IGdyb3Vwc1tpXTtcbiAgICAgIHZhciByZWR1Y2VUcnkgPSB0cnlSZWR1Y2Uodmlldy5zb3VyY2VEQiwgcmVkdWNlRnVuLCBlLmtleXMsIGUudmFsdWVzLCBmYWxzZSk7XG4gICAgICBpZiAocmVkdWNlVHJ5LmVycm9yICYmIHJlZHVjZVRyeS5lcnJvciBpbnN0YW5jZW9mIEJ1aWx0SW5FcnJvcikge1xuICAgICAgICAvLyBDb3VjaERCIHJldHVybnMgYW4gZXJyb3IgaWYgYSBidWlsdC1pbiBlcnJvcnMgb3V0XG4gICAgICAgIHRocm93IHJlZHVjZVRyeS5lcnJvcjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIC8vIENvdWNoREIganVzdCBzZXRzIHRoZSB2YWx1ZSB0byBudWxsIGlmIGEgbm9uLWJ1aWx0LWluIGVycm9ycyBvdXRcbiAgICAgICAgdmFsdWU6IHJlZHVjZVRyeS5lcnJvciA/IG51bGwgOiByZWR1Y2VUcnkub3V0cHV0LFxuICAgICAgICBrZXk6IGUuZ3JvdXBLZXlcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBubyB0b3RhbF9yb3dzL29mZnNldCB3aGVuIHJlZHVjaW5nXG4gICAgcmV0dXJuIHtyb3dzOiBzbGljZVJlc3VsdHMocmVzdWx0cywgb3B0aW9ucy5saW1pdCwgb3B0aW9ucy5za2lwKX07XG4gIH1cblxuICBmdW5jdGlvbiBxdWVyeVZpZXcodmlldywgb3B0cykge1xuICAgIHJldHVybiBzZXF1ZW50aWFsaXplKGdldFF1ZXVlKHZpZXcpLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcXVlcnlWaWV3SW5RdWV1ZSh2aWV3LCBvcHRzKTtcbiAgICB9KSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcXVlcnlWaWV3SW5RdWV1ZSh2aWV3LCBvcHRzKSB7XG4gICAgdmFyIHRvdGFsUm93cztcbiAgICB2YXIgc2hvdWxkUmVkdWNlID0gdmlldy5yZWR1Y2VGdW4gJiYgb3B0cy5yZWR1Y2UgIT09IGZhbHNlO1xuICAgIHZhciBza2lwID0gb3B0cy5za2lwIHx8IDA7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmtleXMgIT09ICd1bmRlZmluZWQnICYmICFvcHRzLmtleXMubGVuZ3RoKSB7XG4gICAgICAvLyBlcXVpdmFsZW50IHF1ZXJ5XG4gICAgICBvcHRzLmxpbWl0ID0gMDtcbiAgICAgIGRlbGV0ZSBvcHRzLmtleXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmV0Y2hGcm9tVmlldyh2aWV3T3B0cykge1xuICAgICAgdmlld09wdHMuaW5jbHVkZV9kb2NzID0gdHJ1ZTtcbiAgICAgIHJldHVybiB2aWV3LmRiLmFsbERvY3Modmlld09wdHMpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB0b3RhbFJvd3MgPSByZXMudG90YWxfcm93cztcbiAgICAgICAgcmV0dXJuIHJlcy5yb3dzLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7XG5cbiAgICAgICAgICAvLyBpbXBsaWNpdCBtaWdyYXRpb24gLSBpbiBvbGRlciB2ZXJzaW9ucyBvZiBQb3VjaERCLFxuICAgICAgICAgIC8vIHdlIGV4cGxpY2l0bHkgc3RvcmVkIHRoZSBkb2MgYXMge2lkOiAuLi4sIGtleTogLi4uLCB2YWx1ZTogLi4ufVxuICAgICAgICAgIC8vIHRoaXMgaXMgdGVzdGVkIGluIGEgbWlncmF0aW9uIHRlc3RcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIHJlc3VsdC5kb2MgJiYgdHlwZW9mIHJlc3VsdC5kb2MudmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICByZXN1bHQuZG9jLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdC5kb2MudmFsdWUpLnNvcnQoKTtcbiAgICAgICAgICAgIC8vIHRoaXMgZGV0ZWN0aW9uIG1ldGhvZCBpcyBub3QgcGVyZmVjdCwgYnV0IGl0J3MgdW5saWtlbHkgdGhlIHVzZXJcbiAgICAgICAgICAgIC8vIGVtaXR0ZWQgYSB2YWx1ZSB3aGljaCB3YXMgYW4gb2JqZWN0IHdpdGggdGhlc2UgMyBleGFjdCBrZXlzXG4gICAgICAgICAgICB2YXIgZXhwZWN0ZWRLZXlzID0gWydpZCcsICdrZXknLCAndmFsdWUnXTtcbiAgICAgICAgICAgIGlmICghKGtleXMgPCBleHBlY3RlZEtleXMgfHwga2V5cyA+IGV4cGVjdGVkS2V5cykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb2MudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHBhcnNlZEtleUFuZERvY0lkID0gcGFyc2VJbmRleGFibGVTdHJpbmcocmVzdWx0LmRvYy5faWQpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IHBhcnNlZEtleUFuZERvY0lkWzBdLFxuICAgICAgICAgICAgaWQ6IHBhcnNlZEtleUFuZERvY0lkWzFdLFxuICAgICAgICAgICAgdmFsdWU6ICgndmFsdWUnIGluIHJlc3VsdC5kb2MgPyByZXN1bHQuZG9jLnZhbHVlIDogbnVsbClcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTWFwUmVzdWx0c1JlYWR5KHJvd3MpIHtcbiAgICAgIHZhciBmaW5hbFJlc3VsdHM7XG4gICAgICBpZiAoc2hvdWxkUmVkdWNlKSB7XG4gICAgICAgIGZpbmFsUmVzdWx0cyA9IHJlZHVjZVZpZXcodmlldywgcm93cywgb3B0cyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRzLmtleXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZpbmFsUmVzdWx0cyA9IHtcbiAgICAgICAgICB0b3RhbF9yb3dzOiB0b3RhbFJvd3MsXG4gICAgICAgICAgb2Zmc2V0OiBza2lwLFxuICAgICAgICAgIHJvd3M6IHJvd3NcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN1cHBvcnQgbGltaXQsIHNraXAgZm9yIGtleXMgcXVlcnlcbiAgICAgICAgZmluYWxSZXN1bHRzID0ge1xuICAgICAgICAgIHRvdGFsX3Jvd3M6IHRvdGFsUm93cyxcbiAgICAgICAgICBvZmZzZXQ6IHNraXAsXG4gICAgICAgICAgcm93czogc2xpY2VSZXN1bHRzKHJvd3Msb3B0cy5saW1pdCxvcHRzLnNraXApXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChvcHRzLnVwZGF0ZV9zZXEpIHtcbiAgICAgICAgZmluYWxSZXN1bHRzLnVwZGF0ZV9zZXEgPSB2aWV3LnNlcTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgICB2YXIgZG9jSWRzID0gdW5pcShyb3dzLm1hcChyb3dUb0RvY0lkKSk7XG5cbiAgICAgICAgcmV0dXJuIHZpZXcuc291cmNlREIuYWxsRG9jcyh7XG4gICAgICAgICAga2V5czogZG9jSWRzLFxuICAgICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZSxcbiAgICAgICAgICBjb25mbGljdHM6IG9wdHMuY29uZmxpY3RzLFxuICAgICAgICAgIGF0dGFjaG1lbnRzOiBvcHRzLmF0dGFjaG1lbnRzLFxuICAgICAgICAgIGJpbmFyeTogb3B0cy5iaW5hcnlcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYWxsRG9jc1Jlcykge1xuICAgICAgICAgIHZhciBkb2NJZHNUb0RvY3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgICAgICAgICBhbGxEb2NzUmVzLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICBkb2NJZHNUb0RvY3Muc2V0KHJvdy5pZCwgcm93LmRvYyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHZhciBkb2NJZCA9IHJvd1RvRG9jSWQocm93KTtcbiAgICAgICAgICAgIHZhciBkb2MgPSBkb2NJZHNUb0RvY3MuZ2V0KGRvY0lkKTtcbiAgICAgICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICAgICAgcm93LmRvYyA9IGRvYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZmluYWxSZXN1bHRzO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmaW5hbFJlc3VsdHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmtleXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIga2V5cyA9IG9wdHMua2V5cztcbiAgICAgIHZhciBmZXRjaFByb21pc2VzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmlld09wdHMgPSB7XG4gICAgICAgICAgc3RhcnRrZXkgOiB0b0luZGV4YWJsZVN0cmluZyhba2V5XSksXG4gICAgICAgICAgZW5ka2V5ICAgOiB0b0luZGV4YWJsZVN0cmluZyhba2V5LCB7fV0pXG4gICAgICAgIH07XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICAgICAgdmlld09wdHMudXBkYXRlX3NlcSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZldGNoRnJvbVZpZXcodmlld09wdHMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZmV0Y2hQcm9taXNlcykudGhlbihmbGF0dGVuKS50aGVuKG9uTWFwUmVzdWx0c1JlYWR5KTtcbiAgICB9IGVsc2UgeyAvLyBub3JtYWwgcXVlcnksIG5vICdrZXlzJ1xuICAgICAgdmFyIHZpZXdPcHRzID0ge1xuICAgICAgICBkZXNjZW5kaW5nIDogb3B0cy5kZXNjZW5kaW5nXG4gICAgICB9O1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICAgIHZpZXdPcHRzLnVwZGF0ZV9zZXEgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHN0YXJ0a2V5O1xuICAgICAgdmFyIGVuZGtleTtcbiAgICAgIGlmICgnc3RhcnRfa2V5JyBpbiBvcHRzKSB7XG4gICAgICAgIHN0YXJ0a2V5ID0gb3B0cy5zdGFydF9rZXk7XG4gICAgICB9XG4gICAgICBpZiAoJ3N0YXJ0a2V5JyBpbiBvcHRzKSB7XG4gICAgICAgIHN0YXJ0a2V5ID0gb3B0cy5zdGFydGtleTtcbiAgICAgIH1cbiAgICAgIGlmICgnZW5kX2tleScgaW4gb3B0cykge1xuICAgICAgICBlbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gICAgICB9XG4gICAgICBpZiAoJ2VuZGtleScgaW4gb3B0cykge1xuICAgICAgICBlbmRrZXkgPSBvcHRzLmVuZGtleTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3RhcnRrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0gb3B0cy5kZXNjZW5kaW5nID9cbiAgICAgICAgICB0b0luZGV4YWJsZVN0cmluZyhbc3RhcnRrZXksIHt9XSkgOlxuICAgICAgICAgIHRvSW5kZXhhYmxlU3RyaW5nKFtzdGFydGtleV0pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBlbmRrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBpbmNsdXNpdmVFbmQgPSBvcHRzLmluY2x1c2l2ZV9lbmQgIT09IGZhbHNlO1xuICAgICAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICAgICAgaW5jbHVzaXZlRW5kID0gIWluY2x1c2l2ZUVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpZXdPcHRzLmVuZGtleSA9IHRvSW5kZXhhYmxlU3RyaW5nKFxuICAgICAgICAgIGluY2x1c2l2ZUVuZCA/IFtlbmRrZXksIHt9XSA6IFtlbmRrZXldKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5rZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBrZXlTdGFydCA9IHRvSW5kZXhhYmxlU3RyaW5nKFtvcHRzLmtleV0pO1xuICAgICAgICB2YXIga2V5RW5kID0gdG9JbmRleGFibGVTdHJpbmcoW29wdHMua2V5LCB7fV0pO1xuICAgICAgICBpZiAodmlld09wdHMuZGVzY2VuZGluZykge1xuICAgICAgICAgIHZpZXdPcHRzLmVuZGtleSA9IGtleVN0YXJ0O1xuICAgICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0ga2V5RW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0ga2V5U3RhcnQ7XG4gICAgICAgICAgdmlld09wdHMuZW5ka2V5ID0ga2V5RW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNob3VsZFJlZHVjZSkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubGltaXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdmlld09wdHMubGltaXQgPSBvcHRzLmxpbWl0O1xuICAgICAgICB9XG4gICAgICAgIHZpZXdPcHRzLnNraXAgPSBza2lwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZldGNoRnJvbVZpZXcodmlld09wdHMpLnRoZW4ob25NYXBSZXN1bHRzUmVhZHkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGh0dHBWaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBkYi5mZXRjaCgnX3ZpZXdfY2xlYW51cCcsIHtcbiAgICAgIGhlYWRlcnM6IG5ldyBoKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSksXG4gICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9jYWxWaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBkYi5nZXQoJ19sb2NhbC8nICsgbG9jYWxEb2NOYW1lKS50aGVuKGZ1bmN0aW9uIChtZXRhRG9jKSB7XG4gICAgICB2YXIgZG9jc1RvVmlld3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgICAgIE9iamVjdC5rZXlzKG1ldGFEb2Mudmlld3MpLmZvckVhY2goZnVuY3Rpb24gKGZ1bGxWaWV3TmFtZSkge1xuICAgICAgICB2YXIgcGFydHMgPSBwYXJzZVZpZXdOYW1lKGZ1bGxWaWV3TmFtZSk7XG4gICAgICAgIHZhciBkZXNpZ25Eb2NOYW1lID0gJ19kZXNpZ24vJyArIHBhcnRzWzBdO1xuICAgICAgICB2YXIgdmlld05hbWUgPSBwYXJ0c1sxXTtcbiAgICAgICAgdmFyIHZpZXdzID0gZG9jc1RvVmlld3MuZ2V0KGRlc2lnbkRvY05hbWUpO1xuICAgICAgICBpZiAoIXZpZXdzKSB7XG4gICAgICAgICAgdmlld3MgPSBuZXcgRXhwb3J0ZWRTZXQoKTtcbiAgICAgICAgICBkb2NzVG9WaWV3cy5zZXQoZGVzaWduRG9jTmFtZSwgdmlld3MpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXdzLmFkZCh2aWV3TmFtZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICBrZXlzIDogbWFwVG9LZXlzQXJyYXkoZG9jc1RvVmlld3MpLFxuICAgICAgICBpbmNsdWRlX2RvY3MgOiB0cnVlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGRiLmFsbERvY3Mob3B0cykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHZhciB2aWV3c1RvU3RhdHVzID0ge307XG4gICAgICAgIHJlcy5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHZhciBkZG9jTmFtZSA9IHJvdy5rZXkuc3Vic3RyaW5nKDgpOyAvLyBjdXRzIG9mZiAnX2Rlc2lnbi8nXG4gICAgICAgICAgZG9jc1RvVmlld3MuZ2V0KHJvdy5rZXkpLmZvckVhY2goZnVuY3Rpb24gKHZpZXdOYW1lKSB7XG4gICAgICAgICAgICB2YXIgZnVsbFZpZXdOYW1lID0gZGRvY05hbWUgKyAnLycgKyB2aWV3TmFtZTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgaWYgKCFtZXRhRG9jLnZpZXdzW2Z1bGxWaWV3TmFtZV0pIHtcbiAgICAgICAgICAgICAgLy8gbmV3IGZvcm1hdCwgd2l0aG91dCBzbGFzaGVzLCB0byBzdXBwb3J0IFBvdWNoREIgMi4yLjBcbiAgICAgICAgICAgICAgLy8gbWlncmF0aW9uIHRlc3QgaW4gcG91Y2hkYidzIGJyb3dzZXIubWlncmF0aW9uLmpzIHZlcmlmaWVzIHRoaXNcbiAgICAgICAgICAgICAgZnVsbFZpZXdOYW1lID0gdmlld05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmlld0RCTmFtZXMgPSBPYmplY3Qua2V5cyhtZXRhRG9jLnZpZXdzW2Z1bGxWaWV3TmFtZV0pO1xuICAgICAgICAgICAgLy8gZGVzaWduIGRvYyBkZWxldGVkLCBvciB2aWV3IGZ1bmN0aW9uIG5vbmV4aXN0ZW50XG4gICAgICAgICAgICB2YXIgc3RhdHVzSXNHb29kID0gcm93LmRvYyAmJiByb3cuZG9jLnZpZXdzICYmXG4gICAgICAgICAgICAgIHJvdy5kb2Mudmlld3Nbdmlld05hbWVdO1xuICAgICAgICAgICAgdmlld0RCTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAodmlld0RCTmFtZSkge1xuICAgICAgICAgICAgICB2aWV3c1RvU3RhdHVzW3ZpZXdEQk5hbWVdID1cbiAgICAgICAgICAgICAgICB2aWV3c1RvU3RhdHVzW3ZpZXdEQk5hbWVdIHx8IHN0YXR1c0lzR29vZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGRic1RvRGVsZXRlID0gT2JqZWN0LmtleXModmlld3NUb1N0YXR1cykuZmlsdGVyKFxuICAgICAgICAgIGZ1bmN0aW9uICh2aWV3REJOYW1lKSB7IHJldHVybiAhdmlld3NUb1N0YXR1c1t2aWV3REJOYW1lXTsgfSk7XG4gICAgICAgIHZhciBkZXN0cm95UHJvbWlzZXMgPSBkYnNUb0RlbGV0ZS5tYXAoZnVuY3Rpb24gKHZpZXdEQk5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gc2VxdWVudGlhbGl6ZShnZXRRdWV1ZSh2aWV3REJOYW1lKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBkYi5jb25zdHJ1Y3Rvcih2aWV3REJOYW1lLCBkYi5fX29wdHMpLmRlc3Ryb3koKTtcbiAgICAgICAgICB9KSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGRlc3Ryb3lQcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHtvazogdHJ1ZX07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgZGVmYXVsdHNUbyh7b2s6IHRydWV9KSk7XG4gIH1cblxuICBmdW5jdGlvbiBxdWVyeVByb21pc2VkKGRiLCBmdW4sIG9wdHMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZGIuX3F1ZXJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY3VzdG9tUXVlcnkoZGIsIGZ1biwgb3B0cyk7XG4gICAgfVxuICAgIGlmIChpc1JlbW90ZShkYikpIHtcbiAgICAgIHJldHVybiBodHRwUXVlcnkoZGIsIGZ1biwgb3B0cyk7XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZVZpZXdPcHRzID0ge1xuICAgICAgY2hhbmdlc19iYXRjaF9zaXplOiBkYi5fX29wdHMudmlld191cGRhdGVfY2hhbmdlc19iYXRjaF9zaXplIHx8IENIQU5HRVNfQkFUQ0hfU0laRSQxXG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgZnVuICE9PSAnc3RyaW5nJykge1xuICAgICAgLy8gdGVtcF92aWV3XG4gICAgICBjaGVja1F1ZXJ5UGFyc2VFcnJvcihvcHRzLCBmdW4pO1xuXG4gICAgICB0ZW1wVmlld1F1ZXVlLmFkZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjcmVhdGVWaWV3UHJvbWlzZSA9IGNyZWF0ZVZpZXcoXG4gICAgICAgICAgLyogc291cmNlREIgKi8gZGIsXG4gICAgICAgICAgLyogdmlld05hbWUgKi8gJ3RlbXBfdmlldy90ZW1wX3ZpZXcnLFxuICAgICAgICAgIC8qIG1hcEZ1biAqLyBmdW4ubWFwLFxuICAgICAgICAgIC8qIHJlZHVjZUZ1biAqLyBmdW4ucmVkdWNlLFxuICAgICAgICAgIC8qIHRlbXBvcmFyeSAqLyB0cnVlLFxuICAgICAgICAgIC8qIGxvY2FsRG9jTmFtZSAqLyBsb2NhbERvY05hbWUpO1xuICAgICAgICByZXR1cm4gY3JlYXRlVmlld1Byb21pc2UudGhlbihmdW5jdGlvbiAodmlldykge1xuICAgICAgICAgIHJldHVybiBmaW4odXBkYXRlVmlldyh2aWV3LCB1cGRhdGVWaWV3T3B0cykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVlcnlWaWV3KHZpZXcsIG9wdHMpO1xuICAgICAgICAgIH0pLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5kYi5kZXN0cm95KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGVtcFZpZXdRdWV1ZS5maW5pc2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcGVyc2lzdGVudCB2aWV3XG4gICAgICB2YXIgZnVsbFZpZXdOYW1lID0gZnVuO1xuICAgICAgdmFyIHBhcnRzID0gcGFyc2VWaWV3TmFtZShmdWxsVmlld05hbWUpO1xuICAgICAgdmFyIGRlc2lnbkRvY05hbWUgPSBwYXJ0c1swXTtcbiAgICAgIHZhciB2aWV3TmFtZSA9IHBhcnRzWzFdO1xuICAgICAgcmV0dXJuIGRiLmdldCgnX2Rlc2lnbi8nICsgZGVzaWduRG9jTmFtZSkudGhlbihmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgIHZhciBmdW4gPSBkb2Mudmlld3MgJiYgZG9jLnZpZXdzW3ZpZXdOYW1lXTtcblxuICAgICAgICBpZiAoIWZ1bikge1xuICAgICAgICAgIC8vIGJhc2ljIHZhbGlkYXRvcjsgaXQncyBhc3N1bWVkIHRoYXQgZXZlcnkgc3ViY2xhc3Mgd291bGQgd2FudCB0aGlzXG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ2Rkb2MgJyArIGRvYy5faWQgKyAnIGhhcyBubyB2aWV3IG5hbWVkICcgK1xuICAgICAgICAgICAgdmlld05hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGRvY1ZhbGlkYXRvcihkb2MsIHZpZXdOYW1lKTtcbiAgICAgICAgY2hlY2tRdWVyeVBhcnNlRXJyb3Iob3B0cywgZnVuKTtcblxuICAgICAgICB2YXIgY3JlYXRlVmlld1Byb21pc2UgPSBjcmVhdGVWaWV3KFxuICAgICAgICAgIC8qIHNvdXJjZURCICovIGRiLFxuICAgICAgICAgIC8qIHZpZXdOYW1lICovIGZ1bGxWaWV3TmFtZSxcbiAgICAgICAgICAvKiBtYXBGdW4gKi8gZnVuLm1hcCxcbiAgICAgICAgICAvKiByZWR1Y2VGdW4gKi8gZnVuLnJlZHVjZSxcbiAgICAgICAgICAvKiB0ZW1wb3JhcnkgKi8gZmFsc2UsXG4gICAgICAgICAgLyogbG9jYWxEb2NOYW1lICovIGxvY2FsRG9jTmFtZSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVWaWV3UHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgaWYgKG9wdHMuc3RhbGUgPT09ICdvaycgfHwgb3B0cy5zdGFsZSA9PT0gJ3VwZGF0ZV9hZnRlcicpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLnN0YWxlID09PSAndXBkYXRlX2FmdGVyJykge1xuICAgICAgICAgICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVZpZXcodmlldywgdXBkYXRlVmlld09wdHMpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBxdWVyeVZpZXcodmlldywgb3B0cyk7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gc3RhbGUgbm90IG9rXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVmlldyh2aWV3LCB1cGRhdGVWaWV3T3B0cykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBxdWVyeVZpZXcodmlldywgb3B0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWJzdHJhY3RRdWVyeShmdW4sIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRiID0gdGhpcztcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IG9wdHMgPyBjb2VyY2VPcHRpb25zKG9wdHMpIDoge307XG5cbiAgICBpZiAodHlwZW9mIGZ1biA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZnVuID0ge21hcCA6IGZ1bn07XG4gICAgfVxuXG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBxdWVyeVByb21pc2VkKGRiLCBmdW4sIG9wdHMpO1xuICAgIH0pO1xuICAgIHByb21pc2VkQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgdmFyIGFic3RyYWN0Vmlld0NsZWFudXAgPSBjYWxsYmFja2lmeShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRiID0gdGhpcztcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZGIuX3ZpZXdDbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY3VzdG9tVmlld0NsZWFudXAoZGIpO1xuICAgIH1cbiAgICBpZiAoaXNSZW1vdGUoZGIpKSB7XG4gICAgICByZXR1cm4gaHR0cFZpZXdDbGVhbnVwKGRiKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsVmlld0NsZWFudXAoZGIpO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHF1ZXJ5OiBhYnN0cmFjdFF1ZXJ5LFxuICAgIHZpZXdDbGVhbnVwOiBhYnN0cmFjdFZpZXdDbGVhbnVwXG4gIH07XG59XG5cbnZhciBidWlsdEluUmVkdWNlID0ge1xuICBfc3VtOiBmdW5jdGlvbiAoa2V5cywgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHN1bSh2YWx1ZXMpO1xuICB9LFxuXG4gIF9jb3VudDogZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoO1xuICB9LFxuXG4gIF9zdGF0czogZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgIC8vIG5vIG5lZWQgdG8gaW1wbGVtZW50IHJlcmVkdWNlPXRydWUsIGJlY2F1c2UgUG91Y2hcbiAgICAvLyB3aWxsIG5ldmVyIGNhbGwgaXRcbiAgICBmdW5jdGlvbiBzdW1zcXIodmFsdWVzKSB7XG4gICAgICB2YXIgX3N1bXNxciA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBudW0gPSB2YWx1ZXNbaV07XG4gICAgICAgIF9zdW1zcXIgKz0gKG51bSAqIG51bSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3N1bXNxcjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1bSAgICAgOiBzdW0odmFsdWVzKSxcbiAgICAgIG1pbiAgICAgOiBNYXRoLm1pbi5hcHBseShudWxsLCB2YWx1ZXMpLFxuICAgICAgbWF4ICAgICA6IE1hdGgubWF4LmFwcGx5KG51bGwsIHZhbHVlcyksXG4gICAgICBjb3VudCAgIDogdmFsdWVzLmxlbmd0aCxcbiAgICAgIHN1bXNxciA6IHN1bXNxcih2YWx1ZXMpXG4gICAgfTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0QnVpbHRJbihyZWR1Y2VGdW5TdHJpbmcpIHtcbiAgaWYgKC9eX3N1bS8udGVzdChyZWR1Y2VGdW5TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGJ1aWx0SW5SZWR1Y2UuX3N1bTtcbiAgfSBlbHNlIGlmICgvXl9jb3VudC8udGVzdChyZWR1Y2VGdW5TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGJ1aWx0SW5SZWR1Y2UuX2NvdW50O1xuICB9IGVsc2UgaWYgKC9eX3N0YXRzLy50ZXN0KHJlZHVjZUZ1blN0cmluZykpIHtcbiAgICByZXR1cm4gYnVpbHRJblJlZHVjZS5fc3RhdHM7XG4gIH0gZWxzZSBpZiAoL15fLy50ZXN0KHJlZHVjZUZ1blN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVkdWNlRnVuU3RyaW5nICsgJyBpcyBub3QgYSBzdXBwb3J0ZWQgcmVkdWNlIGZ1bmN0aW9uLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcHBlcihtYXBGdW4sIGVtaXQpIHtcbiAgLy8gZm9yIHRlbXBfdmlld3Mgb25lIGNhbiB1c2UgZW1pdChkb2MsIGVtaXQpLCBzZWUgIzM4XG4gIGlmICh0eXBlb2YgbWFwRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgbWFwRnVuLmxlbmd0aCA9PT0gMikge1xuICAgIHZhciBvcmlnTWFwID0gbWFwRnVuO1xuICAgIHJldHVybiBmdW5jdGlvbiAoZG9jKSB7XG4gICAgICByZXR1cm4gb3JpZ01hcChkb2MsIGVtaXQpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV2YWxGdW5jdGlvbldpdGhFdmFsKG1hcEZ1bi50b1N0cmluZygpLCBlbWl0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWR1Y2VyKHJlZHVjZUZ1bikge1xuICB2YXIgcmVkdWNlRnVuU3RyaW5nID0gcmVkdWNlRnVuLnRvU3RyaW5nKCk7XG4gIHZhciBidWlsdEluID0gZ2V0QnVpbHRJbihyZWR1Y2VGdW5TdHJpbmcpO1xuICBpZiAoYnVpbHRJbikge1xuICAgIHJldHVybiBidWlsdEluO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBldmFsRnVuY3Rpb25XaXRoRXZhbChyZWR1Y2VGdW5TdHJpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRkb2NWYWxpZGF0b3IoZGRvYywgdmlld05hbWUpIHtcbiAgdmFyIGZ1biA9IGRkb2Mudmlld3MgJiYgZGRvYy52aWV3c1t2aWV3TmFtZV07XG4gIGlmICh0eXBlb2YgZnVuLm1hcCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignZGRvYyAnICsgZGRvYy5faWQgKyAnIGhhcyBubyBzdHJpbmcgdmlldyBuYW1lZCAnICtcbiAgICAgIHZpZXdOYW1lICsgJywgaW5zdGVhZCBmb3VuZCBvYmplY3Qgb2YgdHlwZTogJyArIHR5cGVvZiBmdW4ubWFwKTtcbiAgfVxufVxuXG52YXIgbG9jYWxEb2NOYW1lID0gJ21ydmlld3MnO1xudmFyIGFic3RyYWN0ID0gY3JlYXRlQWJzdHJhY3RNYXBSZWR1Y2UobG9jYWxEb2NOYW1lLCBtYXBwZXIsIHJlZHVjZXIsIGRkb2NWYWxpZGF0b3IpO1xuXG5mdW5jdGlvbiBxdWVyeShmdW4sIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBhYnN0cmFjdC5xdWVyeS5jYWxsKHRoaXMsIGZ1biwgb3B0cywgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiB2aWV3Q2xlYW51cChjYWxsYmFjaykge1xuICByZXR1cm4gYWJzdHJhY3Qudmlld0NsZWFudXAuY2FsbCh0aGlzLCBjYWxsYmFjayk7XG59XG5cbnZhciBtYXByZWR1Y2UgPSB7XG4gIHF1ZXJ5OiBxdWVyeSxcbiAgdmlld0NsZWFudXA6IHZpZXdDbGVhbnVwXG59O1xuXG5mdW5jdGlvbiBpc0dlbk9uZSQxKHJldikge1xuICByZXR1cm4gL14xLS8udGVzdChyZXYpO1xufVxuXG5mdW5jdGlvbiBmaWxlSGFzQ2hhbmdlZChsb2NhbERvYywgcmVtb3RlRG9jLCBmaWxlbmFtZSkge1xuICByZXR1cm4gIWxvY2FsRG9jLl9hdHRhY2htZW50cyB8fFxuICAgICAgICAgIWxvY2FsRG9jLl9hdHRhY2htZW50c1tmaWxlbmFtZV0gfHxcbiAgICAgICAgIGxvY2FsRG9jLl9hdHRhY2htZW50c1tmaWxlbmFtZV0uZGlnZXN0ICE9PSByZW1vdGVEb2MuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lXS5kaWdlc3Q7XG59XG5cbmZ1bmN0aW9uIGdldERvY0F0dGFjaG1lbnRzKGRiLCBkb2MpIHtcbiAgdmFyIGZpbGVuYW1lcyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpO1xuICByZXR1cm4gUHJvbWlzZS5hbGwoZmlsZW5hbWVzLm1hcChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICByZXR1cm4gZGIuZ2V0QXR0YWNobWVudChkb2MuX2lkLCBmaWxlbmFtZSwge3JldjogZG9jLl9yZXZ9KTtcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBnZXREb2NBdHRhY2htZW50c0Zyb21UYXJnZXRPclNvdXJjZSh0YXJnZXQsIHNyYywgZG9jKSB7XG4gIHZhciBkb0NoZWNrRm9yTG9jYWxBdHRhY2htZW50cyA9IGlzUmVtb3RlKHNyYykgJiYgIWlzUmVtb3RlKHRhcmdldCk7XG4gIHZhciBmaWxlbmFtZXMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKTtcblxuICBpZiAoIWRvQ2hlY2tGb3JMb2NhbEF0dGFjaG1lbnRzKSB7XG4gICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzKHNyYywgZG9jKTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQuZ2V0KGRvYy5faWQpLnRoZW4oZnVuY3Rpb24gKGxvY2FsRG9jKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGZpbGVuYW1lcy5tYXAoZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICBpZiAoZmlsZUhhc0NoYW5nZWQobG9jYWxEb2MsIGRvYywgZmlsZW5hbWUpKSB7XG4gICAgICAgIHJldHVybiBzcmMuZ2V0QXR0YWNobWVudChkb2MuX2lkLCBmaWxlbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXQuZ2V0QXR0YWNobWVudChsb2NhbERvYy5faWQsIGZpbGVuYW1lKTtcbiAgICB9KSk7XG4gIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlcnJvci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzKHNyYywgZG9jKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1bGtHZXRPcHRzKGRpZmZzKSB7XG4gIHZhciByZXF1ZXN0cyA9IFtdO1xuICBPYmplY3Qua2V5cyhkaWZmcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbWlzc2luZ1JldnMgPSBkaWZmc1tpZF0ubWlzc2luZztcbiAgICBtaXNzaW5nUmV2cy5mb3JFYWNoKGZ1bmN0aW9uIChtaXNzaW5nUmV2KSB7XG4gICAgICByZXF1ZXN0cy5wdXNoKHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICByZXY6IG1pc3NpbmdSZXZcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGRvY3M6IHJlcXVlc3RzLFxuICAgIHJldnM6IHRydWUsXG4gICAgbGF0ZXN0OiB0cnVlXG4gIH07XG59XG5cbi8vXG4vLyBGZXRjaCBhbGwgdGhlIGRvY3VtZW50cyBmcm9tIHRoZSBzcmMgYXMgZGVzY3JpYmVkIGluIHRoZSBcImRpZmZzXCIsXG4vLyB3aGljaCBpcyBhIG1hcHBpbmcgb2YgZG9jcyBJRHMgdG8gcmV2aXNpb25zLiBJZiB0aGUgc3RhdGUgZXZlclxuLy8gY2hhbmdlcyB0byBcImNhbmNlbGxlZFwiLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQuXG4vLyBFbHNlIGl0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCBhIGxpc3Qgb2YgZmV0Y2hlZCBkb2N1bWVudHMuXG4vL1xuZnVuY3Rpb24gZ2V0RG9jcyhzcmMsIHRhcmdldCwgZGlmZnMsIHN0YXRlKSB7XG4gIGRpZmZzID0gY2xvbmUoZGlmZnMpOyAvLyB3ZSBkbyBub3QgbmVlZCB0byBtb2RpZnkgdGhpc1xuXG4gIHZhciByZXN1bHREb2NzID0gW10sXG4gICAgICBvayA9IHRydWU7XG5cbiAgZnVuY3Rpb24gZ2V0QWxsRG9jcygpIHtcblxuICAgIHZhciBidWxrR2V0T3B0cyA9IGNyZWF0ZUJ1bGtHZXRPcHRzKGRpZmZzKTtcblxuICAgIGlmICghYnVsa0dldE9wdHMuZG9jcy5sZW5ndGgpIHsgLy8gb3B0aW1pemF0aW9uOiBza2lwIGVtcHR5IHJlcXVlc3RzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNyYy5idWxrR2V0KGJ1bGtHZXRPcHRzKS50aGVuKGZ1bmN0aW9uIChidWxrR2V0UmVzcG9uc2UpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHN0YXRlLmNhbmNlbGxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGJ1bGtHZXRSZXNwb25zZS5yZXN1bHRzLm1hcChmdW5jdGlvbiAoYnVsa0dldEluZm8pIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGJ1bGtHZXRJbmZvLmRvY3MubWFwKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgICB2YXIgcmVtb3RlRG9jID0gZG9jLm9rO1xuXG4gICAgICAgICAgaWYgKGRvYy5lcnJvcikge1xuICAgICAgICAgICAgLy8gd2hlbiBBVVRPX0NPTVBBQ1RJT04gaXMgc2V0LCBkb2NzIGNhbiBiZSByZXR1cm5lZCB3aGljaCBsb29rXG4gICAgICAgICAgICAvLyBsaWtlIHRoaXM6IHtcIm1pc3NpbmdcIjpcIjEtN2MzYWMyNTZiNjkzYzQ2MmFmODQ0MmY5OTJiODM2OTZcIn1cbiAgICAgICAgICAgIG9rID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFyZW1vdGVEb2MgfHwgIXJlbW90ZURvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiByZW1vdGVEb2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzRnJvbVRhcmdldE9yU291cmNlKHRhcmdldCwgc3JjLCByZW1vdGVEb2MpXG4gICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWVzID0gT2JqZWN0LmtleXMocmVtb3RlRG9jLl9hdHRhY2htZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoYXR0YWNobWVudCwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHQgPSByZW1vdGVEb2MuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lc1tpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGF0dC5zdHViO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dC5kYXRhID0gYXR0YWNobWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbW90ZURvYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9KSlcblxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgcmVzdWx0RG9jcyA9IHJlc3VsdERvY3MuY29uY2F0KGZsYXR0ZW4ocmVzdWx0cykuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzQXR0YWNobWVudHMoZG9jKSB7XG4gICAgcmV0dXJuIGRvYy5fYXR0YWNobWVudHMgJiYgT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0NvbmZsaWN0cyhkb2MpIHtcbiAgICByZXR1cm4gZG9jLl9jb25mbGljdHMgJiYgZG9jLl9jb25mbGljdHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoUmV2aXNpb25PbmVEb2NzKGlkcykge1xuICAgIC8vIE9wdGltaXphdGlvbjogZmV0Y2ggZ2VuLTEgZG9jcyBhbmQgYXR0YWNobWVudHMgaW5cbiAgICAvLyBhIHNpbmdsZSByZXF1ZXN0IHVzaW5nIF9hbGxfZG9jc1xuICAgIHJldHVybiBzcmMuYWxsRG9jcyh7XG4gICAgICBrZXlzOiBpZHMsXG4gICAgICBpbmNsdWRlX2RvY3M6IHRydWUsXG4gICAgICBjb25mbGljdHM6IHRydWVcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChzdGF0ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cbiAgICAgIHJlcy5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICBpZiAocm93LmRlbGV0ZWQgfHwgIXJvdy5kb2MgfHwgIWlzR2VuT25lJDEocm93LnZhbHVlLnJldikgfHxcbiAgICAgICAgICAgIGhhc0F0dGFjaG1lbnRzKHJvdy5kb2MpIHx8IGhhc0NvbmZsaWN0cyhyb3cuZG9jKSkge1xuICAgICAgICAgIC8vIGlmIGFueSBvZiB0aGVzZSBjb25kaXRpb25zIGFwcGx5LCB3ZSBuZWVkIHRvIGZldGNoIHVzaW5nIGdldCgpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RyaXAgX2NvbmZsaWN0cyBhcnJheSB0byBhcHBlYXNlIENTRyAoIzU3OTMpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocm93LmRvYy5fY29uZmxpY3RzKSB7XG4gICAgICAgICAgZGVsZXRlIHJvdy5kb2MuX2NvbmZsaWN0cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZSBkb2Mgd2UgZ290IGJhY2sgZnJvbSBhbGxEb2NzKCkgaXMgc3VmZmljaWVudFxuICAgICAgICByZXN1bHREb2NzLnB1c2gocm93LmRvYyk7XG4gICAgICAgIGRlbGV0ZSBkaWZmc1tyb3cuaWRdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZXZpc2lvbk9uZURvY3MoKSB7XG4gICAgLy8gZmlsdGVyIG91dCB0aGUgZ2VuZXJhdGlvbiAxIGRvY3MgYW5kIGdldCB0aGVtXG4gICAgLy8gbGVhdmluZyB0aGUgbm9uLWdlbmVyYXRpb24gb25lIGRvY3MgdG8gYmUgZ290IG90aGVyd2lzZVxuICAgIHZhciBpZHMgPSBPYmplY3Qua2V5cyhkaWZmcykuZmlsdGVyKGZ1bmN0aW9uIChpZCkge1xuICAgICAgdmFyIG1pc3NpbmcgPSBkaWZmc1tpZF0ubWlzc2luZztcbiAgICAgIHJldHVybiBtaXNzaW5nLmxlbmd0aCA9PT0gMSAmJiBpc0dlbk9uZSQxKG1pc3NpbmdbMF0pO1xuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZldGNoUmV2aXNpb25PbmVEb2NzKGlkcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmV0dXJuUmVzdWx0KCkge1xuICAgIHJldHVybiB7IG9rOm9rLCBkb2NzOnJlc3VsdERvY3MgfTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKGdldFJldmlzaW9uT25lRG9jcylcbiAgICAudGhlbihnZXRBbGxEb2NzKVxuICAgIC50aGVuKHJldHVyblJlc3VsdCk7XG59XG5cbnZhciBDSEVDS1BPSU5UX1ZFUlNJT04gPSAxO1xudmFyIFJFUExJQ0FUT1IgPSBcInBvdWNoZGJcIjtcbi8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IG51bWJlciB0byBsaW1pdCB0aGVcbi8vIGFtb3VudCBvZiByZXBsaWNhdGlvbiBoaXN0b3J5IHdlIHNhdmUgaW4gdGhlIGNoZWNrcG9pbnQuXG4vLyBJZiB3ZSBzYXZlIHRvbyBtdWNoLCB0aGUgY2hlY2twb2luZyBkb2NzIHdpbGwgYmVjb21lIHZlcnkgYmlnLFxuLy8gaWYgd2Ugc2F2ZSBmZXdlciwgd2UnbGwgcnVuIGEgZ3JlYXRlciByaXNrIG9mIGhhdmluZyB0b1xuLy8gcmVhZCBhbGwgdGhlIGNoYW5nZXMgZnJvbSAwIHdoZW4gY2hlY2twb2ludCBQVVRzIGZhaWxcbi8vIENvdWNoREIgMi4wIGhhcyBhIG1vcmUgaW52b2x2ZWQgaGlzdG9yeSBwcnVuaW5nLFxuLy8gYnV0IGxldCdzIGdvIGZvciB0aGUgc2ltcGxlIHZlcnNpb24gZm9yIG5vdy5cbnZhciBDSEVDS1BPSU5UX0hJU1RPUllfU0laRSA9IDU7XG52YXIgTE9XRVNUX1NFUSA9IDA7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrcG9pbnQoZGIsIGlkLCBjaGVja3BvaW50LCBzZXNzaW9uLCByZXR1cm5WYWx1ZSkge1xuICByZXR1cm4gZGIuZ2V0KGlkKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgaWYgKGRiLmFkYXB0ZXIgPT09ICdodHRwJyB8fCBkYi5hZGFwdGVyID09PSAnaHR0cHMnKSB7XG4gICAgICAgIGV4cGxhaW5FcnJvcihcbiAgICAgICAgICA0MDQsICdQb3VjaERCIGlzIGp1c3QgY2hlY2tpbmcgaWYgYSByZW1vdGUgY2hlY2twb2ludCBleGlzdHMuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbixcbiAgICAgICAgX2lkOiBpZCxcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICAgIHJlcGxpY2F0b3I6IFJFUExJQ0FUT1IsXG4gICAgICAgIHZlcnNpb246IENIRUNLUE9JTlRfVkVSU0lPTlxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9KS50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGNoZWNrcG9pbnQgaGFzIG5vdCBjaGFuZ2VkLCBkbyBub3QgdXBkYXRlXG4gICAgaWYgKGRvYy5sYXN0X3NlcSA9PT0gY2hlY2twb2ludCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbHRlciBvdXQgY3VycmVudCBlbnRyeSBmb3IgdGhpcyByZXBsaWNhdGlvblxuICAgIGRvYy5oaXN0b3J5ID0gKGRvYy5oaXN0b3J5IHx8IFtdKS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLnNlc3Npb25faWQgIT09IHNlc3Npb247XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdGhlIGxhdGVzdCBjaGVja3BvaW50IHRvIGhpc3RvcnlcbiAgICBkb2MuaGlzdG9yeS51bnNoaWZ0KHtcbiAgICAgIGxhc3Rfc2VxOiBjaGVja3BvaW50LFxuICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvblxuICAgIH0pO1xuXG4gICAgLy8gSnVzdCB0YWtlIHRoZSBsYXN0IHBpZWNlcyBpbiBoaXN0b3J5LCB0b1xuICAgIC8vIGF2b2lkIHJlYWxseSBiaWcgY2hlY2twb2ludCBkb2NzLlxuICAgIC8vIHNlZSBjb21tZW50IG9uIGhpc3Rvcnkgc2l6ZSBhYm92ZVxuICAgIGRvYy5oaXN0b3J5ID0gZG9jLmhpc3Rvcnkuc2xpY2UoMCwgQ0hFQ0tQT0lOVF9ISVNUT1JZX1NJWkUpO1xuXG4gICAgZG9jLnZlcnNpb24gPSBDSEVDS1BPSU5UX1ZFUlNJT047XG4gICAgZG9jLnJlcGxpY2F0b3IgPSBSRVBMSUNBVE9SO1xuXG4gICAgZG9jLnNlc3Npb25faWQgPSBzZXNzaW9uO1xuICAgIGRvYy5sYXN0X3NlcSA9IGNoZWNrcG9pbnQ7XG5cbiAgICByZXR1cm4gZGIucHV0KGRvYykuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAvLyByZXRyeTsgc29tZW9uZSBpcyB0cnlpbmcgdG8gd3JpdGUgYSBjaGVja3BvaW50IHNpbXVsdGFuZW91c2x5XG4gICAgICAgIHJldHVybiB1cGRhdGVDaGVja3BvaW50KGRiLCBpZCwgY2hlY2twb2ludCwgc2Vzc2lvbiwgcmV0dXJuVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gQ2hlY2twb2ludGVyKHNyYywgdGFyZ2V0LCBpZCwgcmV0dXJuVmFsdWUsIG9wdHMpIHtcbiAgdGhpcy5zcmMgPSBzcmM7XG4gIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICB0aGlzLmlkID0gaWQ7XG4gIHRoaXMucmV0dXJuVmFsdWUgPSByZXR1cm5WYWx1ZTtcbiAgdGhpcy5vcHRzID0gb3B0cyB8fCB7fTtcbn1cblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS53cml0ZUNoZWNrcG9pbnQgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJldHVybiB0aGlzLnVwZGF0ZVRhcmdldChjaGVja3BvaW50LCBzZXNzaW9uKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2VsZi51cGRhdGVTb3VyY2UoY2hlY2twb2ludCwgc2Vzc2lvbik7XG4gIH0pO1xufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS51cGRhdGVUYXJnZXQgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICBpZiAodGhpcy5vcHRzLndyaXRlVGFyZ2V0Q2hlY2twb2ludCkge1xuICAgIHJldHVybiB1cGRhdGVDaGVja3BvaW50KHRoaXMudGFyZ2V0LCB0aGlzLmlkLCBjaGVja3BvaW50LFxuICAgICAgc2Vzc2lvbiwgdGhpcy5yZXR1cm5WYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS51cGRhdGVTb3VyY2UgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICBpZiAodGhpcy5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gdXBkYXRlQ2hlY2twb2ludCh0aGlzLnNyYywgdGhpcy5pZCwgY2hlY2twb2ludCxcbiAgICAgIHNlc3Npb24sIHRoaXMucmV0dXJuVmFsdWUpXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoaXNGb3JiaWRkZW5FcnJvcihlcnIpKSB7XG4gICAgICAgICAgc2VsZi5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn07XG5cbnZhciBjb21wYXJpc29ucyA9IHtcbiAgXCJ1bmRlZmluZWRcIjogZnVuY3Rpb24gKHRhcmdldERvYywgc291cmNlRG9jKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcHJldmlvdXMgY29tcGFyaXNvbiBmdW5jdGlvblxuICAgIGlmIChjb2xsYXRlKHRhcmdldERvYy5sYXN0X3NlcSwgc291cmNlRG9jLmxhc3Rfc2VxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNvdXJjZURvYy5sYXN0X3NlcTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgXCIxXCI6IGZ1bmN0aW9uICh0YXJnZXREb2MsIHNvdXJjZURvYykge1xuICAgIC8vIFRoaXMgaXMgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gcG9ydGVkIGZyb20gQ291Y2hEQlxuICAgIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25Mb2dzKHNvdXJjZURvYywgdGFyZ2V0RG9jKS5sYXN0X3NlcTtcbiAgfVxufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS5nZXRDaGVja3BvaW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKHNlbGYub3B0cyAmJiBzZWxmLm9wdHMud3JpdGVTb3VyY2VDaGVja3BvaW50ICYmICFzZWxmLm9wdHMud3JpdGVUYXJnZXRDaGVja3BvaW50KSB7XG4gICAgcmV0dXJuIHNlbGYuc3JjLmdldChzZWxmLmlkKS50aGVuKGZ1bmN0aW9uIChzb3VyY2VEb2MpIHtcbiAgICAgIHJldHVybiBzb3VyY2VEb2MubGFzdF9zZXEgfHwgTE9XRVNUX1NFUTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc2VsZi50YXJnZXQuZ2V0KHNlbGYuaWQpLnRoZW4oZnVuY3Rpb24gKHRhcmdldERvYykge1xuICAgIGlmIChzZWxmLm9wdHMgJiYgc2VsZi5vcHRzLndyaXRlVGFyZ2V0Q2hlY2twb2ludCAmJiAhc2VsZi5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCkge1xuICAgICAgcmV0dXJuIHRhcmdldERvYy5sYXN0X3NlcSB8fCBMT1dFU1RfU0VRO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLnNyYy5nZXQoc2VsZi5pZCkudGhlbihmdW5jdGlvbiAoc291cmNlRG9jKSB7XG4gICAgICAvLyBTaW5jZSB3ZSBjYW4ndCBtaWdyYXRlIGFuIG9sZCB2ZXJzaW9uIGRvYyB0byBhIG5ldyBvbmVcbiAgICAgIC8vIChubyBzZXNzaW9uIGlkKSwgd2UganVzdCBnbyB3aXRoIHRoZSBsb3dlc3Qgc2VxIGluIHRoaXMgY2FzZVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAodGFyZ2V0RG9jLnZlcnNpb24gIT09IHNvdXJjZURvYy52ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmVyc2lvbjtcbiAgICAgIGlmICh0YXJnZXREb2MudmVyc2lvbikge1xuICAgICAgICB2ZXJzaW9uID0gdGFyZ2V0RG9jLnZlcnNpb24udG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb24gPSBcInVuZGVmaW5lZFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAodmVyc2lvbiBpbiBjb21wYXJpc29ucykge1xuICAgICAgICByZXR1cm4gY29tcGFyaXNvbnNbdmVyc2lvbl0odGFyZ2V0RG9jLCBzb3VyY2VEb2MpO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDQgJiYgdGFyZ2V0RG9jLmxhc3Rfc2VxKSB7XG4gICAgICAgIHJldHVybiBzZWxmLnNyYy5wdXQoe1xuICAgICAgICAgIF9pZDogc2VsZi5pZCxcbiAgICAgICAgICBsYXN0X3NlcTogTE9XRVNUX1NFUVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGlmIChpc0ZvcmJpZGRlbkVycm9yKGVycikpIHtcbiAgICAgICAgICAgIHNlbGYub3B0cy53cml0ZVNvdXJjZUNoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXREb2MubGFzdF9zZXE7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgfSk7XG59O1xuLy8gVGhpcyBjaGVja3BvaW50IGNvbXBhcmlzb24gaXMgcG9ydGVkIGZyb20gQ291Y2hEQnMgc291cmNlXG4vLyB0aGV5IGNvbWUgZnJvbSBoZXJlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jb3VjaGRiLWNvdWNoLXJlcGxpY2F0b3IvYmxvYi9tYXN0ZXIvc3JjL2NvdWNoX3JlcGxpY2F0b3IuZXJsI0w4NjMtTDkwNlxuXG5mdW5jdGlvbiBjb21wYXJlUmVwbGljYXRpb25Mb2dzKHNyY0RvYywgdGd0RG9jKSB7XG4gIGlmIChzcmNEb2Muc2Vzc2lvbl9pZCA9PT0gdGd0RG9jLnNlc3Npb25faWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IHNyY0RvYy5sYXN0X3NlcSxcbiAgICAgIGhpc3Rvcnk6IHNyY0RvYy5oaXN0b3J5XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25IaXN0b3J5KHNyY0RvYy5oaXN0b3J5LCB0Z3REb2MuaGlzdG9yeSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVSZXBsaWNhdGlvbkhpc3Rvcnkoc291cmNlSGlzdG9yeSwgdGFyZ2V0SGlzdG9yeSkge1xuICAvLyB0aGUgZXJsYW5nIGxvb3AgdmlhIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBub3Qgc28gZWFzeSB0byByZXBlYXQgaW4gSlNcbiAgLy8gdGhlcmVmb3JlLCBkb2luZyB0aGlzIGFzIHJlY3Vyc2lvblxuICB2YXIgUyA9IHNvdXJjZUhpc3RvcnlbMF07XG4gIHZhciBzb3VyY2VSZXN0ID0gc291cmNlSGlzdG9yeS5zbGljZSgxKTtcbiAgdmFyIFQgPSB0YXJnZXRIaXN0b3J5WzBdO1xuICB2YXIgdGFyZ2V0UmVzdCA9IHRhcmdldEhpc3Rvcnkuc2xpY2UoMSk7XG5cbiAgaWYgKCFTIHx8IHRhcmdldEhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhc3Rfc2VxOiBMT1dFU1RfU0VRLFxuICAgICAgaGlzdG9yeTogW11cbiAgICB9O1xuICB9XG5cbiAgdmFyIHNvdXJjZUlkID0gUy5zZXNzaW9uX2lkO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGhhc1Nlc3Npb25JZChzb3VyY2VJZCwgdGFyZ2V0SGlzdG9yeSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IFMubGFzdF9zZXEsXG4gICAgICBoaXN0b3J5OiBzb3VyY2VIaXN0b3J5XG4gICAgfTtcbiAgfVxuXG4gIHZhciB0YXJnZXRJZCA9IFQuc2Vzc2lvbl9pZDtcbiAgaWYgKGhhc1Nlc3Npb25JZCh0YXJnZXRJZCwgc291cmNlUmVzdCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IFQubGFzdF9zZXEsXG4gICAgICBoaXN0b3J5OiB0YXJnZXRSZXN0XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25IaXN0b3J5KHNvdXJjZVJlc3QsIHRhcmdldFJlc3QpO1xufVxuXG5mdW5jdGlvbiBoYXNTZXNzaW9uSWQoc2Vzc2lvbklkLCBoaXN0b3J5KSB7XG4gIHZhciBwcm9wcyA9IGhpc3RvcnlbMF07XG4gIHZhciByZXN0ID0gaGlzdG9yeS5zbGljZSgxKTtcblxuICBpZiAoIXNlc3Npb25JZCB8fCBoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzZXNzaW9uSWQgPT09IHByb3BzLnNlc3Npb25faWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBoYXNTZXNzaW9uSWQoc2Vzc2lvbklkLCByZXN0KTtcbn1cblxuZnVuY3Rpb24gaXNGb3JiaWRkZW5FcnJvcihlcnIpIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnIuc3RhdHVzID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGVyci5zdGF0dXMgLyAxMDApID09PSA0O1xufVxuXG52YXIgU1RBUlRJTkdfQkFDS19PRkYgPSAwO1xuXG5mdW5jdGlvbiBiYWNrT2ZmKG9wdHMsIHJldHVyblZhbHVlLCBlcnJvciwgY2FsbGJhY2spIHtcbiAgaWYgKG9wdHMucmV0cnkgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuVmFsdWUuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgcmV0dXJuVmFsdWUucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIG9wdHMuYmFja19vZmZfZnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRzLmJhY2tfb2ZmX2Z1bmN0aW9uID0gZGVmYXVsdEJhY2tPZmY7XG4gIH1cbiAgcmV0dXJuVmFsdWUuZW1pdCgncmVxdWVzdEVycm9yJywgZXJyb3IpO1xuICBpZiAocmV0dXJuVmFsdWUuc3RhdGUgPT09ICdhY3RpdmUnIHx8IHJldHVyblZhbHVlLnN0YXRlID09PSAncGVuZGluZycpIHtcbiAgICByZXR1cm5WYWx1ZS5lbWl0KCdwYXVzZWQnLCBlcnJvcik7XG4gICAgcmV0dXJuVmFsdWUuc3RhdGUgPSAnc3RvcHBlZCc7XG4gICAgdmFyIGJhY2tPZmZTZXQgPSBmdW5jdGlvbiBiYWNrb2ZmVGltZVNldCgpIHtcbiAgICAgIG9wdHMuY3VycmVudF9iYWNrX29mZiA9IFNUQVJUSU5HX0JBQ0tfT0ZGO1xuICAgIH07XG4gICAgdmFyIHJlbW92ZUJhY2tPZmZTZXR0ZXIgPSBmdW5jdGlvbiByZW1vdmVCYWNrT2ZmVGltZVNldCgpIHtcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUxpc3RlbmVyKCdhY3RpdmUnLCBiYWNrT2ZmU2V0KTtcbiAgICB9O1xuICAgIHJldHVyblZhbHVlLm9uY2UoJ3BhdXNlZCcsIHJlbW92ZUJhY2tPZmZTZXR0ZXIpO1xuICAgIHJldHVyblZhbHVlLm9uY2UoJ2FjdGl2ZScsIGJhY2tPZmZTZXQpO1xuICB9XG5cbiAgb3B0cy5jdXJyZW50X2JhY2tfb2ZmID0gb3B0cy5jdXJyZW50X2JhY2tfb2ZmIHx8IFNUQVJUSU5HX0JBQ0tfT0ZGO1xuICBvcHRzLmN1cnJlbnRfYmFja19vZmYgPSBvcHRzLmJhY2tfb2ZmX2Z1bmN0aW9uKG9wdHMuY3VycmVudF9iYWNrX29mZik7XG4gIHNldFRpbWVvdXQoY2FsbGJhY2ssIG9wdHMuY3VycmVudF9iYWNrX29mZik7XG59XG5cbmZ1bmN0aW9uIHNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkocXVlcnlQYXJhbXMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5zb3J0KGNvbGxhdGUpLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBrZXkpIHtcbiAgICByZXN1bHRba2V5XSA9IHF1ZXJ5UGFyYW1zW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwge30pO1xufVxuXG4vLyBHZW5lcmF0ZSBhIHVuaXF1ZSBpZCBwYXJ0aWN1bGFyIHRvIHRoaXMgcmVwbGljYXRpb24uXG4vLyBOb3QgZ3VhcmFudGVlZCB0byBhbGlnbiBwZXJmZWN0bHkgd2l0aCBDb3VjaERCJ3MgcmVwIGlkcy5cbmZ1bmN0aW9uIGdlbmVyYXRlUmVwbGljYXRpb25JZChzcmMsIHRhcmdldCwgb3B0cykge1xuICB2YXIgZG9jSWRzID0gb3B0cy5kb2NfaWRzID8gb3B0cy5kb2NfaWRzLnNvcnQoY29sbGF0ZSkgOiAnJztcbiAgdmFyIGZpbHRlckZ1biA9IG9wdHMuZmlsdGVyID8gb3B0cy5maWx0ZXIudG9TdHJpbmcoKSA6ICcnO1xuICB2YXIgcXVlcnlQYXJhbXMgPSAnJztcbiAgdmFyIGZpbHRlclZpZXdOYW1lID0gICcnO1xuICB2YXIgc2VsZWN0b3IgPSAnJztcblxuICAvLyBwb3NzaWJpbGl0eSBmb3IgY2hlY2twb2ludHMgdG8gYmUgbG9zdCBoZXJlIGFzIGJlaGF2aW91ciBvZlxuICAvLyBKU09OLnN0cmluZ2lmeSBpcyBub3Qgc3RhYmxlIChzZWUgIzYyMjYpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgIHNlbGVjdG9yID0gSlNPTi5zdHJpbmdpZnkob3B0cy5zZWxlY3Rvcik7XG4gIH1cblxuICBpZiAob3B0cy5maWx0ZXIgJiYgb3B0cy5xdWVyeV9wYXJhbXMpIHtcbiAgICBxdWVyeVBhcmFtcyA9IEpTT04uc3RyaW5naWZ5KHNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkob3B0cy5xdWVyeV9wYXJhbXMpKTtcbiAgfVxuXG4gIGlmIChvcHRzLmZpbHRlciAmJiBvcHRzLmZpbHRlciA9PT0gJ192aWV3Jykge1xuICAgIGZpbHRlclZpZXdOYW1lID0gb3B0cy52aWV3LnRvU3RyaW5nKCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoW3NyYy5pZCgpLCB0YXJnZXQuaWQoKV0pLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHZhciBxdWVyeURhdGEgPSByZXNbMF0gKyByZXNbMV0gKyBmaWx0ZXJGdW4gKyBmaWx0ZXJWaWV3TmFtZSArXG4gICAgICBxdWVyeVBhcmFtcyArIGRvY0lkcyArIHNlbGVjdG9yO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgYmluYXJ5TWQ1KHF1ZXJ5RGF0YSwgcmVzb2x2ZSk7XG4gICAgfSk7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKG1kNXN1bSkge1xuICAgIC8vIGNhbid0IHVzZSBzdHJhaWdodC11cCBtZDUgYWxwaGFiZXQsIGJlY2F1c2VcbiAgICAvLyB0aGUgY2hhciAnLycgaXMgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgZm9yIGF0dGFjaG1lbnRzLFxuICAgIC8vIGFuZCArIGlzIGFsc28gbm90IHVybC1zYWZlXG4gICAgbWQ1c3VtID0gbWQ1c3VtLnJlcGxhY2UoL1xcLy9nLCAnLicpLnJlcGxhY2UoL1xcKy9nLCAnXycpO1xuICAgIHJldHVybiAnX2xvY2FsLycgKyBtZDVzdW07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsaWNhdGUoc3JjLCB0YXJnZXQsIG9wdHMsIHJldHVyblZhbHVlLCByZXN1bHQpIHtcbiAgdmFyIGJhdGNoZXMgPSBbXTsgICAgICAgICAgICAgICAvLyBsaXN0IG9mIGJhdGNoZXMgdG8gYmUgcHJvY2Vzc2VkXG4gIHZhciBjdXJyZW50QmF0Y2g7ICAgICAgICAgICAgICAgLy8gdGhlIGJhdGNoIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWRcbiAgdmFyIHBlbmRpbmdCYXRjaCA9IHtcbiAgICBzZXE6IDAsXG4gICAgY2hhbmdlczogW10sXG4gICAgZG9jczogW11cbiAgfTsgLy8gbmV4dCBiYXRjaCwgbm90IHlldCByZWFkeSB0byBiZSBwcm9jZXNzZWRcbiAgdmFyIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7ICAvLyB0cnVlIHdoaWxlIGNoZWNrcG9pbnQgaXMgYmVpbmcgd3JpdHRlblxuICB2YXIgY2hhbmdlc0NvbXBsZXRlZCA9IGZhbHNlOyAgIC8vIHRydWUgd2hlbiBhbGwgY2hhbmdlcyByZWNlaXZlZFxuICB2YXIgcmVwbGljYXRpb25Db21wbGV0ZWQgPSBmYWxzZTsgLy8gdHJ1ZSB3aGVuIHJlcGxpY2F0aW9uIGhhcyBjb21wbGV0ZWRcbiAgdmFyIGxhc3Rfc2VxID0gMDtcbiAgdmFyIGNvbnRpbnVvdXMgPSBvcHRzLmNvbnRpbnVvdXMgfHwgb3B0cy5saXZlIHx8IGZhbHNlO1xuICB2YXIgYmF0Y2hfc2l6ZSA9IG9wdHMuYmF0Y2hfc2l6ZSB8fCAxMDA7XG4gIHZhciBiYXRjaGVzX2xpbWl0ID0gb3B0cy5iYXRjaGVzX2xpbWl0IHx8IDEwO1xuICB2YXIgc3R5bGUgPSBvcHRzLnN0eWxlIHx8ICdhbGxfZG9jcyc7XG4gIHZhciBjaGFuZ2VzUGVuZGluZyA9IGZhbHNlOyAgICAgLy8gdHJ1ZSB3aGlsZSBzcmMuY2hhbmdlcyBpcyBydW5uaW5nXG4gIHZhciBkb2NfaWRzID0gb3B0cy5kb2NfaWRzO1xuICB2YXIgc2VsZWN0b3IgPSBvcHRzLnNlbGVjdG9yO1xuICB2YXIgcmVwSWQ7XG4gIHZhciBjaGVja3BvaW50ZXI7XG4gIHZhciBjaGFuZ2VkRG9jcyA9IFtdO1xuICAvLyBMaWtlIGNvdWNoZGIsIGV2ZXJ5IHJlcGxpY2F0aW9uIGdldHMgYSB1bmlxdWUgc2Vzc2lvbiBpZFxuICB2YXIgc2Vzc2lvbiA9IHV1aWQoKTtcblxuICByZXN1bHQgPSByZXN1bHQgfHwge1xuICAgIG9rOiB0cnVlLFxuICAgIHN0YXJ0X3RpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBkb2NzX3JlYWQ6IDAsXG4gICAgZG9jc193cml0dGVuOiAwLFxuICAgIGRvY193cml0ZV9mYWlsdXJlczogMCxcbiAgICBlcnJvcnM6IFtdXG4gIH07XG5cbiAgdmFyIGNoYW5nZXNPcHRzID0ge307XG4gIHJldHVyblZhbHVlLnJlYWR5KHNyYywgdGFyZ2V0KTtcblxuICBmdW5jdGlvbiBpbml0Q2hlY2twb2ludGVyKCkge1xuICAgIGlmIChjaGVja3BvaW50ZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIGdlbmVyYXRlUmVwbGljYXRpb25JZChzcmMsIHRhcmdldCwgb3B0cykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICByZXBJZCA9IHJlcztcblxuICAgICAgdmFyIGNoZWNrcG9pbnRPcHRzID0ge307XG4gICAgICBpZiAob3B0cy5jaGVja3BvaW50ID09PSBmYWxzZSkge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiBmYWxzZSwgd3JpdGVUYXJnZXRDaGVja3BvaW50OiBmYWxzZSB9O1xuICAgICAgfSBlbHNlIGlmIChvcHRzLmNoZWNrcG9pbnQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIGNoZWNrcG9pbnRPcHRzID0geyB3cml0ZVNvdXJjZUNoZWNrcG9pbnQ6IHRydWUsIHdyaXRlVGFyZ2V0Q2hlY2twb2ludDogZmFsc2UgfTtcbiAgICAgIH0gZWxzZSBpZiAob3B0cy5jaGVja3BvaW50ID09PSAndGFyZ2V0Jykge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiBmYWxzZSwgd3JpdGVUYXJnZXRDaGVja3BvaW50OiB0cnVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiB0cnVlLCB3cml0ZVRhcmdldENoZWNrcG9pbnQ6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgY2hlY2twb2ludGVyID0gbmV3IENoZWNrcG9pbnRlcihzcmMsIHRhcmdldCwgcmVwSWQsIHJldHVyblZhbHVlLCBjaGVja3BvaW50T3B0cyk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZURvY3MoKSB7XG4gICAgY2hhbmdlZERvY3MgPSBbXTtcblxuICAgIGlmIChjdXJyZW50QmF0Y2guZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRvY3MgPSBjdXJyZW50QmF0Y2guZG9jcztcbiAgICB2YXIgYnVsa09wdHMgPSB7dGltZW91dDogb3B0cy50aW1lb3V0fTtcbiAgICByZXR1cm4gdGFyZ2V0LmJ1bGtEb2NzKHtkb2NzOiBkb2NzLCBuZXdfZWRpdHM6IGZhbHNlfSwgYnVsa09wdHMpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gYHJlc2AgZG9lc24ndCBpbmNsdWRlIGZ1bGwgZG9jdW1lbnRzICh3aGljaCBsaXZlIGluIGBkb2NzYCksIHNvIHdlIGNyZWF0ZSBhIG1hcCBvZlxuICAgICAgLy8gKGlkIC0+IGVycm9yKSwgYW5kIGNoZWNrIGZvciBlcnJvcnMgd2hpbGUgaXRlcmF0aW5nIG92ZXIgYGRvY3NgXG4gICAgICB2YXIgZXJyb3JzQnlJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICByZXMuZm9yRWFjaChmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIGlmIChyZXMuZXJyb3IpIHtcbiAgICAgICAgICBlcnJvcnNCeUlkW3Jlcy5pZF0gPSByZXM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgZXJyb3JzTm8gPSBPYmplY3Qua2V5cyhlcnJvcnNCeUlkKS5sZW5ndGg7XG4gICAgICByZXN1bHQuZG9jX3dyaXRlX2ZhaWx1cmVzICs9IGVycm9yc05vO1xuICAgICAgcmVzdWx0LmRvY3Nfd3JpdHRlbiArPSBkb2NzLmxlbmd0aCAtIGVycm9yc05vO1xuXG4gICAgICBkb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvYykge1xuICAgICAgICB2YXIgZXJyb3IgPSBlcnJvcnNCeUlkW2RvYy5faWRdO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgIC8vIE5vcm1hbGl6ZSBlcnJvciBuYW1lLiBpLmUuICdVbmF1dGhvcml6ZWQnIC0+ICd1bmF1dGhvcml6ZWQnIChlZyBTeW5jIEdhdGV3YXkpXG4gICAgICAgICAgdmFyIGVycm9yTmFtZSA9IChlcnJvci5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChlcnJvck5hbWUgPT09ICd1bmF1dGhvcml6ZWQnIHx8IGVycm9yTmFtZSA9PT0gJ2ZvcmJpZGRlbicpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2RlbmllZCcsIGNsb25lKGVycm9yKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VkRG9jcy5wdXNoKGRvYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgcmVzdWx0LmRvY193cml0ZV9mYWlsdXJlcyArPSBkb2NzLmxlbmd0aDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaEJhdGNoKCkge1xuICAgIGlmIChjdXJyZW50QmF0Y2guZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgd2FzIGEgcHJvYmxlbSBnZXR0aW5nIGRvY3MuJyk7XG4gICAgfVxuICAgIHJlc3VsdC5sYXN0X3NlcSA9IGxhc3Rfc2VxID0gY3VycmVudEJhdGNoLnNlcTtcbiAgICB2YXIgb3V0UmVzdWx0ID0gY2xvbmUocmVzdWx0KTtcbiAgICBpZiAoY2hhbmdlZERvY3MubGVuZ3RoKSB7XG4gICAgICBvdXRSZXN1bHQuZG9jcyA9IGNoYW5nZWREb2NzO1xuICAgICAgLy8gQXR0YWNoICdwZW5kaW5nJyBwcm9wZXJ0eSBpZiBzZXJ2ZXIgc3VwcG9ydHMgaXQgKENvdWNoREIgMi4wKylcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHR5cGVvZiBjdXJyZW50QmF0Y2gucGVuZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgb3V0UmVzdWx0LnBlbmRpbmcgPSBjdXJyZW50QmF0Y2gucGVuZGluZztcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRCYXRjaC5wZW5kaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hhbmdlJywgb3V0UmVzdWx0KTtcbiAgICB9XG4gICAgd3JpdGluZ0NoZWNrcG9pbnQgPSB0cnVlO1xuICAgIHJldHVybiBjaGVja3BvaW50ZXIud3JpdGVDaGVja3BvaW50KGN1cnJlbnRCYXRjaC5zZXEsXG4gICAgICAgIHNlc3Npb24pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hlY2twb2ludCcsIHsgJ2NoZWNrcG9pbnQnOiBjdXJyZW50QmF0Y2guc2VxIH0pO1xuICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG4gICAgICB9XG4gICAgICBjdXJyZW50QmF0Y2ggPSB1bmRlZmluZWQ7XG4gICAgICBnZXRDaGFuZ2VzKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgb25DaGVja3BvaW50RXJyb3IoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpZmZzKCkge1xuICAgIHZhciBkaWZmID0ge307XG4gICAgY3VycmVudEJhdGNoLmNoYW5nZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hhbmdlKSB7XG4gICAgICByZXR1cm5WYWx1ZS5lbWl0KCdjaGVja3BvaW50JywgeyAncmV2c19kaWZmJzogY2hhbmdlIH0pO1xuICAgICAgLy8gQ291Y2hiYXNlIFN5bmMgR2F0ZXdheSBlbWl0cyB0aGVzZSwgYnV0IHdlIGNhbiBpZ25vcmUgdGhlbVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlLmlkID09PSBcIl91c2VyL1wiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRpZmZbY2hhbmdlLmlkXSA9IGNoYW5nZS5jaGFuZ2VzLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4geC5yZXY7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0LnJldnNEaWZmKGRpZmYpLnRoZW4oZnVuY3Rpb24gKGRpZmZzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuICAgICAgLy8gY3VycmVudEJhdGNoLmRpZmZzIGVsZW1lbnRzIGFyZSBkZWxldGVkIGFzIHRoZSBkb2N1bWVudHMgYXJlIHdyaXR0ZW5cbiAgICAgIGN1cnJlbnRCYXRjaC5kaWZmcyA9IGRpZmZzO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmF0Y2hEb2NzKCkge1xuICAgIHJldHVybiBnZXREb2NzKHNyYywgdGFyZ2V0LCBjdXJyZW50QmF0Y2guZGlmZnMsIHJldHVyblZhbHVlKS50aGVuKGZ1bmN0aW9uIChnb3QpIHtcbiAgICAgIGN1cnJlbnRCYXRjaC5lcnJvciA9ICFnb3Qub2s7XG4gICAgICBnb3QuZG9jcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRCYXRjaC5kaWZmc1tkb2MuX2lkXTtcbiAgICAgICAgcmVzdWx0LmRvY3NfcmVhZCsrO1xuICAgICAgICBjdXJyZW50QmF0Y2guZG9jcy5wdXNoKGRvYyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0TmV4dEJhdGNoKCkge1xuICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQgfHwgY3VycmVudEJhdGNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChiYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcHJvY2Vzc1BlbmRpbmdCYXRjaCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3VycmVudEJhdGNoID0gYmF0Y2hlcy5zaGlmdCgpO1xuICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoZWNrcG9pbnQnLCB7ICdzdGFydF9uZXh0X2JhdGNoJzogY3VycmVudEJhdGNoLnNlcSB9KTtcbiAgICBnZXREaWZmcygpXG4gICAgICAudGhlbihnZXRCYXRjaERvY3MpXG4gICAgICAudGhlbih3cml0ZURvY3MpXG4gICAgICAudGhlbihmaW5pc2hCYXRjaClcbiAgICAgIC50aGVuKHN0YXJ0TmV4dEJhdGNoKVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgYWJvcnRSZXBsaWNhdGlvbignYmF0Y2ggcHJvY2Vzc2luZyB0ZXJtaW5hdGVkIHdpdGggZXJyb3InLCBlcnIpO1xuICAgICAgfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NQZW5kaW5nQmF0Y2goaW1tZWRpYXRlJCQxKSB7XG4gICAgaWYgKHBlbmRpbmdCYXRjaC5jaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGJhdGNoZXMubGVuZ3RoID09PSAwICYmICFjdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgaWYgKChjb250aW51b3VzICYmIGNoYW5nZXNPcHRzLmxpdmUpIHx8IGNoYW5nZXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICByZXR1cm5WYWx1ZS5zdGF0ZSA9ICdwZW5kaW5nJztcbiAgICAgICAgICByZXR1cm5WYWx1ZS5lbWl0KCdwYXVzZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc0NvbXBsZXRlZCkge1xuICAgICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBpbW1lZGlhdGUkJDEgfHxcbiAgICAgIGNoYW5nZXNDb21wbGV0ZWQgfHxcbiAgICAgIHBlbmRpbmdCYXRjaC5jaGFuZ2VzLmxlbmd0aCA+PSBiYXRjaF9zaXplXG4gICAgKSB7XG4gICAgICBiYXRjaGVzLnB1c2gocGVuZGluZ0JhdGNoKTtcbiAgICAgIHBlbmRpbmdCYXRjaCA9IHtcbiAgICAgICAgc2VxOiAwLFxuICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgZG9jczogW11cbiAgICAgIH07XG4gICAgICBpZiAocmV0dXJuVmFsdWUuc3RhdGUgPT09ICdwZW5kaW5nJyB8fCByZXR1cm5WYWx1ZS5zdGF0ZSA9PT0gJ3N0b3BwZWQnKSB7XG4gICAgICAgIHJldHVyblZhbHVlLnN0YXRlID0gJ2FjdGl2ZSc7XG4gICAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgICAgc3RhcnROZXh0QmF0Y2goKTtcbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGFib3J0UmVwbGljYXRpb24ocmVhc29uLCBlcnIpIHtcbiAgICBpZiAocmVwbGljYXRpb25Db21wbGV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFlcnIubWVzc2FnZSkge1xuICAgICAgZXJyLm1lc3NhZ2UgPSByZWFzb247XG4gICAgfVxuICAgIHJlc3VsdC5vayA9IGZhbHNlO1xuICAgIHJlc3VsdC5zdGF0dXMgPSAnYWJvcnRpbmcnO1xuICAgIGJhdGNoZXMgPSBbXTtcbiAgICBwZW5kaW5nQmF0Y2ggPSB7XG4gICAgICBzZXE6IDAsXG4gICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgIGRvY3M6IFtdXG4gICAgfTtcbiAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKGVycik7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlUmVwbGljYXRpb24oZmF0YWxFcnJvcikge1xuICAgIGlmIChyZXBsaWNhdGlvbkNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXN1bHQuc3RhdHVzID0gJ2NhbmNlbGxlZCc7XG4gICAgICBpZiAod3JpdGluZ0NoZWNrcG9pbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc3RhdHVzID0gcmVzdWx0LnN0YXR1cyB8fCAnY29tcGxldGUnO1xuICAgIHJlc3VsdC5lbmRfdGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICByZXN1bHQubGFzdF9zZXEgPSBsYXN0X3NlcTtcbiAgICByZXBsaWNhdGlvbkNvbXBsZXRlZCA9IHRydWU7XG5cbiAgICBpZiAoZmF0YWxFcnJvcikge1xuICAgICAgLy8gbmVlZCB0byBleHRlbmQgdGhlIGVycm9yIGJlY2F1c2UgRmlyZWZveCBjb25zaWRlcnMgXCIucmVzdWx0XCIgcmVhZC1vbmx5XG4gICAgICBmYXRhbEVycm9yID0gY3JlYXRlRXJyb3IoZmF0YWxFcnJvcik7XG4gICAgICBmYXRhbEVycm9yLnJlc3VsdCA9IHJlc3VsdDtcblxuICAgICAgLy8gTm9ybWFsaXplIGVycm9yIG5hbWUuIGkuZS4gJ1VuYXV0aG9yaXplZCcgLT4gJ3VuYXV0aG9yaXplZCcgKGVnIFN5bmMgR2F0ZXdheSlcbiAgICAgIHZhciBlcnJvck5hbWUgPSAoZmF0YWxFcnJvci5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGVycm9yTmFtZSA9PT0gJ3VuYXV0aG9yaXplZCcgfHwgZXJyb3JOYW1lID09PSAnZm9yYmlkZGVuJykge1xuICAgICAgICByZXR1cm5WYWx1ZS5lbWl0KCdlcnJvcicsIGZhdGFsRXJyb3IpO1xuICAgICAgICByZXR1cm5WYWx1ZS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhY2tPZmYob3B0cywgcmV0dXJuVmFsdWUsIGZhdGFsRXJyb3IsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXBsaWNhdGUoc3JjLCB0YXJnZXQsIG9wdHMsIHJldHVyblZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2NvbXBsZXRlJywgcmVzdWx0KTtcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25DaGFuZ2UoY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG4gICAgLy8gQXR0YWNoICdwZW5kaW5nJyBwcm9wZXJ0eSBpZiBzZXJ2ZXIgc3VwcG9ydHMgaXQgKENvdWNoREIgMi4wKylcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodHlwZW9mIHBlbmRpbmcgPT09ICdudW1iZXInKSB7XG4gICAgICBwZW5kaW5nQmF0Y2gucGVuZGluZyA9IHBlbmRpbmc7XG4gICAgfVxuXG4gICAgdmFyIGZpbHRlciA9IGZpbHRlckNoYW5nZShvcHRzKShjaGFuZ2UpO1xuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBlbmRpbmdCYXRjaC5zZXEgPSBjaGFuZ2Uuc2VxIHx8IGxhc3RTZXE7XG4gICAgcGVuZGluZ0JhdGNoLmNoYW5nZXMucHVzaChjaGFuZ2UpO1xuICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoZWNrcG9pbnQnLCB7ICdwZW5kaW5nX2JhdGNoJzogcGVuZGluZ0JhdGNoLnNlcSB9KTtcbiAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzc1BlbmRpbmdCYXRjaChiYXRjaGVzLmxlbmd0aCA9PT0gMCAmJiBjaGFuZ2VzT3B0cy5saXZlKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25DaGFuZ2VzQ29tcGxldGUoY2hhbmdlcykge1xuICAgIGNoYW5nZXNQZW5kaW5nID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBpZiBubyByZXN1bHRzIHdlcmUgcmV0dXJuZWQgdGhlbiB3ZSdyZSBkb25lLFxuICAgIC8vIGVsc2UgZmV0Y2ggbW9yZVxuICAgIGlmIChjaGFuZ2VzLnJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlc09wdHMuc2luY2UgPSBjaGFuZ2VzLnJlc3VsdHNbY2hhbmdlcy5yZXN1bHRzLmxlbmd0aCAtIDFdLnNlcTtcbiAgICAgIGdldENoYW5nZXMoKTtcbiAgICAgIHByb2Nlc3NQZW5kaW5nQmF0Y2godHJ1ZSk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGludW91cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLmxpdmUgPSB0cnVlO1xuICAgICAgICAgIGdldENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUGVuZGluZ0JhdGNoKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBjaGVja3BvaW50IHNvIHdlIHN0YXJ0IGZyb20gdGhlIHJpZ2h0IHNlcSBuZXh0IHRpbWVcbiAgICAgIGlmICghY3VycmVudEJhdGNoICYmIGNoYW5nZXMucmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSB0cnVlO1xuICAgICAgICBjaGVja3BvaW50ZXIud3JpdGVDaGVja3BvaW50KGNoYW5nZXMubGFzdF9zZXEsXG4gICAgICAgICAgICBzZXNzaW9uKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgICAgIHJlc3VsdC5sYXN0X3NlcSA9IGxhc3Rfc2VxID0gY2hhbmdlcy5sYXN0X3NlcTtcbiAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gob25DaGVja3BvaW50RXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlc0Vycm9yKGVycikge1xuICAgIGNoYW5nZXNQZW5kaW5nID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG4gICAgYWJvcnRSZXBsaWNhdGlvbignY2hhbmdlcyByZWplY3RlZCcsIGVycik7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGdldENoYW5nZXMoKSB7XG4gICAgaWYgKCEoXG4gICAgICAhY2hhbmdlc1BlbmRpbmcgJiZcbiAgICAgICFjaGFuZ2VzQ29tcGxldGVkICYmXG4gICAgICBiYXRjaGVzLmxlbmd0aCA8IGJhdGNoZXNfbGltaXRcbiAgICAgICkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2hhbmdlc1BlbmRpbmcgPSB0cnVlO1xuICAgIGZ1bmN0aW9uIGFib3J0Q2hhbmdlcygpIHtcbiAgICAgIGNoYW5nZXMuY2FuY2VsKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKCkge1xuICAgICAgcmV0dXJuVmFsdWUucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIGFib3J0Q2hhbmdlcyk7XG4gICAgfVxuXG4gICAgaWYgKHJldHVyblZhbHVlLl9jaGFuZ2VzKSB7IC8vIHJlbW92ZSBvbGQgY2hhbmdlcygpIGFuZCBsaXN0ZW5lcnNcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUxpc3RlbmVyKCdjYW5jZWwnLCByZXR1cm5WYWx1ZS5fYWJvcnRDaGFuZ2VzKTtcbiAgICAgIHJldHVyblZhbHVlLl9jaGFuZ2VzLmNhbmNlbCgpO1xuICAgIH1cbiAgICByZXR1cm5WYWx1ZS5vbmNlKCdjYW5jZWwnLCBhYm9ydENoYW5nZXMpO1xuXG4gICAgdmFyIGNoYW5nZXMgPSBzcmMuY2hhbmdlcyhjaGFuZ2VzT3B0cylcbiAgICAgIC5vbignY2hhbmdlJywgb25DaGFuZ2UpO1xuICAgIGNoYW5nZXMudGhlbihyZW1vdmVMaXN0ZW5lciwgcmVtb3ZlTGlzdGVuZXIpO1xuICAgIGNoYW5nZXMudGhlbihvbkNoYW5nZXNDb21wbGV0ZSlcbiAgICAgIC5jYXRjaChvbkNoYW5nZXNFcnJvcik7XG5cbiAgICBpZiAob3B0cy5yZXRyeSkge1xuICAgICAgLy8gc2F2ZSBmb3IgbGF0ZXIgc28gd2UgY2FuIGNhbmNlbCBpZiBuZWNlc3NhcnlcbiAgICAgIHJldHVyblZhbHVlLl9jaGFuZ2VzID0gY2hhbmdlcztcbiAgICAgIHJldHVyblZhbHVlLl9hYm9ydENoYW5nZXMgPSBhYm9ydENoYW5nZXM7XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBzdGFydENoYW5nZXMoKSB7XG4gICAgaW5pdENoZWNrcG9pbnRlcigpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrcG9pbnRlci5nZXRDaGVja3BvaW50KCkudGhlbihmdW5jdGlvbiAoY2hlY2twb2ludCkge1xuICAgICAgICBsYXN0X3NlcSA9IGNoZWNrcG9pbnQ7XG4gICAgICAgIGNoYW5nZXNPcHRzID0ge1xuICAgICAgICAgIHNpbmNlOiBsYXN0X3NlcSxcbiAgICAgICAgICBsaW1pdDogYmF0Y2hfc2l6ZSxcbiAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplLFxuICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICBkb2NfaWRzOiBkb2NfaWRzLFxuICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICByZXR1cm5fZG9jczogdHJ1ZSAvLyByZXF1aXJlZCBzbyB3ZSBrbm93IHdoZW4gd2UncmUgZG9uZVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0cy5maWx0ZXIpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG9wdHMuZmlsdGVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gcmVxdWlyZWQgZm9yIHRoZSBjbGllbnQtc2lkZSBmaWx0ZXIgaW4gb25DaGFuZ2VcbiAgICAgICAgICAgIGNoYW5nZXNPcHRzLmluY2x1ZGVfZG9jcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gZGRvYyBmaWx0ZXJcbiAgICAgICAgICAgIGNoYW5nZXNPcHRzLmZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2hlYXJ0YmVhdCcgaW4gb3B0cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLmhlYXJ0YmVhdCA9IG9wdHMuaGVhcnRiZWF0O1xuICAgICAgICB9XG4gICAgICAgIGlmICgndGltZW91dCcgaW4gb3B0cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMucXVlcnlfcGFyYW1zKSB7XG4gICAgICAgICAgY2hhbmdlc09wdHMucXVlcnlfcGFyYW1zID0gb3B0cy5xdWVyeV9wYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMudmlldykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLnZpZXcgPSBvcHRzLnZpZXc7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgYWJvcnRSZXBsaWNhdGlvbignZ2V0Q2hlY2twb2ludCByZWplY3RlZCB3aXRoICcsIGVycik7XG4gICAgfSk7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmdW5jdGlvbiBvbkNoZWNrcG9pbnRFcnJvcihlcnIpIHtcbiAgICB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgIGFib3J0UmVwbGljYXRpb24oJ3dyaXRlQ2hlY2twb2ludCBjb21wbGV0ZWQgd2l0aCBlcnJvcicsIGVycik7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkgeyAvLyBjYW5jZWxsZWQgaW1tZWRpYXRlbHlcbiAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFyZXR1cm5WYWx1ZS5fYWRkZWRMaXN0ZW5lcnMpIHtcbiAgICByZXR1cm5WYWx1ZS5vbmNlKCdjYW5jZWwnLCBjb21wbGV0ZVJlcGxpY2F0aW9uKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0cy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuVmFsdWUub25jZSgnZXJyb3InLCBvcHRzLmNvbXBsZXRlKTtcbiAgICAgIHJldHVyblZhbHVlLm9uY2UoJ2NvbXBsZXRlJywgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBvcHRzLmNvbXBsZXRlKG51bGwsIHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuVmFsdWUuX2FkZGVkTGlzdGVuZXJzID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cy5zaW5jZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdGFydENoYW5nZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBpbml0Q2hlY2twb2ludGVyKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB3cml0aW5nQ2hlY2twb2ludCA9IHRydWU7XG4gICAgICByZXR1cm4gY2hlY2twb2ludGVyLndyaXRlQ2hlY2twb2ludChvcHRzLnNpbmNlLCBzZXNzaW9uKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0X3NlcSA9IG9wdHMuc2luY2U7XG4gICAgICBzdGFydENoYW5nZXMoKTtcbiAgICB9KS5jYXRjaChvbkNoZWNrcG9pbnRFcnJvcik7XG4gIH1cbn1cblxuLy8gV2UgY3JlYXRlIGEgYmFzaWMgcHJvbWlzZSBzbyB0aGUgY2FsbGVyIGNhbiBjYW5jZWwgdGhlIHJlcGxpY2F0aW9uIHBvc3NpYmx5XG4vLyBiZWZvcmUgd2UgaGF2ZSBhY3R1YWxseSBzdGFydGVkIGxpc3RlbmluZyB0byBjaGFuZ2VzIGV0Y1xuaW5oZXJpdHMoUmVwbGljYXRpb24sIEVFKTtcbmZ1bmN0aW9uIFJlcGxpY2F0aW9uKCkge1xuICBFRS5jYWxsKHRoaXMpO1xuICB0aGlzLmNhbmNlbGxlZCA9IGZhbHNlO1xuICB0aGlzLnN0YXRlID0gJ3BlbmRpbmcnO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgIHNlbGYub25jZSgnY29tcGxldGUnLCBmdWxmaWxsKTtcbiAgICBzZWxmLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG4gIHNlbGYudGhlbiA9IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gIH07XG4gIHNlbGYuY2F0Y2ggPSBmdW5jdGlvbiAocmVqZWN0KSB7XG4gICAgcmV0dXJuIHByb21pc2UuY2F0Y2gocmVqZWN0KTtcbiAgfTtcbiAgLy8gQXMgd2UgYWxsb3cgZXJyb3IgaGFuZGxpbmcgdmlhIFwiZXJyb3JcIiBldmVudCBhcyB3ZWxsLFxuICAvLyBwdXQgYSBzdHViIGluIGhlcmUgc28gdGhhdCByZWplY3RpbmcgbmV2ZXIgdGhyb3dzIFVuaGFuZGxlZEVycm9yLlxuICBzZWxmLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbn1cblxuUmVwbGljYXRpb24ucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICB0aGlzLnN0YXRlID0gJ2NhbmNlbGxlZCc7XG4gIHRoaXMuZW1pdCgnY2FuY2VsJyk7XG59O1xuXG5SZXBsaWNhdGlvbi5wcm90b3R5cGUucmVhZHkgPSBmdW5jdGlvbiAoc3JjLCB0YXJnZXQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi5fcmVhZHlDYWxsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc2VsZi5fcmVhZHlDYWxsZWQgPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIG9uRGVzdHJveSgpIHtcbiAgICBzZWxmLmNhbmNlbCgpO1xuICB9XG4gIHNyYy5vbmNlKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB0YXJnZXQub25jZSgnZGVzdHJveWVkJywgb25EZXN0cm95KTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveSk7XG4gICAgdGFyZ2V0LnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB9XG4gIHNlbGYub25jZSgnY29tcGxldGUnLCBjbGVhbnVwKTtcbiAgc2VsZi5vbmNlKCdlcnJvcicsIGNsZWFudXApO1xufTtcblxuZnVuY3Rpb24gdG9Qb3VjaChkYiwgb3B0cykge1xuICB2YXIgUG91Y2hDb25zdHJ1Y3RvciA9IG9wdHMuUG91Y2hDb25zdHJ1Y3RvcjtcbiAgaWYgKHR5cGVvZiBkYiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFBvdWNoQ29uc3RydWN0b3IoZGIsIG9wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkYjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsaWNhdGVXcmFwcGVyKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRzID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIGlmIChvcHRzLmRvY19pZHMgJiYgIUFycmF5LmlzQXJyYXkob3B0cy5kb2NfaWRzKSkge1xuICAgIHRocm93IGNyZWF0ZUVycm9yKEJBRF9SRVFVRVNULFxuICAgICAgICAgICAgICAgICAgICAgICBcImBkb2NfaWRzYCBmaWx0ZXIgcGFyYW1ldGVyIGlzIG5vdCBhIGxpc3QuXCIpO1xuICB9XG5cbiAgb3B0cy5jb21wbGV0ZSA9IGNhbGxiYWNrO1xuICBvcHRzID0gY2xvbmUob3B0cyk7XG4gIG9wdHMuY29udGludW91cyA9IG9wdHMuY29udGludW91cyB8fCBvcHRzLmxpdmU7XG4gIG9wdHMucmV0cnkgPSAoJ3JldHJ5JyBpbiBvcHRzKSA/IG9wdHMucmV0cnkgOiBmYWxzZTtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgb3B0cy5Qb3VjaENvbnN0cnVjdG9yID0gb3B0cy5Qb3VjaENvbnN0cnVjdG9yIHx8IHRoaXM7XG4gIHZhciByZXBsaWNhdGVSZXQgPSBuZXcgUmVwbGljYXRpb24ob3B0cyk7XG4gIHZhciBzcmNQb3VjaCA9IHRvUG91Y2goc3JjLCBvcHRzKTtcbiAgdmFyIHRhcmdldFBvdWNoID0gdG9Qb3VjaCh0YXJnZXQsIG9wdHMpO1xuICByZXBsaWNhdGUoc3JjUG91Y2gsIHRhcmdldFBvdWNoLCBvcHRzLCByZXBsaWNhdGVSZXQpO1xuICByZXR1cm4gcmVwbGljYXRlUmV0O1xufVxuXG5pbmhlcml0cyhTeW5jLCBFRSk7XG5mdW5jdGlvbiBzeW5jKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRzID0ge307XG4gIH1cbiAgb3B0cyA9IGNsb25lKG9wdHMpO1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICBvcHRzLlBvdWNoQ29uc3RydWN0b3IgPSBvcHRzLlBvdWNoQ29uc3RydWN0b3IgfHwgdGhpcztcbiAgc3JjID0gdG9Qb3VjaChzcmMsIG9wdHMpO1xuICB0YXJnZXQgPSB0b1BvdWNoKHRhcmdldCwgb3B0cyk7XG4gIHJldHVybiBuZXcgU3luYyhzcmMsIHRhcmdldCwgb3B0cywgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBTeW5jKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuY2FuY2VsZWQgPSBmYWxzZTtcblxuICB2YXIgb3B0c1B1c2ggPSBvcHRzLnB1c2ggPyAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIG9wdHMsIG9wdHMucHVzaCkgOiBvcHRzO1xuICB2YXIgb3B0c1B1bGwgPSBvcHRzLnB1bGwgPyAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIG9wdHMsIG9wdHMucHVsbCkgOiBvcHRzO1xuXG4gIHRoaXMucHVzaCA9IHJlcGxpY2F0ZVdyYXBwZXIoc3JjLCB0YXJnZXQsIG9wdHNQdXNoKTtcbiAgdGhpcy5wdWxsID0gcmVwbGljYXRlV3JhcHBlcih0YXJnZXQsIHNyYywgb3B0c1B1bGwpO1xuXG4gIHRoaXMucHVzaFBhdXNlZCA9IHRydWU7XG4gIHRoaXMucHVsbFBhdXNlZCA9IHRydWU7XG5cbiAgZnVuY3Rpb24gcHVsbENoYW5nZShjaGFuZ2UpIHtcbiAgICBzZWxmLmVtaXQoJ2NoYW5nZScsIHtcbiAgICAgIGRpcmVjdGlvbjogJ3B1bGwnLFxuICAgICAgY2hhbmdlOiBjaGFuZ2VcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBwdXNoQ2hhbmdlKGNoYW5nZSkge1xuICAgIHNlbGYuZW1pdCgnY2hhbmdlJywge1xuICAgICAgZGlyZWN0aW9uOiAncHVzaCcsXG4gICAgICBjaGFuZ2U6IGNoYW5nZVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hEZW5pZWQoZG9jKSB7XG4gICAgc2VsZi5lbWl0KCdkZW5pZWQnLCB7XG4gICAgICBkaXJlY3Rpb246ICdwdXNoJyxcbiAgICAgIGRvYzogZG9jXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gcHVsbERlbmllZChkb2MpIHtcbiAgICBzZWxmLmVtaXQoJ2RlbmllZCcsIHtcbiAgICAgIGRpcmVjdGlvbjogJ3B1bGwnLFxuICAgICAgZG9jOiBkb2NcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBwdXNoUGF1c2VkKCkge1xuICAgIHNlbGYucHVzaFBhdXNlZCA9IHRydWU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYucHVsbFBhdXNlZCkge1xuICAgICAgc2VsZi5lbWl0KCdwYXVzZWQnKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHVsbFBhdXNlZCgpIHtcbiAgICBzZWxmLnB1bGxQYXVzZWQgPSB0cnVlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLnB1c2hQYXVzZWQpIHtcbiAgICAgIHNlbGYuZW1pdCgncGF1c2VkJyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHB1c2hBY3RpdmUoKSB7XG4gICAgc2VsZi5wdXNoUGF1c2VkID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYucHVsbFBhdXNlZCkge1xuICAgICAgc2VsZi5lbWl0KCdhY3RpdmUnLCB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3B1c2gnXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHVsbEFjdGl2ZSgpIHtcbiAgICBzZWxmLnB1bGxQYXVzZWQgPSBmYWxzZTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoc2VsZi5wdXNoUGF1c2VkKSB7XG4gICAgICBzZWxmLmVtaXQoJ2FjdGl2ZScsIHtcbiAgICAgICAgZGlyZWN0aW9uOiAncHVsbCdcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZW1vdmVkID0ge307XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQWxsKHR5cGUpIHsgLy8gdHlwZSBpcyAncHVzaCcgb3IgJ3B1bGwnXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCwgZnVuYykge1xuICAgICAgdmFyIGlzQ2hhbmdlID0gZXZlbnQgPT09ICdjaGFuZ2UnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsQ2hhbmdlIHx8IGZ1bmMgPT09IHB1c2hDaGFuZ2UpO1xuICAgICAgdmFyIGlzRGVuaWVkID0gZXZlbnQgPT09ICdkZW5pZWQnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsRGVuaWVkIHx8IGZ1bmMgPT09IHB1c2hEZW5pZWQpO1xuICAgICAgdmFyIGlzUGF1c2VkID0gZXZlbnQgPT09ICdwYXVzZWQnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsUGF1c2VkIHx8IGZ1bmMgPT09IHB1c2hQYXVzZWQpO1xuICAgICAgdmFyIGlzQWN0aXZlID0gZXZlbnQgPT09ICdhY3RpdmUnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsQWN0aXZlIHx8IGZ1bmMgPT09IHB1c2hBY3RpdmUpO1xuXG4gICAgICBpZiAoaXNDaGFuZ2UgfHwgaXNEZW5pZWQgfHwgaXNQYXVzZWQgfHwgaXNBY3RpdmUpIHtcbiAgICAgICAgaWYgKCEoZXZlbnQgaW4gcmVtb3ZlZCkpIHtcbiAgICAgICAgICByZW1vdmVkW2V2ZW50XSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZWRbZXZlbnRdW3R5cGVdID0gdHJ1ZTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlbW92ZWRbZXZlbnRdKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAvLyBib3RoIHB1c2ggYW5kIHB1bGwgaGF2ZSBhc2tlZCB0byBiZSByZW1vdmVkXG4gICAgICAgICAgc2VsZi5yZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRzLmxpdmUpIHtcbiAgICB0aGlzLnB1c2gub24oJ2NvbXBsZXRlJywgc2VsZi5wdWxsLmNhbmNlbC5iaW5kKHNlbGYucHVsbCkpO1xuICAgIHRoaXMucHVsbC5vbignY29tcGxldGUnLCBzZWxmLnB1c2guY2FuY2VsLmJpbmQoc2VsZi5wdXNoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRPbmVMaXN0ZW5lcihlZSwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGVlLmxpc3RlbmVycyhldmVudCkuaW5kZXhPZihsaXN0ZW5lcikgPT0gLTEpIHtcbiAgICAgIGVlLm9uKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5vbignbmV3TGlzdGVuZXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjaGFuZ2UnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdjaGFuZ2UnLCBwdWxsQ2hhbmdlKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2NoYW5nZScsIHB1c2hDaGFuZ2UpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdkZW5pZWQnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdkZW5pZWQnLCBwdWxsRGVuaWVkKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2RlbmllZCcsIHB1c2hEZW5pZWQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdhY3RpdmUnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdhY3RpdmUnLCBwdWxsQWN0aXZlKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2FjdGl2ZScsIHB1c2hBY3RpdmUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdwYXVzZWQnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdwYXVzZWQnLCBwdWxsUGF1c2VkKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ3BhdXNlZCcsIHB1c2hQYXVzZWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5vbigncmVtb3ZlTGlzdGVuZXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjaGFuZ2UnKSB7XG4gICAgICBzZWxmLnB1bGwucmVtb3ZlTGlzdGVuZXIoJ2NoYW5nZScsIHB1bGxDaGFuZ2UpO1xuICAgICAgc2VsZi5wdXNoLnJlbW92ZUxpc3RlbmVyKCdjaGFuZ2UnLCBwdXNoQ2hhbmdlKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnZGVuaWVkJykge1xuICAgICAgc2VsZi5wdWxsLnJlbW92ZUxpc3RlbmVyKCdkZW5pZWQnLCBwdWxsRGVuaWVkKTtcbiAgICAgIHNlbGYucHVzaC5yZW1vdmVMaXN0ZW5lcignZGVuaWVkJywgcHVzaERlbmllZCk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgIHNlbGYucHVsbC5yZW1vdmVMaXN0ZW5lcignYWN0aXZlJywgcHVsbEFjdGl2ZSk7XG4gICAgICBzZWxmLnB1c2gucmVtb3ZlTGlzdGVuZXIoJ2FjdGl2ZScsIHB1c2hBY3RpdmUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdwYXVzZWQnKSB7XG4gICAgICBzZWxmLnB1bGwucmVtb3ZlTGlzdGVuZXIoJ3BhdXNlZCcsIHB1bGxQYXVzZWQpO1xuICAgICAgc2VsZi5wdXNoLnJlbW92ZUxpc3RlbmVyKCdwYXVzZWQnLCBwdXNoUGF1c2VkKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMucHVsbC5vbigncmVtb3ZlTGlzdGVuZXInLCByZW1vdmVBbGwoJ3B1bGwnKSk7XG4gIHRoaXMucHVzaC5vbigncmVtb3ZlTGlzdGVuZXInLCByZW1vdmVBbGwoJ3B1c2gnKSk7XG5cbiAgdmFyIHByb21pc2UgPSBQcm9taXNlLmFsbChbXG4gICAgdGhpcy5wdXNoLFxuICAgIHRoaXMucHVsbFxuICBdKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgdmFyIG91dCA9IHtcbiAgICAgIHB1c2g6IHJlc3BbMF0sXG4gICAgICBwdWxsOiByZXNwWzFdXG4gICAgfTtcbiAgICBzZWxmLmVtaXQoJ2NvbXBsZXRlJywgb3V0KTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIG91dCk7XG4gICAgfVxuICAgIHNlbGYucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIHNlbGYuY2FuY2VsKCk7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAvLyBpZiB0aGVyZSdzIGEgY2FsbGJhY2ssIHRoZW4gdGhlIGNhbGxiYWNrIGNhbiByZWNlaXZlXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnRcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gY2FsbGJhY2ssIHRoZW4gd2UncmUgc2FmZSB0byBlbWl0IGFuIGVycm9yXG4gICAgICAvLyBldmVudCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IGFuIHVuaGFuZGxlZCBlcnJvclxuICAgICAgLy8gZHVlIHRvICdlcnJvcicgYmVpbmcgYSBzcGVjaWFsIGV2ZW50IGluIEV2ZW50RW1pdHRlcnNcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICBzZWxmLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgLy8gbm8gc2Vuc2UgdGhyb3dpbmcgaWYgd2UncmUgYWxyZWFkeSBlbWl0dGluZyBhbiAnZXJyb3InIGV2ZW50XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLnRoZW4gPSBmdW5jdGlvbiAoc3VjY2VzcywgZXJyKSB7XG4gICAgcmV0dXJuIHByb21pc2UudGhlbihzdWNjZXNzLCBlcnIpO1xuICB9O1xuXG4gIHRoaXMuY2F0Y2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgcmV0dXJuIHByb21pc2UuY2F0Y2goZXJyKTtcbiAgfTtcbn1cblxuU3luYy5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY2FuY2VsZWQpIHtcbiAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICB0aGlzLnB1c2guY2FuY2VsKCk7XG4gICAgdGhpcy5wdWxsLmNhbmNlbCgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiByZXBsaWNhdGlvbihQb3VjaERCKSB7XG4gIFBvdWNoREIucmVwbGljYXRlID0gcmVwbGljYXRlV3JhcHBlcjtcbiAgUG91Y2hEQi5zeW5jID0gc3luYztcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUG91Y2hEQi5wcm90b3R5cGUsICdyZXBsaWNhdGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICBpZiAodHlwZW9mIHRoaXMucmVwbGljYXRlTWV0aG9kcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5yZXBsaWNhdGVNZXRob2RzID0ge1xuICAgICAgICAgIGZyb206IGZ1bmN0aW9uIChvdGhlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdG9yLnJlcGxpY2F0ZShvdGhlciwgc2VsZiwgb3B0cywgY2FsbGJhY2spO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86IGZ1bmN0aW9uIChvdGhlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdG9yLnJlcGxpY2F0ZShzZWxmLCBvdGhlciwgb3B0cywgY2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlcGxpY2F0ZU1ldGhvZHM7XG4gICAgfVxuICB9KTtcblxuICBQb3VjaERCLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24gKGRiTmFtZSwgb3B0cywgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5zeW5jKHRoaXMsIGRiTmFtZSwgb3B0cywgY2FsbGJhY2spO1xuICB9O1xufVxuXG5Qb3VjaERCLnBsdWdpbihJREJQb3VjaClcbiAgLnBsdWdpbihIdHRwUG91Y2gkMSlcbiAgLnBsdWdpbihtYXByZWR1Y2UpXG4gIC5wbHVnaW4ocmVwbGljYXRpb24pO1xuXG4vLyBQdWxsIGZyb20gc3JjIGJlY2F1c2UgcG91Y2hkYi1ub2RlL3BvdWNoZGItYnJvd3NlciB0aGVtc2VsdmVzXG5cbmV4cG9ydCBkZWZhdWx0IFBvdWNoREI7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJzsgLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcblxudmFyIF9jbG9ja3NlcTsgLy8gUHJldmlvdXMgdXVpZCBjcmVhdGlvbiB0aW1lXG5cblxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgbmV3IEFycmF5KDE2KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvY2tzZXEgOiBfY2xvY2tzZXE7IC8vIG5vZGUgYW5kIGNsb2Nrc2VxIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gcmFuZG9tIHZhbHVlcyBpZiB0aGV5J3JlIG5vdFxuICAvLyBzcGVjaWZpZWQuICBXZSBkbyB0aGlzIGxhemlseSB0byBtaW5pbWl6ZSBpc3N1ZXMgcmVsYXRlZCB0byBpbnN1ZmZpY2llbnRcbiAgLy8gc3lzdGVtIGVudHJvcHkuICBTZWUgIzE4OVxuXG4gIGlmIChub2RlID09IG51bGwgfHwgY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgIHZhciBzZWVkQnl0ZXMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpO1xuXG4gICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuNSwgY3JlYXRlIGFuZCA0OC1iaXQgbm9kZSBpZCwgKDQ3IHJhbmRvbSBiaXRzICsgbXVsdGljYXN0IGJpdCA9IDEpXG4gICAgICBub2RlID0gX25vZGVJZCA9IFtzZWVkQnl0ZXNbMF0gfCAweDAxLCBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XV07XG4gICAgfVxuXG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgfVxuICB9IC8vIFVVSUQgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvXG4gIC8vIHRpbWUgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuXG5cbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IERhdGUubm93KCk7IC8vIFBlciA0LjIuMS4yLCB1c2UgY291bnQgb2YgdXVpZCdzIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgY2xvY2tcbiAgLy8gY3ljbGUgdG8gc2ltdWxhdGUgaGlnaGVyIHJlc29sdXRpb24gY2xvY2tcblxuICB2YXIgbnNlY3MgPSBvcHRpb25zLm5zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zZWNzIDogX2xhc3ROU2VjcyArIDE7IC8vIFRpbWUgc2luY2UgbGFzdCB1dWlkIGNyZWF0aW9uIChpbiBtc2VjcylcblxuICB2YXIgZHQgPSBtc2VjcyAtIF9sYXN0TVNlY3MgKyAobnNlY3MgLSBfbGFzdE5TZWNzKSAvIDEwMDAwOyAvLyBQZXIgNC4yLjEuMiwgQnVtcCBjbG9ja3NlcSBvbiBjbG9jayByZWdyZXNzaW9uXG5cbiAgaWYgKGR0IDwgMCAmJiBvcHRpb25zLmNsb2Nrc2VxID09PSB1bmRlZmluZWQpIHtcbiAgICBjbG9ja3NlcSA9IGNsb2Nrc2VxICsgMSAmIDB4M2ZmZjtcbiAgfSAvLyBSZXNldCBuc2VjcyBpZiBjbG9jayByZWdyZXNzZXMgKG5ldyBjbG9ja3NlcSkgb3Igd2UndmUgbW92ZWQgb250byBhIG5ld1xuICAvLyB0aW1lIGludGVydmFsXG5cblxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfSAvLyBQZXIgNC4yLjEuMiBUaHJvdyBlcnJvciBpZiB0b28gbWFueSB1dWlkcyBhcmUgcmVxdWVzdGVkXG5cblxuICBpZiAobnNlY3MgPj0gMTAwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlY1wiKTtcbiAgfVxuXG4gIF9sYXN0TVNlY3MgPSBtc2VjcztcbiAgX2xhc3ROU2VjcyA9IG5zZWNzO1xuICBfY2xvY2tzZXEgPSBjbG9ja3NlcTsgLy8gUGVyIDQuMS40IC0gQ29udmVydCBmcm9tIHVuaXggZXBvY2ggdG8gR3JlZ29yaWFuIGVwb2NoXG5cbiAgbXNlY3MgKz0gMTIyMTkyOTI4MDAwMDA7IC8vIGB0aW1lX2xvd2BcblxuICB2YXIgdGwgPSAoKG1zZWNzICYgMHhmZmZmZmZmKSAqIDEwMDAwICsgbnNlY3MpICUgMHgxMDAwMDAwMDA7XG4gIGJbaSsrXSA9IHRsID4+PiAyNCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiAxNiAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdGwgJiAweGZmOyAvLyBgdGltZV9taWRgXG5cbiAgdmFyIHRtaCA9IG1zZWNzIC8gMHgxMDAwMDAwMDAgKiAxMDAwMCAmIDB4ZmZmZmZmZjtcbiAgYltpKytdID0gdG1oID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdG1oICYgMHhmZjsgLy8gYHRpbWVfaGlnaF9hbmRfdmVyc2lvbmBcblxuICBiW2krK10gPSB0bWggPj4+IDI0ICYgMHhmIHwgMHgxMDsgLy8gaW5jbHVkZSB2ZXJzaW9uXG5cbiAgYltpKytdID0gdG1oID4+PiAxNiAmIDB4ZmY7IC8vIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYCAoUGVyIDQuMi4yIC0gaW5jbHVkZSB2YXJpYW50KVxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxID4+PiA4IHwgMHg4MDsgLy8gYGNsb2NrX3NlcV9sb3dgXG5cbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmOyAvLyBgbm9kZWBcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuXG4gIHJldHVybiBidWYgfHwgc3RyaW5naWZ5KGIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2MTsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcblxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZTsiLCJpbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlLmpzJztcblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCB2YXIgRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgdmFyIFVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIGhhc2hmdW5jKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCh2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXNwYWNlID0gcGFyc2UobmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH0gLy8gQ29tcHV0ZSBoYXNoIG9mIG5hbWVzcGFjZSBhbmQgdmFsdWUsIFBlciA0LjNcbiAgICAvLyBGdXR1cmU6IFVzZSBzcHJlYWQgc3ludGF4IHdoZW4gc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGUuZy4gYGJ5dGVzID1cbiAgICAvLyBoYXNoZnVuYyhbLi4ubmFtZXNwYWNlLCAuLi4gdmFsdWVdKWBcblxuXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcblxuICAgIGlmIChidWYpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ2lmeShieXRlcyk7XG4gIH0gLy8gRnVuY3Rpb24jbmFtZSBpcyBub3Qgc2V0dGFibGUgb24gc29tZSBwbGF0Zm9ybXMgKCMyNzApXG5cblxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gIH0gY2F0Y2ggKGVycikge30gLy8gRm9yIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0IHN1cHBvcnRcblxuXG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiLypcbiAqIEJyb3dzZXItY29tcGF0aWJsZSBKYXZhU2NyaXB0IE1ENVxuICpcbiAqIE1vZGlmaWNhdGlvbiBvZiBKYXZhU2NyaXB0IE1ENVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvSmF2YVNjcmlwdC1NRDVcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb25cbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2VcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXG4gKiBWZXJzaW9uIDIuMiBDb3B5cmlnaHQgKEMpIFBhdWwgSm9obnN0b24gMTk5OSAtIDIwMDlcbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cbiAqL1xuZnVuY3Rpb24gbWQ1KGJ5dGVzKSB7XG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShtc2cubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlc1tpXSA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZDVUb0hleEVuY29kZWRBcnJheSh3b3Jkc1RvTWQ1KGJ5dGVzVG9Xb3JkcyhieXRlcyksIGJ5dGVzLmxlbmd0aCAqIDgpKTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNVRvSGV4RW5jb2RlZEFycmF5KGlucHV0KSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGxlbmd0aDMyID0gaW5wdXQubGVuZ3RoICogMzI7XG4gIHZhciBoZXhUYWIgPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgdmFyIHggPSBpbnB1dFtpID4+IDVdID4+PiBpICUgMzIgJiAweGZmO1xuICAgIHZhciBoZXggPSBwYXJzZUludChoZXhUYWIuY2hhckF0KHggPj4+IDQgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpLCAxNik7XG4gICAgb3V0cHV0LnB1c2goaGV4KTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZSBvdXRwdXQgbGVuZ3RoIHdpdGggcGFkZGluZyBhbmQgYml0IGxlbmd0aFxuICovXG5cblxuZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoOCkge1xuICByZXR1cm4gKGlucHV0TGVuZ3RoOCArIDY0ID4+PiA5IDw8IDQpICsgMTQgKyAxO1xufVxuLypcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMsIGFuZCBhIGJpdCBsZW5ndGguXG4gKi9cblxuXG5mdW5jdGlvbiB3b3Jkc1RvTWQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4W2dldE91dHB1dExlbmd0aChsZW4pIC0gMV0gPSBsZW47XG4gIHZhciBhID0gMTczMjU4NDE5MztcbiAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICB2YXIgZCA9IDI3MTczMzg3ODtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgdmFyIG9sZGEgPSBhO1xuICAgIHZhciBvbGRiID0gYjtcbiAgICB2YXIgb2xkYyA9IGM7XG4gICAgdmFyIG9sZGQgPSBkO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2ldLCA3LCAtNjgwODc2OTM2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE3LCA2MDYxMDU4MTkpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAzXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgNF0sIDcsIC0xNzY0MTg4OTcpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA1XSwgMTIsIDEyMDAwODA0MjYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNywgMTc3MDAzNTQxNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDldLCAxMiwgLTE5NTg0MTQ0MTcpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE3LCAtNDIwNjMpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNywgMTgwNDYwMzY4Mik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTVdLCAyMiwgMTIzNjUzNTMyOSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgNV0sIDQsIC0zNzg1NTgpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNiwgMTgzOTAzMDU2Mik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDE0XSwgMjMsIC0zNTMwOTU1Nik7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDRdLCAxMSwgMTI3Mjg5MzM1Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNiwgLTE1NTQ5NzYzMik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMTNdLCA0LCA2ODEyNzkxNzQpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2ldLCAxMSwgLTM1ODUzNzIyMik7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2ldLCA2LCAtMTk4NjMwODQ0KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgN10sIDEwLCAxMTI2ODkxNDE1KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA1XSwgMjEsIC01NzQzNDA1NSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNiwgMTcwMDQ4NTU3MSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE1LCAtMTA1MTUyMyk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNiwgMTg3MzMxMzM1OSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDE1XSwgMTAsIC0zMDYxMTc0NCk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNSwgLTE1NjAxOTgzODApO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxM10sIDIxLCAxMzA5MTUxNjQ5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgNF0sIDYsIC0xNDU1MjMwNzApO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNSwgNzE4Nzg3MjU5KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcbiAgICBhID0gc2FmZUFkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZUFkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZUFkZChjLCBvbGRjKTtcbiAgICBkID0gc2FmZUFkZChkLCBvbGRkKTtcbiAgfVxuXG4gIHJldHVybiBbYSwgYiwgYywgZF07XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBieXRlcyB0byBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKiBDaGFyYWN0ZXJzID4yNTUgaGF2ZSB0aGVpciBoaWdoLWJ5dGUgc2lsZW50bHkgaWdub3JlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJ5dGVzVG9Xb3JkcyhpbnB1dCkge1xuICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGxlbmd0aDggPSBpbnB1dC5sZW5ndGggKiA4O1xuICB2YXIgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGdldE91dHB1dExlbmd0aChsZW5ndGg4KSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg4OyBpICs9IDgpIHtcbiAgICBvdXRwdXRbaSA+PiA1XSB8PSAoaW5wdXRbaSAvIDhdICYgMHhmZikgPDwgaSAlIDMyO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qXG4gKiBBZGQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9ucyBpbnRlcm5hbGx5XG4gKiB0byB3b3JrIGFyb3VuZCBidWdzIGluIHNvbWUgSlMgaW50ZXJwcmV0ZXJzLlxuICovXG5cblxuZnVuY3Rpb24gc2FmZUFkZCh4LCB5KSB7XG4gIHZhciBsc3cgPSAoeCAmIDB4ZmZmZikgKyAoeSAmIDB4ZmZmZik7XG4gIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgcmV0dXJuIG1zdyA8PCAxNiB8IGxzdyAmIDB4ZmZmZjtcbn1cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cblxuXG5mdW5jdGlvbiBiaXRSb3RhdGVMZWZ0KG51bSwgY250KSB7XG4gIHJldHVybiBudW0gPDwgY250IHwgbnVtID4+PiAzMiAtIGNudDtcbn1cbi8qXG4gKiBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBmb3VyIGJhc2ljIG9wZXJhdGlvbnMgdGhlIGFsZ29yaXRobSB1c2VzLlxuICovXG5cblxuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5cbmZ1bmN0aW9uIG1kNWZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgYyB8IH5iICYgZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWdnKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgZCB8IGMgJiB+ZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVpaShhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYyBeIChiIHwgfmQpLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWQ1OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IG1kNSBmcm9tICcuL21kNS5qcyc7XG52YXIgdjMgPSB2MzUoJ3YzJywgMHgzMCwgbWQ1KTtcbmV4cG9ydCBkZWZhdWx0IHYzOyIsIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImV4cG9ydCBkZWZhdWx0ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8qKlxyXG4qIHZrQmVhdXRpZnkgLSBqYXZhc2NyaXB0IHBsdWdpbiB0byBwcmV0dHktcHJpbnQgb3IgbWluaWZ5IHRleHQgaW4gWE1MLCBKU09OLCBDU1MgYW5kIFNRTCBmb3JtYXRzLlxyXG4qXHJcbiogQ29weXJpZ2h0IChjKSAyMDEyIFZhZGltIEtpcnl1a2hpblxyXG4qIHZraXJ5dWtoaW4gQCBnbWFpbC5jb21cclxuKiBodHRwOi8vd3d3LmVzbGluc3RydWN0b3IubmV0L3ZrYmVhdXRpZnkvXHJcbipcclxuKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczpcclxuKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcbiogICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWxcclxuKlxyXG4qICAgUHJldHR5IHByaW50XHJcbipcclxuKiAgICAgICAgdmtiZWF1dGlmeS54bWwodGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuanNvbih0ZXh0IFssaW5kZW50X3BhdHRlcm5dKTtcclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3ModGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsKHRleHQgWyxpbmRlbnRfcGF0dGVybl0pO1xyXG4qXHJcbiogICAgICAgIEB0ZXh0IC0gU3RyaW5nOyB0ZXh0IHRvIGJlYXR1Znk7XHJcbiogICAgICAgIEBpbmRlbnRfcGF0dGVybiAtIEludGVnZXIgfCBTdHJpbmc7XHJcbiogICAgICAgICAgICAgICAgSW50ZWdlcjogIG51bWJlciBvZiB3aGl0ZSBzcGFjZXM7XHJcbiogICAgICAgICAgICAgICAgU3RyaW5nOiAgIGNoYXJhY3RlciBzdHJpbmcgdG8gdmlzdWFsaXplIGluZGVudGF0aW9uICggY2FuIGFsc28gYmUgYSBzZXQgb2Ygd2hpdGUgc3BhY2VzIClcclxuKiAgIE1pbmlmeVxyXG4qXHJcbiogICAgICAgIHZrYmVhdXRpZnkueG1sbWluKHRleHQgWyxwcmVzZXJ2ZV9jb21tZW50c10pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb25taW4odGV4dCk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuY3NzbWluKHRleHQgWyxwcmVzZXJ2ZV9jb21tZW50c10pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5LnNxbG1pbih0ZXh0KTtcclxuKlxyXG4qICAgICAgICBAdGV4dCAtIFN0cmluZzsgdGV4dCB0byBtaW5pZnk7XHJcbiogICAgICAgIEBwcmVzZXJ2ZV9jb21tZW50cyAtIEJvb2w7IFtvcHRpb25hbF07XHJcbiogICAgICAgICAgICAgICAgU2V0IHRoaXMgZmxhZyB0byB0cnVlIHRvIHByZXZlbnQgcmVtb3ZpbmcgY29tbWVudHMgZnJvbSBAdGV4dCAoIG1pbnhtbCBhbmQgbWluY3NzIGZ1bmN0aW9ucyBvbmx5LiApXHJcbipcclxuKiAgIEV4YW1wbGVzOlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbCh0ZXh0KTsgLy8gcHJldHR5IHByaW50IFhNTFxyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb24odGV4dCwgNCApOyAvLyBwcmV0dHkgcHJpbnQgSlNPTlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LmNzcyh0ZXh0LCAnLiAuIC4gLicpOyAvLyBwcmV0dHkgcHJpbnQgQ1NTXHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsKHRleHQsICctLS0tJyk7IC8vIHByZXR0eSBwcmludCBTUUxcclxuKlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbG1pbih0ZXh0LCB0cnVlKTsvLyBtaW5pZnkgWE1MLCBwcmVzZXJ2ZSBjb21tZW50c1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb25taW4odGV4dCk7Ly8gbWluaWZ5IEpTT05cclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3NtaW4odGV4dCk7Ly8gbWluaWZ5IENTUywgcmVtb3ZlIGNvbW1lbnRzICggZGVmYXVsdCApXHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsbWluKHRleHQpOy8vIG1pbmlmeSBTUUxcclxuKlxyXG4qL1xyXG5mdW5jdGlvbiBjcmVhdGVTaGlmdEFycihzdGVwKSB7XHJcblxyXG5cdHZhciBzcGFjZSA9ICcgICAgJztcclxuXHJcblx0aWYgKCBpc05hTihwYXJzZUludChzdGVwKSkgKSB7ICAvLyBhcmd1bWVudCBpcyBzdHJpbmdcclxuXHRcdHNwYWNlID0gc3RlcDtcclxuXHR9IGVsc2UgeyAvLyBhcmd1bWVudCBpcyBpbnRlZ2VyXHJcblx0XHRzd2l0Y2goc3RlcCkge1xyXG5cdFx0XHRjYXNlIDE6IHNwYWNlID0gJyAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSAyOiBzcGFjZSA9ICcgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDM6IHNwYWNlID0gJyAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDQ6IHNwYWNlID0gJyAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA1OiBzcGFjZSA9ICcgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDY6IHNwYWNlID0gJyAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDc6IHNwYWNlID0gJyAgICAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA4OiBzcGFjZSA9ICcgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDk6IHNwYWNlID0gJyAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDEwOiBzcGFjZSA9ICcgICAgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTE6IHNwYWNlID0gJyAgICAgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTI6IHNwYWNlID0gJyAgICAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dmFyIHNoaWZ0ID0gWydcXG4nXTsgLy8gYXJyYXkgb2Ygc2hpZnRzXHJcblx0Zm9yKHZhciBpeD0wO2l4PDEwMDtpeCsrKSB7XHJcblx0XHRzaGlmdC5wdXNoKHNoaWZ0W2l4XStzcGFjZSk7XHJcblx0fVxyXG5cdHJldHVybiBzaGlmdDtcclxufVxyXG5cclxuZnVuY3Rpb24gdmtiZWF1dGlmeSgpe1xyXG5cdHRoaXMuc3RlcCA9ICcgICAgJzsgLy8gNCBzcGFjZXNcclxuXHR0aGlzLnNoaWZ0ID0gY3JlYXRlU2hpZnRBcnIodGhpcy5zdGVwKTtcclxufTtcclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLnhtbCA9IGZ1bmN0aW9uKHRleHQsc3RlcCkge1xyXG5cclxuXHR2YXIgYXIgPSB0ZXh0LnJlcGxhY2UoLz5cXHN7MCx9PC9nLFwiPjxcIilcclxuXHRcdFx0XHQgLnJlcGxhY2UoLzwvZyxcIn46On48XCIpXHJcblx0XHRcdFx0IC5yZXBsYWNlKC9cXHMqeG1sbnNcXDovZyxcIn46On54bWxuczpcIilcclxuXHRcdFx0XHQgLnJlcGxhY2UoL1xccyp4bWxuc1xcPS9nLFwifjo6fnhtbG5zPVwiKVxyXG5cdFx0XHRcdCAuc3BsaXQoJ346On4nKSxcclxuXHRcdGxlbiA9IGFyLmxlbmd0aCxcclxuXHRcdGluQ29tbWVudCA9IGZhbHNlLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHRzdHIgPSAnJyxcclxuXHRcdGl4ID0gMCxcclxuXHRcdHNoaWZ0ID0gc3RlcCA/IGNyZWF0ZVNoaWZ0QXJyKHN0ZXApIDogdGhpcy5zaGlmdDtcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cdFx0XHQvLyBzdGFydCBjb21tZW50IG9yIDwhW0NEQVRBWy4uLl1dPiBvciA8IURPQ1RZUEUgLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvPCEvKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0XHRpbkNvbW1lbnQgPSB0cnVlO1xyXG5cdFx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cclxuXHRcdFx0XHRpZihhcltpeF0uc2VhcmNoKC8tLT4vKSA+IC0xIHx8IGFyW2l4XS5zZWFyY2goL1xcXT4vKSA+IC0xIHx8IGFyW2l4XS5zZWFyY2goLyFET0NUWVBFLykgPiAtMSApIHtcclxuXHRcdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvLS0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC9cXF0+LykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBhcltpeF07XHJcblx0XHRcdFx0aW5Db21tZW50ID0gZmFsc2U7XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyA8ZWxtPjwvZWxtPiAvL1xyXG5cdFx0XHRpZiggL148XFx3Ly5leGVjKGFyW2l4LTFdKSAmJiAvXjxcXC9cXHcvLmV4ZWMoYXJbaXhdKSAmJlxyXG5cdFx0XHRcdC9ePFtcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXgtMV0pID09IC9ePFxcL1tcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXhdKVswXS5yZXBsYWNlKCcvJywnJykpIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHRcdGlmKCFpbkNvbW1lbnQpIGRlZXAtLTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdCAvLyA8ZWxtPiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFx3LykgPiAtMSAmJiBhcltpeF0uc2VhcmNoKC88XFwvLykgPT0gLTEgJiYgYXJbaXhdLnNlYXJjaCgvXFwvPi8pID09IC0xICkge1xyXG5cdFx0XHRcdHN0ciA9ICFpbkNvbW1lbnQgPyBzdHIgKz0gc2hpZnRbZGVlcCsrXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0IC8vIDxlbG0+Li4uPC9lbG0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzxcXHcvKSA+IC0xICYmIGFyW2l4XS5zZWFyY2goLzxcXC8vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPC9lbG0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzxcXC8vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFstLWRlZXBdK2FyW2l4XSA6IHN0ciArPSBhcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyA8ZWxtLz4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvXFwvPi8pID4gLTEgKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPD8geG1sIC4uLiA/PiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFw/LykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyB4bWxucyAvL1xyXG5cdFx0XHRpZiggYXJbaXhdLnNlYXJjaCgveG1sbnNcXDovKSA+IC0xICB8fCBhcltpeF0uc2VhcmNoKC94bWxuc1xcPS8pID4gLTEpIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdHJldHVybiAgKHN0clswXSA9PSAnXFxuJykgPyBzdHIuc2xpY2UoMSkgOiBzdHI7XHJcbn1cclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLmpzb24gPSBmdW5jdGlvbih0ZXh0LHN0ZXApIHtcclxuXHJcblx0dmFyIHN0ZXAgPSBzdGVwID8gc3RlcCA6IHRoaXMuc3RlcDtcclxuXHJcblx0aWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJyApIHJldHVybiB0ZXh0O1xyXG5cclxuXHRpZiAoIHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiICkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGV4dCksIG51bGwsIHN0ZXApO1xyXG5cdGlmICggdHlwZW9mIHRleHQgPT09IFwib2JqZWN0XCIgKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGV4dCwgbnVsbCwgc3RlcCk7XHJcblxyXG5cdHJldHVybiB0ZXh0OyAvLyB0ZXh0IGlzIG5vdCBzdHJpbmcgbm9yIG9iamVjdFxyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5jc3MgPSBmdW5jdGlvbih0ZXh0LCBzdGVwKSB7XHJcblxyXG5cdHZhciBhciA9IHRleHQucmVwbGFjZSgvXFxzezEsfS9nLCcgJylcclxuXHRcdFx0XHQucmVwbGFjZSgvXFx7L2csXCJ7fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXH0vZyxcIn46On59fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXDsvZyxcIjt+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcL1xcKi9nLFwifjo6fi8qXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcKlxcLy9nLFwiKi9+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL346On5cXHN7MCx9fjo6fi9nLFwifjo6flwiKVxyXG5cdFx0XHRcdC5zcGxpdCgnfjo6ficpLFxyXG5cdFx0bGVuID0gYXIubGVuZ3RoLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHRzdHIgPSAnJyxcclxuXHRcdGl4ID0gMCxcclxuXHRcdHNoaWZ0ID0gc3RlcCA/IGNyZWF0ZVNoaWZ0QXJyKHN0ZXApIDogdGhpcy5zaGlmdDtcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cclxuXHRcdFx0aWYoIC9cXHsvLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcCsrXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFstLWRlZXBdK2FyW2l4XTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdGlmKCAvXFwqXFxcXC8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxuezEsfS8sJycpO1xyXG59XHJcblxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmZ1bmN0aW9uIGlzU3VicXVlcnkoc3RyLCBwYXJlbnRoZXNpc0xldmVsKSB7XHJcblx0cmV0dXJuICBwYXJlbnRoZXNpc0xldmVsIC0gKHN0ci5yZXBsYWNlKC9cXCgvZywnJykubGVuZ3RoIC0gc3RyLnJlcGxhY2UoL1xcKS9nLCcnKS5sZW5ndGggKVxyXG59XHJcblxyXG5mdW5jdGlvbiBzcGxpdF9zcWwoc3RyLCB0YWIpIHtcclxuXHJcblx0cmV0dXJuIHN0ci5yZXBsYWNlKC9cXHN7MSx9L2csXCIgXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQU5EIC9pZyxcIn46On5cIit0YWIrdGFiK1wiQU5EIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQkVUV0VFTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiQkVUV0VFTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIENBU0UgL2lnLFwifjo6flwiK3RhYitcIkNBU0UgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBFTFNFIC9pZyxcIn46On5cIit0YWIrXCJFTFNFIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gRU5EIC9pZyxcIn46On5cIit0YWIrXCJFTkQgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBGUk9NIC9pZyxcIn46On5GUk9NIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gR1JPVVBcXHN7MSx9QlkvaWcsXCJ+Ojp+R1JPVVAgQlkgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBIQVZJTkcgL2lnLFwifjo6fkhBVklORyBcIilcclxuXHRcdFx0XHQvLy5yZXBsYWNlKC8gU0VUIC9pZyxcIiBTRVR+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBJTiAvaWcsXCIgSU4gXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSk9JTiAvaWcsXCJ+Ojp+Sk9JTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIENST1NTfjo6fnsxLH1KT0lOIC9pZyxcIn46On5DUk9TUyBKT0lOIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSU5ORVJ+Ojp+ezEsfUpPSU4gL2lnLFwifjo6fklOTkVSIEpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBMRUZUfjo6fnsxLH1KT0lOIC9pZyxcIn46On5MRUZUIEpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBSSUdIVH46On57MSx9Sk9JTiAvaWcsXCJ+Ojp+UklHSFQgSk9JTiBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiT04gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPUiAvaWcsXCJ+Ojp+XCIrdGFiK3RhYitcIk9SIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gT1JERVJcXHN7MSx9QlkvaWcsXCJ+Ojp+T1JERVIgQlkgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPVkVSIC9pZyxcIn46On5cIit0YWIrXCJPVkVSIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvXFwoXFxzezAsfVNFTEVDVCAvaWcsXCJ+Ojp+KFNFTEVDVCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvXFwpXFxzezAsfVNFTEVDVCAvaWcsXCIpfjo6flNFTEVDVCBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBUSEVOIC9pZyxcIiBUSEVOfjo6flwiK3RhYitcIlwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVU5JT04gL2lnLFwifjo6flVOSU9Ofjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVVNJTkcgL2lnLFwifjo6flVTSU5HIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gV0hFTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiV0hFTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdIRVJFIC9pZyxcIn46On5XSEVSRSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdJVEggL2lnLFwifjo6fldJVEggXCIpXHJcblxyXG5cdFx0XHRcdC8vLnJlcGxhY2UoL1xcLFxcc3swLH1cXCgvaWcsXCIsfjo6figgXCIpXHJcblx0XHRcdFx0Ly8ucmVwbGFjZSgvXFwsL2lnLFwiLH46On5cIit0YWIrdGFiK1wiXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQUxMIC9pZyxcIiBBTEwgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBBUyAvaWcsXCIgQVMgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBBU0MgL2lnLFwiIEFTQyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIERFU0MgL2lnLFwiIERFU0MgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBESVNUSU5DVCAvaWcsXCIgRElTVElOQ1QgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBFWElTVFMgL2lnLFwiIEVYSVNUUyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIE5PVCAvaWcsXCIgTk9UIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gTlVMTCAvaWcsXCIgTlVMTCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIExJS0UgL2lnLFwiIExJS0UgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcc3swLH1TRUxFQ1QgL2lnLFwiU0VMRUNUIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXHN7MCx9VVBEQVRFIC9pZyxcIlVQREFURSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFNFVCAvaWcsXCIgU0VUIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvfjo6fnsxLH0vZyxcIn46On5cIilcclxuXHRcdFx0XHQuc3BsaXQoJ346On4nKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuc3FsID0gZnVuY3Rpb24odGV4dCxzdGVwKSB7XHJcblxyXG5cdHZhciBhcl9ieV9xdW90ZSA9IHRleHQucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXCcvaWcsXCJ+Ojp+XFwnXCIpXHJcblx0XHRcdFx0XHRcdFx0LnNwbGl0KCd+Ojp+JyksXHJcblx0XHRsZW4gPSBhcl9ieV9xdW90ZS5sZW5ndGgsXHJcblx0XHRhciA9IFtdLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHR0YWIgPSB0aGlzLnN0ZXAsLy8rdGhpcy5zdGVwLFxyXG5cdFx0aW5Db21tZW50ID0gdHJ1ZSxcclxuXHRcdGluUXVvdGUgPSBmYWxzZSxcclxuXHRcdHBhcmVudGhlc2lzTGV2ZWwgPSAwLFxyXG5cdFx0c3RyID0gJycsXHJcblx0XHRpeCA9IDAsXHJcblx0XHRzaGlmdCA9IHN0ZXAgPyBjcmVhdGVTaGlmdEFycihzdGVwKSA6IHRoaXMuc2hpZnQ7O1xyXG5cclxuXHRcdGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XHJcblx0XHRcdGlmKGl4JTIpIHtcclxuXHRcdFx0XHRhciA9IGFyLmNvbmNhdChhcl9ieV9xdW90ZVtpeF0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyID0gYXIuY29uY2F0KHNwbGl0X3NxbChhcl9ieV9xdW90ZVtpeF0sIHRhYikgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGxlbiA9IGFyLmxlbmd0aDtcclxuXHRcdGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XHJcblxyXG5cdFx0XHRwYXJlbnRoZXNpc0xldmVsID0gaXNTdWJxdWVyeShhcltpeF0sIHBhcmVudGhlc2lzTGV2ZWwpO1xyXG5cclxuXHRcdFx0aWYoIC9cXHN7MCx9XFxzezAsfVNFTEVDVFxcc3swLH0vLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRhcltpeF0gPSBhcltpeF0ucmVwbGFjZSgvXFwsL2csXCIsXFxuXCIrdGFiK3RhYitcIlwiKVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiggL1xcc3swLH1cXHN7MCx9U0VUXFxzezAsfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdGFyW2l4XSA9IGFyW2l4XS5yZXBsYWNlKC9cXCwvZyxcIixcXG5cIit0YWIrdGFiK1wiXCIpXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKCAvXFxzezAsfVxcKFxcc3swLH1TRUxFQ1RcXHN7MCx9Ly5leGVjKGFyW2l4XSkpICB7XHJcblx0XHRcdFx0ZGVlcCsrO1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcJy8uZXhlYyhhcltpeF0pICkgIHtcclxuXHRcdFx0XHRpZihwYXJlbnRoZXNpc0xldmVsPDEgJiYgZGVlcCkge1xyXG5cdFx0XHRcdFx0ZGVlcC0tO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHRcdGlmKHBhcmVudGhlc2lzTGV2ZWw8MSAmJiBkZWVwKSB7XHJcblx0XHRcdFx0XHRkZWVwLS07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHZhciBqdW5rID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHRzdHIgPSBzdHIucmVwbGFjZSgvXlxcbnsxLH0vLCcnKS5yZXBsYWNlKC9cXG57MSx9L2csXCJcXG5cIik7XHJcblx0XHRyZXR1cm4gc3RyO1xyXG59XHJcblxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUueG1sbWluID0gZnVuY3Rpb24odGV4dCwgcHJlc2VydmVDb21tZW50cykge1xyXG5cclxuXHR2YXIgc3RyID0gcHJlc2VydmVDb21tZW50cyA/IHRleHRcclxuXHRcdFx0XHRcdFx0XHQgICA6IHRleHQucmVwbGFjZSgvXFw8IVsgXFxyXFxuXFx0XSooLS0oW15cXC1dfFtcXHJcXG5dfC1bXlxcLV0pKi0tWyBcXHJcXG5cXHRdKilcXD4vZyxcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgLnJlcGxhY2UoL1sgXFxyXFxuXFx0XXsxLH14bWxucy9nLCAnIHhtbG5zJyk7XHJcblx0cmV0dXJuICBzdHIucmVwbGFjZSgvPlxcc3swLH08L2csXCI+PFwiKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuanNvbm1pbiA9IGZ1bmN0aW9uKHRleHQpIHtcclxuXHJcblx0aWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJyApIHJldHVybiB0ZXh0O1xyXG5cclxuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZSh0ZXh0KSwgbnVsbCwgMCk7XHJcblxyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5jc3NtaW4gPSBmdW5jdGlvbih0ZXh0LCBwcmVzZXJ2ZUNvbW1lbnRzKSB7XHJcblxyXG5cdHZhciBzdHIgPSBwcmVzZXJ2ZUNvbW1lbnRzID8gdGV4dFxyXG5cdFx0XHRcdFx0XHRcdCAgIDogdGV4dC5yZXBsYWNlKC9cXC9cXCooW14qXXxbXFxyXFxuXXwoXFwqKyhbXiovXXxbXFxyXFxuXSkpKSpcXCorXFwvL2csXCJcIikgO1xyXG5cclxuXHRyZXR1cm4gc3RyLnJlcGxhY2UoL1xcc3sxLH0vZywnICcpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xce1xcc3sxLH0vZyxcIntcIilcclxuXHRcdFx0ICAucmVwbGFjZSgvXFx9XFxzezEsfS9nLFwifVwiKVxyXG5cdFx0XHQgIC5yZXBsYWNlKC9cXDtcXHN7MSx9L2csXCI7XCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcL1xcKlxcc3sxLH0vZyxcIi8qXCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcKlxcL1xcc3sxLH0vZyxcIiovXCIpO1xyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5zcWxtaW4gPSBmdW5jdGlvbih0ZXh0KSB7XHJcblx0cmV0dXJuIHRleHQucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKS5yZXBsYWNlKC9cXHN7MSx9XFwoLyxcIihcIikucmVwbGFjZSgvXFxzezEsfVxcKS8sXCIpXCIpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyB2a2JlYXV0aWZ5KCk7XHJcbiIsImV4cG9ydCBjb25zdCB1cGxvYWRBcmVhSFRNTCA9IFxuICBgPGRpdiBpZD1cImRvY3VtZW50LXVwbG9hZC1jb250YWluZXJcIj5cblxuICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9jb250YWluZXJcIj5cbiAgICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9hcmVhXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9tZXNzYWdlXCI+VXBsb2FkIEZpbGVzPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2IGlkPVwidXBsb2FkaW5nX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpbGVfY29udGFpbmVyXCIgaWQ9XCJ1bnBhaXJlZF9jb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXItdGl0bGVcIj5VbnBhaXJlZCBEb2N1bWVudHM8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZmlsZXNfY29udGFpbmVyXCI+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwibWVpX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPk1FSTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfc29ydF9uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2xpc3RcIiBpZD1cIm1laV9saXN0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX2NvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJhY2tncm91bmQ6ICNEQUVBRjE7IGJvcmRlci1yYWRpdXM6IDVweDtcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX2xhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX3JhZGlvXCIgbmFtZT1cIm1laV9yYWRpb19ncm91cFwiIHZhbHVlPVwiY3JlYXRlX21laVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi10b3A6IGF1dG87bWFyZ2luLWxlZnQ6IDNweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgbmV3IE1FSSBmaWxlXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBpZD1cImltYWdlX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPkltYWdlczwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfc29ydF9uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2xpc3RcIiBpZD1cImltYWdlX2xpc3RcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZ2VuZXJhdGUtcGFpci1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbl9idXR0b25cIiBpZD1cIm1ha2VfcGFpclwiPk1ha2UgUGFpcjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZV9jb250YWluZXJcIiBpZD1cInBhaXJlZF9jb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXItdGl0bGVcIj5QYWlyZWQgRm9saW9zPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX3NvcnRfbmFtZVwiPlxuICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb3J0X25hbWUgYXJyb3dfYnRuXCI+JiN4MjJDMDs8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb2xpb19saXN0XCIgaWQ9XCJwYWlyZWRfbGlzdFwiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJ1cGxvYWRfYnV0dG9uX2NvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25fYnV0dG9uXCIgaWQ9XCJ1cGxvYWRfYnV0dG9uXCI+XG4gICAgICAgICAgICBVcGxvYWRcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJ1cGxvYWRpbmdfc3Bpbm5lclwiPuKGuzwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS1cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2NvbnRhaW5lclwiIGlkPVwibWFudXNjcmlwdHNfY29udGFpbmVyXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPk1hbnVzY3JpcHRzPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbGlvX2xpc3RcIiBpZD1cIm1hbnVzY3JpcHRfbGlzdFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAtLT5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5gO1xuXG5leHBvcnQgY29uc3QgbmV3Rm9sZGVySFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwicmVuYW1lX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBpZD1cImRhc2hib2FyZF9pbnB1dF9jb250YWluZXJcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJlbmFtZV9idXR0b25zX2NvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FuY2VsX2Rhc2hib2FyZFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybV9kYXNoYm9hcmRcIj5DcmVhdGU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuXG5leHBvcnQgY29uc3QgcmVuYW1lSFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwicmVuYW1lX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBpZD1cImRhc2hib2FyZF9pbnB1dF9jb250YWluZXJcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJlbmFtZV9idXR0b25zX2NvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FuY2VsX2Rhc2hib2FyZFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybV9kYXNoYm9hcmRcIj5Db25maXJtPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDsiLCIvKiogQG1vZHVsZSBXYXJuaW5ncyAqL1xuXG4vKipcbiAqIFdhcm4gd2hlbiBncm91cGVkIG5ldW1lIGNvbXBvbmVudHMgZm9ybSBhbiB1bnJlY29nbml6ZWQgbmV1bWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cGluZ05vdFJlY29nbml6ZWQgKCk6IHZvaWQge1xuICBpZiAoISh3aW5kb3cuY29uZmlybSgnTmVvbiBkb2VzIG5vdCByZWNvZ25pemUgdGhpcyBuZXVtZSBncm91cGluZy4gV291bGQgeW91IGxpa2UgdG8gY3JlYXRlIGEgY29tcG91bmQgbmV1bWU/JykpKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZG8nKS5jbGljaygpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBTcGxpdEFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IHNlbGVjdEFsbCB9IGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuLi91dGlscy9EcmFnSGFuZGxlcic7XG5pbXBvcnQgeyBnZXRTVkdSZWxDb29yZHMgfSBmcm9tICcuLi91dGlscy9Db29yZGluYXRlcyc7XG5cbi8qKiBIYW5kbGUgc3BsaXR0aW5nIGEgc3RhZmYgaW50byB0d28gc3RhdmVzIHRocm91Z2ggVmVyb3Zpby4gKi9cbmV4cG9ydCBjbGFzcyBTcGxpdFN0YWZmSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcmVhZG9ubHkgc3RhZmY6IFNWR0dFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhZmYgLSBUaGUgc3RhZmYgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgc3RhZmY6IFNWR0dFbGVtZW50KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMuc3RhZmYgPSBzdGFmZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBwYXJ0IG9mIHRoZSBzcGxpdCBhY3Rpb24uXG4gICAqL1xuICBzdGFydFNwbGl0ICgpOiB2b2lkIHtcbiAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleXByZXNzZXNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xpY2sgV2hlcmUgdG8gU3BsaXQnKTtcbiAgfVxuXG4gIHNwbGl0RGlzYWJsZSAoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnJlc2V0SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2thd2F5SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBpbnB1dCB0byBzcGxpdCBhIHN0YWZmLiAqL1xuICBoYW5kbGVyID0gKChldnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAvLyBGaW5kIHN0YWZmIHBvaW50IGNvcnJlc3BvbmRzIHRvIGlmIG9uZSBleGlzdHNcbiAgICAvLyBUT0RPXG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YWZmLmlkO1xuICAgIGNvbnN0IGN1cnNvciA9IGdldFNWR1JlbENvb3JkcyhldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogU3BsaXRBY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdzcGxpdCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICB4OiBjdXJzb3IueFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gc3VjY2Vzc2Z1bCcsICdzdWNjZXNzJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLnN0YWZmJyk7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtpZH1gKV0sIHRoaXMubmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcblxuICAgICAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKTtcbiAgICAgIGlmIChtb3JlRWRpdCkge1xuICAgICAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdHMgc3BsaXQgb24gRXNjYXBlIHByZXNzLCBkaXNhYmxlcyBvbiBTaGlmdC4gKi9cbiAga2V5ZG93bkxpc3RlbmVyID0gKChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMuc3BsaXREaXNhYmxlKCk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVyLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKiBFeGl0IHNwbGl0IGlmIHVzZXIgY2xpY2tzIG9mZiBvZiBhY3RpdmUgcGFnZS4gKi9cbiAgY2xpY2thd2F5SGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5hY3RpdmUtcGFnZScpID09PSBudWxsKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogQ2FsbGVkIHRvIHJlYXBwbHkgdGhlIGV2ZW50IGxpc3RlbmVyIGlmIG5lY2Vzc2FyeS4gKi9cbiAgcmVzZXRIYW5kbGVyID0gKChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcbn1cbiIsImltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCB7IFNwbGl0TmV1bWVBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKiBIYW5kbGUgc3BsaXR0aW5nIGEgbmV1bWUgaW50byB0d28gbmV1bWVzIHRocm91Z2ggVmVyb3Zpby4gKi9cbmV4cG9ydCBjbGFzcyBTcGxpdE5ldW1lSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcmVhZG9ubHkgbmV1bWU6IFNWR0dFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbmV1bWUgLSBUaGUgbmV1bWUgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgbmV1bWU6IFNWR0dFbGVtZW50KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMubmV1bWUgPSBuZXVtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBwYXJ0IG9mIHRoZSBzcGxpdCBhY3Rpb24uXG4gICAqL1xuICBzdGFydFNwbGl0ICgpOiB2b2lkIHtcbiAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleXByZXNzZXNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xpY2sgVGhlIEJlZ2lubmluZyBvZiBUaGUgU2Vjb25kIE5ldW1lJyk7XG4gIH1cblxuICBzcGxpdERpc2FibGUgKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5yZXNldEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrYXdheUhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgaW5wdXQgdG8gc3BsaXQgYSBuZXVtZS4gKi9cbiAgaGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLm5ldW1lLmlkO1xuXG4gICAgLy8gdW5zZWxlY3QoKTtcbiAgICBcbiAgICBjb25zdCBuYyA9IChldnQudGFyZ2V0IGFzIFNWR0dFbGVtZW50KS5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnN0IG5jSWQgPSBuYy5pZDtcblxuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogU3BsaXROZXVtZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ3NwbGl0TmV1bWUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgbmNJZDogbmNJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gc3VjY2Vzc2Z1bCcsICdzdWNjZXNzJyk7XG4gICAgICB9IFxuICAgICAgZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gZmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgICAvLyB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAvLyBjb25zdCBkcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLm5ldW1lJyk7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgLy8gc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKSBhcyBTVkdHRWxlbWVudF0sIHRoaXMubmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcbiAgICAgIC8vIHRyeSB7XG4gICAgICAvLyAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgLy8gICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5jbGFzc0xpc3QuYWRkKCdpcy1oaWRkZW4nKTtcbiAgICAgIC8vIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSk7XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIEV4aXRzIHNwbGl0IG9uIEVzY2FwZSBwcmVzcywgZGlzYWJsZXMgb24gU2hpZnQuICovXG4gIGtleWRvd25MaXN0ZW5lciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdCBzcGxpdCBpZiB1c2VyIGNsaWNrcyBvZmYgb2YgYWN0aXZlIHBhZ2UuICovXG4gIGNsaWNrYXdheUhhbmRsZXIgPSAoKGV2dDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYWN0aXZlLXBhZ2UnKSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zcGxpdERpc2FibGUoKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIENhbGxlZCB0byByZWFwcGx5IHRoZSBldmVudCBsaXN0ZW5lciBpZiBuZWNlc3NhcnkuICovXG4gIHJlc2V0SGFuZGxlciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdTaGlmdCcpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLnRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0eXBlb2YgZ2xvYmFsLnF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBnbG9iYWwucXVldWVNaWNyb3Rhc2soZnVuYyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy9iYXNlZCBvZmYgcnN2cCBodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzXG4vL2xpY2Vuc2UgaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9tYXN0ZXIvbGliL3JzdnAvYXNhcC5qc1xuXG52YXIgTXV0YXRpb24gPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTXV0YXRpb247XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb24oaGFuZGxlKTtcbiAgdmFyIGVsZW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHtcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGVsZW1lbnQuZGF0YSA9IChjYWxsZWQgPSArK2NhbGxlZCAlIDIpO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAvLyB3ZSBjYW4gb25seSBnZXQgaGVyZSBpbiBJRTEwXG4gICAgLy8gd2hpY2ggZG9lc24ndCBoYW5kZWwgcG9zdE1lc3NhZ2Ugd2VsbFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAoZnVuYykge1xuICB2YXIgY2hhbm5lbCA9IG5ldyBnbG9iYWwuTWVzc2FnZUNoYW5uZWwoKTtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gIH07XG59OyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2RvY3VtZW50JyBpbiBnbG9iYWwgJiYgJ29ucmVhZHlzdGF0ZWNoYW5nZScgaW4gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXG4gICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICB2YXIgc2NyaXB0RWwgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0RWwub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlKCk7XG5cbiAgICAgIHNjcmlwdEVsLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICBzY3JpcHRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdEVsKTtcbiAgICAgIHNjcmlwdEVsID0gbnVsbDtcbiAgICB9O1xuICAgIGdsb2JhbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpO1xuXG4gICAgcmV0dXJuIGhhbmRsZTtcbiAgfTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydHMuaW5zdGFsbCA9IGZ1bmN0aW9uICh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dCh0LCAwKTtcbiAgfTtcbn07IiwiaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcbmltcG9ydCB7IEFsbERvY3MsIERvYywgdXBsb2Fkc0luZm8gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgKiBhcyBsb2NhbE1hbmlmZXN0IGZyb20gJy4uLy4uL2Fzc2V0cy9tYW5pZmVzdC5qc29uJztcblxuZXhwb3J0IGNvbnN0IGRiID0gbmV3IFBvdWNoREIoJ05lb24tVXNlci1TdG9yYWdlJyk7XG5cbmZ1bmN0aW9uIGdldEFsbERvY3VtZW50cygpOiBQcm9taXNlPEFsbERvY3M+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBkYi5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4gcmVzb2x2ZShyZXN1bHQpKVxuICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hVcGxvYWRzKCk6IFByb21pc2U8dXBsb2Fkc0luZm8+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBnZXRBbGxEb2N1bWVudHMoKTtcbiAgICByZXR1cm4gcmVzLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgIG5hbWU6IHJvdy5kb2MgPyByb3cuZG9jLm5hbWUgOiAndW5kZWZpbmVkJyxcbiAgICB9KSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKCdDb3VsZG5cXCd0IGZldGNoIHVwbG9hZGVkIGRvY3VtZW50cycsIGVyci5tZXNzYWdlKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hbmlmZXN0KGlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIG1laTogRmlsZSwgYmc6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobG9jYWxNYW5pZmVzdCkpO1xuICAgIG1hbmlmZXN0WydAaWQnXSA9IGlkO1xuICAgIG1hbmlmZXN0Wyd0aXRsZSddID0gdGl0bGU7XG4gICAgbWFuaWZlc3RbJ3RpbWVzdGFtcCddID0gKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBjb25zdCBtZWlQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCBtZWlSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgbWVpUmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUobWVpUmVhZGVyLnJlc3VsdCk7XG4gICAgICB9KTtcbiAgICAgIG1laVJlYWRlci5yZWFkQXNEYXRhVVJMKG1laSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBiZ1Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGJnUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIGJnUmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoYmdSZWFkZXIucmVzdWx0KTtcbiAgICAgIH0pO1xuICAgICAgYmdSZWFkZXIucmVhZEFzRGF0YVVSTChiZyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBtZWlVcmkgPSBhd2FpdCBtZWlQcm9taXNlO1xuICAgIGNvbnN0IGJnVXJpID0gYXdhaXQgYmdQcm9taXNlO1xuXG4gICAgbWFuaWZlc3RbJ2ltYWdlJ10gPSBiZ1VyaTtcbiAgICBtYW5pZmVzdFsnbWVpX2Fubm90YXRpb25zJ10gPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiB1dWlkdjQoKSxcbiAgICAgICAgdHlwZTogJ0Fubm90YXRpb24nLFxuICAgICAgICBib2R5OiBtZWlVcmksXG4gICAgICAgIHRhcmdldDogYmdVcmlcbiAgICAgIH1cbiAgICBdO1xuICAgIHJlc29sdmUobWFuaWZlc3QpO1xuICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZCBuZXcgZW50cnkgdG8gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0gaWQgXG4gKiBAcGFyYW0gdGl0bGUgXG4gKiBAcGFyYW0gY29udGVudCBcbiAqIEBwYXJhbSBzaW5nbGUgaXMgaXQgYSBzaW5nbGUgcGFnZSBvciBhIG1hbnVzY3JpcHRcbiAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERvY3VtZW50KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29udGVudDogQmxvYiwgc2luZ2xlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZGIucHV0KHtcbiAgICAgIF9pZDogaWQsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogc2luZ2xlID8gJ3BhZ2UnIDogJ21hbnVzY3JpcHQnLFxuICAgICAgX2F0dGFjaG1lbnRzOiB7XG4gICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgY29udGVudF90eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgICAgZGF0YTogY29udGVudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICByZXNvbHZlKHRydWUpO1xuICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICB3aW5kb3cuYWxlcnQoYEVycm9yIFVwbG9hZGluZyBEb2N1bWVudDogJHtlcnIubWVzc2FnZX0sIHRpdGxlOiAke25hbWV9LCBpZDogJHtpZH0uYCk7XG4gICAgICByZWplY3QoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxldGUgZW50cnkgZnJvbSB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSBpZCBcbiAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZURvY3VtZW50KGlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBkYi5nZXQoaWQpXG4gICAgICAudGhlbihkb2MgPT4ge1xuICAgICAgICBkYi5yZW1vdmUoZG9jKVxuICAgICAgICAgIC50aGVuKF8gPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIGRvYyBmcm9tIHRoZSBkYXRhYmFzZSAoc3VwcG9ydHMgb25seSB0aXRsZSBmb3Igbm93KVxuICogQHBhcmFtIGlkIFxuICogQHBhcmFtIG5ld05hbWUgXG4gKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEb2NOYW1lKGlkOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIFJldHJpZXZlIGRvYyBmcm9tIGRhdGFiYXNlICh0byBnZXQgX3JldilcbiAgICBkYi5nZXQ8RG9jPihpZCkudGhlbihkb2MgPT4ge1xuXG4gICAgICAvLyBSZXRyaWV2ZSBtYW5pZmVzdCBmcm9tIGRhdGFiYXNlXG4gICAgICBkYi5nZXRBdHRhY2htZW50KGlkLCAnbWFuaWZlc3QnKS50aGVuKChtYW5pZmVzdEJsb2I6IEJsb2IpID0+IHtcbiAgICAgICAgbWFuaWZlc3RCbG9iLnRleHQoKS50aGVuKG1hbmlmZXN0VGV4dCA9PiB7XG4gICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKG1hbmlmZXN0VGV4dCk7XG4gICAgXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSBtYW5pZmVzdFxuICAgICAgICAgIGRvYy5uYW1lID0gbmV3TmFtZTtcbiAgICAgICAgICBtYW5pZmVzdFsndGl0bGUnXSA9IG5ld05hbWU7XG4gICAgXG4gICAgICAgICAgLy8gQ29udmVydCBiYWNrIHRvIGJsb2JcbiAgICAgICAgICBjb25zdCBuZXdNYW5pZmVzdEJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicgfSk7XG5cbiAgICAgICAgICBkb2MuX2F0dGFjaG1lbnRzWydtYW5pZmVzdCddID0ge1xuICAgICAgICAgICAgY29udGVudF90eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgICAgICBkYXRhOiBuZXdNYW5pZmVzdEJsb2JcbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICAgIGRiLnB1dChkb2MpXG4gICAgICAgICAgICAudGhlbigoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7IC8vIGRiLnB1dFxuICAgICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpOyAvLyBtYW5pZmVzdFRleHRQcm9taXNlXG4gICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpOyAvLyBkYi5nZXRBdHRhY2htZW50XG4gICAgfSkuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTsgLy8gZGIuZ2V0XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgSUVudHJ5LCBJRmlsZSwgSUZvbGRlciwgRmlsZVN5c3RlbVRvb2xzIH0gZnJvbSAnLi9GaWxlU3lzdGVtJztcbmltcG9ydCB7IGRlbGV0ZURvY3VtZW50LCB1cGRhdGVEb2NOYW1lIH0gZnJvbSAnLi9TdG9yYWdlJztcbmltcG9ydCB7IEZpbGVTeXN0ZW1NYW5hZ2VyIH0gZnJvbSAnLi9GaWxlU3lzdGVtJztcbmltcG9ydCB7IFNoaWZ0U2VsZWN0aW9uTWFuYWdlciwgZGFzaGJvYXJkU3RhdGUgfSBmcm9tICcuL0Rhc2hib2FyZFRvb2xzJztcbmltcG9ydCB7IEluaXRVcGxvYWRBcmVhIH0gZnJvbSAnLi9VcGxvYWRBcmVhJztcbmltcG9ydCAqIGFzIGNvbnRleHRNZW51Q29udGVudCBmcm9tICcuL0NvbnRleHRNZW51Q29udGVudCc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvdywgTW9kYWxXaW5kb3dWaWV3IH0gZnJvbSAnLi4vdXRpbHMvTW9kYWxXaW5kb3cnO1xuXG5jb25zdCBkb2N1bWVudHNDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWNvbnRlbnQtY29udGFpbmVyJyk7XG5jb25zdCBiYWNrZ3JvdW5kQXJlYTogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFpbi1zZWN0aW9uLWNvbnRlbnQnKTtcbmNvbnN0IG9wZW5CdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI29wZW4tZG9jJyk7XG5jb25zdCByZW1vdmVCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3JlbW92ZS1kb2MnKTtcbmNvbnN0IG5hdlBhdGhDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25hdi1wYXRoLWNvbnRhaW5lcicpO1xubGV0IGJhY2tCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWJhY2stYnRuJyk7XG5sZXQgZW1wdHlCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWVtcHR5LWJ0bicpO1xubGV0IGRlbGV0ZUJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZnMtZGVsZXRlLWJ0bicpO1xuY29uc3QgdXBsb2FkRG9jdW1lbnRzQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN1cGxvYWQtbmV3LWRvYy1idXR0b24nKTtcbmNvbnN0IG5ld0ZvbGRlckJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYWRkLWZvbGRlci1idXR0b24nKTtcblxuY29uc3Qgc2hpZnRTZWxlY3Rpb24gPSBuZXcgU2hpZnRTZWxlY3Rpb25NYW5hZ2VyKCk7XG5jb25zdCBmc20gPSBGaWxlU3lzdGVtTWFuYWdlcigpO1xuY29uc3Qgc3RhdGUgPSBkYXNoYm9hcmRTdGF0ZSgpO1xuXG5jb25zdCBtYWluU2VjdGlvbjogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFpbi1zZWN0aW9uLWNvbnRlbnQnKTtcbmNvbnN0IGNvbnRleHRNZW51OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yaWdodC1jbGljay1maWxlLW1lbnUnKTtcbmNvbnN0IGNvbnRleHRNZW51Q29udGVudFdyYXBwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRleHQtbWVudS1pdGVtcy13cmFwcGVyJyk7XG5cbmxldCBtZXRhS2V5SXNQcmVzc2VkID0gZmFsc2U7XG5sZXQgc2hpZnRLZXlJc1ByZXNzZWQgPSBmYWxzZTtcbmxldCBjdXJyZW50RHJhZ1RhcmdldCA9IG51bGw7XG5sZXQgcmlnaHRDbGlja2VkID0gZmFsc2U7XG5cbm9wZW5CdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkRvY3NIYW5kbGVyKTtcbnJlbW92ZUJ1dHRvbj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZW1vdmVEb2NzSGFuZGxlcik7XG51cGxvYWREb2N1bWVudHNCdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlblVwbG9hZEFyZWFIYW5kbGVyKTtcbm5ld0ZvbGRlckJ1dHRvbj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuTmV3Rm9sZGVyV2luZG93KTtcblxuLy8gU29ydGluZyBhbGdvcml0aG1zXG4vLyBjb25zdCBzb3J0QnlBbHBoYW51bWVyaWNhbCA9IChhOiBJRW50cnksIGI6IElFbnRyeSkgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbi8vIGNvbnN0IHNvcnRCeVRpbWUgPSAoYTogSUVudHJ5LCBiOiBJRW50cnkpID0+IHtcbi8vICAgY29uc3QgYVRpbWUgPSBhLm1ldGFkYXRhWydjcmVhdGVkX29uJ107XG4vLyAgIGNvbnN0IGJUaW1lID0gYi5tZXRhZGF0YVsnY3JlYXRlZF9vbiddO1xuLy8gICBpZiAoYVRpbWUgJiYgYlRpbWUpIHJldHVybiBhVGltZSAtIGJUaW1lO1xuLy8gICBlbHNlIGlmIChhVGltZSkgcmV0dXJuIC0xO1xuLy8gfTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICBpZiAoZS5tZXRhS2V5KSBtZXRhS2V5SXNQcmVzc2VkID0gdHJ1ZTtcbiAgaWYgKGUuc2hpZnRLZXkpIHNoaWZ0S2V5SXNQcmVzc2VkID0gdHJ1ZTtcbiAgLy8gTG9zZSBmb2N1cyBvbiBlc2Mga2V5XG4gIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICB1bnNlbGVjdEFsbCgpO1xuICAgIHNoaWZ0U2VsZWN0aW9uLnJlc2V0KCk7XG4gICAgdXBkYXRlQWN0aW9uQmFyQnV0dG9ucygpO1xuICAgIHVwZGF0ZUZTQnV0dG9ucygpO1xuICB9XG59KTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGUpID0+IHtcbiAgaWYgKCFlLm1ldGFLZXkpIG1ldGFLZXlJc1ByZXNzZWQgPSBmYWxzZTtcbiAgaWYgKCFlLnNoaWZ0S2V5KSBzaGlmdEtleUlzUHJlc3NlZCA9IGZhbHNlO1xufSk7XG5cbmJhY2tncm91bmRBcmVhPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEVsZW1lbnQ7XG4gIC8vIExvc2UgZm9jdXMgaWYgY2xpY2sgZXZlbnQgaW4gbWFpbiBzZWN0aW9uIGlzIG5vdCBhIGRvY3VtZW50IHRpbGVcbiAgY29uc3QgaXNEb2N1bWVudCA9IEJvb2xlYW4odGFyZ2V0LmNsb3Nlc3QoJy5kb2N1bWVudC1lbnRyeScpKTtcbiAgaWYgKCFpc0RvY3VtZW50KSB7XG4gICAgdW5zZWxlY3RBbGwoKTtcbiAgICBzaGlmdFNlbGVjdGlvbi5yZXNldCgpO1xuICAgIHVwZGF0ZUFjdGlvbkJhckJ1dHRvbnMoKTtcbiAgICB1cGRhdGVGU0J1dHRvbnMoKTtcbiAgfVxufSk7XG5cbi8qKlxuICogXG4gKiBAcmV0dXJucyBcbiAqL1xuZnVuY3Rpb24gb3BlblVwbG9hZEFyZWFIYW5kbGVyKCkge1xuICBpZiAoIXVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG4gIEluaXRVcGxvYWRBcmVhKHN0YXRlLmdldFBhcmVudEZvbGRlcigpKTtcbn1cblxuXG4vKipcbiAqIE9wZW5zIGEgbmV3IHRhYiB3aXRoIHRoZSBOZW9uIGVkaXRvciBmb3IgdGhlIGdpdmVuIGlkXG4gKiBcbiAqIEBwYXJhbSBpZCBrZXkgb2YgZmlsZSBpbiBiYmIgb3IgbWFuaWZlc3QgdXJsXG4gKiBAcGFyYW0gaXNTYW1wbGUgYm9vbGVhbiB0byBkZWNpZGUgd2hlcmUgdG8gZmV0Y2ggZmlsZVxuICovXG5mdW5jdGlvbiBvcGVuRWRpdG9yVGFiKGlkOiBzdHJpbmcsIGlzU2FtcGxlOiBib29sZWFuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IChpc1NhbXBsZSlcbiAgICA/IHsgbWFuaWZlc3Q6IGlkIH1cbiAgICA6IHsgc3RvcmFnZTogaWQgfTtcbiAgY29uc3QgcXVlcnkgPSBtYWtlUXVlcnkocGFyYW1zKTtcbiAgd2luZG93Lm9wZW4oYC4vZWRpdG9yLmh0bWw/JHtxdWVyeX1gLCAnX2JsYW5rJyk7XG59XG5cblxuLyoqXG4gKiBPcGVucyBlZGl0b3IgdGFiIGdpdmVuIGEgZG9jdW1lbnQgdGlsZSBlbGVtZW50XG4gKiBcbiAqIEBwYXJhbSBlbnRyeSBcbiAqL1xuZnVuY3Rpb24gb3BlbkZpbGUoZW50cnk6IElGaWxlKSB7XG4gIGNvbnN0IGRvY3VtZW50VHlwZSA9IGVudHJ5Lm1ldGFkYXRhWydkb2N1bWVudCddO1xuICBpZiAodHlwZW9mIGRvY3VtZW50VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgaXNTYW1wbGUgPSBkb2N1bWVudFR5cGUgPT09ICdzYW1wbGUnO1xuICAgIG9wZW5FZGl0b3JUYWIoZW50cnkuaWQsIGlzU2FtcGxlKTtcbiAgfVxufVxuXG5cbi8qKlxuICogXG4gKiBAcGFyYW0gb2JqIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIG1ha2VRdWVyeShvYmopOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoa2V5ID0+IHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pO1xuICB9KS5qb2luKCcmJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSBpbmRleCBcbiAqL1xuZnVuY3Rpb24gc2VsZWN0KGluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgZW50cnkgPSBzdGF0ZS5nZXRFbnRyaWVzKCkuYXQoaW5kZXgpO1xuICBzdGF0ZS5zZXRTZWxlY3Rpb24oaW5kZXgsIHRydWUpO1xuICBjb25zdCB0aWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZW50cnkuaWQpO1xuICB0aWxlLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSBpbmRleCBcbiAqL1xuZnVuY3Rpb24gdW5zZWxlY3QoaW5kZXg6IG51bWJlcikge1xuICBjb25zdCBpZCA9IHN0YXRlLmdldEVudHJpZXMoKS5hdChpbmRleCkuaWQ7XG4gIHN0YXRlLnNldFNlbGVjdGlvbihpbmRleCwgZmFsc2UpO1xuICBjb25zdCB0aWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB0aWxlLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqL1xuZnVuY3Rpb24gdW5zZWxlY3RBbGwoKSB7XG4gIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRvY3VtZW50LWVudHJ5LnNlbGVjdGVkJykpXG4gICAgLmZvckVhY2goKHRpbGUpID0+IHRpbGUuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gIHN0YXRlLnJlc2V0U2VsZWN0aW9uKCk7XG59XG5cbi8qKiBcbiAqIENyZWF0ZXMgYSBmb2xkZXIgb3IgZmlsZSB0aWxlIGVsZW1lbnQgZ2l2ZW4gYW4gZW50cnlcbiAqIEBwYXJhbSBlbnRyeSBJRW50cnlcbiAqIEByZXR1cm5zIEhUTUxEaXZFbGVtZW50IHRpbGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBjcmVhdGVUaWxlKGVudHJ5OiBJRW50cnkpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkb2N1bWVudC1lbnRyeScpO1xuICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpOyAvLyBtYWtlIGZpbGUgb3IgZm9sZGVyIGRyYWdnYWJsZVxuXG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgaWNvbi5jbGFzc0xpc3QuYWRkKCdkb2N1bWVudC1pY29uJyk7XG4gIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbmFtZS5pbm5lclRleHQgPSBlbnRyeS5uYW1lO1xuXG4gIHN3aXRjaCAoZW50cnkudHlwZSkge1xuICAgIGNhc2UgJ2ZvbGRlcic6XG4gICAgICAvLyBzZXQgdHlwZSBhdHRyaWIgYW5kIGlkXG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZm9sZGVyLWVudHJ5Jyk7XG4gICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIGVudHJ5LmlkKTtcbiAgICAgIC8vIHNldCBpY29uXG4gICAgICBpY29uLnNyYyA9ICcuL05lb24tZ2gvYXNzZXRzL2ltZy9mb2xkZXItaWNvbi5zdmcnO1xuICAgICAgLy8gc2V0IGRyb3AgdGFyZ2V0IGF0dHJpYlxuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZHJvcC1pZCcsIGVudHJ5LmlkKTtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wLXRhcmdldCcpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndHJhc2gnOlxuICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2ZvbGRlci1lbnRyeScpO1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBlbnRyeS5pZCk7XG4gICAgICAvLyBzZXQgaWNvblxuICAgICAgaWNvbi5zcmMgPSAnLi9OZW9uLWdoL2Fzc2V0cy9pbWcvdHJhc2gtaWNvbi5zdmcnO1xuICAgICAgLy8gc2V0IGRyb3AgdGFyZ2V0IGF0dHJpYlxuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZHJvcC1pZCcsIGVudHJ5LmlkKTtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wLXRhcmdldCcpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmlsZSc6XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZmlsZS1lbnRyeScpO1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCAoZW50cnkgYXMgSUZpbGUpLmlkKTtcblxuICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGljb24gYW5kIGNsYXNzIHRvIGFkZCBkZXBlbmRpbmcgb24gZXhpc3RpbmcgbWV0YWRhdGFcbiAgICAgIGlmIChlbnRyeS5tZXRhZGF0YVsndHlwZSddID09PSAnbWFudXNjcmlwdCcpIHtcbiAgICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFudXNjcmlwdC1lbnRyeScpO1xuICAgICAgICAvLyBzZXQgaWNvblxuICAgICAgICBpY29uLnNyYyA9ICcuL05lb24tZ2gvYXNzZXRzL2ltZy9tYW51c2NyaXB0LWljb24uc3ZnJztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGVudHJ5Lm1ldGFkYXRhWyd0eXBlJ10gPT09ICdmb2xpbycpIHtcbiAgICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZm9saW8tZW50cnknKTtcbiAgICAgICAgLy8gc2V0IGljb25cbiAgICAgICAgaWNvbi5zcmMgPSAnLi9OZW9uLWdoL2Fzc2V0cy9pbWcvZm9saW8taWNvbi5zdmcnO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIHNldCBpY29uIGZvciBubyB0eXBlXG4gICAgICAgIGljb24uc3JjID0gJy4vTmVvbi1naC9hc3NldHMvaW1nL2ZvbGlvLWljb24uc3ZnJztcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpY29uKTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKG5hbWUpO1xuXG4gIHJldHVybiBjb250YWluZXI7XG59XG5cbi8qKlxuICogQWRkcyBkYmxjbGljayBldmVudCBsaXN0ZW5lciB0byB0aWxlIGVsZW1lbnQgYW5kIGFkZHMgc2hpZnQgc2VsZWN0aW9uIGJlaGF2aW91clxuICogXG4gKiBAcGFyYW0gaW5kZXggYXMgZGlzcGxheWVkIG9uIGRhc2hib2FyZCB0byB1c2VyXG4gKiBAcGFyYW0gZW50cnkgY29ycmVzcG9uZGluZyBlbnRyeSBpbiBjdXJyZW50IGZvbGRlclxuICogQHBhcmFtIHRpbGUgSFRNTERpdkVsZW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkVGlsZUV2ZW50TGlzdGVuZXIoaW5kZXg6IG51bWJlciwgZW50cnk6IElFbnRyeSwgdGlsZTogSFRNTERpdkVsZW1lbnQpIHtcbiAgLy8gZG91YmxlIGNsaWNrIGV2ZW50IGltbWVkaWF0ZWx5IG9wZW5zIGRvY3VtZW50XG4gIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGVudGVyRm9sZGVyKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHVwZGF0ZURhc2hib2FyZChbLi4uc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLCBlbnRyeSBhcyBJRm9sZGVyXSk7XG4gICAgfVxuICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBlbnRlckZvbGRlciwgZmFsc2UpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBvcGVuRG9jc0hhbmRsZXIsIGZhbHNlKTtcbiAgfVxuICBhZGRTaGlmdFNlbGVjdGlvbkxpc3RlbmVyKHRpbGUsIGluZGV4KTtcbiAgYWRkU3BlY2lmaWNDb250ZXh0TWVudUxpc3RlbmVycyh0aWxlLCBpbmRleCk7XG59XG5cbi8qKlxuICogQWRkIHNoaWZ0IHNlbGVjdGlvbiBiZWhhdmlvdXIgdG8gaHRtbCB0aWxlIGVsZW1lbnRcbiAqIFxuICogV2hlbiBubyBrZXlzIGFyZSBwcmVzc2VkOiBlcmFzZSBhbnkgcHJldmlvdXMgc2VsZWN0aW9ucyBhbmQgc2VsZWN0IG9ubHkgY3VycmVudCB0aWxlXG4gKiBXaGVuIG1ldGEga2V5IGlzIHByZXNzZWQ6IGFkZCBjdXJyZW50IHRpbGUgdG8gc2VsZWN0aW9uIGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkLCBlbHNlIHJlbW92ZSBmcm9tXG4gKiBzZWxlY3Rpb24uIFdoZW4gc2hpZnQga2V5IGlzIHByZXNzZWQ6IHNlbGVjdCBhbGwgdGlsZXMgYmV0d2VlbiBjdXJyZW50IHRpbGUgYW5kIHByZXZpb3VzIHRpbGVcbiAqIFxuICogV2hlbiB0aGVyZSBpcyBhIHByZXZpb3VzIHNlbGVjdGlvbiwgdGhlIHN0YXJ0IG9mIHRoZSBzaGlmdCBzZWxlY3Rpb24gaXMgdGhlIGxhc3Qgc2VsZWN0ZWQgdGlsZS4gXG4gKiBTaGlmdCBjbGlja2luZyBhZnRlciB3aWxsIGFkZCB0aGUgc2hpZnQgc2VsZWN0aW9uIHRvIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uXG4gKiBcbiAqIEBwYXJhbSB0aWxlIFxuICogQHBhcmFtIGluZGV4IFxuICovXG5mdW5jdGlvbiBhZGRTaGlmdFNlbGVjdGlvbkxpc3RlbmVyKHRpbGU6IEhUTUxEaXZFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihfZSkge1xuICAgIHNoaWZ0U2VsZWN0aW9uSGFuZGxlcihpbmRleCk7XG4gIH0sIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc2hpZnRTZWxlY3Rpb25IYW5kbGVyKGluZGV4KSB7XG4gIGlmICghbWV0YUtleUlzUHJlc3NlZCAmJiAhc2hpZnRLZXlJc1ByZXNzZWQpIHtcbiAgICB1bnNlbGVjdEFsbCgpO1xuICAgIHNlbGVjdChpbmRleCk7XG4gICAgc2hpZnRTZWxlY3Rpb24uc2V0U3RhcnQoaW5kZXgpO1xuICB9XG4gIGVsc2UgaWYgKG1ldGFLZXlJc1ByZXNzZWQpIHtcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0aW9uKClbaW5kZXhdKSB7XG4gICAgICB1bnNlbGVjdChpbmRleCk7XG4gICAgICBzaGlmdFNlbGVjdGlvbi5zZXRTdGFydChzdGF0ZS5nZXRTZWxlY3Rpb24oKS5sYXN0SW5kZXhPZih0cnVlKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0KGluZGV4KTtcbiAgICAgIHNoaWZ0U2VsZWN0aW9uLnNldFN0YXJ0KGluZGV4KTsgXG4gICAgfVxuICB9XG4gIGVsc2UgaWYgKHNoaWZ0S2V5SXNQcmVzc2VkKSB7XG4gICAgc2hpZnRTZWxlY3Rpb24uZ2V0UHJldlNlbGVjdGlvbigpLmZvckVhY2goKGlkeCkgPT4ge1xuICAgICAgdW5zZWxlY3QoaWR4KTtcbiAgICB9KTtcbiAgICBzaGlmdFNlbGVjdGlvbi5zZXRFbmQoaW5kZXgpO1xuICAgIHNoaWZ0U2VsZWN0aW9uLmdldFNlbGVjdGlvbihzdGF0ZS5nZXRTZWxlY3Rpb24oKSkuZm9yRWFjaCgoaWR4KSA9PiB7XG4gICAgICBzZWxlY3QoaWR4KTtcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCk7XG4gIHVwZGF0ZUZTQnV0dG9ucygpO1xufVxuLyoqXG4gKiBPcGVucyBjdXJyZW50IHNlbGVjdGlvbiBvZiBkb2N1bWVudHMgb24gZGFzaGJvYXJkLlxuICogXG4gKiBJZiBhIGZvbGRlciBpcyBzZWxlY3RlZCwgb3BlbnMgZm9sZGVyLlxuICogSWYgYSBmaWxlKHMpIGlzIHNlbGVjdGVkLCBvcGVucyBmaWxlKHMpLlxuICogSWYgYSBmb2xkZXIgYW5kIGZpbGUocykgYXJlIHNlbGVjdGVkLCBvcGVucyBmaWxlKHMpLlxuICovXG5mdW5jdGlvbiBvcGVuRG9jc0hhbmRsZXIoKSB7XG4gIGlmICghb3BlbkJ1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG5cbiAgLy8gT3BlbiBmb2xkZXIgaWYgb25seSBvbmUgZm9sZGVyIGlzIHNlbGVjdGVkXG4gIGlmIChzdGF0ZS5nZXRTZWxlY3RlZEZvbGRlcnMoKS5sZW5ndGggPT09IDEgfHwgc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG5ld1BhdGggPSBbLi4uc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLCBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXSBhcyBJRm9sZGVyXTtcbiAgICB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT3BlbiBhbGwgZmlsZXMsIGlnbm9yaW5nIGlmIGZvbGRlcnMgYXJlIHNlbGVjdGVkXG4gIHN0YXRlLmdldFNlbGVjdGVkRmlsZXMoKS5mb3JFYWNoKChlbnRyeTogSUVudHJ5KSA9PiBvcGVuRmlsZShlbnRyeSBhcyBJRmlsZSkpO1xuICBzaGlmdFNlbGVjdGlvbi5yZXNldCgpO1xuICB1bnNlbGVjdEFsbCgpO1xuICB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCk7XG59XG5cbi8qKlxuICogTW92ZSBjdXJyZW50IHNlbGVjdGlvbiBvZiBkb2N1bWVudHMgb24gZGFzaGJvYXJkIHRvIHRyYXNoLiBcbiAqIFxuICovXG5mdW5jdGlvbiByZW1vdmVEb2NzSGFuZGxlcigpIHtcbiAgaWYgKCFyZW1vdmVCdXR0b24uY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNlbGVjdGVkRW50cmllcyA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpO1xuICBjb25zdCBwYXJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgY29uc3QgdHJhc2hGb2xkZXIgPSBzdGF0ZS5nZXRUcmFzaEZvbGRlcigpO1xuXG4gIGNvbnN0IGRhdGV0aW1lID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpO1xuICBcbiAgZm9yIChsZXQgZW50cnkgb2Ygc2VsZWN0ZWRFbnRyaWVzKSB7XG4gICAgZW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuYWRkTWV0YWRhdGEoZW50cnksIHsgcmVtb3ZlZF9vbjogZGF0ZXRpbWUsIHJlY292ZXJfZm9sZGVyOiBzdGF0ZS5nZXRGb2xkZXJQYXRoTmFtZXMoKSB9KTtcbiAgfVxuXG4gIG1vdmVUb0ZvbGRlcihzZWxlY3RlZEVudHJpZXMsIHBhcmVudEZvbGRlciwgdHJhc2hGb2xkZXIpO1xufVxuXG5mdW5jdGlvbiBwdXRCYWNrRG9jc0hhbmRsZXIoKSB7XG4gIGNvbnN0IHNlbGVjdGVkRW50cmllcyA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpO1xuICBjb25zdCBwYXJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgXG4gIGZvciAobGV0IGVudHJ5IG9mIHNlbGVjdGVkRW50cmllcykge1xuICAgIGNvbnN0IGZvbGRlclBhdGhOYW1lcyA9IGVudHJ5Lm1ldGFkYXRhWydyZWNvdmVyX2ZvbGRlciddIGFzIHN0cmluZ1tdO1xuICAgIGNvbnN0IHRhcmdldEZvbGRlciA9IHN0YXRlLmdldEZvbGRlclBhdGhCeU5hbWVzKGZvbGRlclBhdGhOYW1lcyk7XG4gICAgaWYgKHRhcmdldEZvbGRlcikge1xuICAgICAgZW50cnkgPSBGaWxlU3lzdGVtVG9vbHMucmVtb3ZlTWV0YWRhdGEoZW50cnksIFsncmVtb3ZlZF9vbicsICdyZWNvdmVyX2ZvbGRlciddKTtcbiAgICAgIGNvbnN0IGRhdGVUaW1lUGF0dGVybiA9IC8gLSBcXGR7MSwyfVxcL1xcZHsxLDJ9XFwvXFxkezR9LCBcXGR7MSwyfTpcXGR7Mn06XFxkezJ9IFtBUE1hcG1dezJ9JC87XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlbmFtZSBlbmRzIHdpdGggdGhlIGRhdGUgdGltZSBwYXR0ZXJuXG4gICAgICBpZiAoZGF0ZVRpbWVQYXR0ZXJuLnRlc3QoZW50cnkubmFtZSkpIHtcbiAgICAgICAgZW50cnkubmFtZSA9IGVudHJ5Lm5hbWUucmVwbGFjZShkYXRlVGltZVBhdHRlcm4sICcnKTtcbiAgICAgIH1cbiAgICAgIG1vdmVUb0ZvbGRlcihbZW50cnldLCBwYXJlbnRGb2xkZXIsIHRhcmdldEZvbGRlcik7XG4gICAgfSAgICBcbiAgfVxufVxuXG4vKipcbiAqIERlbGV0ZSBhIGZpbGVcbiAqIFxuICogQHBhcmFtIGZpbGUgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZpbGVFbnRyeShmaWxlOiBJRmlsZSwgcGFyZW50Rm9sZGVyOiBJRm9sZGVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZGVsZXRlRG9jdW1lbnQoZmlsZS5pZClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgRmlsZVN5c3RlbVRvb2xzLnJlbW92ZUVudHJ5KGZpbGUsIHBhcmVudEZvbGRlcik7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHJlamVjdChmYWxzZSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxldGUgYSBmb2xkZXIgYW5kIGl0cyBjb250ZW50XG4gKiBcbiAqIEBwYXJhbSBmb2xkZXIgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZvbGRlckVudHJ5KGZvbGRlcjogSUZvbGRlciwgcGFyZW50Rm9sZGVyOiBJRm9sZGVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRlbGV0ZVByb21pc2VzID0gZm9sZGVyLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGVFbnRyeShjaGlsZCBhcyBJRmlsZSwgZm9sZGVyKTsgLy8gUGFzcyB0aGUgY3VycmVudCBmb2xkZXIgYXMgdGhlIHBhcmVudFxuICAgICAgfSBlbHNlIGlmIChjaGlsZC50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoY2hpbGQgYXMgSUZvbGRlciwgZm9sZGVyKTsgLy8gUGFzcyB0aGUgY3VycmVudCBmb2xkZXIgYXMgdGhlIHBhcmVudFxuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7IC8vIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCByZXNvbHZpbmcgZm9yIHNhZmV0eVxuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoZGVsZXRlUHJvbWlzZXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIEZpbGVTeXN0ZW1Ub29scy5yZW1vdmVFbnRyeShmb2xkZXIsIHBhcmVudEZvbGRlcik7IC8vIFVzZSB0aGUgcHJvdmlkZWQgcGFyZW50IGZvbGRlclxuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiByZXNvbHZlKGZhbHNlKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGV0ZXMgY3VycmVudCBzZWxlY3Rpb24gb2YgZG9jdW1lbnRzIG9uIGRhc2hib2FyZC4gXG4gKiBcbiAqIElmIGEgZm9sZGVyIGlzIHNlbGVjdGVkLCBkZWxldGVzIGZvbGRlci5cbiAqIElmIGEgZmlsZShzKSBpcyBzZWxlY3RlZCwgZGVsZXRlcyBmaWxlKHMpLlxuICogSWYgYSBmb2xkZXIgYW5kIGZpbGUocykgYXJlIHNlbGVjdGVkLCBkZWxldGVzIGFsbC5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlRG9jc0hhbmRsZXIoKSB7XG4gIGNvbnN0IGFsbEVudHJpZXMgPSBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKTtcblxuICAvLyBDcmVhdGUgYSBmb3JtYXR0ZWQgbGlzdCBvZiBmaWxlbmFtZXMgdG8gZGlzcGxheSBpbiBhbGVydCBtZXNzYWdlXG4gIGNvbnN0IGNyZWF0ZUxpc3QgPSAoZW50cnlBcnJheTogSUVudHJ5W10pID0+IGVudHJ5QXJyYXkubWFwKGVudHJ5ID0+IGAtICR7ZW50cnkubmFtZX0gKCR7ZW50cnkudHlwZX0pYCkuam9pbignXFxuJyk7XG4gIFxuICBjb25zdCBhbGVydE1lc3NhZ2UgPSBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZTpcXG4ke2NyZWF0ZUxpc3QoYWxsRW50cmllcyl9XFxuVGhpcyBhY3Rpb24gaXMgaXJyZXZlcnNpYmxlLmA7XG5cbiAgY29uc3QgaXNDb25maXJtZWQgPSB3aW5kb3cuY29uZmlybShhbGVydE1lc3NhZ2UpO1xuXG4gIGlmIChpc0NvbmZpcm1lZCkge1xuICAgIGNvbnN0IGRlbGV0ZVByb21pc2VzID0gYWxsRW50cmllcy5tYXAoZW50cnkgPT4ge1xuICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRmlsZUVudHJ5KGVudHJ5IGFzIElGaWxlLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoZW50cnkgYXMgSUZvbGRlciwgc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoZGVsZXRlUHJvbWlzZXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHVwZGF0ZURhc2hib2FyZChzdGF0ZS5nZXRGb2xkZXJQYXRoKCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCggZXJyID0+IGNvbnNvbGUuZGVidWcoJ2ZhaWxlZCB0byBkZWxldGUgZmlsZXM6ICcsIGVycikpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZW1wdHlUcmFzaEhhbmRsZXIoKSB7XG4gIGNvbnN0IHRyYXNoRm9sZGVyID0gc3RhdGUuZ2V0VHJhc2hGb2xkZXIoKTtcblxuICBpZiAoIXRyYXNoRm9sZGVyKSB7XG4gICAgY29uc29sZS5lcnJvcignVHJhc2ggZm9sZGVyIG5vdCBmb3VuZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhbGVydE1lc3NhZ2UgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBhbGwgdGhlIGZpbGVzIGluIFRyYXNoIEZvbGRlcj9cXG5UaGlzIGFjdGlvbiBpcyBpcnJldmVyc2libGUuJztcblxuICBjb25zdCBpc0NvbmZpcm1lZCA9IHdpbmRvdy5jb25maXJtKGFsZXJ0TWVzc2FnZSk7XG5cbiAgaWYgKGlzQ29uZmlybWVkKSB7XG5cbiAgICBjb25zdCBkZWxldGVQcm9taXNlcyA9IHRyYXNoRm9sZGVyLmNoaWxkcmVuLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGVFbnRyeShlbnRyeSBhcyBJRmlsZSwgdHJhc2hGb2xkZXIpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoZW50cnkgYXMgSUZvbGRlciwgdHJhc2hGb2xkZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsgLy8gU2hvdWxkbid0IGhhcHBlbiwgYnV0IHJlc29sdmluZyBmb3Igc2FmZXR5XG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChkZWxldGVQcm9taXNlcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gQWZ0ZXIgZGVsZXRpbmcgYWxsIGNvbnRlbnQsIHVwZGF0ZSB0aGUgZGFzaGJvYXJkXG4gICAgICAgIHVwZGF0ZURhc2hib2FyZChzdGF0ZS5nZXRGb2xkZXJQYXRoKCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmRlYnVnKCdmYWlsZWQgdG8gZGVsZXRlIGZpbGVzOiAnLCBlcnIpKTtcbiAgfVxufVxuXG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmlzaWJpbGl0eSBvZiBhY3Rpb24gYmFyIGJ1dHRvbnMgYmFzZWQgb24gY3VycmVudCBzZWxlY3Rpb25zXG4gKiBcbiAqIE5vdGU6IGJldHRlciBub3QgdG8gY2hhbmdlIHRoZSBvcmRlclxuICovXG5mdW5jdGlvbiB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCkge1xuICAvLyBpbnNpZGUgLi9TYW1wbGVzwqBvciBzZWxlY3RpbmcgdGhlIHNhbXBsZXMgZm9sZGVyXG4gIGlmIChzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10gfHwgXG4gICAgKHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdICYmIHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdLm1ldGFkYXRhWydpbW11dGFibGUnXSkpIHtcbiAgICB1cGxvYWREb2N1bWVudHNCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgbmV3Rm9sZGVyQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHJlbW92ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICBvcGVuQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVuQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIH1cbiAgfVxuICAvLyBpbnNpZGUgLi9UcmFzaFxuICBlbHNlIGlmIChzdGF0ZS5pc0luVHJhc2goKSkge1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cbiAgLy8gc2VsZWN0aW5nIHRoZSB0cmFzaCBmb2xkZXJcbiAgZWxzZSBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aCkge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH0gXG4gIC8vIHNlbGVjdGluZyBlbnRyaWVzXG4gIGVsc2UgaWYgKHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpLmxlbmd0aCkge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cbiAgLy8gbm90aGluZyBzZWxlY3RlZCwgbm90IGluIC4vU2FtcGxlcyBvciAuL1RyYXNoXG4gIGVsc2Uge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBuYXYgcGF0aCB3aXRoIGN1cnJlbnQgZm9sZGVyIHBhdGhcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTmF2UGF0aCgpOiB2b2lkIHtcbiAgbmF2UGF0aENvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAvLyBjcmVhdGUgbmF2IGVsZW1lbnRzIGFuZCBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gIGNvbnN0IG5hdkVsZW1lbnRzID0gc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLm1hcCgoZm9sZGVyLCBpZHgpID0+IHtcbiAgICBjb25zdCBuYXZTZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbmF2U2VjdGlvbi5jbGFzc0xpc3QuYWRkKCduYXYtcGF0aC1zZWN0aW9uJyk7XG4gICAgbmF2U2VjdGlvbi5pbm5lckhUTUwgPSBmb2xkZXIubmFtZTtcblxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuc2xpY2UoMCwgaWR4ICsgMSk7XG4gICAgbmF2U2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IGF3YWl0IHVwZGF0ZURhc2hib2FyZCh0YXJnZXRQYXRoKSk7XG4gICAgLy8gYWRkIGRyb3AgdGFyZ2V0IHRvIG1vdmUgZHJhZ2dlZCBlbGVtZW50IHRvIHRoZSBwcm9zcGVjdGl2ZSBmb2xkZXJzXG4gICAgYWRkRHJvcFRhcmdldExpc3RlbmVycyhuYXZTZWN0aW9uLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSwgdGFyZ2V0UGF0aC5hdCgtMSkpO1xuXG4gICAgcmV0dXJuIG5hdlNlY3Rpb247XG4gIH0pO1xuXG4gIC8vIGFkZCBuYXYgZWxlbWVudHMgdG8gbmF2IHBhdGggY29udGFpbmVyXG4gIG5hdkVsZW1lbnRzLmZvckVhY2goKG5hdkVsZW1lbnQsIGlkeCkgPT4ge1xuICAgIG5hdlBhdGhDb250YWluZXIuYXBwZW5kQ2hpbGQobmF2RWxlbWVudCk7XG4gICAgaWYgKGlkeCAhPT0gbmF2RWxlbWVudHMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3Qgc2VwZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzZXBlcmF0b3IuY2xhc3NMaXN0LmFkZCgnbmF2LXBhdGgtc2VwZXJhdG9yJyk7XG4gICAgICBzZXBlcmF0b3IuaW5uZXJIVE1MID0gJyAvICc7XG4gICAgICBuYXZQYXRoQ29udGFpbmVyLmFwcGVuZENoaWxkKHNlcGVyYXRvcik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBiYWNrIGJ1dHRvbiB3aXRoIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIGdvIGJhY2sgb25lIGZvbGRlciBpZiBwb3NzaWJsZVxuICovXG5mdW5jdGlvbiB1cGRhdGVCYWNrQnV0dG9uKCkge1xuICAvLyBFcmFzZSBwcmV2aW91cyBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgYnV0dG9uQ2xvbmUgPSBiYWNrQnV0dG9uLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgYmFja0J1dHRvbi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChidXR0b25DbG9uZSwgYmFja0J1dHRvbik7XG5cbiAgLy8gRGlzYWJsZSBiYWNrIGJ1dHRvbiBpZiBhdCByb290XG4gIGNvbnN0IGlzUm9vdCA9IHN0YXRlLmdldEZvbGRlclBhdGgoKS5sZW5ndGggPT09IDE7XG4gIGlmIChpc1Jvb3QpIHtcbiAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBidXR0b25DbG9uZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcbiAgfVxuICBlbHNlIHtcbiAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBidXR0b25DbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgYnV0dG9uQ2xvbmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVOYXZpZ2F0ZUJhY2spO1xuICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ29uZHJhZ2VudGVyJywgKCkgPT4gYnV0dG9uQ2xvbmUuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJykpO1xuICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ29uZHJhZ2xlYXZlJywgKCkgPT4gYnV0dG9uQ2xvbmUuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIGFkZERyb3BUYXJnZXRMaXN0ZW5lcnMoYnV0dG9uQ2xvbmUsIHN0YXRlLmdldFBhcmVudEZvbGRlcigpLCBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuYXQoLTIpKTtcbiAgfVxuICBiYWNrQnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVtcHR5QnV0dG9uKCkge1xuICAvLyBFcmFzZSBwcmV2aW91cyBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgYnV0dG9uQ2xvbmUgPSBlbXB0eUJ1dHRvbi5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGVtcHR5QnV0dG9uLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1dHRvbkNsb25lLCBlbXB0eUJ1dHRvbik7XG5cbiAgY29uc3QgcGFyZW50Rm9sZGVyID0gc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCk7XG5cbiAgLy8gRGlzcGxheSBpZiBpbiB0cmFzaFxuICBpZiAocGFyZW50Rm9sZGVyLnR5cGUgPT09ICd0cmFzaCcgfHwgc3RhdGUuaXNJblRyYXNoKCkpIHtcbiAgICBidXR0b25DbG9uZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgICAvLyBBY3RpdmF0ZSBidXR0b24gaWYgaGFzIGNvbnRlbnQgYW5kIG5vdCBzZWxlY3Rpbmcgd2hlbiBmaXJzdCBsZXZlbCBwYXJlbnQgaXMgdHJhc2hcbiAgICBpZiAocGFyZW50Rm9sZGVyLmNoaWxkcmVuLmxlbmd0aCAmJiAhc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoICYmIHBhcmVudEZvbGRlci50eXBlID09PSAndHJhc2gnKSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZW1wdHlUcmFzaEhhbmRsZXIpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIGJ1dHRvbiBpZiBubyBjb250ZW50XG4gICAgZWxzZSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAndHJ1ZScpO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBidXR0b25DbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG4gIGVtcHR5QnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlbGV0ZUJ1dHRvbigpIHtcbiAgLy8gRXJhc2UgcHJldmlvdXMgZXZlbnQgbGlzdGVuZXJzXG4gIGNvbnN0IGJ1dHRvbkNsb25lID0gZGVsZXRlQnV0dG9uLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgZGVsZXRlQnV0dG9uLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1dHRvbkNsb25lLCBkZWxldGVCdXR0b24pO1xuXG4gIGNvbnN0IHBhcmVudEZvbGRlciA9IHN0YXRlLmdldFBhcmVudEZvbGRlcigpO1xuICAvLyBEaXNwbGF5IGlmIGluIHRyYXNoXG4gIGlmIChwYXJlbnRGb2xkZXIudHlwZSA9PT0gJ3RyYXNoJyB8fCBzdGF0ZS5pc0luVHJhc2goKSkge1xuICAgIGJ1dHRvbkNsb25lLnN0eWxlLmRpc3BsYXkgPSAnJztcblxuICAgIC8vIEFkZCBsaXN0ZW5lciBpZiBzZWxlY3RzIGVudHJpZXNcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZGVsZXRlRG9jc0hhbmRsZXIpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIGlmIG5vdGhpbmcgc2VsZWN0ZWRcbiAgICBlbHNlIHtcbiAgICAgIGJ1dHRvbkNsb25lLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgYnV0dG9uQ2xvbmUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICd0cnVlJyk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGJ1dHRvbkNsb25lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbiAgZGVsZXRlQnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZTQnV0dG9ucygpIHtcbiAgdXBkYXRlQmFja0J1dHRvbigpO1xuICB1cGRhdGVFbXB0eUJ1dHRvbigpO1xuICB1cGRhdGVEZWxldGVCdXR0b24oKTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGNsaWNrIGV2ZW50IG9uIGJhY2sgYnV0dG9uIHRvIGdvIGJhY2sgb25lIGZvbGRlciBpZiBwb3NzaWJsZVxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVOYXZpZ2F0ZUJhY2soKSB7XG4gIGNvbnN0IG5ld1BhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuc2xpY2UoMCwgLTEpO1xuICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aCk7XG59XG5cbi8qKlxuICogQWRkIG5ldyBGb2xkZXIgdG8gY3VycmVudCBmb2xkZXIgYW5kIHJlZnJlc2ggZGFzaGJvYXJkXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUFkZEZvbGRlcihmb2xkZXJOYW1lOiBzdHJpbmcpIHtcbiAgLy8gY3JlYXRlIG5ldyBmb2xkZXIgZWxlbWVudFxuICBjb25zdCBuZXdGb2xkZXJUaWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5ld0ZvbGRlclRpbGUuY2xhc3NMaXN0LmFkZCgnZG9jdW1lbnQtZW50cnknKTtcbiAgbmV3Rm9sZGVyVGlsZS5jbGFzc0xpc3QuYWRkKCdmb2xkZXItZW50cnknKTtcbiAgbmV3Rm9sZGVyVGlsZS5zZXRBdHRyaWJ1dGUoJ2lkJywgJ25ldy1mb2xkZXInKTtcblxuICBjb25zdCBuZXdGb2xkZXIgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlRm9sZGVyKGZvbGRlck5hbWUpO1xuICBjb25zdCBzdWNjZWVkZWQgPSBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkobmV3Rm9sZGVyLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSk7XG4gIGlmIChzdWNjZWVkZWQpIHtcbiAgICBuZXdGb2xkZXJUaWxlLnNldEF0dHJpYnV0ZSgnaWQnLCBmb2xkZXJOYW1lKTtcbiAgICB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBuZXdGb2xkZXJUaWxlLnJlbW92ZSgpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmFtZXMgY3VycmVudCBzZWxlY3Rpb24gb2YgZG9jdW1lbnQgb24gZGFzaGJvYXJkLCB1cGRhdGluZyB0aGUgZGF0YWJhc2UgZm9yIGZpbGVzXG4gKiBcbiAqIEBwYXJhbSBlbnRyeSBJRW50cnkgdG8gcmVuYW1lXG4gKi9cbmZ1bmN0aW9uIHJlbmFtZUVudHJ5KGVudHJ5OiBJRW50cnksIG5ld05hbWU6IHN0cmluZykgeyAgXG4gIGNvbnN0IHN1Y2NlZWRlZCA9IEZpbGVTeXN0ZW1Ub29scy5yZW5hbWVFbnRyeShlbnRyeSwgc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCksIG5ld05hbWUpO1xuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgLy8gVXBkYXRlIGRhdGFiYXNlIGlmIGVudHJ5IGlzIGEgZmlsZVxuICAgIGlmIChlbnRyeS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBlbnRyeSBhcyBJRmlsZTtcbiAgICAgIHVwZGF0ZURvY05hbWUoZmlsZS5pZCwgbmV3TmFtZSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHVwZGF0ZURhc2hib2FyZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKipcbiAqIEdpdmVuIGFuIGVudHJ5IGlkLCByZXR1cm5zIHRoZSBlbnRyeSBmcm9tIHRoZSBjdXJyZW50IGZvbGRlclxuICogXG4gKiBAcGFyYW0gaWQgXG4gKiBAcmV0dXJucyBJRW50cnlcbiovXG5mdW5jdGlvbiBnZXRFbnRyeUJ5SWQoaWQ6IHN0cmluZyk6IElFbnRyeSB7XG4gIGNvbnN0IHRhcmdldEVudHJ5ID0gc3RhdGUuZ2V0RW50cmllcygpLmZpbmQoZW50cnkgPT4ge1xuICAgIHJldHVybiBlbnRyeS5pZCA9PT0gaWQ7XG4gIH0pO1xuICByZXR1cm4gdGFyZ2V0RW50cnk7XG59XG5cbi8qKlxuICogUmVmbGVjdHMgY2hhbmdlcyBpbiBmaWxlIHN5c3RlbSBpbiBkYXNoYm9hcmQgVUlcbiAqIFxuICogQHBhcmFtIG5ld1BhdGggSWYgcHJvdmlkZWQsIHVzZXMgdGhpcyBwYXRoIHRvIHVwZGF0ZSBkYXNoYm9hcmQuIE90aGVyd2lzZSwgdXNlcyBjdXJyZW50IHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aD86IElGb2xkZXJbXSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW5ld1BhdGgpIG5ld1BhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCk7XG4gIHN0YXRlLnNldEZvbGRlclBhdGgobmV3UGF0aCk7XG4gIGNvbnN0IGN1cnJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgLy8gY2xlYXIgY29udGVudCBhbmQgc2VsZWN0aW9uXG4gIGRvY3VtZW50c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgc2hpZnRTZWxlY3Rpb24ucmVzZXQoKTtcblxuICAvLyB1cGRhdGUgb3JkZXJlZCBpdGVtcyBmb3IgY3VycmVudCBmcy1jb250ZW50c1xuICBzdGF0ZS5zZXRFbnRyaWVzKGN1cnJlbnRGb2xkZXIuY2hpbGRyZW4pO1xuXG4gIC8vIHBvcHVsYXRlIGZvbGRlciBjb250ZW50c1xuICBjdXJyZW50Rm9sZGVyLmNoaWxkcmVuLmZvckVhY2goYXN5bmMgKGVudHJ5LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHRpbGUgPSBjcmVhdGVUaWxlKGVudHJ5KTtcbiAgICBkb2N1bWVudHNDb250YWluZXIuYXBwZW5kQ2hpbGQodGlsZSk7XG4gICAgYXdhaXQgYWRkVGlsZUV2ZW50TGlzdGVuZXIoaW5kZXgsIGVudHJ5LCB0aWxlKTtcbiAgfSk7IFxuXG4gIHVwZGF0ZUFjdGlvbkJhckJ1dHRvbnMoKTtcbiAgdXBkYXRlTmF2UGF0aCgpO1xuICB1cGRhdGVGU0J1dHRvbnMoKTtcblxuICBjb25zdCBpbmZvQmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby1iYWRnZScpO1xuICBpZiAoc3RhdGUuaXNJblRyYXNoKCkpIHtcbiAgICBpbmZvQmFkZ2UudGV4dENvbnRlbnQgPSAnRmlsZXMgd2lsbCBiZSBkZWxldGVkIGFmdGVyIDMwIGRheXMnO1xuICAgIGluZm9CYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyM5REIyQkYnO1xuICB9IGVsc2Uge1xuICAgIGluZm9CYWRnZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIGluZm9CYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7XG4gIH1cblxuICAvLyBhZGQgZHJhZyBhbmQgZHJvcCBsaXN0ZW5lcnMgZm9yIGN1cnJlbnQgZm9sZGVyIGNvbnRlbnRcbiAgY3VycmVudEZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IHRpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbnRyeS5pZCk7XG4gICAgYWRkRHJhZ1N0YXJ0TGlzdGVuZXIodGlsZSk7XG5cbiAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZvbGRlcicgfHwgZW50cnkudHlwZSA9PT0gJ3RyYXNoJykgeyBcbiAgICAgIGFkZERyb3BUYXJnZXRMaXN0ZW5lcnModGlsZSwgY3VycmVudEZvbGRlciwgZW50cnkgYXMgSUZvbGRlcik7XG4gICAgfVxuICB9KTtcbiAgXG4gIGZzbS5zZXRGaWxlU3lzdGVtKHN0YXRlLmdldEZvbGRlclBhdGgoKS5hdCgwKSk7XG59XG5cbmZ1bmN0aW9uIGFkZERyYWdTdGFydExpc3RlbmVyKGVsZW06IEVsZW1lbnQpIHtcbiAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcbiAgICBjdXJyZW50RHJhZ1RhcmdldCA9IGUudGFyZ2V0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRHJvcFRhcmdldExpc3RlbmVycyhlbGVtOiBFbGVtZW50LCBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLCBkZXN0aW5hdGlvbkZvbGRlcjogSUZvbGRlcikge1xuICAvKipcbiAgICAgKiBUaGUgZHJhZ2VudGVyIGFuZCBkcmFnb3ZlciBldmVudHMgbmVlZCB0byBiZSBvdmVycmlkZW4gaW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBkcmFnLWFuZC1kcm9wIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogUmVhZCBtb3JlIGF0OiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9EcmFnX2FuZF9Ecm9wX0FQSS9EcmFnX29wZXJhdGlvbnNcbiAgICAgKi9cbiAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlbGVtLmNsYXNzTGlzdC5hZGQoJ2RyYWdlbnRlcicpO1xuICB9KTsgICAgXG4gIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnZW50ZXInKTtcbiAgfSk7XG4gIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcblxuICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBjcmVhdGVIYW5kbGVEcm9wKGN1cnJlbnRGb2xkZXIsIGRlc3RpbmF0aW9uRm9sZGVyKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhhbmRsZURyb3AoY3VycmVudEZvbGRlcjogSUZvbGRlciwgZGVzdGluYXRpb25Gb2xkZXI6IElGb2xkZXIpIHtcbiAgcmV0dXJuIChlOiBFdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIGdldCB0aGUgSUQgb2YgdGhlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxuICAgIGNvbnN0IGRyYWdUYXJnZXRJRCA9ICg8SFRNTEVsZW1lbnQ+IGN1cnJlbnREcmFnVGFyZ2V0KS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICAvLyBVc2luZyBkcmFnVGFyZ2V0SUQsIGZpbmQgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIEZpbGUgYmVpbmcgZHJvcHBlZC5cbiAgICBjb25zdCBkcmFnRW50cnkgPSBnZXRFbnRyeUJ5SWQoZHJhZ1RhcmdldElEKTtcblxuICAgIC8vIElmIGZvbGRlciwgZGVzdGluYXRpb24sIGFuZCBmaWxlIHdlcmUgZm91bmQsIG1vdmUgdGhlIGZpbGUgaW50byB0aGUgZm9sZGVyLiBHcmVhdCBzdWNjZXNzIVxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGEgZm9sZGVyIGlzIG5vdCBiZWluZyBkcm9wcGVkIGludG8gdGhlIHNhbWUgZm9sZGVyLlxuICAgIGlmIChkcmFnRW50cnkgJiYgZHJhZ0VudHJ5ICE9PSBkZXN0aW5hdGlvbkZvbGRlcikge1xuICAgICAgbW92ZVRvRm9sZGVyKFtkcmFnRW50cnldLCBjdXJyZW50Rm9sZGVyLCBkZXN0aW5hdGlvbkZvbGRlcik7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgbW92ZWQgdG8gbmV3Rm9sZGVyLCBhbmQgaWYgc28sIG1vdmVzIGl0IGFuZCByZWZyZXNoZXMgZGFzaGJvYXJkLlxuICogXG4gKiBAcGFyYW0gZW50cnkgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHBhcmFtIG5ld0ZvbGRlciBcbiAqL1xuZnVuY3Rpb24gbW92ZVRvRm9sZGVyKGVudHJpZXM6IElFbnRyeVtdLCBwYXJlbnRGb2xkZXI6IElGb2xkZXIsIG5ld0ZvbGRlcjogSUZvbGRlcikge1xuICBjb25zdCBlcnJvck1lc3NhZ2VzID0gW107XG4gIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAvLyBIYW5kbGUgbmFtZSBjb25mbGljdHMgZm9yIHRyYXNoIGZvbGRlclxuICAgIGlmIChuZXdGb2xkZXIudHlwZSA9PT0gJ3RyYXNoJyAmJiBuZXdGb2xkZXIuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lKSkge1xuICAgICAgZW50cnkubmFtZSA9IHRyYXNoRk5Db25mbGljdEhhbmRsZXIoZW50cnkubmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gRmlsZVN5c3RlbVRvb2xzLmNhbk1vdmVFbnRyeShlbnRyeSwgcGFyZW50Rm9sZGVyLCBuZXdGb2xkZXIpO1xuICAgIGlmICghcmVzcG9uc2Uuc3VjY2VlZGVkKSBlcnJvck1lc3NhZ2VzLnB1c2gocmVzcG9uc2UuZXJyb3IpO1xuICAgIGVsc2UgRmlsZVN5c3RlbVRvb2xzLm1vdmVFbnRyeShlbnRyeSwgcGFyZW50Rm9sZGVyLCBuZXdGb2xkZXIpO1xuICB9KTtcbiAgXG4gIGVycm9yTWVzc2FnZXMuZmlsdGVyKChtc2csIGlkeCwgYXJyKSA9PiBhcnIuaW5kZXhPZihtc2cpID09PSBpZHgpO1xuICBpZiAoZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwKSB3aW5kb3cuYWxlcnQoZXJyb3JNZXNzYWdlcy5qb2luKCdcXG4nKSk7XG5cbiAgdXBkYXRlRGFzaGJvYXJkKCk7XG59XG5cbmZ1bmN0aW9uIHRyYXNoRk5Db25mbGljdEhhbmRsZXIoZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGV0aW1lID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpO1xuICByZXR1cm4gZmlsZW5hbWUgKyAnIC0gJyArIGRhdGV0aW1lO1xufVxuXG4vKipcbiAqIE9wZW5zIE1vdmUtVG8gbWVudSBtb2RhbCB3aW5kb3cgd2l0aCBVSSBmb3IgbW92aW5nIHNlbGVjdGVkIGVudHJpZXMgdG8gYSBuZXcgZm9sZGVyLlxuICovXG5mdW5jdGlvbiBvcGVuTW92ZVRvV2luZG93KCkge1xuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5NT1ZFX1RPKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRFbnRyaWVzID0gc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCk7XG4gIGNvbnN0IHBhcmVudEZvbGRlciA9IHN0YXRlLmdldFBhcmVudEZvbGRlcigpO1xuXG4gIC8vIENhbGxiYWNrIGZvciB3aGVuIHVzZXIgZG91YmxlLWNsaWNrcyBvbiBhIGZvbGRlciBhbmQgbW92ZXMgc2VsZWN0aW9uXG4gIGNvbnN0IG1vdmVUb0NhbGxiYWNrID0gKG5ld1BhcmVudEZvbGRlcjogSUZvbGRlcikgPT4ge1xuICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIG1vdmVUb0ZvbGRlcihzZWxlY3RlZEVudHJpZXMsIHBhcmVudEZvbGRlciwgbmV3UGFyZW50Rm9sZGVyKTtcbiAgfTtcblxuICBjb25zdCByb290VHJlZSA9IGdlbmVyYXRlUm9vdFRyZWUobW92ZVRvQ2FsbGJhY2spO1xuICBjb25zdCB0cmVlQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRyZWVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgndHJlZS1jb250YWluZXInKTtcbiAgdHJlZUNvbnRhaW5lci5hcHBlbmRDaGlsZChyb290VHJlZSk7XG5cbiAgY29uc3QgbW9kYWxDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1jb250YWluZXInKTtcbiAgbW9kYWxDb250YWluZXIuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwibW92ZS1tZW51LW1zZ1wiPkRvdWJsZS1jbGljayB0aGUgZm9sZGVyIHlvdSB3YW50IHRvIG1vdmUgeW91ciBpdGVtcyB0byE8L3NwYW4+JztcbiAgbW9kYWxDb250YWluZXIuYXBwZW5kQ2hpbGQodHJlZUNvbnRhaW5lcik7XG59XG5cbi8qKlxuICogT3BlbnMgTmV3IEZvbGRlciBtZW51IG1vZGFsIHdpbmRvdyB0aGF0IHByb21wdHMgZm9yIGEgbmFtZS5cbiAqIE9uIGNsaWNraW5nIHRoZSBDcmVhdGUgYnV0dG9uLCBjbG9zZXMgbW9kYWwgd2luZG93IGFuZCBjcmVhdGVzIG5ldyBmb2xkZXIuXG4gKi9cbmZ1bmN0aW9uIG9wZW5OZXdGb2xkZXJXaW5kb3coKSB7XG4gIGlmICghbmV3Rm9sZGVyQnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHJldHVybjtcblxuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgXG4gIGNvbnN0IGlucHV0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hib2FyZF9pbnB1dF9jb250YWluZXInKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgY29uc3QgY2FuY2VsQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbF9kYXNoYm9hcmQnKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgY29uc3QgY29uZmlybUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtX2Rhc2hib2FyZCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuXG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgaW5wdXQuaWQgPSAnZGFzaGJvYXJkX2lucHV0JztcbiAgaW5wdXQudHlwZSA9ICd0ZXh0JztcbiAgaW5wdXQucGxhY2Vob2xkZXIgPSAnVW50aXRsZWQgRm9sZGVyJztcbiAgaW5wdXQudmFsdWUgPSAnVW50aXRsZWQgRm9sZGVyJztcbiAgaW5wdXRDb250YWluZXIuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuXG4gIGlucHV0LnNlbGVjdCgpO1xuICBpbnB1dC5mb2N1cygpO1xuXG4gIGNhbmNlbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpKTtcbiAgY29uZmlybUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGNvbmZpcm1OZXdGb2xkZXJBY3Rpb24obW9kYWxXaW5kb3csIGlucHV0LnZhbHVlKSk7XG5cbiAgaW5wdXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgY29uZmlybU5ld0ZvbGRlckFjdGlvbihtb2RhbFdpbmRvdywgaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpcm1OZXdGb2xkZXJBY3Rpb24obW9kYWxXaW5kb3c6IE1vZGFsV2luZG93LCBmb2xkZXJOYW1lOiBzdHJpbmcpIHtcbiAgaWYgKCFuYW1lRXhpc3RzKGZvbGRlck5hbWUpKSB7XG4gICAgbW9kYWxXaW5kb3cuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgaGFuZGxlQWRkRm9sZGVyKGZvbGRlck5hbWUpO1xuICB9IFxuICBlbHNlIHtcbiAgICB3aW5kb3cuYWxlcnQoJ1RoZSBmb2xkZXIgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBmb2xkZXIhJyk7XG4gICAgb3Blbk5ld0ZvbGRlcldpbmRvdygpO1xuICB9XG59XG5cbi8qKlxuICogT3BlbnMgUmVuYW1lIG1lbnUgbW9kYWwgd2luZG93IHRoYXQgcHJvbXB0cyBmb3IgYSBuZXcgbmFtZS5cbiAqL1xuZnVuY3Rpb24gb3BlblJlbmFtZVdpbmRvdygpIHtcbiAgLy8gZ2VuZXJhdGUgbW9kYWwgd2luZG93XG4gIGNvbnN0IG1vZGFsV2luZG93ID0gbmV3IE1vZGFsV2luZG93KCk7XG4gIG1vZGFsV2luZG93LnNldE1vZGFsV2luZG93VmlldyhNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgY29uc3QgaW5wdXRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkX2lucHV0X2NvbnRhaW5lcicpIGFzIEhUTUxEaXZFbGVtZW50O1xuICBjb25zdCBjYW5jZWxCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FuY2VsX2Rhc2hib2FyZCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICBjb25zdCBjb25maXJtQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1fZGFzaGJvYXJkJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICBpbnB1dC5pZCA9ICdkYXNoYm9hcmRfaW5wdXQnO1xuICBpbnB1dC50eXBlID0gJ3RleHQnO1xuICBjb25zdCBwcmV2TmFtZSA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdLm5hbWU7XG4gIGlucHV0LnBsYWNlaG9sZGVyID0gcHJldk5hbWU7XG4gIGlucHV0LnZhbHVlID0gcHJldk5hbWU7XG4gIGlucHV0Q29udGFpbmVyLmFwcGVuZENoaWxkKGlucHV0KTtcblxuICBpbnB1dC5zZWxlY3QoKTtcbiAgaW5wdXQuZm9jdXMoKTtcblxuICBjYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKSk7XG4gIGNvbmZpcm1CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjb25maXJtUmVuYW1lQWN0aW9uKG1vZGFsV2luZG93LCBpbnB1dC52YWx1ZSwgcHJldk5hbWUpKTtcblxuICBpbnB1dENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICBjb25maXJtUmVuYW1lQWN0aW9uKG1vZGFsV2luZG93LCBpbnB1dC52YWx1ZSwgcHJldk5hbWUpO1xuICAgIH1cbiAgfSk7XG4gIFxufVxuXG4vLyBPbiBjb25maXJtYXRpb24sIGNsb3NlIG1vZGFsIHdpbmRvdyBhbmQgcmVuYW1lIGVudHJ5IChpZiBmaWxlLCBkYXRhYmFzZSBpcyB1cGRhdGVkKVxuZnVuY3Rpb24gY29uZmlybVJlbmFtZUFjdGlvbihtb2RhbFdpbmRvdzogTW9kYWxXaW5kb3csIG5ld05hbWU6IHN0cmluZywgcHJldk5hbWU6IHN0cmluZykge1xuICAvLyBjaGVjayBmb3IgZHVwbGljYXRlZCBuYW1lc1xuICBpZiAobmV3TmFtZSA9PT0gcHJldk5hbWUpIHtcbiAgICBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgfVxuICBlbHNlIHtcbiAgICBpZiAoIW5hbWVFeGlzdHMobmV3TmFtZSkpIHtcbiAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgICAgY29uc3QgZW50cnkgPSBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXTtcbiAgICAgIHJlbmFtZUVudHJ5KGVudHJ5LCBuZXdOYW1lKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB3aW5kb3cuYWxlcnQoJ1RoZSBmaWxlbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBmb2xkZXIhJyk7XG4gICAgICBvcGVuUmVuYW1lV2luZG93KCk7XG4gICAgfVxuICB9ICBcbn1cblxuZnVuY3Rpb24gbmFtZUV4aXN0cyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyZW50ID0gc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCk7XG4gIHJldHVybiBwYXJlbnQuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgZm9sZGVyIHRyZWUgc3RydWN0dXJlIGZvciBtb3ZlLXRvIG1lbnVcbiAqIFxuICogQHBhcmFtIGZvbGRlciBJRm9sZGVyIHRvIGdlbmVyYXRlIHRyZWUgc3RydWN0dXJlIGZvciBhbmQgYWxsIGl0cyBzdWJmb2xkZXJzXG4gKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdoZW4gdXNlciBkb3VibGUtY2xpY2tzIG9uIGEgZm9sZGVyIGFuZCBtb3ZlcyBzZWxlY3Rpb25cbiAqIEBwYXJhbSBkZWdyZWUgVGhlIGxldmVsIG9mIHN1YmZvbGRlcnMgZGVlcFxuICogQHJldHVybnMgTGlzdCBpdGVtIG5vZGVcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVGb2xkZXJUcmVlKGZvbGRlcjogSUZvbGRlciwgbW92ZVRvQ2FsbGJhY2s6IChuZXdQYXJlbnRGb2xkZXIgOklGb2xkZXIpID0+IHZvaWQsIGRlZ3JlZTogbnVtYmVyKTogSFRNTExJRWxlbWVudCB7XG5cbiAgY29uc3QgdHJlZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gIC8vIGNvbnRhaW5lciBmb3IgZm9sZGVyIG5hbWUgYW5kIGFycm93XG4gIGNvbnN0IGxpQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGxpQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3RyZWUtbGktY29udGFpbmVyJyk7XG5cbiAgLy8gRm9sZGVyIFRFWFQ6IGNsaWNrIHRvIHNlbGVjdCAoZm9yIFVYKSwgZG91YmxlIGNsaWNrIHRvIG1vdmUgaXRlbXMgdG8gZm9sZGVyXG4gIGNvbnN0IGZvbGRlck5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9sZGVyTmFtZS5jbGFzc0xpc3QuYWRkKCd0cmVlLW5hbWUnKTtcbiAgZm9sZGVyTmFtZS5pbm5lckhUTUwgPSBmb2xkZXIubmFtZTtcblxuICAvLyBPbiBzaW5nbGUgY2xpY2ssIGhpZ2hsaWdodC9zZWxlY3QgZm9sZGVyIG5hbWVcbiAgZm9sZGVyTmFtZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudHJlZS1uYW1lJykuZm9yRWFjaChlbGVtID0+IGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gICAgZm9sZGVyTmFtZS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICB9KTtcblxuICAvLyBPbiBkb3VibGUgY2xpY2ssIG1vdmUgc2VsZWN0ZWQgaXRlbXMgdG8gZm9sZGVyXG4gIGZvbGRlck5hbWUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XG4gICAgbW92ZVRvQ2FsbGJhY2soZm9sZGVyKTtcbiAgfSk7XG5cbiAgLy8gSWYgRm9sZGVyIGhhcyBubyBzdWJmb2xkZXJzLCByZXR1cm4gd2l0aG91dCBuZXN0ZWQgdWxcbiAgY29uc3QgaXNMZWFmID0gZm9sZGVyLmNoaWxkcmVuLmV2ZXJ5KGVudHJ5ID0+IGVudHJ5LnR5cGUgIT09ICdmb2xkZXInKTtcbiAgaWYgKGlzTGVhZikge1xuICAgIHRyZWUuYXBwZW5kQ2hpbGQobGlDb250YWluZXIpO1xuICAgIGxpQ29udGFpbmVyLmFwcGVuZENoaWxkKGZvbGRlck5hbWUpO1xuICAgIHJldHVybiB0cmVlO1xuICB9XG4gIC8vIE90aGVyd2lzZSBGb2xkZXIgaXMgbm90IGVtcHR5LCBtYWtlIHRyZWUgc3RydWN0dXJlXG5cbiAgLy8gVW5vcmRlcmVkIExJU1QgKGhpZGluZyBvciB1bmhpZGluZyBsaSlcbiAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuXG4gIC8vIEFSUk9XXG4gIGNvbnN0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGFycm93LmNsYXNzTGlzdC5hZGQoJ3RyZWUtYXJyb3cnKTtcbiAgYXJyb3cuaW5uZXJIVE1MID0gJ+KWtic7XG5cbiAgLy8gaWYgbW9yZSB0aGFuIC4uLiBzdWJmb2xkZXJzIGRvd24sIGhpZGUgYnkgZGVmYXVsdFxuICBpZiAoZGVncmVlIDwgMikgdWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGlmIChkZWdyZWUgPCAyKSBhcnJvdy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgXG4gIGFycm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGFycm93LmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpO1xuICAgIHVsLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpO1xuICB9KTtcblxuICB0cmVlLmFwcGVuZENoaWxkKGxpQ29udGFpbmVyKTtcbiAgbGlDb250YWluZXIuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICBsaUNvbnRhaW5lci5hcHBlbmRDaGlsZChmb2xkZXJOYW1lKTtcbiAgdHJlZS5hcHBlbmRDaGlsZCh1bCk7XG5cbiAgLy8gQXBwZW5kIGZvbGRlciBjb250ZW50c1xuICBmb2xkZXIuY2hpbGRyZW4uZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZvbGRlcicpIHtcbiAgICAgIGNvbnN0IGZvbGRlclRyZWUgPSBnZW5lcmF0ZUZvbGRlclRyZWUoZW50cnkgYXMgSUZvbGRlciwgbW92ZVRvQ2FsbGJhY2ssIGRlZ3JlZSArIDEpO1xuICAgICAgdWwuYXBwZW5kQ2hpbGQoZm9sZGVyVHJlZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGVudGlyZSBmaWxlIHN5c3RlbSBmb2xkZXIgdHJlZSBmb3IgbW92ZS10byBtZW51XG4gKiBcbiAqIEBwYXJhbSBtb3ZlVG9DYWxsYmFjayBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiB1c2VyIGRvdWJsZS1jbGlja3Mgb24gYSBmb2xkZXIgYW5kIG1vdmVzIHNlbGVjdGlvblxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUm9vdFRyZWUobW92ZVRvQ2FsbGJhY2s6IChuZXdQYXJlbnRGb2xkZXIgOklGb2xkZXIpID0+IHZvaWQpOiBIVE1MVUxpc3RFbGVtZW50IHtcbiAgY29uc3Qgcm9vdFRyZWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICByb290VHJlZS5pZCA9ICd0cmVlLXJvb3QnO1xuICByb290VHJlZS5hcHBlbmRDaGlsZChnZW5lcmF0ZUZvbGRlclRyZWUoc3RhdGUucm9vdCgpLCBtb3ZlVG9DYWxsYmFjaywgMCkpO1xuICByZXR1cm4gcm9vdFRyZWU7XG59XG5cbi8qKlxuICogRGlzcGxheXMgZGFzaGJvYXJkIGNvbnRleHQgbWVudSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IFxuICogXG4gKiBAcGFyYW0gdmlldyBjb250ZXh0IG1lbnUgdmlldyAoZGV0ZXJtaW5lcyBjb250ZW50IG9mIGNvbnRleHQgbWVudSlcbiAqL1xuZnVuY3Rpb24gc2hvd0NvbnRleHRNZW51KHZpZXc6IHN0cmluZywgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpIHtcblxuICBzd2l0Y2ggKHZpZXcpIHtcbiAgICAvLyBDb250ZXh0IG1lbnUgb3B0aW9ucyB3aGVuIGZpbGVzL2ZvbGRlcnMgYXJlIHJpZ2h0LWNsaWNrZWRcbiAgICBjYXNlICdzZWxlY3Rpb24tb3B0aW9ucyc6XG5cbiAgICAgIC8vIE5lZWQgdG8gZGV0ZXJtaW5lIHNlbGVjdGlvbiBjYXRlZ29yeSBiZWZvcmUgZGlzcGxheWluZyBvcHRpb25zXG4gICAgICBjb25zdCBudW1iZXJPZlNlbGVjdGVkRmlsZXMgPSBzdGF0ZS5nZXRTZWxlY3RlZEZpbGVzKCkubGVuZ3RoO1xuICAgICAgY29uc3QgbnVtYmVyT2ZTZWxlY3RlZEZvbGRlcnMgPSBzdGF0ZS5nZXRTZWxlY3RlZEZvbGRlcnMoKS5sZW5ndGg7XG4gICAgICBjb25zdCBzZWxlY3RlZFRyYXNoID0gc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aDtcblxuICAgICAgLyoqXG4gICAgICAgKiBDb250ZXh0IG1lbnUgb3B0aW9ucyBjb25kaXRpb25zOlxuICAgICAgICogICAgMSkgMSBmaWxlIC0+IG9wZW4sIG1vdmUgdG8gdHJhc2gsIG1vdmVcbiAgICAgICAqICAgIDIpIDIrIGZpbGVzIC0+IG9wZW4sIG1vdmUgdG8gdHJhc2gsIG1vdmVcbiAgICAgICAqICAgIDMpIGZpbGUocykgKyBmb2xkZXIocykgLT4gbW92ZSB0byB0cmFzaCwgbW92ZVxuICAgICAgICogICAgNCkgMSBmb2xkZXIgLT4gb3BlbiwgbW92ZSB0byB0cmFzaCwgbW92ZVxuICAgICAgICogICAgNSkgMisgZm9sZGVycyAtPiBtb3ZlIHRvIHRyYXNoLCBtb3ZlXG4gICAgICAgKiAgICA2KSB0cmFzaCAtPiBlbXB0eSB0cmFzaFxuICAgICAgICogICAgNykgZW50cnkgaW4gdHJhc2ggLT4gcHV0IGJhY2ssIGRlbGV0ZVxuICAgICAgICovXG5cblxuICAgICAgLy8gdHJhc2hcbiAgICAgIGlmICghbnVtYmVyT2ZTZWxlY3RlZEZpbGVzICYmICFudW1iZXJPZlNlbGVjdGVkRm9sZGVycyAmJiBzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50LnRyYXNoRm9sZGVyT3B0aW9ucztcbiAgICAgICAgc2V0Q29udGV4dE1lbnVJdGVtc0V2ZW50TGlzdGVuZXJzKCd0cmFzaC1mb2xkZXItb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLmxlbmd0aCA+IDEgJiYgc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLmF0KDEpLm5hbWUgPT0gJ1RyYXNoJykge1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC50cmFzaEVudHJ5T3B0aW9ucztcbiAgICAgICAgc2V0Q29udGV4dE1lbnVJdGVtc0V2ZW50TGlzdGVuZXJzKCd0cmFzaC1lbnRyeS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyAxIGZpbGVcbiAgICAgIGVsc2UgaWYgKG51bWJlck9mU2VsZWN0ZWRGaWxlcyA9PT0gMSAmJiAhbnVtYmVyT2ZTZWxlY3RlZEZvbGRlcnMgJiYgIXNlbGVjdGVkVHJhc2gpIHtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50V3JhcHBlci5pbm5lckhUTUwgPSBjb250ZXh0TWVudUNvbnRlbnQuc2luZ2xlRmlsZU9wdGlvbnM7XG4gICAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnc2luZ2xlLWZpbGUtb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgLy8gMisgZmlsZXNcbiAgICAgIGVsc2UgaWYgKG51bWJlck9mU2VsZWN0ZWRGaWxlcyA+IDEgJiYgIW51bWJlck9mU2VsZWN0ZWRGb2xkZXJzICYmICFzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50Lm11bHRpRmlsZU9wdGlvbnM7XG4gICAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnbXVsdGktZmlsZS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyBmaWxlKHMpICsgZm9sZGVyKHMpXG4gICAgICBlbHNlIGlmIChudW1iZXJPZlNlbGVjdGVkRmlsZXMgPj0gMSAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA+PSAxICYmICFzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50LmZvbGRlckFuZEZpbGVPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ2ZvbGRlci1hbmQtZmlsZS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyAxIGZvbGRlclxuICAgICAgZWxzZSBpZiAoIW51bWJlck9mU2VsZWN0ZWRGaWxlcyAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA9PT0gMSAmJiAhc2VsZWN0ZWRUcmFzaCkge1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC5zaW5nbGVGb2xkZXJPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ3NpbmdsZS1mb2xkZXItb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgLy8gMisgZm9sZGVyc1xuICAgICAgZWxzZSBpZiAoIW51bWJlck9mU2VsZWN0ZWRGaWxlcyAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA+IDEgJiYgIXNlbGVjdGVkVHJhc2gpIHtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50V3JhcHBlci5pbm5lckhUTUwgPSBjb250ZXh0TWVudUNvbnRlbnQubXVsdGlGb2xkZXJPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ211bHRpLWZvbGRlci1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIC8vIERlZmF1bHQgY29udGV4dCBtZW51IChyaWdoLWNsaWNraW5nIG9uIGRhc2hib2FyZCBiYWNrZ3JvdW5kKVxuICAgIGRlZmF1bHQ6XG4gICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC5kZWZhdWx0T3B0aW9ucztcbiAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnZGVmYXVsdCcpO1xuICB9XG5cbiAgLy8gZGlzYWJsZSBlZGl0b3IgbWVudSBmb3IgdGhlIHNhbXBsZXMgZm9sZGVyIGFuZCB0cmFzaFxuICBpZihzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10gfHwgXG4gIChzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXSAmJiBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10pIHx8XG4gIHN0YXRlLmlzSW5UcmFzaCgpKSB7XG4gICAgY29uc3QgZGVsZXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NtLXJlbW92ZS1idG4nKTtcbiAgICBjb25zdCByZW5hbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tcmVuYW1lLWJ0bicpO1xuICAgIGNvbnN0IG1vdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tbW92ZS1idG4nKTtcbiAgICBjb25zdCB1cGRhdGVEb2NCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tdXBsb2FkLWRvYy1idG4nKTtcbiAgICBjb25zdCBuZXdGb2xkZXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tbmV3LWZvbGRlci1idG4nKTtcblxuICAgIGlmIChkZWxldGVCdG4pIHtcbiAgICAgIGRlbGV0ZUJ0bi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgICBpZiAocmVuYW1lQnRuKSB7XG4gICAgICByZW5hbWVCdG4uY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKG1vdmVCdG4pIHtcbiAgICAgIG1vdmVCdG4uY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZURvY0J0bikge1xuICAgICAgdXBkYXRlRG9jQnRuLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgfVxuICAgIGlmIChuZXdGb2xkZXJCdG4pIHtcbiAgICAgIG5ld0ZvbGRlckJ0bi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHVzZXIncyBtb3VzZVxuICBjb250ZXh0TWVudS5zdHlsZS5sZWZ0ID0gYCR7Y2xpZW50WH1weGA7XG4gIGNvbnRleHRNZW51LnN0eWxlLnRvcCA9IGAke2NsaWVudFl9cHhgO1xuXG4gIC8vIGRpc3BsYXkgY29udGV4dCBtZW51XG4gIGNvbnRleHRNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xufVxuXG5cbi8qKlxuICogU2V0IGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG1lbnUgaXRlbXMgaW4gYSBwYXJ0aWN1bGFyIGNvbnRleHQgbWVudS5cbiAqIFxuICogQHBhcmFtIHZpZXcgVGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgbWVudSB2aWV3IHRoYXQgaXMgYmVpbmcgZGlzcGxheWVkLlxuICovXG5mdW5jdGlvbiBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnModmlldzogc3RyaW5nKSB7XG4gIC8vIEFsbCB0aGUgYnV0dG9ucyB0aGF0IHdpbGwgaGF2ZSBldmVudHMgYXR0YWNoZWQgdG8gdGhlbSBoYXZlIHRoZSBzYW1lIGNsYXNzbmFtZS5cbiAgY29uc3QgYnRuQ2xhc3NuYW1lID0gJ2NvbnRleHQtbWVudS1pdGVtLXdyYXBwZXInO1xuXG4gIHN3aXRjaCAodmlldykge1xuXG4gICAgY2FzZSAnc2luZ2xlLWZpbGUtb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIlJlbmFtZVwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1yZW5hbWUtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5SZW5hbWVXaW5kb3coKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpOyAgIFxuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ211bHRpLWZpbGUtb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7ICAgICAgXG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9sZGVyLWFuZC1maWxlLW9wdGlvbnMnOlxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ3NpbmdsZS1mb2xkZXItb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIlJlbmFtZVwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1yZW5hbWUtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5SZW5hbWVXaW5kb3coKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7ICAgICAgXG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbXVsdGktZm9sZGVyLW9wdGlvbnMnOlxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ3RyYXNoLWZvbGRlci1vcHRpb25zJzpcbiAgICAgIC8vIFwiRW1wdHkgVHJhc2hcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tZW1wdHktdHJhc2gtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIGVtcHR5VHJhc2hIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0cmFzaC1lbnRyeS1vcHRpb25zJzpcbiAgICAgIC8vIFwiUHV0IEJhY2tcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tcmVjb3Zlci1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcHV0QmFja0RvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJEZWxldGVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tZGVsZXRlLWJ0bmApLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKF9lKSA9PiB7XG4gICAgICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICBkZWxldGVEb2NzSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFwiVXBsb2FkIGRvY3VtZW50XCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXVwbG9hZC1kb2MtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5VcGxvYWRBcmVhSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFwiTmV3IGZvbGRlclwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1uZXctZm9sZGVyLWJ0bmApLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKF9lKSA9PiB7XG4gICAgICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICBvcGVuTmV3Rm9sZGVyV2luZG93KCk7XG4gICAgICB9KTtcblxuICB9XG5cbn1cblxuXG4vKipcbiAqIEluaXRpYWxpemUgZGFzaGJvYXJkIGNvbnRleHQgbWVudSAocmlnaHQgY2xpY2sgbWVudSkuXG4gKiBUaGlzIHdpbGwgc2V0IHVwIGFsbCBuZWNlc3NhcnkgZXZlbnQgbGlzdGVuZXJzIGFzIHdlbGwgYXNcbiAqIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbnRleHQgbWVudSwgd2hpY2hcbiAqIG1heSBjaGFuZ2UgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSB1c2VyIHJpZ2h0LWNsaWNrcyAoZmlsZSwgZmlsZXMsIGZvbGRlciwgYmFja2dyb3VuZCwgZXRjLilcbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZURlZmF1bHRDb250ZXh0TWVudSgpIHtcblxuICAvLyByaWdodC1jbGljayBvbiBkYXNoYm9hcmQgYmFja2dyb3VuZFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFpbi1zZWN0aW9uJykuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIHVuc2VsZWN0QWxsKCk7XG5cbiAgICBzaG93Q29udGV4dE1lbnUoXG4gICAgICAnZGVmYXVsdCcsIFxuICAgICAgKDxNb3VzZUV2ZW50PiBlKS5jbGllbnRYLCBcbiAgICAgICg8TW91c2VFdmVudD4gZSkuY2xpZW50WVxuICAgICk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tYWluLXNlY3Rpb24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZCBsaXN0ZW5lcnMgZm9yIHNwZWNpZmljIGNvbnRleHQgbWVudXMuXG4gKiBTcGVjaWZpYyBjb250ZXh0IG1lbnVzIGFwcGVhciB3aGVuIHVzZXIgcmlnaHQtY2xpY2tzIG9uIHNlbGVjdGVkIGZpbGVzL2ZvbGRlcnMuXG4gKiBUaGUgYWN0dWFsIG1lbnUgdGhhdCBpcyBzaG93biBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHNlbGVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gYWRkU3BlY2lmaWNDb250ZXh0TWVudUxpc3RlbmVycyh0aWxlLCBpbmRleCkge1xuXG4gIC8vIHJpZ2h0LWNsaWNrIG9uIGZvbGRlciBpdGVtIChmaWxlIG9yIGZvbGRlcilcbiAgdGlsZS5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlKSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAocmlnaHRDbGlja2VkIHx8IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdW5zZWxlY3RBbGwoKTtcbiAgICB9XG5cbiAgICAvLyBzZWxlY3RcbiAgICBzZWxlY3QoaW5kZXgpO1xuXG4gICAgc2hvd0NvbnRleHRNZW51KFxuICAgICAgJ3NlbGVjdGlvbi1vcHRpb25zJywgXG4gICAgICAoPE1vdXNlRXZlbnQ+IGUpLmNsaWVudFgsIFxuICAgICAgKDxNb3VzZUV2ZW50PiBlKS5jbGllbnRZXG4gICAgKTtcbiAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICByaWdodENsaWNrZWQgPSB0cnVlO1xuICB9KTtcbiAgICBcbiAgLy8gaGlkZSBjb250ZXh0IG1lbnUgaWYgdXNlciBjbGlja3MgYXdheVxuICBtYWluU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKHJpZ2h0Q2xpY2tlZCkge1xuICAgICAgbGV0IGNsaWNrZWRFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY3VtZW50LWVudHJ5JykpIHtcbiAgICAgICAgY2xpY2tlZEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIHJpZ2h0Q2xpY2tlZCA9IGZhbHNlO1xuICAgICAgaWYgKCFjbGlja2VkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY3VtZW50LWVudHJ5JykpIHtcbiAgICAgICAgLy8gaWYgY2xpY2tzIG9uIGJsYW5rIFxuICAgICAgICB1bnNlbGVjdEFsbCgpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIGlmIGNsaWNrcyBvbiBhIGZpbGUvZm9sZGVyLCBzZWxlY3QgaXRcbiAgICAgICAgY29uc3QgY2xpY2tlZEVudHJ5ID0gZ2V0RW50cnlCeUlkKGNsaWNrZWRFbGVtZW50LmlkKTtcbiAgICAgICAgc2hpZnRTZWxlY3Rpb25IYW5kbGVyKHN0YXRlLmdldEluZGV4QnlFbnRyeU5hbWUoY2xpY2tlZEVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgVHJhc2ggZm9sZGVyIGJ5IGRlbGV0aW5nIGVudHJpZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgMzAgZGF5cyBhZ29cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVHJhc2gocm9vdDogSUZvbGRlcik6IHZvaWQge1xuICBpZiAoIXN0YXRlLmdldFRyYXNoRm9sZGVyKCkpIHtcbiAgICBmc20ubmV3VHJhc2gocm9vdCk7XG4gIH1cbiAgY29uc3QgdHJhc2hGb2xkZXIgPSBzdGF0ZS5nZXRUcmFzaEZvbGRlcigpO1xuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHRoaXJ0eURheXNBZ28gPSBuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRUaW1lKCkgLSAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDApOyAvLyAzMCBkYXlzIGluIG1pbGxpc2Vjb25kc1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhbiBlbnRyeSB3YXMgZGVsZXRlZCAzMCBkYXlzIGFnb1xuICBjb25zdCB0b0RlbGV0ZSA9IChlbnRyeTogSUVudHJ5KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKGVudHJ5Lm1ldGFkYXRhICYmIGVudHJ5Lm1ldGFkYXRhWydyZW1vdmVkX29uJ10pIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShlbnRyeS5tZXRhZGF0YVsncmVtb3ZlZF9vbiddIGFzIHN0cmluZyk7XG4gICAgICByZXR1cm4gZGF0ZSA8PSB0aGlydHlEYXlzQWdvO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBlbnRyaWVzIGluIHRoZSBUcmFzaFxuICB0cmFzaEZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGlmICh0b0RlbGV0ZShlbnRyeSkpIHtcbiAgICAgIC8vIERlbGV0ZSBlbnRyeSBpZiBkZWxldGVkIDMwIGRheXMgYWdvXG4gICAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgIGRlbGV0ZUZpbGVFbnRyeShlbnRyeSBhcyBJRmlsZSwgdHJhc2hGb2xkZXIpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICBkZWxldGVGb2xkZXJFbnRyeShlbnRyeSBhcyBJRm9sZGVyLCB0cmFzaEZvbGRlcik7IFxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTG9hZHMgcm9vdCBmb2xkZXIgaW50byBkYXNoYm9hcmQgb24gc3RhcnR1cC4gXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRGFzaGJvYXJkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb290ID0gYXdhaXQgZnNtLmdldFJvb3QoKTtcbiAgc3RhdGUucm9vdChyb290KTtcbiAgdXBkYXRlVHJhc2gocm9vdCk7XG4gIHVwZGF0ZURhc2hib2FyZChbcm9vdF0pO1xuICBpbml0aWFsaXplRGVmYXVsdENvbnRleHRNZW51KCk7XG59OyIsImltcG9ydCB7IGxvYWREYXNoYm9hcmQgfSBmcm9tICcuLi8uLi9zcmMvRGFzaGJvYXJkL0Rhc2hib2FyZCc7XG5cbmxvYWREYXNoYm9hcmQoKTtcbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNob21lLWxpbmsnKT8uc2V0QXR0cmlidXRlKCdocmVmJywgX19MSU5LX0xPQ0FUSU9OX18pOyIsImV4cG9ydCBlbnVtIEVudHJ5VHlwZSB7XG4gIEZvbGRlciA9ICdmb2xkZXInLFxuICBUcmFzaCA9ICd0cmFzaCcsXG4gIEZpbGUgPSAnZmlsZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW50cnkge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IEVudHJ5VHlwZTtcbiAgaWQ6IHN0cmluZztcbiAgY2hpbGRyZW46IElFbnRyeVtdO1xuICBtZXRhZGF0YTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvbGRlciBleHRlbmRzIElFbnRyeSB7XG4gIHR5cGU6IEVudHJ5VHlwZS5Gb2xkZXIgfCBFbnRyeVR5cGUuVHJhc2g7XG4gIGlkOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBJRW50cnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRmlsZSBleHRlbmRzIElFbnRyeSB7XG4gIHR5cGU6IEVudHJ5VHlwZS5GaWxlXG4gIGlkOiBzdHJpbmc7XG59IiwiaW1wb3J0IHsgRW50cnlUeXBlLCBJRW50cnksIElGb2xkZXIsIElGaWxlIH0gZnJvbSAnLic7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tICcuLi8uLi91dGlscy9yYW5kb20nO1xuXG4vKlxuKiAgIEZpbGUgU3lzdGVtIEZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGNyZWF0ZSwgbW92ZSwgYW5kIGRlbGV0ZSBmaWxlIHN5c3RlbSBlbnRyaWVzXG4qICAgRG9lcyBub3QgZGVwZW5kIG9uIHN0YXRlIFxuKi9cblxuaW50ZXJmYWNlIHJlc3BvbnNlUHJvcCB7XG4gIHN1Y2NlZWRlZDogYm9vbGVhbixcbiAgZXJyb3I6IHN0cmluZyxcbn1cblxuY29uc3QgY3JlYXRlRW50cnkgPSAobmFtZTogc3RyaW5nLCB0eXBlOiBFbnRyeVR5cGUsIGlkOiBzdHJpbmcsIGNoaWxkcmVuPzogSUVudHJ5W10pOiBJRW50cnkgPT4ge1xuICBjb25zdCBtZXRhZGF0YSA9IHt9O1xuICBpZiAodHlwZSA9PT0gRW50cnlUeXBlLkZpbGUpIHJldHVybiB7IG5hbWUsIHR5cGUsIGlkLCBtZXRhZGF0YSB9IGFzIElFbnRyeTtcbiAgZWxzZSByZXR1cm4geyBuYW1lLCB0eXBlLCBpZCwgY2hpbGRyZW4sIG1ldGFkYXRhIH0gYXMgSUVudHJ5O1xufTtcblxuY29uc3QgY3JlYXRlRm9sZGVyID0gKG5hbWU6IHN0cmluZyk6IElGb2xkZXIgPT4ge1xuICByZXR1cm4gY3JlYXRlRW50cnkobmFtZSwgRW50cnlUeXBlLkZvbGRlciwgdXVpZHY0KCksIFtdKSBhcyBJRm9sZGVyO1xufTtcblxuY29uc3QgY3JlYXRlVHJhc2ggPSAobmFtZTogc3RyaW5nKTogSUZvbGRlciA9PiB7XG4gIHJldHVybiBjcmVhdGVFbnRyeShuYW1lLCBFbnRyeVR5cGUuVHJhc2gsIHV1aWR2NCgpLCBbXSkgYXMgSUZvbGRlcjtcbn07XG5cbmNvbnN0IGNyZWF0ZUZpbGUgPSAobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogSUZpbGUgPT4ge1xuICByZXR1cm4gY3JlYXRlRW50cnkobmFtZSwgRW50cnlUeXBlLkZpbGUsIGlkKSBhcyBJRmlsZTtcbn07XG5cbmZ1bmN0aW9uIGFkZE1ldGFkYXRhKGVudHJ5OiBJRW50cnksIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IElFbnRyeSB7XG4gIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBlbnRyeS5tZXRhZGF0YVtrZXldID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gZW50cnk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU1ldGFkYXRhKGVudHJ5OiBJRW50cnksIGtleXM6IHN0cmluZ1tdKTogSUVudHJ5IHtcbiAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBkZWxldGUgZW50cnkubWV0YWRhdGFba2V5XTtcbiAgfSk7XG4gIHJldHVybiBlbnRyeTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZW50cnkgY2FuIGJlIGFkZGVkIHRvIHBhcmVudCBmb2xkZXJcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yOiBzdHJpbmcgfVxuICovXG5jb25zdCBjYW5BZGRFbnRyeSA9IChlbnRyeTogSUVudHJ5LCBwYXJlbnQ6IElGb2xkZXIpOiByZXNwb25zZVByb3AgPT4ge1xuICBjb25zdCBuYW1lRXhpc3RzID0gcGFyZW50LmNoaWxkcmVuLnNvbWUoKGUpID0+IGUubmFtZSA9PT0gZW50cnkubmFtZSk7XG4gIGNvbnN0IGlzSW1tdXRhYmxlID0gcGFyZW50Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcblxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAobmFtZUV4aXN0cykgICAgICAgcmV0dXJuT2JqLmVycm9yID0gYER1cGxpY2F0ZSBuYW1lOiAke2VudHJ5Lm5hbWV9IGFscmVhZHkgZXhpc3RzIGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlKSAgcmV0dXJuT2JqLmVycm9yID0gYCR7cGFyZW50Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuXG4gIHJldHVybiByZXR1cm5PYmo7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHBhcmVudCBmb2xkZXJcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yPzogc3RyaW5nIH1cbiAqL1xuY29uc3QgY2FuUmVtb3ZlRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyKTogcmVzcG9uc2VQcm9wID0+IHtcbiAgY29uc3QgaWR4ID0gcGFyZW50LmNoaWxkcmVuLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gZW50cnkuaWQpO1xuICBjb25zdCBleGlzdHNJblBhcmVudCA9IGlkeCAhPT0gLTE7XG4gIGNvbnN0IGlzSW1tdXRhYmxlUGFyZW50ID0gcGFyZW50Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcbiAgY29uc3QgaXNJbW11dGFibGVFbnRyeSA9IGVudHJ5Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcblxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAoIWV4aXN0c0luUGFyZW50KSAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGAke2VudHJ5Lm5hbWV9IGRvZXMgbm90IGV4aXN0IGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlUGFyZW50KSAgICAgcmV0dXJuT2JqLmVycm9yID0gYCR7cGFyZW50Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIGlmIChpc0ltbXV0YWJsZUVudHJ5KSAgICAgIHJldHVybk9iai5lcnJvciA9IGAke2VudHJ5Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuXG4gIHJldHVybiByZXR1cm5PYmo7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgbW92ZWQgZnJvbSBwYXJlbnQgdG8gbmV3UGFyZW50IChubyBkdXBsaWNhdGUsIG11dGFibGUgcGFyZW50cywgZW50cnkgZXhpc3RzKVxuICogQHBhcmFtIGVudHJ5IFxuICogQHBhcmFtIHBhcmVudCBcbiAqIEBwYXJhbSBuZXdQYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yOiBzdHJpbmcgfVxuICovXG5jb25zdCBjYW5Nb3ZlRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdQYXJlbnQ6IElGb2xkZXIpOiByZXNwb25zZVByb3AgPT4ge1xuICAvLyBpcyBBIGEgY2hpbGQgb2YgQlxuICBmdW5jdGlvbiBpc0NoaWxkT2YoYTogSUVudHJ5LCBiOiBJRm9sZGVyKSB7XG4gICAgcmV0dXJuIGIuY2hpbGRyZW5cbiAgICAgIC5maWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gRW50cnlUeXBlLkZvbGRlcilcbiAgICAgIC5tYXAoKGM6IElGb2xkZXIpID0+IHtcbiAgICAgICAgaWYgKGMgPT09IGEpIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiBpc0NoaWxkT2YoYSwgYyk7XG4gICAgICB9KVxuICAgICAgLnNvbWUoKGUpID0+IGUgPT09IHRydWUpO1xuICB9XG4gICAgXG4gIGNvbnN0IGlzU2FtZSA9IGVudHJ5ID09PSBuZXdQYXJlbnQ7XG4gIGNvbnN0IG5hbWVFeGlzdHMgPSBuZXdQYXJlbnQuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lKTtcbiAgY29uc3QgaXNJbW11dGFibGVQYXJlbnQgPSBwYXJlbnQubWV0YWRhdGFbJ2ltbXV0YWJsZSddO1xuICBjb25zdCBpc0ltbXV0YWJsZU5ld1BhcmVudCA9IG5ld1BhcmVudC5tZXRhZGF0YVsnaW1tdXRhYmxlJ107XG4gIGNvbnN0IGV4aXN0c0luUGFyZW50ID0gcGFyZW50LmNoaWxkcmVuLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gZW50cnkuaWQpICE9PSAtMTtcbiAgLy8gaWYgZW50cnkgaXMgYSBmb2xkZXIsIGNoZWNrIGlmIG5ld1BhcmVudCBpcyBhIHN1YmZvbGRlciBvZiBlbnRyeVxuICBjb25zdCBuZXdQYXJlbnRJc0NoaWxkT2ZFbnRyeSA9IChlbnRyeS50eXBlID09IEVudHJ5VHlwZS5Gb2xkZXIpID8gaXNDaGlsZE9mKG5ld1BhcmVudCwgZW50cnkgYXMgSUZvbGRlcikgOiBmYWxzZTtcblxuXG4gIGNvbnN0IHJldHVybk9iaiA9IHsgc3VjY2VlZGVkOiBmYWxzZSwgZXJyb3I6ICcnIH07XG4gIGlmIChpc1NhbWUpICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGBDYW5ub3QgbW92ZSAke2VudHJ5Lm5hbWV9IHRvIGl0c2VsZi5gO1xuICBlbHNlIGlmIChuYW1lRXhpc3RzKSAgICAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGBEdXBsaWNhdGUgbmFtZTogJHtlbnRyeS5uYW1lfSBhbHJlYWR5IGV4aXN0cyBpbiAke25ld1BhcmVudC5uYW1lfS5gO1xuICBlbHNlIGlmIChpc0ltbXV0YWJsZVBhcmVudCkgICAgICAgICByZXR1cm5PYmouZXJyb3IgPSBgJHtwYXJlbnQubmFtZX0gaXMgaW1tdXRhYmxlLmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlTmV3UGFyZW50KSAgICAgIHJldHVybk9iai5lcnJvciA9IGAke25ld1BhcmVudC5uYW1lfSBpcyBpbW11dGFibGUuYDtcbiAgZWxzZSBpZiAoIWV4aXN0c0luUGFyZW50KSAgICAgICAgICAgcmV0dXJuT2JqLmVycm9yID0gYCR7ZW50cnkubmFtZX0gZG9lcyBub3QgZXhpc3QgaW4gJHtwYXJlbnQubmFtZX0uYDtcbiAgZWxzZSBpZiAobmV3UGFyZW50SXNDaGlsZE9mRW50cnkpICAgcmV0dXJuT2JqLmVycm9yID0gYENhbm5vdCBtb3ZlICR7ZW50cnkubmFtZX0gaW50byBhIGl0cyBvd24gc3ViZm9sZGVyLCAke25ld1BhcmVudC5uYW1lfS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuICAgIFxuICByZXR1cm4gcmV0dXJuT2JqO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgZW50cnkgY2FuIGJlIHJlbmFtZWQgKG5vIGR1cGxpY2F0ZSlcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcGFyYW0gbmV3TmFtZSBcbiAqIEByZXR1cm5zIHJlc3BvbnNlIG9iamVjdCB7IHN1Y2NlZWRlZDogYm9vbGVhbiwgZXJyb3I6IHN0cmluZyB9XG4gKi9cbmNvbnN0IGNhblJlbmFtZUVudHJ5ID0gKGVudHJ5OiBJRW50cnksIHBhcmVudDogSUZvbGRlciwgbmV3TmFtZTogc3RyaW5nKTogcmVzcG9uc2VQcm9wID0+IHtcbiAgLy8gQ2hlY2sgaWYgbmV3TmFtZSBhbHJlYWR5IGV4aXN0cyBpbiBwYXJlbnRcbiAgY29uc3QgbmFtZUV4aXN0cyA9IHBhcmVudC5jaGlsZHJlbi5zb21lKChlLCBpZHgsIGFycikgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lICYmIGlkeCAhPT0gYXJyLmluZGV4T2YoZSkpO1xuICAgIFxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAobmFtZUV4aXN0cykgcmV0dXJuT2JqLmVycm9yID0gYER1cGxpY2F0ZSBuYW1lOiAke25ld05hbWV9IGFscmVhZHkgZXhpc3RzIGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgcmV0dXJuT2JqLnN1Y2NlZWRlZCA9IHRydWU7XG5cbiAgcmV0dXJuIHJldHVybk9iajtcbn07XG5cbi8qKlxuICogQWRkcyBlbnRyeSB0byBwYXJlbnQgZm9sZGVyXG4gKiBAcGFyYW0gZW50cnlcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFkZGVkLCBlbHNlIGZhbHNlXG4gKi9cbmNvbnN0IGFkZEVudHJ5ID0gKGVudHJ5OiBJRW50cnksIHBhcmVudDogSUZvbGRlcik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB7IHN1Y2NlZWRlZCwgZXJyb3IgfSA9IGNhbkFkZEVudHJ5KGVudHJ5LCBwYXJlbnQpO1xuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgLy8gQWRkIGVudHJ5IHRvIHBhcmVudCwgc29ydCBieSBhbHBoYW51bWVyaWNhbCBhbmQgZm9sZGVycyBiZWZvcmUgZmlsZXNcbiAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChlbnRyeSk7XG4gICAgc29ydEZvbGRlcihwYXJlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZW1vdmVzIGVudHJ5IGZyb20gcGFyZW50IGZvbGRlclxuICogQHBhcmFtIGVudHJ5IFxuICogQHBhcmFtIHBhcmVudCBcbiAqIEBwYXJhbSBmb3JjZSBmb3JjZSBhIHJlbW92YWxcbiAqIEByZXR1cm5zIHRydWUgaWYgcmVtb3ZlZCwgZWxzZSBmYWxzZVxuICovXG5jb25zdCByZW1vdmVFbnRyeSA9IChlbnRyeTogSUVudHJ5LCBwYXJlbnQ6IElGb2xkZXIsIGZvcmNlPWZhbHNlKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHsgc3VjY2VlZGVkLCBlcnJvciB9ID0gY2FuUmVtb3ZlRW50cnkoZW50cnksIHBhcmVudCk7XG4gIGlmIChzdWNjZWVkZWQgfHwgZm9yY2UpIHtcbiAgICBjb25zdCBpZHggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihlbnRyeSk7XG4gICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpZHgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBNb3ZlcyBlbnRyeSBmcm9tIHBhcmVudCB0byBuZXdQYXJlbnRcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcGFyYW0gbmV3UGFyZW50IFxuICogQHJldHVybnMgdHJ1ZSBpZiBtb3ZlZCwgZWxzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBtb3ZlRW50cnkoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdQYXJlbnQ6IElGb2xkZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbW92ZVJlc3BvbnNlID0gY2FuTW92ZUVudHJ5KGVudHJ5LCBwYXJlbnQsIG5ld1BhcmVudCk7XG5cbiAgaWYgKG1vdmVSZXNwb25zZS5zdWNjZWVkZWQpIHtcbiAgICBjb25zdCByZW1vdmVkID0gcmVtb3ZlRW50cnkoZW50cnksIHBhcmVudCwgdHJ1ZSk7XG4gICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgIGNvbnN0IGFkZGVkID0gYWRkRW50cnkoZW50cnksIG5ld1BhcmVudCk7XG4gICAgICBpZiAoYWRkZWQpIHJldHVybiB0cnVlO1xuICAgICAgZWxzZSBjb25zb2xlLmVycm9yKGBNb3Zpbmc6IGZhaWxlZCB0byBhZGQgJHtlbnRyeS5uYW1lfSB0byAke25ld1BhcmVudC5uYW1lfWApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYE1vdmluZzogZmFpbGVkIHRvIHJlbW92ZSAke2VudHJ5Lm5hbWV9IGZyb20gJHtwYXJlbnQubmFtZX1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihtb3ZlUmVzcG9uc2UuZXJyb3IpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZW5hbWVzIGVudHJ5XG4gKiBAcGFyYW0gZW50cnkgXG4gKiBAcGFyYW0gcGFyZW50IFxuICogQHBhcmFtIG5ld05hbWUgXG4gKiBAcmV0dXJucyB0cnVlIGlmIHJlbmFtZWQsIGVsc2UgZmFsc2VcbiAqL1xuY29uc3QgcmVuYW1lRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdOYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgeyBzdWNjZWVkZWQsIGVycm9yIH0gPSBjYW5SZW5hbWVFbnRyeShlbnRyeSwgcGFyZW50LCBuZXdOYW1lKTtcblxuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgZW50cnkubmFtZSA9IG5ld05hbWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBnZXRBbGxOYW1lcyA9IChmb2xkZXI6IElGb2xkZXIpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IG5hbWVzID0gZm9sZGVyLmNoaWxkcmVuLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKTtcbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiAgU29ydHMgZm9sZGVyIGJ5IGFscGhhbnVtZXJpY2FsIGFuZCBmb2xkZXJzIGJlZm9yZSBmaWxlcyBcbiAqIEBwYXJhbSBmb2xkZXIgXG4gKiBAcmV0dXJucyByZWZlcmVuY2UgdG8gc2FtZSBmb2xkZXJcbiAqL1xuZnVuY3Rpb24gc29ydEZvbGRlcihmb2xkZXI6IElGb2xkZXIpOiBJRm9sZGVyIHtcbiAgZm9sZGVyLmNoaWxkcmVuLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICBmb2xkZXIuY2hpbGRyZW4uc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLnR5cGUgPT09IEVudHJ5VHlwZS5GaWxlICYmIGIudHlwZSA9PT0gRW50cnlUeXBlLkZvbGRlcikgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoYS50eXBlID09PSBFbnRyeVR5cGUuRm9sZGVyICYmIGIudHlwZSA9PT0gRW50cnlUeXBlLkZpbGUpIHJldHVybiAtMTtcbiAgICBlbHNlIHJldHVybiAwO1xuICB9KTtcbiAgcmV0dXJuIGZvbGRlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEZpbGVTeXN0ZW1Ub29scyA9IHtcbiAgY3JlYXRlRm9sZGVyOiBjcmVhdGVGb2xkZXIsXG4gIGNyZWF0ZVRyYXNoOiBjcmVhdGVUcmFzaCxcbiAgY3JlYXRlRmlsZTogY3JlYXRlRmlsZSxcbiAgbW92ZUVudHJ5OiBtb3ZlRW50cnksXG4gIGNhbkFkZEVudHJ5OiBjYW5BZGRFbnRyeSxcbiAgY2FuUmVtb3ZlRW50cnk6IGNhblJlbW92ZUVudHJ5LFxuICBjYW5Nb3ZlRW50cnk6IGNhbk1vdmVFbnRyeSxcbiAgY2FuUmVuYW1lRW50cnk6IGNhblJlbmFtZUVudHJ5LFxuICBhZGRFbnRyeTogYWRkRW50cnksXG4gIHJlbW92ZUVudHJ5OiByZW1vdmVFbnRyeSxcbiAgYWRkTWV0YWRhdGE6IGFkZE1ldGFkYXRhLFxuICByZW1vdmVNZXRhZGF0YTogcmVtb3ZlTWV0YWRhdGEsXG4gIGdldEFsbE5hbWVzOiBnZXRBbGxOYW1lcyxcbiAgcmVuYW1lRW50cnk6IHJlbmFtZUVudHJ5LFxufTsiLCJpbXBvcnQgeyBJRm9sZGVyLCBGaWxlU3lzdGVtVG9vbHMgfSBmcm9tICcuJztcbmltcG9ydCB7IGZldGNoVXBsb2FkcyB9IGZyb20gJy4uL1N0b3JhZ2UnO1xuaW1wb3J0IHsgc2FtcGxlcyB9IGZyb20gJy4uL3NhbXBsZXNfZmlsZW5hbWVzJztcblxuaW50ZXJmYWNlIEZpbGVTeXN0ZW1Qcm9wcyB7XG4gIGdldFJvb3Q6ICgpID0+IFByb21pc2U8SUZvbGRlcj47XG4gIHNldEZpbGVTeXN0ZW06IChyb290OiBJRm9sZGVyKSA9PiBib29sZWFuO1xuICBnZXRGaWxlU3lzdGVtOiAoKSA9PiBQcm9taXNlPElGb2xkZXI+O1xuICBuZXdUcmFzaDogKHJvb3Q6IElGb2xkZXIpID0+IHZvaWQ7XG59XG4gIFxuXG4vLyBNYW5hZ2VyIGlzIHVzZWQgZm9yIGFjY2Vzc2luZyBsb2NhbCBzdG9yYWdlIGFuZCB0cmFja2luZyB0aGUgcG9zaXRpb24gb2YgY3VycmVudCBmb2xkZXJcbmV4cG9ydCBjb25zdCBGaWxlU3lzdGVtTWFuYWdlciA9ICgpOiBGaWxlU3lzdGVtUHJvcHMgPT4ge1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFJvb3QoKTogUHJvbWlzZTxJRm9sZGVyPiB7IFxuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlU3lzdGVtKCk7XG4gIH1cblxuICAvLyBTYXZlIGZpbGVzeXN0ZW0gaW50byBsb2NhbCBzdG9yYWdlXG4gIGZ1bmN0aW9uIHNldEZpbGVTeXN0ZW0ocm9vdDogSUZvbGRlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ25lb24tZnMnLCBKU09OLnN0cmluZ2lmeShyb290KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHdpbmRvdy5hbGVydCgnRXJyb3Igc2F2aW5nIGZpbGUgc3lzdGVtJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gTG9hZCBmaWxlc3lzdGVtIGZyb20gbG9jYWwgc3RvcmFnZSwgY3JlYXRlcyBuZXcgcm9vdCBpZiBub25lIGV4aXN0c1xuICBhc3luYyBmdW5jdGlvbiBnZXRGaWxlU3lzdGVtKCk6IFByb21pc2U8SUZvbGRlcj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmcyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbmVvbi1mcycpO1xuICAgICAgICAgICAgXG4gICAgICAvLyBpZiBsb2NhbHN0b3JhZ2UgZXhpc3RzLCBsb2FkIHByZXZpb3VzIHJvb3RcbiAgICAgIGlmIChmcykge1xuICAgICAgICBjb25zdCBsb2NhbEZpbGVTeXN0ZW0gPSBKU09OLnBhcnNlKGZzKSBhcyBJRm9sZGVyO1xuICAgICAgICByZXR1cm4gbG9jYWxGaWxlU3lzdGVtO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSwgY3JlYXRlIG5ldyByb290XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGb2xkZXIoJ0hvbWUnKTtcbiAgICAgICAgbG9hZFNhbXBsZXMocm9vdCk7XG4gICAgICAgIG5ld1RyYXNoKHJvb3QpO1xuICAgICAgICBhd2FpdCBsb2FkUHJldmlvdXNVcGxvYWRzKHJvb3QpO1xuICAgICAgICBzZXRGaWxlU3lzdGVtKHJvb3QpO1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgd2luZG93LmFsZXJ0KCdFcnJvciBsb2FkaW5nIGZpbGUgc3lzdGVtJyk7XG4gICAgfVxuICB9IFxuXG4gIC8vIFRoaXMgbmV4dCBmdW5jdGlvbiBpcyBzb2xlbHkgZm9yIGxvYWRpbmcgc2FtcGxlcyBpbnRvIHRoZSByb290IGFzIGEgZGVmYXVsdCBmb3IgTmVvblxuICBmdW5jdGlvbiBsb2FkU2FtcGxlcyhyb290OiBJRm9sZGVyKSB7XG4gICAgLy8gTWFrZSBzYW1wbGUgZW50cmllc1xuICAgIGNvbnN0IHNhbXBsZUVudHJpZXMgPSBzYW1wbGVzLm1hcCgoW25hbWUsIHR5cGVdKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGaWxlKG5hbWUsIG5hbWUpO1xuICAgICAgaWYgKHR5cGUgPT09ICdmb2xpbycpIHtcbiAgICAgICAgRmlsZVN5c3RlbVRvb2xzLmFkZE1ldGFkYXRhKGVudHJ5LCB7IHR5cGU6ICdmb2xpbycsIGRvY3VtZW50OiAnc2FtcGxlJywgaW1tdXRhYmxlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ21hbnVzY3JpcHQnKSB7XG4gICAgICAgIEZpbGVTeXN0ZW1Ub29scy5hZGRNZXRhZGF0YShlbnRyeSwgeyB0eXBlOiAnbWFudXNjcmlwdCcsIGRvY3VtZW50OiAnc2FtcGxlJywgaW1tdXRhYmxlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xuXG4gICAgLy8gTWFrZSBzYW1wbGVzIGZvbGRlciBhbmQgYWRkIHRvIHJvb3RcbiAgICBjb25zdCBzYW1wbGVzRm9sZGVyID0gRmlsZVN5c3RlbVRvb2xzLmNyZWF0ZUZvbGRlcignU2FtcGxlcycpO1xuICAgIC8vIEFkZCBzYW1wbGUgZW50cmllcyB0byBzYW1wbGVzIGZvbGRlclxuICAgIHNhbXBsZUVudHJpZXMuZm9yRWFjaCgoc2FtcGxlKSA9PiB7XG4gICAgICBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkoc2FtcGxlLCBzYW1wbGVzRm9sZGVyKTtcbiAgICB9KTtcbiAgICBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkoc2FtcGxlc0ZvbGRlciwgcm9vdCk7XG4gICAgRmlsZVN5c3RlbVRvb2xzLmFkZE1ldGFkYXRhKHNhbXBsZXNGb2xkZXIsIHsgaW1tdXRhYmxlOiB0cnVlIH0pO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBmdW5jdGlvbiBuZXdUcmFzaChyb290OiBJRm9sZGVyKSB7XG4gICAgY29uc3QgdHJhc2hGb2xkZXIgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlVHJhc2goJ1RyYXNoJyk7XG4gICAgRmlsZVN5c3RlbVRvb2xzLmFkZEVudHJ5KHRyYXNoRm9sZGVyLCByb290KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRQcmV2aW91c1VwbG9hZHMocm9vdDogSUZvbGRlcikge1xuICAgIC8vIEdldCBwcmV2aW91cyB1cGxvYWRzIGZyb20gbG9jYWwgc3RvcmFnZVxuICAgIGNvbnN0IHVwbG9hZHMgPSBhd2FpdCBmZXRjaFVwbG9hZHMoKTtcblxuICAgIC8vIE1ha2UgdXBsb2FkIGVudHJpZXNcbiAgICBjb25zdCB1cGxvYWRFbnRyaWVzID0gdXBsb2Fkcy5tYXAoKHVwbG9hZCkgPT4ge1xuICAgICAgcmV0dXJuIEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGaWxlKHVwbG9hZC5uYW1lLCB1cGxvYWQuaWQpO1xuICAgIH0pO1xuXG4gICAgdXBsb2FkRW50cmllcy5mb3JFYWNoKCh1cGxvYWQpID0+IHtcbiAgICAgIEZpbGVTeXN0ZW1Ub29scy5hZGRFbnRyeSh1cGxvYWQsIHJvb3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBjb25zdCBGaWxlU3lzdGVtUHJvcHM6IEZpbGVTeXN0ZW1Qcm9wcyA9IHtcbiAgICBnZXRSb290OiBnZXRSb290LFxuICAgIHNldEZpbGVTeXN0ZW06IHNldEZpbGVTeXN0ZW0sXG4gICAgZ2V0RmlsZVN5c3RlbTogZ2V0RmlsZVN5c3RlbSxcbiAgICBuZXdUcmFzaDogbmV3VHJhc2gsXG4gIH07XG5cbiAgcmV0dXJuIEZpbGVTeXN0ZW1Qcm9wcztcbn07IiwiZXhwb3J0IGNvbnN0IHNhbXBsZXMgPSBbXG4gIFsnQ0ROLUhzbXVfTTIxNDkuTDRfMDAxcicsICdmb2xpbyddLFxuICBbJ0NETi1Ic211X00yMTQ5Lkw0XzAwMnInLCAnZm9saW8nXSxcbiAgWydDSC1FXzYxMV8wMjRyJywgJ2ZvbGlvJ10sXG4gIFsnQ0gtRV82MTFfMDI2cicsICdmb2xpbyddLFxuICBbJ0NILUVfNjExXzAyOHInLCAnZm9saW8nXSxcbiAgWydTYWx6aW5uZXMnLCAnbWFudXNjcmlwdCddXG5dOyIsImltcG9ydCB7IElFbnRyeSwgSUZvbGRlciB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmV4cG9ydCBjbGFzcyBTaGlmdFNlbGVjdGlvbk1hbmFnZXIge1xuICBwcml2YXRlIHN0YXJ0OiBudW1iZXI7XG4gIHByaXZhdGUgZW5kOiBudW1iZXI7XG4gIHByaXZhdGUgcHJldlNlbGVjdGlvbjogbnVtYmVyW10gPSBbXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgcHVibGljIHNldFN0YXJ0KHN0YXJ0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5zdGFydCA9IE1hdGgubWF4KHN0YXJ0LCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFbmQoZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0ID0gMDtcbiAgICB0aGlzLmVuZCA9IC0xO1xuICAgIHRoaXMucHJldlNlbGVjdGlvbi5zcGxpY2UoMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJldlNlbGVjdGlvbigpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJldlNlbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3Rpb24ob3JkZXJlZFNlbGVjdGlvbjogYm9vbGVhbltdKTogbnVtYmVyW10ge1xuICAgIGxldCBzdGFydDogbnVtYmVyO1xuICAgIGxldCBlbmQ6IG51bWJlcjtcblxuICAgIGlmICh0aGlzLmVuZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kIDwgdGhpcy5zdGFydCkge1xuICAgICAgc3RhcnQgPSB0aGlzLmVuZDtcbiAgICAgIGVuZCA9IHRoaXMuc3RhcnQgKyAxO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN0YXJ0ID0gdGhpcy5zdGFydDtcbiAgICAgIGVuZCA9IHRoaXMuZW5kICsgMTtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2UgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAoZW5kIC0gc3RhcnQpIH0sICh2LCBrKSA9PiBrICsgc3RhcnQpO1xuXG4gICAgLy8gRm9yIGVhY2ggc2hpZnQgc2VsZWN0aW9uIGFjdGlvbjogaWYgdGhlIFNoaWZ0IGtleSBpcyBzdGlsbCBoZWxkLCB0aGUgZW5kIHNoaWZ0IHBvcyBjYW4gY2hhbmdlXG4gICAgLy8gd2l0aCB0aGUgcHJldmlvdXNseSAoYmVmb3JlLXNoaWZ0KSBzZWxlY3RlZCBlbGVtZW50cyBzdGlsbCBzZWxlY3RlZCB3aGlsZSB0aGUgY3VycmVudCBzaGlmdCBzZWxlY3Rpb25zIHVuc2VsZWN0LlxuICAgIGNvbnN0IHNwZWNpZmljU2VsZWN0aW9uID0gcmFuZ2UuZmlsdGVyKGlkeCA9PiAhKG9yZGVyZWRTZWxlY3Rpb25baWR4XSkpO1xuICAgIHRoaXMucHJldlNlbGVjdGlvbiA9IHNwZWNpZmljU2VsZWN0aW9uO1xuICAgIHJldHVybiBzcGVjaWZpY1NlbGVjdGlvbjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFN0YXRlIHtcbiAgcm9vdChyb290Rm9sZGVyPzogSUZvbGRlcik6IElGb2xkZXIgfCBudWxsO1xuICBzZXRFbnRyaWVzKGVudHJpZXM6IElFbnRyeVtdKTogdm9pZDtcbiAgZ2V0RW50cmllcygpOiBJRW50cnlbXTtcbiAgZ2V0SW5kZXhCeUVudHJ5TmFtZShuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIHNldFNlbGVjdGlvbihpbmRleDogbnVtYmVyLCBib29sOiBib29sZWFuKTogdm9pZDtcbiAgZ2V0U2VsZWN0aW9uKCk6IGJvb2xlYW5bXTtcbiAgcmVzZXRTZWxlY3Rpb24oKTogdm9pZDtcbiAgc2V0Rm9sZGVyUGF0aChwYXRoOiBJRm9sZGVyW10pOiB2b2lkO1xuICBnZXRGb2xkZXJQYXRoKCk6IElGb2xkZXJbXTtcbiAgZ2V0Rm9sZGVyUGF0aE5hbWVzKCk6IHN0cmluZ1tdO1xuICBnZXRGb2xkZXJQYXRoQnlOYW1lcyhmb2xkZXJOYW1lczogc3RyaW5nW10pOiBJRm9sZGVyIHwgdm9pZDtcbiAgZ2V0UGFyZW50Rm9sZGVyKCk6IElGb2xkZXIgfCB1bmRlZmluZWQ7XG4gIGdldFRyYXNoRm9sZGVyKCk6IElGb2xkZXI7XG4gIGdldFNlbGVjdGVkRW50cmllcygpOiBJRW50cnlbXTtcbiAgZ2V0U2VsZWN0ZWRGb2xkZXJzKCk6IElFbnRyeVtdO1xuICBnZXRTZWxlY3RlZFRyYXNoKCk6IElFbnRyeVtdO1xuICBnZXRTZWxlY3RlZEZpbGVzKCk6IElFbnRyeVtdO1xuICBpc0luVHJhc2goKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZFN0YXRlKCk6IERhc2hib2FyZFN0YXRlIHtcbiAgLy8gYXMgZGlzcGxheWVkIG9uIHRoZSBkYXNoYm9hcmRcbiAgbGV0IG9yZGVyZWRFbnRyaWVzOiBJRW50cnlbXSA9IFtdO1xuICBsZXQgb3JkZXJlZFNlbGVjdGlvbjogYm9vbGVhbltdID0gW107XG4gIC8vIGNvbnN0IGN1cnJlbnRGaWxlU2VsZWN0aW9uID0gW107IC8vIGN1cnJlbnRseSB1c2VyLXNlbGVjdGVkIGZpbGVzXG4gIC8vIGNvbnN0IGN1cnJlbnRGb2xkZXJTZWxlY3Rpb24gPSBbXTsgLy8gY3VycmVudGx5IHVzZXItc2VsZWN0ZWQgZm9sZGVyc1xuXG4gIC8vIHBhdGggbGVhZGluZyB0byBjdXJyZW50IGZvbGRlclxuICBsZXQgZm9sZGVyUGF0aDogSUZvbGRlcltdID0gW107XG4gIGxldCBfcm9vdDogSUZvbGRlciA9IG51bGw7XG5cbiAgLyoqIFxuICAgKiBTZXRzIG9yIGdldHMgdGhlIHJvb3QgZm9sZGVyXG4gICAqIEBwYXJhbSByb290Rm9sZGVyIChvcHRpb25hbCkgLSB0aGUgcm9vdCBmb2xkZXIgdG8gc2V0XG4gICAqIEByZXR1cm5zIHRoZSByb290IGZvbGRlclxuICAgKi8gXG4gIGZ1bmN0aW9uIHJvb3Qocm9vdEZvbGRlcj86IElGb2xkZXIpIHtcbiAgICBpZiAocm9vdEZvbGRlcikgX3Jvb3QgPSByb290Rm9sZGVyO1xuICAgIHJldHVybiBfcm9vdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEVudHJpZXMoZW50cmllczogSUVudHJ5W10pIHtcbiAgICBvcmRlcmVkRW50cmllcyA9IGVudHJpZXM7XG4gICAgb3JkZXJlZFNlbGVjdGlvbiA9IEFycmF5KGVudHJpZXMubGVuZ3RoKS5maWxsKGZhbHNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIG9yZGVyZWRFbnRyaWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5kZXhCeUVudHJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gb3JkZXJlZEVudHJpZXMuZmluZEluZGV4KGVudHJ5ID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIGJvb2w6IGJvb2xlYW4pIHtcbiAgICBvcmRlcmVkU2VsZWN0aW9uW2luZGV4XSA9IGJvb2w7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9yZGVyZWRTZWxlY3Rpb247XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFNlbGVjdGlvbigpIHtcbiAgICBvcmRlcmVkU2VsZWN0aW9uLmZpbGwoZmFsc2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0Rm9sZGVyUGF0aChwYXRoOiBJRm9sZGVyW10pIHtcbiAgICBmb2xkZXJQYXRoID0gcGF0aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZvbGRlclBhdGgoKSB7XG4gICAgcmV0dXJuIGZvbGRlclBhdGg7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb2xkZXJQYXRoTmFtZXMoKSB7XG4gICAgcmV0dXJuIGZvbGRlclBhdGgubWFwKGZvbGRlciA9PiBmb2xkZXIubmFtZSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb2xkZXJQYXRoQnlOYW1lcyhmb2xkZXJOYW1lczogc3RyaW5nW10pOiBJRm9sZGVyIHwgdm9pZCB7XG4gICAgbGV0IGN1cnJlbnRGb2xkZXIgPSByb290KCk7XG4gICAgZm9sZGVyTmFtZXMgPSBmb2xkZXJOYW1lcy5zbGljZSgxKTtcblxuICAgIGZvciAoY29uc3QgZm9sZGVyTmFtZSBvZiBmb2xkZXJOYW1lcykge1xuICAgICAgY29uc3QgdGFyZ2V0Rm9sZGVyID0gY3VycmVudEZvbGRlci5jaGlsZHJlbi5maW5kKGNoaWxkID0+IGNoaWxkLm5hbWUgPT09IGZvbGRlck5hbWUpO1xuICAgICAgaWYgKHRhcmdldEZvbGRlciAmJiB0YXJnZXRGb2xkZXIudHlwZSA9PT0gJ2ZvbGRlcicpIHtcbiAgICAgICAgY3VycmVudEZvbGRlciA9IHRhcmdldEZvbGRlciBhcyBJRm9sZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnZmFpbGVkIHRvIGZpbmQgZm9sZGVyOiAnLCBmb2xkZXJOYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50Rm9sZGVyO1xuICB9XG5cblxuICBmdW5jdGlvbiBnZXRQYXJlbnRGb2xkZXIoKSB7IFxuICAgIHJldHVybiBmb2xkZXJQYXRoLmF0KC0xKTsgXG4gIH1cblxuICBmdW5jdGlvbiBnZXRUcmFzaEZvbGRlcigpIHtcbiAgICBjb25zdCB0cmFzaEZvbGRlcnMgPSByb290KCkuY2hpbGRyZW4uZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnR5cGUgPT09ICd0cmFzaCcpIGFzIElGb2xkZXJbXTtcbiAgICByZXR1cm4gdHJhc2hGb2xkZXJzWzBdO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRFbnRyaWVzKCkge1xuICAgIHJldHVybiBvcmRlcmVkRW50cmllcy5maWx0ZXIoKF8sIGlkeCkgPT4gb3JkZXJlZFNlbGVjdGlvbltpZHhdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkRm9sZGVycygpIHtcbiAgICByZXR1cm4gZ2V0U2VsZWN0ZWRFbnRyaWVzKCkuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnR5cGUgPT09ICdmb2xkZXInKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkVHJhc2goKSB7XG4gICAgcmV0dXJuIGdldFNlbGVjdGVkRW50cmllcygpLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50eXBlID09PSAndHJhc2gnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkRmlsZXMoKSB7XG4gICAgcmV0dXJuIGdldFNlbGVjdGVkRW50cmllcygpLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50eXBlID09PSAnZmlsZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNJblRyYXNoKCkge1xuICAgIGNvbnN0IGlzVHJhc2hGb2xkZXIgPSAoZm9sZGVyOiBJRm9sZGVyKTogYm9vbGVhbiA9PiBmb2xkZXIudHlwZSA9PT0gJ3RyYXNoJztcbiAgICByZXR1cm4gZm9sZGVyUGF0aC5zb21lKGlzVHJhc2hGb2xkZXIpO1xuICB9XG5cbiAgLy8gVE9ETzpcbiAgLy8gZnVuY3Rpb24gc29ydEVudHJpZXMoKSB7fVxuXG4gIHJldHVybiB7XG4gICAgcm9vdDogcm9vdCxcbiAgICBzZXRFbnRyaWVzOiBzZXRFbnRyaWVzLFxuICAgIGdldEVudHJpZXM6IGdldEVudHJpZXMsXG4gICAgZ2V0SW5kZXhCeUVudHJ5TmFtZTogZ2V0SW5kZXhCeUVudHJ5TmFtZSxcbiAgICBzZXRTZWxlY3Rpb246IHNldFNlbGVjdGlvbixcbiAgICBnZXRTZWxlY3Rpb246IGdldFNlbGVjdGlvbixcbiAgICByZXNldFNlbGVjdGlvbjogcmVzZXRTZWxlY3Rpb24sXG4gICAgc2V0Rm9sZGVyUGF0aDogc2V0Rm9sZGVyUGF0aCxcbiAgICBnZXRGb2xkZXJQYXRoOiBnZXRGb2xkZXJQYXRoLFxuICAgIGdldEZvbGRlclBhdGhOYW1lczogZ2V0Rm9sZGVyUGF0aE5hbWVzLFxuICAgIGdldEZvbGRlclBhdGhCeU5hbWVzOiBnZXRGb2xkZXJQYXRoQnlOYW1lcyxcbiAgICBnZXRQYXJlbnRGb2xkZXI6IGdldFBhcmVudEZvbGRlcixcbiAgICBnZXRUcmFzaEZvbGRlcjogZ2V0VHJhc2hGb2xkZXIsXG4gICAgZ2V0U2VsZWN0ZWRFbnRyaWVzOiBnZXRTZWxlY3RlZEVudHJpZXMsXG4gICAgZ2V0U2VsZWN0ZWRGb2xkZXJzOiBnZXRTZWxlY3RlZEZvbGRlcnMsXG4gICAgZ2V0U2VsZWN0ZWRUcmFzaDogZ2V0U2VsZWN0ZWRUcmFzaCxcbiAgICBnZXRTZWxlY3RlZEZpbGVzOiBnZXRTZWxlY3RlZEZpbGVzLFxuICAgIGlzSW5UcmFzaDogaXNJblRyYXNoLFxuICB9O1xufSIsImltcG9ydCB7IE1vZGFsV2luZG93LCBNb2RhbFdpbmRvd1ZpZXcgfSBmcm9tICcuLi91dGlscy9Nb2RhbFdpbmRvdyc7XG5pbXBvcnQge1xuICBhZGROZXdGaWxlcyxcbiAgaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzLFxuICBoYW5kbGVNYWtlUGFpcixcbiAgc29ydEZpbGVCeU5hbWUsXG59IGZyb20gJy4vVXBsb2FkVG9vbHMnO1xuaW1wb3J0IHsgdXBkYXRlRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgSUZvbGRlciB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVVwbG9hZFVwZGF0ZShcbiAgbW9kYWxXaW5kb3c6IE1vZGFsV2luZG93LFxuICBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLFxuKSB7XG4gIGNvbnN0IHNwaW5uZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdXBsb2FkaW5nX3NwaW5uZXInKTtcbiAgc3Bpbm5lci5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzKGN1cnJlbnRGb2xkZXIpXG4gICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICAgICAgc3Bpbm5lci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuXG4gICAgICAgIC8vIFNob3cgdXBsb2FkZWQgZmlsZW5hbWVzXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxGaWxlcyA9IHJlc3VsdHNcbiAgICAgICAgICAuZmlsdGVyKChyZXN1bHQpID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZSlcbiAgICAgICAgICAubWFwKChyZXN1bHQpID0+IHJlc3VsdC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHN1Y2Nlc3NmdWxGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgaW5mb0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tYmFkZ2UnKTtcbiAgICAgICAgICBpbmZvQmFkZ2UudGV4dENvbnRlbnQgPSBgVXBsb2FkZWQgZmlsZXM6ICR7c3VjY2Vzc2Z1bEZpbGVzLmpvaW4oXG4gICAgICAgICAgICAnLCAnLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgICBpbmZvQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgaW5mb0JhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAnIzlEQjJCRic7XG4gICAgICAgIH1cbiAgICAgIH0sIDIwMDApO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ09uZSBvciBtb3JlIHVwbG9hZHMgcmVqZWN0ZWQ6ICcsIGVycm9yKTtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICAgICAgc3Bpbm5lci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgICAgfSwgMjAwMCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJbml0VXBsb2FkQXJlYShjdXJyZW50Rm9sZGVyOiBJRm9sZGVyKTogdm9pZCB7XG4gIC8vIGdlbmVyYXRlIG1vZGFsIHdpbmRvd1xuICBjb25zdCBtb2RhbFdpbmRvdyA9IG5ldyBNb2RhbFdpbmRvdygpO1xuICBtb2RhbFdpbmRvdy5zZXRNb2RhbFdpbmRvd1ZpZXcoTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRCk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xuXG4gIGNvbnN0IHBhaXJCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFrZV9wYWlyJyk7XG4gIGNvbnN0IHVwbG9hZEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN1cGxvYWRfYnV0dG9uJyk7XG5cbiAgcGFpckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZU1ha2VQYWlyKTtcbiAgdXBsb2FkQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT5cbiAgICBoYW5kbGVVcGxvYWRVcGRhdGUobW9kYWxXaW5kb3csIGN1cnJlbnRGb2xkZXIpLFxuICApO1xuXG4gIC8vIHJlcXVlc3QgdXNlciBmaWxlIHN5c3RlbSB3aGVuIGNsaWNraW5nIG9uIHVwbG9hZCBhcmVhXG4gIGNvbnN0IGZpbGVTZWxlY3RvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGZpbGVTZWxlY3Rvci50eXBlID0gJ2ZpbGUnO1xuICBmaWxlU2VsZWN0b3IubXVsdGlwbGUgPSB0cnVlO1xuICBmaWxlU2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gaGFuZGxlRmlsZVNlbGVjdG9yQ2hhbmdlKCkge1xuICAgIGNvbnN0IGZpbGVMaXN0OiBGaWxlTGlzdCA9IGZpbGVTZWxlY3Rvci5maWxlcztcbiAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20oZmlsZUxpc3QpO1xuICAgIGNvbnN0IHJlamVjdEZpbGVzID0gYWRkTmV3RmlsZXMoZmlsZXMpO1xuICAgIGlmIChyZWplY3RGaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lcyA9IHJlamVjdEZpbGVzLm1hcCgoZmlsZSkgPT4gZmlsZS5uYW1lKTtcbiAgICAgIHdpbmRvdy5hbGVydChcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIG5vdCAubWVpLCAucG5nLCAuanBlZywgb3IgLmpzb25sZCBmaWxlczogXFxuXFxuJHtmaWxlbmFtZXMuam9pbihcbiAgICAgICAgICAnXFxuJyxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIHNlbGVjdGlvblxuICAgIGZpbGVTZWxlY3Rvci52YWx1ZSA9IG51bGw7XG4gIH0pO1xuXG4gIC8vIEFkZCBldmVudCBsaXN0ZW5lcnMgZm9yIGNsaWNrIGFuZCBkcmFnIGFuZCBkcm9wXG4gIGNvbnN0IHVwbG9hZF9hcmVhOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJyNpbml0aWFsX3VwbG9hZF9hcmVhJyxcbiAgKTtcbiAgdXBsb2FkX2FyZWEub25jbGljayA9ICgpID0+IGZpbGVTZWxlY3Rvci5jbGljaygpO1xuICAvLyBhZGQgdmlzdWFsIGN1ZXMgZm9yIGRyYWdnaW5nIGZpbGVzIG92ZXIgdXBsb2FkIGFyZWFcbiAgdXBsb2FkX2FyZWEub25kcmFnbGVhdmUgPSAoKSA9PiB1cGxvYWRfYXJlYS5jbGFzc0xpc3QucmVtb3ZlKCdvdmVyJyk7XG4gIHVwbG9hZF9hcmVhLm9uZHJhZ292ZXIgPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHVwbG9hZF9hcmVhLmNsYXNzTGlzdC5hZGQoJ292ZXInKTtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JztcbiAgfTtcbiAgLy8gcmVjZWl2ZSBmaWxlcyBvbmNlIGZpbGVzIGFyZSBkcm9wcGVkXG4gIHVwbG9hZF9hcmVhLm9uZHJvcCA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdXBsb2FkX2FyZWEuY2xhc3NMaXN0LnJlbW92ZSgnb3ZlcicpO1xuICAgIGNvbnN0IGZpbGVMaXN0ID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShmaWxlTGlzdCk7XG4gICAgY29uc3QgcmVqZWN0RmlsZXMgPSBhZGROZXdGaWxlcyhmaWxlcyk7XG4gICAgaWYgKHJlamVjdEZpbGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3QgZmlsZW5hbWVzID0gcmVqZWN0RmlsZXMubWFwKChmaWxlKSA9PiBmaWxlLm5hbWUpO1xuICAgICAgd2luZG93LmFsZXJ0KFxuICAgICAgICBgVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbm90IC5tZWksIC5wbmcsIC5qcGVnLCBvciAuanNvbmxkIGZpbGVzOiBcXG5cXG4ke2ZpbGVuYW1lcy5qb2luKFxuICAgICAgICAgICdcXG4nLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvLyBMaXN0ZW5lciBmb3Igc29ydGluZyBmaWxlL2ZvbGlvXG4gIGNvbnN0IHNvcnRCeU5hbWVCdG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNvcnRfbmFtZScpO1xuICBzb3J0QnlOYW1lQnRucy5mb3JFYWNoKChzb3J0QnlOYW1lQnRuKSA9PiB7XG4gICAgc29ydEJ5TmFtZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+XG4gICAgICBzb3J0RmlsZUJ5TmFtZShzb3J0QnlOYW1lQnRuKSxcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IFVwbG9hZEZpbGVNYW5hZ2VyIGZyb20gJy4vVXBsb2FkRmlsZU1hbmFnZXInO1xuaW1wb3J0IHsgY3JlYXRlTWFuaWZlc3QsIGFkZERvY3VtZW50IH0gZnJvbSAnLi9TdG9yYWdlJztcbmltcG9ydCB7IElGb2xkZXIsIEZpbGVTeXN0ZW1Ub29scyB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmNvbnN0IGZtID0gVXBsb2FkRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuLy8gU2V0IE1FSSB0ZW1wbGF0ZVxuY29uc3QgdGVtcGxhdGVQYXRoID0gJ3NhbXBsZXMvbWVpL21laV90ZW1wbGF0ZS5tZWknO1xuZm0uc2V0TWVpVGVtcGxhdGUodGVtcGxhdGVQYXRoKTtcblxuLy8gQWRkcyBuZXcgZmlsZXMgdG8gdXBsb2FkIHBhaXJpbmcgY29udGFpbmVyIGFuZCBmaWxlbWFuYWdlciwgcmV0dXJucyBsaXN0IG9mIHJlamVjdGVkIGZpbGVzXG5leHBvcnQgZnVuY3Rpb24gYWRkTmV3RmlsZXMoZmlsZXM6IEZpbGVbXSk6IEZpbGVbXSB7XG4gIGNvbnN0IG1laV9jb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21laV9saXN0Jyk7XG4gIGNvbnN0IGltYWdlX2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaW1hZ2VfbGlzdCcpO1xuXG4gIGNvbnN0IHJlamVjdEZpbGVzOiBGaWxlW10gPSBbXTtcbiAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IGV4dCA9IGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpO1xuXG4gICAgaWYgKGV4dCA9PT0gJ21laScpIHtcbiAgICAgIGNvbnN0IHVucGFpcmVkSXRlbSA9IGNyZWF0ZVVucGFpcmVkSXRlbShmaWxlLm5hbWUsICdtZWknKTtcbiAgICAgIG1laV9jb250YWluZXIuYXBwZW5kQ2hpbGQodW5wYWlyZWRJdGVtKTtcbiAgICAgIGZtLmFkZEZpbGUoZmlsZSk7XG4gICAgfSBlbHNlIGlmIChbJ3BuZycsICdqcGcnLCAnanBlZyddLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgIGNvbnN0IHVucGFpcmVkSXRlbSA9IGNyZWF0ZVVucGFpcmVkSXRlbShmaWxlLm5hbWUsICdpbWFnZScpO1xuICAgICAgaW1hZ2VfY29udGFpbmVyLmFwcGVuZENoaWxkKHVucGFpcmVkSXRlbSk7XG4gICAgICBmbS5hZGRGaWxlKGZpbGUpO1xuICAgIH0gZWxzZSBpZiAoZXh0ID09PSAnanNvbmxkJykge1xuICAgICAgLy8gLy8gcmVtb3ZlIG1hbnVzY3JpcHQgc3VwcG9ydCBmb3IgdGhlIGltbWVkaWF0ZSBmdXR1cmUhXG4gICAgICAvLyBjb25zdCBtYW51c2NyaXB0Rm9saW8gPSBjcmVhdGVNYW51c2NyaXB0Rm9saW8oZmlsZS5uYW1lKTtcbiAgICAgIC8vIG1hbnVzY3JpcHRfY29udGFpbmVyLmFwcGVuZENoaWxkKG1hbnVzY3JpcHRGb2xpbyk7XG4gICAgICAvLyBmbS5hZGRGaWxlKGZpbGUpO1xuICAgICAgLy8gZm0uYWRkTWFudXNjcmlwdChmaWxlLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWplY3RGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZWplY3RGaWxlcztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVW5wYWlyZWRJdGVtKGZpbGVuYW1lOiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcpOiBIVE1MRGl2RWxlbWVudCB7XG4gIGlmIChncm91cCAhPT0gJ21laScgJiYgZ3JvdXAgIT09ICdpbWFnZScpIHJldHVybjtcbiAgY29uc3QgcmFkaW9OYW1lID0gJ21laScgPT09IGdyb3VwID8gJ21laV9yYWRpb19ncm91cCcgOiAnaW1hZ2VfcmFkaW9fZ3JvdXAnO1xuICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuXG4gIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbm9kZS5jbGFzc05hbWUgPSAndW5wYWlyZWRfaXRlbV9jb250YWluZXInO1xuXG4gIGNvbnN0IHJhZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgcmFkaW8udHlwZSA9ICdyYWRpbyc7XG4gIHJhZGlvLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9pdGVtX3JhZGlvJztcbiAgcmFkaW8ubmFtZSA9IHJhZGlvTmFtZTtcbiAgcmFkaW8udmFsdWUgPSBmaWxlbmFtZTtcbiAgcmFkaW8uaWQgPSBpZDtcblxuICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gIGxhYmVsLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9pdGVtX2xhYmVsJztcbiAgbGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLCBpZCk7XG5cbiAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgdGV4dC5pbm5lclRleHQgPSBmb3JtYXRGaWxlbmFtZShmaWxlbmFtZSwgNTApO1xuICB0ZXh0LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnbWFyZ2luLXRvcDogYXV0bzsgbWFyZ2luLWxlZnQ6IDNweDsnKTtcblxuICBjb25zdCBkZWxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgZGVsQnRuLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9kZWxfYnRuJztcbiAgZGVsQnRuLnNyYyA9IGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy91bnBhaXJlZC1yZW1vdmUtZG9jLnN2Z2A7XG4gIGRlbEJ0bi50aXRsZSA9ICdkZWxldGUnO1xuXG4gIGxhYmVsLmFwcGVuZENoaWxkKHJhZGlvKTtcbiAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG4gIG5vZGUuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICBub2RlLmFwcGVuZENoaWxkKGRlbEJ0bik7XG5cbiAgZGVsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIG5vZGUucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlTWFrZVBhaXIoKTogdm9pZCB7XG4gIGNvbnN0IHBhaXJlZF9jb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID1cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGFpcmVkX2xpc3QnKTtcblxuICAvLyBnZXQgYW5kIGNoZWNrIGlmIHNlbGVjdGVkIHJhZGlvIGV4aXN0c1xuICBjb25zdCBzZWxlY3RlZE1laUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICdpbnB1dFtuYW1lPVwibWVpX3JhZGlvX2dyb3VwXCJdOmNoZWNrZWQnLFxuICApO1xuICBjb25zdCBzZWxlY3RlZEltYWdlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJ2lucHV0W25hbWU9XCJpbWFnZV9yYWRpb19ncm91cFwiXTpjaGVja2VkJyxcbiAgKTtcbiAgaWYgKHNlbGVjdGVkTWVpRWxlbWVudCA9PT0gbnVsbCB8fCBzZWxlY3RlZEltYWdlRWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gIGxldCBtZWlfZmlsZW5hbWUgPSBzZWxlY3RlZE1laUVsZW1lbnQudmFsdWU7XG4gIGNvbnN0IGltYWdlX2ZpbGVuYW1lID0gc2VsZWN0ZWRJbWFnZUVsZW1lbnQudmFsdWU7XG4gIGxldCBpc0NyZWF0ZWQgPSBmYWxzZTtcblxuICBpZiAoc2VsZWN0ZWRNZWlFbGVtZW50LnZhbHVlID09PSAnY3JlYXRlX21laScpIHtcbiAgICBpc0NyZWF0ZWQgPSB0cnVlO1xuICAgIC8vIENoYW5nZSBleHRlbnNpb25cbiAgICBjb25zdCBmbiA9IGltYWdlX2ZpbGVuYW1lLnNwbGl0KCcuJyk7XG4gICAgaWYgKGZuLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZuLnBvcCgpO1xuICAgIH1cbiAgICBmbi5wdXNoKCdtZWknKTtcblxuICAgIG1laV9maWxlbmFtZSA9IGZuLmpvaW4oJy4nKTtcbiAgICAvLyBDcmVhdGUgbmV3IE1FSSBmaWxlXG4gICAgZm0uZ2V0SW1nRGltZW5zaW9uKGltYWdlX2ZpbGVuYW1lKVxuICAgICAgLnRoZW4oKGRpbWVuc2lvbnMpID0+IHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBzdGFmZlNwYWNlIH0gPSBkaW1lbnNpb25zO1xuICAgICAgICBjb25zdCBuZXdNZWlGaWxlID0gZm0uY3JlYXRlTWVpRmlsZShcbiAgICAgICAgICBtZWlfZmlsZW5hbWUsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHN0YWZmU3BhY2UsXG4gICAgICAgICk7XG4gICAgICAgIGZtLmFkZEZpbGUobmV3TWVpRmlsZSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cbiAgY29uc3QgZmlsZW5hbWUgPSBtZWlfZmlsZW5hbWUuc3Vic3RyaW5nKDAsIG1laV9maWxlbmFtZS5sZW5ndGggLSA0KTtcbiAgLy8gbWFrZSBhbmQgYXBwZW5kIFVJIGVsZW1lbnRcbiAgY29uc3QgcGFpcmVkX2VsID0gY3JlYXRlUGFpcmVkRm9saW8oZmlsZW5hbWUsIG1laV9maWxlbmFtZSwgaW1hZ2VfZmlsZW5hbWUpO1xuICBwYWlyZWRfY29udGFpbmVyLmFwcGVuZENoaWxkKHBhaXJlZF9lbCk7XG4gIC8vIHJlZmxlY3QgaW4gZmlsZSBtYW5hZ2VyXG4gIGZtLmFkZEZvbGlvKGZpbGVuYW1lLCBtZWlfZmlsZW5hbWUsIGltYWdlX2ZpbGVuYW1lLCBpc0NyZWF0ZWQpO1xuICAvLyByZW1vdmUgZnJvbSB1bnBhaXJlZCBtZWkgYW5kIGltYWdlIGxpc3RzXG4gIGlmICghaXNDcmVhdGVkKSBzZWxlY3RlZE1laUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xuICBzZWxlY3RlZEltYWdlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhaXJlZEZvbGlvKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBtZWlfZmlsZW5hbWU6IHN0cmluZyxcbiAgaW1hZ2VfZmlsZW5hbWU6IHN0cmluZyxcbik6IEhUTUxEaXZFbGVtZW50IHtcbiAgY29uc3QgbWVpX2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWVpX2xpc3QnKTtcbiAgY29uc3QgaW1hZ2VfY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbWFnZV9saXN0Jyk7XG5cbiAgY29uc3QgZm9saW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9saW8uY2xhc3NOYW1lID0gJ2ZvbGlvX2l0ZW0nO1xuICBmb2xpby5zZXRBdHRyaWJ1dGUoJ21laScsIG1laV9maWxlbmFtZSk7XG4gIGZvbGlvLnNldEF0dHJpYnV0ZSgnaW1hZ2UnLCBpbWFnZV9maWxlbmFtZSk7XG5cbiAgY29uc3QgZm9saW9fZmlsZW5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9saW9fZmlsZW5hbWUuY2xhc3NMaXN0LmFkZCgnZm9saW8tZmlsZW5hbWUnKTtcbiAgZm9saW9fZmlsZW5hbWUuaW5uZXJIVE1MID0gZm9ybWF0RmlsZW5hbWUoZmlsZW5hbWUsIDUwKTtcbiAgZm9saW8uYXBwZW5kQ2hpbGQoZm9saW9fZmlsZW5hbWUpO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZVVucGFpcigpIHtcbiAgICAvLyByZW1vdmUgZm9saW8gZnJvbSBVSVxuICAgIGZvbGlvLnJlbW92ZSgpO1xuICAgIC8vIHJlbW92ZSBmb2xpbyBmcm9tIGZpbGUgbWFuYWdlclxuICAgIGNvbnN0IGlzQ3JlYXRlZCA9IGZtLmlzQ3JlYXRlZEZvbGlvKGZpbGVuYW1lKTtcbiAgICBmbS5yZW1vdmVGb2xpbyhmaWxlbmFtZSk7XG4gICAgLy8gYWRkIGl0ZW1zIGJhY2sgdG8gdW5wYWlyZWQgY29udGFpbmVyc1xuICAgIGlmICghaXNDcmVhdGVkKSB7XG4gICAgICBjb25zdCBtZWlJdGVtID0gY3JlYXRlVW5wYWlyZWRJdGVtKG1laV9maWxlbmFtZSwgJ21laScpO1xuICAgICAgbWVpX2NvbnRhaW5lci5hcHBlbmRDaGlsZChtZWlJdGVtKTtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VJdGVtID0gY3JlYXRlVW5wYWlyZWRJdGVtKGltYWdlX2ZpbGVuYW1lLCAnaW1hZ2UnKTtcbiAgICBpbWFnZV9jb250YWluZXIuYXBwZW5kQ2hpbGQoaW1hZ2VJdGVtKTtcbiAgfVxuXG4gIGNvbnN0IHVucGFpckJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICB1bnBhaXJCdG4uY2xhc3NOYW1lID0gJ3VucGFpcl9idG4nO1xuICB1bnBhaXJCdG4uc3JjID0gYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3VucGFpci1kb2Muc3ZnYDtcbiAgdW5wYWlyQnRuLnRpdGxlID0gJ3VucGFpcic7XG4gIHVucGFpckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVVucGFpcik7XG4gIGZvbGlvLmFwcGVuZENoaWxkKHVucGFpckJ0bik7XG5cbiAgcmV0dXJuIGZvbGlvO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzKFxuICBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLFxuKTogUHJvbWlzZTx7IHN0YXR1czogc3RyaW5nOyB2YWx1ZT86IHN0cmluZzsgcmVhc29uPzogYW55IH1bXT4ge1xuICBjb25zdCBmb2xpb1Byb21pc2VzID0gZm1cbiAgICAuZ2V0Rm9saW9zKClcbiAgICAubWFwKGFzeW5jIChbbmFtZSwgbWVpLCBpbWFnZV06IFtzdHJpbmcsIEZpbGUsIEZpbGVdKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHVwbG9hZEZvbGlvKGlkLCBuYW1lLCBtZWksIGltYWdlLCBjdXJyZW50Rm9sZGVyKTtcbiAgICB9KTtcblxuICBjb25zdCBtYW51c2NyaXB0UHJvbWlzZXMgPSBbXTsgLy9mbS5nZXRNYW51c2NyaXB0cygpXG4gIC8vIC5tYXAoIGFzeW5jIChmaWxlOiBGaWxlKSA9PiB7XG4gIC8vICAgcmV0dXJuIGF3YWl0IHVwbG9hZE1hbnVzY3JpcHQoZmlsZSk7XG4gIC8vIH0pO1xuXG4gIGNvbnN0IHByb21pc2VzID0gWy4uLmZvbGlvUHJvbWlzZXMsIC4uLm1hbnVzY3JpcHRQcm9taXNlc10ubWFwKChwKSA9PlxuICAgIFByb21pc2UucmVzb2x2ZShwKS50aGVuKFxuICAgICAgKHZhbHVlKSA9PiAoeyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZSB9KSxcbiAgICAgIChyZWFzb24pID0+ICh7IHN0YXR1czogJ3JlamVjdGVkJywgcmVhc29uIH0pLFxuICAgICksXG4gICk7XG5cbiAgZm0uY2xlYXIoKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkRm9saW8oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgbWVpOiBGaWxlLFxuICBpbWFnZTogRmlsZSxcbiAgY3VycmVudEZvbGRlcjogSUZvbGRlcixcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBuZXdOYW1lID0gZm5Db25mbGljdEhhbmRsZXIoXG4gICAgbmFtZSxcbiAgICBGaWxlU3lzdGVtVG9vbHMuZ2V0QWxsTmFtZXMoY3VycmVudEZvbGRlciksXG4gICk7XG4gIHJldHVybiAoXG4gICAgY3JlYXRlTWFuaWZlc3QoaWQsIG5ld05hbWUsIG1laSwgaW1hZ2UpXG4gICAgICAudGhlbigobWFuaWZlc3QpID0+IHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RCbG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKV0sIHtcbiAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpc1NpbmdsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBhZGREb2N1bWVudChpZCwgbmV3TmFtZSwgbWFuaWZlc3RCbG9iLCBpc1NpbmdsZSk7XG4gICAgICB9KVxuICAgICAgLy8gYWRkIHRvIGRhc2hib2FyZCBGaWxlU3lzdGVtXG4gICAgICAudGhlbigoc3VjY2VlZGVkKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZWVkZWQpIHtcbiAgICAgICAgICBjb25zdCBkYXRldGltZSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICBjb25zdCBmaWxlRW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlRmlsZShuZXdOYW1lLCBpZCk7XG4gICAgICAgICAgY29uc3QgZm9saW9FbnRyeSA9IEZpbGVTeXN0ZW1Ub29scy5hZGRNZXRhZGF0YShmaWxlRW50cnksIHtcbiAgICAgICAgICAgIHR5cGU6ICdmb2xpbycsXG4gICAgICAgICAgICBjcmVhdGVkX29uOiBkYXRldGltZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBpc0FkZGVkID0gRmlsZVN5c3RlbVRvb2xzLmFkZEVudHJ5KGZvbGlvRW50cnksIGN1cnJlbnRGb2xkZXIpO1xuICAgICAgICAgIHJldHVybiBpc0FkZGVkID8gbmV3TmFtZSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCB0byB1cGxvYWRGb2xpbzogJyArIG5hbWUpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICApO1xufVxuXG4vLyBhc3luYyBmdW5jdGlvbiB1cGxvYWRNYW51c2NyaXB0KG1hbnVzY3JpcHQ6IEZpbGUpOiBQcm9taXNlPGJvb2xlYW4+IHtcbi8vICAgcmV0dXJuIGFkZEVudHJ5KG1hbnVzY3JpcHQubmFtZSwgbWFudXNjcmlwdCwgZmFsc2UpO1xuLy8gfVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc29ydEZpbGVCeU5hbWUoc29ydEJ5TmFtZUJ0bjogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlTGlzdCA9IHNvcnRCeU5hbWVCdG4ucGFyZW50RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gIGNvbnN0IGZpbGVFbGVtZW50cyA9IEFycmF5LmZyb20oZmlsZUxpc3QuY2hpbGRyZW4pO1xuXG4gIGxldCBpc0FzY2VuZGluZyA9IHNvcnRCeU5hbWVCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdhcnJvdy11cCcpO1xuXG4gIGlmIChpc0FzY2VuZGluZykge1xuICAgIHNvcnRCeU5hbWVCdG4uY2xhc3NMaXN0LnJlbW92ZSgnYXJyb3ctdXAnKTtcbiAgICBzb3J0QnlOYW1lQnRuLmNsYXNzTGlzdC5hZGQoJ2Fycm93LWRvd24nKTtcbiAgICBzb3J0QnlOYW1lQnRuLmlubmVySFRNTCA9ICcmI3gyMkMxOyc7XG4gIH0gZWxzZSB7XG4gICAgc29ydEJ5TmFtZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhcnJvdy1kb3duJyk7XG4gICAgc29ydEJ5TmFtZUJ0bi5jbGFzc0xpc3QuYWRkKCdhcnJvdy11cCcpO1xuICAgIHNvcnRCeU5hbWVCdG4uaW5uZXJIVE1MID0gJyYjeDIyQzA7JztcbiAgfVxuXG4gIGlzQXNjZW5kaW5nID0gIWlzQXNjZW5kaW5nO1xuXG4gIGZpbGVFbGVtZW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgbmFtZUEgPSBhLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBjb25zdCBuYW1lQiA9IGIudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIHJldHVybiBpc0FzY2VuZGluZ1xuICAgICAgPyBuYW1lQS5sb2NhbGVDb21wYXJlKG5hbWVCKVxuICAgICAgOiBuYW1lQi5sb2NhbGVDb21wYXJlKG5hbWVBKTtcbiAgfSk7XG5cbiAgZmlsZUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBmaWxlTGlzdC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgfSk7XG5cbiAgc29ydEJ5TmFtZUJ0bi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2NvbG9yOiBibGFjaycpO1xufVxuXG4vLyBhc3luYyBmdW5jdGlvbiB1cGxvYWRNYW51c2NyaXB0KG1hbnVzY3JpcHQ6IEZpbGUsIGN1cnJlbnRGb2xkZXI6IElGb2xkZXIsIGV4aXN0aW5nTmFtZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4vLyAgIGNvbnN0IGlzU2luZ2xlID0gZmFsc2U7XG4vLyAgIGNvbnN0IGlkID0gbWFudXNjcmlwdFsnQGlkJ10gIT09IG51bGwgPyBtYW51c2NyaXB0WydAaWQnXSA6IG1hbnVzY3JpcHQubmFtZTtcbi8vICAgcmV0dXJuIGFkZEVudHJ5KGlkLCBtYW51c2NyaXB0Lm5hbWUsIG1hbnVzY3JpcHQsIGlzU2luZ2xlKVxuLy8gICAgIC8vIGFkZCB0byBkYXNoYm9hcmQgRmlsZVN5c3RlbVxuLy8gICAgIC50aGVuKHN1Y2NlZWRlZCA9PiB7XG4vLyAgICAgICBpZiAoc3VjY2VlZGVkKSB7XG4vLyAgICAgICAgIGNvbnN0IG5ld05hbWUgPSBmbkNvbmZsaWN0SGFuZGxlcihtYW51c2NyaXB0Lm5hbWUsIGV4aXN0aW5nTmFtZXMpO1xuLy8gICAgICAgICBjb25zdCBkYXRldGltZSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKTtcbi8vICAgICAgICAgY29uc3QgZmlsZUVudHJ5ID0gRmlsZVN5c3RlbVRvb2xzLmNyZWF0ZUZpbGUobmV3TmFtZSwgaWQpO1xuLy8gICAgICAgICBjb25zdCBtYW51c2NyaXB0RW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuYWRkTWV0YWRhdGEoZmlsZUVudHJ5LCB7IHR5cGU6ICdtYW51c2NyaXB0JywgY3JlYXRlZF9vbjogZGF0ZXRpbWUgfSk7XG4vLyAgICAgICAgIGNvbnN0IGlzQWRkZWQgPSBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkobWFudXNjcmlwdEVudHJ5LCBjdXJyZW50Rm9sZGVyKTtcbi8vICAgICAgICAgcmV0dXJuIGlzQWRkZWQ7XG4vLyAgICAgICB9XG4vLyAgICAgICBlbHNlIHtcbi8vICAgICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCB0byB1cGxvYWRGb2xpbzogJyArIG5hbWUpO1xuLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyB9XG5cbi8vIExpbWl0IGZpbGVuYW1lIGxlbmd0aFxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcsIG1heExlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2h1bmtMZW4gPSBNYXRoLmZsb29yKG1heExlbiAvIDIpO1xuICBjb25zdCBsZW4gPSBmaWxlbmFtZS5sZW5ndGg7XG4gIGlmIChsZW4gPD0gbWF4TGVuKSByZXR1cm4gZmlsZW5hbWU7XG4gIGVsc2VcbiAgICByZXR1cm4gYCR7ZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGNodW5rTGVuIC0gMSl9Li4uJHtmaWxlbmFtZS5zdWJzdHJpbmcoXG4gICAgICBsZW4gLSBjaHVua0xlbiArIDIsXG4gICAgICBsZW4sXG4gICAgKX1gO1xufVxuXG4vLyBSZW5hbWVzIGZpbGUgaWYgdGhlcmUgYXJlIG5hbWluZyBjb25mbGljdHMsIGluIHRoZSBmb3JtIG9mICdmb29iYXIgKDEpJ1xuZXhwb3J0IGZ1bmN0aW9uIGZuQ29uZmxpY3RIYW5kbGVyKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBleGlzdGluZ05hbWVzOiBzdHJpbmdbXSxcbik6IHN0cmluZyB7XG4gIGxldCBuZXdGaWxlbmFtZSA9IGZpbGVuYW1lO1xuICBsZXQgY291bnRlciA9IDE7XG5cbiAgd2hpbGUgKGV4aXN0aW5nTmFtZXMuaW5jbHVkZXMobmV3RmlsZW5hbWUpKSB7XG4gICAgbmV3RmlsZW5hbWUgPSBgJHtmaWxlbmFtZX0oJHtjb3VudGVyfSlgO1xuICAgIGNvdW50ZXIrKztcbiAgfVxuICByZXR1cm4gbmV3RmlsZW5hbWU7XG59XG4iLCJpbXBvcnQgeyB1dWlkdjQgfSBmcm9tICcuLi91dGlscy9yYW5kb20nO1xuaW1wb3J0ICogYXMgdmtiZWF1dGlmeSBmcm9tICd2a2JlYXV0aWZ5JztcblxuLyoqXG4gKiBNYW5hZ2VyIGZvciBmaWxlIHVwbG9hZGluZyBhbmQgcGFpcmluZyBwcm9jZXNzXG4gKi9cbmNsYXNzIFVwbG9hZEZpbGVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFVwbG9hZEZpbGVNYW5hZ2VyO1xuXG4gIHByaXZhdGUgYWxsRmlsZXMgPSBuZXcgTWFwPHN0cmluZywge2ZpbGU6IEZpbGUsIGNvdW50OiBudW1iZXJ9PigpO1xuICBwcml2YXRlIGZvbGlvcyA9IG5ldyBBcnJheTxmb2xpbz4oKTsgLy8gZmlsZW5hbWUsIG1laV9maWxlbmFtZSwgaW1hZ2VfZmlsZW5hbWVcbiAgLy8gcHJpdmF0ZSBtYW51c2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHByaXZhdGUgbWVpVGVtcGxhdGU6IHN0cmluZztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVXBsb2FkRmlsZU1hbmFnZXIge1xuICAgIGlmICghVXBsb2FkRmlsZU1hbmFnZXIuaW5zdGFuY2UpIHtcbiAgICAgIFVwbG9hZEZpbGVNYW5hZ2VyLmluc3RhbmNlID0gbmV3IFVwbG9hZEZpbGVNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBVcGxvYWRGaWxlTWFuYWdlci5pbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRGaWxlKGZpbGU6IEZpbGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsRmlsZXMuaGFzKGZpbGUubmFtZSkpIHtcbiAgICAgIGNvbnN0IG5ld0VudHJ5ID0geyBmaWxlOiBmaWxlLCBjb3VudDogMSB9O1xuICAgICAgdGhpcy5hbGxGaWxlcy5zZXQoZmlsZS5uYW1lLCBuZXdFbnRyeSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb3VudCA9IHRoaXMuZ2V0RmlsZUNvdW50KGZpbGUubmFtZSk7XG4gICAgICBjb25zdCB1cGRhdGVkRW50cnkgPSB7IGZpbGU6IGZpbGUsIGNvdW50OiBleGlzdGluZ0NvdW50KzEgfTtcbiAgICAgIHRoaXMuYWxsRmlsZXMuc2V0KGZpbGUubmFtZSwgdXBkYXRlZEVudHJ5KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0TWVpVGVtcGxhdGUodGVtcGxhdGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0ZW1wbGF0ZVBhdGgpO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIE1FSSB0ZW1wbGF0ZSBmcm9tICR7dGVtcGxhdGVQYXRofWApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1laVRlbXBsYXRlID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlTWVpRmlsZShmaWxlbmFtZTogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgc3RhZmZTcGFjZTogbnVtYmVyKTogRmlsZSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5tZWlUZW1wbGF0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIE1FSSB0ZW1wbGF0ZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTtcbiAgICAgIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGhpcy5tZWlUZW1wbGF0ZSwgJ3RleHQveG1sJyk7XG4gICAgICBjb25zdCBtZWkgPSBtZWlEb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICBjb25zdCBtZWlIZWFkID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ21laUhlYWQnKTtcbiAgICAgIG1laUhlYWQuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3QgZmlsZURlc2MgPSBtZWkucXVlcnlTZWxlY3RvcignZmlsZURlc2MnKTtcbiAgICAgIGZpbGVEZXNjLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHRpdGxlU3RtdCA9IG1laS5xdWVyeVNlbGVjdG9yKCd0aXRsZVN0bXQnKTtcbiAgICAgIHRpdGxlU3RtdC5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCB0aXRsZSA9IG1laS5xdWVyeVNlbGVjdG9yKCd0aXRsZScpO1xuICAgICAgdGl0bGUuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3QgcHViU3RtdCA9IG1laS5xdWVyeVNlbGVjdG9yKCdwdWJTdG10Jyk7XG4gICAgICBwdWJTdG10LnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IGZhY3NpbWlsZSA9IG1laS5xdWVyeVNlbGVjdG9yKCdmYWNzaW1pbGUnKTtcbiAgICAgIGZhY3NpbWlsZS5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzdXJmYWNlID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3N1cmZhY2UnKTtcbiAgICAgIGNvbnN0IHN1cmZhY2VJZCA9ICdtLScgKyB1dWlkdjQoKTtcbiAgICAgIHN1cmZhY2Uuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCBzdXJmYWNlSWQpO1xuICAgICAgc3VyZmFjZS5zZXRBdHRyaWJ1dGUoJ2xyeCcsIHdpZHRoLnRvU3RyaW5nKCkpO1xuICAgICAgc3VyZmFjZS5zZXRBdHRyaWJ1dGUoJ2xyeScsIGhlaWdodC50b1N0cmluZygpKTtcbiAgICAgIFxuICAgICAgY29uc3Qgem9uZSA9IG1laS5xdWVyeVNlbGVjdG9yKCd6b25lJyk7XG4gICAgICBjb25zdCB6b25lSWQgPSAnbS0nICsgdXVpZHY0KCk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgem9uZUlkKTtcbiAgICAgIGNvbnN0IG1hcmdpblJhdGVWID0gMC4xO1xuICAgICAgY29uc3QgbWFyZ2luUmF0ZUggPSAwLjE1O1xuICAgICAgY29uc3QgbWFyZ2luViA9IE1hdGgucm91bmQobWFyZ2luUmF0ZVYgKiB3aWR0aCk7XG4gICAgICBjb25zdCBtYXJnaW5IID0gTWF0aC5yb3VuZChtYXJnaW5SYXRlSCAqIHdpZHRoKTtcbiAgICAgIHpvbmUuc2V0QXR0cmlidXRlKCd1bHgnLCBtYXJnaW5ILnRvU3RyaW5nKCkpO1xuICAgICAgem9uZS5zZXRBdHRyaWJ1dGUoJ3VseScsIG1hcmdpblYudG9TdHJpbmcoKSk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgnbHJ4JywgKHdpZHRoIC0gbWFyZ2luSCkudG9TdHJpbmcoKSk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgnbHJ5JywgKG1hcmdpblYgKyAzICogc3RhZmZTcGFjZSkudG9TdHJpbmcoKSk7XG5cbiAgICAgIGNvbnN0IG1kaXYgPSBtZWkucXVlcnlTZWxlY3RvcignbWRpdicpO1xuICAgICAgbWRpdi5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzY29yZSA9IG1laS5xdWVyeVNlbGVjdG9yKCdzY29yZScpO1xuICAgICAgc2NvcmUuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3Qgc2NvcmVEZWYgPSBtZWkucXVlcnlTZWxlY3Rvcignc2NvcmVEZWYnKTtcbiAgICAgIHNjb3JlRGVmLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHN0YWZmR3JwID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3N0YWZmR3JwJyk7XG4gICAgICBzdGFmZkdycC5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzdGFmZkRlZiA9IG1laS5xdWVyeVNlbGVjdG9yKCdzdGFmZkRlZicpO1xuICAgICAgc3RhZmZEZWYuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IG1laS5xdWVyeVNlbGVjdG9yKCdzZWN0aW9uJyk7XG4gICAgICBzZWN0aW9uLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHBiID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3BiJyk7XG4gICAgICBwYi5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBwYi5zZXRBdHRyaWJ1dGUoJ2ZhY3MnLCAnIycgKyBzdXJmYWNlSWQpO1xuICAgICAgY29uc3Qgc2IgPSBtZWkucXVlcnlTZWxlY3Rvcignc2InKTtcbiAgICAgIHNiLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIHNiLnNldEF0dHJpYnV0ZSgnZmFjcycsICcjJyArIHpvbmVJZCk7XG5cbiAgICAgIGNvbnN0IG1laUZpbGVDb250ZW50ID0gdmtiZWF1dGlmeS54bWwoc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhtZWlEb2MpKTtcbiAgICAgIGNvbnN0IG1laUJsb2IgPSBuZXcgQmxvYihbbWVpRmlsZUNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L3htbCcgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgRmlsZShbbWVpQmxvYl0sIGZpbGVuYW1lLCB7IHR5cGU6ICd0ZXh0L3htbCcgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfSBcblxuICBwdWJsaWMgZ2V0SW1nRGltZW5zaW9uKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIsIHN0YWZmU3BhY2U6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZ0ZpbGUgPSB0aGlzLmdldEZpbGUoZmlsZW5hbWUpO1xuXG4gICAgICBpZiAoIWltZ0ZpbGUpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICAgICAgaWYgKCFjdHgpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgMkQgY29udGV4dCcpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuXG4gICAgICAgICAgLy8gQmluYXJpemF0aW9uXG4gICAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgIGNvbnN0IGJpbmFyeVRocmVzaG9sZCA9IDEyNztcbiAgICAgICAgICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGE7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgICBjb25zdCBncmF5c2NhbGUgPSAoZGF0YVtpXSArIGRhdGFbaSArIDFdICsgZGF0YVtpICsgMl0pIC8gMztcbiAgICAgICAgICAgIGNvbnN0IGJpbmFyeVZhbHVlID0gZ3JheXNjYWxlIDwgYmluYXJ5VGhyZXNob2xkID8gMCA6IDI1NTtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBiaW5hcnlWYWx1ZTtcbiAgICAgICAgICAgIGRhdGFbaSArIDFdID0gYmluYXJ5VmFsdWU7XG4gICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGJpbmFyeVZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG5cbiAgICAgICAgICAvLyBGaW5kaW5nIHN0YWZmIHNwYWNlXG4gICAgICAgICAgY29uc3Qgd2hpdGVSdW5MZW5ndGhzOiBudW1iZXJbXSA9IFtdOyAgXG4gICAgICAgICAgbGV0IGN1cnJTcGFjZUNvdW50ID0gMDtcbiAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNhbnZhcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAvLyBuZXcgY3VyclNwYWNlQ291bnQgZm9yIGV2ZXJ5IGNvbHVtblxuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gY3R4LmdldEltYWdlRGF0YSh4LCAwLCAxLCBjYW52YXMuaGVpZ2h0KS5kYXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBjb2x1bW4ubGVuZ3RoOyBwICs9IDQpIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpeGVsIGlzIGJsYWNrICgwKSBvciB3aGl0ZSAoMjU1KVxuICAgICAgICAgICAgICBpZiAoY29sdW1uW3BdID09PSAwICYmIGN1cnJTcGFjZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHdoaXRlUnVuTGVuZ3Rocy5wdXNoKGN1cnJTcGFjZUNvdW50KTtcbiAgICAgICAgICAgICAgICBjdXJyU3BhY2VDb3VudCA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclNwYWNlQ291bnQrKztcbiAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNlY29uZCBtb3N0IGNvbW1vbiB2YWx1ZSBhcyBzdGFmZiBzcGFjZVxuICAgICAgICAgIGNvbnN0IHN0YWZmU3BhY2UgPSB3aGl0ZVJ1bkxlbmd0aHMubGVuZ3RoID4gMCA/IHRoaXMuZmluZFNlY29uZE1vZGUod2hpdGVSdW5MZW5ndGhzKSA6IDA7XG5cbiAgICAgICAgICByZXNvbHZlKHsgd2lkdGg6IGltZy53aWR0aCwgaGVpZ2h0OiBpbWcuaGVpZ2h0LCBzdGFmZlNwYWNlOiAgc3RhZmZTcGFjZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgaW1hZ2U6ICR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICB9O1xuICAgICAgICBpbWcuc3JjID0gZXZlbnQudGFyZ2V0LnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICB9O1xuXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChpbWdGaWxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFNlY29uZE1vZGUoYXJyOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgY29uc3QgY291bnRNYXA6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICAvLyBDb3VudCBvY2N1cnJlbmNlcyBvZiBlYWNoIGVsZW1lbnRcbiAgICBhcnIuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IGNvdW50ID0gKGNvdW50TWFwLmdldChlbGVtZW50KSB8fCAwKSArIDE7XG4gICAgICBjb3VudE1hcC5zZXQoZWxlbWVudCwgY291bnQpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc29ydGVkTWFwID0gQXJyYXkuZnJvbShjb3VudE1hcC5lbnRyaWVzKCkpLnNvcnQoKGEsIGIpID0+IGJbMV0gLSBhWzFdKTtcblxuICAgIHJldHVybiBzb3J0ZWRNYXBbMV1bMF07XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRGaWxlKGtleTogc3RyaW5nKTogRmlsZSB7XG4gICAgaWYgKHRoaXMuYWxsRmlsZXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsbEZpbGVzLmdldChrZXkpLmZpbGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZUZpbGUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuZ2V0RmlsZUNvdW50KGtleSk7XG4gICAgaWYgKGNvdW50ID09PSAwKSByZXR1cm47XG4gICAgZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgIHRoaXMuYWxsRmlsZXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgdXBkYXRlZEVudHJ5ID0geyBmaWxlOiB0aGlzLmFsbEZpbGVzLmdldChrZXkpLmZpbGUsIGNvdW50OiBjb3VudC0xIH07XG4gICAgICB0aGlzLmFsbEZpbGVzLnNldChrZXksIHVwZGF0ZWRFbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEZpbGVDb3VudChrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKCB0aGlzLmFsbEZpbGVzLmhhcyhrZXkpICkge1xuICAgICAgcmV0dXJuIHRoaXMuYWxsRmlsZXMuZ2V0KGtleSkuY291bnQ7XG4gICAgfVxuICAgIGVsc2UgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgYWRkRm9saW8obmFtZTogc3RyaW5nLCBtZWk6IHN0cmluZywgaW1hZ2U6IHN0cmluZywgaXNDcmVhdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbmV3Rm9saW86IGZvbGlvID0ge1xuICAgICAgZmlsZW5hbWU6IG5hbWUsXG4gICAgICBtZWlfZmlsZW5hbWU6IG1laSxcbiAgICAgIGltYWdlX2ZpbGVuYW1lOiBpbWFnZSxcbiAgICAgIGlzQ3JlYXRlZDogaXNDcmVhdGVkLFxuICAgIH07XG4gICAgdGhpcy5mb2xpb3MucHVzaChuZXdGb2xpbyk7XG4gIH1cblxuICAvLyBwdWJsaWMgYWRkTWFudXNjcmlwdChmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vICAgdGhpcy5tYW51c2NyaXB0cy5wdXNoKGZpbGVuYW1lKTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBpc0NyZWF0ZWRGb2xpbyhmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9saW8gPSB0aGlzLmZvbGlvcy5maW5kKChmb2xpbykgPT4gZm9saW8uZmlsZW5hbWUgPT09IGZpbGVuYW1lKTtcbiAgICByZXR1cm4gZm9saW8gPyBmb2xpby5pc0NyZWF0ZWQgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVGb2xpbyhmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5mb2xpb3MuZmluZEluZGV4KCBmb2xpbyA9PiBmb2xpby5maWxlbmFtZSA9PT0gZmlsZW5hbWUpO1xuICAgIHRoaXMuZm9saW9zLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgLy8gcHVibGljIHJlbW92ZU1hbnVzY3JpcHQoZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAvLyAgIGNvbnN0IGlkeCA9IHRoaXMubWFudXNjcmlwdHMuZmluZEluZGV4KG1hbnVzY3JpcHQgPT4gbWFudXNjcmlwdCA9PT0gZmlsZW5hbWUpO1xuICAvLyAgIHRoaXMubWFudXNjcmlwdHMuc3BsaWNlKGlkeCk7XG4gIC8vICAgdGhpcy5yZW1vdmVGaWxlKGZpbGVuYW1lKTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBnZXRGb2xpb3MoKTogW3N0cmluZywgRmlsZSwgRmlsZV1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9saW9zLm1hcCggZm9saW8gPT4ge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBmb2xpby5maWxlbmFtZTtcbiAgICAgIGNvbnN0IG1laV9maWxlbmFtZSA9IGZvbGlvLm1laV9maWxlbmFtZTtcbiAgICAgIGNvbnN0IGltYWdlX2ZpbGVuYW1lID0gZm9saW8uaW1hZ2VfZmlsZW5hbWU7XG4gICAgICByZXR1cm4gW2ZpbGVuYW1lLCB0aGlzLmdldEZpbGUobWVpX2ZpbGVuYW1lKSwgdGhpcy5nZXRGaWxlKGltYWdlX2ZpbGVuYW1lKV07XG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0TWFudXNjcmlwdHMoKTogRmlsZVtdIHtcbiAgLy8gICByZXR1cm4gdGhpcy5tYW51c2NyaXB0cy5tYXAoIG1hbnVzY3JpcHQgPT4gdGhpcy5nZXRGaWxlKG1hbnVzY3JpcHQpKTtcbiAgLy8gfVxuXG4gIC8vIHB1YmxpYyBjbGVhck1hbnVzY3JpcHRzKCk6IHZvaWQge1xuICAvLyAgIHRoaXMubWFudXNjcmlwdHMuZm9yRWFjaCggZmlsZW5hbWUgPT4ge1xuICAvLyAgICAgdGhpcy5yZW1vdmVGaWxlKGZpbGVuYW1lKTtcbiAgLy8gICB9KTtcbiAgLy8gICB0aGlzLm1hbnVzY3JpcHRzID0gW107XG4gIC8vIH1cbiAgXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpbGVzLmNsZWFyKCk7XG4gICAgdGhpcy5mb2xpb3Muc3BsaWNlKDApO1xuICB9XG5cbiAgcHVibGljIHByaW50KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKHRoaXMuYWxsRmlsZXMpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuZm9saW9zKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLm1hbnVzY3JpcHRzKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVcGxvYWRGaWxlTWFuYWdlcjtcblxudHlwZSBmb2xpbyA9IHtcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgbWVpX2ZpbGVuYW1lOiBzdHJpbmcsXG4gIGltYWdlX2ZpbGVuYW1lOiBzdHJpbmcsXG4gIGlzQ3JlYXRlZDogYm9vbGVhbixcbn07IiwiLy8gSWYgdXNlciByaWdodC1jbGlja3Mgb24gYmFja2dyb3VuZCBhbmQgbm90aGluZyBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS11cGxvYWQtZG9jLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5VcGxvYWQgZG9jdW1lbnQ8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9uZXctZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1uZXctZm9sZGVyLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5OZXcgZm9sZGVyPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbmV3LWZvbGRlci5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBhIHNpbmdsZSBmaWxlIGlzIHNlbGVjdGVkXG5leHBvcnQgY29uc3Qgc2luZ2xlRmlsZU9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLW9wZW4tYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk9wZW48L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9vcGVuLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVuYW1lLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5SZW5hbWU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW5hbWUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1tb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbW92ZS1kb2MtaWNvbi5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBtdWx0aXBsZSBmaWxlcyBhcmUgc2VsZWN0ZWRcbmV4cG9ydCBjb25zdCBtdWx0aUZpbGVPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1vcGVuLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5PcGVuPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvb3Blbi1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImNtLXJlbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZSB0byBUcmFzaDwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlbW92ZS1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImNtLW1vdmUtYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk1vdmU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9tb3ZlLWRvYy1pY29uLnN2Z1wiPlxuICAgIDwvZGl2PmA7XG5cbi8vIElmIDEgb3IgbW9yZSBmaWxlcyBhbmQgMSBvciBtb3JlIGZvbGRlcnMgYXJlIHNlbGVjdGVkXG5leHBvcnQgY29uc3QgZm9sZGVyQW5kRmlsZU9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLXJlbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+RGVsZXRlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL21vdmUtZG9jLWljb24uc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuLy8gSWYgb25lIGZvbGRlciBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IHNpbmdsZUZvbGRlck9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLW9wZW4tYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk9wZW48L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9vcGVuLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVuYW1lLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5SZW5hbWU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW5hbWUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1tb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbW92ZS1kb2MtaWNvbi5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBtdWx0aXBsZSBmb2xkZXJzIGFyZSBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IG11bHRpRm9sZGVyT3B0aW9ucyA9IFxuICAgIGA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL21vdmUtZG9jLWljb24uc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuLy8gSWYgdHJhc2ggZm9sZGVyIGlzIHNlbGVjdGVkXG5leHBvcnQgY29uc3QgdHJhc2hGb2xkZXJPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1lbXB0eS10cmFzaC1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+RW1wdHkgVHJhc2g8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW1vdmUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PmA7XG5cbi8vIElmIGVudHJ5IGluIHRyYXNoIGZvbGRlciBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IHRyYXNoRW50cnlPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1yZWNvdmVyLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5QdXQgQmFjazwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlY292ZXItZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1kZWxldGUtYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPkRlbGV0ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlbW92ZS1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+function n(e){var t=" ";if(isNaN(parseInt(e)))t=e;else switch(e){case 1:t=" ";break;case 2:t=" ";break;case 3:t=" ";break;case 4:t=" ";break;case 5:t=" ";break;case 6:t=" ";break;case 7:t=" ";break;case 8:t=" ";break;case 9:t=" ";break;case 10:t=" ";break;case 11:t=" ";break;case 12:t=" "}for(var n=["\n"],i=0;i<100;i++)n.push(n[i]+t);return n}function i(){this.step=" ",this.shift=n(this.step)}function r(e,t){return t-(e.replace(/\(/g,"").length-e.replace(/\)/g,"").length)}function o(e,t){return e.replace(/\s{1,}/g," ").replace(/ AND /gi,"~::~"+t+t+"AND ").replace(/ BETWEEN /gi,"~::~"+t+"BETWEEN ").replace(/ CASE /gi,"~::~"+t+"CASE ").replace(/ ELSE /gi,"~::~"+t+"ELSE ").replace(/ END /gi,"~::~"+t+"END ").replace(/ FROM /gi,"~::~FROM ").replace(/ GROUP\s{1,}BY/gi,"~::~GROUP BY ").replace(/ HAVING /gi,"~::~HAVING ").replace(/ IN /gi," IN ").replace(/ JOIN /gi,"~::~JOIN ").replace(/ CROSS~::~{1,}JOIN /gi,"~::~CROSS JOIN ").replace(/ INNER~::~{1,}JOIN /gi,"~::~INNER JOIN ").replace(/ LEFT~::~{1,}JOIN /gi,"~::~LEFT JOIN ").replace(/ RIGHT~::~{1,}JOIN /gi,"~::~RIGHT JOIN ").replace(/ ON /gi,"~::~"+t+"ON ").replace(/ OR /gi,"~::~"+t+t+"OR ").replace(/ ORDER\s{1,}BY/gi,"~::~ORDER BY ").replace(/ OVER /gi,"~::~"+t+"OVER ").replace(/\(\s{0,}SELECT /gi,"~::~(SELECT ").replace(/\)\s{0,}SELECT /gi,")~::~SELECT ").replace(/ THEN /gi," THEN~::~"+t).replace(/ UNION /gi,"~::~UNION~::~").replace(/ USING /gi,"~::~USING ").replace(/ WHEN /gi,"~::~"+t+"WHEN ").replace(/ WHERE /gi,"~::~WHERE ").replace(/ WITH /gi,"~::~WITH ").replace(/ ALL /gi," ALL ").replace(/ AS /gi," AS ").replace(/ ASC /gi," ASC ").replace(/ DESC /gi," DESC ").replace(/ DISTINCT /gi," DISTINCT ").replace(/ EXISTS /gi," EXISTS ").replace(/ NOT /gi," NOT ").replace(/ NULL /gi," NULL ").replace(/ LIKE /gi," LIKE ").replace(/\s{0,}SELECT /gi,"SELECT ").replace(/\s{0,}UPDATE /gi,"UPDATE ").replace(/ SET /gi," SET ").replace(/~::~{1,}/g,"~::~").split("~::~")}i.prototype.xml=function(e,t){var i=e.replace(/>\s{0,}<").replace(/-1?(a+=l[s]+i[c],o=!0,(i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1||i[c].search(/!DOCTYPE/)>-1)&&(o=!1)):i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1?(a+=i[c],o=!1):/^<\w/.exec(i[c-1])&&/^<\/\w/.exec(i[c])&&/^<[\w:\-\.\,]+/.exec(i[c-1])==/^<\/[\w:\-\.\,]+/.exec(i[c])[0].replace("/","")?(a+=i[c],o||s--):i[c].search(/<\w/)>-1&&-1==i[c].search(/<\//)&&-1==i[c].search(/\/>/)?a=a+=o?i[c]:l[s++]+i[c]:i[c].search(/<\w/)>-1&&i[c].search(/<\//)>-1?a=a+=o?i[c]:l[s]+i[c]:i[c].search(/<\//)>-1?a=a+=o?i[c]:l[--s]+i[c]:i[c].search(/\/>/)>-1?a=a+=o?i[c]:l[s]+i[c]:i[c].search(/<\?/)>-1||i[c].search(/xmlns\:/)>-1||i[c].search(/xmlns\=/)>-1?a+=l[s]+i[c]:a+=i[c];return"\n"==a[0]?a.slice(1):a},i.prototype.json=function(e,t){t=t||this.step;return"undefined"==typeof JSON?e:"string"==typeof e?JSON.stringify(JSON.parse(e),null,t):"object"==typeof e?JSON.stringify(e,null,t):e},i.prototype.css=function(e,t){var i=e.replace(/\s{1,}/g," ").replace(/\{/g,"{~::~").replace(/\}/g,"~::~}~::~").replace(/\;/g,";~::~").replace(/\/\*/g,"~::~/*").replace(/\*\//g,"*/~::~").replace(/~::~\s{0,}~::~/g,"~::~").split("~::~"),r=i.length,o=0,s="",a=0,c=t?n(t):this.shift;for(a=0;a/g,"").replace(/[ \r\n\t]{1,}xmlns/g," xmlns")).replace(/>\s{0,}<")},i.prototype.jsonmin=function(e){return"undefined"==typeof JSON?e:JSON.stringify(JSON.parse(e),null,0)},i.prototype.cssmin=function(e,t){return(t?e:e.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"")).replace(/\s{1,}/g," ").replace(/\{\s{1,}/g,"{").replace(/\}\s{1,}/g,"}").replace(/\;\s{1,}/g,";").replace(/\/\*\s{1,}/g,"/*").replace(/\*\/\s{1,}/g,"*/")},i.prototype.sqlmin=function(e){return e.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")")},e.exports=new i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.renameHTML=t.newFolderHTML=t.uploadAreaHTML=void 0,t.uploadAreaHTML='\n\n
\n \n
\n
\n\n
Unpaired Documents
\n\n
\n\n
\n
MEI
\n
\n
\n
\n \n \n \n Create new MEI file\n \n \n
\n
\n
\n\n
\n\n
\n\n
\n
\n\n
\n\n
Paired Folios
\n
\n
\n\n
\n\n
\n\n \x3c!--\n
\n --\x3e\n\n
\n
',t.newFolderHTML='\n \n
\n
\n
\n Cancel \n Create \n
\n
\n ',t.renameHTML='\n \n
\n
\n
\n Cancel \n Confirm \n
\n
\n '},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.groupingNotRecognized=void 0,t.groupingNotRecognized=function(){window.confirm("Neon does not recognize this neume grouping. Would you like to create a compound neume?")||document.getElementById("undo").click()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitStaffHandler=void 0;const i=n(3),r=n(5),o=n(23),s=n(15);t.SplitStaffHandler=class{constructor(e,t){this.handler=(e=>{const t=this.staff.id,n=(0,s.getSVGRelCoords)(e.clientX,e.clientY),a={action:"split",param:{elementId:t,x:n.x}};this.neonView.edit(a,this.neonView.view.getCurrentPageURI()).then(async e=>{e&&(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success"));const n=new o.default(this.neonView,".staff");this.splitDisable(),(0,r.selectAll)([document.querySelector("#"+t)],this.neonView,n);const s=document.getElementById("moreEdit");s&&(s.innerHTML="",s.parentElement.classList.add("hidden"))})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.staff=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click Where to Split")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitNeumeHandler=void 0;const i=n(3);t.SplitNeumeHandler=class{constructor(e,t){this.handler=(e=>{const t={action:"splitNeume",param:{elementId:this.neume.id,ncId:e.target.parentElement.id}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(async e=>{e?(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success")):(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action failed","error")),this.splitDisable()})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.neume=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click The Beginning of The Second Neume")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t){},function(e,t,n){"use strict";(function(e){t.test=function(){return"function"==typeof e.queueMicrotask},t.install=function(t){return function(){e.queueMicrotask(t)}}}).call(this,n(10))},function(e,t,n){"use strict";(function(e){var n=e.MutationObserver||e.WebKitMutationObserver;t.test=function(){return n},t.install=function(t){var i=0,r=new n(t),o=e.document.createTextNode("");return r.observe(o,{characterData:!0}),function(){o.data=i=++i%2}}}).call(this,n(10))},function(e,t,n){"use strict";(function(e){t.test=function(){return!e.setImmediate&&void 0!==e.MessageChannel},t.install=function(t){var n=new e.MessageChannel;return n.port1.onmessage=t,function(){n.port2.postMessage(0)}}}).call(this,n(10))},function(e,t,n){"use strict";(function(e){t.test=function(){return"document"in e&&"onreadystatechange"in e.document.createElement("script")},t.install=function(t){return function(){var n=e.document.createElement("script");return n.onreadystatechange=function(){t(),n.onreadystatechange=null,n.parentNode.removeChild(n),n=null},e.document.documentElement.appendChild(n),t}}}).call(this,n(10))},function(e,t,n){"use strict";t.test=function(){return!0},t.install=function(e){return function(){setTimeout(e,0)}}},,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateDocName=t.deleteDocument=t.addDocument=t.createManifest=t.fetchUploads=t.db=void 0;const i=n(30),r=n(28),o=n(92);t.db=new r.default("Neon-User-Storage"),t.fetchUploads=async function(){try{return(await new Promise((e,n)=>{t.db.allDocs({include_docs:!0}).then(t=>e(t)).catch(e=>n(e))})).rows.map(e=>({id:e.id,name:e.doc?e.doc.name:"undefined"}))}catch(e){return console.log("Couldn't fetch uploaded documents",e.message),[]}},t.createManifest=function(e,t,n,r){return new Promise(async s=>{const a=JSON.parse(JSON.stringify(o));a["@id"]=e,a.title=t,a.timestamp=(new Date).toISOString();const c=new Promise(e=>{const t=new FileReader;t.addEventListener("load",()=>{e(t.result)}),t.readAsDataURL(n)}),l=new Promise(e=>{const t=new FileReader;t.addEventListener("load",()=>{e(t.result)}),t.readAsDataURL(r)}),d=await c,u=await l;a.image=u,a.mei_annotations=[{id:(0,i.v4)(),type:"Annotation",body:d,target:u}],s(a)})},t.addDocument=function(e,n,i,r){return new Promise((o,s)=>{t.db.put({_id:e,name:n,type:r?"page":"manuscript",_attachments:{manifest:{content_type:"application/ld+json",data:i}}}).then(()=>{o(!0)}).catch(t=>{window.alert(`Error Uploading Document: ${t.message}, title: ${n}, id: ${e}.`),s(!1)})})},t.deleteDocument=function(e){return new Promise((n,i)=>{t.db.get(e).then(e=>{t.db.remove(e).then(e=>{n(!0)}).catch(e=>{console.log(e),i(e)})}).catch(e=>{console.log(e),i(e)})})},t.updateDocName=function(e,n){return new Promise((i,r)=>{t.db.get(e).then(o=>{t.db.getAttachment(e,"manifest").then(e=>{e.text().then(e=>{const s=JSON.parse(e);o.name=n,s.title=n;const a=new Blob([JSON.stringify(s,null,2)],{type:"application/ld+json"});o._attachments.manifest={content_type:"application/ld+json",data:a},t.db.put(o).then(()=>i(!0)).catch(e=>r(e))}).catch(e=>r(e))}).catch(e=>r(e))}).catch(e=>r(e))})}},,,,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.loadDashboard=t.updateDashboard=void 0;const i=n(25),r=n(46),o=n(25),s=n(94),a=n(95),c=n(98),l=n(9),d=document.querySelector("#fs-content-container"),u=document.querySelector("#main-section-content"),f=document.querySelector("#open-doc"),m=document.querySelector("#remove-doc"),h=document.querySelector("#nav-path-container");let p=document.querySelector("#fs-back-btn"),g=document.querySelector("#fs-empty-btn"),v=document.querySelector("#fs-delete-btn");const y=document.querySelector("#upload-new-doc-button"),b=document.querySelector("#add-folder-button"),w=new s.ShiftSelectionManager,_=(0,o.FileSystemManager)(),E=(0,s.dashboardState)(),S=document.querySelector(".main-section-content"),k=document.querySelector(".right-click-file-menu"),L=document.querySelector(".context-menu-items-wrapper");let A=!1,x=!1,C=null,T=!1;function N(){y.classList.contains("active")&&(0,a.InitUploadArea)(E.getParentFolder())}function O(e,t){const n=(i=t?{manifest:e}:{storage:e},Object.keys(i).map(e=>encodeURIComponent(e)+"="+encodeURIComponent(i[e])).join("&"));var i;window.open("./editor.html?"+n,"_blank")}function q(e){const t=E.getEntries().at(e);E.setSelection(e,!0);document.getElementById(t.id).classList.add("selected")}function I(e){const t=E.getEntries().at(e).id;E.setSelection(e,!1);document.getElementById(t).classList.remove("selected")}function B(){Array.from(document.querySelectorAll(".document-entry.selected")).forEach(e=>e.classList.remove("selected")),E.resetSelection()}async function M(e,t,n){if("folder"===t.type){n.addEventListener("dblclick",(async function(){return await z([...E.getFolderPath(),t])}),!1)}else n.addEventListener("dblclick",F,!1);!function(e,t){e.addEventListener("click",(function(e){P(t)}),!1)}(n,e),function(e,t){e.addEventListener("contextmenu",e=>{e.stopPropagation(),e.preventDefault(),(T||1===E.getSelectedEntries().length)&&B(),q(t),ne("selection-options",e.clientX,e.clientY),k.classList.remove("hidden"),T=!0}),S.addEventListener("click",e=>{if(T){let t=e.target;if(t.parentElement.classList.contains("document-entry")&&(t=t.parentElement),k.classList.add("hidden"),T=!1,t.classList.contains("document-entry")){const e=G(t.id);P(E.getIndexByEntryName(e.name))}else B()}})}(n,e)}function P(e){A||x?A?E.getSelection()[e]?(I(e),w.setStart(E.getSelection().lastIndexOf(!0))):(q(e),w.setStart(e)):x&&(w.getPrevSelection().forEach(e=>{I(e)}),w.setEnd(e),w.getSelection(E.getSelection()).forEach(e=>{q(e)})):(B(),q(e),w.setStart(e)),U(),V()}function F(){if(f.classList.contains("active"))if(1!==E.getSelectedFolders().length&&1!==E.getSelectedTrash().length)E.getSelectedFiles().forEach(e=>function(e){const t=e.metadata.document;if(void 0!==typeof t){const n="sample"===t;O(e.id,n)}}(e)),w.reset(),B(),U();else{z([...E.getFolderPath(),E.getSelectedEntries()[0]])}}function D(){if(!m.classList.contains("active"))return;const e=E.getSelectedEntries(),t=E.getParentFolder(),n=E.getTrashFolder(),r=(new Date).toLocaleString();for(let t of e)t=i.FileSystemTools.addMetadata(t,{removed_on:r,recover_folder:E.getFolderPathNames()});K(e,t,n)}function j(e,t){return new Promise((n,o)=>{(0,r.deleteDocument)(e.id).then(()=>{i.FileSystemTools.removeEntry(e,t),n(!0)}).catch(()=>o(!1))})}function R(e,t){return new Promise(n=>{const r=e.children.map(t=>"file"===t.type?j(t,e):"folder"===t.type?R(t,e):Promise.resolve(!1));Promise.all(r).then(()=>{i.FileSystemTools.removeEntry(e,t),n(!0)}).catch(()=>n(!1))})}function H(){const e=E.getSelectedEntries(),t=`Are you sure you want to delete:\n${n=e,n.map(e=>`- ${e.name} (${e.type})`).join("\n")}\nThis action is irreversible.`;var n;if(window.confirm(t)){const t=e.map(e=>"file"===e.type?j(e,E.getParentFolder()):"folder"===e.type?R(e,E.getParentFolder()):void 0);Promise.all(t).then(()=>{z(E.getFolderPath())}).catch(e=>console.debug("failed to delete files: ",e))}}function $(){const e=E.getTrashFolder();if(!e)return void console.error("Trash folder not found.");if(window.confirm("Are you sure you want to delete all the files in Trash Folder?\nThis action is irreversible.")){const t=e.children.map(t=>"file"===t.type?j(t,e):"folder"===t.type?R(t,e):Promise.resolve(!1));Promise.all(t).then(()=>{z(E.getFolderPath())}).catch(e=>console.debug("failed to delete files: ",e))}}function U(){E.getParentFolder().metadata.immutable||E.getSelectedEntries()[0]&&E.getSelectedEntries()[0].metadata.immutable?(y.classList.remove("active"),b.classList.remove("active"),m.classList.remove("active"),E.getSelectedEntries().length?f.classList.add("active"):f.classList.remove("active")):E.isInTrash()?(y.classList.remove("active"),b.classList.remove("active"),m.classList.remove("active"),f.classList.remove("active")):E.getSelectedTrash().length?(f.classList.add("active"),m.classList.remove("active"),y.classList.remove("active"),b.classList.remove("active")):E.getSelectedEntries().length?(f.classList.add("active"),m.classList.add("active"),y.classList.remove("active"),b.classList.remove("active")):(f.classList.remove("active"),m.classList.remove("active"),y.classList.add("active"),b.classList.add("active"))}function V(){!function(){const e=p.cloneNode(!0);p.parentNode.replaceChild(e,p),1===E.getFolderPath().length?(e.classList.remove("active"),e.setAttribute("disabled","true")):(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",W),e.addEventListener("ondragenter",()=>e.classList.add("active")),e.addEventListener("ondragleave",()=>e.classList.remove("active")),J(e,E.getParentFolder(),E.getFolderPath().at(-2))),p=e}(),function(){const e=g.cloneNode(!0);g.parentNode.replaceChild(e,g);const t=E.getParentFolder();"trash"===t.type||E.isInTrash()?(e.style.display="",t.children.length&&!E.getSelectedEntries().length&&"trash"===t.type?(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",$)):(e.classList.remove("active"),e.setAttribute("disabled","true"))):e.style.display="none",g=e}(),function(){const e=v.cloneNode(!0);v.parentNode.replaceChild(e,v),"trash"===E.getParentFolder().type||E.isInTrash()?(e.style.display="",E.getSelectedEntries().length?(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",H)):(e.classList.remove("active"),e.setAttribute("disabled","true"))):e.style.display="none",v=e}()}async function W(){const e=E.getFolderPath().slice(0,-1);await z(e)}function G(e){return E.getEntries().find(t=>t.id===e)}async function z(e){e||(e=E.getFolderPath()),E.setFolderPath(e);const t=E.getParentFolder();d.innerHTML="",w.reset(),E.setEntries(t.children),t.children.forEach(async(e,t)=>{const n=function(e){const t=document.createElement("div");t.classList.add("document-entry"),t.setAttribute("draggable","true");const n=document.createElement("img");n.classList.add("document-icon");const i=document.createElement("div");switch(i.innerText=e.name,e.type){case"folder":t.classList.add("folder-entry"),t.setAttribute("id",e.id),n.src="./Neon-gh/assets/img/folder-icon.svg",t.setAttribute("drop-id",e.id),t.classList.add("drop-target");break;case"trash":t.classList.add("folder-entry"),t.setAttribute("id",e.id),n.src="./Neon-gh/assets/img/trash-icon.svg",t.setAttribute("drop-id",e.id),t.classList.add("drop-target");break;case"file":t.classList.add("file-entry"),t.setAttribute("id",e.id),"manuscript"===e.metadata.type?(t.classList.add("manuscript-entry"),n.src="./Neon-gh/assets/img/manuscript-icon.svg"):"folio"===e.metadata.type?(t.classList.add("folio-entry"),n.src="./Neon-gh/assets/img/folio-icon.svg"):n.src="./Neon-gh/assets/img/folio-icon.svg"}return t.appendChild(n),t.appendChild(i),t}(e);d.appendChild(n),await M(t,e,n)}),U(),function(){h.innerHTML="";const e=E.getFolderPath().map((e,t)=>{const n=document.createElement("div");n.classList.add("nav-path-section"),n.innerHTML=e.name;const i=E.getFolderPath().slice(0,t+1);return n.addEventListener("click",async()=>await z(i)),J(n,E.getParentFolder(),i.at(-1)),n});e.forEach((t,n)=>{if(h.appendChild(t),n!==e.length-1){const e=document.createElement("div");e.classList.add("nav-path-seperator"),e.innerHTML=" / ",h.appendChild(e)}})}(),V();const n=document.getElementById("info-badge");E.isInTrash()?(n.textContent="Files will be deleted after 30 days",n.style.background="#9DB2BF"):(n.textContent="",n.style.background=""),t.children.forEach(e=>{const n=document.getElementById(e.id);n.addEventListener("dragstart",e=>{e.dataTransfer.effectAllowed="move",C=e.target}),"folder"!==e.type&&"trash"!==e.type||J(n,t,e)}),_.setFileSystem(E.getFolderPath().at(0))}function J(e,t,n){e.addEventListener("dragenter",t=>{t.preventDefault(),e.classList.add("dragenter")}),e.addEventListener("dragleave",t=>{t.preventDefault(),e.classList.remove("dragenter")}),e.addEventListener("dragover",e=>e.preventDefault()),e.addEventListener("drop",function(e,t){return n=>{n.preventDefault();const i=G(C.getAttribute("id"));i&&i!==t&&K([i],e,t)}}(t,n))}function K(e,t,n){const r=[];e.forEach(e=>{"trash"===n.type&&n.children.some(t=>t.name===e.name)&&(e.name=function(e){const t=(new Date).toLocaleString();return e+" - "+t}(e.name));const o=i.FileSystemTools.canMoveEntry(e,t,n);o.succeeded?i.FileSystemTools.moveEntry(e,t,n):r.push(o.error)}),r.filter((e,t,n)=>n.indexOf(e)===t),r.length>0&&window.alert(r.join("\n")),z()}function X(){const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.MOVE_TO),e.openModalWindow();const t=E.getSelectedEntries(),n=E.getParentFolder(),i=function(e){const t=document.createElement("ul");return t.id="tree-root",t.appendChild(function e(t,n,i){const r=document.createElement("li"),o=document.createElement("div");o.classList.add("tree-li-container");const s=document.createElement("div");s.classList.add("tree-name"),s.innerHTML=t.name,s.addEventListener("click",()=>{document.querySelectorAll(".tree-name").forEach(e=>e.classList.remove("selected")),s.classList.add("selected")}),s.addEventListener("dblclick",()=>{n(t)});if(t.children.every(e=>"folder"!==e.type))return r.appendChild(o),o.appendChild(s),r;const a=document.createElement("ul"),c=document.createElement("div");c.classList.add("tree-arrow"),c.innerHTML="▶",i<2&&a.classList.add("active");i<2&&c.classList.add("active");return c.addEventListener("click",()=>{c.classList.toggle("active"),a.classList.toggle("active")}),r.appendChild(o),o.appendChild(c),o.appendChild(s),r.appendChild(a),t.children.forEach(t=>{if("folder"===t.type){const r=e(t,n,i+1);a.appendChild(r)}}),r}(E.root(),e,0)),t}(i=>{e.hideModalWindow(),K(t,n,i)}),r=document.createElement("div");r.classList.add("tree-container"),r.appendChild(i);const o=document.getElementById("neon-modal-window-content-container");o.innerHTML='',o.appendChild(r)}function Y(){if(!b.classList.contains("active"))return;const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.NEW_FOLDER),e.openModalWindow();const t=document.getElementById("dashboard_input_container"),n=document.getElementById("cancel_dashboard"),i=document.getElementById("confirm_dashboard"),r=document.createElement("input");r.id="dashboard_input",r.type="text",r.placeholder="Untitled Folder",r.value="Untitled Folder",t.appendChild(r),r.select(),r.focus(),n.addEventListener("click",()=>e.hideModalWindow()),i.addEventListener("click",()=>Q(e,r.value)),t.addEventListener("keydown",t=>{"Escape"===t.key?e.hideModalWindow():"Enter"===t.key&&Q(e,r.value)})}function Q(e,t){te(t)?(window.alert("The folder name already exists in the current folder!"),Y()):(e.hideModalWindow(),function(e){const t=document.createElement("div");t.classList.add("document-entry"),t.classList.add("folder-entry"),t.setAttribute("id","new-folder");const n=i.FileSystemTools.createFolder(e);i.FileSystemTools.addEntry(n,E.getParentFolder())?(t.setAttribute("id",e),z()):t.remove()}(t))}function Z(){const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.RENAME),e.openModalWindow();const t=document.getElementById("dashboard_input_container"),n=document.getElementById("cancel_dashboard"),i=document.getElementById("confirm_dashboard"),r=document.createElement("input");r.id="dashboard_input",r.type="text";const o=E.getSelectedEntries()[0].name;r.placeholder=o,r.value=o,t.appendChild(r),r.select(),r.focus(),n.addEventListener("click",()=>e.hideModalWindow()),i.addEventListener("click",()=>ee(e,r.value,o)),t.addEventListener("keydown",t=>{"Escape"===t.key?e.hideModalWindow():"Enter"===t.key&&ee(e,r.value,o)})}function ee(e,t,n){if(t===n)e.hideModalWindow();else if(te(t))window.alert("The filename already exists in the current folder!"),Z();else{e.hideModalWindow();!function(e,t){if(i.FileSystemTools.renameEntry(e,E.getParentFolder(),t))if("file"===e.type){const n=e;(0,r.updateDocName)(n.id,t).then(()=>{z()})}else z()}(E.getSelectedEntries()[0],t)}}function te(e){return E.getParentFolder().children.some(t=>t.name===e)}function ne(e,t,n){switch(e){case"selection-options":const e=E.getSelectedFiles().length,t=E.getSelectedFolders().length,n=E.getSelectedTrash().length;e||t||!n?E.getFolderPath().length>1&&"Trash"==E.getFolderPath().at(1).name?(L.innerHTML=c.trashEntryOptions,ie("trash-entry-options")):1!==e||t||n?e>1&&!t&&!n?(L.innerHTML=c.multiFileOptions,ie("multi-file-options")):e>=1&&t>=1&&!n?(L.innerHTML=c.folderAndFileOptions,ie("folder-and-file-options")):e||1!==t||n?!e&&t>1&&!n&&(L.innerHTML=c.multiFolderOptions,ie("multi-folder-options")):(L.innerHTML=c.singleFolderOptions,ie("single-folder-options")):(L.innerHTML=c.singleFileOptions,ie("single-file-options")):(L.innerHTML=c.trashFolderOptions,ie("trash-folder-options"));break;default:L.innerHTML=c.defaultOptions,ie("default")}if(E.getParentFolder().metadata.immutable||E.getSelectedEntries()[0]&&E.getSelectedEntries()[0].metadata.immutable||E.isInTrash()){const e=document.getElementById("cm-remove-btn"),t=document.getElementById("cm-rename-btn"),n=document.getElementById("cm-move-btn"),i=document.getElementById("cm-upload-doc-btn"),r=document.getElementById("cm-new-folder-btn");e&&e.classList.add("disabled"),t&&t.classList.add("disabled"),n&&n.classList.add("disabled"),i&&i.classList.add("disabled"),r&&r.classList.add("disabled")}k.style.left=t+"px",k.style.top=n+"px",k.classList.remove("hidden")}function ie(e){const t="context-menu-item-wrapper";switch(e){case"single-file-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),D()}),document.querySelector(`.${t}#cm-rename-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Z()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"multi-file-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),D()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"folder-and-file-options":document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),D()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"single-folder-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),D()}),document.querySelector(`.${t}#cm-rename-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Z()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"multi-folder-options":document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),D()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"trash-folder-options":document.querySelector(`.${t}#cm-empty-trash-btn`).addEventListener("click",e=>{k.classList.add("hidden"),$()});break;case"trash-entry-options":document.querySelector(`.${t}#cm-recover-btn`).addEventListener("click",e=>{k.classList.add("hidden"),function(){const e=E.getSelectedEntries(),t=E.getParentFolder();for(let n of e){const e=n.metadata.recover_folder,r=E.getFolderPathByNames(e);if(r){n=i.FileSystemTools.removeMetadata(n,["removed_on","recover_folder"]);const e=/ - \d{1,2}\/\d{1,2}\/\d{4}, \d{1,2}:\d{2}:\d{2} [APMapm]{2}$/;e.test(n.name)&&(n.name=n.name.replace(e,"")),K([n],t,r)}}}()}),document.querySelector(`.${t}#cm-delete-btn`).addEventListener("click",e=>{k.classList.add("hidden"),H()});break;default:document.querySelector(`.${t}#cm-upload-doc-btn`).addEventListener("click",e=>{k.classList.add("hidden"),N()}),document.querySelector(`.${t}#cm-new-folder-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Y()})}}function re(e){E.getTrashFolder()||_.newTrash(e);const t=E.getTrashFolder(),n=new Date,i=new Date(n.getTime()-2592e6);t.children.forEach(e=>{(e=>{if(e.metadata&&e.metadata.removed_on){return new Date(e.metadata.removed_on)<=i}return!1})(e)&&("file"===e.type?j(e,t):"folder"===e.type&&R(e,t))})}null==f||f.addEventListener("click",F),null==m||m.addEventListener("click",D),null==y||y.addEventListener("click",N),null==b||b.addEventListener("click",Y),window.addEventListener("keydown",e=>{e.metaKey&&(A=!0),e.shiftKey&&(x=!0),"Escape"===e.key&&(B(),w.reset(),U(),V())}),window.addEventListener("keyup",e=>{e.metaKey||(A=!1),e.shiftKey||(x=!1)}),null==u||u.addEventListener("click",e=>{const t=e.target;Boolean(t.closest(".document-entry"))||(B(),w.reset(),U(),V())}),t.updateDashboard=z;t.loadDashboard=async()=>{const e=await _.getRoot();E.root(e),re(e),z([e]),document.querySelector(".main-section").addEventListener("contextmenu",e=>{e.preventDefault(),B(),ne("default",e.clientX,e.clientY)}),document.querySelector(".main-section").addEventListener("click",e=>{k.classList.add("hidden")})}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){"use strict";var i;Object.defineProperty(t,"__esModule",{value:!0});(0,n(56).loadDashboard)(),null===(i=document.querySelector("#home-link"))||void 0===i||i.setAttribute("href","https://ddmal.music.mcgill.ca/Neon")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EntryType=void 0,function(e){e.Folder="folder",e.Trash="trash",e.File="file"}(t.EntryType||(t.EntryType={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemTools=void 0;const i=n(25),r=n(17),o=(e,t,n,r)=>{const o={};return t===i.EntryType.File?{name:e,type:t,id:n,metadata:o}:{name:e,type:t,id:n,children:r,metadata:o}};const s=(e,t)=>{const n=t.children.some(t=>t.name===e.name),i=t.metadata.immutable,r={succeeded:!1,error:""};return n?r.error=`Duplicate name: ${e.name} already exists in ${t.name}.`:i?r.error=t.name+" is immutable.":r.succeeded=!0,r},a=(e,t)=>{const n=-1!==t.children.findIndex(t=>t.id===e.id),i=t.metadata.immutable,r=e.metadata.immutable,o={succeeded:!1,error:""};return n?i?o.error=t.name+" is immutable.":r?o.error=e.name+" is immutable.":o.succeeded=!0:o.error=`${e.name} does not exist in ${t.name}.`,o},c=(e,t,n)=>{const r=e===n,o=n.children.some(t=>t.name===e.name),s=t.metadata.immutable,a=n.metadata.immutable,c=-1!==t.children.findIndex(t=>t.id===e.id),l=e.type==i.EntryType.Folder&&function e(t,n){return n.children.filter(e=>e.type===i.EntryType.Folder).map(n=>n===t||e(t,n)).some(e=>!0===e)}(n,e),d={succeeded:!1,error:""};return r?d.error=`Cannot move ${e.name} to itself.`:o?d.error=`Duplicate name: ${e.name} already exists in ${n.name}.`:s?d.error=t.name+" is immutable.":a?d.error=n.name+" is immutable.":c?l?d.error=`Cannot move ${e.name} into a its own subfolder, ${n.name}.`:d.succeeded=!0:d.error=`${e.name} does not exist in ${t.name}.`,d},l=(e,t,n)=>{const i={succeeded:!1,error:""};return t.children.some((t,n,i)=>t.name===e.name&&n!==i.indexOf(t))?i.error=`Duplicate name: ${n} already exists in ${t.name}.`:i.succeeded=!0,i},d=(e,t)=>{const{succeeded:n,error:r}=s(e,t);return n?(t.children.push(e),(o=t).children.sort((e,t)=>e.name.localeCompare(t.name)),o.children.sort((e,t)=>e.type===i.EntryType.File&&t.type===i.EntryType.Folder?1:e.type===i.EntryType.Folder&&t.type===i.EntryType.File?-1:0),!0):(console.error(r),!1);var o},u=(e,t,n=!1)=>{const{succeeded:i,error:r}=a(e,t);if(i||n){const n=t.children.indexOf(e);return t.children.splice(n,1),!0}return console.error(r),!1};t.FileSystemTools={createFolder:e=>o(e,i.EntryType.Folder,(0,r.uuidv4)(),[]),createTrash:e=>o(e,i.EntryType.Trash,(0,r.uuidv4)(),[]),createFile:(e,t)=>o(e,i.EntryType.File,t),moveEntry:function(e,t,n){const i=c(e,t,n);if(i.succeeded){if(u(e,t,!0)){if(d(e,n))return!0;console.error(`Moving: failed to add ${e.name} to ${n.name}`)}else console.error(`Moving: failed to remove ${e.name} from ${t.name}`)}else console.error(i.error);return!1},canAddEntry:s,canRemoveEntry:a,canMoveEntry:c,canRenameEntry:l,addEntry:d,removeEntry:u,addMetadata:function(e,t){return Object.entries(t).forEach(([t,n])=>{e.metadata[t]=n}),e},removeMetadata:function(e,t){return t.forEach(t=>{delete e.metadata[t]}),e},getAllNames:e=>e.children.map(e=>e.name),renameEntry:(e,t,n)=>{const{succeeded:i,error:r}=l(e,t,n);return i?(e.name=n,!0):(console.error(r),!1)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemManager=void 0;const i=n(25),r=n(46),o=n(93);t.FileSystemManager=()=>{function e(e){try{window.localStorage.setItem("neon-fs",JSON.stringify(e))}catch(e){return console.error(e),window.alert("Error saving file system"),!1}return!0}async function t(){try{const t=window.localStorage.getItem("neon-fs");if(t){return JSON.parse(t)}{const t=i.FileSystemTools.createFolder("Home");return function(e){const t=o.samples.map(([e,t])=>{const n=i.FileSystemTools.createFile(e,e);return"folio"===t?i.FileSystemTools.addMetadata(n,{type:"folio",document:"sample",immutable:!0}):"manuscript"===t&&i.FileSystemTools.addMetadata(n,{type:"manuscript",document:"sample",immutable:!0}),n}),n=i.FileSystemTools.createFolder("Samples");t.forEach(e=>{i.FileSystemTools.addEntry(e,n)}),i.FileSystemTools.addEntry(n,e),i.FileSystemTools.addMetadata(n,{immutable:!0})}(t),n(t),await async function(e){const t=await(0,r.fetchUploads)();return t.map(e=>i.FileSystemTools.createFile(e.name,e.id)).forEach(t=>{i.FileSystemTools.addEntry(t,e)}),e}(t),e(t),t}}catch(e){console.error(e),window.alert("Error loading file system")}}function n(e){const t=i.FileSystemTools.createTrash("Trash");i.FileSystemTools.addEntry(t,e)}return{getRoot:async function(){return await t()},setFileSystem:e,getFileSystem:t,newTrash:n}}},function(e){e.exports=JSON.parse('{"@context":["http://www.w3.org/ns/anno.jsonld",{"schema":"http://schema.org/","title":"schema:name","timestamp":"schema:dateModified","image":{"@id":"schema:image","@type":"@id"},"mei_annotations":{"@id":"Annotation","@type":"@id","@container":"@list"}}]}')},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.samples=void 0,t.samples=[["CDN-Hsmu_M2149.L4_001r","folio"],["CDN-Hsmu_M2149.L4_002r","folio"],["CH-E_611_024r","folio"],["CH-E_611_026r","folio"],["CH-E_611_028r","folio"],["Salzinnes","manuscript"]]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dashboardState=t.ShiftSelectionManager=void 0;t.ShiftSelectionManager=class{constructor(){this.prevSelection=[],this.reset()}setStart(e){this.reset(),this.start=Math.max(e,0)}setEnd(e){this.end=e}reset(){this.start=0,this.end=-1,this.prevSelection.splice(0)}getPrevSelection(){return this.prevSelection}getSelection(e){let t,n;if(-1===this.end)return[];this.endn+t).filter(t=>!e[t]);return this.prevSelection=i,i}},t.dashboardState=function(){let e=[],t=[],n=[],i=null;function r(e){return e&&(i=e),i}function o(){return e.filter((e,n)=>t[n])}return{root:r,setEntries:function(n){e=n,t=Array(n.length).fill(!1)},getEntries:function(){return e},getIndexByEntryName:function(t){return e.findIndex(e=>e.name===t)},setSelection:function(e,n){t[e]=n},getSelection:function(){return t},resetSelection:function(){t.fill(!1)},setFolderPath:function(e){n=e},getFolderPath:function(){return n},getFolderPathNames:function(){return n.map(e=>e.name)},getFolderPathByNames:function(e){let t=r();e=e.slice(1);for(const n of e){const e=t.children.find(e=>e.name===n);if(!e||"folder"!==e.type)return void console.debug("failed to find folder: ",n);t=e}return t},getParentFolder:function(){return n.at(-1)},getTrashFolder:function(){return r().children.filter(e=>"trash"===e.type)[0]},getSelectedEntries:o,getSelectedFolders:function(){return o().filter(e=>"folder"===e.type)},getSelectedTrash:function(){return o().filter(e=>"trash"===e.type)},getSelectedFiles:function(){return o().filter(e=>"file"===e.type)},isInTrash:function(){return n.some(e=>"trash"===e.type)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InitUploadArea=void 0;const i=n(9),r=n(96),o=n(56);t.InitUploadArea=function(e){const t=new i.ModalWindow;t.setModalWindowView(i.ModalWindowView.DOCUMENT_UPLOAD),t.openModalWindow();const n=document.querySelector("#make_pair"),s=document.querySelector("#upload_button");n.addEventListener("click",r.handleMakePair),s.addEventListener("click",()=>async function(e,t){const n=document.querySelector("#uploading_spinner");n.classList.add("visible"),(0,r.handleUploadAllDocuments)(t).then(t=>{setTimeout(async()=>{await(0,o.updateDashboard)(),n.classList.remove("visible"),e.hideModalWindow();const i=t.filter(e=>"fulfilled"===e.status&&e.value).map(e=>e.value);if(i.length>0){const e=document.getElementById("info-badge");e.textContent="Uploaded files: "+i.join(", "),e.style.display="block",e.style.background="#9DB2BF"}},2e3)}).catch(t=>{console.log("One or more uploads rejected: ",t),setTimeout(async()=>{await(0,o.updateDashboard)(),n.classList.remove("visible"),e.hideModalWindow()},2e3)})}(t,e));const a=document.createElement("input");a.type="file",a.multiple=!0,a.addEventListener("change",(function(){const e=a.files,t=Array.from(e),n=(0,r.addNewFiles)(t);if(0!==n.length){const e=n.map(e=>e.name);window.alert("The following files are not .mei, .png, .jpeg, or .jsonld files: \n\n"+e.join("\n"))}a.value=null}));const c=document.querySelector("#initial_upload_area");c.onclick=()=>a.click(),c.ondragleave=()=>c.classList.remove("over"),c.ondragover=e=>{e.stopPropagation(),e.preventDefault(),c.classList.add("over"),e.dataTransfer.dropEffect="copy"},c.ondrop=e=>{e.stopPropagation(),e.preventDefault(),c.classList.remove("over");const t=e.dataTransfer.files,n=Array.from(t),i=(0,r.addNewFiles)(n);if(0!==i.length){const e=i.map(e=>e.name);window.alert("The following files are not .mei, .png, .jpeg, or .jsonld files: \n\n"+e.join("\n"))}},document.querySelectorAll(".sort_name").forEach(e=>{e.addEventListener("click",()=>(0,r.sortFileByName)(e))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.fnConflictHandler=t.formatFilename=t.sortFileByName=t.handleUploadAllDocuments=t.handleMakePair=t.addNewFiles=void 0;const i=n(30),r=n(97),o=n(46),s=n(25),a=r.default.getInstance();function c(e,t){if("mei"!==t&&"image"!==t)return;const n="mei"===t?"mei_radio_group":"image_radio_group",r=(0,i.v4)(),o=document.createElement("div");o.className="unpaired_item_container";const s=document.createElement("input");s.type="radio",s.className="unpaired_item_radio",s.name=n,s.value=e,s.id=r;const a=document.createElement("label");a.className="unpaired_item_label",a.setAttribute("for",r);const c=document.createElement("span");c.innerText=l(e,50),c.setAttribute("style","margin-top: auto; margin-left: 3px;");const d=document.createElement("img");return d.className="unpaired_del_btn",d.src="/Neon/Neon-gh/assets/img/unpaired-remove-doc.svg",d.title="delete",a.appendChild(s),a.appendChild(c),o.appendChild(a),o.appendChild(d),d.addEventListener("click",(function(){o.remove()})),o}function l(e,t){const n=Math.floor(t/2),i=e.length;return i<=t?e:`${e.substring(0,n-1)}...${e.substring(i-n+2,i)}`}function d(e,t){let n=e,i=1;for(;t.includes(n);)n=`${e}(${i})`,i++;return n}a.setMeiTemplate("samples/mei/mei_template.mei"),t.addNewFiles=function(e){const t=document.querySelector("#mei_list"),n=document.querySelector("#image_list"),i=[];return e.forEach(e=>{const r=e.name.split(".").pop();if("mei"===r){const n=c(e.name,"mei");t.appendChild(n),a.addFile(e)}else if(["png","jpg","jpeg"].includes(r)){const t=c(e.name,"image");n.appendChild(t),a.addFile(e)}else"jsonld"===r||i.push(e)}),i},t.handleMakePair=function(){const e=document.querySelector("#paired_list"),t=document.querySelector('input[name="mei_radio_group"]:checked'),n=document.querySelector('input[name="image_radio_group"]:checked');if(null===t||null===n)return;let i=t.value;const r=n.value;let o=!1;if("create_mei"===t.value){o=!0;const e=r.split(".");e.length>1&&e.pop(),e.push("mei"),i=e.join("."),a.getImgDimension(r).then(e=>{const{width:t,height:n,staffSpace:r}=e,o=a.createMeiFile(i,t,n,r);a.addFile(o)}).catch(e=>{console.error(e.message)})}const s=i.substring(0,i.length-4),d=function(e,t,n){const i=document.querySelector("#mei_list"),r=document.querySelector("#image_list"),o=document.createElement("div");o.className="folio_item",o.setAttribute("mei",t),o.setAttribute("image",n);const s=document.createElement("div");function d(){o.remove();const s=a.isCreatedFolio(e);if(a.removeFolio(e),!s){const e=c(t,"mei");i.appendChild(e)}const l=c(n,"image");r.appendChild(l)}s.classList.add("folio-filename"),s.innerHTML=l(e,50),o.appendChild(s);const u=document.createElement("img");return u.className="unpair_btn",u.src="/Neon/Neon-gh/assets/img/unpair-doc.svg",u.title="unpair",u.addEventListener("click",d),o.appendChild(u),o}(s,i,r);e.appendChild(d),a.addFolio(s,i,r,o),o||t.parentElement.parentElement.remove(),n.parentElement.parentElement.remove()},t.handleUploadAllDocuments=async function(e){const t=[...a.getFolios().map(async([t,n,r])=>{const a=(0,i.v4)();return await async function(e,t,n,i,r){const a=d(t,s.FileSystemTools.getAllNames(r));return(0,o.createManifest)(e,a,n,i).then(t=>{const n=new Blob([JSON.stringify(t,null,2)],{type:"application/ld+json"});return(0,o.addDocument)(e,a,n,!0)}).then(n=>{if(n){const t=(new Date).toLocaleString(),n=s.FileSystemTools.createFile(a,e),i=s.FileSystemTools.addMetadata(n,{type:"folio",created_on:t});return s.FileSystemTools.addEntry(i,r)?a:null}return console.log("failed to uploadFolio: "+t),null})}(a,t,n,r,e)})].map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e})));return a.clear(),Promise.all(t)},t.sortFileByName=async function(e){const t=e.parentElement.nextElementSibling,n=Array.from(t.children);let i=e.classList.contains("arrow-up");i?(e.classList.remove("arrow-up"),e.classList.add("arrow-down"),e.innerHTML="⋁"):(e.classList.remove("arrow-down"),e.classList.add("arrow-up"),e.innerHTML="⋀"),i=!i,n.sort((e,t)=>{const n=e.textContent.trim(),r=t.textContent.trim();return i?n.localeCompare(r):r.localeCompare(n)}),n.forEach(e=>{t.appendChild(e)}),e.setAttribute("style","color: black")},t.formatFilename=l,t.fnConflictHandler=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const i=n(17),r=n(32);class o{constructor(){this.allFiles=new Map,this.folios=new Array}static getInstance(){return o.instance||(o.instance=new o),o.instance}addFile(e){if(this.allFiles.has(e.name)){const t={file:e,count:this.getFileCount(e.name)+1};this.allFiles.set(e.name,t)}else{const t={file:e,count:1};this.allFiles.set(e.name,t)}}async setMeiTemplate(e){try{const t=await fetch(e);if(!t.ok)throw new Error("Failed to load MEI template from "+e);this.meiTemplate=await t.text()}catch(e){console.error(e)}}createMeiFile(e,t,n,o){try{if(!this.meiTemplate)throw new Error("Cannot find MEI template");const s=new DOMParser,a=new XMLSerializer,c=s.parseFromString(this.meiTemplate,"text/xml"),l=c.documentElement;l.querySelector("meiHead").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("fileDesc").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("titleStmt").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("title").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("pubStmt").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("facsimile").setAttribute("xml:id","m-"+(0,i.uuidv4)());const d=l.querySelector("surface"),u="m-"+(0,i.uuidv4)();d.setAttribute("xml:id",u),d.setAttribute("lrx",t.toString()),d.setAttribute("lry",n.toString());const f=l.querySelector("zone"),m="m-"+(0,i.uuidv4)();f.setAttribute("xml:id",m);const h=.1,p=.15,g=Math.round(h*t),v=Math.round(p*t);f.setAttribute("ulx",v.toString()),f.setAttribute("uly",g.toString()),f.setAttribute("lrx",(t-v).toString()),f.setAttribute("lry",(g+3*o).toString());l.querySelector("mdiv").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("score").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("scoreDef").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("staffGrp").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("staffDef").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("section").setAttribute("xml:id","m-"+(0,i.uuidv4)());const y=l.querySelector("pb");y.setAttribute("xml:id","m-"+(0,i.uuidv4)()),y.setAttribute("facs","#"+u);const b=l.querySelector("sb");b.setAttribute("xml:id","m-"+(0,i.uuidv4)()),b.setAttribute("facs","#"+m);const w=r.xml(a.serializeToString(c)),_=new Blob([w],{type:"text/xml"});return new File([_],e,{type:"text/xml"})}catch(e){console.error(e)}}getImgDimension(e){return new Promise((t,n)=>{const i=this.getFile(e);if(!i)return void n(new Error("File not found: "+e));const r=new FileReader;r.onload=i=>{const r=new Image;r.onload=()=>{const e=document.createElement("canvas"),i=e.getContext("2d",{willReadFrequently:!0});if(!i)return void n(new Error("Could not get 2D context"));e.width=r.width,e.height=r.height,i.drawImage(r,0,0);const o=i.getImageData(0,0,e.width,e.height),s=o.data;for(let e=0;e0?(a.push(c),c=0):c++}const l=a.length>0?this.findSecondMode(a):0;t({width:r.width,height:r.height,staffSpace:l})},r.onerror=()=>{n(new Error("Failed to load image: "+e))},r.src=i.target.result},r.readAsDataURL(i)})}findSecondMode(e){const t=new Map;e.forEach(e=>{const n=(t.get(e)||0)+1;t.set(e,n)});return Array.from(t.entries()).sort((e,t)=>t[1]-e[1])[1][0]}getFile(e){if(this.allFiles.has(e))return this.allFiles.get(e).file}removeFile(e){const t=this.getFileCount(e);if(0!==t)if(1===t)this.allFiles.delete(e);else{const n={file:this.allFiles.get(e).file,count:t-1};this.allFiles.set(e,n)}}getFileCount(e){return this.allFiles.has(e)?this.allFiles.get(e).count:0}addFolio(e,t,n,i){const r={filename:e,mei_filename:t,image_filename:n,isCreated:i};this.folios.push(r)}isCreatedFolio(e){const t=this.folios.find(t=>t.filename===e);return!!t&&t.isCreated}removeFolio(e){const t=this.folios.findIndex(t=>t.filename===e);this.folios.splice(t,1)}getFolios(){return this.folios.map(e=>{const t=e.filename,n=e.mei_filename,i=e.image_filename;return[t,this.getFile(n),this.getFile(i)]})}clear(){this.allFiles.clear(),this.folios.splice(0)}print(){console.log(this.allFiles),console.log(this.folios)}}t.default=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.trashEntryOptions=t.trashFolderOptions=t.multiFolderOptions=t.singleFolderOptions=t.folderAndFileOptions=t.multiFileOptions=t.singleFileOptions=t.defaultOptions=void 0,t.defaultOptions='\n ',t.singleFileOptions='\n \n \n ',t.multiFileOptions='\n \n ',t.folderAndFileOptions='\n ',t.singleFolderOptions='\n \n \n ',t.multiFolderOptions='\n ',t.trashFolderOptions='',t.trashEntryOptions='\n '}]);
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ltbWVkaWF0ZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL05vdGlmaWNhdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvTG9jYWxTZXR0aW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvU2VsZWN0VG9vbHMudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FyZ3NhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJkM1wiIiwid2VicGFjazovLy8uL3NyYy9TcXVhcmVFZGl0L0NvbnRlbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Nb2RhbFdpbmRvdy50cyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvRGlzcGxheVBhbmVsL0Rpc3BsYXlDb250cm9scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db29yZGluYXRlcy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3BhcmstbWQ1L3NwYXJrLW1kNS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvcmFuZG9tLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db2xvci50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnV2dXplbGEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvRHJhZ0hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvR3JvdXBpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL2luZGV4LnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9FcnJvckxvZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvUmVzaXplLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wb3VjaGRiL2xpYi9pbmRleC1icm93c2VyLmVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zaGExLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9uaWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy92a2JlYXV0aWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRGFzaGJvYXJkQ29udGVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvV2FybmluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvU3RhZmZUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9OZXVtZVRvb2xzLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3F1ZXVlTWljcm90YXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL211dGF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL21lc3NhZ2VDaGFubmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3N0YXRlQ2hhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3RpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9TdG9yYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRGFzaGJvYXJkLnRzIiwid2VicGFjazovLy8uL2RlcGxveW1lbnQvc2NyaXB0cy9kYXNoYm9hcmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL0ZpbGVTeXN0ZW1JbnRlcmZhY2VzLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRmlsZVN5c3RlbS9GaWxlU3lzdGVtVG9vbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL0ZpbGVTeXN0ZW1NYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvc2FtcGxlc19maWxlbmFtZXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9EYXNoYm9hcmRUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGFzaGJvYXJkL1VwbG9hZEFyZWEudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9VcGxvYWRUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGFzaGJvYXJkL1VwbG9hZEZpbGVNYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvQ29udGV4dE1lbnVDb250ZW50LnRzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiUmVmbGVjdE93bktleXMiLCJSIiwiUmVmbGVjdCIsIlJlZmxlY3RBcHBseSIsImFwcGx5IiwidGFyZ2V0IiwicmVjZWl2ZXIiLCJhcmdzIiwiRnVuY3Rpb24iLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImNvbmNhdCIsIk51bWJlcklzTmFOIiwiTnVtYmVyIiwiaXNOYU4iLCJFdmVudEVtaXR0ZXIiLCJpbml0IiwidGhpcyIsIm9uY2UiLCJlbWl0dGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJlcnJvckxpc3RlbmVyIiwiZXJyIiwicmVtb3ZlTGlzdGVuZXIiLCJyZXNvbHZlciIsInNsaWNlIiwiYXJndW1lbnRzIiwiZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyIiwiaGFuZGxlciIsImZsYWdzIiwib24iLCJhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlciIsIl9ldmVudHMiLCJ1bmRlZmluZWQiLCJfZXZlbnRzQ291bnQiLCJfbWF4TGlzdGVuZXJzIiwiZGVmYXVsdE1heExpc3RlbmVycyIsImNoZWNrTGlzdGVuZXIiLCJsaXN0ZW5lciIsIlR5cGVFcnJvciIsIl9nZXRNYXhMaXN0ZW5lcnMiLCJ0aGF0IiwiX2FkZExpc3RlbmVyIiwidHlwZSIsInByZXBlbmQiLCJldmVudHMiLCJleGlzdGluZyIsIndhcm5pbmciLCJuZXdMaXN0ZW5lciIsImVtaXQiLCJ1bnNoaWZ0IiwicHVzaCIsImxlbmd0aCIsIndhcm5lZCIsInciLCJFcnJvciIsIlN0cmluZyIsImNvdW50IiwiY29uc29sZSIsIndhcm4iLCJvbmNlV3JhcHBlciIsImZpcmVkIiwid3JhcEZuIiwiX29uY2VXcmFwIiwic3RhdGUiLCJ3cmFwcGVkIiwiX2xpc3RlbmVycyIsInVud3JhcCIsImV2bGlzdGVuZXIiLCJhcnIiLCJyZXQiLCJBcnJheSIsInVud3JhcExpc3RlbmVycyIsImFycmF5Q2xvbmUiLCJsaXN0ZW5lckNvdW50IiwiY29weSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ3cmFwTGlzdGVuZXIiLCJhcmciLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0IiwiUmFuZ2VFcnJvciIsImdldFByb3RvdHlwZU9mIiwic2V0TWF4TGlzdGVuZXJzIiwiZ2V0TWF4TGlzdGVuZXJzIiwiZG9FcnJvciIsImVycm9yIiwiZXIiLCJtZXNzYWdlIiwiY29udGV4dCIsImxlbiIsImxpc3RlbmVycyIsImFkZExpc3RlbmVyIiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImxpc3QiLCJwb3NpdGlvbiIsIm9yaWdpbmFsTGlzdGVuZXIiLCJzaGlmdCIsImluZGV4IiwicG9wIiwic3BsaWNlT25lIiwib2ZmIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwia2V5cyIsInJhd0xpc3RlbmVycyIsImV2ZW50TmFtZXMiLCJjdG9yIiwic3VwZXJDdG9yIiwic3VwZXJfIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIlRlbXBDdG9yIiwiZHJhaW5pbmciLCJjdXJyZW50UXVldWUiLCJzY2hlZHVsZURyYWluIiwidHlwZXMiLCJxdWV1ZUluZGV4IiwicXVldWUiLCJzY2hlZHVsZWQiLCJjbGVhblVwTmV4dFRpY2siLCJuZXh0VGljayIsInRpbWVvdXQiLCJzZXRUaW1lb3V0IiwicnVuIiwiY2xlYXJUaW1lb3V0IiwidGVzdCIsImluc3RhbGwiLCJJdGVtIiwiZnVuIiwiYXJyYXkiLCJ0YXNrIiwibm90aWZpY2F0aW9ucyIsImN1cnJlbnRNb2RlTWVzc2FnZSIsIm5vdGlmaWNhdGlvbkljb24iLCJkZWZhdWx0Iiwic3VjY2VzcyIsIk5vdGlmaWNhdGlvbiIsImxvZ0luZm8iLCJkaXNwbGF5ZWQiLCJpZCIsInV1aWR2NCIsImlzTW9kZU1lc3NhZ2UiLCJzZWFyY2giLCJ0aW1lb3V0SUQiLCJNYXRoIiwibWF4IiwiY2xlYXJOb3RpZmljYXRpb24iLCJjdXJyZW50SWQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwicmVtb3ZlIiwic3RhcnROb3RpZmljYXRpb24iLCJub3RpZmljYXRpb24iLCJ3aW5kb3ciLCJnZXRJZCIsIm5vdGlmaWNhdGlvbkNvbnRlbnQiLCJuZXdOb3RpZmljYXRpb24iLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NMaXN0IiwiYWRkIiwiaW5uZXJIVE1MIiwiYXBwZW5kIiwic3R5bGUiLCJkaXNwbGF5IiwiZGlzcGxheU5vdGlmaWNhdGlvbiIsInNldFRpbWVvdXRJZCIsInF1ZXVlTm90aWZpY2F0aW9uIiwicmVjb3JkTm90aWZpY2F0aW9uIiwibG9jYWxTZXR0aW5ncyIsIkRFRkFVTFRfU0VUVElOR1MiLCJ6b29tIiwiZ2x5cGhPcGFjaXR5IiwiaW1hZ2VPcGFjaXR5IiwiY2lyY2xlU2l6ZSIsImhpZ2hsaWdodE1vZGUiLCJ1c2VyTW9kZSIsImluc2VydE1vZGUiLCJpbnNlcnRUYWIiLCJzZWxlY3Rpb25Nb2RlIiwiZGVidWdNb2RlIiwiZGlzcGxheUJCb3giLCJkaXNwbGF5VGV4dCIsImRpc3BsYXlJbmZvIiwiZGlzcGxheUVyckxvZyIsInZpZXdCb3giLCJzZXR0aW5ncyIsInBhcmFtcyIsImZvbGlvSWQiLCJsb2FkIiwic3RvcmVkIiwiSlNPTiIsInBhcnNlIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsInN5bmMiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiZ2V0U2VsZWN0aW9uVHlwZSIsImVsZW1lbnQiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwidW5zZWxlY3QiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZm9yRWFjaCIsInNlbGVjdGVkIiwiY29udGFpbnMiLCJyZW1vdmVBdHRyaWJ1dGUiLCJDb2xvciIsInVuaGlnaGxpZ2h0IiwiZmlsbCIsImZyb20iLCJkaXZMaW5lIiwic3Ryb2tlIiwic2V0QXR0cmlidXRlIiwibmV1bWUiLCJzeWxSZWN0IiwicGFyZW50RWxlbWVudCIsImQzIiwic2VsZWN0QWxsIiwiZWwiLCJjb2xvciIsImZvbnRXZWlnaHQiLCJTZWxlY3RPcHRpb25zIiwiZW5kT3B0aW9uc1NlbGVjdGlvbiIsIkdyb3VwaW5nIiwiZW5kR3JvdXBpbmdTZWxlY3Rpb24iLCJ1cGRhdGVIaWdobGlnaHQiLCJzZWxlY3RTdGFmZiIsInN0YWZmIiwiZHJhZ0hhbmRsZXIiLCJoaWdobGlnaHQiLCJ0cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zIiwiaW5pdEdyb3VwaW5nTGlzdGVuZXJzIiwiZHJhZ0luaXQiLCJzZWxlY3RMYXllckVsZW1lbnQiLCJsYXllckVsZW1lbnQiLCJzZWxlY3QiLCJuZWVkc0hpZ2hsaWdodFVwZGF0ZSIsInN5bElkIiwiZWxlbSIsImNsb3Nlc3QiLCJzcGFuIiwiYXN5bmMiLCJpc0xpZ2F0dXJlIiwibmMiLCJuZW9uVmlldyIsImF0dHJpYnV0ZXMiLCJnZXRFbGVtZW50QXR0ciIsInZpZXciLCJnZXRDdXJyZW50UGFnZVVSSSIsIkJvb2xlYW4iLCJsaWdhdGVkIiwiZWxlbWVudHNIYXZlQ29ycmVjdFR5cGUiLCJzZWxlY3Rpb25UeXBlIiwiZWxlbWVudHMiLCJzaGFyZWRTZWNvbmRMZXZlbFBhcmVudCIsInRlbXBFbGVtZW50cyIsInNlY29uZFBhcmVudCIsInNlbGVjdEJCb3giLCJiYm94Iiwic3lsIiwicmVzaXplIiwicXVlcnlTZWxlY3RvciIsInRyaWdnZXJCQm94QWN0aW9ucyIsInBhcmVudCIsInByZXZOYyIsInByZXZpb3VzU2libGluZyIsIm5leHROYyIsIm5leHRTaWJsaW5nIiwidHJpZ2dlckdyb3VwaW5nIiwidHJpZ2dlck5jQWN0aW9ucyIsImFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlIiwic29ydGVkRWxlbWVudHMiLCJqIiwiaXNTYW1lTm9kZSIsImZpcnN0RWxlbSIsInNlY29uZEVsZW0iLCJpbmRleDEiLCJpbmRleE9mIiwiaW5kZXgyIiwiYWJzIiwiZmlsdGVyIiwicmVmZXJlbmNlUGFyZW50U3RhZmYiLCJyZWZlcmVuY2VQYXJlbnRTeWxsYWJsZSIsImVsZW1lbnRzQXJyYXkiLCJhbm90aGVyU3RhZmYiLCJ1bHgiLCJ1bHkiLCJscngiLCJscnkiLCJyb3RhdGUiLCJwYXRoIiwiY29vcmRpbmF0ZXMiLCJnZXRBdHRyaWJ1dGUiLCJtYXRjaCIsIm1hcCIsImF0YW4iLCJtaW4iLCJub3ROZXVtZXMiLCJubiIsInNlbGVjdGlvbkNsYXNzIiwiY29udGFpbnNMYXllckVsZW1lbnRzIiwiY29udGFpbnNOYyIsImdyb3Vwc1RvU2VsZWN0IiwiU2V0IiwiZ3JvdXBpbmciLCJmb2xsb3dzIiwicHJlY2VkZXMiLCJoYXMiLCJncm91cCIsImdyb3VwcyIsInZhbHVlcyIsInRyaWdnZXJNdWx0aVN0YWZmQWN0aW9ucyIsInNpemUiLCJ0cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyIsInRyaWdnZXJEZWZhdWx0QWN0aW9ucyIsInRyaWdnZXJTeWxsYWJsZUFjdGlvbnMiLCJhZGRBZGRTeWxMaXN0ZW5lciIsImlzTGlua2FibGUiLCJpc0dyb3VwYWJsZSIsInRyaWdnZXJOZXVtZUFjdGlvbnMiLCJjaGlsZHJlbiIsImZpcnN0TkMiLCJzZWNvbmROQyIsImZpcnN0TkNYIiwieCIsImJhc2VWYWwiLCJzZWNvbmROQ1giLCJmaXJzdE5DWSIsInkiLCJzZWNvbmROQ1kiLCJnIiwidHJpZ2dlckRlZmF1bHRTeWxBY3Rpb25zIiwiaW5zZXJ0VGFiSHRtbCIsInByaW1pdGl2ZVRhYiIsImdyb3VwaW5nVGFiIiwic3lzdGVtVGFiIiwiaW5zZXJ0Q29udHJvbHNQYW5lbCIsImVkaXRDb250cm9sc1BhbmVsIiwibmNBY3Rpb25Db250ZW50cyIsImRlZmF1bHROZXVtZUFjdGlvbkNvbnRlbnRzIiwibmV1bWVBY3Rpb25Db250ZW50cyIsImRlZmF1bHRBY3Rpb25Db250ZW50cyIsImRlZmF1bHRTeWxBY3Rpb25Db250ZW50cyIsImN1c3Rvc0FjdGlvbkNvbnRlbnRzIiwibGF5ZXJFbGVtZW50T3V0QWN0aW9uQ29udGVudHMiLCJsYXllckVsZW1lbnRJbkFjdGlvbkNvbnRlbnRzIiwiYWNjaWRBY3Rpb25Db250ZW50cyIsInN0YWZmU3BsaXRBY3Rpb25Db250ZW50cyIsInN0YWZmTWVyZ2VBY3Rpb25Db250ZW50cyIsImNvbHVtbkFjdGlvbkNvbnRlbnRzIiwiY2xlZkFjdGlvbkNvbnRlbnRzIiwiZGl2TGluZUFjdGlvbkNvbnRlbnRzIiwiYmJveEFjdGlvbkNvbnRlbnRzIiwiZ3JvdXBpbmdNZW51IiwibGlnYXR1cmVOYyIsImxpZ2F0dXJlIiwic3BsaXRTeWxsYWJsZSIsImFkZFRleHRNb2RhbCIsImVkaXRUZXh0TW9kYWwiLCJob3RrZXlzTW9kYWwiLCJzeWxsYWJsZUFjdGlvbnNDb250ZW50IiwiZXJyb3JMb2dzUGFuZWxDb250ZW50cyIsIk1vZGFsV2luZG93VmlldyIsIk1vZGFsV2luZG93U3RhdGUiLCJvcGVuQWRkU3lsVGV4dE1vZGFsV2luZG93IiwiaGlkZU1vZGFsV2luZG93IiwiYWRkU3lsVGV4dCIsImZvY3VzTW9kYWxXaW5kb3ciLCJvcGVuRWRpdFN5bFRleHRNb2RhbFdpbmRvdyIsInVwZGF0ZVN5bFRleHQiLCJlZGl0b3JBY3Rpb24iLCJhY3Rpb24iLCJwYXJhbSIsImVsZW1lbnRJZCIsInN5bFRleHQiLCJlZGl0IiwidGhlbiIsInJlc3BvbnNlIiwidXBkYXRlRm9yQ3VycmVudFBhZ2UiLCJvcmlnIiwidGV4dENvbnRlbnQiLCJyZXBsYWNlIiwidHJpbSIsInVwZGF0ZWRTeWxUZXh0IiwiZW50cmllcyIsImNsYXNzTmFtZSIsInRleHQiLCJ1cGRhdGVTZWxlY3RlZEJCb3giLCJrZXlkb3duTGlzdGVuZXIiLCJlIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwibW9kYWxXaW5kb3dWaWV3IiwiQUREX1RFWFQiLCJFRElUX1RFWFQiLCJET0NVTUVOVF9VUExPQUQiLCJORVdfRk9MREVSIiwiUkVOQU1FIiwiZm9jdXMiLCJtb2RhbFdpbmRvd1N0YXRlIiwiQ0xPU0VEIiwic2V0dXBFdmVudExpc3RlbmVycyIsImNvbnRlbnQiLCJzZXRNb2RhbFdpbmRvd0NvbnRlbnQiLCJ0b1N0cmluZyIsIkhPVEtFWVMiLCJNT1ZFX1RPIiwiYm9keSIsIm92ZXJmbG93WCIsIm92ZXJmbG93WSIsIk9QRU4iLCJyZW1vdmVFdmVudExpc3RlbmVycyIsImNvbnRhaW5lciIsInRpdGxlIiwiaW5uZXJUZXh0IiwicmVtb3ZlU3ltYm9sIiwiRVJST1JfTE9HIiwiZW5jb2RlVVJJIiwidXBsb2FkQXJlYUhUTUwiLCJuZXdGb2xkZXJIVE1MIiwicmVuYW1lSFRNTCIsImJib3hJZCIsImZpbmQiLCJjaGVja2VkIiwiZGlzcGxheVJlY3QiLCJieXRlVG9IZXgiLCJzdWJzdHIiLCJvZmZzZXQiLCJ1dWlkIiwidG9Mb3dlckNhc2UiLCJsYXN0R2x5cGhPcGFjaXR5IiwibGFzdEltYWdlT3BhY2l0eSIsImxhc3RDaXJjbGVTaXplIiwic2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlciIsIm1laUNsYXNzTmFtZSIsIm9wYWNpdHlPdXRwdXQiLCJzZXRTZXR0aW5ncyIsImhpZGVHbHlwaEltZyIsIm9wYWNpdHkiLCJzZXRCZ09wYWNpdHlGcm9tU2xpZGVyIiwiYmFja2dyb3VuZCIsImJnT3BhY2l0eU91dHB1dCIsImhpZGVCZ0ltZyIsImJnIiwidXBkYXRlSGlnaGxpZ2h0T3B0aW9uIiwib3B0aW9uIiwiZHJvcGRvd24iLCJoaWdobGlnaHRUeXBlIiwidW5zZXRHcm91cGluZ0hpZ2hsaWdodCIsInRvVXBwZXJDYXNlIiwic2V0R3JvdXBpbmdIaWdobGlnaHQiLCJzZXRIaWdobGlnaHRPcHRpb24iLCJoaWdobGlnaHRDbGlja2F3YXkiLCJzZXRIaWdobGlnaHRDb250cm9scyIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInRvZ2dsZSIsImxvYWRIaWdobGlnaHRTZXR0aW5ncyIsImdldFNldHRpbmdzIiwiem9vbUhhbmRsZXIiLCJ6b29tU2xpZGVyIiwiem9vbU91dHB1dCIsInpvb21UbyIsInJlc2V0Wm9vbUFuZFBhbiIsImRpc2FibGVkIiwiY3VycmVudFpvb20iLCJwYXJzZUludCIsInByZXZlbnREZWZhdWx0IiwibmV3Wm9vbSIsImNpcmNsZVNsaWRlciIsImNpcmNsZU91dHB1dCIsImNpcmNsZVNpemVJbnB1dENoYW5nZUhhbmRsZXIiLCJyZXNpemVQb2ludHMiLCJlbXB0eSIsImF0dHIiLCJoaWdobGlnaHRTZWxlY3Rpb24iLCJoaWdobGlnaHRJZCIsImRpc3BsYXlBbGxCdG4iLCJkaXNwbGF5QkJveGVzIiwib3BhY2l0eVNsaWRlciIsImlucHV0Q2hhbmdlT3BhY2l0eSIsInRvZ2dsZU9wYWNpdHlCdG4iLCJuZXdPcGFjaXR5Iiwicm91bmQiLCJzZXRHbHlwaE9wYWNpdHlDb250cm9scyIsImJnT3BhY2l0eVNsaWRlciIsImJnSW5wdXRDaGFuZ2VIYW5kbGVyIiwidG9nZ2xlQmdPcGFjaXR5QnRuIiwic2V0QmdPcGFjaXR5Q29udHJvbHMiLCJtZXRhS2V5Iiwic2VsZWN0QWxsQnRuIiwib3B0aW9ucyIsImNsaWNrIiwic2V0RGlzcGxheUFsbExpc3RlbmVyIiwiZGlzcGxheUNvbnRlbnRzIiwidG9nZ2xlRGlzcGxheSIsInBhZGRpbmciLCJvdmVyZmxvdyIsInVuc2V0SW5jbGluYXR1bUFjdGlvbiIsImF0dHJUeXBlIiwiYXR0clZhbHVlIiwidW5zZXRWaXJnYUFjdGlvbiIsInVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbiIsInVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbiIsInVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24iLCJjdXJ2ZSIsImRlbGV0ZUJ1dHRvbkhhbmRsZXIiLCJyZW1vdmVIYW5kbGVyIiwibW9yZUVkaXQiLCJleHRyYUVkaXQiLCJ0b1JlbW92ZSIsImNoYWluQWN0aW9uIiwiY2hhbmdlU3RhZmZIYW5kbGVyIiwidG9DaGFuZ2UiLCJpbnNlcnRUb1N5bGxhYmxlSGFuZGxlciIsInRvSW5zZXJ0IiwicmVzdWx0IiwibW92ZU91dHNpZGVTeWxsYWJsZUhhbmRsZXIiLCJ0b01vdmUiLCJtYXRjaEhlaWdodEhhbmRsZXIiLCJvcGVuQWRkU3lsV2luZG93IiwibW9kYWxXaW5kb3ciLCJtb2RhbCIsInNldE1vZGFsV2luZG93VmlldyIsIm9wZW5Nb2RhbFdpbmRvdyIsImFkZERlbGV0ZUxpc3RlbmVyIiwiZGVsIiwiYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lciIsImNoYW5nZVN0YWZmIiwidXBkYXRlQ29sdW1uSW5mbyIsImNvbElucHV0Iiwic3RhdmVzIiwiY29sSW5mbyIsImhhc0NvbHVtbiIsImpvaW4iLCJzdGFmZkNvbCIsImFkZENvbHVtbkluZm9TdGVwSGFuZGxlciIsImRlY3JlbWVudEJ1dHRvbiIsImluY3JlbWVudEJ1dHRvbiIsImNvbmZpcm1CdXR0b24iLCJ1cGRhdGVOdW1iZXIiLCJjaGFuZ2UiLCJjdXJyZW50VmFsdWUiLCJ0b1NldENvbHVtbiIsInNldEVkaXRDb250cm9scyIsImVkaXRUeXBlIiwiY29udGVudHMiLCJwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uIiwidHJpZ2dlclN0YWZmU3BsaXRNb2RlIiwiU3BsaXRTdGFmZkhhbmRsZXIiLCJzdGFydFNwbGl0IiwiaW5pdE9wdGlvbnNMaXN0ZW5lcnMiLCJkcm9wIiwib3B0aW9uc0NsaWNrYXdheSIsIm90aGVyIiwiaW5pdE5lb25WaWV3IiwiYWRkU3lsIiwiQ29udGVudHMiLCJ1bnNldEluY2xpbmF0dW0iLCJ1bnNldFZpcmdhIiwidW5zZXRWaXJnYVJldmVyc2VkIiwidW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlIiwidW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSIsInNldEluY2xpbmF0dW0iLCJzZXRWaXJnYSIsInNldFZpcmdhUmV2ZXJzZWQiLCJzZXRMaXF1ZXNjZW50Q2xvY2t3aXNlIiwic2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UiLCJ0cmlnZ2VyQ2hhbmdlR3JvdXAiLCJjb250b3VyIiwiY2hhbmdlR3JvdXBpbmdBY3Rpb24iLCJTcGxpdE5ldW1lSGFuZGxlciIsImluZm8iLCJnZXRDb250b3VyQnlWYWx1ZSIsImV4dHJhQWN0aW9uc0hUTUwiLCJhY2NpZE9wdGlvbnNMaXN0ZW5lciIsImluY3JlbWVudE9jdGF2ZSIsImRpcmVjdGlvbiIsInNoYXBlIiwiY2xlZk9wdGlvbnNMaXN0ZW5lciIsImRpdkxpbmVPcHRpb25zTGlzdGVuZXIiLCJtZXJnZVN0YXZlcyIsInBvaW50cyIsImdldFN0YWZmQkJveCIsInlfY2hhbmdlIiwidGFuIiwiZ2V0U1ZHUmVsQ29vcmRzIiwiY2xpZW50WCIsImNsaWVudFkiLCJwdCIsIkRPTVBvaW50IiwicGFnZU1hcmdpbiIsIm1hdHJpeFRyYW5zZm9ybSIsImdldFNjcmVlbkNUTSIsImludmVyc2UiLCJnZXRTdGFmZklkQnlDb29yZHMiLCJzdGFmZkJCb3hlcyIsInN0YWZmSWQiLCJiZ0ltZyIsInJlY3QiLCJ0YWdOYW1lIiwiZ2V0QkJveCIsInBhcmVudE5vZGUiLCJ3aWR0aCIsImhlaWdodCIsImhleF9jaHIiLCJtZDVjeWNsZSIsImsiLCJhIiwiYiIsIm1kNWJsayIsIm1kNWJsa3MiLCJjaGFyQ29kZUF0IiwibWQ1YmxrX2FycmF5IiwibWQ1MSIsInRhaWwiLCJ0bXAiLCJsbyIsImhpIiwic3Vic3RyaW5nIiwicmhleCIsImhleCIsInRvVXRmOCIsInN0ciIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaGV4VG9CaW5hcnlTdHJpbmciLCJieXRlcyIsImZyb21DaGFyQ29kZSIsIlNwYXJrTUQ1IiwicmVzZXQiLCJBcnJheUJ1ZmZlciIsImNsYW1wIiwidmFsIiwidG8iLCJudW0iLCJ0YXJnZXRBcnJheSIsInNvdXJjZUFycmF5IiwiYnl0ZUxlbmd0aCIsImJlZ2luIiwiZW5kIiwiVWludDhBcnJheSIsImFwcGVuZEJpbmFyeSIsIl9idWZmIiwiX2xlbmd0aCIsIl9oYXNoIiwicmF3IiwiYnVmZiIsIl9maW5pc2giLCJnZXRTdGF0ZSIsImhhc2giLCJzZXRTdGF0ZSIsImRlc3Ryb3kiLCJoYXNoQmluYXJ5IiwiZmlyc3QiLCJzZWNvbmQiLCJyZXR1cm5VSW50OEFycmF5IiwiYnVmZmVyIiwic3ViYXJyYXkiLCJ1dGY4U3RyMkFycmF5QnVmZmVyIiwibWQ1MV9hcnJheSIsImZhY3RvcnkiLCJ1aW50OFRvVXVpZCIsImRhdGEiLCJjYiIsInByZXZpb3VzIiwiY3VycmVudCIsInBhZFN0YXJ0IiwicmVkdWNlIiwiY3J5cHRvIiwib2N0ZXRzIiwibW9kaWZpZXJzIiwiZ2V0UmFuZG9tVmFsdWVzIiwiQ29sb3JQYWxldHRlIiwicmVjdHMiLCJ1bnNldFN0YWZmSGlnaGxpZ2h0IiwiY2hpbGQiLCJjY2hpbGQiLCJzZXRTdGFmZkhpZ2hsaWdodCIsInN0YWZmQ29sb3IiLCJjb2x1bW5OdW0iLCJjb2x1bW4iLCJzZXRDb2x1bW5IaWdobGlnaHQiLCJncm91cENvbG9yIiwiZGl2TGluZUNoaWxkcmVuIiwicm5kczgiLCJybmciLCJtc0NyeXB0byIsIm9iaiIsInN0YWNrIiwibWV0YVN0YWNrIiwibGFzdE1ldGFFbGVtZW50IiwibGFzdEVsZW1lbnRJbmRleCIsImlzQXJyYXkiLCJpbnB1dCIsIm5leHQiLCJhcnJheVByZWZpeCIsIm9ialByZWZpeCIsInJlcyIsInByZWZpeCIsImNvbGxhdGlvbkluZGV4IiwicGFyc2VkTnVtIiwibnVtQ2hhciIsInBhcnNlZFN0cmluZyIsImxhc3RDaCIsIm51bUNvbnNlY3V0aXZlU2xhc2hlcyIsImNoIiwiYXJyYXlFbGVtZW50Iiwib2JqRWxlbWVudCIsInBhcnNlRmxvYXQiLCJidWYiLCJybmRzIiwicmFuZG9tIiwic2VsZWN0b3IiLCJkcmFnU3RhcnRDb29yZHMiLCJkcmFnQmVoYXZpb3VyIiwiZHJhZyIsImV2ZW50IiwiZHgiLCJkeSIsInNvdXJjZUV2ZW50IiwiZHJhZ2dpbmciLCJkcmFnRW5kZWQiLCJzZWxlY3Rpb24iLCJub01vdmVQcmVjZWRlcyIsImhhc0F0dHJpYnV0ZSIsIm1vdmVFbGVtZW50cyIsImJib3hlcyIsInhEaWZmIiwieURpZmYiLCJpc0N1cnNvck91dE9mQm91bmRzIiwiaXNEcmFnT3V0T2ZCb3VuZHMiLCJyZXR1cm5FbGVtZW50cyIsInBhcmFtQXJyYXkiLCJkcmFnQWN0aW9uIiwidG9SZXNlbGVjdCIsInJlc2VsZWN0IiwicmVzZWxlY3RlZCIsInJlc2V0VG9BY3Rpb24iLCJlbmRYIiwiZW5kWSIsImlzT3V0T2ZTVkdCb3VuZHMiLCJnbHlwaFNlbGVjdG9yIiwic2VsZWN0aW9uQkJveCIsImFjYyIsImdldEdseXBoQkJveCIsImN1cnIiLCJNQVhfVkFMVUUiLCJNSU5fVkFMVUUiLCJTZWxlY3RUb29scyIsInNoYXJlZExvZ2ljYWxQYXJlbnQiLCJhcmVBZGphY2VudCIsImNvbnRhaW5zTGlua2VkIiwiaXNMaW5rZWQiLCJjYW5CZUxpbmtlZCIsInNvcnQiLCJzdGFmZkEiLCJzdGFmZkIiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJzeWxsYWJsZXMiLCJjdXJyZW50U3lsbGFibGVJbmRleCIsImN1cnJlbnRTdGFmZiIsIm5leHRTdGFmZiIsImN1cnJlbnRTdGFmZkluZGV4IiwiZXZlcnkiLCJ1bmxpbmtlZEVsZW1lbnRzIiwiZmlyc3RVbmxpbmtlZCIsIkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyIsImlkeCIsInN5bGxhYmxlIiwiYXQiLCJuZXh0U3lsbGFibGVJZCIsIm5leHRTeWxsYWJsZUlkeCIsIm5leHRTeWxsYWJsZSIsInByZXZTeWxsYWJsZUlkIiwicHJldlN5bGxhYmxlIiwiaGFzSW52YWxpZExpbmtlZFN5bGxhYmxlIiwic3lzdGVtcyIsImVsZW1lbnRJZHMiLCJncm91cGluZ0FjdGlvbiIsImdldENoaWxkcmVuSWRzIiwiZ2V0SWRzIiwidG9nZ2xlTGlua2VkU3lsbGFibGVzIiwiZ3JvdXBUeXBlIiwibmV1bWVQYXJlbnQiLCJuY3MiLCJnZXRDb250b3VyIiwiV2FybmluZ3MiLCJncm91cGluZ05vdFJlY29nbml6ZWQiLCJnZXRTVkdHcmFwaGljc0VsZW1lbnRCeUlkIiwiU1ZHR3JhcGhpY3NFbGVtZW50IiwidW5saW5rIiwiZmlyc3RTeWxsYWJsZSIsInNlY29uZFN5bGxhYmxlIiwidW5saW5rZWRFbGVtZW50IiwiZ2V0VG9nZ2xlU3lsbGFibGVJZHMiLCJsb2ciLCJpZHMiLCJjaGlsZHJlbklkcyIsIkVudHJ5VHlwZSIsIkZpbGVTeXN0ZW1Ub29scyIsIkZpbGVTeXN0ZW1NYW5hZ2VyIiwiY3JlYXRlTG9nTWVzc2FnZSIsIm5vdGlmIiwibm90aWZEaXYiLCJyZW1vdmVCdG4iLCJvbmNsaWNrIiwiaW5mb0J0biIsIk1vZGFsV2luZG93Iiwib3BlbkVycm9yTG9nV2luZG93IiwiaW5pdEVycm9yTG9nQ29udHJvbHMiLCJlcnJvclBhbmVsIiwiaGVhZGluZyIsImRyb3Bkb3duSWNvbiIsImluaXREaXNwbGF5TGlzdGVuZXIiLCJjaGVja2JveGVzQ29udGFpbmVyIiwiZXJyb3JzTGFiZWwiLCJlcm9ycnNCdG4iLCJhcHBlbmRDaGlsZCIsInVwZGF0ZUVycm9yTG9nVmlzaWJpbGl0eSIsIm5vdGlmUGFuZWwiLCJQb2ludE5hbWVzIiwiVG9wTGVmdCIsIlRvcCIsIlRvcFJpZ2h0IiwiUmlnaHQiLCJCb3R0b21SaWdodCIsIkJvdHRvbSIsIkJvdHRvbUxlZnQiLCJMZWZ0IiwiZ2V0UG9pbnRzIiwic2luIiwiaW5pdGlhbFVseCIsImluaXRpYWxMcngiLCJpbml0aWFsUG9pbnQiLCJpbml0aWFsVWx5IiwiaW5pdGlhbExyeSIsImluaXRpYWxZIiwiaW5pdGlhbFJlY3RZIiwicG9seUxlbiIsImluaXRpYWxSb3RhdGUiLCJyZWRyYXciLCJwb2ludFN0cmluZyIsIl9lbGVtIiwidGV4dFJlY3QiLCJwb2ludE5hbWUiLCJwb2ludCIsInBvaW50U3RyaW5nUmlnaHQiLCJwb2ludFN0cmluZ0xlZnQiLCJkcmF3SW5pdGlhbFJlY3QiLCJ3aGljaFBvaW50IiwiXyIsInZpZXdwb3J0RWxlbWVudCIsInJlc2l6ZVN0YXJ0IiwicmVzaXplRHJhZyIsInJlc2l6ZUVuZCIsInJvdGF0ZVN0YXJ0IiwidGVtcCIsIm1vdXNlIiwidGVtcFJvdGF0ZSIsInJvdGF0ZUVuZCIsImN1cnJlbnRQb2ludCIsIndoaWNoIiwiUEkiLCJFeHBvcnRlZFNldCIsIkV4cG9ydGVkTWFwIiwibWFuZ2xlIiwidW5tYW5nbGUiLCJNYXAkMSIsIl9zdG9yZSIsIlNldCQxIiwiY2xvbmVCaW5hcnlPYmplY3QiLCJjbG9uZUFycmF5QnVmZmVyIiwid2Via2l0U2xpY2UiLCJtYW5nbGVkIiwiZGVsZXRlIiwiTWFwIiwicHJvcCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInNwZWNpZXMiLCJzdXBwb3J0c01hcEFuZFNldCIsImZ1bmNUb1N0cmluZyIsIm9iamVjdEN0b3JTdHJpbmciLCJjbG9uZSIsIm5ld09iamVjdCIsIkRhdGUiLCJpc0Zpbml0ZSIsInRvSVNPU3RyaW5nIiwiQmxvYiIsImlzQmluYXJ5T2JqZWN0IiwicHJvdG8iLCJDdG9yIiwiaXNQbGFpbk9iamVjdCIsImNhbGxlZCIsInRvUHJvbWlzZSIsImZ1bmMiLCJzZWxmIiwidXNlZENCIiwicHJvbWlzZSIsImZ1bGZpbGwiLCJyZXNwIiwiY2FsbGJhY2siLCJtZXNnIiwiYWRhcHRlckZ1biIsIl9jbG9zZWQiLCJfZGVzdHJveWVkIiwibG9nQXJncyIsIm9yaWdDYWxsYmFjayIsInJlc3BvbnNlQXJncyIsImxvZ0FwaUNhbGwiLCJ0YXNrcXVldWUiLCJpc1JlYWR5IiwiYWRkVGFzayIsImZhaWxlZCIsInBpY2siLCJoYXNMb2NhbCIsImlkZW50aXR5RnVuY3Rpb24iLCJmb3JtYXRSZXN1bHRGb3JPcGVuUmV2c0dldCIsIm9rIiwiYnVsa0dldCIsImRiIiwib3B0cyIsInJlcXVlc3RzIiwiZG9jcyIsInJlcXVlc3RzQnlJZCIsInJlcXVlc3QiLCJudW1Eb2NzIiwibnVtRG9uZSIsInBlckRvY1Jlc3VsdHMiLCJjaGVja0RvbmUiLCJyZXN1bHRzIiwiYWxsUmVxdWVzdHMiLCJuZXh0QmF0Y2giLCJ1cFRvIiwiYmF0Y2giLCJkb2NJZCIsImRvY0lkeCIsImRvY1JlcXVlc3RzIiwiZG9jT3B0cyIsIm9wZW5fcmV2cyIsInJldiIsImZvcm1hdFJlc3VsdCIsInByb2Nlc3NCYXRjaCIsImhhc0xvY2FsU3RvcmFnZSIsIkNoYW5nZXMiLCJhdHRhY2hCcm93c2VyRXZlbnRzIiwiZ3VhcmRlZENvbnNvbGUiLCJtZXRob2QiLCJkZWZhdWx0QmFja09mZiIsIm1heFRpbWVvdXQiLCJyYW5kb21OdW1iZXIiLCJleHBsYWluRXJyb3IiLCJzdGF0dXMiLCJkYk5hbWUiLCJpbnByb2dyZXNzIiwiZXZlbnRGdW5jdGlvbiIsImNoYW5nZXNPcHRzIiwiY2hhbmdlcyIsInNlcSIsInNpbmNlIiwiY2FuY2VsbGVkIiwib25DaGFuZ2UiLCJub3RpZnlMb2NhbFdpbmRvd3MiLCJub3RpZnkiLCIkaW5qZWN0X09iamVjdF9hc3NpZ24iLCJhc3NpZ24iLCJuZXh0U291cmNlIiwibmV4dEtleSIsIlBvdWNoRXJyb3IiLCJyZWFzb24iLCJNSVNTSU5HX0JVTEtfRE9DUyIsIk1JU1NJTkdfRE9DIiwiUkVWX0NPTkZMSUNUIiwiSU5WQUxJRF9JRCIsIk1JU1NJTkdfSUQiLCJSRVNFUlZFRF9JRCIsIlVOS05PV05fRVJST1IiLCJCQURfQVJHIiwiUVVFUllfUEFSU0VfRVJST1IiLCJET0NfVkFMSURBVElPTiIsIkJBRF9SRVFVRVNUIiwiTk9UX0FOX09CSkVDVCIsIklEQl9FUlJPUiIsIklOVkFMSURfUkVWIiwiTUlTU0lOR19TVFVCIiwiY3JlYXRlRXJyb3IiLCJDdXN0b21Qb3VjaEVycm9yIiwibmFtZXMiLCJnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlIiwiZmlsdGVyQ2hhbmdlIiwicmVxIiwiaGFzRmlsdGVyIiwicXVlcnkiLCJxdWVyeV9wYXJhbXMiLCJkb2MiLCJmaWx0ZXJSZXR1cm4iLCJtc2ciLCJ0cnlGaWx0ZXIiLCJpbmNsdWRlX2RvY3MiLCJhdHRhY2htZW50cyIsImF0dCIsIl9hdHRhY2htZW50cyIsInN0dWIiLCJmbGF0dGVuIiwiYXJycyIsImludmFsaWRJZEVycm9yIiwiaXNSZW1vdGUiLCJfcmVtb3RlIiwicGFyc2VEZXNpZ25Eb2NGdW5jdGlvbk5hbWUiLCJwYXJ0cyIsInNwbGl0Iiwibm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lIiwibm9ybWFsaXplZCIsInFQYXJzZXIiLCJwYXJzZXIiLCJwYXJzZVVyaSIsImV4ZWMiLCJ1cmkiLCJlbmNvZGVkIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiJDAiLCIkMSIsIiQyIiwic2NvcGVFdmFsIiwic291cmNlIiwic2NvcGUiLCJ1cHNlcnQiLCJkaWZmRnVuIiwiY2F0Y2giLCJkb2NSZXYiLCJfcmV2IiwibmV3RG9jIiwiX2lkIiwicHV0IiwidXBkYXRlZCIsInRyeUFuZFB1dCIsInRoaXNBdG9iIiwiYXRvYiIsInRoaXNCdG9hIiwiYnRvYSIsImNyZWF0ZUJsb2IiLCJwcm9wZXJ0aWVzIiwiYnVpbGRlciIsIkJsb2JCdWlsZGVyIiwiTVNCbG9iQnVpbGRlciIsIk1vekJsb2JCdWlsZGVyIiwiV2ViS2l0QmxvYkJ1aWxkZXIiLCJnZXRCbG9iIiwiYmluYXJ5U3RyaW5nVG9BcnJheUJ1ZmZlciIsImJpbiIsImJpblN0cmluZ1RvQmx1ZmZlciIsImJpblN0cmluZyIsImI2NFRvQmx1ZmZlciIsImI2NCIsInJlYWRBc0JpbmFyeVN0cmluZyIsImJsb2IiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwiaGFzQmluYXJ5U3RyaW5nIiwib25sb2FkZW5kIiwiYmluYXJ5IiwiYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyIsInJlYWRBc0FycmF5QnVmZmVyIiwiYmxvYlRvQmluYXJ5U3RyaW5nIiwiYmxvYk9yQnVmZmVyIiwiYmxvYlRvQmFzZTY0IiwiYmFzZTY0Iiwic2V0SW1tZWRpYXRlU2hpbSIsInNldEltbWVkaWF0ZSIsImFwcGVuZEJsb2IiLCJzdGFydCIsInNsaWNlQmxvYiIsImFycmF5QnVmZmVyIiwiYXBwZW5kU3RyaW5nIiwic3RyaW5nIiwiYmluYXJ5TWQ1IiwiaW5wdXRJc1N0cmluZyIsImNodW5rU2l6ZSIsImNodW5rcyIsImNlaWwiLCJjdXJyZW50Q2h1bmsiLCJsb2FkTmV4dENodW5rIiwiZG9uZSIsInJhd1RvQmFzZTY0Iiwic3RyaW5nTWQ1IiwicmV2JCQxIiwiZGV0ZXJtaW5pc3RpY19yZXZzIiwibXV0YXRlYWJsZURvYyIsIl9yZXZfdHJlZSIsIndpbm5pbmdSZXYiLCJtZXRhZGF0YSIsIndpbm5pbmdJZCIsIndpbm5pbmdQb3MiLCJ3aW5uaW5nRGVsZXRlZCIsIm5vZGUiLCJ0b1Zpc2l0IiwicmV2X3RyZWUiLCJ0cmVlIiwiYnJhbmNoZXMiLCJwb3MiLCJkZWxldGVkIiwidHJhdmVyc2VSZXZUcmVlIiwicmV2cyIsIm5ld0N0eCIsImN0eCIsInNvcnRCeVBvcyIsImNvbGxlY3RMZWF2ZXMiLCJsZWF2ZXMiLCJpc0xlYWYiLCJyZXZlcnNlIiwiY29sbGVjdENvbmZsaWN0cyIsIndpbiIsImNvbmZsaWN0cyIsImxlYWYiLCJyb290VG9MZWFmIiwicGF0aHMiLCJoaXN0b3J5Iiwic29ydEJ5UG9zJDEiLCJpbnNlcnRTb3J0ZWQiLCJpdGVtIiwiY29tcGFyYXRvciIsIm1pZCIsImxvdyIsImhpZ2giLCJiaW5hcnlTZWFyY2giLCJzcGxpY2UiLCJwYXRoVG9UcmVlIiwibnVtU3RlbW1lZCIsInJvb3QiLCJjdXJyZW50TGVhZiIsImNvbXBhcmVUcmVlIiwibWVyZ2VUcmVlIiwiaW5fdHJlZTEiLCJpbl90cmVlMiIsInRyZWUxIiwidHJlZTIiLCJtZXJnZWQiLCJkb01lcmdlIiwiZG9udEV4cGFuZCIsInJlc3RyZWUiLCJicmFuY2giLCJ0MSIsInQyIiwiZGlmZiIsImNhbmRpZGF0ZVBhcmVudHMiLCJ0cmVlcyIsInBhcmVudElkeCIsImVsZW1lbnRzTGVuIiwibWVyZ2UiLCJkZXB0aCIsIm5ld1RyZWUiLCJzdGVtbWVkIiwic3RlbW1lZFJldnMiLCJyZXZIYXNoIiwic3RlbSIsImdldFRyZWVzIiwiaXNEZWxldGVkIiwiaXNMb2NhbElkIiwiQ2hhbmdlcyQxIiwiY29tcGxldGUiLCJlZSIsIm9uRGVzdHJveSIsImNhbmNlbCIsInBlbmRpbmciLCJsYXN0U2VxIiwiaXNDYW5jZWxsZWQiLCJ0cnlDYXRjaEluQ2hhbmdlTGlzdGVuZXIiLCJ2YWxpZGF0ZUNoYW5nZXMiLCJwcm9jZXNzQ2hhbmdlIiwiY2hhbmdlTGlzdCIsIl9jb25mbGljdHMiLCJjb21wYXJlIiwibGVmdCIsInJpZ2h0IiwieWFua0Vycm9yIiwiY29tcGFyZUJ5SWRUaGVuUmV2IiwiaWRDb21wYXJlIiwiX3JldmlzaW9ucyIsIkFic3RyYWN0UG91Y2hEQiIsIlRhc2tRdWV1ZSIsIlBvdWNoREIiLCJfX29wdHMiLCJhdXRvX2NvbXBhY3Rpb24iLCJiYWNrZW5kIiwiYWRhcHRlciIsImFkYXB0ZXJzIiwicHJlZmVycmVkQWRhcHRlcnMiLCJhZGFwdGVyTmFtZSIsInVzZV9wcmVmaXgiLCJwYXJzZUFkYXB0ZXIiLCJfYWRhcHRlciIsInZhbGlkIiwidmlld19hZGFwdGVyIiwiZmFpbCIsIm9uRGVzdHJveWVkIiwiZnJvbV9jb25zdHJ1Y3RvciIsIm9uQ2xvc2VkIiwicHJlcGFyZUZvckRlc3RydWN0aW9uIiwicmVhZHkiLCJfY2hhbmdlc0ZpbHRlclBsdWdpbiIsInZhbGlkYXRlIiwiZG9DaGFuZ2VzIiwiY29udGludW91cyIsImxpdmUiLCJub3JtYWxpemUiLCJzaG91bGRGaWx0ZXIiLCJkZXNjZW5kaW5nIiwibGltaXQiLCJuZXdQcm9taXNlIiwiX2NoYW5nZXMiLCJ1cGRhdGVfc2VxIiwicG9zdCIsImJ1bGtEb2NzIiwiX3B1dExvY2FsIiwiX2RlbGV0ZWQiLCJfcmVtb3ZlTG9jYWwiLCJvbGRSZXZJZCIsIm5ld1Jldk51bSIsIm5ld1JldklkIiwicHV0RG9jIiwiX3B1dCIsIm5ld19lZGl0cyIsImZvcmNlIiwicHV0QXR0YWNobWVudCIsImF0dGFjaG1lbnRJZCIsImFwaSIsImNyZWF0ZUF0dGFjaG1lbnQiLCJwcmV2cmV2cG9zIiwiY29udGVudF90eXBlIiwicmV2cG9zIiwicmVtb3ZlQXR0YWNobWVudCIsImRvY09ySWQiLCJvcHRzT3JSZXYiLCJ3YXNfZGVsZXRlIiwicmV2c0RpZmYiLCJtaXNzaW5nIiwiYWRkVG9NaXNzaW5nIiwicmV2SWQiLCJfZ2V0UmV2aXNpb25UcmVlIiwibWlzc2luZ0ZvcklkIiwicHJvY2Vzc0RvYyIsIm1pc3NpbmdPYmoiLCJjb21wYWN0RG9jdW1lbnQiLCJtYXhIZWlnaHQiLCJyZXZUcmVlIiwiZWRnZXMiLCJwcm50IiwiZWRnZSIsImNvbXB1dGVIZWlnaHQiLCJjYW5kaWRhdGVzIiwiX2RvQ29tcGFjdGlvbiIsImNvbXBhY3QiLCJfY29tcGFjdGlvblF1ZXVlIiwiZG9OZXh0Q29tcGFjdGlvbiIsImxhc3Rfc2VxIiwiX2NvbXBhY3QiLCJyZXR1cm5fZG9jcyIsInByb21pc2VzIiwicm93IiwiYWxsIiwiX2dldExvY2FsIiwiZmluaXNoT3BlblJldnMiLCJsYXRlc3QiLCJfZ2V0IiwicmV2c19pbmZvIiwic3BsaXR0ZWRSZXYiLCJyZXZObyIsImN1cnJlbnRQYXRoIiwiaGFzaEluZGV4IiwiaW5kZXhPZlJldiIsImhvd01hbnkiLCJfcmV2c19pbmZvIiwiX2dldEF0dGFjaG1lbnQiLCJnZXRBdHRhY2htZW50IiwiYWxsRG9jcyIsInNraXAiLCJzdGFydF9rZXkiLCJzdGFydGtleSIsImVuZF9rZXkiLCJlbmRrZXkiLCJpbmNvbXBhdGlibGVPcHQiLCJhbGxEb2NzS2V5c1BhcnNlIiwiX2FsbERvY3MiLCJjbG9zZSIsIl9jbG9zZSIsIl9pbmZvIiwiZGJfbmFtZSIsIl90eXBlIiwiYXR0YWNobWVudEVycm9yIiwiY2hhckF0IiwiYXR0YWNobWVudE5hbWVFcnJvciIsImF0dHMiLCJjbGVhbkRvY3MiLCJfYnVsa0RvY3MiLCJyZWdpc3RlckRlcGVuZGVudERhdGFiYXNlIiwiZGVwZW5kZW50RGIiLCJkYk9wdGlvbnMiLCJkZXBEQiIsImRlcGVuZGVudERicyIsInVzZVByZWZpeCIsImRlc3Ryb3lEYiIsIl9kZXN0cm95IiwibG9jYWxEb2MiLCJkZWxldGVkTWFwIiwidHJ1ZU5hbWUiLCJSZWdFeHAiLCJleGVjdXRlIiwiQWJvcnRDb250cm9sbGVyIiwiYWJvcnQiLCJmJDEiLCJmZXRjaCIsImgiLCJIZWFkZXJzIiwiZXZlbnRFbWl0dGVyIiwiUG91Y2giLCJkZXN0cnVjdExpc3RlbmVycyIsIl9kZXN0cnVjdGlvbkxpc3RlbmVycyIsImRiTGlzdCIsInNldFVwRXZlbnRFbWl0dGVyIiwiYWRkVG9QcmVmZXJyZWRBZGFwdGVycyIsInBsdWdpbiIsIl9fZGVmYXVsdHMiLCJkZWZhdWx0cyIsImRlZmF1bHRPcHRzIiwiUG91Y2hBbHQiLCJ1cmwiLCJnZXRGaWVsZEZyb21Eb2MiLCJwYXJzZWRGaWVsZCIsInBhcnNlRmllbGQiLCJmaWVsZE5hbWUiLCJmaWVsZHMiLCJjb21iaW5hdGlvbkZpZWxkcyIsImlzQ29tYmluYXRpb25hbEZpZWxkIiwiZmllbGQiLCJnZXRLZXkiLCJtZXJnZUFuZGVkU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwiJG9yIiwiJG5vciIsIm1hdGNoZXIiLCIkZXEiLCJsb25nZXN0IiwiZmllbGRNYXRjaGVycyIsIm9wZXJhdG9yIiwiJGd0ZSIsIiRndCIsIm1lcmdlR3RHdGUiLCIkbHRlIiwiJGx0IiwibWVyZ2VMdEx0ZSIsIiRuZSIsIm1lcmdlTmUiLCJtZXJnZUVxIiwiJHJlZ2V4IiwibWVyZ2VSZWdleCIsIm1hc3NhZ2VTZWxlY3RvciIsIndhc0FuZGVkIiwiaXNBbmRJblNlbGVjdG9yIiwiaXNBbmQiLCJtZXJnZUFuZGVkU2VsZWN0b3JzTmVzdGVkIiwib3JPck5vciIsInN1YlNlbGVjdG9yIiwiY29sbGF0ZSIsIm5vcm1hbGl6ZUtleSIsImFpIiwiYmkiLCJzdHJpbmdDb2xsYXRlIiwiYXJyYXlDb2xsYXRlIiwiYWsiLCJiayIsIm9iamVjdENvbGxhdGUiLCJJbmZpbml0eSIsIm9yaWdLZXkiLCJ0b0pTT04iLCJpbmRleGlmeSIsImV4cEZvcm1hdCIsInRvRXhwb25lbnRpYWwiLCJtYWduaXR1ZGUiLCJuZWciLCJtYWdTdHJpbmciLCJwYWRXaXRoIiwidXBUb0xlbmd0aCIsInRhcmdldExlbmd0aCIsInBhZCIsImZhY3RvciIsImZhY3RvclN0ciIsInRvRml4ZWQiLCJudW1Ub0luZGV4YWJsZVN0cmluZyIsInRvSW5kZXhhYmxlU3RyaW5nIiwib2JqS2V5IiwicGFyc2VOdW1iZXIiLCJvcmlnaW5hbElkeCIsIm51bUFzU3RyaW5nIiwibWFnQXNTdHJpbmciLCJmaWx0ZXJJbk1lbW9yeUZpZWxkcyIsInJvd3MiLCJyZXF1ZXN0RGVmIiwiaW5NZW1vcnlGaWVsZHMiLCJyb3dGaWx0ZXIiLCJmaWVsZFNvcnRlciIsImdldEZpZWxkVmFsdWVzQXNBcnJheSIsInNvcnRpbmciLCJhUm93IiwiYlJvdyIsImNvbGxhdGlvbiIsImNyZWF0ZUZpZWxkU29ydGVyIiwiZG9jRmllbGRWYWx1ZSIsInNvbWUiLCJvck1hdGNoZXJzIiwibWF0Y2hDb21pbmF0aW9uYWxTZWxlY3RvciIsIm1hdGNoU2VsZWN0b3IiLCJtYXliZVVzZXJPcGVyYXRvciIsInVzZXJWYWx1ZSIsInN1YlBhcnNlZEZpZWxkIiwic3ViRG9jRmllbGRWYWx1ZSIsInVzZXJPcGVyYXRvciIsIm1hdGNoZXJzIiwiZmllbGRFeGlzdHMiLCJmaWVsZElzTm90VW5kZWZpbmVkIiwiYXJyYXlDb250YWluc1ZhbHVlIiwiZG9jRmllbGRWYWx1ZUl0ZW0iLCJtb2RGaWVsZCIsIm5lVmFsdWUiLCJhcnJheVNpemUiLCJhcnJheUNvbnRhaW5zQWxsVmFsdWVzIiwicmVnZXhWYWx1ZSIsInJlZ2V4TWF0Y2giLCJ0eXBlTWF0Y2giLCJmaWx0ZXJOYW1lIiwiY2hhbmdlc0hhbmRsZXIiLCJkb2NfaWRzIiwidmlld05hbWUiLCJkZG9jIiwibWFwRnVuIiwidmlld3MiLCJyb3dzTWF0Y2hlZCIsIm1hdGNoZXNTZWxlY3RvciIsImZpbHRlckZ1biIsImZpbHRlcnMiLCJ0b09iamVjdCIsInZlcnNpb24iLCJyZXNlcnZlZFdvcmRzIiwiZGF0YVdvcmRzIiwicGFyc2VSZXZpc2lvbkluZm8iLCJwYXJzZURvYyIsIm5ld0VkaXRzIiwiZGJPcHRzIiwiblJldk51bSIsInJldkluZm8iLCJyZXZpc2lvbnMiLCJyZXZpc2lvbklkcyIsIm1ha2VSZXZUcmVlRnJvbVJldmlzaW9ucyIsInNwZWNpYWxLZXkiLCJwcmVwcm9jZXNzU3RyaW5nIiwiYmxvYlR5cGUiLCJhc0JpbmFyeSIsInBhcnNlQmFzZTY0IiwiZGlnZXN0IiwicHJlcHJvY2Vzc0F0dGFjaG1lbnQiLCJtZDUiLCJwcmVwcm9jZXNzQmxvYiIsInVwZGF0ZURvYyIsInJldkxpbWl0IiwicHJldiIsImRvY0luZm8iLCJ3cml0ZURvYyIsInNwbGl0UmV2IiwidGFyZ2V0UG9zIiwidGFyZ2V0SWQiLCJyZXZFeGlzdHMiLCJwcmV2aW91c1dpbm5pbmdSZXYiLCJwcmV2aW91c2x5RGVsZXRlZCIsImlzUm9vdCIsIm5ld1JldiIsInJldl9tYXAiLCJ3aW5uaW5nUmV2JCQxIiwid2lubmluZ1JldklzRGVsZXRlZCIsImRlbHRhIiwicHJvY2Vzc0RvY3MiLCJkb2NJbmZvcyIsImZldGNoZWREb2NzIiwidHgiLCJvdmVyYWxsQ2FsbGJhY2siLCJpZHNUb0RvY3MiLCJkb2NzRG9uZSIsImRvY3NUb0RvIiwiY2hlY2tBbGxEb2NzRG9uZSIsImN1cnJlbnREb2MiLCJyZXN1bHRzSWR4IiwiZG9jV3JpdHRlbiIsIm5leHREb2MiLCJyb290SXNNaXNzaW5nIiwiaW5zZXJ0RG9jIiwiRE9DX1NUT1JFIiwiTUVUQV9TVE9SRSIsInNhZmVKc29uU3RyaW5naWZ5IiwianNvbiIsImlkYkVycm9yIiwiZW5jb2RlTWV0YWRhdGEiLCJkZWxldGVkT3JMb2NhbCIsImRlY29kZU1ldGFkYXRhIiwic3RvcmVkT2JqZWN0Iiwic2FmZUpzb25QYXJzZSIsImRlY29kZURvYyIsIl9kb2NfaWRfcmV2IiwibGFzdEluZGV4T2YiLCJyZWFkQmxvYkRhdGEiLCJhc0Jsb2IiLCJmZXRjaEF0dGFjaG1lbnRzSWZOZWNlc3NhcnkiLCJ0eG4iLCJhdHRPYmoiLCJvYmplY3RTdG9yZSIsIm9uc3VjY2VzcyIsImZldGNoQXR0YWNobWVudCIsInBvc3RQcm9jZXNzQXR0YWNobWVudHMiLCJhdHROYW1lcyIsImNvbXBhY3RSZXZzIiwicG9zc2libHlPcnBoYW5lZERpZ2VzdHMiLCJzZXFTdG9yZSIsImF0dFN0b3JlIiwiYXR0QW5kU2VxU3RvcmUiLCJJREJLZXlSYW5nZSIsImJvdW5kIiwiZGVsZXRlT3JwaGFuZWRBdHRhY2htZW50cyIsIm9wZW5DdXJzb3IiLCJvbmx5IiwiY3Vyc29yIiwiZGlnZXN0U2VxIiwicHJpbWFyeUtleSIsImNvbnRpbnVlIiwib3BlblRyYW5zYWN0aW9uU2FmZWx5IiwiaWRiIiwic3RvcmVzIiwidHJhbnNhY3Rpb24iLCJpZGJCdWxrRG9jcyIsImRvY1N0b3JlIiwiYnlTZXFTdG9yZSIsImF0dGFjaFN0b3JlIiwiYXR0YWNoQW5kU2VxU3RvcmUiLCJtZXRhU3RvcmUiLCJkb2NJbmZvRXJyb3IiLCJtZXRhRG9jIiwiYWxsRG9jc1Byb2Nlc3NlZCIsImRvY0NvdW50RGVsdGEiLCJwcmVjb25kaXRpb25FcnJvcmVkIiwiX21ldGEiLCJibG9iU3VwcG9ydCIsIm9uQWxsRG9jc1Byb2Nlc3NlZCIsInVwZGF0ZURvY0NvdW50SWZSZWFkeSIsImRvY0NvdW50IiwibmV3UmV2SXNEZWxldGVkIiwiaXNVcGRhdGUiLCJjb2xsZWN0UmVzdWx0cyIsImZpbmlzaERvYyIsImF0dGFjaG1lbnRTYXZlZCIsIm5ld0F0dCIsInNhdmVBdHRhY2htZW50Iiwid3JpdGVBdHRhY2htZW50cyIsImFmdGVyUHV0RG9jIiwicmV2c1RvRGVsZXRlIiwiY29tcGFjdFRyZWUiLCJtZXRhZGF0YVRvU3RvcmUiLCJhZnRlclB1dE1ldGFkYXRhIiwiYXR0c0FkZGVkIiwiYXR0c1RvQWRkIiwib25lcnJvciIsImluc2VydEF0dGFjaG1lbnRNYXBwaW5ncyIsInB1dFJlcSIsIm92ZXJhbGxFcnIiLCJkb2N2IiwicmVjdiIsInByb2Nlc3NlZEF0dGFjaG1lbnQiLCJwcmVwcm9jZXNzQXR0YWNobWVudHMiLCJ0eG5SZXN1bHQiLCJvbmFib3J0Iiwib250aW1lb3V0Iiwib25jb21wbGV0ZSIsImZpbmlzaCIsImRpZ2VzdHMiLCJmaWxlbmFtZSIsInZlcmlmeUF0dGFjaG1lbnQiLCJhdHRFcnIiLCJ2ZXJpZnlBdHRhY2htZW50cyIsIm51bUZldGNoZWQiLCJyZXZzX2xpbWl0IiwicmVhZE1ldGFkYXRhIiwiZmV0Y2hFeGlzdGluZ0RvY3MiLCJzdGFydFRyYW5zYWN0aW9uIiwicnVuQmF0Y2hlZEN1cnNvciIsImtleVJhbmdlIiwiYmF0Y2hTaXplIiwib25CYXRjaCIsImtleXNCYXRjaCIsInZhbHVlc0JhdGNoIiwicHNldWRvQ3Vyc29yIiwib25HZXRBbGwiLCJvbkdldEFsbEtleXMiLCJvbkN1cnNvciIsImdldEFsbCIsImdldEFsbEtleXMiLCJuZXdLZXlSYW5nZSIsImxhc3RLZXkiLCJ1cHBlciIsInVwcGVyT3BlbiIsImNvZGUiLCJsb3dlckJvdW5kIiwiaWRiQWxsRG9jcyIsImtleVJhbmdlRXJyb3IiLCJpbmNsdXNpdmVFbmQiLCJpbmNsdXNpdmVfZW5kIiwidXBwZXJCb3VuZCIsImNyZWF0ZUtleVJhbmdlIiwib25SZXN1bHRzUmVhZHkiLCJ1cGRhdGVTZXEiLCJvblN1Y2Nlc3MiLCJkb2NJZFJldkluZGV4IiwiYWxsRG9jc0lubmVyIiwiZmV0Y2hEb2NBc3luY2hyb25vdXNseSIsImJhdGNoVmFsdWVzIiwiYmF0Y2hWYWx1ZSIsImJhdGNoS2V5cyIsInJldHVyblZhbCIsInRvdGFsX3Jvd3MiLCJtYXhLZXkiLCJhbGxEb2NzS2V5cyIsInJ1bm5pbmciLCJhcHBseU5leHQiLCJkb2NJZHMiLCJudW1SZXN1bHRzIiwiZG9jSWRzVG9NZXRhZGF0YSIsIm9uR2V0TWV0YWRhdGEiLCJkb2NJZFJldiIsIm9iamVjdFN0b3JlcyIsIndpbm5pbmdEb2NzIiwibWV0YWRhdGFzIiwiZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEiLCJ3aW5uaW5nRG9jIiwicHJvY2Vzc01ldGFkYXRhQW5kV2lubmluZ0RvYyIsIm9uQmF0Y2hEb25lIiwiZmlsdGVyZWQiLCJibG9iU3VwcG9ydFByb21pc2UiLCJjYWNoZWREQnMiLCJvcGVuUmVxTGlzdCIsIklkYlBvdWNoIiwidHJ5Q29kZSIsImVucXVldWVUYXNrIiwidGhpc0NhbGxiYWNrIiwiaWRiR2xvYmFsRmFpbHVyZUVycm9yIiwiZW5yaWNoQ2FsbGJhY2tFcnJvciIsImFkZERlbGV0ZWRPckxvY2FsSW5kZXgiLCJjcmVhdGVJbmRleCIsInVuaXF1ZSIsIm1pZ3JhdGVMb2NhbFN0b3JlIiwibG9jYWxTdG9yZSIsImxvY2FsIiwicmFuZ2UiLCJzZXFDdXJzb3IiLCJtaWdyYXRlQXR0c0FuZFNlcXMiLCJkaWdlc3RNYXAiLCJtaWdyYXRlTWV0YWRhdGEiLCJvbkdldE1ldGFkYXRhU2VxIiwibWV0YWRhdGFTZXEiLCJmZXRjaE1ldGFkYXRhU2VxIiwiaW5zdGFuY2VJZCIsInJlcU9wdHMiLCJoaXN0b3J5Tm9kZSIsImF0dGFjaElkIiwiYXR0YWNobWVudCIsImJsb2JEYXRhIiwiZG9jX2NvdW50IiwiaWRiX2F0dGFjaG1lbnRfZm9ybWF0Iiwib2xkUmV2Iiwib1N0b3JlIiwib2xkRG9jIiwib3BlblJlcSIsImluZGV4ZWREQiIsImRlbGV0ZURhdGFiYXNlIiwiY2FjaGVkIiwiZ2xvYmFsIiwib3BlbiIsIm9udXBncmFkZW5lZWRlZCIsIm9sZFZlcnNpb24iLCJjcmVhdGVPYmplY3RTdG9yZSIsImtleVBhdGgiLCJhdXRvSW5jcmVtZW50IiwiY3JlYXRlU2NoZW1hIiwiY3VycmVudFRhcmdldCIsImNyZWF0ZUxvY2FsU3RvcmVTY2hlbWEiLCJhZGRBdHRhY2hBbmRTZXFTdG9yZSIsIm1pZ3JhdGlvbnMiLCJtaWdyYXRpb24iLCJvbnZlcnNpb25jaGFuZ2UiLCJzdG9yZWRNZXRhRG9jIiwiY29tcGxldGVTZXR1cCIsInN0b3JlTWV0YURvY0lmUmVhZHkiLCJpbnN0YW5jZUtleSIsImNvdW50RG9jcyIsImJsb2IkJDEiLCJtYXRjaGVkQ2hyb21lIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibWF0Y2hlZEVkZ2UiLCJjaGVja0Jsb2JTdXBwb3J0Iiwic3VwcG9ydHNCdWxrR2V0TWFwIiwicmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIiLCJlbmNvZGVEb2NJZCIsInByZXByb2Nlc3NBdHRhY2htZW50cyQxIiwiZ2V0SG9zdCIsInByb3RvY29sIiwiaGFzVXJsUHJlZml4IiwidXNlciIsInBhc3N3b3JkIiwiYXV0aCIsInVzZXJuYW1lIiwiZ2VuREJVcmwiLCJnZW5VcmwiLCJwYXRoRGVsIiwiaG9zdCIsInBvcnQiLCJwYXJhbXNUb1N0ciIsIkh0dHBQb3VjaCIsImRiVXJsIiwic2V0dXBQcm9taXNlIiwib3VyRmV0Y2giLCJoZWFkZXJzIiwiY3JlZGVudGlhbHMiLCJuQXV0aCIsInRva2VuIiwidWEiLCJpc0lFIiwiaXNUcmlkZW50IiwiaXNFZGdlIiwiaXNHRVQiLCJzaG91bGRDYWNoZUJ1c3QiLCJub3ciLCJhZGFwdGVyRnVuJCQxIiwic2V0dXAiLCJmZXRjaEpTT04iLCJ2Iiwic2tpcF9zZXR1cCIsImVuY29kZUF0dGFjaG1lbnRJZCIsInV1aWQkJDEiLCJwaW5nIiwiY29tcGFjdF9ydW5uaW5nIiwiaW50ZXJ2YWwiLCJkb0J1bGtHZXQiLCJkb0J1bGtHZXRTaGltIiwibnVtQmF0Y2hlcyIsIm9uUmVzdWx0IiwiYmF0Y2hOdW0iLCJzdWJPcHRzIiwic3VwcG9ydHNCdWxrR2V0IiwiZmV0Y2hBdHRhY2htZW50cyIsImZpbGVuYW1lcyIsInByb21pc2VGYWN0b3JpZXMiLCJkb05leHQiLCJydW5OZXh0QmF0Y2giLCJvbkVycm9yIiwidGhpc0VyciIsInBvb2wiLCJ0eXBlRmllbGREZXNjcmlwdG9yIiwiX19wcm90b19fIiwiZmV0Y2hEYXRhIiwiZG9jT3JEb2NzIiwiY29udGVudFR5cGUiLCJwcm9jZXNzIiwiYnJvd3NlciIsInBhcmFtU3RyIiwiYmF0Y2hfc2l6ZSIsImhlYXJ0YmVhdCIsInJlcXVlc3RUaW1lb3V0IiwibGVmdFRvRmV0Y2giLCJmZWVkIiwic2VxX2ludGVydmFsIiwicGFyYW1fbmFtZSIsImxhc3RGZXRjaGVkU2VxIiwiY29udHJvbGxlciIsImFib3J0ZWQiLCJmZXRjaE9wdHMiLCJzaWduYWwiLCJmZXRjaGVkIiwicmF3X3Jlc3VsdHNfbGVuZ3RoIiwiZmluaXNoZWQiLCJRdWVyeVBhcnNlRXJyb3IiLCJjYXB0dXJlU3RhY2tUcmFjZSIsIk5vdEZvdW5kRXJyb3IiLCJCdWlsdEluRXJyb3IiLCJwcm9taXNlZENhbGxiYWNrIiwic2VxdWVudGlhbGl6ZSIsInByb21pc2VGYWN0b3J5IiwidW5pcSIsInRoZVNldCIsIm1hcFRvS2V5c0FycmF5IiwiY3JlYXRlQnVpbHRJbkVycm9yIiwic3VtIiwiakxlbiIsImpOdW0iLCJldmFsRnVuY3Rpb25XaXRoRXZhbCIsIlRhc2tRdWV1ZSQxIiwiY3JlYXRlVmlldyIsInNvdXJjZURCIiwicmVkdWNlRnVuIiwidGVtcG9yYXJ5IiwibG9jYWxEb2NOYW1lIiwiY2FjaGVkVmlld3MiLCJ2aWV3U2lnbmF0dXJlIiwiY3JlYXRlVmlld1NpZ25hdHVyZSIsIl9jYWNoZWRWaWV3cyIsInByb21pc2VGb3JWaWV3IiwiZGVwRGJOYW1lIiwiZnVsbFZpZXdOYW1lIiwiZGVwRGJzIiwibGFzdFNlcURvYyIsInBlcnNpc3RlbnRRdWV1ZXMiLCJ0ZW1wVmlld1F1ZXVlIiwicGFyc2VWaWV3TmFtZSIsImVtaXRFcnJvciIsImJ1aWx0SW5SZWR1Y2UiLCJzdW1zcXIiLCJfc3Vtc3FyIiwiYWJzdHJhY3QiLCJtYXBwZXIiLCJyZWR1Y2VyIiwiZGRvY1ZhbGlkYXRvciIsInRyeU1hcCIsInRyeVJlZHVjZSIsInJlcmVkdWNlIiwib3V0cHV0Iiwic29ydEJ5S2V5VGhlblZhbHVlIiwia2V5Q29tcGFyZSIsInNsaWNlUmVzdWx0cyIsInJvd1RvRG9jSWQiLCJwb3N0cHJvY2Vzc0F0dGFjaG1lbnRzIiwiYWRkSHR0cFBhcmFtIiwicGFyYW1OYW1lIiwiYXNKc29uIiwiY29lcmNlSW50ZWdlciIsImludGVnZXJDYW5kaWRhdGUiLCJhc051bWJlciIsImNoZWNrUXVlcnlQYXJzZUVycm9yIiwic3RhcnRrZXlOYW1lIiwiZW5ka2V5TmFtZSIsImdyb3VwX2xldmVsIiwib3B0aW9uTmFtZSIsIm51bWJlciIsImNoZWNrUG9zaXRpdmVJbnRlZ2VyIiwiZGVmYXVsdHNUbyIsImdldERvY3NUb1BlcnNpc3QiLCJkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyIsIm1ldGFEb2NJZCIsImRlZmF1bHRNZXRhRG9jIiwiZG9jRGF0YSIsImluZGV4YWJsZUtleXNUb0tleVZhbHVlcyIsImlzR2VuT25lIiwiZ2V0S2V5VmFsdWVEb2NzIiwia3ZEb2NzUmVzIiwia3ZEb2NzIiwib2xkS2V5cyIsImtleVZhbHVlIiwibmV3S2V5cyIsImt2RG9jIiwicHJvY2Vzc0tleVZhbHVlRG9jcyIsImdldFF1ZXVlIiwidXBkYXRlVmlldyIsIm1hcFJlc3VsdHMiLCJjdXJyZW50U2VxIiwibGlzdE9mRG9jc1RvUGVyc2lzdCIsImRvY3NUb1BlcnNpc3QiLCJzYXZlS2V5VmFsdWVzIiwiaW5kZXhlZF9kb2NzIiwicHJvZ3Jlc3MiLCJwcm9jZXNzTmV4dEJhdGNoIiwiY2hhbmdlc19iYXRjaF9zaXplIiwiY3JlYXRlSW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzIiwiY3JlYXRlRG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMiLCJyZXN1bHRzX2NvdW50IiwiZW1pdHRlZEtleVZhbHVlIiwiY29tcGxleEtleSIsInVwZGF0ZVZpZXdJblF1ZXVlIiwicXVlcnlWaWV3IiwidG90YWxSb3dzIiwic2hvdWxkUmVkdWNlIiwiZmV0Y2hGcm9tVmlldyIsInZpZXdPcHRzIiwiZXhwZWN0ZWRLZXlzIiwicGFyc2VkS2V5QW5kRG9jSWQiLCJwYXJzZWRTdHIiLCJwYXJzZUluZGV4YWJsZVN0cmluZyIsIm9uTWFwUmVzdWx0c1JlYWR5IiwiZmluYWxSZXN1bHRzIiwic2hvdWxkR3JvdXAiLCJsdmwiLCJQT1NJVElWRV9JTkZJTklUWSIsImxhc3QiLCJncm91cEtleSIsInJlZHVjZVRyeSIsInJlZHVjZVZpZXciLCJhbGxEb2NzUmVzIiwiZG9jSWRzVG9Eb2NzIiwiZmV0Y2hQcm9taXNlcyIsImtleVN0YXJ0Iiwia2V5RW5kIiwicXVlcnlWaWV3SW5RdWV1ZSIsInF1ZXJ5UHJvbWlzZWQiLCJfcXVlcnkiLCJjdXN0b21RdWVyeSIsImtleXNBc1N0cmluZyIsImh0dHBRdWVyeSIsInVwZGF0ZVZpZXdPcHRzIiwidmlld191cGRhdGVfY2hhbmdlc19iYXRjaF9zaXplIiwiZmluYWxQcm9taXNlRmFjdG9yeSIsImRlc2lnbkRvY05hbWUiLCJzdGFsZSIsImNvZXJjZU9wdGlvbnMiLCJ2aWV3Q2xlYW51cCIsIl92aWV3Q2xlYW51cCIsImN1c3RvbVZpZXdDbGVhbnVwIiwiaHR0cFZpZXdDbGVhbnVwIiwiZG9jc1RvVmlld3MiLCJ2aWV3c1RvU3RhdHVzIiwiZGRvY05hbWUiLCJ2aWV3REJOYW1lcyIsInN0YXR1c0lzR29vZCIsInZpZXdEQk5hbWUiLCJkZXN0cm95UHJvbWlzZXMiLCJsb2NhbFZpZXdDbGVhbnVwIiwiY3JlYXRlQWJzdHJhY3RNYXBSZWR1Y2UiLCJvcmlnTWFwIiwicmVkdWNlRnVuU3RyaW5nIiwiYnVpbHRJbiIsImdldEJ1aWx0SW4iLCJtYXByZWR1Y2UiLCJpc0dlbk9uZSQxIiwiZ2V0RG9jQXR0YWNobWVudHMiLCJnZXREb2NzIiwic3JjIiwiZGlmZnMiLCJyZXN1bHREb2NzIiwiZmV0Y2hSZXZpc2lvbk9uZURvY3MiLCJoYXNDb25mbGljdHMiLCJidWxrR2V0T3B0cyIsIm1pc3NpbmdSZXYiLCJjcmVhdGVCdWxrR2V0T3B0cyIsImJ1bGtHZXRSZXNwb25zZSIsImJ1bGtHZXRJbmZvIiwicmVtb3RlRG9jIiwiZG9DaGVja0ZvckxvY2FsQXR0YWNobWVudHMiLCJmaWxlSGFzQ2hhbmdlZCIsImdldERvY0F0dGFjaG1lbnRzRnJvbVRhcmdldE9yU291cmNlIiwidXBkYXRlQ2hlY2twb2ludCIsImNoZWNrcG9pbnQiLCJzZXNzaW9uIiwicmV0dXJuVmFsdWUiLCJzZXNzaW9uX2lkIiwicmVwbGljYXRvciIsIkNoZWNrcG9pbnRlciIsIndyaXRlQ2hlY2twb2ludCIsInVwZGF0ZVRhcmdldCIsInVwZGF0ZVNvdXJjZSIsIndyaXRlVGFyZ2V0Q2hlY2twb2ludCIsIndyaXRlU291cmNlQ2hlY2twb2ludCIsImlzRm9yYmlkZGVuRXJyb3IiLCJjb21wYXJpc29ucyIsInRhcmdldERvYyIsInNvdXJjZURvYyIsInNyY0RvYyIsInRndERvYyIsImNvbXBhcmVSZXBsaWNhdGlvbkhpc3RvcnkiLCJzb3VyY2VIaXN0b3J5IiwidGFyZ2V0SGlzdG9yeSIsIlMiLCJzb3VyY2VSZXN0IiwiVCIsInRhcmdldFJlc3QiLCJoYXNTZXNzaW9uSWQiLCJjb21wYXJlUmVwbGljYXRpb25Mb2dzIiwic2Vzc2lvbklkIiwicHJvcHMiLCJyZXN0IiwiZmxvb3IiLCJnZXRDaGVja3BvaW50IiwiZ2VuZXJhdGVSZXBsaWNhdGlvbklkIiwicXVlcnlQYXJhbXMiLCJmaWx0ZXJWaWV3TmFtZSIsInNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkiLCJxdWVyeURhdGEiLCJtZDVzdW0iLCJyZXBsaWNhdGUiLCJjdXJyZW50QmF0Y2giLCJyZXBJZCIsImNoZWNrcG9pbnRlciIsImJhdGNoZXMiLCJwZW5kaW5nQmF0Y2giLCJ3cml0aW5nQ2hlY2twb2ludCIsImNoYW5nZXNDb21wbGV0ZWQiLCJyZXBsaWNhdGlvbkNvbXBsZXRlZCIsImJhdGNoZXNfbGltaXQiLCJjaGFuZ2VzUGVuZGluZyIsImNoYW5nZWREb2NzIiwic3RhcnRfdGltZSIsImRvY3NfcmVhZCIsImRvY3Nfd3JpdHRlbiIsImRvY193cml0ZV9mYWlsdXJlcyIsImVycm9ycyIsImluaXRDaGVja3BvaW50ZXIiLCJjaGVja3BvaW50T3B0cyIsIndyaXRlRG9jcyIsImJ1bGtPcHRzIiwiY29tcGxldGVSZXBsaWNhdGlvbiIsImVycm9yc0J5SWQiLCJlcnJvcnNObyIsImVycm9yTmFtZSIsImZpbmlzaEJhdGNoIiwib3V0UmVzdWx0IiwiZ2V0Q2hhbmdlcyIsIm9uQ2hlY2twb2ludEVycm9yIiwiZ2V0QmF0Y2hEb2NzIiwiZ290Iiwic3RhcnROZXh0QmF0Y2giLCJhYm9ydFJlcGxpY2F0aW9uIiwicHJvY2Vzc1BlbmRpbmdCYXRjaCIsImltbWVkaWF0ZSQkMSIsImZhdGFsRXJyb3IiLCJlbmRfdGltZSIsInJldHJ5IiwiYmFja19vZmZfZnVuY3Rpb24iLCJiYWNrT2ZmU2V0IiwiY3VycmVudF9iYWNrX29mZiIsImJhY2tPZmYiLCJvbkNoYW5nZXNDb21wbGV0ZSIsIm9uQ2hhbmdlc0Vycm9yIiwiX2Fib3J0Q2hhbmdlcyIsImFib3J0Q2hhbmdlcyIsInN0YXJ0Q2hhbmdlcyIsIl9hZGRlZExpc3RlbmVycyIsIlJlcGxpY2F0aW9uIiwidG9Qb3VjaCIsIlBvdWNoQ29uc3RydWN0b3IiLCJyZXBsaWNhdGVXcmFwcGVyIiwicmVwbGljYXRlUmV0IiwiU3luYyIsImNhbmNlbGVkIiwib3B0c1B1c2giLCJvcHRzUHVsbCIsInB1bGwiLCJwdWxsQ2hhbmdlIiwicHVzaENoYW5nZSIsInB1c2hEZW5pZWQiLCJwdWxsRGVuaWVkIiwicHVzaFBhdXNlZCIsInB1bGxQYXVzZWQiLCJwdXNoQWN0aXZlIiwicHVsbEFjdGl2ZSIsInJlbW92ZWQiLCJyZW1vdmVBbGwiLCJhZGRPbmVMaXN0ZW5lciIsIm91dCIsImNsZWFudXAiLCJfcmVhZHlDYWxsZWQiLCJyZXBsaWNhdGVNZXRob2RzIiwiY2FjaGVkU2V0VGltZW91dCIsImNhY2hlZENsZWFyVGltZW91dCIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImRyYWluUXVldWUiLCJtYXJrZXIiLCJydW5DbGVhclRpbWVvdXQiLCJub29wIiwiZW52IiwiYXJndiIsInZlcnNpb25zIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwiZGlyIiwidW1hc2siLCJfbm9kZUlkIiwiX2Nsb2Nrc2VxIiwiX2xhc3RNU2VjcyIsIl9sYXN0TlNlY3MiLCJjbG9ja3NlcSIsInNlZWRCeXRlcyIsIm1zZWNzIiwibnNlY3MiLCJkdCIsInRsIiwidG1oIiwiZ2VuZXJhdGVVVUlEIiwibmFtZXNwYWNlIiwic3RyaW5nVG9CeXRlcyIsImhhc2hmdW5jIiwiRE5TIiwiVVJMIiwiZ2V0T3V0cHV0TGVuZ3RoIiwiaW5wdXRMZW5ndGg4Iiwic2FmZUFkZCIsImxzdyIsIm1kNWNtbiIsInEiLCJjbnQiLCJtZDVmZiIsIm1kNWdnIiwibWQ1aGgiLCJtZDVpaSIsInYzNSIsImxlbmd0aDMyIiwibWQ1VG9IZXhFbmNvZGVkQXJyYXkiLCJvbGRhIiwib2xkYiIsIm9sZGMiLCJvbGRkIiwid29yZHNUb01kNSIsImxlbmd0aDgiLCJVaW50MzJBcnJheSIsImJ5dGVzVG9Xb3JkcyIsImYiLCJ6IiwiUk9UTCIsIksiLCJIIiwiTiIsIk0iLCJfaSIsInBvdyIsIl9pMiIsIlciLCJfdCIsIl90MiIsImNyZWF0ZVNoaWZ0QXJyIiwic3RlcCIsInNwYWNlIiwiaXgiLCJ2a2JlYXV0aWZ5IiwiaXNTdWJxdWVyeSIsInBhcmVudGhlc2lzTGV2ZWwiLCJzcGxpdF9zcWwiLCJ0YWIiLCJ4bWwiLCJhciIsImluQ29tbWVudCIsImRlZXAiLCJjc3MiLCJzcWwiLCJhcl9ieV9xdW90ZSIsInhtbG1pbiIsInByZXNlcnZlQ29tbWVudHMiLCJqc29ubWluIiwiY3NzbWluIiwic3FsbWluIiwiY29uZmlybSIsInNwbGl0RGlzYWJsZSIsImNhcHR1cmUiLCJjbGlja2F3YXlIYW5kbGVyIiwicmVzZXRIYW5kbGVyIiwibmNJZCIsInF1ZXVlTWljcm90YXNrIiwiTXV0YXRpb24iLCJNdXRhdGlvbk9ic2VydmVyIiwiV2ViS2l0TXV0YXRpb25PYnNlcnZlciIsImhhbmRsZSIsIm9ic2VydmVyIiwiY3JlYXRlVGV4dE5vZGUiLCJvYnNlcnZlIiwiY2hhcmFjdGVyRGF0YSIsIk1lc3NhZ2VDaGFubmVsIiwiY2hhbm5lbCIsInBvcnQxIiwib25tZXNzYWdlIiwicG9ydDIiLCJwb3N0TWVzc2FnZSIsInNjcmlwdEVsIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJkb2N1bWVudEVsZW1lbnQiLCJtZWkiLCJtYW5pZmVzdCIsImxvY2FsTWFuaWZlc3QiLCJtZWlQcm9taXNlIiwibWVpUmVhZGVyIiwicmVhZEFzRGF0YVVSTCIsImJnUHJvbWlzZSIsImJnUmVhZGVyIiwibWVpVXJpIiwiYmdVcmkiLCJzaW5nbGUiLCJhbGVydCIsIm5ld05hbWUiLCJtYW5pZmVzdEJsb2IiLCJtYW5pZmVzdFRleHQiLCJuZXdNYW5pZmVzdEJsb2IiLCJkb2N1bWVudHNDb250YWluZXIiLCJiYWNrZ3JvdW5kQXJlYSIsIm9wZW5CdXR0b24iLCJyZW1vdmVCdXR0b24iLCJuYXZQYXRoQ29udGFpbmVyIiwiYmFja0J1dHRvbiIsImVtcHR5QnV0dG9uIiwiZGVsZXRlQnV0dG9uIiwidXBsb2FkRG9jdW1lbnRzQnV0dG9uIiwibmV3Rm9sZGVyQnV0dG9uIiwic2hpZnRTZWxlY3Rpb24iLCJTaGlmdFNlbGVjdGlvbk1hbmFnZXIiLCJmc20iLCJkYXNoYm9hcmRTdGF0ZSIsIm1haW5TZWN0aW9uIiwiY29udGV4dE1lbnUiLCJjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyIiwibWV0YUtleUlzUHJlc3NlZCIsInNoaWZ0S2V5SXNQcmVzc2VkIiwiY3VycmVudERyYWdUYXJnZXQiLCJyaWdodENsaWNrZWQiLCJvcGVuVXBsb2FkQXJlYUhhbmRsZXIiLCJJbml0VXBsb2FkQXJlYSIsImdldFBhcmVudEZvbGRlciIsIm9wZW5FZGl0b3JUYWIiLCJpc1NhbXBsZSIsInN0b3JhZ2UiLCJlbnRyeSIsImdldEVudHJpZXMiLCJzZXRTZWxlY3Rpb24iLCJ1bnNlbGVjdEFsbCIsInRpbGUiLCJyZXNldFNlbGVjdGlvbiIsImFkZFRpbGVFdmVudExpc3RlbmVyIiwidXBkYXRlRGFzaGJvYXJkIiwiZ2V0Rm9sZGVyUGF0aCIsIm9wZW5Eb2NzSGFuZGxlciIsIl9lIiwic2hpZnRTZWxlY3Rpb25IYW5kbGVyIiwiYWRkU2hpZnRTZWxlY3Rpb25MaXN0ZW5lciIsImdldFNlbGVjdGVkRW50cmllcyIsInNob3dDb250ZXh0TWVudSIsImNsaWNrZWRFbGVtZW50IiwiY2xpY2tlZEVudHJ5IiwiZ2V0RW50cnlCeUlkIiwiZ2V0SW5kZXhCeUVudHJ5TmFtZSIsImFkZFNwZWNpZmljQ29udGV4dE1lbnVMaXN0ZW5lcnMiLCJnZXRTZWxlY3Rpb24iLCJzZXRTdGFydCIsImdldFByZXZTZWxlY3Rpb24iLCJzZXRFbmQiLCJ1cGRhdGVBY3Rpb25CYXJCdXR0b25zIiwidXBkYXRlRlNCdXR0b25zIiwiZ2V0U2VsZWN0ZWRGb2xkZXJzIiwiZ2V0U2VsZWN0ZWRUcmFzaCIsImdldFNlbGVjdGVkRmlsZXMiLCJkb2N1bWVudFR5cGUiLCJvcGVuRmlsZSIsInJlbW92ZURvY3NIYW5kbGVyIiwic2VsZWN0ZWRFbnRyaWVzIiwicGFyZW50Rm9sZGVyIiwidHJhc2hGb2xkZXIiLCJnZXRUcmFzaEZvbGRlciIsImRhdGV0aW1lIiwidG9Mb2NhbGVTdHJpbmciLCJhZGRNZXRhZGF0YSIsInJlbW92ZWRfb24iLCJyZWNvdmVyX2ZvbGRlciIsImdldEZvbGRlclBhdGhOYW1lcyIsIm1vdmVUb0ZvbGRlciIsImRlbGV0ZUZpbGVFbnRyeSIsImZpbGUiLCJkZWxldGVEb2N1bWVudCIsInJlbW92ZUVudHJ5IiwiZGVsZXRlRm9sZGVyRW50cnkiLCJmb2xkZXIiLCJkZWxldGVQcm9taXNlcyIsImRlbGV0ZURvY3NIYW5kbGVyIiwiYWxsRW50cmllcyIsImFsZXJ0TWVzc2FnZSIsImVudHJ5QXJyYXkiLCJkZWJ1ZyIsImVtcHR5VHJhc2hIYW5kbGVyIiwiaXNJblRyYXNoIiwiYnV0dG9uQ2xvbmUiLCJjbG9uZU5vZGUiLCJyZXBsYWNlQ2hpbGQiLCJoYW5kbGVOYXZpZ2F0ZUJhY2siLCJhZGREcm9wVGFyZ2V0TGlzdGVuZXJzIiwidXBkYXRlQmFja0J1dHRvbiIsInVwZGF0ZUVtcHR5QnV0dG9uIiwidXBkYXRlRGVsZXRlQnV0dG9uIiwibmV3UGF0aCIsInNldEZvbGRlclBhdGgiLCJjdXJyZW50Rm9sZGVyIiwic2V0RW50cmllcyIsImljb24iLCJjcmVhdGVUaWxlIiwibmF2RWxlbWVudHMiLCJuYXZTZWN0aW9uIiwidGFyZ2V0UGF0aCIsIm5hdkVsZW1lbnQiLCJzZXBlcmF0b3IiLCJ1cGRhdGVOYXZQYXRoIiwiaW5mb0JhZGdlIiwiZGF0YVRyYW5zZmVyIiwiZWZmZWN0QWxsb3dlZCIsInNldEZpbGVTeXN0ZW0iLCJkZXN0aW5hdGlvbkZvbGRlciIsImRyYWdFbnRyeSIsImNyZWF0ZUhhbmRsZURyb3AiLCJuZXdGb2xkZXIiLCJlcnJvck1lc3NhZ2VzIiwidHJhc2hGTkNvbmZsaWN0SGFuZGxlciIsImNhbk1vdmVFbnRyeSIsInN1Y2NlZWRlZCIsIm1vdmVFbnRyeSIsIm9wZW5Nb3ZlVG9XaW5kb3ciLCJyb290VHJlZSIsIm1vdmVUb0NhbGxiYWNrIiwiZ2VuZXJhdGVGb2xkZXJUcmVlIiwiZGVncmVlIiwibGlDb250YWluZXIiLCJmb2xkZXJOYW1lIiwidWwiLCJhcnJvdyIsImZvbGRlclRyZWUiLCJnZW5lcmF0ZVJvb3RUcmVlIiwibmV3UGFyZW50Rm9sZGVyIiwidHJlZUNvbnRhaW5lciIsIm1vZGFsQ29udGFpbmVyIiwib3Blbk5ld0ZvbGRlcldpbmRvdyIsImlucHV0Q29udGFpbmVyIiwiY2FuY2VsQnV0dG9uIiwicGxhY2Vob2xkZXIiLCJjb25maXJtTmV3Rm9sZGVyQWN0aW9uIiwibmFtZUV4aXN0cyIsIm5ld0ZvbGRlclRpbGUiLCJjcmVhdGVGb2xkZXIiLCJhZGRFbnRyeSIsImhhbmRsZUFkZEZvbGRlciIsIm9wZW5SZW5hbWVXaW5kb3ciLCJwcmV2TmFtZSIsImNvbmZpcm1SZW5hbWVBY3Rpb24iLCJyZW5hbWVFbnRyeSIsInVwZGF0ZURvY05hbWUiLCJudW1iZXJPZlNlbGVjdGVkRmlsZXMiLCJudW1iZXJPZlNlbGVjdGVkRm9sZGVycyIsInNlbGVjdGVkVHJhc2giLCJjb250ZXh0TWVudUNvbnRlbnQiLCJ0cmFzaEVudHJ5T3B0aW9ucyIsInNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycyIsIm11bHRpRmlsZU9wdGlvbnMiLCJmb2xkZXJBbmRGaWxlT3B0aW9ucyIsIm11bHRpRm9sZGVyT3B0aW9ucyIsInNpbmdsZUZvbGRlck9wdGlvbnMiLCJzaW5nbGVGaWxlT3B0aW9ucyIsInRyYXNoRm9sZGVyT3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwiZGVsZXRlQnRuIiwicmVuYW1lQnRuIiwibW92ZUJ0biIsInVwZGF0ZURvY0J0biIsIm5ld0ZvbGRlckJ0biIsInRvcCIsImJ0bkNsYXNzbmFtZSIsImZvbGRlclBhdGhOYW1lcyIsInRhcmdldEZvbGRlciIsImdldEZvbGRlclBhdGhCeU5hbWVzIiwicmVtb3ZlTWV0YWRhdGEiLCJkYXRlVGltZVBhdHRlcm4iLCJwdXRCYWNrRG9jc0hhbmRsZXIiLCJ1cGRhdGVUcmFzaCIsIm5ld1RyYXNoIiwiY3VycmVudERhdGUiLCJ0aGlydHlEYXlzQWdvIiwiZ2V0VGltZSIsInRvRGVsZXRlIiwic2hpZnRLZXkiLCJsb2FkRGFzaGJvYXJkIiwiZ2V0Um9vdCIsImNyZWF0ZUVudHJ5IiwiRmlsZSIsImNhbkFkZEVudHJ5IiwiaXNJbW11dGFibGUiLCJyZXR1cm5PYmoiLCJjYW5SZW1vdmVFbnRyeSIsImV4aXN0c0luUGFyZW50IiwiZmluZEluZGV4IiwiaXNJbW11dGFibGVQYXJlbnQiLCJpc0ltbXV0YWJsZUVudHJ5IiwibmV3UGFyZW50IiwiaXNTYW1lIiwiaXNJbW11dGFibGVOZXdQYXJlbnQiLCJuZXdQYXJlbnRJc0NoaWxkT2ZFbnRyeSIsIkZvbGRlciIsImlzQ2hpbGRPZiIsImNhblJlbmFtZUVudHJ5IiwibG9jYWxlQ29tcGFyZSIsImNyZWF0ZVRyYXNoIiwiVHJhc2giLCJjcmVhdGVGaWxlIiwibW92ZVJlc3BvbnNlIiwiZ2V0QWxsTmFtZXMiLCJnZXRGaWxlU3lzdGVtIiwiZnMiLCJzYW1wbGVFbnRyaWVzIiwic2FtcGxlcyIsImltbXV0YWJsZSIsInNhbXBsZXNGb2xkZXIiLCJzYW1wbGUiLCJsb2FkU2FtcGxlcyIsInVwbG9hZHMiLCJmZXRjaFVwbG9hZHMiLCJ1cGxvYWQiLCJsb2FkUHJldmlvdXNVcGxvYWRzIiwicHJldlNlbGVjdGlvbiIsIm9yZGVyZWRTZWxlY3Rpb24iLCJzcGVjaWZpY1NlbGVjdGlvbiIsIm9yZGVyZWRFbnRyaWVzIiwiZm9sZGVyUGF0aCIsIl9yb290Iiwicm9vdEZvbGRlciIsImJvb2wiLCJmb2xkZXJOYW1lcyIsInBhaXJCdXR0b24iLCJ1cGxvYWRCdXR0b24iLCJoYW5kbGVNYWtlUGFpciIsInNwaW5uZXIiLCJoYW5kbGVVcGxvYWRBbGxEb2N1bWVudHMiLCJzdWNjZXNzZnVsRmlsZXMiLCJoYW5kbGVVcGxvYWRVcGRhdGUiLCJmaWxlU2VsZWN0b3IiLCJtdWx0aXBsZSIsImZpbGVMaXN0IiwiZmlsZXMiLCJyZWplY3RGaWxlcyIsImFkZE5ld0ZpbGVzIiwidXBsb2FkX2FyZWEiLCJvbmRyYWdsZWF2ZSIsIm9uZHJhZ292ZXIiLCJkcm9wRWZmZWN0Iiwib25kcm9wIiwic29ydEJ5TmFtZUJ0biIsInNvcnRGaWxlQnlOYW1lIiwiZm0iLCJnZXRJbnN0YW5jZSIsImNyZWF0ZVVucGFpcmVkSXRlbSIsInJhZGlvTmFtZSIsInJhZGlvIiwibGFiZWwiLCJmb3JtYXRGaWxlbmFtZSIsImRlbEJ0biIsIm1heExlbiIsImNodW5rTGVuIiwiZm5Db25mbGljdEhhbmRsZXIiLCJleGlzdGluZ05hbWVzIiwibmV3RmlsZW5hbWUiLCJjb3VudGVyIiwiaW5jbHVkZXMiLCJzZXRNZWlUZW1wbGF0ZSIsIm1laV9jb250YWluZXIiLCJpbWFnZV9jb250YWluZXIiLCJleHQiLCJ1bnBhaXJlZEl0ZW0iLCJhZGRGaWxlIiwicGFpcmVkX2NvbnRhaW5lciIsInNlbGVjdGVkTWVpRWxlbWVudCIsInNlbGVjdGVkSW1hZ2VFbGVtZW50IiwibWVpX2ZpbGVuYW1lIiwiaW1hZ2VfZmlsZW5hbWUiLCJpc0NyZWF0ZWQiLCJmbiIsImdldEltZ0RpbWVuc2lvbiIsImRpbWVuc2lvbnMiLCJzdGFmZlNwYWNlIiwibmV3TWVpRmlsZSIsImNyZWF0ZU1laUZpbGUiLCJwYWlyZWRfZWwiLCJmb2xpbyIsImZvbGlvX2ZpbGVuYW1lIiwiaGFuZGxlVW5wYWlyIiwiaXNDcmVhdGVkRm9saW8iLCJyZW1vdmVGb2xpbyIsIm1laUl0ZW0iLCJpbWFnZUl0ZW0iLCJ1bnBhaXJCdG4iLCJjcmVhdGVQYWlyZWRGb2xpbyIsImFkZEZvbGlvIiwiZ2V0Rm9saW9zIiwiaW1hZ2UiLCJjcmVhdGVNYW5pZmVzdCIsImFkZERvY3VtZW50IiwiZmlsZUVudHJ5IiwiZm9saW9FbnRyeSIsImNyZWF0ZWRfb24iLCJ1cGxvYWRGb2xpbyIsImNsZWFyIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiZmlsZUVsZW1lbnRzIiwiaXNBc2NlbmRpbmciLCJuYW1lQSIsIm5hbWVCIiwiVXBsb2FkRmlsZU1hbmFnZXIiLCJhbGxGaWxlcyIsImZvbGlvcyIsImluc3RhbmNlIiwidXBkYXRlZEVudHJ5IiwiZ2V0RmlsZUNvdW50IiwibmV3RW50cnkiLCJ0ZW1wbGF0ZVBhdGgiLCJtZWlUZW1wbGF0ZSIsIkRPTVBhcnNlciIsInNlcmlhbGl6ZXIiLCJYTUxTZXJpYWxpemVyIiwibWVpRG9jIiwicGFyc2VGcm9tU3RyaW5nIiwic3VyZmFjZSIsInN1cmZhY2VJZCIsInpvbmUiLCJ6b25lSWQiLCJtYXJnaW5SYXRlViIsIm1hcmdpblJhdGVIIiwibWFyZ2luViIsIm1hcmdpbkgiLCJwYiIsInNiIiwibWVpRmlsZUNvbnRlbnQiLCJzZXJpYWxpemVUb1N0cmluZyIsIm1laUJsb2IiLCJpbWdGaWxlIiwiZ2V0RmlsZSIsIm9ubG9hZCIsImltZyIsIkltYWdlIiwiY2FudmFzIiwiZ2V0Q29udGV4dCIsIndpbGxSZWFkRnJlcXVlbnRseSIsImRyYXdJbWFnZSIsImltYWdlRGF0YSIsImdldEltYWdlRGF0YSIsImJpbmFyeVZhbHVlIiwicHV0SW1hZ2VEYXRhIiwid2hpdGVSdW5MZW5ndGhzIiwiY3VyclNwYWNlQ291bnQiLCJmaW5kU2Vjb25kTW9kZSIsImNvdW50TWFwIiwibmV3Rm9saW8iXSwibWFwcGluZ3MiOiJhQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQUtmRixFQUFvQlEsRUFBSUYsRUFHeEJOLEVBQW9CUyxFQUFJVixFQUd4QkMsRUFBb0JVLEVBQUksU0FBU1IsRUFBU1MsRUFBTUMsR0FDM0NaLEVBQW9CYSxFQUFFWCxFQUFTUyxJQUNsQ0csT0FBT0MsZUFBZWIsRUFBU1MsRUFBTSxDQUFFSyxZ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Qi83QixTQUFVMWtELEVBQ1YyN0UsYUFBYzdSLEVBQ2Q4UixlQUFnQm9CLEVBQ2hCbkIsVUFBV0EsR0FFYmw1RSxLQUFLbzdFLE9BQU9oNUUsS0FBSzA3RSxHQU9aLGVBQWUvN0IsR0FDcEIsTUFBTTIzQixFQUFRMTVFLEtBQUtvN0UsT0FBTzVoRSxLQUFNa2dFLEdBQVVBLEVBQU0zM0IsV0FBYUEsR0FDN0QsUUFBTzIzQixHQUFRQSxFQUFNUixVQUdoQixZQUFZbjNCLEdBQ2pCLE1BQU0zeUIsRUFBTXB2QixLQUFLbzdFLE9BQU9ySCxVQUFXMkYsR0FBU0EsRUFBTTMzQixXQUFhQSxHQUMvRC9oRCxLQUFLbzdFLE9BQU8zMUMsT0FBT3JXLEVBQUssR0FTbkIsWUFDTCxPQUFPcHZCLEtBQUtvN0UsT0FBTzNwRSxJQUFLaW9FLElBQ3RCLE1BQU0zM0IsRUFBVzIzQixFQUFNMzNCLFNBQ2pCaTNCLEVBQWVVLEVBQU1WLGFBQ3JCQyxFQUFpQlMsRUFBTVQsZUFDN0IsTUFBTyxDQUFDbDNCLEVBQVUvaEQsS0FBSzg4RSxRQUFROUQsR0FBZWg1RSxLQUFLODhFLFFBQVE3RCxNQWV4RCxRQUNMajVFLEtBQUttN0UsU0FBU1AsUUFDZDU2RSxLQUFLbzdFLE9BQU8zMUMsT0FBTyxHQUdkLFFBQ0w5aUMsUUFBUXF1QixJQUFJaHhCLEtBQUttN0UsVUFDakJ4NEUsUUFBUXF1QixJQUFJaHhCLEtBQUtvN0UsU0FLckIsVUFBZUYsRyx3UENqU0YsRUFBQWpKLGVBQ1QseWNBVVMsRUFBQUYsa0JBQ1QsaTNCQWtCUyxFQUFBSixpQkFDVCxvcEJBY1MsRUFBQUMscUJBQ1Qsc2JBVVMsRUFBQUUsb0JBQ1QsaTNCQWtCUyxFQUFBRCxtQkFDVCw2YkFVUyxFQUFBRyxtQkFDVCxvT0FNUyxFQUFBUCxrQkFDVCIsImZpbGUiOiJkYXNoYm9hcmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gODgpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0eXBlcyA9IFtcbiAgcmVxdWlyZSgnLi9uZXh0VGljaycpLFxuICByZXF1aXJlKCcuL3F1ZXVlTWljcm90YXNrJyksXG4gIHJlcXVpcmUoJy4vbXV0YXRpb24uanMnKSxcbiAgcmVxdWlyZSgnLi9tZXNzYWdlQ2hhbm5lbCcpLFxuICByZXF1aXJlKCcuL3N0YXRlQ2hhbmdlJyksXG4gIHJlcXVpcmUoJy4vdGltZW91dCcpXG5dO1xudmFyIGRyYWluaW5nO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG52YXIgcXVldWUgPSBbXTtcbnZhciBzY2hlZHVsZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRyYWluaW5nID0gZmFsc2U7XG4gIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICBxdWV1ZUluZGV4ID0gLTE7XG4gIH1cbiAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgIG5leHRUaWNrKCk7XG4gIH1cbn1cblxuLy9uYW1lZCBuZXh0VGljayBmb3IgbGVzcyBjb25mdXNpbmcgc3RhY2sgdHJhY2VzXG5mdW5jdGlvbiBuZXh0VGljaygpIHtcbiAgaWYgKGRyYWluaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNjaGVkdWxlZCA9IGZhbHNlO1xuICBkcmFpbmluZyA9IHRydWU7XG4gIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICB3aGlsZSAobGVuKSB7XG4gICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgcXVldWUgPSBbXTtcbiAgICB3aGlsZSAoY3VycmVudFF1ZXVlICYmICsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgIH1cbiAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICB9XG4gIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gIHF1ZXVlSW5kZXggPSAtMTtcbiAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxudmFyIHNjaGVkdWxlRHJhaW47XG52YXIgaSA9IC0xO1xudmFyIGxlbiA9IHR5cGVzLmxlbmd0aDtcbndoaWxlICgrK2kgPCBsZW4pIHtcbiAgaWYgKHR5cGVzW2ldICYmIHR5cGVzW2ldLnRlc3QgJiYgdHlwZXNbaV0udGVzdCgpKSB7XG4gICAgc2NoZWR1bGVEcmFpbiA9IHR5cGVzW2ldLmluc3RhbGwobmV4dFRpY2spO1xuICAgIGJyZWFrO1xuICB9XG59XG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgdGhpcy5mdW4gPSBmdW47XG4gIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZ1biA9IHRoaXMuZnVuO1xuICB2YXIgYXJyYXkgPSB0aGlzLmFycmF5O1xuICBzd2l0Y2ggKGFycmF5Lmxlbmd0aCkge1xuICBjYXNlIDA6XG4gICAgcmV0dXJuIGZ1bigpO1xuICBjYXNlIDE6XG4gICAgcmV0dXJuIGZ1bihhcnJheVswXSk7XG4gIGNhc2UgMjpcbiAgICByZXR1cm4gZnVuKGFycmF5WzBdLCBhcnJheVsxXSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gZnVuKGFycmF5WzBdLCBhcnJheVsxXSwgYXJyYXlbMl0pO1xuICBkZWZhdWx0OlxuICAgIHJldHVybiBmdW4uYXBwbHkobnVsbCwgYXJyYXkpO1xuICB9XG5cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGltbWVkaWF0ZTtcbmZ1bmN0aW9uIGltbWVkaWF0ZSh0YXNrKSB7XG4gIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgfVxuICBxdWV1ZS5wdXNoKG5ldyBJdGVtKHRhc2ssIGFyZ3MpKTtcbiAgaWYgKCFzY2hlZHVsZWQgJiYgIWRyYWluaW5nKSB7XG4gICAgc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBzY2hlZHVsZURyYWluKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHJlY29yZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4vRXJyb3JMb2cnO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSAnLi9yYW5kb20nO1xuXG50eXBlIE5vdGlmaWNhdGlvblR5cGUgPSAnZGVmYXVsdCcgfCAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ3N1Y2Nlc3MnO1xuXG5jb25zdCBub3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25bXSA9IG5ldyBBcnJheSgwKTtcbmxldCBjdXJyZW50TW9kZU1lc3NhZ2U6IE5vdGlmaWNhdGlvbiA9IG51bGw7XG5cbi8qKlxuICogTnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgdG8gZGlzcGxheSBhdCBhIHRpbWUuXG4gKi9cbmNvbnN0IE5VTUJFUl9UT19ESVNQTEFZID0gMztcblxuLyoqXG4gKiBOdW1iZXIgb2Ygbm90aWZpY2F0aW9ucyB0byBkaXNwbGF5IGF0IGEgdGltZS5cbiAqL1xuY29uc3QgVElNRU9VVCA9IDUwMDA7XG5cbmNvbnN0IG5vdGlmaWNhdGlvbkljb246IFJlY29yZDxOb3RpZmljYXRpb25UeXBlLCBzdHJpbmc+ID0ge1xuICBkZWZhdWx0OiAnJyxcbiAgd2FybmluZzogJ+KaoO+4jyAnLFxuICBlcnJvcjogJ/CflLQgJyxcbiAgc3VjY2VzczogJ+KchSAnLFxufTtcblxuLyoqXG4gKiBBIGNsYXNzIHRvIG1hbmFnZSBOZW9uIG5vdGlmaWNhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb24ge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRpc3BsYXllZDogYm9vbGVhbjtcbiAgaWQ6IHN0cmluZztcbiAgaXNNb2RlTWVzc2FnZTogYm9vbGVhbjtcbiAgbG9nSW5mbzogc3RyaW5nO1xuICB0aW1lb3V0SUQ6IG51bWJlcjtcbiAgdHlwZTogTm90aWZpY2F0aW9uVHlwZTtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBub3RpZmljYXRpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gTm90aWZpY2F0aW9uIGNvbnRlbnQuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBOb3RpZmljYXRpb25UeXBlLCBsb2dJbmZvOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbm90aWZpY2F0aW9uSWNvblt0eXBlXSArIG1lc3NhZ2U7XG4gICAgdGhpcy5kaXNwbGF5ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5pc01vZGVNZXNzYWdlID0gbWVzc2FnZS5zZWFyY2goJ01vZGUnKSAhPT0gLTE7XG4gICAgdGhpcy5sb2dJbmZvID0gbG9nSW5mbztcbiAgICB0aGlzLnRpbWVvdXRJRCA9IC0xO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKiogU2V0IHRoZSBJRCBmcm9tIHNldFRpbWVvdXQuICovXG4gIHNldFRpbWVvdXRJZCAoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudGltZW91dElEID0gTWF0aC5tYXgoaWQsIC0xKTtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5IHRoZSBOb3RpZmljYXRpb24uICovXG4gIGRpc3BsYXkgKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgVVVJRCBmb3IgdGhpcyBub3RpZmljYXRpb24uXG4gICAqL1xuICBnZXRJZCAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIHRoZSBub3RpZmljYXRpb25cbiAqIEBwYXJhbSBjdXJyZW50SWQgLSBUaGUgSUQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBiZSBjbGVhcmVkLlxuICovXG5mdW5jdGlvbiBjbGVhck5vdGlmaWNhdGlvbiAoY3VycmVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGN1cnJlbnRJZCkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjdXJyZW50SWQpLnJlbW92ZSgpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBhIG5vdGlmaWNhdGlvbi5cbiAqIEBwYXJhbSBub3RpZmljYXRpb24gLSBOb3RpZmljYXRpb24gdG8gZGlzcGxheS5cbiAqL1xuZnVuY3Rpb24gZGlzcGxheU5vdGlmaWNhdGlvbiAobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgLy8gTm90IHN1cmUgd2hhdCBpdCBkb2VzLCBtYXliZSByZWxhdGVkIHRvIHJvZGFuL25lb25cbiAgaWYgKG5vdGlmaWNhdGlvbi5pc01vZGVNZXNzYWdlKSB7XG4gICAgaWYgKGN1cnJlbnRNb2RlTWVzc2FnZSA9PT0gbnVsbCkge1xuICAgICAgY3VycmVudE1vZGVNZXNzYWdlID0gbm90aWZpY2F0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGN1cnJlbnRNb2RlTWVzc2FnZS50aW1lb3V0SUQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgdG9wIG5vdGlmaWNhdGlvbiBpZiBleGNlZWRzIG1heG1pbXVtXG4gIG5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuICBpZiAobm90aWZpY2F0aW9ucy5sZW5ndGggPiBOVU1CRVJfVE9fRElTUExBWSkge1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gbm90aWZpY2F0aW9ucy5zaGlmdCgpO1xuICAgIGNsZWFyTm90aWZpY2F0aW9uKHRvUmVtb3ZlLmdldElkKCkpO1xuICB9XG4gIGNvbnN0IG5vdGlmaWNhdGlvbkNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uLWNvbnRlbnQnKTtcbiAgY29uc3QgbmV3Tm90aWZpY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5ld05vdGlmaWNhdGlvbi5jbGFzc0xpc3QuYWRkKCduZW9uLW5vdGlmaWNhdGlvbicpO1xuICBuZXdOb3RpZmljYXRpb24uY2xhc3NMaXN0LmFkZChgbmVvbi1ub3RpZmljYXRpb24tJHtub3RpZmljYXRpb24udHlwZX1gKTtcbiAgbmV3Tm90aWZpY2F0aW9uLmlkID0gbm90aWZpY2F0aW9uLmdldElkKCk7XG4gIG5ld05vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSBub3RpZmljYXRpb24ubWVzc2FnZTtcbiAgbm90aWZpY2F0aW9uQ29udGVudC5hcHBlbmQobmV3Tm90aWZpY2F0aW9uKTtcbiAgbm90aWZpY2F0aW9uQ29udGVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIG5vdGlmaWNhdGlvbi5kaXNwbGF5KCk7XG59XG5cbi8qKlxuICogU3RhcnQgZGlzcGxheWluZyBub3RpZmljYXRpb25zLiBDYWxsZWQgYXV0b21hdGljYWxseS5cbiAqL1xuZnVuY3Rpb24gc3RhcnROb3RpZmljYXRpb24gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gIGRpc3BsYXlOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgbm90aWZpY2F0aW9uLnNldFRpbWVvdXRJZChcbiAgICB3aW5kb3cuc2V0VGltZW91dChjbGVhck5vdGlmaWNhdGlvbiwgVElNRU9VVCwgbm90aWZpY2F0aW9uLmdldElkKCkpXG4gICk7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKG5vdGlmaWNhdGlvbi5nZXRJZCgpKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQobm90aWZpY2F0aW9uLnRpbWVvdXRJRCk7XG4gICAgICBjbGVhck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uZ2V0SWQoKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQWRkIGEgbm90aWZpY2F0aW9uIHRvIHRoZSBxdWV1ZS5cbiAqIEBwYXJhbSBub3RpZmljYXRpb24gLSBOb3RpZmljYXRpb24gY29udGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlTm90aWZpY2F0aW9uIChub3RpZmljYXRpb25Db250ZW50OiBzdHJpbmcsIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUgPSAnZGVmYXVsdCcsIGxvZ0luZm86IHN0cmluZyA9IG51bGwpOiB2b2lkIHtcbiAgY29uc3Qgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbihub3RpZmljYXRpb25Db250ZW50LCB0eXBlLCBsb2dJbmZvKTtcblxuICBpZiAobm90aWZpY2F0aW9uLnR5cGUgPT0gJ2Vycm9yJyB8fCBub3RpZmljYXRpb24udHlwZSA9PSAnd2FybmluZycpIHtcbiAgICByZWNvcmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgfVxuXG4gIHN0YXJ0Tm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgcXVldWVOb3RpZmljYXRpb24gfTtcbiIsImltcG9ydCB7IEdyb3VwaW5nVHlwZSwgU2VsZWN0aW9uVHlwZSwgVXNlclR5cGUsIEluc2VydFR5cGUsIEluc2VydFRhYlR5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKlxuICogVGhlIG9uZSBpbnN0YW5jZSBvZiBMb2NhbFNldHRpbmdzIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGFuZFxuICogdXNlZCBieSB0aGUgZWRpdG9yLlxuICogXG4gKiBVc2UgdGhlIGZ1bmN0aW9ucyBgZ2V0U2V0dGluZ3MoKWAgYW5kIGBzZXRTZXR0aW5ncygpYFxuICogdG8gYWNjZXNzIHRoaXMgaW5zdGFuY2UuXG4gKi9cbmxldCBsb2NhbFNldHRpbmdzOiBMb2NhbFNldHRpbmdzID0gbnVsbDtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBzZXR0aW5ncyBmb3IgZWFjaCBmb2xpb1xuICogc3RvcmVkIGluIGxvY2FsU3RvcmFnZS5cbiAqXG4gKiBFdmVyeSBrZXkgaXMgb3B0aW9uYWwgc28gdGhhdCB0aGlzIHNhbWUgdHlwaW5nXG4gKiBjYW4gYmUgdXNlZCBmb3IgYHNldFNldHRpbmdzKClgIC8gYExvY2FsU2V0dGluZ3Muc2V0KClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcbiAgem9vbTogbnVtYmVyO1xuICBnbHlwaE9wYWNpdHk6IG51bWJlcjtcbiAgaW1hZ2VPcGFjaXR5OiBudW1iZXI7XG4gIGNpcmNsZVNpemU6IG51bWJlcjtcbiAgaGlnaGxpZ2h0TW9kZTogR3JvdXBpbmdUeXBlO1xuICB1c2VyTW9kZTogVXNlclR5cGU7XG4gIGluc2VydE1vZGU6IEluc2VydFR5cGU7XG4gIGluc2VydFRhYjogSW5zZXJ0VGFiVHlwZTtcbiAgc2VsZWN0aW9uTW9kZTogU2VsZWN0aW9uVHlwZTtcbiAgZGVidWdNb2RlOiBib29sZWFuO1xuICBkaXNwbGF5QkJveDogYm9vbGVhbjtcbiAgZGlzcGxheVRleHQ6IGJvb2xlYW47XG4gIGRpc3BsYXlJbmZvOiBib29sZWFuO1xuICBkaXNwbGF5RXJyTG9nOiBib29sZWFuO1xuICB2aWV3Qm94OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVmYXVsdCBzZXR0aW5ncywgd2hpY2ggc2hvdWxkIGJlIHNldCBmb3IgYSBmb2xpbyB3aXRoIG5vXG4gKiBsb2NhbFN0b3JhZ2UgdmFsdWUuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgdXBkYXRlZCBhbG9uZ3NpZGUgdGhlIGludGVyZmFjZSBgU2V0dGluZ3NgXG4gKiBhbnkgdGltZSB3ZSB3YW50IHRvIGFkZCBhIG5ldyBzZXR0aW5nIHRvIHN0b3JlIGluIGxvY2FsU3RvcmFnZS5cbiAqL1xuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogU2V0dGluZ3MgPSB7XG4gIHpvb206IDEwMCxcbiAgZ2x5cGhPcGFjaXR5OiAxMDAsXG4gIGltYWdlT3BhY2l0eTogMTAwLFxuICBjaXJjbGVTaXplOiAyNSxcbiAgaGlnaGxpZ2h0TW9kZTogJ25vbmUnLFxuICB1c2VyTW9kZTogJ2VkaXQnLFxuICBpbnNlcnRNb2RlOiAncHVuY3R1bScsXG4gIGluc2VydFRhYjogJ3ByaW1pdGl2ZVRhYicsXG4gIHNlbGVjdGlvbk1vZGU6ICdzZWxCeVN5bGxhYmxlJyxcbiAgZGVidWdNb2RlOiBmYWxzZSxcbiAgZGlzcGxheUJCb3g6IGZhbHNlLFxuICBkaXNwbGF5VGV4dDogZmFsc2UsXG4gIGRpc3BsYXlJbmZvOiBmYWxzZSxcbiAgZGlzcGxheUVyckxvZzogZmFsc2UsXG4gIHZpZXdCb3g6IG51bGxcbn07XG5cbmNsYXNzIExvY2FsU2V0dGluZ3Mge1xuICBpZDogc3RyaW5nO1xuICBzZXR0aW5nczogU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IgKGZvbGlvSWQ6IHN0cmluZykge1xuICAgIGxvY2FsU2V0dGluZ3MgPSB0aGlzO1xuICAgIHRoaXMuaWQgPSBmb2xpb0lkO1xuICAgIHRoaXMubG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgc2V0dGluZ3MgZnJvbSBsb2NhbFN0b3JhZ2UsIGFuZCBzeW5jIGxvYWRlZCBzZXR0aW5ncyB3aXRoXG4gICAqIG5ldyBmaWVsZHMgdGhhdCBtYXkgbm90IGJlIGluIGxvY2FsU3RvcmFnZS5cbiAgICovXG4gIGxvYWQgKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQ6IFBhcnRpYWw8U2V0dGluZ3M+ID0gSlNPTi5wYXJzZSh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5pZCkpO1xuICAgICAgdGhpcy5zeW5jKHN0b3JlZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSB2YWx1ZSBpcyBub3QgYSBKU09OIG9iamVjdCAoZm9yIGluc3RhbmNlLCBhbiBlbXB0eSBzdHJpbmcpLFxuICAgICAgLy8gYSBTeW50YXhFcnJvciB3aWxsIGJlIHRocm93bi4gV2UgbXVzdCBoYW5kbGUgaXQgYnkgY2FsbGluZyBzeW5jKClcbiAgICAgIC8vIHdpdGggYW4gZW1wdHkgSlNPTiBvYmplY3QuXG4gICAgICB0aGlzLnN5bmMoe30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbmV3IGZpZWxkcyBpbiBsb2NhbFN0b3JhZ2UsIGFzIGEgXCJ1bmlvblwiIG9mIG9sZCBhbmQgbmV3IHNldHRpbmdzLlxuICAgKi9cbiAgc2V0IChwYXJhbXM6IFBhcnRpYWw8U2V0dGluZ3M+KTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4udGhpcy5zZXR0aW5ncywgLi4ucGFyYW1zIH07XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuaWQsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2V0dGluZ3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIHNldHRpbmdzIHRoYXQgbWF5IG5vdCBiZSBpbmNsdWRlZCBpbiB1c2VyJ3MgbG9jYWxTdG9yYWdlLFxuICAgKiBzdWNoIGFzIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBsb2NhbFN0b3JhZ2UgaW4gYSBuZXdcbiAgICogdXBkYXRlIG9mIE5lb24uXG4gICAqL1xuICBzeW5jIChzdG9yZWQ6IFBhcnRpYWw8U2V0dGluZ3M+KTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4uREVGQVVMVF9TRVRUSU5HUywgLi4uc3RvcmVkIH07XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuaWQsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2V0dGluZ3MpKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBsb2NhbFN0b3JhZ2Ugc2V0dGluZ3MgZm9yIHRoZSBmb2xpby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNldHRpbmdzICgpOiBTZXR0aW5ncyB7XG4gIHJldHVybiBsb2NhbFNldHRpbmdzLnNldHRpbmdzO1xufVxuXG4vKipcbiAqIFNldCBzcGVjaWZpYyBsb2NhbFN0b3JhZ2Ugc2V0dGluZ3MgZm9yIHRoZSBmb2xpby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNldHRpbmdzIChwYXJhbXM6IFBhcnRpYWw8U2V0dGluZ3M+KTogdm9pZCB7XG4gIGxvY2FsU2V0dGluZ3Muc2V0KHBhcmFtcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvY2FsU2V0dGluZ3M7XG4iLCJpbXBvcnQgKiBhcyBDb2xvciBmcm9tICcuL0NvbG9yJztcbmltcG9ydCB7IHVwZGF0ZUhpZ2hsaWdodCB9IGZyb20gJy4uL0Rpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMnO1xuaW1wb3J0ICogYXMgR3JvdXBpbmcgZnJvbSAnLi4vU3F1YXJlRWRpdC9Hcm91cGluZyc7XG5pbXBvcnQgeyByZXNpemUgfSBmcm9tICcuL1Jlc2l6ZSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBTZWxlY3Rpb25UeXBlIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuL0RyYWdIYW5kbGVyJztcbmltcG9ydCAqIGFzIFNlbGVjdE9wdGlvbnMgZnJvbSAnLi4vU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zJztcbmltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBzZWxlY3Rpb24gbW9kZSBjaG9zZW4gYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25UeXBlKCk6IFNlbGVjdGlvblR5cGUge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsLWJ5IGlzLWFjdGl2ZScpO1xuICBpZiAoZWxlbWVudC5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gZWxlbWVudFswXS5pZCBhcyBTZWxlY3Rpb25UeXBlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogVW5zZWxlY3QgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGFuZCBydW4gdW5kbyBhbnkgZXh0cmFcbiAqIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNlbGVjdCgpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvckFsbCgnLm5vLW1vdmluZycpXG4gICAgLmZvckVhY2goKHNlbGVjdGVkOiBTVkdHRWxlbWVudCkgPT4gc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnbm8tbW92aW5nJykpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKS5mb3JFYWNoKChzZWxlY3RlZDogU1ZHR0VsZW1lbnQpID0+IHtcbiAgICBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgIGlmIChzZWxlY3RlZC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgIHNlbGVjdGVkLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgIENvbG9yLnVuaGlnaGxpZ2h0KHNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgc2VsZWN0ZWQuc3R5bGUuZmlsbCA9ICcnO1xuICAgIH1cblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChcbiAgICAgIChkaXZMaW5lOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBkaXZMaW5lLnN0eWxlLnN0cm9rZSA9ICcnO1xuICAgICAgICBkaXZMaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykpLmZvckVhY2goXG4gICAgICAobmV1bWU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIG5ldW1lLnN0eWxlLmZpbGwgPSAnJztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKSkuZm9yRWFjaChcbiAgICAgIChzeWxSZWN0OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBzeWxSZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJykpIHtcbiAgICAgIHNlbGVjdGVkLnBhcmVudEVsZW1lbnQuc3R5bGUuZmlsbCA9ICcnO1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzeWxsYWJsZScpO1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzeWxsYWJsZS1oaWdobGlnaHRlZCcpO1xuXG4gICAgICBBcnJheS5mcm9tKHNlbGVjdGVkLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChcbiAgICAgICAgKGRpdkxpbmU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgZGl2TGluZS5zdHlsZS5zdHJva2UgPSAnJztcbiAgICAgICAgICBkaXZMaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUnKSkuZm9yRWFjaChcbiAgICAgICAgKG5ldW1lOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgIG5ldW1lLnN0eWxlLmZpbGwgPSAnJztcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZDMuc2VsZWN0QWxsKCcjcmVzaXplUmVjdCcpLnJlbW92ZSgpO1xuICAgIGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcucm90YXRlUG9pbnQnKS5yZW1vdmUoKTtcbiAgfSk7XG5cbiAgQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGV4dC1zZWxlY3QnKSkuZm9yRWFjaChcbiAgICAoZWw6IFNWR0VsZW1lbnQpID0+IHtcbiAgICAgIGVsLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICBlbC5zdHlsZS5mb250V2VpZ2h0ID0gJyc7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCd0ZXh0LXNlbGVjdCcpO1xuICAgIH0sXG4gICk7XG5cbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICBHcm91cGluZy5lbmRHcm91cGluZ1NlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIFNlbGVjdE9wdGlvbnMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICB9XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gIHVwZGF0ZUhpZ2hsaWdodCgpO1xufVxuXG4vKipcbiAqIFNlbGVjdCBhIHN0YWZmIGVsZW1lbnQuXG4gKiBAcGFyYW0gc3RhZmYgLSBUaGUgc3RhZmYgZWxlbWVudCBpbiB0aGUgRE9NLlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gVGhlIGRyYWcgaGFuZGxlciBpbiB1c2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RTdGFmZihcbiAgc3RhZmY6IFNWR0dFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCFzdGFmZi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBzdGFmZi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIENvbG9yLnVuaGlnaGxpZ2h0KHN0YWZmKTtcbiAgICBDb2xvci5oaWdobGlnaHQoc3RhZmYsICcjZDAwJyk7XG4gICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zKCk7XG4gICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbGVjdCBhIGxheWVyIGVsZW1lbnQuXG4gKiBAcGFyYW0gbGF5ZXJFbGVtZW50IC0gVGhlIGxheWVyIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAqIEBwYXJhbSBkcmFnSGFuZGxlciAtIFRoZSBkcmFnIGhhbmRsZXIgaW4gdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0TGF5ZXJFbGVtZW50KFxuICBsYXllckVsZW1lbnQ6IFNWR0dFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCFsYXllckVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgbGF5ZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgQ29sb3IudW5oaWdobGlnaHQobGF5ZXJFbGVtZW50KTtcbiAgICBDb2xvci5oaWdobGlnaHQobGF5ZXJFbGVtZW50LCAnI2QwMCcpO1xuICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmljIHNlbGVjdCBmdW5jdGlvbi5cbiAqIEBwYXJhbSBlbCAtIEVsZW1lbnQgdG8gc2VsZWN0LlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gT25seSB1c2VkIGZvciBzdGF2ZXMuXG4gKiBAcGFyYW0gbmVlZHNIaWdobGlnaHRVcGRhdGUgLSBXaGV0aGVyIGFsbCB0aGUgZ3JvdXAncyBoaWdobGlnaHRzIHNob3VsZCBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoXG4gIGVsOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIGRyYWdIYW5kbGVyPzogRHJhZ0hhbmRsZXIsXG4gIG5lZWRzSGlnaGxpZ2h0VXBkYXRlID0gdHJ1ZSxcbik6IHZvaWQge1xuICAvLyBJZiBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCBleGl0XG4gIGlmICghZWwpIHJldHVybjtcblxuICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFmZicpKSB7XG4gICAgcmV0dXJuIHNlbGVjdFN0YWZmKGVsLCBkcmFnSGFuZGxlcik7XG4gIH1cbiAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbGF5ZXInKSkge1xuICAgIHJldHVybiBzZWxlY3RMYXllckVsZW1lbnQoZWwsIGRyYWdIYW5kbGVyKTtcbiAgfVxuXG4gIGlmIChcbiAgICAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpICYmXG4gICAgIWVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsVGV4dFJlY3QnKSAmJlxuICAgICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bFRleHRSZWN0LWRpc3BsYXknKVxuICApIHtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIC8vIHNldCBmaWxsIHRvIHJlZFxuICAgIC8vIHNldCBzdHJva2UgdG8gcmVkIG9ubHkgaWYgc2VsZWN0ZWQgZWxlbSBpcyBhIGRpdkxpbmVcbiAgICBlbC5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgIGVsLnN0eWxlLnN0cm9rZSA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpID8gJyNkMDAnIDogJ2JsYWNrJztcblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLmxlbmd0aCkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKS5mb3JFYWNoKFxuICAgICAgICAoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBlbGVtLnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZGl2TGluZScpLmxlbmd0aCkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBlbGVtLnN0eWxlLnN0cm9rZSA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZScpLmZvckVhY2goKGVsZW06IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGVsZW0uc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFNldCBjb2xvciBvZiB0aGUgY29ycmVzcG9uZGluZyB0ZXh0IGluIHRoZSB0ZXh0IHBhbmVsIHRvIHJlZFxuICAgIGxldCBzeWxJZDtcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSB7XG4gICAgICBzeWxJZCA9IGVsLmlkO1xuICAgIH0gZWxzZSBpZiAoZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykgIT09IG51bGwpIHtcbiAgICAgIHN5bElkID0gZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykuaWQ7XG4gICAgfVxuICAgIGlmIChzeWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzcGFucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uJyArIHN5bElkKTtcbiAgICAgIHNwYW5zLmZvckVhY2goKHNwYW46IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnI2QwMCc7XG4gICAgICAgIHNwYW4uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LXNlbGVjdCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChuZWVkc0hpZ2hsaWdodFVwZGF0ZSkge1xuICAgIHVwZGF0ZUhpZ2hsaWdodCgpO1xuICB9XG59XG5cbi8qKlxuICogU2VsZWN0IGFuIG5jLlxuICogQHBhcmFtIGVsIC0gVGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdE5jcyhcbiAgZWw6IFNWR0dyYXBoaWNzRWxlbWVudCxcbiAgbmVvblZpZXc6IE5lb25WaWV3LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFlbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQgYXMgdW5rbm93biBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgdW5zZWxlY3QoKTtcbiAgICBzZWxlY3QocGFyZW50KTtcbiAgICBpZiAoYXdhaXQgaXNMaWdhdHVyZShwYXJlbnQsIG5lb25WaWV3KSkge1xuICAgICAgY29uc3QgcHJldk5jID0gcGFyZW50LnByZXZpb3VzU2libGluZyBhcyB1bmtub3duIGFzIFNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICAgIGlmIChhd2FpdCBpc0xpZ2F0dXJlKHByZXZOYywgbmVvblZpZXcpKSB7XG4gICAgICAgIHNlbGVjdChwcmV2TmMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dE5jID0gcGFyZW50Lm5leHRTaWJsaW5nIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICBpZiAoYXdhaXQgaXNMaWdhdHVyZShuZXh0TmMsIG5lb25WaWV3KSkge1xuICAgICAgICAgIHNlbGVjdChuZXh0TmMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3I6IE5laXRoZXIgcHJldiBvciBuZXh0IG5jIGFyZSBsaWdhdHVyZXMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCdsaWdhdHVyZScpO1xuICAgIH0gZWxzZSBpZiAocGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnbmMnKSkge1xuICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTmNBY3Rpb25zKHBhcmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gYWN0aW9uIHRyaWdnZXJlZCEnKTtcbiAgICB9XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBuYyAtIFRoZSBuZXVtZSBjb21wb25lbnQuXG4gKiBAcGFyYW0gbmVvblZpZXcgLSBUaGUgW1tOZW9uVmlld11dIGZvciB0aGlzIGluc3RhbmNlLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbmV1bWUgY29tcG9uZW50IGlzIHBhcnQgb2YgYSBsaWdhdHVyZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzTGlnYXR1cmUoXG4gIG5jOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVzID0gYXdhaXQgbmVvblZpZXcuZ2V0RWxlbWVudEF0dHIoXG4gICAgbmMuaWQsXG4gICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICApO1xuICByZXR1cm4gQm9vbGVhbihhdHRyaWJ1dGVzLmxpZ2F0ZWQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGxpc3Qgb2YgZWxlbWVudHMgb2YgYSBjZXJ0YWluIHR5cGUgYXJlIGxvZ2ljYWxseSBhZGphY2VudCB0byBlYWNoIG90aGVyLlxuICogSW5jbHVkZXMgZWxlbWVudHMgdGhhdCBhcmUgb24gc2VwYXJhdGUgc3RhdmVzIGJ1dCB3b3VsZCBvdGhlcndpc2UgYmUgbmV4dCB0byBlYWNoIG90aGVyLlxuICogQ2FuIG5vdCBhcHBseSB0byBlbGVtZW50cyBvZiB0eXBlIG5ldW1lIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB1c2VyIHNlbGVjdGlvbiBtb2RlXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIG9mIGludGVyZXN0XG4gKiBAcmV0dXJucyB0cnVlIGlmIGVsZW1lbnRzIGFyZSBhZGphY2VudCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVBZGphY2VudChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgLy8gMiBlbGVtZW50cyBjYW5ub3QgYmUgYWRqYWNlbnQgaWYgdGhlcmUgaXMgb25seSAxIGVsZW1lbnRcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcblxuICAvLyBnZXQgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgc2VsZWN0aW9uVHlwZVxuICBsZXQgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGU6IEhUTUxFbGVtZW50W107XG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUgPSBBcnJheS5mcm9tKFxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUnKSxcbiAgICAgICk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgLy8gV2UgYXV0b21hdGljYWxseSByZXR1cm4gJ3RydWUnIGZvciBuZXVtZXMgYmVjYXVzZSB3ZSB3YW50IHRoZSB1c2VyIHRvIGJlXG4gICAgICAvLyBhbGxvd2VkIHRvIGdyb3VwIHR3byBuZXVtZXMgaW4gc2VwYXJhdGUgc3lsbGFiZXMgd2l0aG91dCBoYXZpbmcgdG8gcGFyZm9ybSBvdGhlclxuICAgICAgLy8gc3RlcHMgZmlyc3QuIFllcywgdGhlcmUgaXMgYSB0cmFkZS1vZmYgLSB0aGlzIGFsbG93cyB1c2VycyB0byB0cnkgYW5kIGdyb3VwIGFueVxuICAgICAgLy8gdHdvIG5vbi1hZGphY2VudCBuZXVtZXMsIGJ1dCBpdCB3YXMgZGVjaWRlZCB0aGF0IHRoZSBiZW5lZml0cyAoc3BlZWQgYW5kIGVmZmljaWVuY3kpXG4gICAgICAvLyBvdXR3ZWlnaCB0aGUgY29zdHMgKHVzZXIgdHJ5aW5nIGFuIGlsbGVnYWwgZWRpdCkuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYycpKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gU29ydCBTRUxFQ1RFRCBlbGVtZW50cyBpbiBvcmRlciBvZiBhcHBlYXJhbmNlIGJ5XG4gIC8vIG1hdGNoaW5nIHRvIG9yZGVyIG9mIEFMTCBlbGVtZW50cyBvZiBzZWxlY3Rpb24gdHlwZVxuICBjb25zdCBzb3J0ZWRFbGVtZW50cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlW2ldLmlzU2FtZU5vZGUoZWxlbWVudHNbal0pKSB7XG4gICAgICAgIHNvcnRlZEVsZW1lbnRzLnB1c2goZWxlbWVudHNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyBjaGVjayBpZiBTRUxFQ1RFRCBlbGVtZW50cyBhcmUgYWxsIGFkamFjZW50IChpbiBhIHJvdykgYnlcbiAgLy8gZmluZGluZyBhbmQgY29tcGFyaW5nIHRoZWlyIGluZGVjZXMgaW4gdGhlIGFycmF5IG9mIEFMTCBlbGVtZW50cyBvZiBzZWxlY3Rpb24gdHlwZVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGZpcnN0RWxlbSA9IHNvcnRlZEVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IHNlY29uZEVsZW0gPSBzb3J0ZWRFbGVtZW50c1tpICsgMV07XG5cbiAgICBjb25zdCBpbmRleDEgPSBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZS5pbmRleE9mKGZpcnN0RWxlbSk7XG4gICAgY29uc3QgaW5kZXgyID0gYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUuaW5kZXhPZihzZWNvbmRFbGVtKTtcblxuICAgIGlmIChNYXRoLmFicyhpbmRleDEgLSBpbmRleDIpICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgdGhlIGFycmF5IG9mIGVsZW1lbnRzIGFsbCBzaGFyZSB0aGUgc2FtZSBsb2dpY2FsIHBhcmVudC5cbiAqIEZvciBleGFtcGxlOiBJZiBhbGwgbmV1bWVzIGFyZSBpbiB0aGUgc2FtZSBzeWxsYWJsZS5cbiAqXG4gKiBOb3RlISEgVGhlcmUgaXMgY3VycmVudGx5IG5vIGxvZ2ljIGZvciB0cmVhdGluZyBsYXllciBlbGVtZW50cyBhbmQgYmJveGVzIVxuICogTm90ZSEhIEZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlIGZvciBzdGF2ZSBlbGVtZW50cy4gKFNob3VsZCBpdD8/PylcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB0aGUgY3VycmVudCBOZW9uIHNlbGVjdGlvbiBtb2RlXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIGluIHF1ZXN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBlbGVtZW50cyBzaGFyZSB0aGUgc2FtZSBsb2dpY2FsIHBhcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkTG9naWNhbFBhcmVudChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgZWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgKGVsZW0pID0+XG4gICAgICAhKFxuICAgICAgICBlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpIHx8XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpIHx8XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdjbGVmJylcbiAgICAgICksXG4gICk7XG5cbiAgaWYgKCFlbGVtZW50c0hhdmVDb3JyZWN0VHlwZShzZWxlY3Rpb25UeXBlLCBlbGVtZW50cykpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeVN5bGxhYmxlJzpcbiAgICAgIGNvbnN0IHJlZmVyZW5jZVBhcmVudFN0YWZmID0gZWxlbWVudHNbMF0uY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50c1tpXTtcbiAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmlzU2FtZU5vZGUocmVmZXJlbmNlUGFyZW50U3RhZmYpKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBjb25zdCByZWZlcmVuY2VQYXJlbnRTeWxsYWJsZSA9IGVsZW1lbnRzWzBdLmNsb3Nlc3QoJy5zeWxsYWJsZScpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbGVtID0gZWxlbWVudHNbaV07XG4gICAgICAgIGlmICghZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKS5pc1NhbWVOb2RlKHJlZmVyZW5jZVBhcmVudFN5bGxhYmxlKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjdXJyZW50IHNlbGVjdGlvbiBtb2RlLlxuICogRm9yIGV4YW1wbGUsIGNoZWNrIGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgb2YgdHlwZSBuZXVtZSwgb3Igc3lsbGFibGUsIGV0Yy5cbiAqXG4gKiBOb3RlISEgVGhlcmUgaXMgbm8gbG9naWMgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBsYXllciBlbGVtZW50cyBvciBiYm94ZXMuXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvblR5cGUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG1vZGVcbiAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdGhhdCBhcmUgYmVpbmcgY2hlY2tlZFxuICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgZWxlbWVudHMgbWF0Y2ggc2VsZWN0aW9uIG1vZGUsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVsZW1lbnRzSGF2ZUNvcnJlY3RUeXBlKFxuICBzZWxlY3Rpb25UeXBlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiBTVkdHcmFwaGljc0VsZW1lbnRbXSxcbik6IGJvb2xlYW4ge1xuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICBpZiAoIWVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGlmICghZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeVN0YWZmJzpcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgaWYgKCFlbGVtLmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZWxlbWVudHMgLSBUaGUgZWxlbWVudHMgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgcGFyZW50IHVwIHR3byBsZXZlbHMsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZFNlY29uZExldmVsUGFyZW50KFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdGVtcEVsZW1lbnRzID0gQXJyYXkuZnJvbShlbGVtZW50cyk7XG4gIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRlbXBFbGVtZW50cy5wb3AoKTtcbiAgY29uc3Qgc2Vjb25kUGFyZW50ID0gZmlyc3RFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRlbXBFbGVtZW50cykge1xuICAgIGNvbnN0IHNlY1BhciA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIGlmIChzZWNQYXIuaWQgIT09IHNlY29uZFBhcmVudC5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB1c2VyIHNlbGVjdGVkIGVsZW1lbnRzIGFjY3Jvc3MgbXVsdGlwbGUgc3RhdmVzXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIHVzZXItc2VsZWN0ZWQgZWxlbWVudHNcbiAqIEByZXR1cm5zIHRydWUgaWYgc2VsZWN0aW9uIGlzIGFjY3Jvc3MgbXVsdGlwbGUgc3RhdmVzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlTdGF2ZVNlbGVjdGlvbihlbGVtZW50czogU1ZHRWxlbWVudFtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IGVsZW1lbnRzQXJyYXkgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFmZiA9IGVsZW1lbnRzQXJyYXlbaV0uY2xvc2VzdCgnLnN0YWZmJyk7XG5cbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IGVsZW1lbnRzQXJyYXkubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGFub3RoZXJTdGFmZiA9IGVsZW1lbnRzQXJyYXlbal0uY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgICAvLyBjb21wYXJlIHdpdGggb3RoZXIgc3RhdmVzXG4gICAgICBpZiAoIXN0YWZmLmlzU2FtZU5vZGUoYW5vdGhlclN0YWZmKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEJvdW5kaW5nIGJveCBvYmplY3QgaW50ZXJmYWNlIGZvciBnZXRTdGFmZkJCb3goKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWZmQkJveCB7XG4gIGlkOiBzdHJpbmc7XG4gIHVseDogbnVtYmVyO1xuICB1bHk6IG51bWJlcjtcbiAgbHJ4OiBudW1iZXI7XG4gIGxyeTogbnVtYmVyO1xuICByb3RhdGU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGJvdW5kaW5nIGJveCBvZiBhIHN0YWZmIGJhc2VkIG9uIGl0cyBzdGFmZiBsaW5lcy5cbiAqIFJvdGF0ZSBpcyBpbmNsdWRlZCBpbiByYWRpYW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhZmZCQm94KHN0YWZmOiBTVkdHRWxlbWVudCk6IFN0YWZmQkJveCB7XG4gIGxldCB1bHgsIHVseSwgbHJ4LCBscnksIHJvdGF0ZTtcbiAgc3RhZmYucXVlcnlTZWxlY3RvckFsbCgncGF0aCcpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBjb25zdCBjb29yZGluYXRlczogbnVtYmVyW10gPSBwYXRoXG4gICAgICAuZ2V0QXR0cmlidXRlKCdkJylcbiAgICAgIC5tYXRjaCgvXFxkKy9nKVxuICAgICAgLm1hcCgoZWxlbWVudCkgPT4gTnVtYmVyKGVsZW1lbnQpKTtcbiAgICBpZiAocm90YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvdGF0ZSA9IE1hdGguYXRhbihcbiAgICAgICAgKGNvb3JkaW5hdGVzWzNdIC0gY29vcmRpbmF0ZXNbMV0pIC8gKGNvb3JkaW5hdGVzWzJdIC0gY29vcmRpbmF0ZXNbMF0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodWx5ID09PSB1bmRlZmluZWQgfHwgTWF0aC5taW4oY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKSA8IHVseSkge1xuICAgICAgdWx5ID0gTWF0aC5taW4oY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKTtcbiAgICB9XG4gICAgaWYgKHVseCA9PT0gdW5kZWZpbmVkIHx8IGNvb3JkaW5hdGVzWzBdIDwgdWx4KSB7XG4gICAgICB1bHggPSBjb29yZGluYXRlc1swXTtcbiAgICB9XG4gICAgaWYgKGxyeSA9PT0gdW5kZWZpbmVkIHx8IE1hdGgubWF4KGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1szXSkgPiBscnkpIHtcbiAgICAgIGxyeSA9IE1hdGgubWF4KGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1szXSk7XG4gICAgfVxuICAgIGlmIChscnggPT09IHVuZGVmaW5lZCB8fCBjb29yZGluYXRlc1syXSA+IGxyeCkge1xuICAgICAgbHJ4ID0gY29vcmRpbmF0ZXNbMl07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBpZDogc3RhZmYuaWQsIHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlIH07XG59XG5cbi8qKlxuICogc2VsZWN0IGEgYm91bmRpbmdib3ggZWxlbWVudFxuICogQHBhcmFtIGVsIC0gdGhlIGJib3ggKHN5bFRleHRSZWN0KSBlbGVtZW50IGluIHRoZSBET01cbiAqIEBwYXJhbSBkcmFnSGFuZGxlciAtIHRoZSBkcmFnIGhhbmRsZXIgaW4gdXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCQm94KFxuICBlbDogU1ZHR3JhcGhpY3NFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbik6IHZvaWQge1xuICBjb25zdCBiYm94ID0gZWw7XG4gIGNvbnN0IHN5bCA9IGJib3guY2xvc2VzdCgnLnN5bCcpO1xuICBpZiAoIXN5bC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBzeWwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICBiYm94LnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgY29uc3QgY2xvc2VzdCA9IGVsLmNsb3Nlc3QoJy5zeWxsYWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNsb3Nlc3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICBjbG9zZXN0LmNsYXNzTGlzdC5hZGQoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJyk7XG4gICAgaWYgKGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5sZW5ndGgpIHtcbiAgICAgIGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgICAgfSk7XG4gICAgICBjbG9zZXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5zdHJva2UgPSAnI2QwMCc7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobmVvblZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzaXplKHN5bCBhcyBTVkdHcmFwaGljc0VsZW1lbnQsIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChkcmFnSGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICAgIH1cbiAgICBjb25zdCBzeWxJZCA9IGVsLmNsb3Nlc3QoJy5zeWxsYWJsZScpLmlkO1xuICAgIGlmIChzeWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzcGFuOiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzcGFuLicgKyBzeWxJZCk7XG4gICAgICBpZiAoc3Bhbikge1xuICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyNkMDAnO1xuICAgICAgICBzcGFuLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgndGV4dC1zZWxlY3QnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyQkJveEFjdGlvbnMoKTtcbn1cblxuLyoqXG4gKiBTZWxlY3Qgbm90IG5ldW1lIGVsZW1lbnRzLlxuICogQHBhcmFtIG5vdE5ldW1lcyAtIEFuIGFycmF5IG9mIG5vdCBuZXVtZXMgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RObihub3ROZXVtZXM6IFNWR0dyYXBoaWNzRWxlbWVudFtdKTogYm9vbGVhbiB7XG4gIGlmIChub3ROZXVtZXMubGVuZ3RoID4gMCkge1xuICAgIG5vdE5ldW1lcy5mb3JFYWNoKChubikgPT4ge1xuICAgICAgc2VsZWN0KG5uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgc2VsZWN0aW5nIGFuIGFycmF5IG9mIGVsZW1lbnRzIGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24gdHlwZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdEFsbChcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbiAgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNlbGVjdGlvblR5cGUgPSBnZXRTZWxlY3Rpb25UeXBlKCk7XG4gIHVuc2VsZWN0KCk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHNlbGVjdGlvbkNsYXNzO1xuICBsZXQgY29udGFpbnNMYXllckVsZW1lbnRzID0gZmFsc2U7XG4gIGxldCBjb250YWluc05jID0gZmFsc2U7XG5cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcuc3lsbGFibGUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcubmV1bWUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcubmMnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcuc3RhZmYnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlCQm94JzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5zeWxUZXh0UmVjdC1kaXNwbGF5JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbEJ5TGF5ZXJFbGVtZW50JzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5jbGVmLCAuY3VzdG9zLCAuYWNjaWQsIC5kaXZMaW5lJztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHNlbGVjdGlvbiB0eXBlICcgKyBzZWxlY3Rpb25UeXBlKTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCB0aGUgZ3JvdXBpbmdzIHNwZWNpZmllZCBieSBzZWxlY3Rpb25DbGFzc1xuICAvLyB0aGF0IGNvbnRhaW4gdGhlIHByb3ZpZGVkIGVsZW1lbnRzIHRvIHNlbGVjdC5cbiAgY29uc3QgZ3JvdXBzVG9TZWxlY3QgPSBuZXcgU2V0PFNWR0dFbGVtZW50PigpO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBsZXQgZ3JvdXBpbmcgPSBlbGVtZW50LmNsb3Nlc3Q8U1ZHR0VsZW1lbnQ+KHNlbGVjdGlvbkNsYXNzKTtcbiAgICBpZiAoZ3JvdXBpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIGNsaWNrLXNlbGVjdGVkIGEgY2xlZiBvciBhIGN1c3RvcyBvciBhbiBhY2NpZCBvciBhIGRpdkxpbmVcbiAgICAgIGdyb3VwaW5nID0gZWxlbWVudC5jbG9zZXN0KCcuY2xlZiwgLmN1c3RvcywgLmFjY2lkLCAuZGl2TGluZScpO1xuICAgICAgaWYgKGdyb3VwaW5nID09PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnRWxlbWVudCAnICtcbiAgICAgICAgICAgIGVsZW1lbnQuaWQgK1xuICAgICAgICAgICAgJyBpcyBub3QgcGFydCBvZiBzcGVjaWZpZWQgZ3JvdXAgYW5kIGlzIG5vdCBhIGNsZWYgb3IgY3VzdG9zIG9yIGFjY2lkIG9yIGRpdkxpbmUuJyxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb250YWluc0xheWVyRWxlbWVudHMgPSBjb250YWluc0xheWVyRWxlbWVudHMgfHwgdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbnNOYyA9IGNvbnRhaW5zTmMgfHwgdHJ1ZTtcbiAgICB9XG4gICAgZ3JvdXBzVG9TZWxlY3QuYWRkKGdyb3VwaW5nKTtcblxuICAgIC8vIENoZWNrIGZvciBwcmVjZWRlcy9mb2xsb3dzXG4gICAgbGV0IHNlbGVjdGVkID0gZ3JvdXBpbmc7XG4gICAgbGV0IGZvbGxvd3MgPSBzZWxlY3RlZC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyk7XG4gICAgbGV0IHByZWNlZGVzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKTtcbiAgICB3aGlsZSAoZm9sbG93cyB8fCBwcmVjZWRlcykge1xuICAgICAgaWYgKGZvbGxvd3MpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGZvbGxvd3Muc2xpY2UoMSkpO1xuICAgICAgICBpZiAoZ3JvdXBzVG9TZWxlY3QuaGFzKHNlbGVjdGVkKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkLmNsYXNzTGlzdC5hZGQoJ25vLW1vdmluZycpO1xuICAgICAgICBncm91cHNUb1NlbGVjdC5hZGQoc2VsZWN0ZWQpO1xuICAgICAgICBmb2xsb3dzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6Zm9sbG93cycpO1xuICAgICAgfVxuICAgICAgaWYgKHByZWNlZGVzKSB7XG4gICAgICAgIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBwcmVjZWRlcy5zbGljZSgxKSk7XG4gICAgICAgIGlmIChncm91cHNUb1NlbGVjdC5oYXMoc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWQuY2xhc3NMaXN0LmFkZCgnbm8tbW92aW5nJyk7XG4gICAgICAgIGdyb3Vwc1RvU2VsZWN0LmFkZChzZWxlY3RlZCk7XG4gICAgICAgIHByZWNlZGVzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU2VsZWN0IHRoZSBlbGVtZW50c1xuICBncm91cHNUb1NlbGVjdC5mb3JFYWNoKChncm91cDogU1ZHR3JhcGhpY3NFbGVtZW50KSA9PlxuICAgIHNlbGVjdChncm91cCwgZHJhZ0hhbmRsZXIsIGZhbHNlKSxcbiAgKTtcblxuICAvKiBEZXRlcm1pbmUgdGhlIGNvbnRleHQgbWVudSB0byBkaXNwbGF5IChpZiBhbnkpICovXG5cbiAgY29uc3QgZ3JvdXBzID0gQXJyYXkuZnJvbShncm91cHNUb1NlbGVjdC52YWx1ZXMoKSkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG5cbiAgLy8gSGFuZGxlIG9jY3VyYW5jZSBvZiBjbGVmIG9yIGN1c3RvcyBvciBhY2NpZCBvciBkaXZMaW5lXG4gIGlmIChjb250YWluc0xheWVyRWxlbWVudHMgJiYgIWNvbnRhaW5zTmMpIHtcbiAgICAvLyBBIGNvbnRleHQgbWVudSB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGEgc2luZ2xlIGNsZWZcbiAgICBpZiAoZ3JvdXBzVG9TZWxlY3Quc2l6ZSA9PT0gMSkge1xuICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyhncm91cHNbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2VsZWN0aW9uVHlwZSA9PSAnc2VsQnlTeWxsYWJsZScpIHtcbiAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdFN5bEFjdGlvbnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckRlZmF1bHRBY3Rpb25zKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTaW5nbGVTdGFmZkFjdGlvbnMoKTtcbiAgICAgICAgICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbiAgICAgICAgICByZXNpemUoZ3JvdXBzWzBdLCBuZW9uVmlldywgZHJhZ0hhbmRsZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck11bHRpU3RhZmZBY3Rpb25zKCk7XG4gICAgICAgICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TGF5ZXJFbGVtZW50JzpcbiAgICAgIGlmIChncm91cHNUb1NlbGVjdC5zaXplID09PSAxKSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckxheWVyRWxlbWVudEFjdGlvbnMoZ3JvdXBzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckRlZmF1bHRBY3Rpb25zKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAvLyBUT0RPIGNoYW5nZSBjb250ZXh0IGlmIGl0IGlzIG9ubHkgYSBuZXVtZS9uYy5cbiAgICAgICAgICAvLyAgQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIHN5bGxhYmxlIGNvbnRhaW5zIGEgPHN5bD4gZWxlbWVudFxuICAgICAgICAgIGlmIChncm91cHNbMF0ucXVlcnlTZWxlY3RvcignLnN5bCA+IHJlY3QnKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICAnVGhlIHNlbGVjdGVkIHN5bGxhYmxlIGRvZXMgbm90IGNvbnRhaW4gYSAmbHQ7c3lsJmd0OyBlbGVtZW50LCBwbGVhc2UgaW5zZXJ0IG9uZSB1c2luZyBidXR0b24gXCJBZGQgU3lsbGFibGUgVGV4dFwiLicsXG4gICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoJ25vU3lsJyk7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLmFkZEFkZFN5bExpc3RlbmVyKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlclN5bGxhYmxlQWN0aW9ucygnc2luZ2xlU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbGlua2VkIHN5bGxhYmxlIHNwbGl0IGJ5IGEgc3RhZmYgYnJlYWtcbiAgICAgICAgICAvLyBpZiB0aGV5IGFyZSBsaW5rYWJsZSwgdXNlciBjYW4gdG9nZ2xlIGxpbmtlZC1zeWxsc1xuICAgICAgICAgIGlmIChHcm91cGluZy5pc0xpbmthYmxlKCdzZWxCeVN5bGxhYmxlJywgZ3JvdXBzKSkge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU3lsbGFibGVBY3Rpb25zKCdsaW5rYWJsZVNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBzeWxsYWJsZXMgYXJlIGFsbCBsb2NhdGVkIG9uIG9uZSBzdGF2ZSwgdGhleSBzaG91bGQgYmUgZ3JvdXBhYmxlXG4gICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcuaXNHcm91cGFibGUoJ3NlbEJ5U3lsbGFibGUnLCBncm91cHMpKSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoJ211bHRpU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIHN5bGxzIGFyZSBhY2Nyb3NzIG11bHRpcGxlIHN0YXZlc1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU3lsbGFibGVBY3Rpb25zKCdkZWZhdWx0Jyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIHN3aXRjaCAoZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgLy8gVE9ETyBjaGFuZ2UgY29udGV4dCBpZiBpdCBpcyBvbmx5IGEgbmMuXG4gICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTmV1bWVBY3Rpb25zKCk7XG4gICAgICAgICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKEdyb3VwaW5nLmlzR3JvdXBhYmxlKCdzZWxCeU5ldW1lJywgZ3JvdXBzKSkge1xuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduZXVtZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck5jQWN0aW9ucyhncm91cHNbMF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKHNoYXJlZFNlY29uZExldmVsUGFyZW50KGdyb3VwcykpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgc2VsZWN0aW9uIGlzIGEgbGlnYXR1cmUgb3IgY2FuIGJlIGEgbGlnYXR1cmVcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXNlIG5ldW1lIGNvbXBvbmVudHMgYXJlIHBhcnQgb2YgdGhlIHNhbWUgbmV1bWVcbiAgICAgICAgICAgIGlmIChncm91cHNbMF0ucGFyZW50RWxlbWVudCA9PT0gZ3JvdXBzWzFdLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGdyb3Vwc1swXS5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKTtcblxuICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IG5ldW1lIGNvbXBvbmVudHMgYXJlIGFkamFjZW50XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhcbiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmluZGV4T2YoZ3JvdXBzWzBdKSAtIGNoaWxkcmVuLmluZGV4T2YoZ3JvdXBzWzFdKSxcbiAgICAgICAgICAgICAgICApID09PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgc2Vjb25kIG5ldW1lIGNvbXBvbmVudCBpcyBsb3dlciB0aGFuIGZpcnN0LlxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgb3JkZXIgaW4gdGhlIGxpc3QgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGVcbiAgICAgICAgICAgICAgICAvLyBvcmRlciBieSB4LXBvc2l0aW9uLlxuICAgICAgICAgICAgICAgIGxldCBmaXJzdE5DID0gZ3JvdXBzWzBdLmNoaWxkcmVuWzBdIGFzIFNWR1VzZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgbGV0IHNlY29uZE5DID0gZ3JvdXBzWzFdLmNoaWxkcmVuWzBdIGFzIFNWR1VzZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3ROQ1ggPSBmaXJzdE5DLnguYmFzZVZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc2Vjb25kTkNYID0gc2Vjb25kTkMueC5iYXNlVmFsLnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdE5DWSA9IGZpcnN0TkMueS5iYXNlVmFsLnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBzZWNvbmROQ1kgPSBzZWNvbmROQy55LmJhc2VWYWwudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAvLyBvcmRlciBuYydzIGJ5IHggY29vcmQgKGxlZnQgdG8gcmlnaHQpXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgZmlyc3ROQ1ggPiBzZWNvbmROQ1ggfHxcbiAgICAgICAgICAgICAgICAgIChmaXJzdE5DWCA9PT0gc2Vjb25kTkNYICYmIGZpcnN0TkNZIDwgc2Vjb25kTkNZKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgW2ZpcnN0TkMsIHNlY29uZE5DXSA9IFtzZWNvbmROQywgZmlyc3ROQ107XG4gICAgICAgICAgICAgICAgICBbZmlyc3ROQ1gsIGZpcnN0TkNZLCBzZWNvbmROQ1gsIHNlY29uZE5DWV0gPSBbXG4gICAgICAgICAgICAgICAgICAgIHNlY29uZE5DWCxcbiAgICAgICAgICAgICAgICAgICAgc2Vjb25kTkNZLFxuICAgICAgICAgICAgICAgICAgICBmaXJzdE5DWCxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3ROQ1ksXG4gICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGlmIHN0YWNrZWQgbmMncy9saWdhdHVyZSAoaWRlbnRpY2FsIHgpLCBvciBkZXNjZW5kaW5nIG5jJ3MgKHkgZGVzY2VuZHMpXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0TkNYID09PSBzZWNvbmROQ1ggfHwgZmlyc3ROQ1kgPCBzZWNvbmROQ1kpIHtcbiAgICAgICAgICAgICAgICAgIEdyb3VwaW5nLnRyaWdnZXJHcm91cGluZygnbGlnYXR1cmUnKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduYycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoc2hhcmVkU2Vjb25kTGV2ZWxQYXJlbnQoZ3JvdXBzKSkge1xuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduYycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbEJ5QkJveCc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHNlbGVjdEJCb3goZ3JvdXBzWzBdLCBkcmFnSGFuZGxlciwgbmVvblZpZXcpO1xuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckJCb3hBY3Rpb25zKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHNlbGVjdEJCb3goZywgZHJhZ0hhbmRsZXIsIHVuZGVmaW5lZCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gc2VsZWN0aW9uIHR5cGUuIFRoaXMgc2hvdWxkIG5vdCBoYXZlIG9jY3VycmVkLicpO1xuICB9XG5cbiAgLy8gZnVuY3Rpb24gY2hhbmdlU3RhZmZMaXN0ZW5lcigpOiB2b2lkIHtcbiAgLy8gdHJ5IHtcbiAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYW5nZVN0YWZmJylcbiAgLy8gLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgU2VsZWN0T3B0aW9ucy5jaGFuZ2VTdGFmZkhhbmRsZXIpO1xuICAvLyB9IGNhdGNoIChlKSB7Y29uc29sZS5kZWJ1ZyhlKTt9XG4gIC8vIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBhcmdzQXJyYXk7XG5cbmZ1bmN0aW9uIGFyZ3NBcnJheShmdW4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobGVuKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgdmFyIGkgPSAtMTtcbiAgICAgIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW4uY2FsbCh0aGlzLCBhcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZ1bi5jYWxsKHRoaXMsIFtdKTtcbiAgICB9XG4gIH07XG59IiwibW9kdWxlLmV4cG9ydHMgPSBkMzsiLCIvKipcbiAqIEhUTUwgZm9yIGVhY2ggaW5zZXJ0IHRhYiAobmV1bWUsIGdyb3VwaW5nLCBjbGVmLCBzeXN0ZW0sIGFuZCBkaXZpc2lvbikuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRUYWJIdG1sOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBwcmltaXRpdmVUYWI6IGA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInB1bmN0dW1cIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwicHVuY3R1bVwiIHRpdGxlPVwicHVuY3R1bVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcHVuY3R1bS5wbmdcIiBjbGFzcz1cImltYWdlXCIvPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidmlyZ2FcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwidmlyZ2FcIiB0aXRsZT1cInZpcmdhXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy92aXJnYS5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJ2aXJnYVJldmVyc2VkXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIlJldmVyc2VkIFZpcmdhXCIgdGl0bGU9XCJSZXZlcnNlZCBWaXJnYVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdmlyZ2FfcmV2ZXJzZWQucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlhbW9uZFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJpbmNsaW5hdHVtXCIgdGl0bGU9XCJpbmNsaW5hdHVtXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9kaWFtb25kLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImN1c3Rvc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJjdXN0b3NcIiB0aXRsZT1cImN1c3Rvc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY3VzdG9zLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNDbGVmXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIkMgQ2xlZlwiIHRpdGxlPVwiIEMgQ2xlZlwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY0NsZWYucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZkNsZWZcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiRiBDbGVmXCIgdGl0bGU9XCJGIENsZWZcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ZDbGVmLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImxpcXVlc2NlbnRBXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIkxpcXVlc2NlbnQgQVwiIHRpdGxlPVwiTGlxdWVzY2VudCBBXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9saXF1ZXNjZW50QS5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJsaXF1ZXNjZW50Q1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJMaXF1ZXNjZW50IENcIiB0aXRsZT1cIkxpcXVlc2NlbnQgQ1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbGlxdWVzY2VudEMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZmxhdFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJGbGF0XCIgdGl0bGU9XCJGbGF0XCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9hY2NpZEZsYXQucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwibmF0dXJhbFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJOYXR1cmFsXCIgdGl0bGU9XCJOYXR1cmFsXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9hY2NpZE5hdHVyYWwucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGl2TGluZU1heGltYVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJEaXZMaW5lIE1heGltYVwiIHRpdGxlPVwiRGl2TGluZSBNYXhpbWFcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2RpdmlzaW8ucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+YCxcbiAgZ3JvdXBpbmdUYWI6IGA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInBlc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJwZXNcIiB0aXRsZT1cInBlc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcGVzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNsaXZpc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJjbGl2aXNcIiB0aXRsZT1cImNsaXZpc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY2xpdmlzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNjYW5kaWN1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJzY2FuZGljdXNcIiB0aXRsZT1cInNjYW5kaWN1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc2NhbmRpY3VzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNsaW1hY3VzXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cImNsaW1hY3VzXCIgdGl0bGU9XCJjbGltYWN1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY2xpbWFjdXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidG9yY3VsdXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwidG9jdWx1c1wiIHRpdGxlPVwidG9jdWx1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdG9yY3VsdXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwicG9ycmVjdHVzXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cInBvcnJlY3R1c1wiIHRpdGxlPVwicG9ycmVjdHVzXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9wb3JyZWN0dXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwicHJlc3N1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJwcmVzc3VzXCIgdGl0bGU9XCJwcmVzc3VzXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9wcmVzc3VzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPmAsXG4gIHN5c3RlbVRhYjogYDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic3RhZmZcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIGxvbmdlbFwiIGFyaWEtbGFiZWw9XCJzeXN0ZW1cIiB0aXRsZT1cInN5c3RlbVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc3RhZmYucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPkNsaWNrIHVwcGVyIGxlZnQgYW5kIGxvd2VyIHJpZ2h0IGNvcm5lcnMgb2YgbmV3IHN0YWZmLjwvcD5gLFxuICAvLyBkaXZpc2lvblRhYjogXCI8cCBjbGFzcz0naW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyJz5cIiArXG4gIC8vIFwiPGJ1dHRvbiBpZD0nc21hbGxEaXYnIGNsYXNzPSdzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCB0YWxsZWwnPjxpbWcgc3JjPSdcIiArIF9fQVNTRVRfUFJFRklYX18gKyAnYXNzZXRzL2ltZy9zbWFsbGRpdi5wbmcgXCInIGNsYXNzPSdpbWFnZScvPjwvYnV0dG9uPjwvcD5cIiArXG4gIC8vIFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyAgICAgXCI8YnV0dG9uIGlkPSdtaW5vckRpdicgY2xhc3M9J3NpZGUtcGFuZWwtYnRuIGluc2VydGVsIHRhbGxlbCc+PGltZyBzcmM9J1wiICsgX19BU1NFVF9QUkVGSVhfXyArICdhc3NldHMvaW1nL21pbm9yZGl2LnBuZ1wiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCIgK1xuICAvLyAgICAgXCI8cCBjbGFzcz0naW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyJz5cIiArXG4gIC8vIFwiPGJ1dHRvbiBpZD0nbWFqb3JEaXYnIGNsYXNzPSdzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCB0YWxsZWwnPjxpbWcgc3JjPSdcIiArIF9fQVNTRVRfUFJFRklYX18gKyAnYXNzZXRzL2ltZy9tYWpvcmRpdi5wbmcgXCInIGNsYXNzPSdpbWFnZScvPjwvYnV0dG9uPjwvcD5cIiArXG4gIC8vIFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyBcIjxidXR0b24gaWQ9J2ZpbmFsRGl2JyBjbGFzcz0nc2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgdGFsbGVsJz48aW1nIHNyYz0nXCIgKyBfX0FTU0VUX1BSRUZJWF9fICsgJ2Fzc2V0cy9pbWcvZmluYWxkaXYucG5nIFwiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCJcbn07XG5cbi8qKlxuICogU3RydWN0dXJlIG9mIGluc2VydCBwYW5lbCB3aXRoIGJhc2ljIGdyb3VwaW5nIHRhYnMuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRDb250cm9sc1BhbmVsID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJpbnNlcnRNZW51XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nLXRpdGxlXCI+SU5TRVJUPC9kaXY+XG4gICAgICAgIDxzdmcgY2xhc3M9XCJpY29uIGlzLXB1bGxlZC1yaWdodFwiPlxuICAgICAgICAgICAgPHVzZSBpZD1cInRvZ2dsZUluc2VydFwiIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93blwiPjwvdXNlPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblx0PGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBmaXJzdC1zdWJzZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJpbnNlcnRDb250ZW50c1wiIGNsYXNzPVwicGFuZWwtY29udGVudHNcIiBzdHlsZT1cIm92ZXJmbG93LXk6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwicHJpbWl0aXZlVGFiXCIgY2xhc3M9XCJpbnNlcnRUYWJcIj5QcmltaXRpdmUgRWxlbWVudHM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJncm91cGluZ1RhYlwiIGNsYXNzPVwiaW5zZXJ0VGFiXCI+R3JvdXBpbmc8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJzeXN0ZW1UYWJcIiBjbGFzcz1cImluc2VydFRhYlwiPlN5c3RlbTwvYT5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJpbnNlcnRfZGF0YVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGVkaXQgcGFuZWwgd2l0aCBidXR0b25zLlxuICovXG5leHBvcnQgY29uc3QgZWRpdENvbnRyb2xzUGFuZWwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiBpZD1cImVkaXRNZW51XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nLXRpdGxlIGZvY3VzZWRcIj5FRElUPC9kaXY+XG4gICAgICAgIDxzdmcgY2xhc3M9XCJpY29uIGlzLXB1bGxlZC1yaWdodFwiPlxuICAgICAgICAgICAgPHVzZSBpZD1cInRvZ2dsZUVkaXRcIiB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImVkaXRDb250ZW50c1wiIGNsYXNzPVwicGFuZWwtY29udGVudHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBmaXJzdC1zdWJzZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VsZWN0aW9uLW1vZGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXN1Yi10aXRsZVwiPlNlbGVjdGlvbiBNb2RlOjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWxlY3Rpb24tbW9kZS1idG5zLWNvbnRhaW5lclwiICBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzZWwtYnlcIiBpZD1cInNlbEJ5U3lsbGFibGVcIj5TeWxsYWJsZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNlbC1ieVwiIGlkPVwic2VsQnlOZXVtZVwiPk5ldW1lPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeU5jXCI+TmV1bWUgQ29tcG9uZW50PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeVN0YWZmXCI+U3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzZWwtYnlcIiBpZD1cInNlbEJ5TGF5ZXJFbGVtZW50XCI+TGF5ZXIgRWxlbWVudDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImRpc3BsYXktc2xpZGVyLWFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cIm1vcmVFZGl0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImV4dHJhRWRpdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgICAgICogVGhlIGV4dHJhRWRpdCBwYW5lbCBpcyBhZGRlZCBmb3IgZWRpdCBvcHRpb25zIHRoYXQgaGF2ZSBkcm9wZG93biBtZW51c1xuICAgICAgICAgICAgICAgICAgICAqIExpa2UgdGhlIE5ldW1lIGFuZCBDbGVmIG1lbnVzXG4gICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIG1vcmVFZGl0IG1lbnUgbmVlZHMgdG8gaGF2ZSBvdmVyZmxvdyBmb3IgY2FzZXMgd2hlcmUgaXQgaGFzIGxvdHMgb2YgYnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICAqIEJ1dCBvdmVyZmxvdyBydWlucyBkcm9wZG93biBtZW51c1xuICAgICAgICAgICAgICAgICAgICAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtY29udGVudC1zdWJzZWN0aW9uIGhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwibmV1bWVFZGl0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidW5kb1JlZG9fY29udHJvbHNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBuYyBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5jQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkNoYW5nZSBIZWFkIFNoYXBlOjwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bfc2VsZWN0IGRyb3Bkb3duXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPkhlYWQgU2hhcGVzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlB1bmN0dW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5QdW5jdHVtPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiVmlyZ2FcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5WaXJnYTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlZpcmdhUmV2ZXJzZWRcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5SZXZlcnNlZCBWaXJnYTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkluY2xpbmF0dW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5JbmNsaW5hdHVtPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiTGlxdWVzY2VudEFudGljbG9ja3dpc2VcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5MaXF1ZXNjZW50IEE8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJMaXF1ZXNjZW50Q2xvY2t3aXNlXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TGlxdWVzY2VudCBDPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYmFzaWMgbmV1bWUgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0TmV1bWVBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInNwbGl0LW5ldW1lXCI+U3BsaXQgTmV1bWVzPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBuZXVtZSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5ldW1lQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkdyb3VwaW5nIE9wdGlvbnM6PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+R3JvdXBpbmdzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50IHNjcm9sbGFibGUtZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkNsaW1hY3VzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+Q2xpbWFjdXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDbGltYWN1c1Jlc3VwaW51c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPkNsaW1hY3VzIFJlc3VwaW51czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkNsaXZpc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPkNsaXZpczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBlc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBlczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBlc1N1YnB1bmN0aXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5QZXMgU3VicHVuY3RpczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBvcnJlY3R1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBvcnJlY3R1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBvcnJlY3R1c0ZsZXh1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBvcnJlY3R1cyBGbGV4dXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQb3JyZWN0dXNTdWJwdW5jdGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+UG9ycmVjdHVzIFN1YnB1bmN0aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQcmVzc3VzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+UHJlc3N1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlNjYW5kaWN1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlNjYW5kaWN1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlNjYW5kaWN1c0ZsZXh1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlNjYW5kaWN1cyBGbGV4dXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJTY2FuZGljdXNTdWJwdW5jdGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+U2NhbmRpY3VzIFN1YnB1bmN0aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJUb3JjdWx1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlRvcmN1bHVzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiVG9yY3VsdXNSZXN1cGludXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5Ub3JjdWx1cyBSZXN1cGludXM8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ1bmdyb3VwTmNzXCI+VW5ncm91cDwvYnV0dG9uPmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZGVmYXVsdCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZGVmYXVsdCBhY3Rpb24gbWVudSB3aGVuIHNlbGVjdGluZyBieSBzeWxsYWJsZVxuICogU2FtZSBhcyBhYm92ZSBleGNlcHQgaW5jbHVkZXMgcmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmZcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRTeWxBY3Rpb25Db250ZW50cyA9IGA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgY3VzdG9zIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgY3VzdG9zQWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJjaGFuZ2VTdGFmZlwiPlJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBsYXllciBlbGVtZW50IChvdXRzaWRlIHN5bGxhYmxlKSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyRWxlbWVudE91dEFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiaW5zZXJ0VG9TeWxsYWJsZVwiPkluc2VydCB0byBuZWFyZXN0IHN5bGxhYmxlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgbGF5ZXIgZWxlbWVudCAoaW5zaWRlIHN5bGxhYmxlKSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyRWxlbWVudEluQWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtb3ZlT3V0c2lkZVN5bGxhYmxlXCI+TW92ZSBvdXRzaWRlIHN5bGxhYmxlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYWNjaWQgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBhY2NpZEFjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5DaGFuZ2UgQWNjaWRlbnRhbDo8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wX3NlbGVjdCBkcm9wZG93blwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwib3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlNoYXBlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDaGFuZ2VUb0ZsYXRcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5GbGF0PC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9OYXR1cmFsXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TmF0dXJhbDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIHN0YWZmIHNwbGl0IGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3Qgc3RhZmZTcGxpdEFjdGlvbkNvbnRlbnRzID0gYDxkaXY+U3BsaXQgU3lzdGVtOjwvZGl2PlxuICAgIDxkaXYgaWQ9XCJzcGxpdC1zeXN0ZW0tYnRucy1jb250YWluZXJcIiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNwbGl0LXN5c3RlbVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIj5TcGxpdDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVzZXQtcm90YXRlXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiPlJlc2V0IFJvdGF0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZXh0cmEgc3RhZmYgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFmZk1lcmdlQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPk1lcmdlIFN5c3RlbXM6PC9sYWJlbD5cbiAgICA8ZGl2IGlkPVwibWVyZ2Utc3lzdGVtLWJ0bnMtY29udGFpbmVyXCIgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJtZXJnZS1zeXN0ZW1zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiPk1lcmdlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBhY2NpZCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbHVtbkFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1jb250YWluZXJcIj5cbiAgICAgICAgRWRpdCBDb2x1bW4gSW5mb3JtYXRpb246XG4gICAgICAgIDxkaXYgaWQ9XCJjb2wtc3RlcHBlci1idG5zLWNvbnRhaW5lclwiIGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbC1kZWNyZW1lbnRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGNvbC1zdGVwcGVyLWJ0blwiPuKAkzwvYnV0dG9uPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjb2wtaW5wdXRcIiBjbGFzcz1cInNpZGUtcGFuZWwtc3RlcHBlci1pbnB1dFwiIHZhbHVlPVwiMFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbC1pbmNyZW1lbnRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGNvbC1zdGVwcGVyLWJ0blwiPis8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjb2wtY29uZmlybVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2lkZS1wYW5lbC1jb25maXJtLWJ0blwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+Q29uZmlybTwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBpZD1cImNvbC13YXJuaW5nXCIgY2xhc3M9XCJzaWRlLXBhbmVsLXdhcm5pbmdcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBjbGVmIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgY2xlZkFjdGlvbkNvbnRlbnRzID0gYFxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wX3NlbGVjdCBkcm9wZG93blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRyaWdnZXJcIiBvdmVyZmxvdz1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5EaXNwbGFjZSBPY3RhdmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiaW5jcmVtZW50LW9jdGF2ZVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPisxIE9jdGF2ZTwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9XCJkZWNyZW1lbnQtb2N0YXZlXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+LTEgT2N0YXZlPC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCIgb3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2hhbmdlIENsZWYgU2hhcGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiQ0NsZWZcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5DIENsZWY8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiRkNsZWZcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5GIENsZWY8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgYDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBkaXZMaW5lIHR5cGUgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBkaXZMaW5lQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkNoYW5nZSBEaXZMaW5lOjwvbGFiZWw+XG48ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwib3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZWxlY3Qtb3B0aW9uc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtY29udHJvbHM9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICA8c3Bhbj5TaGFwZXM8L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9DYWVzdXJhXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+Q2Flc3VyYTwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9GaW5hbGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+RmluYWxpczwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9NaW5pbWFcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NaW5pbWE8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvTWFpb3JcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NYWlvcjwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9NYXhpbWFcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NYXhpbWE8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvVmlyZ3VsYVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlZpcmd1bGE8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBiYm94IGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgYmJveEFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwibWF0Y2hIZWlnaHRcIj5NYXRjaCBIZWlnaHQgZm9yIEVudGlyZSBSb3c8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIEhUTUwgZm9yIGdyb3VwaW5nIHNlbGVjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgZ3JvdXBpbmdNZW51ID0ge1xuICBuYzogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gbW9yZS1lZGl0LWJ0blwiIGlkPVwiZ3JvdXBOY3NcIj5Hcm91cCBOZXVtZSBDb21wb25lbnRzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gLFxuICBuZXVtZTogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImdyb3VwTmV1bWVzXCI+R3JvdXAgTmV1bWVzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gLFxuICBzeWw6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtZXJnZVN5bHNcIj5NZXJnZSBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cdFx0PC9kaXY+YCxcbiAgbGlnYXR1cmVOYzogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJncm91cE5jc1wiPkdyb3VwIE5ldW1lIENvbXBvbmVudHM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidG9nZ2xlLWxpZ2F0dXJlXCI+VG9nZ2xlIExpZ2F0dXJlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gLFxuICBsaWdhdHVyZTogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidG9nZ2xlLWxpZ2F0dXJlXCI+VG9nZ2xlIExpZ2F0dXJlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gLFxuICBzcGxpdFN5bGxhYmxlOiBgPGRpdiBjbGFzcz1cIm1vcmUtZWRpdC1idG4gcGFuZWwtYnRuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInRvZ2dsZS1saW5rXCI+VG9nZ2xlIExpbmtlZCBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmAsXG59O1xuXG4vKiBCR0lOTklORyBPRiBNT0RBTCBXSU5ET1cgQ09OVEVOVCBTRUNUSU9OICovXG5cbi8qKlxuICogSFRNTCBmb3IgQWRkIFN5bGxhYmxlIFRleHQgbW9kYWwgd2luZG93XG4gKi9cbmV4cG9ydCBjb25zdCBhZGRUZXh0TW9kYWwgPSBgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJuZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1sYWJlbFwiPkVudGVyIFN5bGxhYmxlIFRleHQ6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgPGRpdiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1idG5zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1idG5cIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWxcIj5DYW5jZWw8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWFkZFwiPkFkZDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIEhUTUwgZm9yIEVkaXQgU3lsbGFibGUgVGV4dCBtb2RhbCB3aW5kb3dcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRUZXh0TW9kYWwgPSBgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJuZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1sYWJlbFwiPkVudGVyIFN5bGxhYmxlIFRleHQ6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgPGRpdiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1idG5zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1idG5cIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWxcIj5DYW5jZWw8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LXNhdmVcIj5TYXZlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogSFRNTCBmb3IgSG90a2V5cyBtb2RhbCB3aW5kb3dcbiAqL1xuZXhwb3J0IGNvbnN0IGhvdGtleXNNb2RhbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudFwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1ob3RrZXlzXCI+XG4gICAgICAgIDwhLS0gXCJEaXNwbGF5XCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5EaXNwbGF5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPis8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+Wm9vbSBJbjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+Wm9vbSBPdXQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+MDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5ab29tIFJlc2V0PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPmg8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+SGlkZSBHbHlwaDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPlQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+U2Nyb2xsIFRvIFN5bGxhYmxlIFRleHQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFwiRWRpdFwiIGhvdGtleXMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LXN1YmNhdGVnb3J5LXRpdGxlXCI+RWRpdDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+Q3RybDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5vcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+4oyYPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ejwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5VbmRvPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPkN0cmw8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5vcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+4oyYPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+U2hpZnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj56PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlJlZG88L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+cS93L2Uvci90L3k8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBieSBTdGFmZi9TeWxsYWJsZS9OZXVtZS9MYXllckVsZW1lbnQvU2VsZWN0aW9uL09mZlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj4xLzIvMy80LzUvNjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGJ5IFN5bGxhYmxlL05ldW1lL05ldW1lIENvbXBvbmVudC9TdGFmZi9MYXllciBFbGVtZW50L0JCb3hcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+U2hpZnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5OdW1iZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIEJlZ2luIEluc2VydCBmb3IgdGhlIDxpPm50aDwvaT4gT3B0aW9uIGluIHRoZSBTZWxlY3RlZCBUYWJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ZzwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgR3JvdXAvVW5ncm91cCBTZWxlY3RlZCBFbGVtZW50KHMpXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBcIk90aGVyXCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5PdGhlcjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+czwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5TYXZlIEZpbGU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+RXNjPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlJldHVybiB0byBFZGl0IE1vZGU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG5leHBvcnQgY29uc3Qgc3lsbGFibGVBY3Rpb25zQ29udGVudCA9IGBcbiAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cIm1lcmdlU3lsc1wiPk1lcmdlIFN5bGxhYmxlczwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5ldW1lc1wiPlVuZ3JvdXA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICA8L2Rpdj5cbmA7XG5cbmV4cG9ydCBjb25zdCBlcnJvckxvZ3NQYW5lbENvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJlcnJvckxvZ0hlYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmctdGl0bGVcIj5FcnJvciBMb2c8L2Rpdj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVFcnJvckxvZ1wiIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnRzXCIgaWQ9XCJlcnJvckxvZ0NvbnRlbnRzXCIgc3R5bGU9XCJvdmVyZmxvdzogc2Nyb2xsOyBwYWRkaW5nOiAwLjVlbSAwLjc1ZW07IG1heC1oZWlnaHQ6IDMwMHB4O1wiPjxkaXY+YDtcbiIsImltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBBZGRTeWxBY3Rpb24sIFNldFRleHRBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvd0ludGVyZmFjZSB9IGZyb20gJy4uL0ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgaG90a2V5c01vZGFsLFxuICBlZGl0VGV4dE1vZGFsLFxuICBhZGRUZXh0TW9kYWwsXG59IGZyb20gJy4uL1NxdWFyZUVkaXQvQ29udGVudHMnO1xuaW1wb3J0IHtcbiAgbmV3Rm9sZGVySFRNTCxcbiAgcmVuYW1lSFRNTCxcbiAgdXBsb2FkQXJlYUhUTUwsXG59IGZyb20gJy4uL0Rhc2hib2FyZC9EYXNoYm9hcmRDb250ZW50JztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuL0RyYWdIYW5kbGVyJztcbmltcG9ydCB7IHNlbGVjdEJCb3gsIHVuc2VsZWN0IH0gZnJvbSAnLi9TZWxlY3RUb29scyc7XG5cbi8qKlxuICogRGVmaW5lcyBtb2RhbCB0eXBlcy5cbiAqIFRvIGNyZWF0ZSBuZXcgbW9kYWwgd2luZG93IHR5cGVzLCBhZGQgZW51bSBvcHRpb24gYW5kIGltcGxlbWVudCBsb2dpYyBpbnNpZGUgTW9kYWwgY2xhc3MuXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGFsV2luZG93VmlldyB7XG4gIEFERF9URVhULFxuICBFRElUX1RFWFQsXG4gIEhPVEtFWVMsXG4gIEVSUk9SX0xPRywgLy8gZm9yIHZhbGlkYXRpb24gZXJyb3JzIGFnYWluc3QgTUVJIHNjaGVtYSBhbmQgaW52YWxpZCBlbGVtZW50IGVycm9yc1xuICBET0NVTUVOVF9VUExPQUQsXG4gIE1PVkVfVE8sXG4gIE5FV19GT0xERVIsXG4gIFJFTkFNRSxcbn1cblxuZW51bSBNb2RhbFdpbmRvd1N0YXRlIHtcbiAgT1BFTixcbiAgQ0xPU0VELFxufVxuXG4vKipcbiAqIE1vZGFsIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGFuZCBjb250cm9sIHN0YXRlL2NvbnRlbnRcbiAqIG9mIG1vZGFsIHdpbmRvd3MgaW4gTmVvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGFsV2luZG93IGltcGxlbWVudHMgTW9kYWxXaW5kb3dJbnRlcmZhY2Uge1xuICBwcml2YXRlIG1vZGFsV2luZG93VmlldzogTW9kYWxXaW5kb3dWaWV3OyAvLyBjdXJyZW50IG1vZGFsIHR5cGVcbiAgcHJpdmF0ZSBtb2RhbFdpbmRvd1N0YXRlOiBNb2RhbFdpbmRvd1N0YXRlOyAvLyBvcGVuIG9yIGNsb3NlZD9cbiAgcHJpdmF0ZSBuZW9uVmlldzogTmVvblZpZXc7IC8vIG5lb25WaWV3IGluc3RhbmNlIGNvbnRleHRcblxuICAvKipcbiAgICogU2V0IG5lb25WaWV3IGluc3RhbmNlIGNvbnRleHQgZm9yIHRoaXMgbW9kYWwgd2luZG93IGluc3RhbmNlLlxuICAgKiBAcGFyYW0gbmVvblZpZXcgbmVvblZpZXcgY29udGV4dCBmb3IgTW9kYWwgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5lb25WaWV3PzogTmVvblZpZXcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5DTE9TRUQ7XG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGV2ZW50IGxpc3RlbmVycyB0aGF0IGFwcGx5IHRvIGFsbCBtb2RhbCB3aW5kb3dzXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctaGVhZGVyLWNsb3NlJylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGlkZU1vZGFsV2luZG93LmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93JylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZm9jdXNNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZGFsIHdpbmRvd1xuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1oZWFkZXItY2xvc2UnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3cnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lci5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250YWluZXInKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5mb2N1c01vZGFsV2luZG93LmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbW9kYWwgdmlldyBvZiB0aGlzIE1vZGFsIGluc3RhbmNlLlxuICAgKiBVcGRhdGUgdGhlIGNvbnRlbnQgYmFzZWQgb24gcGFzc2VkIHZpZXcuXG4gICAqIEBwYXJhbSB2aWV3IFR5cGUgb2YgbW9kYWwgdG8gb3BlbiAoTW9kYWxWaWV3IGVudW0pXG4gICAqL1xuICBzZXRNb2RhbFdpbmRvd1ZpZXcodmlldzogTW9kYWxXaW5kb3dWaWV3LCBjb250ZW50Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1ZpZXcgPSB2aWV3O1xuICAgIHRoaXMuc2V0TW9kYWxXaW5kb3dDb250ZW50KGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBtb2RhbCB2aWV3IGFzIGEgc3RyaW5nXG4gICAqL1xuICBnZXRNb2RhbFdpbmRvd1ZpZXcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tb2RhbFdpbmRvd1ZpZXcudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgbW9kZWwgd2luZG93IHdpdGggY29udGVudCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgTW9kYWxWaWV3LlxuICAgKi9cbiAgb3Blbk1vZGFsV2luZG93KCk6IHZvaWQge1xuICAgIC8vIG1ha2Ugc3VyZSBubyBvdGhlciBtb2RhbCBjb250ZW50IGlzIGJlaW5nIGRpc3BsYXllZFxuICAgIEFycmF5LmZyb20oXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50JyksXG4gICAgKS5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICB9KTtcbiAgICBzd2l0Y2ggKHRoaXMubW9kYWxXaW5kb3dWaWV3KSB7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5BRERfVEVYVDpcbiAgICAgICAgdGhpcy5vcGVuQWRkU3lsVGV4dE1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIHRoaXMub3BlbkVkaXRTeWxUZXh0TW9kYWxXaW5kb3coKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkhPVEtFWVM6XG4gICAgICAgIC8vIHNldCB1cCBhbmQgZGlwbGF5IGhvdGtleSBtb2RhbCBjb250ZW50XG4gICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXMnKVxuICAgICAgICAgIC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRDpcbiAgICAgIC8vIGFkZCBmdW5jdGlvbiB0byBwYWlyaW5nIGJ1dHRvblxuICAgICAgLy8gYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk1PVkVfVE86XG5cbiAgICAgIC8vIGJyZWFrO1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTkVXX0ZPTERFUjpcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FOlxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9XG4gICAgICAgICAgJ2ZsZXgnO1xuICAgICAgICB0aGlzLmZvY3VzTW9kYWxXaW5kb3coKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIG1ha2Ugc3VyZSB1c2VyIGNhbid0IHNjcm9sbCB3aGVuIG1vZGFsIGlzIG9wZW5cbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5PUEVOO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIE5lb24gbW9kYWwgd2luZG93XG4gICAqL1xuICBoaWRlTW9kYWxXaW5kb3coKTogdm9pZCB7XG4gICAgc3dpdGNoICh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICBjb25zdCBzcGFuID0gPEhUTUxTcGFuRWxlbWVudD4oXG4gICAgICAgICAgZG9jdW1lbnRcbiAgICAgICAgICAgIC5nZXRFbGVtZW50QnlJZCgnc3lsX3RleHQnKVxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uc2VsZWN0ZWQtdG8tZWRpdCcpWzBdXG4gICAgICAgICk7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQtdG8tZWRpdCcpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTU9WRV9UTzpcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk5FV19GT0xERVI6XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5SRU5BTUU6XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICAgICduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWNvbnRhaW5lcicsXG4gICAgICAgICkuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRhaW5lcicpLnN0eWxlLmRpc3BsYXkgPVxuICAgICAgJ25vbmUnO1xuICAgIC8vIHJlc2V0IHNjcm9sbCBiZWhhdmlvciBvZiBib2R5XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1ggPSAnaGlkZGVuJztcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdzY3JvbGwnO1xuICAgIHRoaXMubW9kYWxXaW5kb3dTdGF0ZSA9IE1vZGFsV2luZG93U3RhdGUuQ0xPU0VEO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY29udGVudCBvZiBtb2RhbCB3aW5kb3dcbiAgICovXG4gIHByaXZhdGUgc2V0TW9kYWxXaW5kb3dDb250ZW50KGNvbnRlbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAgICduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWNvbnRhaW5lcicsXG4gICAgKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1oZWFkZXItdGl0bGUnKTtcblxuICAgIHN3aXRjaCAodGhpcy5tb2RhbFdpbmRvd1ZpZXcpIHtcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkFERF9URVhUOlxuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYWRkVGV4dE1vZGFsO1xuICAgICAgICAvLyBzZXQgbW9kYWwgd2luZG93IHRpdGxlXG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdFTlRFUiBTWUxMQUJMRSBURVhUJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkVESVRfVEVYVDpcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGVkaXRUZXh0TW9kYWw7XG4gICAgICAgIC8vIHNldCBtb2RhbCB3aW5kb3cgdGl0bGVcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ0VESVQgU1lMTEFCTEUgVEVYVCc7XG5cbiAgICAgICAgLy8gc3BhbiBhbmQgY3VycmVudCB0ZXh0IG9mIHNlbGVjdGVkLXRvLWVkaXQgc3lsbGFibGUgYW5kIGZpbHRlciBvdXQgdW53YW50ZWQgY2hhcnNcbiAgICAgICAgY29uc3Qgc3BhbiA9IDxIVE1MU3BhbkVsZW1lbnQ+KFxuICAgICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgICAuZ2V0RWxlbWVudEJ5SWQoJ3N5bF90ZXh0JylcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuLnNlbGVjdGVkLXRvLWVkaXQnKVswXVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZW1vdmVTeW1ib2wgPSAvXFx1ezI1Q0F9L3U7XG4gICAgICAgIGNvbnN0IG9yaWcgPSBzcGFuLnRleHRDb250ZW50LnJlcGxhY2UocmVtb3ZlU3ltYm9sLCAnJykudHJpbSgpO1xuXG4gICAgICAgIC8vIHNldCB2YWx1ZSBvZiBpbnB1dCBmaWVsZCB0byBjdXJyZW50IHN5bGxhYmxlIHRleHRcbiAgICAgICAgKDxIVE1MSW5wdXRFbGVtZW50PihcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0JylcbiAgICAgICAgKSkudmFsdWUgPSBvcmlnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuSE9US0VZUzpcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGhvdGtleXNNb2RhbDtcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ0hPVEtFWVMnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRVJST1JfTE9HOlxuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAzMHB4O3doaXRlLXNwYWNlOiBwcmUtbGluZTtcIj4ke2NvbnRlbnR9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCR7ZW5jb2RlVVJJKFxuICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgKX1cIiBkb3dubG9hZD1cImVycm9yLmxvZ1wiPlxuICAgICAgICAgICAgICBFeHBvcnRcbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdFUlJPUiBMT0cnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSAnRE9DVU1FTlQgVVBMT0FEJztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHVwbG9hZEFyZWFIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTU9WRV9UTzpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ01PVkUgVE8nO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTkVXX0ZPTERFUjpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ05FVyBGT0xERVInO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gbmV3Rm9sZGVySFRNTDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LlJFTkFNRTpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ1JFTkFNRSc7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSByZW5hbWVIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBzZWxlY3Rpb24gdHlwZS4gVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggY29udGVudCBmb3IgYWRkaW5nIHN5bGxhYmxlIHRleHRcbiAgICovXG4gIHByaXZhdGUgb3BlbkFkZFN5bFRleHRNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpLFxuICAgICkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgQWRkIFN5bGxhYmxlIFRleHQgbW9kYWwgd2luZG93XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1lZGl0LXRleHQnKVxuICAgICAgLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcblxuICAgIC8vIFJlc2V0IFwiQ2FuY2VsXCIgYnV0dG9uIGV2ZW50IGxpc3RlbmVyXG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWNhbmNlbCcpXG4gICAgICAucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdyk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWNhbmNlbCcpXG4gICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcblxuICAgIC8vIFJlc2V0IFwiU2F2ZVwiIGJ1dHRvbiBldmVudCBsaXN0ZW5lclxuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1hZGQnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5hZGRTeWxUZXh0LmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1hZGQnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5hZGRTeWxUZXh0LmJpbmQodGhpcykpO1xuXG4gICAgLy8gZGlzcGxheSBtb2RhbCB3aW5kb3dcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9XG4gICAgICAnZmxleCc7XG4gICAgdGhpcy5mb2N1c01vZGFsV2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggY29udGVudCBmb3IgdXBkYXRpbmcgc3lsbGFibGUgdGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRWRpdFN5bFRleHRNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpLFxuICAgICkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgRWRpdCBTeWxsYWJsZSBUZXh0IG1vZGFsIHdpbmRvd1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0JylcbiAgICAgIC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICAvLyBSZXNldCBcIkNhbmNlbFwiIGJ1dHRvbiBldmVudCBsaXN0ZW5lclxuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWwnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cpO1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWwnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBSZXNldCBcIlNhdmVcIiBidXR0b24gZXZlbnQgbGlzdGVuZXJcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtc2F2ZScpXG4gICAgICAucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnVwZGF0ZVN5bFRleHQuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LXNhdmUnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy51cGRhdGVTeWxUZXh0LmJpbmQodGhpcykpO1xuXG4gICAgLy8gZGlzcGxheSBtb2RhbCB3aW5kb3dcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9XG4gICAgICAnZmxleCc7XG4gICAgdGhpcy5mb2N1c01vZGFsV2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0ZXh0IG9mIHNlbGVjdGVkLXRvLWVkaXQgc3lsbGFibGVzIHdpdGggdXNlci1wcm92aWRlZCB0ZXh0XG4gICAqL1xuICBwcml2YXRlIGFkZFN5bFRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gR2V0IHRoZSBlbGVtZW50IElEIG9mIHRoZSBzZWxlY3RlZCBzeWxsYWJsZVxuICAgIGNvbnN0IGVsZW1lbnRJZCA9XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzeWxsYWJsZSBzZWxlY3RlZCcpWzBdLmlkO1xuXG4gICAgY29uc3Qgc3lsVGV4dCA9ICg8SFRNTElucHV0RWxlbWVudD4oXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0JylcbiAgICApKS52YWx1ZTtcblxuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogQWRkU3lsQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAnYWRkU3lsJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudElkLFxuICAgICAgICBzeWxUZXh0OiBzeWxUZXh0LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gc2VuZCBhY3Rpb24gdG8gdmVyb3ZpbyBmb3IgcHJvY2Vzc2luZ1xuICAgIHRoaXMubmVvblZpZXdcbiAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbigocmVzcG9uc2U6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBTVkdcbiAgICAgICAgICB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBBbiB1cGRhdGUgdG8gdGhlIHBhZ2Ugd2lsbCByZWxvYWQgdGhlIGVudGlyZSBzdmc7XG4gICAgICAgICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIHRoZW4gcmVzZWxlY3QgdGhlIHNhbWUgc2VsZWN0ZWQgc3lsbGFibGVcbiAgICAgICAgICAgIC8vIGlmIGJib3hlcyBhcmUgZW5hYmxlZFxuICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVTZWxlY3RlZEJCb3goc3BhbiwgdGhpcy5kcmFnSGFuZGxlciwgdGhpcy5uZW9uVmlldyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gY2xvc2UgbW9kYWwgd2luZG93XG4gICAgdGhpcy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRleHQgb2Ygc2VsZWN0ZWQtdG8tZWRpdCBzeWxsYWJsZXMgd2l0aCB1c2VyLXByb3ZpZGVkIHRleHRcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlU3lsVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBzcGFuIGFuZCBjdXJyZW50IHRleHQgb2Ygc2VsZWN0ZWQtdG8tZWRpdCBzeWxsYWJsZSBhbmQgZmlsdGVyIG91dCB1bndhbnRlZCBjaGFyc1xuICAgIGNvbnN0IHNwYW4gPSA8SFRNTFNwYW5FbGVtZW50PihcbiAgICAgIGRvY3VtZW50XG4gICAgICAgIC5nZXRFbGVtZW50QnlJZCgnc3lsX3RleHQnKVxuICAgICAgICAucXVlcnlTZWxlY3RvckFsbCgnc3Bhbi5zZWxlY3RlZC10by1lZGl0JylbMF1cbiAgICApO1xuICAgIGNvbnN0IHJlbW92ZVN5bWJvbCA9IC9cXHV7MjVDQX0vdTtcbiAgICBjb25zdCBvcmlnID0gc3Bhbi50ZXh0Q29udGVudC5yZXBsYWNlKHJlbW92ZVN5bWJvbCwgJycpLnRyaW0oKTtcbiAgICBjb25zdCB1cGRhdGVkU3lsVGV4dCA9ICg8SFRNTElucHV0RWxlbWVudD4oXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0JylcbiAgICApKS52YWx1ZTtcblxuICAgIGlmICh1cGRhdGVkU3lsVGV4dCAhPT0gbnVsbCAmJiB1cGRhdGVkU3lsVGV4dCAhPT0gb3JpZykge1xuICAgICAgLy8gY3JlYXRlIFwic2V0IHRleHRcIiBhY3Rpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IFsuLi5zcGFuLmNsYXNzTGlzdC5lbnRyaWVzKCldLmZpbHRlcihcbiAgICAgICAgKGNsYXNzTmFtZSkgPT5cbiAgICAgICAgICBjbGFzc05hbWVbMV0gIT09ICd0ZXh0LXNlbGVjdCcgJiYgY2xhc3NOYW1lWzFdICE9PSAnc2VsZWN0ZWQtdG8tZWRpdCcsXG4gICAgICApWzBdWzFdO1xuICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBTZXRUZXh0QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnRJZCxcbiAgICAgICAgICB0ZXh0OiB1cGRhdGVkU3lsVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBzZW5kIGFjdGlvbiB0byB2ZXJvdmlvIGZvciBwcm9jZXNzaW5nXG4gICAgICB0aGlzLm5lb25WaWV3XG4gICAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAgIC50aGVuKChyZXNwb25zZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBTVkdcbiAgICAgICAgICAgIHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gQW4gdXBkYXRlIHRvIHRoZSBwYWdlIHdpbGwgcmVsb2FkIHRoZSBlbnRpcmUgc3ZnO1xuICAgICAgICAgICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIHRoZW4gcmVzZWxlY3QgdGhlIHNhbWUgc2VsZWN0ZWQgc3lsbGFibGVcbiAgICAgICAgICAgICAgLy8gaWYgYmJveGVzIGFyZSBlbmFibGVkXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRCQm94KHNwYW4sIHRoaXMuZHJhZ0hhbmRsZXIsIHRoaXMubmVvblZpZXcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVzZWxlY3QgaWYgbm8gY2hhbmdlIGlzIG1hZGVcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRCQm94KHNwYW4sIHRoaXMuZHJhZ0hhbmRsZXIsIHRoaXMubmVvblZpZXcpO1xuICAgIH1cbiAgICAvLyBjbG9zZSBtb2RhbCB3aW5kb3dcbiAgICB0aGlzLmhpZGVNb2RhbFdpbmRvdygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGJvdW5kaW5nIGJveCBzZWxlY3RlZCB3aGVuIHRoZSBlZGl0IHRleHQgbW9kYWwgaGFzIGJlZW4gY2xpY2tlZFxuICAgKi9cbiAgdXBkYXRlU2VsZWN0ZWRCQm94KFxuICAgIHNwYW46IEhUTUxTcGFuRWxlbWVudCxcbiAgICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4gICAgbmVvblZpZXc6IE5lb25WaWV3LFxuICApOiB2b2lkIHtcbiAgICB1bnNlbGVjdCgpO1xuXG4gICAgY29uc3QgYmJveElkID0gQXJyYXkuZnJvbShzcGFuLmNsYXNzTGlzdCkuZmluZChcbiAgICAgIChlKSA9PiBlICE9PSAndGV4dC1zZWxlY3QnICYmIGUgIT09ICdzZWxlY3RlZC10by1lZGl0JyxcbiAgICApO1xuXG4gICAgaWYgKChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUJCb3gnKSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmJveElkKSkge1xuICAgICAgICBjb25zdCBkaXNwbGF5UmVjdCA9IGRvY3VtZW50XG4gICAgICAgICAgLmdldEVsZW1lbnRCeUlkKGJib3hJZClcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgICAgIHNlbGVjdEJCb3goZGlzcGxheVJlY3QsIGRyYWdIYW5kbGVyLCBuZW9uVmlldyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggaG90a2V5IGluZm8gY29udGVudFxuICAgKi9cbiAgLypcbiAgcHJpdmF0ZSBvcGVuSG90a2V5TW9kYWxXaW5kb3cgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQnKSkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgYW5kIGRpcGxheSBob3RrZXkgbW9kYWwgY29udGVudFxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXMnKS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICB0aGlzLmZvY3VzTW9kYWxXaW5kb3coKTtcbiAgfTtcbiAgKi9cblxuICAvKipcbiAgICogRGVmaW5lIGV2ZW50IGxpc3RlbmVycyBmb3IgbW9kYWwgd2luZG93IGJhc2VkIG9uIG1vZGFsVmlldyB0eXBlXG4gICAqL1xuICBwcml2YXRlIGtleWRvd25MaXN0ZW5lciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsgLy8gcHJldmVudCBOZW9uIGhvdGtleSBldmVudHMgZnJvbSBmaXJpbmcgd2hlbiB1c2VyIGlzIHR5cGluZ1xuXG4gICAgc3dpdGNoICh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuQUREX1RFWFQ6XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgdGhpcy5hZGRTeWxUZXh0KCk7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHRoaXMuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgdGhpcy51cGRhdGVTeWxUZXh0KCk7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHRoaXMuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB0aGlzLmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRXZlbnQgbGlzdGVuZXIgdGhhdCBmb2N1c2VzIHRoZSBtb2RhbCB3aW5kb3cgaWYgdXNlciBjbGlja3MgYW55d2hlcmUgb3V0c2lkZSBvZiBpdFxuICAgKi9cbiAgcHJpdmF0ZSBmb2N1c01vZGFsV2luZG93ID0gZnVuY3Rpb24gKCkge1xuICAgIHN3aXRjaCAodGhpcy5tb2RhbFdpbmRvd1ZpZXcpIHtcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkFERF9URVhUOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICAoPEhUTUxJbnB1dEVsZW1lbnQ+KFxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXQnKVxuICAgICAgICApKS5zZWxlY3QoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ET0NVTUVOVF9VUExPQUQ6XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdycpLmZvY3VzKCk7XG4gICAgfVxuICB9O1xufVxuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG5cbnZhciBieXRlVG9IZXggPSBbXTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KGFycikge1xuICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgdmFyIHV1aWQgPSAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7IC8vIENvbnNpc3RlbmN5IGNoZWNrIGZvciB2YWxpZCBVVUlELiAgSWYgdGhpcyB0aHJvd3MsIGl0J3MgbGlrZWx5IGR1ZSB0byBvbmVcbiAgLy8gb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gLSBPbmUgb3IgbW9yZSBpbnB1dCBhcnJheSB2YWx1ZXMgZG9uJ3QgbWFwIHRvIGEgaGV4IG9jdGV0IChsZWFkaW5nIHRvXG4gIC8vIFwidW5kZWZpbmVkXCIgaW4gdGhlIHV1aWQpXG4gIC8vIC0gSW52YWxpZCBpbnB1dCB2YWx1ZXMgZm9yIHRoZSBSRkMgYHZlcnNpb25gIG9yIGB2YXJpYW50YCBmaWVsZHNcblxuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHJldHVybiB1dWlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdpZnk7IiwiZXhwb3J0IGRlZmF1bHQgL14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pOyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsIi8qKiBAbW9kdWxlIERpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMgKi9cblxuaW1wb3J0ICogYXMgQ29sb3IgZnJvbSAnLi4vdXRpbHMvQ29sb3InO1xuaW1wb3J0IFpvb21IYW5kbGVyIGZyb20gJy4uL1NpbmdsZVZpZXcvWm9vbSc7XG5pbXBvcnQgeyBHcm91cGluZ1R5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncywgc2V0U2V0dGluZ3MgfSBmcm9tICcuLi91dGlscy9Mb2NhbFNldHRpbmdzJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcblxubGV0IGxhc3RHbHlwaE9wYWNpdHk6IG51bWJlciwgbGFzdEltYWdlT3BhY2l0eTogbnVtYmVyLCBsYXN0Q2lyY2xlU2l6ZTogbnVtYmVyO1xuXG4vKipcbiAqIFNldCB6b29tIGNvbnRyb2wgbGlzdGVuZXIgZm9yIGJ1dHRvbiBhbmQgc2xpZGVyXG4gKiBAcGFyYW0gem9vbUhhbmRsZXIgLSBBIFtbWm9vbUhhbmRsZXJdXSBpcyBvbmx5IG5lY2Vzc2FyeSBpbiBTaW5nbGUgUGFnZSBtb2RlIGFzIGRpdmEuanMgaGFuZGxlcyB6b29taW5nIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFpvb21Db250cm9scyAoem9vbUhhbmRsZXI/OiBab29tSGFuZGxlcik6IHZvaWQge1xuICBpZiAoem9vbUhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB6b29tU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvb21TbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICBjb25zdCB6b29tT3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvb21PdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcblxuICBjb25zdCB7IHpvb20gfSA9IGdldFNldHRpbmdzKCk7XG4gIHpvb21TbGlkZXIudmFsdWUgPSBTdHJpbmcoem9vbSk7XG4gIHpvb21PdXRwdXQudmFsdWUgPSBTdHJpbmcoem9vbSk7XG4gIHpvb21IYW5kbGVyLnpvb21Ubyh6b29tIC8gMTAwLjApO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXQtem9vbScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHpvb21PdXRwdXQudmFsdWUgPSAnMTAwJztcbiAgICB6b29tU2xpZGVyLnZhbHVlID0gJzEwMCc7XG4gICAgem9vbUhhbmRsZXIucmVzZXRab29tQW5kUGFuKCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXQtem9vbS1lYXN5LWVkaXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB6b29tT3V0cHV0LnZhbHVlID0gJzE4MCc7XG4gICAgem9vbVNsaWRlci52YWx1ZSA9ICcxODAnO1xuICAgIHpvb21IYW5kbGVyLnpvb21UbygxODAvMTAwKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gaW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICB6b29tT3V0cHV0LnZhbHVlID0gem9vbVNsaWRlci52YWx1ZTtcbiAgICB6b29tSGFuZGxlci56b29tVG8oTnVtYmVyKHpvb21PdXRwdXQudmFsdWUpIC8gMTAwLjApO1xuICB9XG5cbiAgLy8gem9vbVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGlucHV0Q2hhbmdlSGFuZGxlcik7XG4gIHpvb21TbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGlucHV0Q2hhbmdlSGFuZGxlcik7XG4gIHpvb21TbGlkZXIuZGlzYWJsZWQgPSBmYWxzZTtcblxuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZ0KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFpvb20gPSBwYXJzZUludCh6b29tT3V0cHV0LnZhbHVlKTtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ0Fycm93VXAnIHx8IGV2dC5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IFxuICAgIGV2dC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBldnQua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnKycpIHsgLy8gaW5jcmVhc2Ugem9vbSBieSAyMFxuICAgICAgY29uc3QgbmV3Wm9vbSA9IE1hdGgubWluKGN1cnJlbnRab29tICsgMjAsIHBhcnNlSW50KHpvb21TbGlkZXIuZ2V0QXR0cmlidXRlKCdtYXgnKSkpO1xuICAgICAgem9vbUhhbmRsZXIuem9vbVRvKG5ld1pvb20gLyAxMDAuMCk7XG4gICAgICB6b29tT3V0cHV0LnZhbHVlID0gU3RyaW5nKG5ld1pvb20pO1xuICAgICAgem9vbVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdab29tKTtcbiAgICB9IGVsc2UgaWYgKGV2dC5rZXkgPT09ICdfJykgeyAvLyBkZWNyZWFzZSB6b29tIGJ5IDIwXG4gICAgICBjb25zdCBuZXdab29tID0gTWF0aC5tYXgoY3VycmVudFpvb20gLSAyMCwgcGFyc2VJbnQoem9vbVNsaWRlci5nZXRBdHRyaWJ1dGUoJ21pbicpKSk7XG4gICAgICB6b29tSGFuZGxlci56b29tVG8obmV3Wm9vbSAvIDEwMC4wKTtcbiAgICAgIHpvb21PdXRwdXQudmFsdWUgPSBTdHJpbmcobmV3Wm9vbSk7XG4gICAgICB6b29tU2xpZGVyLnZhbHVlID0gU3RyaW5nKG5ld1pvb20pO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJzAnKSB7XG4gICAgICB6b29tT3V0cHV0LnZhbHVlID0gJzEwMCc7XG4gICAgICB6b29tU2xpZGVyLnZhbHVlID0gJzEwMCc7XG4gICAgICB6b29tSGFuZGxlci5yZXNldFpvb21BbmRQYW4oKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBNRUkgb3BhY2l0eSB0byB2YWx1ZSBmcm9tIHRoZSBzbGlkZXIuXG4gKiBAcGFyYW0gbWVpQ2xhc3NOYW1lIC0gQ2xhc3MgdGhhdCBjb250YWlucyB0aGUgcmVuZGVyZWQgTUVJLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlciAobWVpQ2xhc3NOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG9wYWNpdHlPdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BhY2l0eU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50O1xuICBjb25zdCBvcGFjaXR5U2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wYWNpdHlTbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIG9wYWNpdHlTbGlkZXIudmFsdWUgPSBvcGFjaXR5T3V0cHV0LnZhbHVlO1xuICAvLyB0aGlzIGlzIHdoZXJlIHdlIGxvYWQgZ2x5cGggb3BhY2l0eSBmcm9tIGxvY2FsU3RvcmFnZSBvbiBwYWdlLWxvYWRcbiAgc2V0U2V0dGluZ3MoeyBnbHlwaE9wYWNpdHk6IE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSB9KTtcblxuICAvLyBkaXNwYXkgY29ycmVjdCBzbGlkZXIgdG9nZ2xlIGRpc3BsYXkgaWNvblxuICBjb25zdCBoaWRlR2x5cGhJbWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9nZ2xlLWdseXBoLW9wYWNpdHkgPiBpbWcnKTtcbiAgaWYgKE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSA9PT0gMCkge1xuICAgIGhpZGVHbHlwaEltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9zaG93LWljb24uc3ZnYCk7XG4gICAgaGlkZUdseXBoSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdTaG93IGdseXBoJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgaGlkZUdseXBoSW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2hpZGUtaWNvbi5zdmdgKTtcbiAgICBoaWRlR2x5cGhJbWcucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0hpZGUgZ2x5cGgnKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgKChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIG1laUNsYXNzTmFtZSkpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+KS5mb3JFYWNoKGcgPT4ge1xuICAgICAgZy5zdHlsZS5vcGFjaXR5ID0gKE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSAvIDEwMC4wKS50b1N0cmluZygpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gcHJvcGVybHkgc2V0IG9wYWNpdHkgdG8gcGFnZXMnKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCByZW5kZXJlZCBNRUkgb3BhY2l0eSBidXR0b24gYW5kIHNsaWRlciBsaXN0ZW5lcnMuXG4gKiBAcGFyYW0gbWVpQ2xhc3NOYW1lIC0gQ2xhc3MgdGhhdCBjb250YWlucyB0aGUgcmVuZGVyZWQgTUVJLlxuICovXG5mdW5jdGlvbiBzZXRHbHlwaE9wYWNpdHlDb250cm9scyAobWVpQ2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgb3BhY2l0eVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGFjaXR5U2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgb3BhY2l0eU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGFjaXR5T3V0cHV0JykgYXMgSFRNTE91dHB1dEVsZW1lbnQ7XG5cbiAgY29uc3QgeyBnbHlwaE9wYWNpdHkgfSA9IGdldFNldHRpbmdzKCk7XG4gIGxhc3RHbHlwaE9wYWNpdHkgPSBnbHlwaE9wYWNpdHk7XG4gIG9wYWNpdHlTbGlkZXIudmFsdWUgPSBTdHJpbmcoZ2x5cGhPcGFjaXR5KTtcbiAgb3BhY2l0eU91dHB1dC52YWx1ZSA9IFN0cmluZyhnbHlwaE9wYWNpdHkpO1xuXG4gIGZ1bmN0aW9uIGlucHV0Q2hhbmdlT3BhY2l0eSAoKTogdm9pZCB7XG4gICAgb3BhY2l0eU91dHB1dC52YWx1ZSA9IG9wYWNpdHlTbGlkZXIudmFsdWU7XG4gICAgbGFzdEdseXBoT3BhY2l0eSA9IE51bWJlcihvcGFjaXR5U2xpZGVyLnZhbHVlKTtcbiAgICBzZXRHbHlwaE9wYWNpdHlGcm9tU2xpZGVyKG1laUNsYXNzTmFtZSk7XG4gIH1cblxuICBjb25zdCB0b2dnbGVPcGFjaXR5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1nbHlwaC1vcGFjaXR5Jyk7XG5cbiAgaWYgKGdseXBoT3BhY2l0eSA9PSAxMDApIHtcbiAgICB0b2dnbGVPcGFjaXR5QnRuLmNsYXNzTGlzdC5hZGQoJ2hpZGUtaWNvbicpO1xuICB9XG5cbiAgdG9nZ2xlT3BhY2l0eUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cbiAgICBsZXQgbmV3T3BhY2l0eTtcbiAgICBpZiAodG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUtaWNvbicpKSB7XG4gICAgICB0b2dnbGVPcGFjaXR5QnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUtaWNvbicpO1xuICAgICAgbmV3T3BhY2l0eSA9IDA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAxO1xuICAgIH1cblxuICAgIC8vIERlZmluaXRpb24gc2NhbGUgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB3aGF0IGlzIGdlbmVyYXRlZCBieSB2ZXJvdmlvXG4gICAgXG4gICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgbWVpQ2xhc3NOYW1lKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PikuZm9yRWFjaChnID0+IHtcbiAgICAgIGcuc3R5bGUub3BhY2l0eSA9IG5ld09wYWNpdHkudG9TdHJpbmcoKTtcbiAgICB9KTtcblxuICAgIGxhc3RHbHlwaE9wYWNpdHkgPSBOdW1iZXIob3BhY2l0eVNsaWRlci52YWx1ZSk7XG4gICAgb3BhY2l0eVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdPcGFjaXR5ICogMTAwKTtcbiAgICBvcGFjaXR5T3V0cHV0LnZhbHVlID0gU3RyaW5nKE1hdGgucm91bmQobmV3T3BhY2l0eSAqIDEwMCkpO1xuXG4gICAgc2V0U2V0dGluZ3MoeyBnbHlwaE9wYWNpdHk6IG5ld09wYWNpdHkgKiAxMDAgfSk7XG5cbiAgICBpbnB1dENoYW5nZU9wYWNpdHkoKTtcbiAgfSk7XG5cbiAgb3BhY2l0eVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGlucHV0Q2hhbmdlT3BhY2l0eSk7XG4gIG9wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaW5wdXRDaGFuZ2VPcGFjaXR5KTtcblxuICBvcGFjaXR5U2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBTZXQgYmFja2dyb3VuZCBpbWFnZSBvcGFjaXR5IGJ1dHRvbiBhbmQgc2xpZGVyIGxpc3RlbmVycy5cbiAqIEBwYXJhbSBiYWNrZ3JvdW5kIC0gVGhlIGJhY2tncm91bmQgaW1hZ2Ugc2VsZWN0b3IuXG4gKi9cbmZ1bmN0aW9uIHNldEJnT3BhY2l0eUNvbnRyb2xzIChiYWNrZ3JvdW5kOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmdPcGFjaXR5U2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JnT3BhY2l0eVNsaWRlcicpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGJnT3BhY2l0eU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZ09wYWNpdHlPdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcblxuICBjb25zdCB7IGltYWdlT3BhY2l0eSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgbGFzdEltYWdlT3BhY2l0eSA9IGltYWdlT3BhY2l0eTtcbiAgYmdPcGFjaXR5U2xpZGVyLnZhbHVlID0gU3RyaW5nKGltYWdlT3BhY2l0eSk7XG4gIGJnT3BhY2l0eU91dHB1dC52YWx1ZSA9IFN0cmluZyhpbWFnZU9wYWNpdHkpO1xuXG4gIGZ1bmN0aW9uIGJnSW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICBiZ09wYWNpdHlPdXRwdXQudmFsdWUgPSBiZ09wYWNpdHlTbGlkZXIudmFsdWU7XG4gICAgbGFzdEltYWdlT3BhY2l0eSA9IE51bWJlcihiZ09wYWNpdHlTbGlkZXIudmFsdWUpO1xuICAgIHNldEJnT3BhY2l0eUZyb21TbGlkZXIoYmFja2dyb3VuZCk7XG4gIH1cblxuXG4gIGNvbnN0IHRvZ2dsZUJnT3BhY2l0eUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtYmctb3BhY2l0eScpO1xuXG4gIGlmIChpbWFnZU9wYWNpdHkgPT0gMTAwKSB7XG4gICAgdG9nZ2xlQmdPcGFjaXR5QnRuLmNsYXNzTGlzdC5hZGQoJ2hpZGUtaWNvbicpO1xuICB9XG5cbiAgdG9nZ2xlQmdPcGFjaXR5QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgbGV0IG5ld09wYWNpdHk7XG5cbiAgICBpZiAodG9nZ2xlQmdPcGFjaXR5QnRuLmNsYXNzTGlzdC5jb250YWlucygnaGlkZS1pY29uJykpIHtcbiAgICAgIHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAxO1xuICAgIH1cbiAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShiYWNrZ3JvdW5kKVswXSBhcyBIVE1MRWxlbWVudClcbiAgICAgIC5zdHlsZS5vcGFjaXR5ID0gbmV3T3BhY2l0eS50b1N0cmluZygpO1xuXG4gICAgbGFzdEltYWdlT3BhY2l0eSA9IE51bWJlcihiZ09wYWNpdHlTbGlkZXIudmFsdWUpO1xuICAgIGJnT3BhY2l0eVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdPcGFjaXR5ICogMTAwKTtcbiAgICBiZ09wYWNpdHlPdXRwdXQudmFsdWUgPSBTdHJpbmcoTWF0aC5yb3VuZChuZXdPcGFjaXR5ICogMTAwKSk7XG5cbiAgICBzZXRTZXR0aW5ncyh7IGltYWdlT3BhY2l0eTogbmV3T3BhY2l0eSAqIDEwMCB9KTtcbiAgICBiZ0lucHV0Q2hhbmdlSGFuZGxlcigpO1xuICB9KTtcblxuICBiZ09wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBiZ0lucHV0Q2hhbmdlSGFuZGxlcik7XG4gIGJnT3BhY2l0eVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBiZ0lucHV0Q2hhbmdlSGFuZGxlcik7XG5cbiAgYmdPcGFjaXR5U2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEJnT3BhY2l0eUZyb21TbGlkZXIgKGJhY2tncm91bmQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmdPcGFjaXR5T3V0cHV0OiBIVE1MT3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiZ09wYWNpdHlPdXRwdXQnKTtcbiAgXG4gIHNldFNldHRpbmdzKHsgaW1hZ2VPcGFjaXR5OiBOdW1iZXIoYmdPcGFjaXR5T3V0cHV0LnZhbHVlKSB9KTtcblxuICAvLyBkaXNwYXkgY29ycmVjdCBzbGlkZXIgdGlnZ2xlIGRpc3BsYXkgaWNvblxuICBjb25zdCBoaWRlQmdJbWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9nZ2xlLWJnLW9wYWNpdHkgPiBpbWcnKTtcbiAgaWYgKE51bWJlcihiZ09wYWNpdHlPdXRwdXQudmFsdWUpID09PSAwKSB7XG4gICAgaGlkZUJnSW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3Nob3ctaWNvbi5zdmdgKTtcbiAgICBoaWRlQmdJbWcucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ1Nob3cgYmFja2dyb3VuZCBpbWFnZScpO1xuICB9XG4gIGVsc2Uge1xuICAgIGhpZGVCZ0ltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9oaWRlLWljb24uc3ZnYCk7XG4gICAgaGlkZUJnSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdIaWRlIGJhY2tncm91bmQgaW1hZ2UnKTtcbiAgfVxuXG4gIGNvbnN0IGJnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2JhY2tncm91bmR9YCk7XG4gIGlmIChiZykgYmcuc3R5bGUub3BhY2l0eSA9IFN0cmluZyhOdW1iZXIoYmdPcGFjaXR5T3V0cHV0LnZhbHVlKSAvIDEwMCk7XG59XG5cbi8qKlxuICogU2V0IGJib3ggYWRqdXN0bWVudCBjaXJjbGUgc2l6ZSBidXR0b24gYW5kIHNsaWRlciBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDaXJjbGVTaXplQ29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBjaXJjbGVTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2lyY2xlU2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgY2lyY2xlT3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NpcmNsZU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50O1xuXG4gIGNvbnN0IHsgY2lyY2xlU2l6ZSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgbGFzdENpcmNsZVNpemUgPSBjaXJjbGVTaXplO1xuICBjaXJjbGVTbGlkZXIudmFsdWUgPSBTdHJpbmcoY2lyY2xlU2l6ZSk7XG4gIGNpcmNsZU91dHB1dC52YWx1ZSA9IFN0cmluZyhjaXJjbGVTaXplKTtcblxuICBmdW5jdGlvbiBjaXJjbGVTaXplSW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICBjaXJjbGVPdXRwdXQudmFsdWUgPSBjaXJjbGVTbGlkZXIudmFsdWU7XG4gICAgbGFzdENpcmNsZVNpemUgPSBOdW1iZXIoY2lyY2xlU2xpZGVyLnZhbHVlKTtcbiAgICBzZXRTZXR0aW5ncyh7IGNpcmNsZVNpemU6IE51bWJlcihsYXN0Q2lyY2xlU2l6ZSkgfSk7XG4gICAgY29uc3QgcmVzaXplUG9pbnRzID0gZDMuc2VsZWN0QWxsKCcucmVzaXplUG9pbnQnKTtcbiAgICBpZiAoIXJlc2l6ZVBvaW50cy5lbXB0eSgpKSB7XG4gICAgICByZXNpemVQb2ludHMuYXR0cigncicsIGxhc3RDaXJjbGVTaXplKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldC1jaXJjbGUtc2l6ZScpO1xuICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0U2l6ZSA9IDI1OyBcbiAgICAvLyBpZiBoYXMgcmVzaXplUG9pbnRzIGRpc3BsYXllZFxuICAgIGNvbnN0IHJlc2l6ZVBvaW50cyA9IGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50Jyk7XG4gICAgaWYgKCFyZXNpemVQb2ludHMuZW1wdHkoKSkge1xuICAgICAgcmVzaXplUG9pbnRzLmF0dHIoJ3InLCBkZWZhdWx0U2l6ZSk7XG4gICAgfVxuXG4gICAgbGFzdENpcmNsZVNpemUgPSBOdW1iZXIoZGVmYXVsdFNpemUpO1xuICAgIGNpcmNsZVNsaWRlci52YWx1ZSA9IFN0cmluZyhkZWZhdWx0U2l6ZSk7XG4gICAgY2lyY2xlT3V0cHV0LnZhbHVlID0gU3RyaW5nKGRlZmF1bHRTaXplKTtcblxuICAgIHNldFNldHRpbmdzKHsgY2lyY2xlU2l6ZTogTnVtYmVyKGRlZmF1bHRTaXplKSB9KTtcbiAgICBjaXJjbGVTaXplSW5wdXRDaGFuZ2VIYW5kbGVyKCk7XG4gIH0pO1xuXG4gIGNpcmNsZVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNpcmNsZVNpemVJbnB1dENoYW5nZUhhbmRsZXIpO1xuICBjaXJjbGVTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2lyY2xlU2l6ZUlucHV0Q2hhbmdlSGFuZGxlcik7XG5cbiAgY2lyY2xlU2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cbi8qKlxuICogVXBkYXRlIGhpZ2hsaWdodCBkcm9wZG93biBvcHRpb24gKyBkaXNwbGF5XG4gKiBAcGFyYW0gZ3JvdXAgLSBHcm91cGluZ1R5cGUgLyBUaGUgRE9NIGVsZW1lbnQncyBpZCBhcyBgaGlnaGxpZ2h0LSR7aWR9YFxuICovXG5mdW5jdGlvbiB1cGRhdGVIaWdobGlnaHRPcHRpb24gKGdyb3VwOiBHcm91cGluZ1R5cGUpOiB2b2lkIHtcbiAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGhpZ2hsaWdodC0ke2dyb3VwfWApO1xuICBjb25zdCBkcm9wZG93biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKTtcbiAgY29uc3QgaGlnaGxpZ2h0VHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtdHlwZScpO1xuXG4gIC8vIHNhdmUgaGlnaGxpZ2h0IG9wdGlvbiB0byBsb2NhbFN0b3JhZ2VcbiAgc2V0U2V0dGluZ3MoeyBoaWdobGlnaHRNb2RlOiBncm91cCB9KTtcblxuICBkcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmZvckVhY2goZWxlbSA9PiB7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcbiAgfSk7XG5cbiAgaWYgKGdyb3VwID09PSAnbm9uZScpIHtcbiAgICBoaWdobGlnaHRUeXBlLnRleHRDb250ZW50ID0gJ1xceEEwLSBPZmYnO1xuICAgIENvbG9yLnVuc2V0R3JvdXBpbmdIaWdobGlnaHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIG9wdGlvbi5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcblxuICAvLyBUZXh0IGNvbnRlbnQgaXMgdGhlIGdyb3VwaW5nIHR5cGUgY2FwaXRhbGl6ZWRcbiAgaGlnaGxpZ2h0VHlwZS50ZXh0Q29udGVudCA9IGBcXHhBMC0gJHtncm91cFswXS50b1VwcGVyQ2FzZSgpICsgZ3JvdXAuc2xpY2UoMSl9YDtcbiAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoZ3JvdXApO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHQgbW9kZSBjaG9zZW4gYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIaWdobGlnaHRUeXBlICgpOiBHcm91cGluZ1R5cGUge1xuICBjb25zdCBoaWdobGlnaHRUeXBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC10eXBlJyk7XG4gIHJldHVybiBoaWdobGlnaHRUeXBlLnRleHRDb250ZW50LnNsaWNlKDMpLnRvTG93ZXJDYXNlKCkgYXMgR3JvdXBpbmdUeXBlO1xufVxuXG4vKipcbiAqIFNldCBjbGljayBsaXN0ZW5lciBmb3IgZWFjaCBoaWdobGlnaHQgZHJvcGRvd24gb3B0aW9uXG4gKiBAcGFyYW0gZ3JvdXAgLSBHcm91cGluZ1R5cGUgLyBUaGUgRE9NIGVsZW1lbnQncyBpZCBhcyBgaGlnaGxpZ2h0LSR7aWR9YFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0T3B0aW9uIChncm91cDogR3JvdXBpbmdUeXBlKTogdm9pZCB7XG4gIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBoaWdobGlnaHQtJHtncm91cH1gKTtcbiAgb3B0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbihncm91cCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENsaWNrYXdheSBsaXN0ZW5lciBmb3IgdGhlIGhpZ2hsaWdodCBkcm9wZG93bi5cbiAqL1xuZnVuY3Rpb24gaGlnaGxpZ2h0Q2xpY2thd2F5ICgpOiB2b2lkIHtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZ2hsaWdodENsaWNrYXdheSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbn1cblxuLyoqXG4gKiBTZXQgbGlzdGVuZXIgb24gc3RhZmYgaGlnaGxpZ2h0aW5nIGNoZWNrYm94LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0Q29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBkcm9wZG93biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LWJ1dHRvbicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkcm9wZG93bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcbiAgICBpZiAoZHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZ2hsaWdodENsaWNrYXdheSk7XG5cbiAgICAgIHNldEhpZ2hsaWdodE9wdGlvbignY29sdW1uJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ3N0YWZmJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ3N5bGxhYmxlJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ25ldW1lJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ2xheWVyRWxlbWVudCcpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCdub25lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWdobGlnaHRDbGlja2F3YXkpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICAqIFNldCBsaXN0ZW5lciBvbiBrZXkgc2hvcnRjdXRzIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiBoaWdobGlnaHRzXG4gICogXG4gICogVGhlIGN1cnJlbnQgcGxhbiBpcyB0byB1c2UgdGhlIGtleXMgcSwgdywgZSwgciwgdCwgYW5kIHlcbiAgKi9cbmZ1bmN0aW9uIHNldEhpZ2hsaWdodEtleUNvbnRyb2xzICgpOiB2b2lkIHtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgIC8vIFByZXZlbnQgY21kL2N0cmwrciBmcm9tIGNoYW5naW5nIGhpZ2hsaWdodCBvcHRpb25cbiAgICBpZiAoZXZ0Lm1ldGFLZXkpIHJldHVybjtcblxuICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgY2FzZSAncSc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignc3RhZmYnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3JzpcbiAgICAgICAgdXBkYXRlSGlnaGxpZ2h0T3B0aW9uKCdzeWxsYWJsZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2UnOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ25ldW1lJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncic6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignbGF5ZXJFbGVtZW50Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndCc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignc2VsZWN0aW9uJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAneSc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignbm9uZScpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0U2VsZWN0aW9uQ29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBoaWdobGlnaHRTZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LXNlbGVjdGlvbicpO1xuICBoaWdobGlnaHRTZWxlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC1kcm9wZG93bicpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcbiAgICB9KTtcbiAgICBoaWdobGlnaHRTZWxlY3Rpb24uY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0LXNlbGVjdGVkJyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC10eXBlJykudGV4dENvbnRlbnQgPSAnIC0gU2VsZWN0aW9uJztcbiAgICBDb2xvci5zZXRHcm91cGluZ0hpZ2hsaWdodCgnc2VsZWN0aW9uJyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc2V0IHRoZSBoaWdobGlnaHQgZm9yIGRpZmZlcmVudCB0eXBlcyBiYXNlZCBvbiB0aGUgJ2hpZ2hsaWdodC1zZWxlY3RlZCcgY2xhc3MgaW4gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUhpZ2hsaWdodCAoKTogdm9pZCB7XG4gIGxldCBoaWdobGlnaHRJZDogc3RyaW5nO1xuICB0cnkge1xuICAgIGhpZ2hsaWdodElkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmlkO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaGlnaGxpZ2h0SWQgPSAnJztcbiAgfVxuICBzd2l0Y2ggKGhpZ2hsaWdodElkKSB7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LWNvbHVtbic6XG4gICAgICBDb2xvci5zZXRHcm91cGluZ0hpZ2hsaWdodCgnY29sdW1uJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtc3RhZmYnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N0YWZmJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtc3lsbGFibGUnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N5bGxhYmxlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtbmV1bWUnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ25ldW1lJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtbGF5ZXJFbGVtZW50JzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCdsYXllckVsZW1lbnQnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2hpZ2hsaWdodC1zZWxlY3Rpb24nOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3NlbGVjdGlvbicpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIENvbG9yLnVuc2V0R3JvdXBpbmdIaWdobGlnaHQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBsaXN0ZW5lciBvbiBidXJnZXIgbWVudSBmb3Igc21hbGxlciBzY3JlZW5zLlxuICovXG5mdW5jdGlvbiBzZXRCdXJnZXJDb250cm9scyAoKTogdm9pZCB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidXJnZXJNZW51JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1cmdlck1lbnUnKS5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmF2TWVudScpLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScpO1xuICB9KTtcbn1cblxuLyoqIFxuICogU2V0IGxpc3RlbmVyIGZvciBcIkRpc3BsYXkgQWxsXCIgYnV0dG9uIGluIERpc3BsYXkgcGFuZWwuXG4qL1xuZnVuY3Rpb24gc2V0RGlzcGxheUFsbExpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBzZWxlY3RBbGxCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGlzcGxheS1hbGwtYnRuJyk7XG4gIHNlbGVjdEFsbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAvLyBhdCB0aGUgbW9tZW50LCBjbGFzc25hbWUgJ3NlbGVjdGVkJyBpcyBvbmx5IHVzZWQgZm9yIHRyYWNraW5nIHB1cnBvc2VzXG4gICAgaWYgKHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgIHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgc2VsZWN0QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgICBjb25zdCBvcHRpb25zID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGVja2JveC1jb250YWluZXI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lO1wiXSkgPiAuY2hlY2tib3gnKTtcblxuICAgICAgQXJyYXkuZnJvbShvcHRpb25zKS5mb3JFYWNoKChvcHRpb246IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGVja2VkKSBvcHRpb24uY2xpY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgc2VsZWN0QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gICAgICBjb25zdCBvcHRpb25zID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGVja2JveC1jb250YWluZXI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lO1wiXSkgPiAuY2hlY2tib3gnKTtcbiAgICAgIFxuICAgICAgQXJyYXkuZnJvbShvcHRpb25zKS5mb3JFYWNoKChvcHRpb246IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKCFvcHRpb24uY2hlY2tlZCkgb3B0aW9uLmNsaWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKiogXG4gKiBVcGRhdGUgYERpc3BsYXkgQWxsYCBidXR0b24gc3RhdHVzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlBbGxCdG4oKTogdm9pZCB7XG4gIGNvbnN0IGRpc3BsYXlBbGxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheS1hbGwtYnRuJyk7XG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlJbmZvJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgZGlzcGxheUJCb3hlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5QkJveCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGRpc3BsYXlUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlUZXh0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgZGlzcGxheUVyckxvZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5LWVycm9ycycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgLy8gaWYgYWxsIG9wdGlvbnMgYXJlIHNlbGVjdGVkLFxuICAvLyBzZXQgXCJEaXNwbGF5L0hpZGUgQWxsXCIgYnV0dG9uIHRvIFwiSGlkZSBBbGxcIi5cbiAgaWYgKGRpc3BsYXlJbmZvPy5jaGVja2VkICYmIGRpc3BsYXlCQm94ZXM/LmNoZWNrZWQgJiYgXG4gICAgZGlzcGxheVRleHQ/LmNoZWNrZWQgJiYgZGlzcGxheUVyckxvZz8uY2hlY2tlZCkge1xuICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgXCJEaXNwbGF5L0hpZGUgQWxsXCIgYnV0dG9uIGlzIGluIFwiSGlkZSBBbGxcIiBtb2RlLCBzZXQgaXQgdG8gXCJEaXNwbGF5IEFsbFwiIG1vZGVcbiAgICBpZiAoZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgIGRpc3BsYXlBbGxCdG4uaW5uZXJIVE1MID0gJ0Rpc3BsYXkgQWxsJztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkIGhpZ2hsaWdodCBzZXR0aW5ncyBmcm9tIGxvY2FsU3RvcmFnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEhpZ2hsaWdodFNldHRpbmdzICgpOiB2b2lkIHtcbiAgY29uc3QgeyBoaWdobGlnaHRNb2RlIH0gPSBnZXRTZXR0aW5ncygpO1xuICB1cGRhdGVIaWdobGlnaHRPcHRpb24oaGlnaGxpZ2h0TW9kZSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBsaXN0ZW5lcnMgYW5kIGNvbnRyb2xzIGZvciBkaXNwbGF5IHBhbmVsLlxuICogQHBhcmFtIHtzdHJpbmd9IG1laUNsYXNzTmFtZSAtIFRoZSBjbGFzcyB1c2VkIHRvIHNpZ25pZml5IHRoZSBNRUkgZWxlbWVudChzKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYWNrZ3JvdW5kIC0gVGhlIGNsYXNzIHVzZWQgdG8gc2lnbmlmeSB0aGUgYmFja2dyb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXREaXNwbGF5Q29udHJvbHMgKG1laUNsYXNzTmFtZTogc3RyaW5nLCBiYWNrZ3JvdW5kOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0R2x5cGhPcGFjaXR5Q29udHJvbHMobWVpQ2xhc3NOYW1lKTtcbiAgc2V0QmdPcGFjaXR5Q29udHJvbHMoYmFja2dyb3VuZCk7XG4gIHNldEhpZ2hsaWdodENvbnRyb2xzKCk7XG4gIHNldEJ1cmdlckNvbnRyb2xzKCk7XG4gIHNldEhpZ2hsaWdodEtleUNvbnRyb2xzKCk7XG4gIHNldERpc3BsYXlBbGxMaXN0ZW5lcigpO1xuICBsb2FkSGlnaGxpZ2h0U2V0dGluZ3MoKTtcblxuICBjb25zdCBkaXNwbGF5Q29udGVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUNvbnRlbnRzJyk7XG4gIGNvbnN0IHRvZ2dsZURpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlRGlzcGxheScpO1xuICBjb25zdCBkaXNwbGF5SGVhZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlIZWFkZXInKTtcblxuICBkaXNwbGF5SGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIC8vIGlmIGRpc3BsYXkgcGFuZWwgaXMgY2xvc2VkLCBvcGVuIGl0XG4gICAgaWYgKGRpc3BsYXlDb250ZW50cy5jbGFzc0xpc3QuY29udGFpbnMoJ2Nsb3NlZCcpKSB7XG4gICAgICBkaXNwbGF5Q29udGVudHMuY2xhc3NMaXN0LnJlbW92ZSgnY2xvc2VkJyk7XG4gICAgICBkaXNwbGF5Q29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwLjVlbSAwLjc1ZW0nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRpc3BsYXlDb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJztcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0b2dnbGVEaXNwbGF5LnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93bmApO1xuICAgIH0gXG4gICAgLy8gaWYgZGlzcGxheSBwYW5lbCBpcyBvcGVuLCBjbG9zZSBpdFxuICAgIGVsc2Uge1xuICAgICAgZGlzcGxheUNvbnRlbnRzLmNsYXNzTGlzdC5hZGQoJ2Nsb3NlZCcpO1xuICAgICAgZGlzcGxheUNvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZGlzcGxheUNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMHB4JztcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0b2dnbGVEaXNwbGF5LnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tc2lkZWApO1xuICAgIH1cbiAgfSk7XG59XG5cbiIsImltcG9ydCAqIGFzIENvbnRlbnRzIGZyb20gJy4vQ29udGVudHMnO1xuaW1wb3J0ICogYXMgR3JvdXBpbmcgZnJvbSAnLi9Hcm91cGluZyc7XG5pbXBvcnQgTm90aWZpY2F0aW9uIGZyb20gJy4uL3V0aWxzL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgU3BsaXRTdGFmZkhhbmRsZXIgfSBmcm9tICcuL1N0YWZmVG9vbHMnO1xuaW1wb3J0IHsgU3BsaXROZXVtZUhhbmRsZXIgfSBmcm9tICcuL05ldW1lVG9vbHMnO1xuaW1wb3J0IHtcbiAgQ2hhaW5BY3Rpb24sXG4gIENoYW5nZVN0YWZmQWN0aW9uLFxuICBEaXNwbGFjZUNsZWZPY3RhdmVBY3Rpb24sXG4gIEVkaXRvckFjdGlvbixcbiAgTWF0Y2hIZWlnaHRBY3Rpb24sXG4gIFJlbW92ZUFjdGlvbixcbiAgU2V0QWN0aW9uLFxuICBTZXRDbGVmQWN0aW9uLFxuICBTZXRMaXF1ZXNjZW50QWN0aW9uLFxufSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBnZXRTdGFmZkJCb3ggfSBmcm9tICcuLi91dGlscy9TZWxlY3RUb29scyc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvdywgTW9kYWxXaW5kb3dWaWV3IH0gZnJvbSAnLi4vdXRpbHMvTW9kYWxXaW5kb3cnO1xuXG4vKipcbiAqIFRoZSBOZW9uVmlldyBwYXJlbnQgdG8gY2FsbCBlZGl0b3IgYWN0aW9ucy5cbiAqL1xubGV0IG5lb25WaWV3OiBOZW9uVmlldztcblxuLyoqXG4gKiBJbml0aWFsaXplIE5lb25WaWV3LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdE5lb25WaWV3KHZpZXc6IE5lb25WaWV3KTogdm9pZCB7XG4gIG5lb25WaWV3ID0gdmlldztcbiAgR3JvdXBpbmcuaW5pdE5lb25WaWV3KHZpZXcpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBpbmNsaW5hdHVtIHBhcmFtZXRlciBvZiBhIG5ldW1lIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuc2V0SW5jbGluYXR1bUFjdGlvbihpZDogc3RyaW5nKTogU2V0QWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246ICdzZXQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgYXR0clR5cGU6ICd0aWx0JyxcbiAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgdmlyZ2EgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRWaXJnYUFjdGlvbihpZDogc3RyaW5nKTogU2V0QWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246ICdzZXQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgYXR0clR5cGU6ICd0aWx0JyxcbiAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgcmV2ZXJzZWQgdmlyZ2EgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKGlkOiBzdHJpbmcpOiBTZXRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldCcsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBsaXF1ZXNjZW50X2Nsb2Nrd2lzZSBwYXJhbWV0ZXIgb2YgYSBuZXVtZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24oaWQ6IHN0cmluZyk6IFNldEFjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgYWN0aW9uOiAnc2V0JyxcbiAgICBwYXJhbToge1xuICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgIGF0dHJUeXBlOiAnY3VydmUnLFxuICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBsaXF1ZXNjZW50X2FudGljbG9ja3dpc2UgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbihcbiAgaWQ6IHN0cmluZyxcbik6IFNldExpcXVlc2NlbnRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldExpcXVlc2NlbnQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgY3VydmU6ICcnLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKiBFdmVudCBoYW5kbGVyIGZvciBkZWxldGUgYnV0dG9uIHByZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUJ1dHRvbkhhbmRsZXIoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gIGlmIChldnQua2V5ID09PSAnZCcgfHwgZXZ0LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcbiAgICByZW1vdmVIYW5kbGVyKCk7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmQgdGhlIGV4dHJhIG9wdGlvbnMgbWVudS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTogdm9pZCB7XG4gIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gIGNvbnN0IGV4dHJhRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKTtcbiAgaWYgKG1vcmVFZGl0KSB7XG4gICAgbW9yZUVkaXQuaW5uZXJIVE1MID0gJyc7XG4gICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgfVxuICBpZiAoZXh0cmFFZGl0KSB7XG4gICAgZXh0cmFFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgIGV4dHJhRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICB9XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRlbGV0ZUJ1dHRvbkhhbmRsZXIpO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSByZW1vdmluZyBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSGFuZGxlcigpOiB2b2lkIHtcbiAgY29uc3QgdG9SZW1vdmU6IFJlbW92ZUFjdGlvbltdID0gW107XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgc2VsZWN0ZWQuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgIGVsZW0gPSBlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpO1xuICAgIH1cbiAgICBpZiAoZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2FjY2lkJykpIHtcbiAgICAgIGVsZW0gPSBlbGVtLmNsb3Nlc3QoJy5hY2NpZCcpO1xuICAgIH1cbiAgICBpZiAoZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSkge1xuICAgICAgZWxlbSA9IGVsZW0uY2xvc2VzdCgnLmRpdkxpbmUnKTtcbiAgICB9XG4gICAgdG9SZW1vdmUucHVzaCh7XG4gICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBDaGFpbkFjdGlvbiA9IHtcbiAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgcGFyYW06IHRvUmVtb3ZlLFxuICB9O1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIG5lb25WaWV3LmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigoKSA9PiB7XG4gICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gaGFuZGxlIHJlLWFzc29jaWF0aW5nIGVsZW1lbnRzIHRvIHRoZSBuZWFyZXN0IHN0YWZmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VTdGFmZkhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHRvQ2hhbmdlOiBDaGFuZ2VTdGFmZkFjdGlvbltdID0gW107XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgc2VsZWN0ZWQuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIHRvQ2hhbmdlLnB1c2goe1xuICAgICAgYWN0aW9uOiAnY2hhbmdlU3RhZmYnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b0NoYW5nZSxcbiAgfTtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBuZW9uVmlldy5lZGl0KGNoYWluQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKCkgPT4ge1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSBpbnNlcnRpbmcgZGl2aXNpbyBvciBhY2NpZGVudGFsIGludG8gbmVhcmVzdCBzeWxsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHRvSW5zZXJ0OiBFZGl0b3JBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICB0b0luc2VydC5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ2luc2VydFRvU3lsbGFibGUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBDaGFpbkFjdGlvbiA9IHtcbiAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgcGFyYW06IHRvSW5zZXJ0LFxuICB9O1xuICBuZW9uVmlld1xuICAgIC5lZGl0KGNoYWluQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0luc2VydCBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignSW5zZXJ0IEZhaWxlZCBYb1gnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gaGFuZGxlIG1vdmluZyBkaXZpc2lvIG9yIGFjY2lkZW50YWwgb3V0IG9mIHN5bGxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlT3V0c2lkZVN5bGxhYmxlSGFuZGxlcigpOiB2b2lkIHtcbiAgY29uc3QgdG9Nb3ZlOiBFZGl0b3JBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICB0b01vdmUucHVzaCh7XG4gICAgICBhY3Rpb246ICdtb3ZlT3V0c2lkZVN5bGxhYmxlJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbS5pZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuICBjb25zdCBjaGFpbkFjdGlvbjogQ2hhaW5BY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b01vdmUsXG4gIH07XG4gIG5lb25WaWV3XG4gICAgLmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTW92ZSBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTW92ZSBGYWlsZWQgWG9YJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIG1hdGNoIGJib3ggaGVpZ2h0IHRvIHRoZSBzZWxlY3RlZCBiYm94XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEhlaWdodEhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgaWYgKHNlbGVjdGVkLmxlbmd0aCA+IDEpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAnQ2Fubm90IG1hdGNoIGhlaWdodCB0byBtdWx0aXBsZSBiYm94JyxcbiAgICAgICdlcnJvcicsXG4gICAgKTtcbiAgfVxuICBjb25zdCB0b0NoYW5nZTogTWF0Y2hIZWlnaHRBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnbWF0Y2hIZWlnaHQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IHNlbGVjdGVkWzBdLmlkLFxuICAgIH0sXG4gIH07XG5cbiAgbmVvblZpZXcuZWRpdCh0b0NoYW5nZSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0hlaWdodCBNYXRjaCBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdIZWlnaHQgTWF0Y2ggRmFpbGVkIFhvWCcsICdlcnJvcicpO1xuICAgIH1cbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgQWRkIFN5bCBUZXh0IG1vZGFsIHdpbmRvdyB3aXRoIFVJIGZvciBlbnRlcmluZyBzeWxsYWJsZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBvcGVuQWRkU3lsV2luZG93KCk6IHZvaWQge1xuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZW9uVmlldy5tb2RhbDtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5BRERfVEVYVCk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQWRkU3lsTGlzdGVuZXIoKTogdm9pZCB7XG4gIGNvbnN0IGFkZFN5bCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGRTeWwnKTtcbiAgYWRkU3lsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5BZGRTeWxXaW5kb3cpO1xuICBhZGRTeWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkFkZFN5bFdpbmRvdyk7XG59XG5cbmZ1bmN0aW9uIGFkZERlbGV0ZUxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBkZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlJyk7XG5cbiAgaWYgKGRlbCkge1xuICAgIGRlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuICAgIGRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuXG4gICAgLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgb3V0c2lkZSB0aGUgaWYgY29uZGl0aW9uP1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRlbGV0ZUJ1dHRvbkhhbmRsZXIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBjaGFuZ2VTdGFmZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFuZ2VTdGFmZicpO1xuICBjaGFuZ2VTdGFmZj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFuZ2VTdGFmZkhhbmRsZXIpO1xuICBjaGFuZ2VTdGFmZj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFuZ2VTdGFmZkhhbmRsZXIpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgaW5wdXRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlQ29sdW1uSW5mbygpOiB2b2lkIHtcbiAgY29uc3QgY29sSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgc3RhdmVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmLnNlbGVjdGVkJyk7XG4gIGxldCBjb2xJbmZvOiBudW1iZXI7XG4gIGZvciAoY29uc3Qgc3RhZmYgb2Ygc3RhdmVzKSB7XG4gICAgY29uc3QgaGFzQ29sdW1uID0gQXJyYXkuZnJvbShzdGFmZi5jbGFzc0xpc3QpXG4gICAgICAuam9pbignICcpXG4gICAgICAubWF0Y2goL1xcYmNvbHVtbihcXGQrKVxcYi8pO1xuICAgIGlmIChoYXNDb2x1bW4pIHtcbiAgICAgIGNvbnN0IHN0YWZmQ29sID0gcGFyc2VJbnQoaGFzQ29sdW1uWzFdLCAxMCk7XG4gICAgICBpZiAoY29sSW5mbyAmJiBjb2xJbmZvICE9IHN0YWZmQ29sKSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLXdhcm5pbmcnKTtcbiAgICAgICAgd2FybmluZy5pbm5lclRleHQgPSAnVGhlIHNlbGVjdGVkIHN0YXZlcyBhcmUgbm90IG9mIHRoZSBzYW1lIGNvbHVtbiEnO1xuICAgICAgICBjb2xJbmZvID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xJbmZvID0gc3RhZmZDb2w7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb2xJbmZvKSBjb2xJbnB1dC52YWx1ZSA9IGNvbEluZm8udG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBBZGQgY29sdW1uIGluZm8gZWRpdCBoYW5kbGVyIGZvciBjb2x1bW4gaW5mbyBlZGl0b3JcbiAqL1xuZnVuY3Rpb24gYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCBkZWNyZW1lbnRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAnY29sLWRlY3JlbWVudCcsXG4gICkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGNvbnN0IGluY3JlbWVudEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICdjb2wtaW5jcmVtZW50JyxcbiAgKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgY29uc3QgY29uZmlybUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICdjb2wtY29uZmlybScsXG4gICkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGNvbnN0IGNvbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbC1pbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgZGVjcmVtZW50QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZU51bWJlcigtMSk7XG4gIH0pO1xuXG4gIGluY3JlbWVudEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB1cGRhdGVOdW1iZXIoMSk7XG4gIH0pO1xuXG4gIC8vIEFkZCBjb2x1bW4gaW5mbyBlZGl0IGhhbmRsZXJcbiAgY29uZmlybUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b1NldENvbHVtbjogRWRpdG9yQWN0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzdGF2ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhZmYuc2VsZWN0ZWQnKTtcbiAgICBzdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICAgIHRvU2V0Q29sdW1uLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogc3RhZmYuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICd0eXBlJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICdjb2x1bW4nICsgY29sSW5wdXQudmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBjaGFpbkFjdGlvbjogQ2hhaW5BY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgICBwYXJhbTogdG9TZXRDb2x1bW4sXG4gICAgfTtcbiAgICBuZW9uVmlld1xuICAgICAgLmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdDb2x1bW4gVmFsdWUgVXBkYXRlIFN1Y2Nlc3MnLFxuICAgICAgICAgICAgJ3N1Y2Nlc3MnLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgJ0NvbHVtbiBWYWx1ZSBVcGRhdGUgRmFpbGVkIFhvWCcsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZU51bWJlcihjaGFuZ2U6IG51bWJlcikge1xuICAgIGNvbnN0IG1pbk51bSA9IDE7XG4gICAgY29uc3QgbWF4TnVtID0gNTtcbiAgICBsZXQgY3VycmVudFZhbHVlID0gcGFyc2VJbnQoY29sSW5wdXQudmFsdWUsIDEwKSB8fCAwO1xuICAgIGN1cnJlbnRWYWx1ZSArPSBjaGFuZ2U7XG5cbiAgICBjdXJyZW50VmFsdWUgPSBNYXRoLm1pbihNYXRoLm1heChjdXJyZW50VmFsdWUsIG1pbk51bSksIG1heE51bSk7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS50b1N0cmluZygpICE9IGNvbElucHV0LnZhbHVlKVxuICAgICAgY29uZmlybUJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgY29sSW5wdXQudmFsdWUgPSBjdXJyZW50VmFsdWUudG9TdHJpbmcoKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHNldCB0aGUgSFRNTCBjb250ZW50IG9mIGVkaXQgY29udHJvbHM6IGVpdGhlciAjbW9yZUVkaXQgb3IgI2V4dHJhRWRpdFxuICpcbiAqIEBwYXJhbSB7J21vcmVFZGl0JyB8ICdleHRyYUVkaXQnfSBlZGl0VHlwZSAtIFRoZSB0eXBlIG9mIGVkaXQgY29udHJvbHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50cyAtIFRoZSBpbm5lckhUTUwgY29udGVudHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVwbGFjZSAtIElzIHRoZSBpbm5lckhUTUwgYmVpbmcgcmVwbGFjZWQsIG9yIGJlaW5nIGFkZGVkIHRvP1xuICovXG5mdW5jdGlvbiBzZXRFZGl0Q29udHJvbHMoXG4gIGVkaXRUeXBlOiAnbW9yZUVkaXQnIHwgJ2V4dHJhRWRpdCcsXG4gIGNvbnRlbnRzOiBzdHJpbmcsXG4gIHJlcGxhY2UgPSB0cnVlLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0VHlwZSk7XG5cbiAgaWYgKGVkaXQpIHtcbiAgICBlZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgaWYgKHJlcGxhY2UpIGVkaXQuaW5uZXJIVE1MID0gY29udGVudHM7XG4gICAgZWxzZSBlZGl0LmlubmVySFRNTCArPSBjb250ZW50cztcbiAgfVxufVxuXG4vKipcbiAqIFRyaWdnZXIgdGhlIGV4dHJhIG5jIGFjdGlvbiBtZW51IGZvciBhIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJOY0FjdGlvbnMobmM6IFNWR0dyYXBoaWNzRWxlbWVudCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG5cbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLmRlZmF1bHRBY3Rpb25Db250ZW50cyk7XG4gIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMubmNBY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1B1bmN0dW0uZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zZXRJbmNsaW5hdHVtID0gdW5zZXRJbmNsaW5hdHVtQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2EgPSB1bnNldFZpcmdhQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2FSZXZlcnNlZCA9IHVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24oXG4gICAgICAgIG5jLmlkLFxuICAgICAgKTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0SW5jbGluYXR1bSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYVJldmVyc2VkLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNJbmNsaW5hdHVtLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2EgPSB1bnNldFZpcmdhQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2FSZXZlcnNlZCA9IHVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24oXG4gICAgICAgIG5jLmlkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNldEluY2xpbmF0dW06IFNldEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IG5jLmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAndGlsdCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnc2UnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0VmlyZ2EsXG4gICAgICAgICAgICAgIHVuc2V0VmlyZ2FSZXZlcnNlZCxcbiAgICAgICAgICAgICAgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLFxuICAgICAgICAgICAgICBzZXRJbmNsaW5hdHVtLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjVmlyZ2EuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0SW5jbGluYXR1bSA9IHVuc2V0SW5jbGluYXR1bUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24oXG4gICAgICAgIG5jLmlkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNldFZpcmdhOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3MnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0VmlyZ2FSZXZlcnNlZCxcbiAgICAgICAgICAgICAgdW5zZXRJbmNsaW5hdHVtLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHNldFZpcmdhLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjVmlyZ2FSZXZlcnNlZC5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKFxuICAgICAgICBuYy5pZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXRWaXJnYVJldmVyc2VkOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ24nLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0SW5jbGluYXR1bSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYSxcbiAgICAgICAgICAgICAgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLFxuICAgICAgICAgICAgICBzZXRWaXJnYVJldmVyc2VkLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjTGlxdWVzY2VudENsb2Nrd2lzZS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKFxuICAgICAgICBuYy5pZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXRMaXF1ZXNjZW50Q2xvY2t3aXNlOiBTZXRMaXF1ZXNjZW50QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRMaXF1ZXNjZW50JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IG5jLmlkLFxuICAgICAgICAgIGN1cnZlOiAnYycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgbmVvblZpZXdcbiAgICAgICAgLmVkaXQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgICAgICAgICAgcGFyYW06IFtcbiAgICAgICAgICAgICAgdW5zZXRJbmNsaW5hdHVtLFxuICAgICAgICAgICAgICB1bnNldFZpcmdhLFxuICAgICAgICAgICAgICB1bnNldFZpcmdhUmV2ZXJzZWQsXG4gICAgICAgICAgICAgIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCBzZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZTogU2V0TGlxdWVzY2VudEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0TGlxdWVzY2VudCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBjdXJ2ZTogJ2EnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0SW5jbGluYXR1bSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYVJldmVyc2VkLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgbmV1bWUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJOZXVtZUFjdGlvbnMoKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdE5ldW1lQWN0aW9uQ29udGVudHMpO1xuICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLm5ldW1lQWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIGNvbnN0IG5ldW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkJyk7XG4gIGlmIChuZXVtZS5sZW5ndGggIT09IDEpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnTW9yZSB0aGFuIG9uZSBuZXVtZSBzZWxlY3RlZCEgQ2Fubm90IHRyaWdnZXIgTmV1bWUgQ2xpY2tTZWxlY3QgYWN0aW9ucy4nLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVE9ETyBhZGQgdHJpZ2dlciBmb3Igc3BsaXQgYWN0aW9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGxpdC1uZXVtZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IG5ldW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5ldW1lLnNlbGVjdGVkJykgYXMgU1ZHR0VsZW1lbnQ7XG4gICAgaWYgKG5ldW1lICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IG5ldyBTcGxpdE5ldW1lSGFuZGxlcihuZW9uVmlldywgbmV1bWUpO1xuICAgICAgc3BsaXQuc3RhcnRTcGxpdCgpO1xuICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBzdGFmZiB3YXMgc2VsZWN0ZWQhJyk7XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjUGVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNQZXNTdWJwdW5jdGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNDbGl2aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1NjYW5kaWN1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoXG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQsXG4gICAgICApO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjU2NhbmRpY3VzRmxleHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNTY2FuZGljdXNTdWJwdW5jdGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNDbGltYWN1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoXG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQsXG4gICAgICApO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2xpbWFjdXNSZXN1cGludXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1RvcmN1bHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNUb3JjdWx1c1Jlc3VwaW51cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoXG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQsXG4gICAgICApO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjUG9ycmVjdHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNQb3JyZWN0dXNGbGV4dXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1BvcnJlY3R1c1N1YnB1bmN0aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1ByZXNzdXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbmdlR3JvdXBpbmdBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYW5nZUdyb3VwJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogbmV1bWVbMF0uaWQsXG4gICAgICAgIGNvbnRvdXI6IGNvbnRvdXIsXG4gICAgICB9LFxuICAgIH07XG4gICAgbmVvblZpZXdcbiAgICAgIC5lZGl0KGNoYW5nZUdyb3VwaW5nQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignR3JvdXBpbmcgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgc3lsbGFibGUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoc2VsZWN0aW9uVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuc3lsbGFibGVBY3Rpb25zQ29udGVudCk7XG4gIC8vIGluaXRpYWxpemUgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgaHRtbCB0byBiZSBhZGRlZCB0byBEaXNwbGF5IHBhbmVsXG4gIGxldCBleHRyYUFjdGlvbnNIVE1MID0gJyc7XG5cbiAgLy8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHNlbGVjdGlvbiB0aGF0IHdhcyBtYWRlIGJ5IHRoZSB1c2VyXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIC8vIG9ubHkgb25lIHN5bGxhYmxlIGFuZCBzeWxsYWJsZSBoYXMgbm8gPHN5bD5cbiAgICBjYXNlICdub1N5bCc6XG4gICAgICBleHRyYUFjdGlvbnNIVE1MICs9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiYWRkU3lsXCI+QWRkIFN5bGxhYmxlIFRleHQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyBvbmx5IG9uZSBzeWxsYWJsZVxuICAgIGNhc2UgJ3NpbmdsZVNlbGVjdCc6XG4gICAgICBleHRyYUFjdGlvbnNIVE1MICs9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5ldW1lc1wiPlVuZ3JvdXA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyB0d28gc3lsbGFibGVzIG9uIHNlcGFyYXRlIHN0YXZlc1xuICAgIGNhc2UgJ2xpbmthYmxlU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ0b2dnbGUtbGlua1wiPlRvZ2dsZSBMaW5rZWQgU3lsbGFibGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJjaGFuZ2VTdGFmZlwiPlJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIGJyZWFrO1xuXG4gICAgLy8gdG93IG9yIG1vcmUgc3lsbGFibGVzIG9uIG9uZSBzdGFmZlxuICAgIGNhc2UgJ211bHRpU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtZXJnZVN5bHNcIj5NZXJnZSBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvL2RlZmF1bHQgb3B0aW9uc1xuICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgZXh0cmFBY3Rpb25zSFRNTCArPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyBzZXQgY29udGVudCBvZiBhZGRpdGlvbmFsIGFjdGlvbnMgaW4gRGlzcGxheSBwYW5lbFxuICAvLyBhbmQgaW5pdGlhbGl6ZSBuZWNlc3NhcnkgbGlzdGVuZXJzXG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBleHRyYUFjdGlvbnNIVE1MLCB0cnVlKTtcbiAgYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lcigpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGV4dHJhIGxheWVyIGVsZW1lbnQgKGFjY2lkLCBkaXZMaW5lLCBjdXN0b3MsIGNsZWYpIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyhlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnY3VzdG9zJykpIHtcbiAgICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuY3VzdG9zQWN0aW9uQ29udGVudHMpO1xuICAgIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFyZW50SXNTeWxsYWJsZSA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJyk7XG4gIGNvbnN0IGxheWVyRWxlbWVudEFjdGlvbnMgPSBwYXJlbnRJc1N5bGxhYmxlXG4gICAgPyBDb250ZW50cy5sYXllckVsZW1lbnRJbkFjdGlvbkNvbnRlbnRzXG4gICAgOiBDb250ZW50cy5sYXllckVsZW1lbnRPdXRBY3Rpb25Db250ZW50cztcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgbGF5ZXJFbGVtZW50QWN0aW9ucywgZmFsc2UpO1xuXG4gIC8vIGV4dHJhIGFjdGlvbnMgZm9yIGFjY2lkIGFuZCBkaXZMaW5lXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYWNjaWQnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuYWNjaWRBY3Rpb25Db250ZW50cyk7XG4gICAgYWNjaWRPcHRpb25zTGlzdGVuZXIoZWxlbWVudCk7XG4gIH0gZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuY2xlZkFjdGlvbkNvbnRlbnRzKTtcbiAgICBjbGVmT3B0aW9uc0xpc3RlbmVyKGVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXZMaW5lJykpIHtcbiAgICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLmRpdkxpbmVBY3Rpb25Db250ZW50cyk7XG4gICAgZGl2TGluZU9wdGlvbnNMaXN0ZW5lcihlbGVtZW50KTtcbiAgfVxuICBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKCdpbnNlcnRUb1N5bGxhYmxlJylcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIpO1xuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZCgnbW92ZU91dHNpZGVTeWxsYWJsZScpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1vdmVPdXRzaWRlU3lsbGFibGVIYW5kbGVyKTtcblxuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydFRvU3lsbGFibGUnKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpbnNlcnRUb1N5bGxhYmxlSGFuZGxlcik7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKCdtb3ZlT3V0c2lkZVN5bGxhYmxlJylcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbW92ZU91dHNpZGVTeWxsYWJsZUhhbmRsZXIpO1xufVxuXG5mdW5jdGlvbiBhY2NpZE9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvRmxhdC5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VUb0ZsYXQ6IFNldEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdhY2NpZCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnZicsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihjaGFuZ2VUb0ZsYXQpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9OYXR1cmFsLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZVRvTmF0dXJhbDogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2FjY2lkJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICduJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKGNoYW5nZVRvTmF0dXJhbCk7XG4gICAgfSk7XG5cbiAgaW5pdE9wdGlvbnNMaXN0ZW5lcnMoKTtcbn1cblxuZnVuY3Rpb24gY2xlZk9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2luY3JlbWVudC1vY3RhdmUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBpbmNyZW1lbnRPY3RhdmU6IERpc3BsYWNlQ2xlZk9jdGF2ZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2Rpc3BsYWNlQ2xlZk9jdGF2ZScsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIGRpcmVjdGlvbjogJ2Fib3ZlJyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIG5lb25WaWV3XG4gICAgICAuZWRpdChpbmNyZW1lbnRPY3RhdmUsIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xlZiBvY3RhdmUgaW5jcmVtZW50ZWQuJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnTWF4aW11bSBvY3RhdmUgZGlzcGxhY2VtZW50IHJlYWNoZWQuIENsZWYgY2FuIG9ubHkgYmUgZGlzcGxhY2VkIHVwIHRvIDMgb2N0YXZlcy4nLFxuICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGVjcmVtZW50LW9jdGF2ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IGluY3JlbWVudE9jdGF2ZTogRGlzcGxhY2VDbGVmT2N0YXZlQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAnZGlzcGxhY2VDbGVmT2N0YXZlJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZGlyZWN0aW9uOiAnYmVsb3cnLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgbmVvblZpZXdcbiAgICAgIC5lZGl0KGluY3JlbWVudE9jdGF2ZSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdDbGVmIG9jdGF2ZSBkZWNyZW1lbnRlZC4nLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdNYXhpbXVtIG9jdGF2ZSBkaXNwbGFjZW1lbnQgcmVhY2hlZC4gQ2xlZiBjYW4gb25seSBiZSBkaXNwbGFjZWQgdXAgdG8gMyBvY3RhdmVzLicsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNDQ2xlZi5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRDQ2xlZjogU2V0Q2xlZkFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0Q2xlZicsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHNoYXBlOiAnQycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihzZXRDQ2xlZik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNGQ2xlZi5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRGQ2xlZjogU2V0Q2xlZkFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0Q2xlZicsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHNoYXBlOiAnRicsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihzZXRGQ2xlZik7XG4gICAgfSk7XG5cbiAgaW5pdE9wdGlvbnNMaXN0ZW5lcnMoKTtcbn1cblxuZnVuY3Rpb24gZGl2TGluZU9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTWluaW1hLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWluaW1hOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWluaW1hJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKENoYW5nZVRvTWluaW1hKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9NYWlvci5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBDaGFuZ2VUb01haW9yOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWFpb3InLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9NYWlvcik7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTWF4aW1hLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWF4aW1hOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWF4aW1hJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKENoYW5nZVRvTWF4aW1hKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9GaW5hbGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvRmluYWxpczogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ2ZpbmFsaXMnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9GaW5hbGlzKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9DYWVzdXJhLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvQ2Flc3VyYTogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ2NhZXN1cmEnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9DYWVzdXJhKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9WaXJndWxhLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvVmlyZ3VsYTogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3Zpcmd1bGEnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9WaXJndWxhKTtcbiAgICB9KTtcblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFBhcnNlIGFjdGlvbnMgcmVnYXJkaW5nIHNoYXBlIGNoYW5nZXMgdG8gZWRpdG9yIGFjdGlvblxuICovXG5mdW5jdGlvbiBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKGFjdGlvbjogU2V0QWN0aW9uIHwgU2V0Q2xlZkFjdGlvbikge1xuICBuZW9uVmlldy5lZGl0KGFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICB9XG4gICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgc3RhZmYgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJNdWx0aVN0YWZmQWN0aW9ucygpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuc3RhZmZNZXJnZUFjdGlvbkNvbnRlbnRzKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5jb2x1bW5BY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgLy8gQ29sdW1uIGluZm8gZWRpdG9yXG4gIHVwZGF0ZUNvbHVtbkluZm8oKTtcbiAgYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lcmdlLXN5c3RlbXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBHcm91cGluZy5tZXJnZVN0YXZlcygpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFbnRlciBzdGFmZiBzcGxpdHRpbmcgbW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclN0YWZmU3BsaXRNb2RlKCk6IHZvaWQge1xuICBjb25zdCBzdGFmZiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdGFmZi5zZWxlY3RlZCcpIGFzIFNWR0dFbGVtZW50O1xuICBpZiAoc3RhZmYgIT09IG51bGwpIHtcbiAgICBjb25zdCBzcGxpdCA9IG5ldyBTcGxpdFN0YWZmSGFuZGxlcihuZW9uVmlldywgc3RhZmYpO1xuICAgIHNwbGl0LnN0YXJ0U3BsaXQoKTtcbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkIScpO1xuICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyaWdnZXIgc3BsaXQgc3RhZmYgb3B0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5zdGFmZlNwbGl0QWN0aW9uQ29udGVudHMpO1xuICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLmNvbHVtbkFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcblxuICAvLyBDb2x1bW4gaW5mbyBlZGl0b3JcbiAgdXBkYXRlQ29sdW1uSW5mbygpO1xuICBhZGRDb2x1bW5JbmZvU3RlcEhhbmRsZXIoKTtcblxuICAvLyBBZGQgdHJpZ2dlciBmb3Igc3BsaXQgYWN0aW9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGxpdC1zeXN0ZW0nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB0cmlnZ2VyU3RhZmZTcGxpdE1vZGUoKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LXJvdGF0ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWZmID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN0YWZmLnNlbGVjdGVkJykgYXMgU1ZHRWxlbWVudDtcbiAgICAvLyBVbnVzZWQgdmFyaWFibGVzOlxuICAgIC8vIGNvbnN0IHJlY3QgPSBzdGFmZi5xdWVyeVNlbGVjdG9yKCcjcmVzaXplUmVjdCcpO1xuICAgIC8vIGNvbnN0IGNvID0gcmVjdC5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpLnNwbGl0KCcgJyk7XG4gICAgLy8gY29uc3QgZHkgPSBwYXJzZUludChjb1swXS5zcGxpdCgnLCcpWzFdKSAtIHBhcnNlSW50KGNvWzFdLnNwbGl0KCcsJylbMV0pO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldFN0YWZmQkJveChzdGFmZiBhcyBTVkdHRWxlbWVudCk7XG4gICAgY29uc3QgeV9jaGFuZ2UgPSBNYXRoLnRhbihwb2ludHMucm90YXRlKSAqIChwb2ludHMubHJ4IC0gcG9pbnRzLnVseCk7XG4gICAgaWYgKHN0YWZmICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAncmVzaXplUm90YXRlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IHN0YWZmLmlkLFxuICAgICAgICAgIHVseDogcG9pbnRzLnVseCxcbiAgICAgICAgICB1bHk6XG4gICAgICAgICAgICBwb2ludHMucm90YXRlID4gMFxuICAgICAgICAgICAgICA/IHBvaW50cy51bHkgKyB5X2NoYW5nZSAvIDJcbiAgICAgICAgICAgICAgOiBwb2ludHMudWx5IC0geV9jaGFuZ2UgLyAyLFxuICAgICAgICAgIGxyeDogcG9pbnRzLmxyeCxcbiAgICAgICAgICBscnk6XG4gICAgICAgICAgICBwb2ludHMucm90YXRlID4gMFxuICAgICAgICAgICAgICA/IHBvaW50cy5scnkgLSB5X2NoYW5nZSAvIDJcbiAgICAgICAgICAgICAgOiBwb2ludHMubHJ5ICsgeV9jaGFuZ2UgLyAyLFxuICAgICAgICAgIHJvdGF0ZTogMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBuZW9uVmlld1xuICAgICAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGF3YWl0IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkJyk7XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGJib3ggb3B0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckJCb3hBY3Rpb25zKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5iYm94QWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWF0Y2hIZWlnaHQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtYXRjaEhlaWdodEhhbmRsZXIoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVHJpZ2dlciBkZWZhdWx0IGFjdGlvbnMgd2hlbiBzZWxlY3RpbmcgYnkgc3lsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRGVmYXVsdFN5bEFjdGlvbnMoKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLmRlZmF1bHRTeWxBY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG4gIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGRlZmF1bHQgc2VsZWN0aW9uIG9wdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJEZWZhdWx0QWN0aW9ucygpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdEFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGV4dHJhIGRyb3Bkb3duIG9wdGlvbnM6XG4gKiBMaXN0ZW4gdG8gY2xpY2tzIG9uIGRyb3Bkb3duc1xuICovXG5mdW5jdGlvbiBpbml0T3B0aW9uc0xpc3RlbmVycygpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bfc2VsZWN0JykuZm9yRWFjaCgoZHJvcCkgPT4ge1xuICAgIC8vIFdoZW4gYW55dGhpbmcgdGhhdCBpcyBub3QgdGhlIGRyb3Bkb3duIGlzIGNsaWNrZWQgYXdheSwgdGhlIGRyb3Bkb3duXG4gICAgLy8gc2hvdWxkIGxvc2UgaXRzIHZpc2liaWxpdHlcbiAgICBjb25zdCBvcHRpb25zQ2xpY2thd2F5ID0gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9wdGlvbnNDbGlja2F3YXkpO1xuICAgICAgZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICB9O1xuXG4gICAgZHJvcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldnQpID0+IHtcbiAgICAgIC8vIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIGRyb3Bkb3duXG4gICAgICBkcm9wLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICAvLyBSZW1vdmUgdmlzaWJpbGl0eSBvZiBvdGhlciBkcm9wZG93bnMgd2hlbiB0aGlzIG9uZSBpcyBjbGlja2VkXG4gICAgICBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wX3NlbGVjdCcpKVxuICAgICAgICAuZmlsdGVyKChvdGhlcikgPT4gb3RoZXIgIT09IGRyb3ApXG4gICAgICAgIC5mb3JFYWNoKChvdGhlcikgPT4gb3RoZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJykpO1xuXG4gICAgICAvLyBEb24ndCBhbGxvdyBvdGhlciBldmVudCBsaXN0ZW5lcnMgb24gdGhlIGJvZHkgdG8gaW50ZXJmZXJlIHdpdGggdGhpcyBsaXN0ZW5lclxuICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBpZiAoZHJvcC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3B0aW9uc0NsaWNrYXdheSk7XG4gICAgICBlbHNlIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcHRpb25zQ2xpY2thd2F5KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBnZXRTdGFmZkJCb3ggfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuZXhwb3J0IGludGVyZmFjZSBQb2ludCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJCb3gge1xuICB1bHg6IG51bWJlcjtcbiAgdWx5OiBudW1iZXI7XG4gIGxyeDogbnVtYmVyO1xuICBscnk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgU1ZHIHJlbGF0aXZlIGNvb3JkaW5hdGVzIGdpdmVuIGNsaWVudFggYW5kIGNsaWVudFlcbiAqIFNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjkyNjEzMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNWR1JlbENvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBQb2ludCB7XG4gIGNvbnN0IHB0ID0gbmV3IERPTVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICBjb25zdCBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPFNWR1NWR0VsZW1lbnQ+KCcuYWN0aXZlLXBhZ2UgPiAuZGVmaW5pdGlvbi1zY2FsZScpO1xuICBjb25zdCBwYWdlTWFyZ2luID0gc3ZnLnF1ZXJ5U2VsZWN0b3I8U1ZHR0VsZW1lbnQ+KCcucGFnZS1tYXJnaW4nKTtcblxuICBjb25zdCB7IHgsIHkgfSA9IHB0Lm1hdHJpeFRyYW5zZm9ybShwYWdlTWFyZ2luLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG4gIHJldHVybiB7IHgsIHkgfTtcblxuICAvLyBJZiB0aGVyZSBpcyBzb21lIGlzc3VlIHdpdGggY29vcmRpbmF0ZXMsIHRoaXMgbWF5IGZpeCB0aGUgaXNzdWU6XG4gIC8vIGNvbnN0IHN2ZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHU1ZHRWxlbWVudD4oJyNzdmdfZ3JvdXAnKTtcbiAgLy8gY29uc3QgeyB4LCB5IH0gPSBwdC5tYXRyaXhUcmFuc2Zvcm0oc3ZnLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG59XG5cbi8qKlxuICogR2V0IElEIG9mIHN0YWZmIGJ5IGNsaWVudCdzIHgteSBjb29yZGluYXRlcy5cbiAqIFRoaXMgZnVuY3Rpb24gY29uc2lkZXJzIHRoZSAqdmlzdWFsKiBib3VuZGluZyBib3ggb2YgdGhlIHN0YWZmXG4gKiBiYXNlZCBvbiBpdHMgc3RhZmYgbGluZXMsIGluc3RlYWQgb2YgdGhlIFNWRyBlbGVtZW50IGl0c2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YWZmSWRCeUNvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzdGF2ZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8U1ZHR0VsZW1lbnQ+KCcuc3RhZmYnKSk7XG4gIGNvbnN0IHN0YWZmQkJveGVzID0gc3RhdmVzLm1hcChzdGFmZiA9PiBnZXRTdGFmZkJCb3goc3RhZmYpKTtcblxuICAvLyBmaW5kIHRoZSBzdGFmZiB0aGF0IHRoZSBjdXJzb3IgaXMgaW5zaWRlXG4gIGNvbnN0IHsgeCwgeSB9ID0gZ2V0U1ZHUmVsQ29vcmRzKGNsaWVudFgsIGNsaWVudFkpO1xuICBjb25zdCBzdGFmZiA9IHN0YWZmQkJveGVzLmZpbmQoXG4gICAgKGJib3gpID0+IHggPD0gYmJveC5scnggJiYgeCA+PSBiYm94LnVseCAmJiB5IDw9IGJib3gubHJ5ICYmIHkgPj0gYmJveC51bHlcbiAgKTsgXG5cbiAgLy8gSWYgdGhlcmUgaXMgaXNzdWVzIHdpdGggZmluZGluZyB0aGUgc3RhZmYsIHRoaXMgbWF5IGJlIG1vcmUgYWNjdXJhdGU6XG4gIC8vIHJldHVybiAocHQueCA+IHVseCAmJiBwdC54IDwgbHJ4KSAmJlxuICAvLyAgIChwdC55ID4gKHVseSArIChwdC54IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkpKSAmJlxuICAvLyAgIChwdC55IDwgKGxyeSAtIChscnggLSBwdC54KSAqIE1hdGgudGFuKHJvdGF0ZSkpKTtcblxuICAvLyBpZiB0aGUgY3Vyc29yIGlzIG5vdCBpbnNpZGUgYW55IHN0YWZmLCB0aGVuIGV4cGxpY2l0bHkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHN0YWZmID8gc3RhZmYuaWQgOiBudWxsO1xufVxuXG4vKipcbiAqIEdldCBzdGFmZiBieSBjbGllbnQncyB4LXkgY29vcmRpbmF0ZXM7IHdyYXBwZXIgZm9yIGdldFN0YWZmSWRCeUNvb3JkcywgYnV0XG4gKiAgIHJldHVybnMgdGhlIGVsZW1lbnQsIG5vdCB0aGUgSURcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YWZmQnlDb29yZHMgKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogU1ZHR0VsZW1lbnQgfCBudWxsIHtcbiAgY29uc3Qgc3RhZmZJZCA9IGdldFN0YWZmSWRCeUNvb3JkcyhjbGllbnRYLCBjbGllbnRZKTtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3N0YWZmSWR9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc091dE9mU1ZHQm91bmRzICh4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiZ0ltZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHSW1hZ2VFbGVtZW50PignI2JnaW1nJyk7XG4gIFxuICByZXR1cm4gKFxuICAgIHggPD0gMCB8fCB4ID49IE51bWJlcihiZ0ltZy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpIHx8XG4gICAgeSA8PSAwIHx8IHkgPj0gTnVtYmVyKGJnSW1nLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpXG4gICk7XG59XG5cbi8qKlxuICogR2V0IGJvdW5kaW5nIGJveCAobHJ4LCBscnksIHVseCwgdWx5KSBvZiBhIGdseXBoLCB3aGljaFxuICogaXMgYSA8dXNlPiBlbGVtZW50IGluIHRoZSBTVkdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdseXBoQkJveCAoZzogU1ZHUmVjdEVsZW1lbnQgfCBTVkdVc2VFbGVtZW50KTogQkJveCB7XG4gIGNvbnN0IHJlY3QgPSAoZy50YWdOYW1lID09ICdyZWN0JykgPyBnLmdldEJCb3goKSA6IChnLnBhcmVudE5vZGUgYXMgU1ZHR0VsZW1lbnQpLmdldEJCb3goKTtcblxuICByZXR1cm4ge1xuICAgIHVseDogcmVjdC54LFxuICAgIHVseTogcmVjdC55LFxuICAgIGxyeDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBscnk6IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH07XG59XG5cbiIsIihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gTm9kZS9Db21tb25KU1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTURcbiAgICAgICAgZGVmaW5lKGZhY3RvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAod2l0aCBzdXBwb3J0IGZvciB3ZWIgd29ya2VycylcbiAgICAgICAgdmFyIGdsb2I7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdsb2IgPSB3aW5kb3c7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGdsb2IgPSBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2xvYi5TcGFya01ENSA9IGZhY3RvcnkoKTtcbiAgICB9XG59KGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcblxuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8qXG4gICAgICogRmFzdGVzdCBtZDUgaW1wbGVtZW50YXRpb24gYXJvdW5kIChKS00gbWQ1KS5cbiAgICAgKiBDcmVkaXRzOiBKb3NlcGggTXllcnNcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cDovL3d3dy5teWVyc2RhaWx5Lm9yZy9qb3NlcGgvamF2YXNjcmlwdC9tZDUtdGV4dC5odG1sXG4gICAgICogQHNlZSBodHRwOi8vanNwZXJmLmNvbS9tZDUtc2hvb3RvdXQvN1xuICAgICAqL1xuXG4gICAgLyogdGhpcyBmdW5jdGlvbiBpcyBtdWNoIGZhc3RlcixcbiAgICAgIHNvIGlmIHBvc3NpYmxlIHdlIHVzZSBpdC4gU29tZSBJRXNcbiAgICAgIGFyZSB0aGUgb25seSBvbmVzIEkga25vdyBvZiB0aGF0XG4gICAgICBuZWVkIHRoZSBpZGlvdGljIHNlY29uZCBmdW5jdGlvbixcbiAgICAgIGdlbmVyYXRlZCBieSBhbiBpZiBjbGF1c2UuICAqL1xuICAgIHZhciBhZGQzMiA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiAoYSArIGIpICYgMHhGRkZGRkZGRjtcbiAgICB9LFxuICAgICAgICBoZXhfY2hyID0gWycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ107XG5cblxuICAgIGZ1bmN0aW9uIGNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gICAgICAgIGEgPSBhZGQzMihhZGQzMihhLCBxKSwgYWRkMzIoeCwgdCkpO1xuICAgICAgICByZXR1cm4gYWRkMzIoKGEgPDwgcykgfCAoYSA+Pj4gKDMyIC0gcykpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDVjeWNsZSh4LCBrKSB7XG4gICAgICAgIHZhciBhID0geFswXSxcbiAgICAgICAgICAgIGIgPSB4WzFdLFxuICAgICAgICAgICAgYyA9IHhbMl0sXG4gICAgICAgICAgICBkID0geFszXTtcblxuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzBdIC0gNjgwODc2OTM2IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbMV0gLSAzODk1NjQ1ODYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEyIHwgZCA+Pj4gMjApICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBhIHwgfmQgJiBiKSArIGtbMl0gKyA2MDYxMDU4MTkgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE3IHwgYyA+Pj4gMTUpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgJiBkIHwgfmMgJiBhKSArIGtbM10gLSAxMDQ0NTI1MzMwIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzRdIC0gMTc2NDE4ODk3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbNV0gKyAxMjAwMDgwNDI2IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYSB8IH5kICYgYikgKyBrWzZdIC0gMTQ3MzIzMTM0MSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1s3XSAtIDQ1NzA1OTgzIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzhdICsgMTc3MDAzNTQxNiB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNyB8IGEgPj4+IDI1KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYiB8IH5hICYgYykgKyBrWzldIC0gMTk1ODQxNDQxNyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxMF0gLSA0MjA2MyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1sxMV0gLSAxOTkwNDA0MTYyIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzEyXSArIDE4MDQ2MDM2ODIgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSAmIGIgfCB+YSAmIGMpICsga1sxM10gLSA0MDM0MTEwMSB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxNF0gLSAxNTAyMDAyMjkwIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzE1XSArIDEyMzY1MzUzMjkgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7XG5cbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxXSAtIDE2NTc5NjUxMCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzZdIC0gMTA2OTUwMTYzMiB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzExXSArIDY0MzcxNzcxMyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1swXSAtIDM3Mzg5NzMwMiB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1s1XSAtIDcwMTU1ODY5MSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzEwXSArIDM4MDE2MDgzIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCA5IHwgZCA+Pj4gMjMpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbMTVdIC0gNjYwNDc4MzM1IHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzRdIC0gNDA1NTM3ODQ4IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgZCB8IGMgJiB+ZCkgKyBrWzldICsgNTY4NDQ2NDM4IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMTRdIC0gMTAxOTgwMzY5MCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzNdIC0gMTg3MzYzOTYxIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzhdICsgMTE2MzUzMTUwMSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxM10gLSAxNDQ0NjgxNDY3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMl0gLSA1MTQwMzc4NCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzddICsgMTczNTMyODQ3MyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1sxMl0gLSAxOTI2NjA3NzM0IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuXG4gICAgICAgIGEgKz0gKGIgXiBjIF4gZCkgKyBrWzVdIC0gMzc4NTU4IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzhdIC0gMjAyMjU3NDQ2MyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbMTFdICsgMTgzOTAzMDU2MiB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMTRdIC0gMzUzMDk1NTYgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMV0gLSAxNTMwOTkyMDYwIHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzRdICsgMTI3Mjg5MzM1MyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbN10gLSAxNTU0OTc2MzIgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE2IHwgYyA+Pj4gMTYpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgXiBkIF4gYSkgKyBrWzEwXSAtIDEwOTQ3MzA2NDAgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMTNdICsgNjgxMjc5MTc0IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzBdIC0gMzU4NTM3MjIyIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkIF4gYSBeIGIpICsga1szXSAtIDcyMjUyMTk3OSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbNl0gKyA3NjAyOTE4OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgfCAwO1xuICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1s5XSAtIDY0MDM2NDQ4NyB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNCB8IGEgPj4+IDI4KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhIF4gYiBeIGMpICsga1sxMl0gLSA0MjE4MTU4MzUgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgXiBhIF4gYikgKyBrWzE1XSArIDUzMDc0MjUyMCB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMl0gLSA5OTUzMzg2NTEgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcblxuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1swXSAtIDE5ODYzMDg0NCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1s3XSArIDExMjY4OTE0MTUgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzE0XSAtIDE0MTYzNTQ5MDUgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzVdIC0gNTc0MzQwNTUgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIxIHxiID4+PiAxMSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYyBeIChiIHwgfmQpKSArIGtbMTJdICsgMTcwMDQ4NTU3MSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1szXSAtIDE4OTQ5ODY2MDYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzEwXSAtIDEwNTE1MjMgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzFdIC0gMjA1NDkyMjc5OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s4XSArIDE4NzMzMTMzNTkgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDYgfCBhID4+PiAyNikgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYiBeIChhIHwgfmMpKSArIGtbMTVdIC0gMzA2MTE3NDQgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzZdIC0gMTU2MDE5ODM4MCB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbMTNdICsgMTMwOTE1MTY0OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s0XSAtIDE0NTUyMzA3MCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1sxMV0gLSAxMTIwMjEwMzc5IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgfCAwO1xuICAgICAgICBjICs9IChhIF4gKGQgfCB+YikpICsga1syXSArIDcxODc4NzI1OSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbOV0gLSAzNDM0ODU1NTEgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIxIHwgYiA+Pj4gMTEpICsgYyB8IDA7XG5cbiAgICAgICAgeFswXSA9IGEgKyB4WzBdIHwgMDtcbiAgICAgICAgeFsxXSA9IGIgKyB4WzFdIHwgMDtcbiAgICAgICAgeFsyXSA9IGMgKyB4WzJdIHwgMDtcbiAgICAgICAgeFszXSA9IGQgKyB4WzNdIHwgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDVibGsocykge1xuICAgICAgICB2YXIgbWQ1YmxrcyA9IFtdLFxuICAgICAgICAgICAgaTsgLyogQW5keSBLaW5nIHNhaWQgZG8gaXQgdGhpcyB3YXkuICovXG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIG1kNWJsa3NbaSA+PiAyXSA9IHMuY2hhckNvZGVBdChpKSArIChzLmNoYXJDb2RlQXQoaSArIDEpIDw8IDgpICsgKHMuY2hhckNvZGVBdChpICsgMikgPDwgMTYpICsgKHMuY2hhckNvZGVBdChpICsgMykgPDwgMjQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZDVibGtzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNWJsa19hcnJheShhKSB7XG4gICAgICAgIHZhciBtZDVibGtzID0gW10sXG4gICAgICAgICAgICBpOyAvKiBBbmR5IEtpbmcgc2FpZCBkbyBpdCB0aGlzIHdheS4gKi9cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgKz0gNCkge1xuICAgICAgICAgICAgbWQ1Ymxrc1tpID4+IDJdID0gYVtpXSArIChhW2kgKyAxXSA8PCA4KSArIChhW2kgKyAyXSA8PCAxNikgKyAoYVtpICsgM10gPDwgMjQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZDVibGtzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNTEocykge1xuICAgICAgICB2YXIgbiA9IHMubGVuZ3RoLFxuICAgICAgICAgICAgc3RhdGUgPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF0sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbGVuZ3RoLFxuICAgICAgICAgICAgdGFpbCxcbiAgICAgICAgICAgIHRtcCxcbiAgICAgICAgICAgIGxvLFxuICAgICAgICAgICAgaGk7XG5cbiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbjsgaSArPSA2NCkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIG1kNWJsayhzLnN1YnN0cmluZyhpIC0gNjQsIGkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcyA9IHMuc3Vic3RyaW5nKGkgLSA2NCk7XG4gICAgICAgIGxlbmd0aCA9IHMubGVuZ3RoO1xuICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBzLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cbiAgICAgICAgdGFpbFtpID4+IDJdIHw9IDB4ODAgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIGlmIChpID4gNTUpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgdGFpbFtpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZXdhcmUgdGhhdCB0aGUgZmluYWwgbGVuZ3RoIG1pZ2h0IG5vdCBmaXQgaW4gMzIgYml0cyBzbyB3ZSB0YWtlIGNhcmUgb2YgdGhhdFxuICAgICAgICB0bXAgPSBuICogODtcbiAgICAgICAgdG1wID0gdG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtcbiAgICAgICAgbG8gPSBwYXJzZUludCh0bXBbMl0sIDE2KTtcbiAgICAgICAgaGkgPSBwYXJzZUludCh0bXBbMV0sIDE2KSB8fCAwO1xuXG4gICAgICAgIHRhaWxbMTRdID0gbG87XG4gICAgICAgIHRhaWxbMTVdID0gaGk7XG5cbiAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWQ1MV9hcnJheShhKSB7XG4gICAgICAgIHZhciBuID0gYS5sZW5ndGgsXG4gICAgICAgICAgICBzdGF0ZSA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsZW5ndGgsXG4gICAgICAgICAgICB0YWlsLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBuOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgbWQ1YmxrX2FycmF5KGEuc3ViYXJyYXkoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IHN1cmUgaWYgaXQgaXMgYSBidWcsIGhvd2V2ZXIgSUUxMCB3aWxsIGFsd2F5cyBwcm9kdWNlIGEgc3ViIGFycmF5IG9mIGxlbmd0aCAxXG4gICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGFyZW50IGFycmF5IGlmIHRoZSBzdWIgYXJyYXkgc3BlY2lmaWVkIHN0YXJ0c1xuICAgICAgICAvLyBiZXlvbmQgdGhlIGxlbmd0aCBvZiB0aGUgcGFyZW50IGFycmF5IC0gd2VpcmQuXG4gICAgICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNzcxNDUyL3R5cGVkLWFycmF5LXN1YmFycmF5LWlzc3VlXG4gICAgICAgIGEgPSAoaSAtIDY0KSA8IG4gPyBhLnN1YmFycmF5KGkgLSA2NCkgOiBuZXcgVWludDhBcnJheSgwKTtcblxuICAgICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB0YWlsW2kgPj4gMl0gfD0gYVtpXSA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWxbaSA+PiAyXSB8PSAweDgwIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICBpZiAoaSA+IDU1KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgdGFpbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtaWdodCBub3QgZml0IGluIDMyIGJpdHMgc28gd2UgdGFrZSBjYXJlIG9mIHRoYXRcbiAgICAgICAgdG1wID0gbiAqIDg7XG4gICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7XG4gICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7XG4gICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDtcblxuICAgICAgICB0YWlsWzE0XSA9IGxvO1xuICAgICAgICB0YWlsWzE1XSA9IGhpO1xuXG4gICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcblxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmhleChuKSB7XG4gICAgICAgIHZhciBzID0gJycsXG4gICAgICAgICAgICBqO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaiArPSAxKSB7XG4gICAgICAgICAgICBzICs9IGhleF9jaHJbKG4gPj4gKGogKiA4ICsgNCkpICYgMHgwRl0gKyBoZXhfY2hyWyhuID4+IChqICogOCkpICYgMHgwRl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGV4KHgpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB4W2ldID0gcmhleCh4W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geC5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBmYXN0IGFkZDMyIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkLi5cbiAgICBpZiAoaGV4KG1kNTEoJ2hlbGxvJykpICE9PSAnNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTInKSB7XG4gICAgICAgIGFkZDMyID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgICAgIHZhciBsc3cgPSAoeCAmIDB4RkZGRikgKyAoeSAmIDB4RkZGRiksXG4gICAgICAgICAgICAgICAgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gICAgICAgICAgICByZXR1cm4gKG1zdyA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIEFycmF5QnVmZmVyIHNsaWNlIHBvbHlmaWxsLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHRhdWJlcnQvbm9kZS1hcnJheWJ1ZmZlci1zbGljZVxuICAgICAqL1xuXG4gICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgIUFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSkge1xuICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gY2xhbXAodmFsLCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSAodmFsIHwgMCkgfHwgMDtcblxuICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh2YWwgKyBsZW5ndGgsIDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2YWwsIGxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJlZ2luID0gY2xhbXAoZnJvbSwgbGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gbGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBudW0sXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUFycmF5O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gY2xhbXAodG8sIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGJlZ2luID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbnVtID0gZW5kIC0gYmVnaW47XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IEFycmF5QnVmZmVyKG51bSk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBuZXcgVWludDhBcnJheSh0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgc291cmNlQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLCBiZWdpbiwgbnVtKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheS5zZXQoc291cmNlQXJyYXkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXJzLlxuICAgICAqL1xuXG4gICAgZnVuY3Rpb24gdG9VdGY4KHN0cikge1xuICAgICAgICBpZiAoL1tcXHUwMDgwLVxcdUZGRkZdLy50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRmOFN0cjJBcnJheUJ1ZmZlcihzdHIsIHJldHVyblVJbnQ4QXJyYXkpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgICAgICAgIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKSxcbiAgICAgICAgICAgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZiksXG4gICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBhcnJbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gYXJyIDogYnVmZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcnJheUJ1ZmZlcjJVdGY4U3RyKGJ1ZmYpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoYnVmZikpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKGZpcnN0LCBzZWNvbmQsIHJldHVyblVJbnQ4QXJyYXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGZpcnN0LmJ5dGVMZW5ndGggKyBzZWNvbmQuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgcmVzdWx0LnNldChuZXcgVWludDhBcnJheShmaXJzdCkpO1xuICAgICAgICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KHNlY29uZCksIGZpcnN0LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gcmVzdWx0IDogcmVzdWx0LmJ1ZmZlcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoZXhUb0JpbmFyeVN0cmluZyhoZXgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gW10sXG4gICAgICAgICAgICBsZW5ndGggPSBoZXgubGVuZ3RoLFxuICAgICAgICAgICAgeDtcblxuICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGVuZ3RoIC0gMTsgeCArPSAyKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKHBhcnNlSW50KGhleC5zdWJzdHIoeCwgMiksIDE2KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIFNwYXJrTUQ1IE9PUCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGNsYXNzIHRvIHBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbWQ1LCBvdGhlcndpc2UgdXNlIHRoZVxuICAgICAqIHN0YXRpYyBtZXRob2RzIGluc3RlYWQuXG4gICAgICovXG5cbiAgICBmdW5jdGlvbiBTcGFya01ENSgpIHtcbiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHN0cmluZy5cbiAgICAgKiBBIGNvbnZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIGlmIGFuIHV0Zjggc3RyaW5nIGlzIGRldGVjdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gVGhlbiBhcHBlbmQgYXMgYmluYXJ5XG4gICAgICAgIHRoaXMuYXBwZW5kQmluYXJ5KHRvVXRmOChzdHIpKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIGJpbmFyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudHMgVGhlIGJpbmFyeSBzdHJpbmcgdG8gYmUgYXBwZW5kZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1fSBUaGUgaW5zdGFuY2UgaXRzZWxmXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmFwcGVuZEJpbmFyeSA9IGZ1bmN0aW9uIChjb250ZW50cykge1xuICAgICAgICB0aGlzLl9idWZmICs9IGNvbnRlbnRzO1xuICAgICAgICB0aGlzLl9sZW5ndGggKz0gY29udGVudHMubGVuZ3RoO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLl9idWZmLmxlbmd0aCxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbGVuZ3RoOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCBtZDVibGsodGhpcy5fYnVmZi5zdWJzdHJpbmcoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYnVmZiA9IHRoaXMuX2J1ZmYuc3Vic3RyaW5nKGkgLSA2NCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZFxuICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSxcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maW5pc2godGFpbCwgbGVuZ3RoKTtcbiAgICAgICAgcmV0ID0gaGV4KHRoaXMuX2hhc2gpO1xuXG4gICAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgICAgIHJldCA9IGhleFRvQmluYXJ5U3RyaW5nKHJldCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYnVmZiA9ICcnO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9oYXNoID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ1ZmY6IHRoaXMuX2J1ZmYsXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMuX2xlbmd0aCxcbiAgICAgICAgICAgIGhhc2g6IHRoaXMuX2hhc2guc2xpY2UoKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB0aGlzLl9idWZmID0gc3RhdGUuYnVmZjtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICB0aGlzLl9oYXNoID0gc3RhdGUuaGFzaDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgbWVtb3J5IHVzZWQgYnkgdGhlIGluY3JlbWVudGFsIGJ1ZmZlciBhbmQgb3RoZXIgYWRkaXRpb25hbFxuICAgICAqIHJlc291cmNlcy4gSWYgeW91IHBsYW4gdG8gdXNlIHRoZSBpbnN0YW5jZSBhZ2FpbiwgdXNlIHJlc2V0IGluc3RlYWQuXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9oYXNoO1xuICAgICAgICBkZWxldGUgdGhpcy5fYnVmZjtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xlbmd0aDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmluaXNoIHRoZSBmaW5hbCBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgdGFpbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9ICB0YWlsICAgVGhlIHRhaWwgKHdpbGwgYmUgbW9kaWZpZWQpXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZW1haW5pbmcgYnVmZmVyXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbiAodGFpbCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBpID0gbGVuZ3RoLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICB0YWlsW2kgPj4gMl0gfD0gMHg4MCA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgaWYgKGkgPiA1NSkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUodGhpcy5faGFzaCwgdGFpbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gdGhlIGZpbmFsIGNvbXB1dGF0aW9uIGJhc2VkIG9uIHRoZSB0YWlsIGFuZCBsZW5ndGhcbiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtYXkgbm90IGZpdCBpbiAzMiBiaXRzIHNvIHdlIHRha2UgY2FyZSBvZiB0aGF0XG4gICAgICAgIHRtcCA9IHRoaXMuX2xlbmd0aCAqIDg7XG4gICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7XG4gICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7XG4gICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDtcblxuICAgICAgICB0YWlsWzE0XSA9IGxvO1xuICAgICAgICB0YWlsWzE1XSA9IGhpO1xuICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCB0YWlsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGEgc3RyaW5nLlxuICAgICAqIEEgY29udmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgaWYgdXRmOCBzdHJpbmcgaXMgZGV0ZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIHN0ciBUaGUgc3RyaW5nXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbcmF3XSBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5oYXNoID0gZnVuY3Rpb24gKHN0ciwgcmF3KSB7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gVGhlbiBjb21wdXRlIGl0IHVzaW5nIHRoZSBiaW5hcnkgZnVuY3Rpb25cbiAgICAgICAgcmV0dXJuIFNwYXJrTUQ1Lmhhc2hCaW5hcnkodG9VdGY4KHN0ciksIHJhdyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBtZDUgaGFzaCBvbiBhIGJpbmFyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIGNvbnRlbnQgVGhlIGJpbmFyeSBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyYXddICAgICBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5oYXNoQmluYXJ5ID0gZnVuY3Rpb24gKGNvbnRlbnQsIHJhdykge1xuICAgICAgICB2YXIgaGFzaCA9IG1kNTEoY29udGVudCksXG4gICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7XG5cbiAgICAgICAgcmV0dXJuIHJhdyA/IGhleFRvQmluYXJ5U3RyaW5nKHJldCkgOiByZXQ7XG4gICAgfTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICogU3BhcmtNRDUgT09QIGltcGxlbWVudGF0aW9uIGZvciBhcnJheSBidWZmZXJzLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBtZDUgT05MWSBmb3IgYXJyYXkgYnVmZmVycy5cbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYW4gYXJyYXkgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyIFRoZSBhcnJheSB0byBiZSBhcHBlbmRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKGFycikge1xuICAgICAgICB2YXIgYnVmZiA9IGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKHRoaXMuX2J1ZmYuYnVmZmVyLCBhcnIsIHRydWUpLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICBpO1xuXG4gICAgICAgIHRoaXMuX2xlbmd0aCArPSBhcnIuYnl0ZUxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBsZW5ndGg7IGkgKz0gNjQpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHRoaXMuX2hhc2gsIG1kNWJsa19hcnJheShidWZmLnN1YmFycmF5KGkgLSA2NCwgaSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2J1ZmYgPSAoaSAtIDY0KSA8IGxlbmd0aCA/IG5ldyBVaW50OEFycmF5KGJ1ZmYuYnVmZmVyLnNsaWNlKGkgLSA2NCkpIDogbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZFxuICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmW2ldIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmluaXNoKHRhaWwsIGxlbmd0aCk7XG4gICAgICAgIHJldCA9IGhleCh0aGlzLl9oYXNoKTtcblxuICAgICAgICBpZiAocmF3KSB7XG4gICAgICAgICAgICByZXQgPSBoZXhUb0JpbmFyeVN0cmluZyhyZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmYgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5faGFzaCA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgc3RhdGVcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgYnVmZmVyIHRvIGEgc3RyaW5nXG4gICAgICAgIHN0YXRlLmJ1ZmYgPSBhcnJheUJ1ZmZlcjJVdGY4U3RyKHN0YXRlLmJ1ZmYpO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIFRoZSBzdGF0ZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gYnVmZmVyXG4gICAgICAgIHN0YXRlLmJ1ZmYgPSB1dGY4U3RyMkFycmF5QnVmZmVyKHN0YXRlLmJ1ZmYsIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBTcGFya01ENS5wcm90b3R5cGUuc2V0U3RhdGUuY2FsbCh0aGlzLCBzdGF0ZSk7XG4gICAgfTtcblxuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5kZXN0cm95ID0gU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3k7XG5cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuX2ZpbmlzaCA9IFNwYXJrTUQ1LnByb3RvdHlwZS5fZmluaXNoO1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGFuIGFycmF5IGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFyciBUaGUgYXJyYXkgYnVmZmVyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSAgICAgW3Jhd10gVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IG9uZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIuaGFzaCA9IGZ1bmN0aW9uIChhcnIsIHJhdykge1xuICAgICAgICB2YXIgaGFzaCA9IG1kNTFfYXJyYXkobmV3IFVpbnQ4QXJyYXkoYXJyKSksXG4gICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7XG5cbiAgICAgICAgcmV0dXJuIHJhdyA/IGhleFRvQmluYXJ5U3RyaW5nKHJldCkgOiByZXQ7XG4gICAgfTtcblxuICAgIHJldHVybiBTcGFya01ENTtcbn0pKTtcbiIsIi8qKlxuICogRm9ybWF0cyByYXcgVVVJRCBkYXRhIGludG8gdGhlIHByb3BlciBzdHJpbmcgZm9ybWF0LlxuICogQHBhcmFtIGRhdGEgLSBSYXcgVVVJRCBkYXRhLlxuICogQHJldHVybnMgRm9ybWF0dGVkIFVVSUQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiB1aW50OFRvVXVpZCAoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gMTYpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBjYiAocHJldmlvdXM6IHN0cmluZywgY3VycmVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJldmlvdXMgKyBjdXJyZW50LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEuc2xpY2UoMCwgNCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoNCwgNikucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoNiwgOCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoOCwgMTApLnJlZHVjZShjYiwgJycpICtcbiAgICAnLScgKyBkYXRhLnNsaWNlKDEwKS5yZWR1Y2UoY2IsICcnKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBBIFt2ZXJzaW9uIDQgVVVJRF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXIjVmVyc2lvbl80XyhyYW5kb20pKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCAoKTogc3RyaW5nIHtcbiAgLy8gQ2hlY2sgZm9yIGNyeXB0byBBUElcbiAgaWYgKHdpbmRvdy5jcnlwdG8gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1aW50OFRvVXVpZChuZXcgVWludDhBcnJheSgxNikpO1xuICB9XG5cbiAgLy8gR2V0IDE2IG9jdGV0cyBmb3IgVVVJRFxuICBjb25zdCBvY3RldHMgPSBuZXcgVWludDhBcnJheSgxNik7XG4gIGNvbnN0IG1vZGlmaWVycyA9IFVpbnQ4QXJyYXkuZnJvbShbXG4gICAgcGFyc2VJbnQoJzAxMDAwMDAwJywgMiksICAvLyBWZXJzaW9uIGJpdHMgKDQgPT4gMDEwMClcbiAgICBwYXJzZUludCgnMTAwMDAwMDAnLCAyKSwgIC8vIFZhcmlhbnQgYml0cyAoMTB4KVxuICAgIHBhcnNlSW50KCcwMDAwMTExMScsIDIpLCAgLy8gTWFzayB0byB6ZXJvIGhpZ2hlciBiaXRzLCB2ZXJzaW9uXG4gICAgcGFyc2VJbnQoJzAwMTExMTExJywgMikgICAvLyBNYXNrIHRvIHplcm8gaGlnaGVyIGJpdHMsIHZhcmlhbnRcbiAgXSk7XG4gIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG9jdGV0cyk7XG4gIC8vIFNldCB2ZXJzaW9uIGJpdHMgYW5kIHZhcmlhbnQgYml0c1xuICBvY3RldHNbNl0gPSAob2N0ZXRzWzZdICYgbW9kaWZpZXJzWzJdKSB8IG1vZGlmaWVyc1swXTtcbiAgb2N0ZXRzWzhdID0gKG9jdGV0c1s4XSAmIG1vZGlmaWVyc1szXSkgfCBtb2RpZmllcnNbMV07XG5cbiAgcmV0dXJuIHVpbnQ4VG9VdWlkKG9jdGV0cyk7XG59XG4iLCJpbXBvcnQgeyBHcm91cGluZ1R5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIGNvbG9yIHBhbGV0dGUgZnJvbSBGaWd1cmUgMiAoQ29sb3JzIG9wdGltaXplZCBmb3IgY29sb3ItYmxpbmRcbiAqIGluZGl2aWR1YWxzKSBmcm9tXG4gKiBbXCJQb2ludHMgb2YgdmlldzogQ29sb3IgYmxpbmRuZXNzXCIgYnkgQmFuZyBXb25nIHB1Ymxpc2hlZCBpbiBOYXR1cmUgTWV0aG9kcyB2b2x1bWUgOCBvbiAyNyBNYXkgMjAxMV0oaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9ubWV0aC4xNjE4P1dULmVjX2lkPU5NRVRILTIwMTEwNilcbiAqL1xuY29uc3QgQ29sb3JQYWxldHRlOiBzdHJpbmdbXSA9IFtcbiAgJ3JnYigyMzAsIDE1OSwgMCknLFxuICAncmdiKDg2LCAxODAsIDIzMyknLFxuICAncmdiKDAsIDE1OCwgMTE1KScsXG4gICdyZ2IoMjQwLCAyMjgsIDY2KScsXG4gICdyZ2IoMCwgMTE0LCAxNzgpJyxcbiAgJ3JnYigyMTMsIDk0LCAwKScsXG4gICdyZ2IoMjA0LCAxMjEsIDE2NyknXG5dO1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgaGlnaGxpZ2h0IGZyb20gYSBzdGFmZi5cbiAqIEBwYXJhbSBzdGFmZiBJZiB1bmRlZmluZWQsIHRoZSBhbGwgc3RhdmVzIGFyZSB1bmhpZ2hsaWdodGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5oaWdobGlnaHQoc3RhZmY/OiBTVkdHRWxlbWVudCk6IHZvaWQge1xuICBsZXQgY2hpbGRyZW46IE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gIGlmIChzdGFmZikge1xuICAgIGNoaWxkcmVuID0gc3RhZmYucXVlcnlTZWxlY3RvckFsbCgnOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHRlZCcpO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkcmVuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHRlZCcpO1xuICB9XG4gIGNoaWxkcmVuLmZvckVhY2goZWxlbSA9PiB7XG4gICAgaWYgKGVsZW0udGFnTmFtZSA9PT0gJ3BhdGgnICYmICFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwMDAwJyk7XG4gICAgfSBlbHNlIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpICYmICFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwMDAwJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoJ2ZpbGwnKTtcbiAgICAgIGxldCByZWN0cyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjdHMgPSBlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWN0cyA9IFtdIGFzIHVua25vd24gYXMgTm9kZUxpc3RPZjxFbGVtZW50PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3RhZmYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zeWwnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICAgICAvLyByZWN0LmNsb3Nlc3QoJy5sYXllcicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApe1xuICAgICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmVjdC5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBoaWdobGlnaHQgZnJvbSBlYWNoIHN0YWZmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRTdGFmZkhpZ2hsaWdodCgpOiB2b2lkIHtcbiAgdW5oaWdobGlnaHQoKTtcbn1cblxuLyoqXG4gKiBVbnNldCBoaWdobGlnaHQgZm9yIGFsbCBncm91cGluZyB0eXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRHcm91cGluZ0hpZ2hsaWdodCgpOiB2b2lkIHtcbiAgdW5zZXRTdGFmZkhpZ2hsaWdodCgpO1xuICBjb25zdCBoaWdobGlnaHRlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0ZWQnKSlcbiAgICAuZmlsdGVyKChlbGVtOiBIVE1MRWxlbWVudCkgPT4gIWVsZW0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpO1xuICBoaWdobGlnaHRlZC5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgIGVsZW0uc2V0QXR0cmlidXRlKCcjZDAwJywgbnVsbCk7XG4gICAgbGV0IHJlY3RzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICBpZiAoZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKSAhPT0gbnVsbCkge1xuICAgICAgICByZWN0cyA9IGVsZW0uY2xvc2VzdCgnLnN5bGxhYmxlJykucXVlcnlTZWxlY3RvckFsbCgnc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgfVxuICAgIH1cbiAgICByZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWN0OiBIVE1MRWxlbWVudCkge1xuICAgICAgaWYgKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8IFxuICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpXG4gICAgICApe1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICB9XG4gICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICAgIGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnc3lsVGV4dFJlY3QtZGlzcGxheScpLmZvckVhY2gocmVjdCA9PiB7XG4gICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG4gIH0pO1xuICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpLmZvckVhY2goKGVsKSA9PiB7IGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcnKTsgfSk7XG59XG5cbi8qKlxuICogSGlnaGxpZ2h0IGEgc3RhZmYgYSBjZXJ0YWluIGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlnaGxpZ2h0KHN0YWZmOiBTVkdHRWxlbWVudCwgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oc3RhZmYuY2hpbGRyZW4pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ3BhdGgnKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykubGVuZ3RoICYmIGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnc3lsbGFibGUnKSkge1xuICAgICAgQXJyYXkuZnJvbShjaGlsZC5jaGlsZHJlbikuZmlsdGVyKGVsID0+IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykpLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemVQb2ludCcpIHx8IGNoaWxkLmlkID09PSAncmVzaXplUmVjdCcgfHwgY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyb3RhdGVQb2ludCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ2xheWVyJykpIHtcbiAgICAgIEFycmF5LmZyb20oY2hpbGQuY2hpbGRyZW4pLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hpZ2hsaWdodC1zZWxlY3RlZCcpLmxlbmd0aCAmJlxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0LXNlbGVjdGVkJylbMF0uaWQgPT09ICdoaWdobGlnaHQtbmV1bWUnXG4gICAgICAmJiBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIEFycmF5LmZyb20oY2hpbGQuY2hpbGRyZW4pLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJykpLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgbGV0IHJlY3RzID0gY2hpbGQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjdHMgPSBjaGlsZC5jbG9zZXN0KCcuc3lsbGFibGUnKS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVjdHMgPSBbXSBhcyB1bmtub3duIGFzIE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlY3RzLmZvckVhY2goZnVuY3Rpb24gKHJlY3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGlmICghKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3RhZmYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICAgICAvLyByZWN0LmNsb3Nlc3QoJy5sYXllcicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApKSB7XG4gICAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gY29sb3I7XG4gICAgICAgICAgcmVjdC5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHRlZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY2hpbGQuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0ZWQnKTtcbiAgfVxuICBsZXQgd2lkdGgsIGhlaWdodDtcbiAgLyp0cnkge1xuICAgIHdpZHRoID0gTnVtYmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZScpLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEF0dHJpYnV0ZSgnd2lkdGgnKS5zcGxpdCgncHgnKVswXSk7XG4gICAgaGVpZ2h0ID0gTnVtYmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZScpLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jykuc3BsaXQoJ3B4JylbMF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhlKTtcbiAgfSovXG4gIGxldCBzdHJva2U6IHN0cmluZztcbiAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQgJiYgaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBpZGsgbG9va3MgZ29vZCA6JylcbiAgICAvLyBUT0RPIGZpbmQgYSBiZXR0ZXIgd2F5IG9mIGNhbGN1bGF0aW5nIHRoaXMgYXMgdGhpcyBhY3R1YWxseSBkb2Vzbid0IHdvcmsgYXMgd2VsbCBhcyAzMHB4XG4gICAgc3Ryb2tlID0gKHdpZHRoICogaGVpZ2h0IC8gMTAwMDAwMCkudG9TdHJpbmcoKTtcbiAgfVxuICBlbHNlIHtcbiAgICBzdHJva2UgPSAnMzBweCc7XG4gIH1cbiAgc3RhZmYucXVlcnlTZWxlY3RvckFsbCgnLm5jLCAuY3VzdG9zLCAuY2xlZiwgLmFjY2lkJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnYmxhY2snKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIHN0cm9rZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEhpZ2hsaWdodCBlYWNoIHN0YWZmIGEgZGlmZmVyZW50IGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U3RhZmZIaWdobGlnaHQoKTogdm9pZCB7XG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3RhZmYnKSkgYXMgU1ZHR0VsZW1lbnRbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFmZkNvbG9yID0gQ29sb3JQYWxldHRlW2kgJSBDb2xvclBhbGV0dGUubGVuZ3RoXTtcbiAgICBoaWdobGlnaHQoc3RhdmVzW2ldLCBzdGFmZkNvbG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDb2x1bW5IaWdobGlnaHQoKTogdm9pZCB7XG4gIGNvbnN0ICBncm91cHM6IHsgW2tleTogbnVtYmVyXTogU1ZHR0VsZW1lbnRbXSB9ID0ge307XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICBjb25zdCBoYXNDb2x1bW4gPSBBcnJheS5mcm9tKHN0YWZmLmNsYXNzTGlzdCkuam9pbignICcpLm1hdGNoKC9cXGJjb2x1bW4oXFxkKylcXGIvKTtcbiAgICBsZXQgY29sdW1uTnVtID0gMDtcbiAgICBpZiAoaGFzQ29sdW1uKSB7XG4gICAgICBjb2x1bW5OdW0gPSBwYXJzZUludChoYXNDb2x1bW5bMV0sIDEwKSAtIDE7XG4gICAgfVxuXG4gICAgaWYgKCFncm91cHNbY29sdW1uTnVtXSkge1xuICAgICAgZ3JvdXBzW2NvbHVtbk51bV0gPSBbXTtcbiAgICB9XG5cbiAgICBncm91cHNbY29sdW1uTnVtXS5wdXNoKHN0YWZmIGFzIFNWR0dFbGVtZW50KTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbY29sdW1uLCBzdGF2ZXNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcbiAgICBjb25zdCBjb2xvciA9IENvbG9yUGFsZXR0ZVtOdW1iZXIoY29sdW1uKSAlIENvbG9yUGFsZXR0ZS5sZW5ndGhdO1xuICAgIGZvciAoY29uc3Qgc3RhZmYgb2Ygc3RhdmVzKSB7XG4gICAgICBoaWdobGlnaHQoc3RhZmYsIGNvbG9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSBoaWdobGlnaHQgYnkgYSBkaWZmZXJlbnQgZ3JvdXBpbmcuXG4gKiBAcGFyYW0gZ3JvdXBpbmcgLSBFaXRoZXIgXCJzdGFmZlwiLCBcInN5bGxhYmxlXCIsIFwibmV1bWVcIiwgXCJzZWxlY3Rpb25cIiwgb3IgXCJsYXllckVsZW1lbnRcIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdyb3VwaW5nSGlnaGxpZ2h0KGdyb3VwaW5nOiBHcm91cGluZ1R5cGUpOiB2b2lkIHtcbiAgdW5zZXRHcm91cGluZ0hpZ2hsaWdodCgpO1xuICBpZiAoZ3JvdXBpbmcgPT09ICdzdGFmZicpIHtcbiAgICBzZXRTdGFmZkhpZ2hsaWdodCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBlbHNlIGlmIChncm91cGluZyA9PT0gJ2NvbHVtbicpIHtcbiAgICBzZXRDb2x1bW5IaWdobGlnaHQoKTtcbiAgICByZXR1cm47XG4gIH0gXG4gIGVsc2UgaWYgKGdyb3VwaW5nID09PSAnc2VsZWN0aW9uJykge1xuICAgIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VsLWJ5LmlzLWFjdGl2ZScpLmlkO1xuICAgIHN3aXRjaCAodGVtcCkge1xuICAgICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBjYXNlICdzZWxCeUJCb3gnOlxuICAgICAgICBncm91cGluZyA9ICdzeWxsYWJsZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlDb2x1bW4nOlxuICAgICAgICBncm91cGluZyA9ICdjb2x1bW4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgICBncm91cGluZyA9ICdzdGFmZic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlMYXllckVsZW1lbnQnOlxuICAgICAgICBncm91cGluZyA9ICdsYXllckVsZW1lbnQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZ3JvdXBpbmcgPSAnbmV1bWUnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgc2V0R3JvdXBpbmdIaWdobGlnaHQoZ3JvdXBpbmcpO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZ3JvdXBzO1xuXG4gIGlmIChncm91cGluZyA9PSAnbGF5ZXJFbGVtZW50Jykge1xuICAgIGdyb3VwcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hY2NpZCwgLmNsZWYsIC5jdXN0b3MsIC5kaXZMaW5lJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZ3JvdXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShncm91cGluZykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD47XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmMsIC5jdXN0b3MsIC5jbGVmLCAuYWNjaWQsIC5kaXZMaW5lJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnYmxhY2snKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczMHB4Jyk7XG4gIH0pO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZ3JvdXBDb2xvciA9IENvbG9yUGFsZXR0ZVtpICUgQ29sb3JQYWxldHRlLmxlbmd0aF07XG4gICAgaWYgKChncm91cHNbaV0uY2xvc2VzdCgnLnNlbGVjdGVkJykgPT09IG51bGwpICYmICFncm91cHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBncm91cHNbaV0uc2V0QXR0cmlidXRlKCdmaWxsJywgZ3JvdXBDb2xvcik7XG4gICAgICBjb25zdCByZWN0cyA9IGdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+O1xuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdCkge1xuICAgICAgICBpZiAocmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsbGFibGUnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gZ3JvdXBDb2xvcjtcbiAgICAgIH0pO1xuICAgICAgZ3JvdXBzW2ldLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICBncm91cHNbaV0ucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKS5mb3JFYWNoKHJlY3QgPT4ge1xuICAgICAgICByZWN0LmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2QwMCcpO1xuICAgICAgfVxuICAgICAgZ3JvdXBzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGl2TGluZUNoaWxkcmVuID0gZ3JvdXBzW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJyk7XG4gICAgaWYgKGRpdkxpbmVDaGlsZHJlbikge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaXZMaW5lQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZGl2TGluZUNoaWxkcmVuW2pdLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgZ3JvdXBDb2xvcik7XG4gICAgICAgIGRpdkxpbmVDaGlsZHJlbltqXS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczMHB4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxufVxuIiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdHJpbmdpZnkvcGFyc2UgZnVuY3Rpb25zIHRoYXQgZG9uJ3Qgb3BlcmF0ZVxuICogcmVjdXJzaXZlbHksIHNvIHRoZXkgYXZvaWQgY2FsbCBzdGFjayBleGNlZWRlZFxuICogZXJyb3JzLlxuICovXG5leHBvcnRzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeShpbnB1dCkge1xuICB2YXIgcXVldWUgPSBbXTtcbiAgcXVldWUucHVzaCh7b2JqOiBpbnB1dH0pO1xuXG4gIHZhciByZXMgPSAnJztcbiAgdmFyIG5leHQsIG9iaiwgcHJlZml4LCB2YWwsIGksIGFycmF5UHJlZml4LCBrZXlzLCBrLCBrZXksIHZhbHVlLCBvYmpQcmVmaXg7XG4gIHdoaWxlICgobmV4dCA9IHF1ZXVlLnBvcCgpKSkge1xuICAgIG9iaiA9IG5leHQub2JqO1xuICAgIHByZWZpeCA9IG5leHQucHJlZml4IHx8ICcnO1xuICAgIHZhbCA9IG5leHQudmFsIHx8ICcnO1xuICAgIHJlcyArPSBwcmVmaXg7XG4gICAgaWYgKHZhbCkge1xuICAgICAgcmVzICs9IHZhbDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICByZXMgKz0gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkob2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgcmVzICs9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcXVldWUucHVzaCh7dmFsOiAnXSd9KTtcbiAgICAgIGZvciAoaSA9IG9iai5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBhcnJheVByZWZpeCA9IGkgPT09IDAgPyAnJyA6ICcsJztcbiAgICAgICAgcXVldWUucHVzaCh7b2JqOiBvYmpbaV0sIHByZWZpeDogYXJyYXlQcmVmaXh9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ1snfSk7XG4gICAgfSBlbHNlIHsgLy8gb2JqZWN0XG4gICAgICBrZXlzID0gW107XG4gICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICBrZXlzLnB1c2goayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ30nfSk7XG4gICAgICBmb3IgKGkgPSBrZXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIG9ialByZWZpeCA9IChpID4gMCA/ICcsJyA6ICcnKTtcbiAgICAgICAgb2JqUHJlZml4ICs9IEpTT04uc3RyaW5naWZ5KGtleSkgKyAnOic7XG4gICAgICAgIHF1ZXVlLnB1c2goe29iajogdmFsdWUsIHByZWZpeDogb2JqUHJlZml4fSk7XG4gICAgICB9XG4gICAgICBxdWV1ZS5wdXNoKHt2YWw6ICd7J30pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHRoZSBwYXJzZSBmdW5jdGlvbi5cbi8vIFRoaXMgcG9wIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBjb3BpZWQgZnJvbVxuLy8gcG91Y2hDb2xsYXRlLnBhcnNlSW5kZXhhYmxlU3RyaW5nXG5mdW5jdGlvbiBwb3Aob2JqLCBzdGFjaywgbWV0YVN0YWNrKSB7XG4gIHZhciBsYXN0TWV0YUVsZW1lbnQgPSBtZXRhU3RhY2tbbWV0YVN0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAob2JqID09PSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudCkge1xuICAgIC8vIHBvcHBpbmcgYSBtZXRhLWVsZW1lbnQsIGUuZy4gYW4gb2JqZWN0IHdob3NlIHZhbHVlIGlzIGFub3RoZXIgb2JqZWN0XG4gICAgbWV0YVN0YWNrLnBvcCgpO1xuICAgIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gIH1cbiAgdmFyIGVsZW1lbnQgPSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudDtcbiAgdmFyIGxhc3RFbGVtZW50SW5kZXggPSBsYXN0TWV0YUVsZW1lbnQuaW5kZXg7XG4gIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgZWxlbWVudC5wdXNoKG9iaik7XG4gIH0gZWxzZSBpZiAobGFzdEVsZW1lbnRJbmRleCA9PT0gc3RhY2subGVuZ3RoIC0gMikgeyAvLyBvYmogd2l0aCBrZXkrdmFsdWVcbiAgICB2YXIga2V5ID0gc3RhY2sucG9wKCk7XG4gICAgZWxlbWVudFtrZXldID0gb2JqO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2gob2JqKTsgLy8gb2JqIHdpdGgga2V5IG9ubHlcbiAgfVxufVxuXG5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIG1ldGFTdGFjayA9IFtdOyAvLyBzdGFjayBmb3IgYXJyYXlzIGFuZCBvYmplY3RzXG4gIHZhciBpID0gMDtcbiAgdmFyIGNvbGxhdGlvbkluZGV4LHBhcnNlZE51bSxudW1DaGFyO1xuICB2YXIgcGFyc2VkU3RyaW5nLGxhc3RDaCxudW1Db25zZWN1dGl2ZVNsYXNoZXMsY2g7XG4gIHZhciBhcnJheUVsZW1lbnQsIG9iakVsZW1lbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29sbGF0aW9uSW5kZXggPSBzdHJbaSsrXTtcbiAgICBpZiAoY29sbGF0aW9uSW5kZXggPT09ICd9JyB8fFxuICAgICAgICBjb2xsYXRpb25JbmRleCA9PT0gJ10nIHx8XG4gICAgICAgIHR5cGVvZiBjb2xsYXRpb25JbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9wKHN0YWNrLnBvcCgpLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoY29sbGF0aW9uSW5kZXgpIHtcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnXFx0JzpcbiAgICAgIGNhc2UgJ1xcbic6XG4gICAgICBjYXNlICc6JzpcbiAgICAgIGNhc2UgJywnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ24nOlxuICAgICAgICBpICs9IDM7IC8vICd1bGwnXG4gICAgICAgIHBvcChudWxsLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0JzpcbiAgICAgICAgaSArPSAzOyAvLyAncnVlJ1xuICAgICAgICBwb3AodHJ1ZSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZic6XG4gICAgICAgIGkgKz0gNDsgLy8gJ2Fsc2UnXG4gICAgICAgIHBvcChmYWxzZSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMCc6XG4gICAgICBjYXNlICcxJzpcbiAgICAgIGNhc2UgJzInOlxuICAgICAgY2FzZSAnMyc6XG4gICAgICBjYXNlICc0JzpcbiAgICAgIGNhc2UgJzUnOlxuICAgICAgY2FzZSAnNic6XG4gICAgICBjYXNlICc3JzpcbiAgICAgIGNhc2UgJzgnOlxuICAgICAgY2FzZSAnOSc6XG4gICAgICBjYXNlICctJzpcbiAgICAgICAgcGFyc2VkTnVtID0gJyc7XG4gICAgICAgIGktLTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBudW1DaGFyID0gc3RyW2krK107XG4gICAgICAgICAgaWYgKC9bXFxkXFwuXFwtZVxcK10vLnRlc3QobnVtQ2hhcikpIHtcbiAgICAgICAgICAgIHBhcnNlZE51bSArPSBudW1DaGFyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9wKHBhcnNlRmxvYXQocGFyc2VkTnVtKSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnXCInOlxuICAgICAgICBwYXJzZWRTdHJpbmcgPSAnJztcbiAgICAgICAgbGFzdENoID0gdm9pZCAwO1xuICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGNoID0gc3RyW2krK107XG4gICAgICAgICAgaWYgKGNoICE9PSAnXCInIHx8IChsYXN0Q2ggPT09ICdcXFxcJyAmJlxuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgJSAyID09PSAxKSkge1xuICAgICAgICAgICAgcGFyc2VkU3RyaW5nICs9IGNoO1xuICAgICAgICAgICAgbGFzdENoID0gY2g7XG4gICAgICAgICAgICBpZiAobGFzdENoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgbnVtQ29uc2VjdXRpdmVTbGFzaGVzKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9wKEpTT04ucGFyc2UoJ1wiJyArIHBhcnNlZFN0cmluZyArICdcIicpLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdbJzpcbiAgICAgICAgYXJyYXlFbGVtZW50ID0geyBlbGVtZW50OiBbXSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKGFycmF5RWxlbWVudC5lbGVtZW50KTtcbiAgICAgICAgbWV0YVN0YWNrLnB1c2goYXJyYXlFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd7JzpcbiAgICAgICAgb2JqRWxlbWVudCA9IHsgZWxlbWVudDoge30sIGluZGV4OiBzdGFjay5sZW5ndGggfTtcbiAgICAgICAgc3RhY2sucHVzaChvYmpFbGVtZW50LmVsZW1lbnQpO1xuICAgICAgICBtZXRhU3RhY2sucHVzaChvYmpFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ3VuZXhwZWN0ZWRseSByZWFjaGVkIGVuZCBvZiBpbnB1dDogJyArIGNvbGxhdGlvbkluZGV4KTtcbiAgICB9XG4gIH1cbn07XG4iLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuXG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpOyAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG5cbiAgcm5kc1s2XSA9IHJuZHNbNl0gJiAweDBmIHwgMHg0MDtcbiAgcm5kc1s4XSA9IHJuZHNbOF0gJiAweDNmIHwgMHg4MDsgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG5cbiAgaWYgKGJ1Zikge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICByZXR1cm4gc3RyaW5naWZ5KHJuZHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2NDsiLCJpbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgRHJhZ0FjdGlvbiwgRWRpdG9yQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgQkJveCwgaXNPdXRPZlNWR0JvdW5kcywgZ2V0R2x5cGhCQm94IH0gZnJvbSAnLi9Db29yZGluYXRlcyc7XG5pbXBvcnQgeyBxdWV1ZU5vdGlmaWNhdGlvbiB9IGZyb20gJy4vTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IHNlbGVjdEFsbCwgc2VsZWN0QkJveCwgc2VsZWN0U3RhZmYgfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuY2xhc3MgRHJhZ0hhbmRsZXIge1xuICByZWFkb25seSBuZW9uVmlldzogTmVvblZpZXc7XG4gIHByaXZhdGUgc2VsZWN0b3I6IHN0cmluZztcbiAgcHJpdmF0ZSBzZWxlY3Rpb246IFNWR0dyYXBoaWNzRWxlbWVudFtdO1xuICBwcml2YXRlIG5vTW92ZVByZWNlZGVzOiBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICBwcml2YXRlIGRyYWdTdGFydENvb3JkczogW251bWJlciwgbnVtYmVyXSA9IFstMSwgLTFdO1xuICBwcml2YXRlIHJlc2V0VG9BY3Rpb246IChzZWxlY3Rpb246IGQzLlNlbGVjdGlvbjxkMy5CYXNlVHlwZSwgdW5rbm93biwgSFRNTEVsZW1lbnQsIHVua25vd24+LCBhcmdzOiB1bmtub3duW10pID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBkeDogbnVtYmVyO1xuICBwcml2YXRlIGR5OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzZWxlY3RvciAtIENTUyBzZWxlY3RvciBvZiBlbGVtZW50IHRvIGFwcGx5IGRyYWcgaGFuZGxlciB0by5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcsIHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGRyYWdnaW5nIGFjdGlvbiBhbmQgaGFuZGxlciBmb3Igc2VsZWN0ZWQgZWxlbWVudHMuXG4gICAqL1xuICBkcmFnSW5pdCAoKTogdm9pZCB7XG4gICAgLy8gRHJhZyBlZmZlY3RzXG4gICAgZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQgKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnU3RhcnRDb29yZHMgPSBbZDMuZXZlbnQueCwgZDMuZXZlbnQueV07XG4gICAgICB0aGlzLmR4ID0gMDtcbiAgICAgIHRoaXMuZHkgPSAwO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZDMuZXZlbnQuc291cmNlRXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgICAgZDMuc2VsZWN0KHRoaXMuc2VsZWN0b3IpLmNhbGwoZHJhZ0JlaGF2aW91cik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkaW5nIGxpc3RlbmVyc1xuICAgIGNvbnN0IGRyYWdCZWhhdmlvdXIgPSBkMy5kcmFnKClcbiAgICAgIC5vbignc3RhcnQnLCBkcmFnU3RhcnRlZC5iaW5kKHRoaXMpKVxuICAgICAgLm9uKCdkcmFnJywgdGhpcy5kcmFnZ2luZy5iaW5kKHRoaXMpKVxuICAgICAgLm9uKCdlbmQnLCB0aGlzLmRyYWdFbmRlZC5iaW5kKHRoaXMpKTtcblxuICAgIGNvbnN0IGFjdGl2ZU5jID0gZDMuc2VsZWN0QWxsKCcuc2VsZWN0ZWQnKTtcbiAgICBhY3RpdmVOYy5jYWxsKGRyYWdCZWhhdmlvdXIpO1xuXG4gICAgbGV0IHNlbGVjdGlvbiA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHcmFwaGljc0VsZW1lbnQ+KCcuc2VsZWN0ZWQnKSk7XG5cbiAgICAvLyBpZiB0aGUgdXNlciBkcmFncyB0aGUgZm9sbG93cyBzeWxsYWJsZSBpbiBhIHRvZ2dsZS1saW5rZWQgc3lsbGFibGUsIFxuICAgIC8vIGNhbmNlbCB0aGUgY29tcGVuc2F0aW9uIGZvciBzeWwgbW92ZW1lbnQgaW4gZHJhZ2dpbmcuXG4gICAgdGhpcy5ub01vdmVQcmVjZWRlcyA9IHNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25vLW1vdmluZycpICYmIGVsLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykpO1xuICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5maWx0ZXIoZWwgPT4gIWVsLmNsYXNzTGlzdC5jb250YWlucygnbm8tbW92aW5nJykpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24uY29uY2F0KEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHcmFwaGljc0VsZW1lbnQ+KCcucmVzaXplUG9pbnQnKSkpO1xuICB9XG5cbiAgZHJhZ2dpbmcgKCk6IHZvaWQge1xuICAgIHRoaXMuZHggPSBkMy5ldmVudC54IC0gdGhpcy5kcmFnU3RhcnRDb29yZHNbMF07XG4gICAgdGhpcy5keSA9IGQzLmV2ZW50LnkgLSB0aGlzLmRyYWdTdGFydENvb3Jkc1sxXTtcblxuICAgIHRoaXMubW92ZUVsZW1lbnRzKHRoaXMuc2VsZWN0aW9uLCB0aGlzLmR4LCB0aGlzLmR5KTtcblxuICAgIC8qXG4gICAgICogaWYgd2UncmUgZHJhZ2dpbmcgYSBzeWxsYWJsZSAob3IgbmV1bWUgZXRjKSB0aGVuIHRoZXJlIHdvbid0IGJlIGEgc3lsIHNlbGVjdGVkXG4gICAgICogdGhlbiB3ZSBkb24ndCB3YW50IHRoZSBib3VuZGluZyBib3ggKGlmIGl0IGlzIGRpc3BsYXllZCkgdG8gbW92ZSB3aGVuIGRyYWdnaW5nIHRoZSBuZXVtZXNcbiAgICAgKiBpdCB3aWxsIGJlIGEgY2hpbGQgb2YgdGhlIGVsZW1lbnQgaW4gc2VsZWN0aW9uLCBzbyBpdCB3aWxsIGdldCBtb3ZlZCBpbiB0aGUgYWJvdmUgbG9vcFxuICAgICAqIHNvIHdlIGNhbmNlbCB0aGF0IG1vdmVtZW50IG91dCBoZXJlXG4gICAgICovXG4gICAgY29uc3Qgc3lscyA9IHRoaXMuc2VsZWN0aW9uLmZpbHRlcigoZWwpID0+IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpO1xuICAgIGlmIChzeWxzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLm5vTW92ZVByZWNlZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgYmJveGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUuc2VsZWN0ZWQnKSlcbiAgICAgICAgLm1hcChlbCA9PiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcbiAgICAgIHRoaXMubW92ZUVsZW1lbnRzKGJib3hlcywgLXRoaXMuZHgsIC10aGlzLmR5KTtcbiAgICB9XG4gIH1cblxuXG4gIGRyYWdFbmRlZCAoKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBoYXMgbm90IGJlZW4gbW92ZWQgbW9yZSB0aGFuIDUgcGl4ZWxzIGluIGFueSBkaXJlY3Rpb24sXG4gICAgLy8gZG8gbm90IGRvIGFueSBhY3Rpb25cbiAgICBjb25zdCB4RGlmZiA9IE1hdGguYWJzKHRoaXMuZHgpLCB5RGlmZiA9IE1hdGguYWJzKHRoaXMuZHkpO1xuICAgIGlmICh4RGlmZiA8PSA1ICYmIHlEaWZmIDw9IDUpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMuZHJhZ0luaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgc2VsZWN0aW9uIGZvciBkcmFnZ2FibGUgZWxlbWVudHNcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemVQb2ludCcpKTtcblxuICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGUgc2VsZWN0aW9uIGFycmF5IGlzIG91dCBvZiBib3VuZHMsXG4gICAgLy8gZHJhZyBhY3Rpb25zIHNob3VsZCBub3QgaGFwcGVuLiBSZXR1cm4gYW4gZXJyb3Igbm90aWZpY2F0aW9uIGFuZCByZXNldFxuICAgIC8vIHRoZSBkcmFnIGhhbmRsZXJcbiAgICBpZiAodGhpcy5pc0N1cnNvck91dE9mQm91bmRzKCkgfHwgdGhpcy5pc0RyYWdPdXRPZkJvdW5kcyhzZWxlY3Rpb24pKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIHNlbGVjdGlvbiBiYWNrIHRvIG5vcm1hbCBzdGF0ZVxuICAgICAgdGhpcy5yZXR1cm5FbGVtZW50cyh0aGlzLnNlbGVjdGlvbik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgYm91bmRpbmcgYm94ZXMgYXMgd2VsbFxuICAgICAgY29uc3QgYmJveGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUuc2VsZWN0ZWQnKSlcbiAgICAgICAgLm1hcChlbCA9PiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcbiAgICAgIHRoaXMucmV0dXJuRWxlbWVudHMoYmJveGVzKTtcblxuICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgcmV0dXJuIHF1ZXVlTm90aWZpY2F0aW9uKCdbRkFJTF0gR2x5cGhzIHdlcmUgcGxhY2VkIG91dCBvZiBib3VuZHMhIERyYWcgYWN0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNoYWluIGVkaXRvciBhY3Rpb24gZm9yIHNlbGVjdGlvblxuICAgIGNvbnN0IHBhcmFtQXJyYXk6IEVkaXRvckFjdGlvbltdID0gW107XG4gICAgc2VsZWN0aW9uLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGVsLnRhZ05hbWUgPT09ICdyZWN0JyA/IGVsLmNsb3Nlc3QoJy5zeWwnKS5pZCA6IGVsLmlkO1xuXG4gICAgICBjb25zdCBkcmFnQWN0aW9uOiBEcmFnQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdkcmFnJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIHg6IHRoaXMuZHgsXG4gICAgICAgICAgeTogLXRoaXMuZHksXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHBhcmFtQXJyYXkucHVzaChkcmFnQWN0aW9uKTtcbiAgICB9KTtcbiAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgIHBhcmFtOiBwYXJhbUFycmF5XG4gICAgfTtcblxuICAgIC8vIFNlbmQgZWRpdG9yIGFjdGlvblxuICAgIHRoaXMubmVvblZpZXdcbiAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIE5lb24gcmUtcmVuZGVycyB0aGUgZW50aXJlIFNWRywgYW5kIGhlbmNlLCBiZWZvcmUgd2UgZG8gc28sXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgYWxsIHRoZSBlbGVtZW50cyAoSURzKSB3ZSBuZWVkIHRvIHNlbGVjdCBhZ2FpblxuICAgICAgICAvLyBUaGVuLCB3ZSBuZWVkIHRvIHJlc2VsZWN0IHRoZW0gYnkgY2FsbGluZyBgdGhpcy5yZXNlbGVjdCgpYFxuICAgICAgICBjb25zdCB0b1Jlc2VsZWN0ID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKSlcbiAgICAgICAgICAuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25vLW1vdmluZycpKVxuICAgICAgICAgIC5tYXAoZWwgPT4gZWwuaWQpO1xuXG4gICAgICAgIC8vIENBVVRJT046IGB1cGRhdGVGb3JDdXJyZW50UGFnZSgpYCBpcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24hXG4gICAgICAgIC8vIEl0IHJlcXVpcmVzIGFuIGBhd2FpdGAga2V5d29yZC5cbiAgICAgICAgYXdhaXQgdGhpcy5uZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB0aGlzLmVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIC8vIFJlc2VsZWN0IHRoZSBlbGVtZW50cyBhbmQgcmVpbml0aWFsaXplIGRyYWdcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNlbGVjdCh0b1Jlc2VsZWN0KTtcbiAgICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyByZXNlbGVjdCAodG9SZXNlbGVjdDogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNlbGVjdGVkID0gdG9SZXNlbGVjdC5tYXAoaWQgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxTVkdHcmFwaGljc0VsZW1lbnQ+KGAjJHtpZH1gKSk7XG5cbiAgICAvLyBBbGwgZ2x5cGhzIGV4Y2VwdCBib3VkaW5nIGJveGVzICgnc3lsJ3MpIG11c3QgYmUgc2VsZWN0ZWQgd2l0aFxuICAgIC8vIGBzZWxlY3RBbGwoKWBcbiAgICByZXNlbGVjdGVkXG4gICAgICAuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bCcpKVxuICAgICAgLmZvckVhY2goYXN5bmMgKCkgPT4gYXdhaXQgc2VsZWN0QWxsKHJlc2VsZWN0ZWQsIHRoaXMubmVvblZpZXcsIHRoaXMpKTtcblxuICAgIC8vIEJvdW5kaW5nIGJveGVzIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZCB1c2luZyBgc2VsZWN0QkJveCgpYFxuICAgIHJlc2VsZWN0ZWRcbiAgICAgIC5maWx0ZXIoZWwgPT4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSlcbiAgICAgIC5mb3JFYWNoKFxuICAgICAgICBlbCA9PiBzZWxlY3RCQm94KGVsLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JyksIHRoaXMsIHRoaXMubmVvblZpZXcpXG4gICAgICApO1xuXG4gICAgLy8gU3RhdmVzIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZCB1c2luZyBgc2VsZWN0U3RhZmYoKWBcbiAgICAvLyBBTkQgbXVzdCBiZSBzZWxlY3RlZCB3aXRoIGBzZWxlY3RBbGwoKWAgZm9yIGNvcnJlY3QgYmVoYXZpb3IgKGZvciBzb21lIHJlYXNvbikuXG4gICAgcmVzZWxlY3RlZFxuICAgICAgLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpXG4gICAgICAuZm9yRWFjaChlbCA9PiBzZWxlY3RTdGFmZihlbCwgdGhpcykpO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZDMgYWN0aW9uIHRvIHVzZSBmb3IgW1tyZXNldF1dLiAqL1xuICByZXNldFRvIChyZXNldDogKHNlbGVjdGlvbjogZDMuU2VsZWN0aW9uPGQzLkJhc2VUeXBlLCB1bmtub3duLCBIVE1MRWxlbWVudCwgdW5rbm93bj4sIGFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRUb0FjdGlvbiA9IHJlc2V0O1xuICB9XG5cbiAgLyoqIFJlc2V0IHRvIGEgcHJldmlvdXMgZDMgYWN0aW9uIGZvciBbW3RoaXMuc2VsZWN0b3JdXS4gKi9cbiAgcmVzZXQgKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2V0VG9BY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZDMuc2VsZWN0KHRoaXMuc2VsZWN0b3IpLmNhbGwodGhpcy5yZXNldFRvQWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBlbmRPcHRpb25zU2VsZWN0aW9uICgpOiB2b2lkIHtcbiAgICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICAgIGNvbnN0IGV4dHJhRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKTtcbiAgICBpZiAobW9yZUVkaXQpIHtcbiAgICAgIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhRWRpdCkge1xuICAgICAgZXh0cmFFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgZXh0cmFFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc3VhbGx5IG1vdmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIGJ5IGBkeGAgYW5kIGBkeWA7IChub3QgdXNpbmcgZDMpXG4gICAqL1xuICBtb3ZlRWxlbWVudHMgKHNlbGVjdGlvbjogRWxlbWVudFtdLCBkeDogbnVtYmVyLCBkeTogbnVtYmVyKTogdm9pZCB7XG4gICAgc2VsZWN0aW9uLmZpbHRlcihlbCA9PiBlbCAhPT0gbnVsbCkuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke2R4fSwke2R5fSlgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXN1YWxseSByZXR1cm4gc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgcG9zaXRpb25zXG4gICAqIGJ5IHJlbW92aW5nIHRoZSB0cmFuc2Zvcm0gYXR0cmlidXRlXG4gICAqL1xuICByZXR1cm5FbGVtZW50cyAoc2VsZWN0aW9uOiBFbGVtZW50W10pOiB2b2lkIHtcbiAgICBzZWxlY3Rpb24uZmlsdGVyKGVsID0+IGVsICE9PSBudWxsKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQ3Vyc29yT3V0T2ZCb3VuZHMgKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVuZFggPSB0aGlzLmRyYWdTdGFydENvb3Jkc1swXSArIHRoaXMuZHg7XG4gICAgY29uc3QgZW5kWSA9IHRoaXMuZHJhZ1N0YXJ0Q29vcmRzWzFdICsgdGhpcy5keTtcblxuICAgIHJldHVybiBpc091dE9mU1ZHQm91bmRzKGVuZFgsIGVuZFkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgc2VsZWN0aW9uIGFycmF5IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBTVkdcbiAgICogQHBhcmFtIHtTVkdHcmFwaGljc0VsZW1lbnRbXX0gc2VsZWN0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJcyBzZWxlY3Rpb24gb3V0IG9mIGJvdW5kc1xuICAgKi9cbiAgaXNEcmFnT3V0T2ZCb3VuZHMgKHNlbGVjdGlvbjogU1ZHR3JhcGhpY3NFbGVtZW50W10pOiBib29sZWFuIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kaW5nIGJveGVzIG9mIGFsbCBnbHlwaHMgKDx1c2U+IGVsZW1lbnRzKSB3aXRoaW4gdGhlIHNlbGVjdGlvbiBhcnJheVxuICAgIGNvbnN0IGlzQkJveERpc3BsYXllZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNkaXNwbGF5QkJveCcpLmNoZWNrZWQ7XG4gICAgbGV0IGdseXBoU2VsZWN0b3IgPSBpc0JCb3hEaXNwbGF5ZWQgPyAndXNlLCByZWN0JyA6ICd1c2UnO1xuXG4gICAgaWYgKHNlbGVjdGlvblswXS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIGdseXBoU2VsZWN0b3IgPSAncGF0aCc7XG5cbiAgICBjb25zdCBnbHlwaHM6IFNWR1VzZUVsZW1lbnRbXSA9IHNlbGVjdGlvbi5yZWR1Y2UoXG4gICAgICAoYWNjLCBlbCkgPT4gYWNjLmNvbmNhdCguLi5lbC5xdWVyeVNlbGVjdG9yQWxsKGdseXBoU2VsZWN0b3IpKSwgW11cbiAgICApO1xuICAgIGNvbnN0IGdseXBoQkJveGVzOiBCQm94W10gPSBnbHlwaHMubWFwKGdldEdseXBoQkJveCk7XG5cbiAgICAvLyBHZXQgdGhlIHN1cnJvdW5kaW5nIGJvdW5kaW5nIGJveCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICBjb25zdCBzZWxlY3Rpb25CQm94OiBCQm94ID0gZ2x5cGhCQm94ZXMucmVkdWNlKFxuICAgICAgKGJib3gsIGN1cnIpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bHg6IE1hdGgubWluKGJib3gudWx4LCBjdXJyLnVseCksXG4gICAgICAgICAgdWx5OiBNYXRoLm1pbihiYm94LnVseSwgY3Vyci51bHkpLFxuICAgICAgICAgIGxyeDogTWF0aC5tYXgoYmJveC5scngsIGN1cnIubHJ4KSxcbiAgICAgICAgICBscnk6IE1hdGgubWF4KGJib3gubHJ5LCBjdXJyLmxyeSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB1bHg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIHVseTogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgbHJ4OiBOdW1iZXIuTUlOX1ZBTFVFLFxuICAgICAgICBscnk6IE51bWJlci5NSU5fVkFMVUUsXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHsgdWx4LCB1bHksIGxyeCwgbHJ5IH0gPSBzZWxlY3Rpb25CQm94O1xuICAgIHJldHVybiBpc091dE9mU1ZHQm91bmRzKHVseCArIHRoaXMuZHgsIHVseSArIHRoaXMuZHkpIHx8IGlzT3V0T2ZTVkdCb3VuZHMobHJ4ICsgdGhpcy5keCwgbHJ5ICsgdGhpcy5keSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRHJhZ0hhbmRsZXIgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0ICogYXMgQ29udGVudHMgZnJvbSAnLi9Db250ZW50cyc7XG5pbXBvcnQgKiBhcyBXYXJuaW5ncyBmcm9tICcuLi9XYXJuaW5ncyc7XG5pbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCAqIGFzIFNlbGVjdFRvb2xzIGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCAqIGFzIFNlbGVjdE9wdGlvbnMgZnJvbSAnLi4vU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24sIFRvZ2dsZUxpZ2F0dXJlQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgcmVtb3ZlSGFuZGxlciwgZGVsZXRlQnV0dG9uSGFuZGxlciB9IGZyb20gJy4vU2VsZWN0T3B0aW9ucyc7XG5cbi8qKlxuICogVGhlIE5lb25WaWV3IHBhcmVudCB0byBhY2Nlc3MgZWRpdG9yIGFjdGlvbnMuXG4gKi9cbmxldCBuZW9uVmlldzogTmVvblZpZXc7XG5cbi8qKlxuICogU2V0IHRoZSBuZW9uVmlldyBtZW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TmVvblZpZXcodmlldzogTmVvblZpZXcpOiB2b2lkIHtcbiAgbmVvblZpZXcgPSB2aWV3O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGNhbiBiZSBncm91cGVkIG9yIG5vdFxuICogQHJldHVybnMgdHJ1ZSBpZiBjYW4gYmUgZ3JvdXBlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dyb3VwYWJsZShcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBncm91cHMgPSBBcnJheS5mcm9tKGVsZW1lbnRzLnZhbHVlcygpKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICBpZiAoZ3JvdXBzLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBjYW5ub3QgZ3JvdXAgaWYgb25seSAxIGVsZW1lbnQgaXMgc2VsZWN0ZWRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIC8vIGlmIG5ldW1lcyBhcmUgaW4gc2FtZSBzeWxsYWJsZSwgZG9uJ3QgZGlzcGxheSBncm91cGluZyBvcHRpb25cbiAgICAgIGlmIChTZWxlY3RUb29scy5zaGFyZWRMb2dpY2FsUGFyZW50KHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGNoZWNrIGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgYWRqYWNlbnQgdG8gZWFjaCBvdGhlclxuICAgICAgaWYgKFNlbGVjdFRvb2xzLmFyZUFkamFjZW50KHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0xpbmtlZChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50cz86IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pIHtcbiAgaWYgKCFlbGVtZW50cykge1xuICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLFxuICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gIH1cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSB8fFxuICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlICdzZWxCeU5jJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKVxuICAgICAgICApIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnVGhlIGFjdGlvbiBpbnZvbHZlcyBsaW5rZWQgc3lsbGFibGVzLCBwbGVhc2UgdW50b2dnbGUgdGhlbSBmaXJzdCcsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0ludmFsaWRMaW5rZWRTeWxsYWJsZShcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBib29sZWFuIHtcbiAgLy8gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElOR1xuICAgICkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcblxuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBlbGVtZW50cy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgY29uc3Qgc3lsbGFibGUgPSBlbGVtZW50cy5hdChpZHgpO1xuICAgIGlmIChzeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICAvLyBHZXQgeG1sOmlkIG9mIHRoZSBuZXh0IHN5bGxhYmxlICh3aXRob3V0IHRoZSAjLCBpZiBpdCBleGlzdHMpXG4gICAgICBjb25zdCBuZXh0U3lsbGFibGVJZCA9IHN5bGxhYmxlXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgIC5yZXBsYWNlKCcjJywgJycpO1xuXG4gICAgICAvLyBGaW5kIHRoZSBuZXh0IHN5bGxhYmxlIGFuZCBpdHMgaW5kZXggaW4gdGhlIGFycmF5XG4gICAgICBsZXQgbmV4dFN5bGxhYmxlSWR4OiBudW1iZXI7XG4gICAgICBjb25zdCBuZXh0U3lsbGFibGUgPSBlbGVtZW50cy5maW5kKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQgPT09IG5leHRTeWxsYWJsZUlkKSB7XG4gICAgICAgICAgbmV4dFN5bGxhYmxlSWR4ID0gaWR4O1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgbmV4dCAoZm9sbG93aW5nKSBzeWxsYWJsZSBjYW5ub3QgYmUgZm91bmRcbiAgICAgIGlmICghbmV4dFN5bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIG5leHQgc3lsbGFibGUgaGFzIGJlZW4gZm91bmQsIGJ1dCB0aGUgQGZvbGxvd3MgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIW5leHRTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiAzOiBUaGUgbmV4dCBzeWxsYWJsZSdzIEBmb2xsb3dzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKG5leHRTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykgIT0gJyMnICsgc3lsbGFibGUuaWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiA0OlxuICAgICAgLy8gU2luY2UgdGhlIEBmb2xsb3dzIHZhbHVlIGlzIGNvcnJlY3QsIGEgcGFpciBvZiBzeWxsYWJsZXMgZXhpc3QgZm9yIHRoZSB0b2dnbGUtbGlua2VkIHN5bGxhYmxlLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIEBmb2xsb3dzIHN5bGxhYmxlIGlzIHRoZSBuZXh0IHN5bGxhYmxlIChpbmRleC13aXNlKSBpbiB0aGUgYXJyYXk6XG4gICAgICBpZiAobmV4dFN5bGxhYmxlSWR4ICE9PSBpZHggKyAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3lsbGFibGUuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpKSB7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGVJZCA9IHN5bGxhYmxlXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJylcbiAgICAgICAgLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGUgPSBlbGVtZW50cy5maW5kKFxuICAgICAgICAoc3lsbGFibGUpID0+IHN5bGxhYmxlLmlkID09PSBwcmV2U3lsbGFibGVJZCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgcHJldmlvdXMgc3lsbGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICAgIGlmICghcHJldlN5bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIHByZXZpb3VzIHN5bGxhYmxlIGV4aXN0cywgYnV0IHRoZSBAcHJlY2VkZXMgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIXByZXZTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMzogVGhlIHByZXZpb3VzIHN5bGxhYmxlJ3MgQHByZWNlZGVzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKHByZXZTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICE9ICcjJyArIHN5bGxhYmxlLmlkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB0byBzZWUgaXMgYSBzZWxlY3Rpb24gb2YgZWxlbWVudHMgaXMgYWxyZWFkeSBsaW5rZWRcbiAqIEBwYXJhbSBlbGVtZW50cyBlbGVtZW50cyB0byBiZSBjb25zaWRlcmVkXG4gKiBAcmV0dXJucyB0cnVlIGlzIGxpbmtlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xpbmtlZChlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pik6IGJvb2xlYW4ge1xuICAvLyBldmVyeSBlbGVtZW50IHNob3VsZCBiZSBsaW5rZWRcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgaWYgKFxuICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSAmJlxuICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEFzc3VtaW5nIGFsbCBlbGVtZW50cyBhcmUgdmFsaWQsXG4gKiBjaGVjayBpZiB0aGUgZWxlbWVudHMgY2FuIGJlIGxpbmtlZDpcbiAqIDEuIHNvcnQgZWxlbWVudHMgYmFzZWQgb24gdGhlaXIgb3JkZXIgaW4gdGhlIERPTVxuICogMi4gZW5zdXJlIGVsZW1lbnRzIGFyZSBhZGphY2VudCBpbiB0aGUgRE9NXG4gKiAzLiBlbnN1cmUgZWxlbWVudHMgYmVsb25nIHRvIGFkamFjZW50IHN0YXZlc1xuICogNC4gY2hlY2sgaWYgY2FuIGJlIGxpbmtlZDpcbiAqICAgIDQuMSBpZiBleGFjdGx5IHR3byBlbGVtZW50cywgYm90aCBuZWVkcyB0byBiZSB1bmxpbmtlZFxuICogICAgNC4yIGlmIG1vcmUgdGhhbiB0d28gZWxlbWVudHMsIG9ubHkgb25lIGVsZW1lbnQgY2FuIGJlIHVubGlua2VkLFxuICogICAgICAgIGF0IGVpdGhlciBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBzZXF1ZW5jZVxuICogQHBhcmFtIGVsZW1lbnRzIGVsZW1lbnRzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEByZXR1cm5zIHRydWUgY2FuIGJlIGxpbmtlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuQmVMaW5rZWQoZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4pOiBib29sZWFuIHtcbiAgLy8gMS4gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdGFmZkEgPSBhLmNsb3Nlc3QoJy5zdGFmZicpO1xuICAgIGNvbnN0IHN0YWZmQiA9IGIuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgcmV0dXJuIHN0YWZmQS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFmZkIpICZcbiAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICA/IC0xXG4gICAgICA6IDE7XG4gIH0pO1xuXG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykpO1xuICBjb25zdCBzeWxsYWJsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxsYWJsZScpKTtcblxuICAvLyAyLiBFbnN1cmUgc3lsbGFibGVzIGFyZSBhZGphY2VudCBpbiB0aGUgRE9NXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IG5leHQgPSBlbGVtZW50c1tpICsgMV07XG4gICAgY29uc3QgY3VycmVudFN5bGxhYmxlSW5kZXggPSBzeWxsYWJsZXMuaW5kZXhPZihjdXJyZW50KTtcbiAgICBjb25zdCBuZXh0U3lsbGFibGVJbmRleCA9IHN5bGxhYmxlcy5pbmRleE9mKG5leHQpO1xuICAgIGlmIChuZXh0U3lsbGFibGVJbmRleCAtIGN1cnJlbnRTeWxsYWJsZUluZGV4ICE9PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIFN0YXZlcyBtdXN0IGJlIGFkamFjZW50XG4gICAgfVxuICAgIC8vIDMuIEVuc3VyZSBzeWxsYWJsZXMgYmVsb25nIHRvIGFkamFjZW50IHN0YXZlc1xuICAgIGNvbnN0IGN1cnJlbnRTdGFmZiA9IGN1cnJlbnQuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgY29uc3QgbmV4dFN0YWZmID0gbmV4dC5jbG9zZXN0KCcuc3RhZmYnKTtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGFmZkluZGV4ID0gc3RhdmVzLmluZGV4T2YoY3VycmVudFN0YWZmIGFzIEhUTUxFbGVtZW50KTtcbiAgICBjb25zdCBuZXh0U3RhZmZJbmRleCA9IHN0YXZlcy5pbmRleE9mKG5leHRTdGFmZiBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKG5leHRTdGFmZkluZGV4IC0gY3VycmVudFN0YWZmSW5kZXggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gU3RhdmVzIG11c3QgYmUgYWRqYWNlbnRcbiAgICB9XG4gIH1cblxuICAvLyA0LjEgSGFuZGxlIGNhc2UgZm9yIGV4YWN0bHkgdHdvIHN5bGxhYmxlc1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmV2ZXJ5KFxuICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiZcbiAgICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpLFxuICAgICk7XG4gIH1cblxuICAvLyA0LjIgSGFuZGxlIGNhc2UgZm9yIG1vcmUgdGhhbiB0d28gc3lsbGFibGVzXG4gIGNvbnN0IHVubGlua2VkRWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgKGVsZW1lbnQpID0+XG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICYmXG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyksXG4gICk7XG5cbiAgaWYgKHVubGlua2VkRWxlbWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBPbmx5IG9uZSB1bmxpbmtlZCBzeWxsYWJsZSBpcyBhbGxvd2VkXG4gIH1cblxuICAvLyBUaGUgdW5saW5rZWQgc3lsbGFibGUgc2hvdWxkIGJlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kXG4gIGNvbnN0IGZpcnN0VW5saW5rZWQgPSB1bmxpbmtlZEVsZW1lbnRzWzBdO1xuXG4gIHJldHVybiAoXG4gICAgZWxlbWVudHMuaW5kZXhPZihmaXJzdFVubGlua2VkKSA9PT0gMCB8fFxuICAgIGVsZW1lbnRzLmluZGV4T2YoZmlyc3RVbmxpbmtlZCkgPT09IGVsZW1lbnRzLmxlbmd0aCAtIDFcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgY2FuIGJlIGxpbmtlZCBvciB1bmxpa25lZC5cbiAqIEBwYXJhbSBzZWxlY3Rpb25UeXBlIEN1cnJlbnQgc2VsZWN0aW9uIG1vZGUuIE9ubHkgY2VydGFpbiBlbGVtZW50cyBjYW4gYmUgbGlua2VkXG4gKiBAcGFyYW0gZWxlbWVudHMgVGhlIGVsZW1lbnRzIHVuZGVyIHF1ZXN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gbGluayBvciB1bi1saW5rIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGlua2FibGUoXG4gIHNlbGVjdGlvblR5cGU6IHN0cmluZyxcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBib29sZWFuIHtcbiAgLy8gY2Fubm90IHRvZ2dsZSBsaW5rIGZvciBzeWxsYWJsZSBzZWxlY3Rpb24gaWYgbnVtYmVyIG9mIHNlbGVjdGVkXG4gIC8vIHN5bGxhYmxlcyBpcyBzbWFsbGVyIHRoYW4gMlxuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIG9ubHkgU3lsbGFibGVzIGNhbiBiZSBsaW5rZWQgb3IgdW5saW5rZWQgKD8pXG4gIGlmIChzZWxlY3Rpb25UeXBlICE9PSAnc2VsQnlTeWxsYWJsZScpIHJldHVybiBmYWxzZTtcblxuICAvLyBDaGVjayBpZiBoYXMgaW52YWxpZCBsaW5rZWQgc3lsbGFibGVzXG4gIGlmIChoYXNJbnZhbGlkTGlua2VkU3lsbGFibGUoZWxlbWVudHMpKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoZSBzZWxlY3RlZCBzeWxsYWJsZXMgaW5jbHVkZSBpbnZhbGlkIGxpbmtlZCBzeWxsYWJsZShzKSEnLFxuICAgICAgJ3dhcm5pbmcnLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gaWYgQUxSRUFEWSBsaW5rZWRcbiAgaWYgKGlzTGlua2VkKGVsZW1lbnRzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIGlmIENBTiBiZSBsaW5rZWRcbiAgZWxzZSBpZiAoY2FuQmVMaW5rZWQoZWxlbWVudHMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTWVyZ2Ugc2VsZWN0ZWQgc3RhdmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVN0YXZlcygpOiB2b2lkIHtcbiAgY29uc3Qgc3lzdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGFmZi5zZWxlY3RlZCcpO1xuICBjb25zdCBlbGVtZW50SWRzID0gW107XG4gIHN5c3RlbXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICBlbGVtZW50SWRzLnB1c2goc3RhZmYuaWQpO1xuICB9KTtcbiAgY29uc3QgZWRpdG9yQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnbWVyZ2UnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWRzOiBlbGVtZW50SWRzLFxuICAgIH0sXG4gIH07XG4gIG5lb25WaWV3XG4gICAgLmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1N0YWZmIE1lcmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdNZXJnZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIHRoZSBncm91cGluZyBzZWxlY3Rpb24gbWVudS5cbiAqIEBwYXJhbSB0eXBlIC0gVGhlIGdyb3VwaW5nIHR5cGU6IG5jLCBuZXVtZSwgc3lsLCBsaWdhdHVyZU5jLCBvciBsaWdhdHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckdyb3VwaW5nKHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICBtb3JlRWRpdC5pbm5lckhUTUwgKz0gQ29udGVudHMuZ3JvdXBpbmdNZW51W3R5cGVdO1xuICBpbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGdyb3VwaW5nIHNlbGVjdGlvbiBtZW51LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kR3JvdXBpbmdTZWxlY3Rpb24oKTogdm9pZCB7XG4gIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkxpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBUaGUgZ3JvdXBpbmcgZHJvcGRvd24gbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gIGNvbnN0IGRlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUnKTtcbiAgZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlSGFuZGxlcik7XG4gIGRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkxpc3RlbmVyKTtcblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXJnZVN5bHMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGlmIChjb250YWluc0xpbmtlZChTZWxlY3RUb29scy5nZXRTZWxlY3Rpb25UeXBlKCkpKSByZXR1cm47XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSxcbiAgICAgICk7XG4gICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cE5ldW1lcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgaWYgKGNvbnRhaW5zTGlua2VkKFNlbGVjdFRvb2xzLmdldFNlbGVjdGlvblR5cGUoKSkpIHJldHVybjtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRJZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSxcbiAgICAgICk7XG4gICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cE5jcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpLmZpbHRlcigoZSkgPT5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduYycpLFxuICAgICAgKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduYycsIGVsZW1lbnRJZHMpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZ3JvdXBOZXVtZXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgZ3JvdXBpbmdBY3Rpb24oJ3VuZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bmdyb3VwTmNzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtbGlnYXR1cmUnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0SWRzKCk7XG5cbiAgICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBUb2dnbGVMaWdhdHVyZUFjdGlvbiA9IHtcbiAgICAgICAgICBhY3Rpb246ICd0b2dnbGVMaWdhdHVyZScsXG4gICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgbmVvblZpZXdcbiAgICAgICAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTGlnYXR1cmUgVG9nZ2xlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0xpZ2F0dXJlIFRvZ2dsZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlLWxpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG4vKipcbiAqIEdyb3VwaW5nL1VuZ3JvdXBpbmcga2V5YmluZGluZyBldmVudCBsaXN0ZW5lclxuICovXG5jb25zdCBrZXlkb3duTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICBpZiAoZS5rZXkgPT09ICdnJykge1xuICAgIC8vIGdldCBzZWxlY3RlZCBlbGVtZW50cyB0byBjaGVjayBpZiB0aGV5IGNhbiBiZSBncm91cGVkc1xuICAgIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLFxuICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gU2VsZWN0VG9vbHMuZ2V0U2VsZWN0aW9uVHlwZSgpO1xuXG4gICAgaWYgKGNvbnRhaW5zTGlua2VkKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkgcmV0dXJuO1xuXG4gICAgLy8gR3JvdXAvbWVyZ2Ugb3IgdW5ncm91cC9zcGxpdCBiYXNlZCBvbiBzZWxlY3Rpb24gdHlwZVxuICAgIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICAgIC8vIGlmIHN5bGxhYmxlcyBhcmUgbGlubmthYmxlLCB0b2dnbGUgbGlua2VkIHN5bGxhYmxlXG4gICAgICAgIC8vIGxpbmtlZCBzeWxsYWJsZXMgY2Fubm90IGJlIGdyb3VwZWQvdW5ncm91cGVkXG4gICAgICAgIGlmIChpc0xpbmthYmxlKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkge1xuICAgICAgICAgIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGlmIGdyb3VwYWJsZSBiZWZvcmUgZ3JvdXBpbmdcbiAgICAgICAgZWxzZSBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldENoaWxkcmVuSWRzKCkuZmlsdGVyKChlKSA9PlxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduZXVtZScpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZ3JvdXBpbmdBY3Rpb24oJ2dyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2FuIG9ubHkgdW5ncm91cCBpZiBsZW5ndGggaXMgMSAob25lIHN5bGxhYmxlIHNlbGVjdGVkKVxuICAgICAgICAvLyBjYW5ub3QgdW5ncm91cCBpZiBtdWx0aXBsZSBzeWxsYWJsZXMgYXJlIHNlbGVjdGVkXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduZXVtZScsIGVsZW1lbnRJZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduYycsIGVsZW1lbnRJZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgbWVyZ2VTdGF2ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTdGFmZlNwbGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBDYW4ndCBwZXJmb3JtIGdyb3VwaW5nL3VuZ3JvdXBpbmcgYWN0aW9uIG9uIHNlbGVjdGlvbiB0eXBlICR7c2VsZWN0aW9uVHlwZX0uYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBGb3JtIGFuZCBleGVjdXRlIGEgZ3JvdXAvdW5ncm91cCBhY3Rpb24uXG4gKiBAcGFyYW0gYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBleGVjdXRlLiBFaXRoZXIgXCJncm91cFwiIG9yIFwidW5ncm91cFwiLlxuICogQHBhcmFtIGdyb3VwVHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGdyb3VwLiBFaXRoZXIgXCJuZXVtZVwiIG9yIFwibmNcIi5cbiAqIEBwYXJhbSBlbGVtZW50SWRzIC0gVGhlIElEcyBvZiB0aGUgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGdyb3VwaW5nQWN0aW9uKFxuICBhY3Rpb246ICdncm91cCcgfCAndW5ncm91cCcsXG4gIGdyb3VwVHlwZTogJ25ldW1lJyB8ICduYycsXG4gIGVsZW1lbnRJZHM6IHN0cmluZ1tdLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVkaXRvckFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIHBhcmFtOiB7XG4gICAgICBncm91cFR5cGU6IGdyb3VwVHlwZSxcbiAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgfSxcbiAgfTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChhY3Rpb24gPT09ICdncm91cCcpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIFN1Y2Nlc3MnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignVW5ncm91cGluZyBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2dyb3VwJykge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignR3JvdXBpbmcgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdVbmdyb3VwaW5nIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuXG4gICAgICAvLyBQcm9tcHQgdXNlciB0byBjb25maXJtIGlmIE5lb24gZG9lcyBub3QgcmUgY29nbml6ZSBjb250b3VyXG4gICAgICBpZiAoZ3JvdXBUeXBlID09PSAnbmMnKSB7XG4gICAgICAgIGNvbnN0IG5ldW1lUGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgZWxlbWVudElkc1swXSxcbiAgICAgICAgKS5wYXJlbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBuY3MgPSBBcnJheS5mcm9tKG5ldW1lUGFyZW50LmNoaWxkcmVuKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcbiAgICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91cihuY3MpO1xuICAgICAgICBpZiAoY29udG91ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgV2FybmluZ3MuZ3JvdXBpbmdOb3RSZWNvZ25pemVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHVubGluayhlbGVtZW50SWRzOiBzdHJpbmdbXSk6IEFycmF5PEVkaXRvckFjdGlvbj4ge1xuICBjb25zdCBwYXJhbSA9IG5ldyBBcnJheTxFZGl0b3JBY3Rpb24+KCk7XG4gIGZvciAoY29uc3QgaWQgb2YgZWxlbWVudElkcykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3ByZWNlZGVzJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmFtO1xufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBhbiBlbGVtZW50IGJ5IElEIGFuZCBlbnN1cmUgaXQncyBhbiBTVkdHcmFwaGljc0VsZW1lbnRcbmZ1bmN0aW9uIGdldFNWR0dyYXBoaWNzRWxlbWVudEJ5SWQoaWQ6IHN0cmluZyk6IFNWR0dyYXBoaWNzRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNWR0dyYXBoaWNzRWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRUb2dnbGVTeWxsYWJsZUlkcyhcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBbU1ZHR3JhcGhpY3NFbGVtZW50LCBTVkdHcmFwaGljc0VsZW1lbnRdIHtcbiAgLy8gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdGFmZkEgPSBhLmNsb3Nlc3QoJy5zdGFmZicpO1xuICAgIGNvbnN0IHN0YWZmQiA9IGIuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgcmV0dXJuIHN0YWZmQS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFmZkIpICZcbiAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICA/IC0xXG4gICAgICA6IDE7XG4gIH0pO1xuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gW2VsZW1lbnRzWzBdLCBlbGVtZW50c1sxXV07XG4gIH1cblxuICBjb25zdCB1bmxpbmtlZEVsZW1lbnQgPSBlbGVtZW50cy5maW5kKFxuICAgIChlbCkgPT4gIWVsLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiYgIWVsLmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSxcbiAgKTtcblxuICBpZiAodW5saW5rZWRFbGVtZW50KSB7XG4gICAgY29uc3QgaW5kZXggPSBlbGVtZW50cy5pbmRleE9mKHVubGlua2VkRWxlbWVudCk7XG5cbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBbZWxlbWVudHNbaW5kZXhdLCBlbGVtZW50c1tpbmRleCArIDFdXTtcbiAgICB9IGVsc2UgaWYgKGluZGV4ID09PSBlbGVtZW50cy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gW2VsZW1lbnRzW2luZGV4IC0gMV0sIGVsZW1lbnRzW2luZGV4XV07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoYXQgYWN0aW9uIChsaW5rL3VubGluaykgdG8gcGVyZm9ybSB3aGVuIHVzZXIgY2xpY2tzIG9uIFwiVG9nZ2xlIExpbmtlZCBTeWxsYWJsZVwiXG4gKiBBbHNvIGNhbGxlZCB3aGVuIGNvcnJlc3BpbmRpbmcgaG90a2V5IGlzIHByZXNzZWQuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpIHtcbiAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICBjb25zdCBjaGFpbkFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICBwYXJhbTogW10sXG4gIH07XG4gIGNvbnN0IHBhcmFtID0gbmV3IEFycmF5PEVkaXRvckFjdGlvbj4oKTtcblxuICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnRJZHNcbiAgICAubWFwKGdldFNWR0dyYXBoaWNzRWxlbWVudEJ5SWQpIC8vIE1hcCBJRHMgdG8gU1ZHR3JhcGhpY3NFbGVtZW50IG9yIG51bGxcbiAgICAuZmlsdGVyKChlbCk6IGVsIGlzIFNWR0dyYXBoaWNzRWxlbWVudCA9PiBlbCAhPT0gbnVsbCk7XG5cbiAgaWYgKGlzTGlua2VkKGVsZW1lbnRzKSkge1xuICAgIHBhcmFtLnB1c2goLi4udW5saW5rKGVsZW1lbnRJZHMpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbZmlyc3RTeWxsYWJsZSwgc2Vjb25kU3lsbGFibGVdID0gZ2V0VG9nZ2xlU3lsbGFibGVJZHMoZWxlbWVudHMpO1xuICAgIGNvbnNvbGUubG9nKGZpcnN0U3lsbGFibGUuaWQsIHNlY29uZFN5bGxhYmxlLmlkKTtcbiAgICBwYXJhbS5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGZpcnN0U3lsbGFibGUuaWQsXG4gICAgICAgIGF0dHJUeXBlOiAncHJlY2VkZXMnLFxuICAgICAgICBhdHRyVmFsdWU6ICcjJyArIHNlY29uZFN5bGxhYmxlLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBwYXJhbS5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IHNlY29uZFN5bGxhYmxlLmlkLFxuICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICBhdHRyVmFsdWU6ICcjJyArIGZpcnN0U3lsbGFibGUuaWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIERlbGV0ZSBzeWwgb24gc2Vjb25kIHN5bGxhYmxlXG4gICAgY29uc3Qgc3lsID0gc2Vjb25kU3lsbGFibGUucXVlcnlTZWxlY3RvcignLnN5bCcpO1xuICAgIGlmIChzeWwgIT09IG51bGwpIHtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogc3lsLmlkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY2hhaW5BY3Rpb24ucGFyYW0gPSBwYXJhbTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdUb2dnbGVkIFN5bGxhYmxlIExpbmsnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICdGYWlsZWQgdG8gVG9nZ2xlIFN5bGxhYmxlIExpbmsnLFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbmRHcm91cGluZ1NlbGVjdGlvbigpO1xuICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgSURzIG9mIHNlbGVjdGVkIGVsZW1lbnRzLlxuICovXG5mdW5jdGlvbiBnZXRJZHMoKTogc3RyaW5nW10ge1xuICBjb25zdCBpZHMgPSBbXTtcbiAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGlkcy5wdXNoKGVsLmlkKTtcbiAgfSk7XG4gIHJldHVybiBpZHM7XG59XG5cbi8qKlxuICogQHJldHVybnMgVGhlIElEcyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMnIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBnZXRDaGlsZHJlbklkcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNoaWxkcmVuSWRzID0gW107XG4gIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBpZiAoXG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSB8fFxuICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpIHx8XG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoKSA9PiB7XG4gICAgICBjaGlsZHJlbklkcy5wdXNoKGNoLmlkKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBjaGlsZHJlbklkcztcbn1cbiIsImV4cG9ydCB7IElFbnRyeSwgSUZpbGUsIElGb2xkZXIsIEVudHJ5VHlwZSB9IGZyb20gJy4vRmlsZVN5c3RlbUludGVyZmFjZXMnO1xuZXhwb3J0IHsgRmlsZVN5c3RlbVRvb2xzIH0gZnJvbSAnLi9GaWxlU3lzdGVtVG9vbHMnO1xuZXhwb3J0IHsgRmlsZVN5c3RlbU1hbmFnZXIgfSBmcm9tICcuL0ZpbGVTeXN0ZW1NYW5hZ2VyJzsiLCJpbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICcuL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBlcnJvckxvZ3NQYW5lbENvbnRlbnRzIH0gZnJvbSAnLi4vU3F1YXJlRWRpdC9Db250ZW50cyc7XG5pbXBvcnQgeyBzZXRTZXR0aW5ncywgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0xvY2FsU2V0dGluZ3MnO1xuaW1wb3J0IHsgTW9kYWxXaW5kb3csIE1vZGFsV2luZG93VmlldyB9IGZyb20gJy4vTW9kYWxXaW5kb3cnO1xuXG5mdW5jdGlvbiBjcmVhdGVMb2dNZXNzYWdlIChub3RpZjogTm90aWZpY2F0aW9uKTogRWxlbWVudCB7XG4gIGNvbnN0IG5vdGlmRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5vdGlmRGl2LmNsYXNzTGlzdC5hZGQoJ25vdGlmaWNhdGlvbi1jb250YWluZXInKTtcbiAgbm90aWZEaXYuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvbi13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctbWFpblwiPiR7bm90aWYubWVzc2FnZX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1leHRyYVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tYnRuLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLWxvZy1pbmZvLWljb24td3JhcHBlclwiPlxuICAgICAgICAgIDxpbWcgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGNsYXNzPVwibm90aWYtbG9nLWluZm8taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9ub3RpZmljYXRpb24taW5mby1pY29uLWxpZ2h0LnN2Z1wiIHRpdGxlPVwiTG9nIE1lc3NhZ2VcIj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLXJlbW92ZS1pY29uLXdyYXBwZXJcIj5cbiAgICAgICAgICA8aW1nIGNsYXNzPVwibG9nLXJlbW92ZSBub3RpZi1yZW1vdmUtaWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9nYXJiYWdlLWNsb3NlZC5zdmdcIiB0aXRsZT1cIlJlbW92ZVwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICBgO1xuXG4gIGNvbnN0IHJlbW92ZUJ0biA9IG5vdGlmRGl2LnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcubG9nLXJlbW92ZScpO1xuICByZW1vdmVCdG4ub25jbGljayA9ICgpID0+IG5vdGlmRGl2LnJlbW92ZSgpO1xuICByZW1vdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgIHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvZ2FyYmFnZS1vcGVuLnN2Z2ApO1xuICB9KTtcbiAgcmVtb3ZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgIHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvZ2FyYmFnZS1jbG9zZWQuc3ZnYCk7XG4gIH0pO1xuXG4gIGlmIChub3RpZi5sb2dJbmZvKSB7XG4gICAgY29uc3QgaW5mb0J0biA9IG5vdGlmRGl2LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcubm90aWYtbG9nLWluZm8taWNvbicpO1xuICAgIGluZm9CdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gICAgcmVtb3ZlQnRuLnN0eWxlLmhlaWdodCA9ICcyMHB4JztcblxuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgaW5mb0J0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvbm90aWZpY2F0aW9uLWluZm8taWNvbi1kYXJrLnN2Z2ApO1xuICAgIH0pO1xuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB7XG4gICAgICBpbmZvQnRuLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9ub3RpZmljYXRpb24taW5mby1pY29uLWxpZ2h0LnN2Z2ApO1xuICAgIH0pO1xuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBvcGVuRXJyb3JMb2dXaW5kb3cobm90aWYubG9nSW5mbykpO1xuICB9XG5cbiAgcmV0dXJuIG5vdGlmRGl2O1xufVxuXG5cbi8qKlxuICogQWRkIG5vdGlmaWNhdGlvbiB0byB0aGUgcGVyc2lzdGVudCBlcnJvciBsb2cgb24gdGhlIHNpZGViYXJcbiAqIEBwYXJhbSBub3RpZiB7Tm90aWZpY2F0aW9ufSBOb3RpZmljYXRpb24gdG8gYWRkIHRvIHRoZSBlcnJvciBsb2dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE5vdGlmaWNhdGlvbiAobm90aWY6IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICBjb25zdCBsb2cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JMb2dDb250ZW50cycpO1xuICBsb2cucHJlcGVuZChjcmVhdGVMb2dNZXNzYWdlKG5vdGlmKSk7XG59XG5cblxuLyoqXG4gKiBJbml0aWFsaXplIGVycm9yIGxvZy5cbiAqIEFkZHMgbmVjZXNzYXJ5IEhUTUwgdG8gRE9NLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEVycm9yTG9nKCk6IHZvaWQge1xuICAvLyBFcnJvciBsb2cgcGFuZWxcbiAgY29uc3QgbG9nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yX2xvZycpO1xuICBsb2cuaW5uZXJIVE1MID0gZXJyb3JMb2dzUGFuZWxDb250ZW50cztcblxuICBpbml0RXJyb3JMb2dDb250cm9scygpO1xufVxuXG5cbi8qKlxuICogU2V0IHVwIGV2ZW50IGxpc3RlbmVycyBmb3IgZXJyb3IgTG9nIHBhbmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RXJyb3JMb2dDb250cm9scygpOiB2b2lkIHtcbiAgY29uc3QgZXJyb3JQYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvcl9sb2cnKTtcbiAgY29uc3QgaGVhZGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvckxvZ0hlYWRpbmcnKTtcbiAgY29uc3QgZHJvcGRvd25JY29uID0gaGVhZGluZy5xdWVyeVNlbGVjdG9yKCdzdmcgPiB1c2UnKTtcbiAgY29uc3QgY29udGVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JMb2dDb250ZW50cycpIGFzIEhUTUxFbGVtZW50O1xuXG4gIGNvbnN0IHsgZGlzcGxheUVyckxvZyB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgaWYgKGRpc3BsYXlFcnJMb2cpIGVycm9yUGFuZWwuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuXG4gIGhlYWRpbmcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy8gaWYgZXJyb3IgcGFuZWwgaXMgY2xvc2VkLCBvcGVuIGl0XG4gICAgaWYgKGNvbnRlbnRzLmNsYXNzTGlzdC5jb250YWlucygnY2xvc2VkJykpIHtcbiAgICAgIC8vIHNldCBjbGFzc2VzIGFuZCBzdHlsZXMgZm9yIGFuIG9wZW4gcGFuZWxcbiAgICAgIGNvbnRlbnRzLmNsYXNzTGlzdC5yZW1vdmUoJ2Nsb3NlZCcpO1xuICAgICAgY29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwLjVlbSAwLjc1ZW0nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ3Zpc2libGUnO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIGRyb3Bkb3duSWNvbi5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25gKTtcbiAgICB9IFxuICAgIC8vIGlmIGVycm9yIHBhbmVsIGlzIG9wZW4sIGNsb3NlIGl0XG4gICAgZWxzZSB7XG4gICAgICAvLyBzZXQgY2xhc3NlcyBhbmQgc3R5bGVzIGZvciBhIGNsb3NlZCBwYW5lbFxuICAgICAgY29udGVudHMuY2xhc3NMaXN0LmFkZCgnY2xvc2VkJyk7XG4gICAgICBjb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMHB4JztcbiAgICAgIH0sIDIwMCk7XG4gICAgICBkcm9wZG93bkljb24uc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1zaWRlYCk7XG4gICAgfVxuICB9KTtcblxuICBpbml0RGlzcGxheUxpc3RlbmVyKCk7XG59XG5cblxuLyoqXG4gKiBJbml0aWFsaXplcyBjbGljayBsaXN0ZW5lciBvbiBcIlNob3cgZXJyb3IgbG9nc1wiIGJ1dHRvbiBpbiBcIlZpZXdcIiBkcm9wZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXREaXNwbGF5TGlzdGVuZXIoKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrYm94ZXNDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGlzcGxheS1zaW5nbGUtY29udGFpbmVyJyk7XG4gIGNvbnN0IGVycm9yc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgY29uc3QgZXJvcnJzQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcblxuICBlcm9ycnNCdG4uY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gnKTtcbiAgZXJyb3JzTGFiZWwuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gtY29udGFpbmVyJywgJ3NpZGUtcGFuZWwtYnRuJyk7XG4gIGVycm9yc0xhYmVsLnRleHRDb250ZW50ID0gJ0Vycm9ycyc7XG4gIGVyb3Jyc0J0bi5pZCA9ICdkaXNwbGF5LWVycm9ycyc7XG4gIGVyb3Jyc0J0bi50eXBlID0gJ2NoZWNrYm94JztcbiAgZXJvcnJzQnRuLmNoZWNrZWQgPSBmYWxzZTtcbiAgZXJyb3JzTGFiZWwuYXBwZW5kQ2hpbGQoZXJvcnJzQnRuKTtcbiAgY2hlY2tib3hlc0NvbnRhaW5lci5hcHBlbmQoZXJyb3JzTGFiZWwpO1xuXG4gIGNvbnN0IHsgZGlzcGxheUVyckxvZyB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgZXJvcnJzQnRuLmNoZWNrZWQgPSBkaXNwbGF5RXJyTG9nO1xuXG4gIGVyb3Jyc0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBzZXRTZXR0aW5ncyh7IGRpc3BsYXlFcnJMb2c6IGVyb3Jyc0J0bi5jaGVja2VkIH0pO1xuICAgIHVwZGF0ZUVycm9yTG9nVmlzaWJpbGl0eSgpO1xuICB9KTtcbn1cblxuXG5mdW5jdGlvbiBvcGVuRXJyb3JMb2dXaW5kb3cobG9nOiBzdHJpbmcpIHtcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5FUlJPUl9MT0csIGxvZyk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRXJyb3JMb2dWaXNpYmlsaXR5KCk6IHZvaWQge1xuICBjb25zdCBub3RpZlBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yX2xvZycpO1xuICBjb25zdCB7IGRlYnVnTW9kZSwgZGlzcGxheUVyckxvZywgZGlzcGxheUluZm8sIGRpc3BsYXlCQm94LCBkaXNwbGF5VGV4dCB9ID0gZ2V0U2V0dGluZ3MoKTtcblxuICBjb25zdCBkaXNwbGF5QWxsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXktYWxsLWJ0bicpO1xuXG4gIGlmIChkZWJ1Z01vZGUpIHtcbiAgICBpZiAoZGlzcGxheUVyckxvZykge1xuICAgICAgbm90aWZQYW5lbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICBpZiAoZGlzcGxheUluZm8gJiYgZGlzcGxheUJCb3ggJiYgXG4gICAgICAgIGRpc3BsYXlUZXh0ICYmIGRpc3BsYXlFcnJMb2cpIHtcbiAgICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbm90aWZQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICBpZiAoZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5vdGlmUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIGlmIChkaXNwbGF5SW5mbyAmJiBkaXNwbGF5QkJveCAmJiBkaXNwbGF5VGV4dCkge1xuICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgZGlzcGxheUFsbEJ0bi5pbm5lckhUTUwgPSAnSGlkZSBBbGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IHsgZ2V0U3RhZmZCQm94LCBzZWxlY3RCQm94LCBzZWxlY3RTdGFmZiwgc2VsZWN0QWxsIH0gZnJvbSAnLi9TZWxlY3RUb29scyc7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4vRHJhZ0hhbmRsZXInO1xuXG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24sIFJlc2l6ZUFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IGlzT3V0T2ZTVkdCb3VuZHMgfSBmcm9tICcuL0Nvb3JkaW5hdGVzJztcbmltcG9ydCB7IHF1ZXVlTm90aWZpY2F0aW9uIH0gZnJvbSAnLi9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0xvY2FsU2V0dGluZ3MnO1xuXG4vKipcbiAqIFJlc2l6ZSBhIHN0YWZmIG9yIGEgc3lsbGFibGUgdGV4dCBib3VuZGluZyBib3guXG4gKiBGb3Igc3RhdmVzLCB0aGlzIGFsc28gc3VwcG9ydHMgYWRqdXN0aW5nIHRoZSByb3RhdGUuXG4gKi9cbnR5cGUgUG9pbnQgPSB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBuYW1lOiBudW1iZXIgfTtcblxuLyoqXG4gKiBUaGUgcG9pbnRzIHlvdSBjYW4gY2xpY2sgYW5kIGRyYWcgdG8gcmVzaXplXG4gKi9cbmNvbnN0IFBvaW50TmFtZXMgPSB7XG4gIFRvcExlZnQ6IDAsXG4gIFRvcDogMSxcbiAgVG9wUmlnaHQ6IDIsXG4gIFJpZ2h0OiAzLFxuICBCb3R0b21SaWdodDogNCxcbiAgQm90dG9tOiA1LFxuICBCb3R0b21MZWZ0OiA2LFxuICBMZWZ0OiA3XG59O1xuXG5mdW5jdGlvbiBnZXRQb2ludHModWx4OiBudW1iZXIsIHVseTogbnVtYmVyLCBscng6IG51bWJlciwgbHJ5OiBudW1iZXIsIHJvdGF0ZTogbnVtYmVyKTogUG9pbnRbXSB7XG4gIC8vIE5vdGUgdGhhdCBhcmMgZnVuY3Rpb25zIHJldHVybiBhbiBhbmdsZSB4IGluIFstcGkvMiwgcGkvMl0uXG4gIGxldCBwb2ludHM6IEFycmF5PFBvaW50PjtcbiAgLy8gdWwgaXMgdWx4LCB1bHksIGxyIGlzIGxyeCwgbHJ5XG4gIGlmIChyb3RhdGUgPj0gMCkge1xuICAgIHBvaW50cyA9IFtcbiAgICAgIHsgeDogdWx4LCB5OiB1bHksIG5hbWU6IFBvaW50TmFtZXMuVG9wTGVmdCB9LFxuICAgICAgeyB4OiAodWx4ICsgbHJ4KSAvIDIsIHk6IHVseSArIChscnggLSB1bHgpIC8gMiAqIE1hdGguc2luKHJvdGF0ZSksIG5hbWU6IFBvaW50TmFtZXMuVG9wIH0sXG4gICAgICB7IHg6IGxyeCwgeTogdWx5ICsgKGxyeCAtIHVseCkgKiBNYXRoLnNpbihyb3RhdGUpLCBuYW1lOiBQb2ludE5hbWVzLlRvcFJpZ2h0IH0sXG4gICAgICB7IHg6IGxyeCwgeTogKHVseSArIGxyeSArIChscnggLSB1bHgpICogTWF0aC5zaW4ocm90YXRlKSkgLyAyLCBuYW1lOiBQb2ludE5hbWVzLlJpZ2h0IH0sXG4gICAgICB7IHg6IGxyeCwgeTogbHJ5LCBuYW1lOiBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0IH0sXG4gICAgICB7IHg6ICh1bHggKyBscngpIC8gMiwgeTogbHJ5IC0gKGxyeCAtIHVseCkgLyAyICogTWF0aC5zaW4ocm90YXRlKSwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b20gfSxcbiAgICAgIHsgeDogdWx4LCB5OiBscnkgLSAobHJ4IC0gdWx4KSAqIE1hdGguc2luKHJvdGF0ZSksIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tTGVmdCB9LFxuICAgICAgeyB4OiB1bHgsIHk6ICh1bHkgKyBscnkgLSAobHJ4IC0gdWx4KSAqIE1hdGguc2luKHJvdGF0ZSkpIC8gMiwgbmFtZTogUG9pbnROYW1lcy5MZWZ0IH1cbiAgICBdO1xuICB9XG4gIC8vIE5vdCB0aGF0XG4gIGVsc2Uge1xuICAgIGNvbnN0IGEgPSAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKE1hdGguYWJzKHJvdGF0ZSkpO1xuICAgIGNvbnN0IGIgPSBscnkgLSB1bHkgLSBhO1xuICAgIHBvaW50cyA9IFtcbiAgICAgIHsgeDogdWx4LCB5OiB1bHkgKyBhLCBuYW1lOiBQb2ludE5hbWVzLlRvcExlZnQgfSxcbiAgICAgIHsgeDogKHVseCArIGxyeCkgLyAyLCB5OiB1bHkgKyBhIC8gMiwgbmFtZTogUG9pbnROYW1lcy5Ub3AgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiB1bHksIG5hbWU6IFBvaW50TmFtZXMuVG9wUmlnaHQgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiB1bHkgKyBiIC8gMiwgbmFtZTogUG9pbnROYW1lcy5SaWdodCB9LFxuICAgICAgeyB4OiBscngsIHk6IHVseSArIGIsIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tUmlnaHQgfSxcbiAgICAgIHsgeDogKHVseCArIGxyeCkgLyAyLCB5OiBscnkgLSBhIC8gMiwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b20gfSxcbiAgICAgIHsgeDogdWx4LCB5OiBscnksIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tTGVmdCB9LFxuICAgICAgeyB4OiB1bHgsIHk6IGxyeSAtIGIgLyAyLCBuYW1lOiBQb2ludE5hbWVzLkxlZnQgfVxuICAgIF07XG4gIH1cbiAgcmV0dXJuIHBvaW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZSAoZWxlbWVudDogU1ZHR3JhcGhpY3NFbGVtZW50LCBuZW9uVmlldzogTmVvblZpZXcsIGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlcik6IHZvaWQge1xuICBsZXQgdWx4OiBudW1iZXI7XG4gIGxldCB1bHk6IG51bWJlcjtcbiAgbGV0IGxyeDogbnVtYmVyO1xuICBsZXQgbHJ5OiBudW1iZXI7XG4gIGxldCByb3RhdGU6IG51bWJlcjtcblxuICBsZXQgaW5pdGlhbFVseDogbnVtYmVyLCBpbml0aWFsTHJ4OiBudW1iZXI7XG4gIGxldCBpbml0aWFsUG9pbnQ6IG51bWJlcltdLCBpbml0aWFsVWx5OiBudW1iZXIsIGluaXRpYWxMcnk6IG51bWJlcixcbiAgICBpbml0aWFsWTogbnVtYmVyLCBpbml0aWFsUmVjdFk6IG51bWJlciwgcG9seUxlbjogbnVtYmVyLCBkeTogbnVtYmVyLCBpbml0aWFsUm90YXRlOiBudW1iZXI7XG5cbiAgZHJhd0luaXRpYWxSZWN0KCk7XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIG5ldyBib3VuZHNcbiAgICovXG4gIGZ1bmN0aW9uIHJlZHJhdyAoKTogdm9pZCB7XG4gICAgY29uc3QgcG9pbnRzOiBQb2ludFtdID0gZ2V0UG9pbnRzKHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlKTtcblxuICAgIGNvbnN0IHBvaW50U3RyaW5nOiBzdHJpbmcgPSBwb2ludHMuZmlsdGVyKChfZWxlbSwgaW5kZXgpID0+IHsgcmV0dXJuIGluZGV4ICUgMiA9PT0gMDsgfSlcbiAgICAgIC5tYXAoZWxlbSA9PiBlbGVtLnggKyAnLCcgKyBlbGVtLnkpXG4gICAgICAuam9pbignICcpO1xuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jlc2l6ZVJlY3QnKS5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIHBvaW50U3RyaW5nKTtcblxuICAgIGNvbnN0IHRleHRSZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN5bC5zZWxlY3RlZCA+IC5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgaWYgKHRleHRSZWN0KSB7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3gnLCBTdHJpbmcoTWF0aC5taW4odWx4LCBscngpKSk7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3knLCBTdHJpbmcoTWF0aC5taW4odWx5LCBscnkpKSk7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKE1hdGguYWJzKGxyeCAtIHVseCkpKTtcbiAgICAgIHRleHRSZWN0LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKE1hdGguYWJzKGxyeSAtIHVseSkpKTtcbiAgICB9XG5cblxuICAgIGZvciAoY29uc3QgcG9pbnROYW1lIGluIFBvaW50TmFtZXMpIHtcbiAgICAgIGNvbnN0IHBvaW50OiBQb2ludCA9IHBvaW50c1tQb2ludE5hbWVzW3BvaW50TmFtZV1dO1xuICAgICAgZDMuc2VsZWN0KCcjcC0nICsgcG9pbnROYW1lKS5maWx0ZXIoJy5yZXNpemVQb2ludCcpXG4gICAgICAgIC5hdHRyKCdjeCcsIHBvaW50LngpXG4gICAgICAgIC5hdHRyKCdjeScsIHBvaW50LnkpO1xuICAgIH1cblxuICAgIGxldCB4ID0gcG9pbnRzWzNdLng7XG4gICAgbGV0IHkgPSBwb2ludHNbM10ueTtcbiAgICBjb25zdCBwb2ludFN0cmluZ1JpZ2h0ID0gKHggKyAxMDApICsgJywnICsgKHkgKyA4NSkgKyAnICcgK1xuICAgICAgKHggKyA3MCkgKyAnLCcgKyAoeSArIDUwKSArICcgJyArICh4ICsgMTAwKSArICcsJyArICh5ICsgMTUpICsgJyAnICsgKHggKyAxMzApICsgJywnICsgKHkgKyA1MCk7XG4gICAgeCA9IHBvaW50c1s3XS54O1xuICAgIHkgPSBwb2ludHNbN10ueTtcbiAgICBjb25zdCBwb2ludFN0cmluZ0xlZnQgPSAoeCAtIDEwMCkgKyAnLCcgKyAoeSAtIDE1KSArICcgJyArXG4gICAgICAoeCAtIDEzMCkgKyAnLCcgKyAoeSAtIDUwKSArICcgJyArICh4IC0gMTAwKSArICcsJyArICh5IC0gODUpICsgJyAnICsgKHggLSA3MCkgKyAnLCcgKyAoeSAtIDUwKTtcblxuICAgIGQzLnNlbGVjdCgnI3JvdGF0ZUxlZnQnKS5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZ0xlZnQpO1xuICAgIGQzLnNlbGVjdCgnI3JvdGF0ZVJpZ2h0JykuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdSaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgaW5pdGlhbCByZWN0YW5nbGUgYXJvdW5kIHRoZSBlbGVtZW50XG4gICAqIGFuZCBhZGQgdGhlIGxpc3RlbmVycyB0byBzdXBwb3J0IGRyYWdnaW5nIHRvIHJlc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGRyYXdJbml0aWFsUmVjdCAoKTogdm9pZCB7XG4gICAgaWYgKGVsZW1lbnQgPT09IG51bGwpIHJldHVybjtcblxuICAgIGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcjcmVzaXplUmVjdCcpLnJlbW92ZSgpO1xuICAgIGQzLnNlbGVjdEFsbCgnLnJvdGF0ZVBvaW50JykucmVtb3ZlKCk7XG5cbiAgICAvLyBpZiBpdCdzIGEgYm91bmRpbmdib3gganVzdCBnZXQgdGhlIGNvb3JkaW5hdGVzXG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmIChyZWN0ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVHJpZWQgdG8gZHJhdyByZXNpemUgcmVjdCBmb3IgYSBzeWxUZXh0UmVjdCB0aGF0IGRvZXNuXFwndCBleGlzdCAob3IgaXNuXFwndCBkaXNwbGF5aW5nKScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bHggPSBOdW1iZXIocmVjdC5nZXRBdHRyaWJ1dGUoJ3gnKSk7XG4gICAgICB1bHkgPSBOdW1iZXIocmVjdC5nZXRBdHRyaWJ1dGUoJ3knKSk7XG4gICAgICBscnggPSArdWx4ICsgK3JlY3QuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgICAgbHJ5ID0gK3VseSArICtyZWN0LmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG5cbiAgICAgIHJvdGF0ZSA9IDA7XG4gICAgfVxuXG4gICAgLy8gaWYgaXQncyBhIHN0YWZmIHVzZSB0aGUgcGF0aHMgdG8gZ2V0IGl0J3MgYm91bmRpbmdib3hcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgIGNvbnN0IGJib3ggPSBnZXRTdGFmZkJCb3goZWxlbWVudCk7XG4gICAgICB1bHggPSBiYm94LnVseDtcbiAgICAgIHVseSA9IGJib3gudWx5O1xuICAgICAgbHJ4ID0gYmJveC5scng7XG4gICAgICBscnkgPSBiYm94LmxyeTtcblxuICAgICAgY29uc3QgY29vcmRpbmF0ZXM6IG51bWJlcltdID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdwYXRoJylcbiAgICAgICAgLmdldEF0dHJpYnV0ZSgnZCcpXG4gICAgICAgIC5tYXRjaCgvXFxkKy9nKVxuICAgICAgICAubWFwKGVsZW1lbnQgPT4gTnVtYmVyKGVsZW1lbnQpKTtcbiAgICAgIHJvdGF0ZSA9IE1hdGguYXRhbigoY29vcmRpbmF0ZXNbM10gLSBjb29yZGluYXRlc1sxXSkgL1xuICAgICAgICAoY29vcmRpbmF0ZXNbMl0gLSBjb29yZGluYXRlc1swXSkpO1xuICAgIH1cblxuICAgIGluaXRpYWxVbHggPSB1bHgsIGluaXRpYWxVbHkgPSB1bHksIGluaXRpYWxMcnggPSBscngsIGluaXRpYWxMcnkgPSBscnk7XG5cbiAgICBsZXQgd2hpY2hQb2ludDogc3RyaW5nO1xuXG4gICAgY29uc3QgcG9pbnRzID0gZ2V0UG9pbnRzKHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlKTtcblxuICAgIHBvbHlMZW4gPSBwb2ludHNbMl0ueCAtIHBvaW50c1swXS54O1xuXG4gICAgY29uc3QgcG9pbnRTdHJpbmcgPSBwb2ludHMuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggJSAyID09PSAwKVxuICAgICAgLm1hcChlbGVtID0+IGVsZW0ueCArICcsJyArIGVsZW0ueSlcbiAgICAgIC5qb2luKCcgJyk7XG5cbiAgICBkMy5zZWxlY3QoJyMnICsgZWxlbWVudC5pZCkuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgIC5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZylcbiAgICAgIC5hdHRyKCdpZCcsICdyZXNpemVSZWN0JylcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEwKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdtb3ZlJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICcyMCAxMCcpO1xuXG4gICAgY29uc3QgeyBjaXJjbGVTaXplIH0gPSBnZXRTZXR0aW5ncygpO1xuXG4gICAgZm9yIChjb25zdCBwb2ludE5hbWUgaW4gUG9pbnROYW1lcykge1xuICAgICAgY29uc3QgcG9pbnQ6IFBvaW50ID0gcG9pbnRzW1BvaW50TmFtZXNbcG9pbnROYW1lXV07XG4gICAgICBkMy5zZWxlY3QoZWxlbWVudC52aWV3cG9ydEVsZW1lbnQpLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgLmF0dHIoJ2N4JywgcG9pbnQueClcbiAgICAgICAgLmF0dHIoJ2N5JywgcG9pbnQueSlcbiAgICAgICAgLmF0dHIoJ3InLCBjaXJjbGVTaXplKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDQpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJyMwMDk5ZmYnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAncmVzaXplUG9pbnQnKVxuICAgICAgICAuYXR0cignaWQnLCAncC0nICsgcG9pbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyBkbyBpdCBhcyBhIGxvb3AgaW5zdGVhZCBvZiBzZWxlY3RBbGwgc28gdGhhdCB5b3UgY2FuIGVhc2lseSBrbm93IHdoaWNoIHBvaW50IHdhc1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBQb2ludE5hbWVzKSB7XG4gICAgICBkMy5zZWxlY3QoJyNwLScgKyBuYW1lKS5maWx0ZXIoJy5yZXNpemVQb2ludCcpLmNhbGwoXG4gICAgICAgIGQzLmRyYWcoKVxuICAgICAgICAgIC5vbignc3RhcnQnLCAoKSA9PiB7IHJlc2l6ZVN0YXJ0KG5hbWUpOyB9KVxuICAgICAgICAgIC5vbignZHJhZycsIHJlc2l6ZURyYWcpXG4gICAgICAgICAgLm9uKCdlbmQnLCByZXNpemVFbmQuYmluZCh0aGlzKSkpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkge1xuICAgICAgbGV0IHggPSBwb2ludHNbM10ueDtcbiAgICAgIGxldCB5ID0gcG9pbnRzWzNdLnk7XG4gICAgICBjb25zdCBwb2ludFN0cmluZ1JpZ2h0ID0gKHggKyAxMDApICsgJywnICsgKHkgKyA4NSkgKyAnICcgK1xuICAgICAgICAoeCArIDcwKSArICcsJyArICh5ICsgNTApICsgJyAnICsgKHggKyAxMDApICsgJywnICsgKHkgKyAxNSkgKyAnICcgKyAoeCArIDEzMCkgKyAnLCcgKyAoeSArIDUwKTtcbiAgICAgIHggPSBwb2ludHNbN10ueDtcbiAgICAgIHkgPSBwb2ludHNbN10ueTtcbiAgICAgIGNvbnN0IHBvaW50U3RyaW5nTGVmdCA9ICh4IC0gMTAwKSArICcsJyArICh5IC0gMTUpICsgJyAnICtcbiAgICAgICAgKHggLSAxMzApICsgJywnICsgKHkgLSA1MCkgKyAnICcgKyAoeCAtIDEwMCkgKyAnLCcgKyAoeSAtIDg1KSArICcgJyArICh4IC0gNzApICsgJywnICsgKHkgLSA1MCk7XG5cbiAgICAgIGQzLnNlbGVjdCgnIycgKyBlbGVtZW50LmlkKS5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdSaWdodClcbiAgICAgICAgLmF0dHIoJ2lkJywgJ3JvdGF0ZVJpZ2h0JylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCA3KVxuICAgICAgICAuYXR0cignZmlsbCcsICcjMDA5OWZmJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3JvdGF0ZVBvaW50Jyk7XG5cbiAgICAgIGQzLnNlbGVjdCgnIycgKyBlbGVtZW50LmlkKS5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdMZWZ0KVxuICAgICAgICAuYXR0cignaWQnLCAncm90YXRlTGVmdCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgNylcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnIzAwOTlmZicpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdyb3RhdGVQb2ludCcpO1xuXG4gICAgICBkMy5zZWxlY3QoJyNyb3RhdGVMZWZ0JykuY2FsbChcbiAgICAgICAgZDMuZHJhZygpXG4gICAgICAgICAgLm9uKCdzdGFydCcsIHJvdGF0ZVN0YXJ0KVxuICAgICAgICAgIC5vbignZHJhZycsIHJvdGF0ZURyYWdMZWZ0KVxuICAgICAgICAgIC5vbignZW5kJywgcm90YXRlRW5kKSk7XG5cbiAgICAgIGQzLnNlbGVjdCgnI3JvdGF0ZVJpZ2h0JykuY2FsbChcbiAgICAgICAgZDMuZHJhZygpXG4gICAgICAgICAgLm9uKCdzdGFydCcsIHJvdGF0ZVN0YXJ0KVxuICAgICAgICAgIC5vbignZHJhZycsIHJvdGF0ZURyYWdSaWdodClcbiAgICAgICAgICAub24oJ2VuZCcsIHJvdGF0ZUVuZCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZVN0YXJ0IChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHdoaWNoUG9pbnQgPSBuYW1lO1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHMuZmluZChwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzW25hbWVdKTtcbiAgICAgIGluaXRpYWxQb2ludCA9IFtwb2ludC54LCBwb2ludC55XTtcbiAgICAgIGluaXRpYWxVbHkgPSB1bHk7XG4gICAgICBpbml0aWFsTHJ5ID0gbHJ5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZURyYWcgKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFBvaW50ID0gZDMubW91c2UodGhpcyk7XG4gICAgICBzd2l0Y2ggKFBvaW50TmFtZXNbd2hpY2hQb2ludF0pIHtcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlRvcExlZnQ6XG4gICAgICAgICAgdWx4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIHVseSA9IGN1cnJlbnRQb2ludFsxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlRvcDpcbiAgICAgICAgICB1bHkgPSBjdXJyZW50UG9pbnRbMV0gLSAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuVG9wUmlnaHQ6XG4gICAgICAgICAgbHJ4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIHVseSA9IGN1cnJlbnRQb2ludFsxXSAtIChscnggLSB1bHgpICogTWF0aC50YW4ocm90YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlJpZ2h0OlxuICAgICAgICAgIGxyeCA9IGN1cnJlbnRQb2ludFswXTtcbiAgICAgICAgICBscnkgPSBpbml0aWFsTHJ5ICsgKGN1cnJlbnRQb2ludFswXSAtIGluaXRpYWxQb2ludFswXSkgKiBNYXRoLnRhbihyb3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuQm90dG9tUmlnaHQ6XG4gICAgICAgICAgbHJ4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIGxyeSA9IGN1cnJlbnRQb2ludFsxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLkJvdHRvbTpcbiAgICAgICAgICBscnkgPSBjdXJyZW50UG9pbnRbMV0gKyAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuQm90dG9tTGVmdDpcbiAgICAgICAgICB1bHggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgbHJ5ID0gY3VycmVudFBvaW50WzFdICsgKGxyeCAtIHVseCkgKiBNYXRoLnRhbihyb3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuTGVmdDpcbiAgICAgICAgICB1bHggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgdWx5ID0gaW5pdGlhbFVseSArIChjdXJyZW50UG9pbnRbMF0gLSBpbml0aWFsUG9pbnRbMF0pICogTWF0aC50YW4ocm90YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdTb21ldGhpbmcgdGhhdCB3YXNuXFwndCBhIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB3YXMgZHJhZ2dlZC4gVGhpcyBzaG91bGRuXFwndCBoYXBwZW4uJyk7XG4gICAgICB9XG4gICAgICByZWRyYXcoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemVFbmQgKCk6IHZvaWQge1xuICAgICAgaWYgKGlzT3V0T2ZTVkdCb3VuZHModWx4LCB1bHkpIHx8IGlzT3V0T2ZTVkdCb3VuZHMobHJ4LCBscnkpKSB7XG4gICAgICAgIHVseCA9IGluaXRpYWxVbHgsIHVseSA9IGluaXRpYWxVbHksIGxyeCA9IGluaXRpYWxMcngsIGxyeSA9IGluaXRpYWxMcnk7XG4gICAgICAgIHJlZHJhdygpO1xuXG4gICAgICAgIHJldHVybiBxdWV1ZU5vdGlmaWNhdGlvbignW0ZBSUxdIEdseXBocyB3ZXJlIHBsYWNlZCBvdXQgb2YgYm91bmRzISBSZXNpemUgYWN0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBSZXNpemVBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3Jlc2l6ZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHVseDogdWx4LFxuICAgICAgICAgIHVseTogdWx5LFxuICAgICAgICAgIGxyeDogbHJ4LFxuICAgICAgICAgIGxyeTogbHJ5XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgYXdhaXQgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudC5pZH1gKTtcbiAgICAgICAgdWx4ID0gdW5kZWZpbmVkLCB1bHkgPSB1bmRlZmluZWQsIGxyeCA9IHVuZGVmaW5lZCwgbHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgICAgICBzZWxlY3RCQm94KGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSwgZHJhZ0hhbmRsZXIsIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdEFsbChbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudC5pZH1gKV0sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgICAgICAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb3JlRWRpdCcpO1xuXG4gICAgICAgICAgaWYgKG1vcmVFZGl0KSB7XG4gICAgICAgICAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgIG1vcmVFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBST1RBVEVcbiAgICBmdW5jdGlvbiByb3RhdGVTdGFydCAoKTogdm9pZCB7XG4gICAgICBjb25zdCB3aGljaCA9IGQzLmV2ZW50LnNvdXJjZUV2ZW50LnRhcmdldC5pZDtcbiAgICAgIGluaXRpYWxZID0gZDMubW91c2UodGhpcylbMV07XG4gICAgICBpbml0aWFsTHJ5ID0gbHJ5O1xuICAgICAgaW5pdGlhbFVseSA9IHVseTtcbiAgICAgIGluaXRpYWxSZWN0WSA9ICh3aGljaCA9PT0gJ3JvdGF0ZVJpZ2h0JyA/IGxyeSA6IHVseSk7XG4gICAgICBpbml0aWFsUm90YXRlID0gcm90YXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvdGF0ZURyYWdMZWZ0ICgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRZID0gZDMubW91c2UodGhpcylbMV07XG4gICAgICBjb25zdCB0ZW1wID0gY3VycmVudFkgLSBpbml0aWFsWTtcbiAgICAgIGNvbnN0IHRlbXBSb3RhdGUgPSBpbml0aWFsUm90YXRlIC0gTWF0aC5hdGFuKHRlbXAgLyBwb2x5TGVuKTtcbiAgICAgIGlmICh0ZW1wUm90YXRlID4gLTAuMiAmJiB0ZW1wUm90YXRlIDwgMC4yKSB7XG4gICAgICAgIGR5ID0gdGVtcDtcbiAgICAgICAgdWx5ID0gaW5pdGlhbFJlY3RZICsgZHk7XG4gICAgICAgIHJvdGF0ZSA9IHRlbXBSb3RhdGU7XG4gICAgICAgIGlmIChyb3RhdGUgPj0gMCkge1xuICAgICAgICAgIHVseSA9IGR5ICsgcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLlRvcExlZnQpWzBdLnk7XG4gICAgICAgICAgbHJ5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0KVswXS55O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVseSA9IHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Ub3BSaWdodClbMF0ueTtcbiAgICAgICAgICBscnkgPSBkeSArIHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Cb3R0b21MZWZ0KVswXS55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWRyYXcoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByb3RhdGVEcmFnUmlnaHQgKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFkgPSBkMy5tb3VzZSh0aGlzKVsxXTtcbiAgICAgIGNvbnN0IHRlbXAgPSBjdXJyZW50WSAtIGluaXRpYWxZO1xuICAgICAgY29uc3QgdGVtcFJvdGF0ZSA9IGluaXRpYWxSb3RhdGUgKyBNYXRoLmF0YW4odGVtcCAvIHBvbHlMZW4pO1xuICAgICAgaWYgKHRlbXBSb3RhdGUgPiAtMC4yICYmIHRlbXBSb3RhdGUgPCAwLjIpIHtcbiAgICAgICAgZHkgPSB0ZW1wO1xuICAgICAgICByb3RhdGUgPSB0ZW1wUm90YXRlO1xuICAgICAgICBpZiAocm90YXRlID49IDAgKSB7XG4gICAgICAgICAgbHJ5ID0gZHkgKyBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuQm90dG9tUmlnaHQpWzBdLnk7XG4gICAgICAgICAgdWx5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLlRvcExlZnQpWzBdLnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdWx5ID0gZHkgKyBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuVG9wUmlnaHQpWzBdLnk7XG4gICAgICAgICAgbHJ5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLkJvdHRvbUxlZnQpWzBdLnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZHJhdygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvdGF0ZUVuZCAoKTogdm9pZCB7XG4gICAgICBpZiAoZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkeSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc091dE9mU1ZHQm91bmRzKHVseCwgdWx5KSB8fCBpc091dE9mU1ZHQm91bmRzKGxyeCwgbHJ5KSkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVzaXplUG9pbnQnKS5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3Jlc2l6ZVJlY3QnKS5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJvdGF0ZVBvaW50JykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG5cbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQpIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICB1bHggPSB1bmRlZmluZWQ7XG4gICAgICAgIHVseSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbHJ4ID0gdW5kZWZpbmVkO1xuICAgICAgICBscnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGR5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgICAgIHNlbGVjdEJCb3goZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLCBkcmFnSGFuZGxlciwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0U3RhZmYoZWxlbWVudCwgZHJhZ0hhbmRsZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXVlTm90aWZpY2F0aW9uKCdbRkFJTF0gR2x5cGhzIHdlcmUgcGxhY2VkIG91dCBvZiBib3VuZHMhIFJvdGF0ZSBhY3Rpb24gZmFpbGVkLicsICdlcnJvcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAncmVzaXplUm90YXRlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgdWx4OiB1bHgsXG4gICAgICAgICAgdWx5OiB1bHksXG4gICAgICAgICAgbHJ4OiBscngsXG4gICAgICAgICAgbHJ5OiBscnksXG4gICAgICAgICAgcm90YXRlOiByb3RhdGUgKiAxODAgLyBNYXRoLlBJXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KGVkaXRvckFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGF3YWl0IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQpIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICB1bHggPSB1bmRlZmluZWQsIHVseSA9IHVuZGVmaW5lZCwgbHJ4ID0gdW5kZWZpbmVkLCBscnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGR5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgICAgICBzZWxlY3RCQm94KGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSwgZHJhZ0hhbmRsZXIsIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdFN0YWZmKGVsZW1lbnQsIGRyYWdIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgaW1tZWRpYXRlIGZyb20gJ2ltbWVkaWF0ZSc7XG5pbXBvcnQgeyB2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IE1kNSBmcm9tICdzcGFyay1tZDUnO1xuaW1wb3J0IHZ1dnV6ZWxhIGZyb20gJ3Z1dnV6ZWxhJztcbmltcG9ydCBnZXRBcmd1bWVudHMgZnJvbSAnYXJnc2FycmF5JztcbmltcG9ydCBpbmhlcml0cyBmcm9tICdpbmhlcml0cyc7XG5pbXBvcnQgRUUgZnJvbSAnZXZlbnRzJztcblxuZnVuY3Rpb24gbWFuZ2xlKGtleSkge1xuICByZXR1cm4gJyQnICsga2V5O1xufVxuZnVuY3Rpb24gdW5tYW5nbGUoa2V5KSB7XG4gIHJldHVybiBrZXkuc3Vic3RyaW5nKDEpO1xufVxuZnVuY3Rpb24gTWFwJDEoKSB7XG4gIHRoaXMuX3N0b3JlID0ge307XG59XG5NYXAkMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgbWFuZ2xlZCA9IG1hbmdsZShrZXkpO1xuICByZXR1cm4gdGhpcy5fc3RvcmVbbWFuZ2xlZF07XG59O1xuTWFwJDEucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHZhciBtYW5nbGVkID0gbWFuZ2xlKGtleSk7XG4gIHRoaXMuX3N0b3JlW21hbmdsZWRdID0gdmFsdWU7XG4gIHJldHVybiB0cnVlO1xufTtcbk1hcCQxLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBtYW5nbGVkID0gbWFuZ2xlKGtleSk7XG4gIHJldHVybiBtYW5nbGVkIGluIHRoaXMuX3N0b3JlO1xufTtcbk1hcCQxLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpLm1hcChrID0+IHVubWFuZ2xlKGspKTtcbn07XG5NYXAkMS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgbWFuZ2xlZCA9IG1hbmdsZShrZXkpO1xuICB2YXIgcmVzID0gbWFuZ2xlZCBpbiB0aGlzLl9zdG9yZTtcbiAgZGVsZXRlIHRoaXMuX3N0b3JlW21hbmdsZWRdO1xuICByZXR1cm4gcmVzO1xufTtcbk1hcCQxLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNiKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuX3N0b3JlW2tleV07XG4gICAga2V5ID0gdW5tYW5nbGUoa2V5KTtcbiAgICBjYih2YWx1ZSwga2V5KTtcbiAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNYXAkMS5wcm90b3R5cGUsICdzaXplJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpLmxlbmd0aDtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIFNldCQxKGFycmF5KSB7XG4gIHRoaXMuX3N0b3JlID0gbmV3IE1hcCQxKCk7XG5cbiAgLy8gaW5pdCB3aXRoIGFuIGFycmF5XG4gIGlmIChhcnJheSAmJiBBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdGhpcy5hZGQoYXJyYXlbaV0pO1xuICAgIH1cbiAgfVxufVxuU2V0JDEucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX3N0b3JlLnNldChrZXksIHRydWUpO1xufTtcblNldCQxLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9zdG9yZS5oYXMoa2V5KTtcbn07XG5TZXQkMS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYikge1xuICB0aGlzLl9zdG9yZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgY2Ioa2V5KTtcbiAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldCQxLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5zaXplO1xuICB9XG59KTtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9rYW5nYXguZ2l0aHViLmlvL2NvbXBhdC10YWJsZS9lczYvIHdlIGNhbiBzbmlmZiBvdXRcbi8vIGluY29tcGxldGUgTWFwL1NldCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGNhdXNlIG91ciB0ZXN0cyB0byBmYWlsLlxuLy8gTm90YWJseSB0aGV5IGZhaWwgaW4gSUUxMSBhbmQgaU9TIDguNCwgd2hpY2ggdGhpcyBwcmV2ZW50cy5cbmZ1bmN0aW9uIHN1cHBvcnRzTWFwQW5kU2V0KCkge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3AgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcCwgU3ltYm9sLnNwZWNpZXMpO1xuICByZXR1cm4gcHJvcCAmJiAnZ2V0JyBpbiBwcm9wICYmIE1hcFtTeW1ib2wuc3BlY2llc10gPT09IE1hcDtcbn1cblxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vbnRhZ2Vqcy9jb2xsZWN0aW9uc1xuXG52YXIgRXhwb3J0ZWRTZXQ7XG52YXIgRXhwb3J0ZWRNYXA7XG5cbntcbiAgaWYgKHN1cHBvcnRzTWFwQW5kU2V0KCkpIHsgLy8gcHJlZmVyIGJ1aWx0LWluIE1hcC9TZXRcbiAgICBFeHBvcnRlZFNldCA9IFNldDtcbiAgICBFeHBvcnRlZE1hcCA9IE1hcDtcbiAgfSBlbHNlIHsgLy8gZmFsbCBiYWNrIHRvIG91ciBwb2x5ZmlsbFxuICAgIEV4cG9ydGVkU2V0ID0gU2V0JDE7XG4gICAgRXhwb3J0ZWRNYXAgPSBNYXAkMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0JpbmFyeU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIG9iamVjdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fFxuICAgICh0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqZWN0IGluc3RhbmNlb2YgQmxvYik7XG59XG5cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYnVmZikge1xuICBpZiAodHlwZW9mIGJ1ZmYuc2xpY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYnVmZi5zbGljZSgwKTtcbiAgfVxuICAvLyBJRTEwLTExIHNsaWNlKCkgcG9seWZpbGxcbiAgdmFyIHRhcmdldCA9IG5ldyBBcnJheUJ1ZmZlcihidWZmLmJ5dGVMZW5ndGgpO1xuICB2YXIgdGFyZ2V0QXJyYXkgPSBuZXcgVWludDhBcnJheSh0YXJnZXQpO1xuICB2YXIgc291cmNlQXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmKTtcbiAgdGFyZ2V0QXJyYXkuc2V0KHNvdXJjZUFycmF5KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gY2xvbmVCaW5hcnlPYmplY3Qob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG4gIH1cbiAgdmFyIHNpemUgPSBvYmplY3Quc2l6ZTtcbiAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcbiAgLy8gQmxvYlxuICBpZiAodHlwZW9mIG9iamVjdC5zbGljZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBvYmplY3Quc2xpY2UoMCwgc2l6ZSwgdHlwZSk7XG4gIH1cbiAgLy8gUGhhbnRvbUpTIHNsaWNlKCkgcmVwbGFjZW1lbnRcbiAgcmV0dXJuIG9iamVjdC53ZWJraXRTbGljZSgwLCBzaXplLCB0eXBlKTtcbn1cblxuLy8gbW9zdCBvZiB0aGlzIGlzIGJvcnJvd2VkIGZyb20gbG9kYXNoLmlzUGxhaW5PYmplY3Q6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmlzLWNvbXBvbmVudHMvbG9kYXNoLmlzcGxhaW5vYmplY3QvXG4vLyBibG9iLzI5YzM1ODE0MGE3NGYyNTJhZWIwOGM5ZWIyOGJlZjg2ZjIyMTdkNGEvaW5kZXguanNcblxudmFyIGZ1bmNUb1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb3RvID09PSBudWxsKSB7IC8vIG5vdCBzdXJlIHdoZW4gdGhpcyBoYXBwZW5zLCBidXQgSSBndWVzcyBpdCBjYW5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiZcbiAgICBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gY2xvbmUob2JqZWN0KSB7XG4gIHZhciBuZXdPYmplY3Q7XG4gIHZhciBpO1xuICB2YXIgbGVuO1xuXG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICBuZXdPYmplY3QgPSBbXTtcbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBvYmplY3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIG5ld09iamVjdFtpXSA9IGNsb25lKG9iamVjdFtpXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdPYmplY3Q7XG4gIH1cblxuICAvLyBzcGVjaWFsIGNhc2U6IHRvIGF2b2lkIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIEluZGV4ZWREQlxuICAvLyBhbmQgb3RoZXIgYmFja2VuZHMsIHdlIGF1dG9tYXRpY2FsbHkgc3RyaW5naWZ5IERhdGVzXG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEYXRlICYmIGlzRmluaXRlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICBpZiAoaXNCaW5hcnlPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBjbG9uZUJpbmFyeU9iamVjdChvYmplY3QpO1xuICB9XG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0OyAvLyBkb24ndCBjbG9uZSBvYmplY3RzIGxpa2UgV29ya2Vyc1xuICB9XG5cbiAgbmV3T2JqZWN0ID0ge307XG4gIGZvciAoaSBpbiBvYmplY3QpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBpKSkge1xuICAgICAgdmFyIHZhbHVlID0gY2xvbmUob2JqZWN0W2ldKTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5ld09iamVjdFtpXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3T2JqZWN0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGZ1bikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICAvLyB0aGlzIGlzIGEgc21va2UgdGVzdCBhbmQgc2hvdWxkIG5ldmVyIGFjdHVhbGx5IGhhcHBlblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbmNlIGNhbGxlZCBtb3JlIHRoYW4gb25jZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgZnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUHJvbWlzZShmdW5jKSB7XG4gIC8vY3JlYXRlIHRoZSBmdW5jdGlvbiB3ZSB3aWxsIGJlIHJldHVybmluZ1xuICByZXR1cm4gZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgLy8gQ2xvbmUgYXJndW1lbnRzXG4gICAgYXJncyA9IGNsb25lKGFyZ3MpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBpZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLCBhc3N1bWUgaXRzIGEgY2FsbGJhY2tcbiAgICB2YXIgdXNlZENCID0gKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpID8gYXJncy5wb3AoKSA6IGZhbHNlO1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgICAgdmFyIHJlc3A7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBvbmNlKGZ1bmN0aW9uIChlcnIsIG1lc2cpIHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnVsZmlsbChtZXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjcmVhdGUgYSBjYWxsYmFjayBmb3IgdGhpcyBpbnZvY2F0aW9uXG4gICAgICAgIC8vIGFwcGx5IHRoZSBmdW5jdGlvbiBpbiB0aGUgb3JpZyBjb250ZXh0XG4gICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJlc3AgPSBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICBpZiAocmVzcCAmJiB0eXBlb2YgcmVzcC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZnVsZmlsbChyZXNwKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gaWYgdGhlcmUgaXMgYSBjYWxsYmFjaywgY2FsbCBpdCBiYWNrXG4gICAgaWYgKHVzZWRDQikge1xuICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdXNlZENCKG51bGwsIHJlc3VsdCk7XG4gICAgICB9LCB1c2VkQ0IpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGxvZ0FwaUNhbGwoc2VsZiwgbmFtZSwgYXJncykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHNlbGYuY29uc3RydWN0b3IubGlzdGVuZXJzKCdkZWJ1ZycpLmxlbmd0aCkge1xuICAgIHZhciBsb2dBcmdzID0gWydhcGknLCBzZWxmLm5hbWUsIG5hbWVdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGxvZ0FyZ3MucHVzaChhcmdzW2ldKTtcbiAgICB9XG4gICAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCdkZWJ1ZycsIGxvZ0FyZ3MpO1xuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIGNhbGxiYWNrIGl0c2VsZiB0byBsb2cgdGhlIHJlc3BvbnNlXG4gICAgdmFyIG9yaWdDYWxsYmFjayA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIHZhciByZXNwb25zZUFyZ3MgPSBbJ2FwaScsIHNlbGYubmFtZSwgbmFtZV07XG4gICAgICByZXNwb25zZUFyZ3MgPSByZXNwb25zZUFyZ3MuY29uY2F0KFxuICAgICAgICBlcnIgPyBbJ2Vycm9yJywgZXJyXSA6IFsnc3VjY2VzcycsIHJlc11cbiAgICAgICk7XG4gICAgICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ2RlYnVnJywgcmVzcG9uc2VBcmdzKTtcbiAgICAgIG9yaWdDYWxsYmFjayhlcnIsIHJlcyk7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGFwdGVyRnVuKG5hbWUsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0b1Byb21pc2UoZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZGF0YWJhc2UgaXMgY2xvc2VkJykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdkYXRhYmFzZSBpcyBkZXN0cm95ZWQnKSk7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBsb2dBcGlDYWxsKHNlbGYsIG5hbWUsIGFyZ3MpO1xuICAgIGlmICghdGhpcy50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi50YXNrcXVldWUuYWRkVGFzayhmdW5jdGlvbiAoZmFpbGVkKSB7XG4gICAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgcmVqZWN0KGZhaWxlZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZ1bGZpbGwoc2VsZltuYW1lXS5hcHBseShzZWxmLCBhcmdzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJncyk7XG4gIH0pKTtcbn1cblxuLy8gbGlrZSB1bmRlcnNjb3JlL2xvZGFzaCBfLnBpY2soKVxuZnVuY3Rpb24gcGljayhvYmosIGFycikge1xuICB2YXIgcmVzID0ge307XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgcHJvcCA9IGFycltpXTtcbiAgICBpZiAocHJvcCBpbiBvYmopIHtcbiAgICAgIHJlc1twcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy8gTW9zdCBicm93c2VycyB0aHJvdHRsZSBjb25jdXJyZW50IHJlcXVlc3RzIGF0IDYsIHNvIGl0J3Mgc2lsbHlcbi8vIHRvIHNoaW0gX2J1bGtfZ2V0IGJ5IHRyeWluZyB0byBsYXVuY2ggcG90ZW50aWFsbHkgaHVuZHJlZHMgb2YgcmVxdWVzdHNcbi8vIGFuZCB0aGVuIGxldHRpbmcgdGhlIG1ham9yaXR5IHRpbWUgb3V0LiBXZSBjYW4gaGFuZGxlIHRoaXMgb3Vyc2VsdmVzLlxudmFyIE1BWF9OVU1fQ09OQ1VSUkVOVF9SRVFVRVNUUyA9IDY7XG5cbmZ1bmN0aW9uIGlkZW50aXR5RnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzdWx0Rm9yT3BlblJldnNHZXQocmVzdWx0KSB7XG4gIHJldHVybiBbe1xuICAgIG9rOiByZXN1bHRcbiAgfV07XG59XG5cbi8vIHNoaW0gZm9yIFAvQ291Y2hEQiBhZGFwdGVycyB0aGF0IGRvbid0IGRpcmVjdGx5IGltcGxlbWVudCBfYnVsa19nZXRcbmZ1bmN0aW9uIGJ1bGtHZXQoZGIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciByZXF1ZXN0cyA9IG9wdHMuZG9jcztcblxuICAvLyBjb25zb2xpZGF0ZSBpbnRvIG9uZSByZXF1ZXN0IHBlciBkb2MgaWYgcG9zc2libGVcbiAgdmFyIHJlcXVlc3RzQnlJZCA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICByZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgaWYgKHJlcXVlc3RzQnlJZC5oYXMocmVxdWVzdC5pZCkpIHtcbiAgICAgIHJlcXVlc3RzQnlJZC5nZXQocmVxdWVzdC5pZCkucHVzaChyZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdHNCeUlkLnNldChyZXF1ZXN0LmlkLCBbcmVxdWVzdF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIG51bURvY3MgPSByZXF1ZXN0c0J5SWQuc2l6ZTtcbiAgdmFyIG51bURvbmUgPSAwO1xuICB2YXIgcGVyRG9jUmVzdWx0cyA9IG5ldyBBcnJheShudW1Eb2NzKTtcblxuICBmdW5jdGlvbiBjb2xsYXBzZVJlc3VsdHNBbmRGaW5pc2goKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICBwZXJEb2NSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJlcykge1xuICAgICAgcmVzLmRvY3MuZm9yRWFjaChmdW5jdGlvbiAoaW5mbykge1xuICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgIGlkOiByZXMuaWQsXG4gICAgICAgICAgZG9jczogW2luZm9dXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY2FsbGJhY2sobnVsbCwge3Jlc3VsdHM6IHJlc3VsdHN9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICBpZiAoKytudW1Eb25lID09PSBudW1Eb2NzKSB7XG4gICAgICBjb2xsYXBzZVJlc3VsdHNBbmRGaW5pc2goKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnb3RSZXN1bHQoZG9jSW5kZXgsIGlkLCBkb2NzKSB7XG4gICAgcGVyRG9jUmVzdWx0c1tkb2NJbmRleF0gPSB7aWQ6IGlkLCBkb2NzOiBkb2NzfTtcbiAgICBjaGVja0RvbmUoKTtcbiAgfVxuXG4gIHZhciBhbGxSZXF1ZXN0cyA9IFtdO1xuICByZXF1ZXN0c0J5SWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgIGFsbFJlcXVlc3RzLnB1c2goa2V5KTtcbiAgfSk7XG5cbiAgdmFyIGkgPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHRCYXRjaCgpIHtcblxuICAgIGlmIChpID49IGFsbFJlcXVlc3RzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB1cFRvID0gTWF0aC5taW4oaSArIE1BWF9OVU1fQ09OQ1VSUkVOVF9SRVFVRVNUUywgYWxsUmVxdWVzdHMubGVuZ3RoKTtcbiAgICB2YXIgYmF0Y2ggPSBhbGxSZXF1ZXN0cy5zbGljZShpLCB1cFRvKTtcbiAgICBwcm9jZXNzQmF0Y2goYmF0Y2gsIGkpO1xuICAgIGkgKz0gYmF0Y2gubGVuZ3RoO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoKGJhdGNoLCBvZmZzZXQpIHtcbiAgICBiYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChkb2NJZCwgaikge1xuICAgICAgdmFyIGRvY0lkeCA9IG9mZnNldCArIGo7XG4gICAgICB2YXIgZG9jUmVxdWVzdHMgPSByZXF1ZXN0c0J5SWQuZ2V0KGRvY0lkKTtcblxuICAgICAgLy8ganVzdCB1c2UgdGhlIGZpcnN0IHJlcXVlc3QgYXMgdGhlIFwidGVtcGxhdGVcIlxuICAgICAgLy8gVE9ETzogVGhlIF9idWxrX2dldCBBUEkgYWxsb3dzIGZvciBtb3JlIHN1YnRsZSB1c2UgY2FzZXMgdGhhbiB0aGlzLFxuICAgICAgLy8gYnV0IGZvciBub3cgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGVyZSB3aWxsIGJlIGEgbWl4IG9mIGRpZmZlcmVudFxuICAgICAgLy8gXCJhdHRzX3NpbmNlXCIgb3IgXCJhdHRhY2htZW50c1wiIGluIHRoZSBzYW1lIHJlcXVlc3QsIHNpbmNlIGl0J3MganVzdFxuICAgICAgLy8gcmVwbGljYXRlLmpzIHRoYXQgaXMgdXNpbmcgdGhpcyBmb3IgdGhlIG1vbWVudC5cbiAgICAgIC8vIEFsc28sIGF0dHNfc2luY2UgaXMgYXNwaXJhdGlvbmFsLCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGl0IHlldC5cbiAgICAgIHZhciBkb2NPcHRzID0gcGljayhkb2NSZXF1ZXN0c1swXSwgWydhdHRzX3NpbmNlJywgJ2F0dGFjaG1lbnRzJ10pO1xuICAgICAgZG9jT3B0cy5vcGVuX3JldnMgPSBkb2NSZXF1ZXN0cy5tYXAoZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgLy8gcmV2IGlzIG9wdGlvbmFsLCBvcGVuX3JldnMgZGlzYWxsb3dlZFxuICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXY7XG4gICAgICB9KTtcblxuICAgICAgLy8gcmVtb3ZlIGZhbHNleSAvIHVuZGVmaW5lZCByZXZpc2lvbnNcbiAgICAgIGRvY09wdHMub3Blbl9yZXZzID0gZG9jT3B0cy5vcGVuX3JldnMuZmlsdGVyKGlkZW50aXR5RnVuY3Rpb24pO1xuXG4gICAgICB2YXIgZm9ybWF0UmVzdWx0ID0gaWRlbnRpdHlGdW5jdGlvbjtcblxuICAgICAgaWYgKGRvY09wdHMub3Blbl9yZXZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgZG9jT3B0cy5vcGVuX3JldnM7XG5cbiAgICAgICAgLy8gd2hlbiBmZXRjaGluZyBvbmx5IHRoZSBcIndpbm5pbmdcIiBsZWFmLFxuICAgICAgICAvLyB0cmFuc2Zvcm0gdGhlIHJlc3VsdCBzbyBpdCBsb29rcyBsaWtlIGFuIG9wZW5fcmV2c1xuICAgICAgICAvLyByZXF1ZXN0XG4gICAgICAgIGZvcm1hdFJlc3VsdCA9IGZvcm1hdFJlc3VsdEZvck9wZW5SZXZzR2V0O1xuICAgICAgfVxuXG4gICAgICAvLyBnbG9iYWxseS1zdXBwbGllZCBvcHRpb25zXG4gICAgICBbJ3JldnMnLCAnYXR0YWNobWVudHMnLCAnYmluYXJ5JywgJ2FqYXgnLCAnbGF0ZXN0J10uZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgaWYgKHBhcmFtIGluIG9wdHMpIHtcbiAgICAgICAgICBkb2NPcHRzW3BhcmFtXSA9IG9wdHNbcGFyYW1dO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGRiLmdldChkb2NJZCwgZG9jT3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gW3tlcnJvcjogZXJyfV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gZm9ybWF0UmVzdWx0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZ290UmVzdWx0KGRvY0lkeCwgZG9jSWQsIHJlc3VsdCk7XG4gICAgICAgIG5leHRCYXRjaCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZXh0QmF0Y2goKTtcblxufVxuXG52YXIgaGFzTG9jYWw7XG5cbnRyeSB7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdfcG91Y2hfY2hlY2tfbG9jYWxzdG9yYWdlJywgMSk7XG4gIGhhc0xvY2FsID0gISFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnX3BvdWNoX2NoZWNrX2xvY2Fsc3RvcmFnZScpO1xufSBjYXRjaCAoZSkge1xuICBoYXNMb2NhbCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFN0b3JhZ2UoKSB7XG4gIHJldHVybiBoYXNMb2NhbDtcbn1cblxuLy8gQ3VzdG9tIG5leHRUaWNrKCkgc2hpbSBmb3IgYnJvd3NlcnMuIEluIG5vZGUsIHRoaXMgd2lsbCBqdXN0IGJlIHByb2Nlc3MubmV4dFRpY2soKS4gV2VcblxuaW5oZXJpdHMoQ2hhbmdlcywgRUUpO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gYXR0YWNoQnJvd3NlckV2ZW50cyhzZWxmKSB7XG4gIGlmIChoYXNMb2NhbFN0b3JhZ2UoKSkge1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBzZWxmLmVtaXQoZS5rZXkpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIENoYW5nZXMoKSB7XG4gIEVFLmNhbGwodGhpcyk7XG4gIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG4gIGF0dGFjaEJyb3dzZXJFdmVudHModGhpcyk7XG59XG5DaGFuZ2VzLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChkYk5hbWUsIGlkLCBkYiwgb3B0cykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHRoaXMuX2xpc3RlbmVyc1tpZF0pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICBmdW5jdGlvbiBldmVudEZ1bmN0aW9uKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghc2VsZi5fbGlzdGVuZXJzW2lkXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5wcm9ncmVzcykge1xuICAgICAgaW5wcm9ncmVzcyA9ICd3YWl0aW5nJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5wcm9ncmVzcyA9IHRydWU7XG4gICAgdmFyIGNoYW5nZXNPcHRzID0gcGljayhvcHRzLCBbXG4gICAgICAnc3R5bGUnLCAnaW5jbHVkZV9kb2NzJywgJ2F0dGFjaG1lbnRzJywgJ2NvbmZsaWN0cycsICdmaWx0ZXInLFxuICAgICAgJ2RvY19pZHMnLCAndmlldycsICdzaW5jZScsICdxdWVyeV9wYXJhbXMnLCAnYmluYXJ5JywgJ3JldHVybl9kb2NzJ1xuICAgIF0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBmdW5jdGlvbiBvbkVycm9yKCkge1xuICAgICAgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRiLmNoYW5nZXMoY2hhbmdlc09wdHMpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoYykge1xuICAgICAgaWYgKGMuc2VxID4gb3B0cy5zaW5jZSAmJiAhb3B0cy5jYW5jZWxsZWQpIHtcbiAgICAgICAgb3B0cy5zaW5jZSA9IGMuc2VxO1xuICAgICAgICBvcHRzLm9uQ2hhbmdlKGMpO1xuICAgICAgfVxuICAgIH0pLm9uKCdjb21wbGV0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpbnByb2dyZXNzID09PSAnd2FpdGluZycpIHtcbiAgICAgICAgaW1tZWRpYXRlKGV2ZW50RnVuY3Rpb24pO1xuICAgICAgfVxuICAgICAgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICAgIH0pLm9uKCdlcnJvcicsIG9uRXJyb3IpO1xuICB9XG4gIHRoaXMuX2xpc3RlbmVyc1tpZF0gPSBldmVudEZ1bmN0aW9uO1xuICB0aGlzLm9uKGRiTmFtZSwgZXZlbnRGdW5jdGlvbik7XG59O1xuXG5DaGFuZ2VzLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChkYk5hbWUsIGlkKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIShpZCBpbiB0aGlzLl9saXN0ZW5lcnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIEVFLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGRiTmFtZSxcbiAgICB0aGlzLl9saXN0ZW5lcnNbaWRdKTtcbiAgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tpZF07XG59O1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5DaGFuZ2VzLnByb3RvdHlwZS5ub3RpZnlMb2NhbFdpbmRvd3MgPSBmdW5jdGlvbiAoZGJOYW1lKSB7XG4gIC8vZG8gYSB1c2VsZXNzIGNoYW5nZSBvbiBhIHN0b3JhZ2UgdGhpbmdcbiAgLy9pbiBvcmRlciB0byBnZXQgb3RoZXIgd2luZG93cydzIGxpc3RlbmVycyB0byBhY3RpdmF0ZVxuICBpZiAoaGFzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICBsb2NhbFN0b3JhZ2VbZGJOYW1lXSA9IChsb2NhbFN0b3JhZ2VbZGJOYW1lXSA9PT0gXCJhXCIpID8gXCJiXCIgOiBcImFcIjtcbiAgfVxufTtcblxuQ2hhbmdlcy5wcm90b3R5cGUubm90aWZ5ID0gZnVuY3Rpb24gKGRiTmFtZSkge1xuICB0aGlzLmVtaXQoZGJOYW1lKTtcbiAgdGhpcy5ub3RpZnlMb2NhbFdpbmRvd3MoZGJOYW1lKTtcbn07XG5cbmZ1bmN0aW9uIGd1YXJkZWRDb25zb2xlKG1ldGhvZCkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgY29uc29sZVttZXRob2RdLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJhbmRvbU51bWJlcihtaW4sIG1heCkge1xuICB2YXIgbWF4VGltZW91dCA9IDYwMDAwMDsgLy8gSGFyZC1jb2RlZCBkZWZhdWx0IG9mIDEwIG1pbnV0ZXNcbiAgbWluID0gcGFyc2VJbnQobWluLCAxMCkgfHwgMDtcbiAgbWF4ID0gcGFyc2VJbnQobWF4LCAxMCk7XG4gIGlmIChtYXggIT09IG1heCB8fCBtYXggPD0gbWluKSB7XG4gICAgbWF4ID0gKG1pbiB8fCAxKSA8PCAxOyAvL2RvdWJsaW5nXG4gIH0gZWxzZSB7XG4gICAgbWF4ID0gbWF4ICsgMTtcbiAgfVxuICAvLyBJbiBvcmRlciB0byBub3QgZXhjZWVkIG1heFRpbWVvdXQsIHBpY2sgYSByYW5kb20gdmFsdWUgYmV0d2VlbiBoYWxmIG9mIG1heFRpbWVvdXQgYW5kIG1heFRpbWVvdXRcbiAgaWYgKG1heCA+IG1heFRpbWVvdXQpIHtcbiAgICBtaW4gPSBtYXhUaW1lb3V0ID4+IDE7IC8vIGRpdmlkZSBieSB0d29cbiAgICBtYXggPSBtYXhUaW1lb3V0O1xuICB9XG4gIHZhciByYXRpbyA9IE1hdGgucmFuZG9tKCk7XG4gIHZhciByYW5nZSA9IG1heCAtIG1pbjtcblxuICByZXR1cm4gfn4ocmFuZ2UgKiByYXRpbyArIG1pbik7IC8vIH5+IGNvZXJjZXMgdG8gYW4gaW50LCBidXQgZmFzdC5cbn1cblxuZnVuY3Rpb24gZGVmYXVsdEJhY2tPZmYobWluKSB7XG4gIHZhciBtYXggPSAwO1xuICBpZiAoIW1pbikge1xuICAgIG1heCA9IDIwMDA7XG4gIH1cbiAgcmV0dXJuIHJhbmRvbU51bWJlcihtaW4sIG1heCk7XG59XG5cbi8vIGRlc2lnbmVkIHRvIGdpdmUgaW5mbyB0byBicm93c2VyIHVzZXJzLCB3aG8gYXJlIGRpc3R1cmJlZFxuLy8gd2hlbiB0aGV5IHNlZSBodHRwIGVycm9ycyBpbiB0aGUgY29uc29sZVxuZnVuY3Rpb24gZXhwbGFpbkVycm9yKHN0YXR1cywgc3RyKSB7XG4gIGd1YXJkZWRDb25zb2xlKCdpbmZvJywgJ1RoZSBhYm92ZSAnICsgc3RhdHVzICsgJyBpcyB0b3RhbGx5IG5vcm1hbC4gJyArIHN0cik7XG59XG5cbnZhciBhc3NpZ247XG57XG4gIGlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG4gIH0gZWxzZSB7XG4gICAgLy8gbGl0ZSBPYmplY3QuYXNzaWduIHBvbHlmaWxsIGJhc2VkIG9uXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuICAgIGFzc2lnbiA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuXG4gICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgbmV4dFNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG5cbiAgICAgICAgaWYgKG5leHRTb3VyY2UgIT0gbnVsbCkgeyAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIG5leHRTb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGJ1Z3Mgd2hlbiBoYXNPd25Qcm9wZXJ0eSBpcyBzaGFkb3dlZFxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXh0U291cmNlLCBuZXh0S2V5KSkge1xuICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdG87XG4gICAgfTtcbiAgfVxufVxuXG52YXIgJGluamVjdF9PYmplY3RfYXNzaWduID0gYXNzaWduO1xuXG5pbmhlcml0cyhQb3VjaEVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIFBvdWNoRXJyb3Ioc3RhdHVzLCBlcnJvciwgcmVhc29uKSB7XG4gIEVycm9yLmNhbGwodGhpcywgcmVhc29uKTtcbiAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIHRoaXMubmFtZSA9IGVycm9yO1xuICB0aGlzLm1lc3NhZ2UgPSByZWFzb247XG4gIHRoaXMuZXJyb3IgPSB0cnVlO1xufVxuXG5Qb3VjaEVycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgcmVhc29uOiB0aGlzLnJlYXNvblxuICB9KTtcbn07XG5cbnZhciBVTkFVVEhPUklaRUQgPSBuZXcgUG91Y2hFcnJvcig0MDEsICd1bmF1dGhvcml6ZWQnLCBcIk5hbWUgb3IgcGFzc3dvcmQgaXMgaW5jb3JyZWN0LlwiKTtcbnZhciBNSVNTSU5HX0JVTEtfRE9DUyA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgXCJNaXNzaW5nIEpTT04gbGlzdCBvZiAnZG9jcydcIik7XG52YXIgTUlTU0lOR19ET0MgPSBuZXcgUG91Y2hFcnJvcig0MDQsICdub3RfZm91bmQnLCAnbWlzc2luZycpO1xudmFyIFJFVl9DT05GTElDVCA9IG5ldyBQb3VjaEVycm9yKDQwOSwgJ2NvbmZsaWN0JywgJ0RvY3VtZW50IHVwZGF0ZSBjb25mbGljdCcpO1xudmFyIElOVkFMSURfSUQgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdfaWQgZmllbGQgbXVzdCBjb250YWluIGEgc3RyaW5nJyk7XG52YXIgTUlTU0lOR19JRCA9IG5ldyBQb3VjaEVycm9yKDQxMiwgJ21pc3NpbmdfaWQnLCAnX2lkIGlzIHJlcXVpcmVkIGZvciBwdXRzJyk7XG52YXIgUkVTRVJWRURfSUQgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdPbmx5IHJlc2VydmVkIGRvY3VtZW50IGlkcyBtYXkgc3RhcnQgd2l0aCB1bmRlcnNjb3JlLicpO1xudmFyIE5PVF9PUEVOID0gbmV3IFBvdWNoRXJyb3IoNDEyLCAncHJlY29uZGl0aW9uX2ZhaWxlZCcsICdEYXRhYmFzZSBub3Qgb3BlbicpO1xudmFyIFVOS05PV05fRVJST1IgPSBuZXcgUG91Y2hFcnJvcig1MDAsICd1bmtub3duX2Vycm9yJywgJ0RhdGFiYXNlIGVuY291bnRlcmVkIGFuIHVua25vd24gZXJyb3InKTtcbnZhciBCQURfQVJHID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnYmFkYXJnJywgJ1NvbWUgcXVlcnkgYXJndW1lbnQgaXMgaW52YWxpZCcpO1xudmFyIElOVkFMSURfUkVRVUVTVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2ludmFsaWRfcmVxdWVzdCcsICdSZXF1ZXN0IHdhcyBpbnZhbGlkJyk7XG52YXIgUVVFUllfUEFSU0VfRVJST1IgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdxdWVyeV9wYXJzZV9lcnJvcicsICdTb21lIHF1ZXJ5IHBhcmFtZXRlciBpcyBpbnZhbGlkJyk7XG52YXIgRE9DX1ZBTElEQVRJT04gPSBuZXcgUG91Y2hFcnJvcig1MDAsICdkb2NfdmFsaWRhdGlvbicsICdCYWQgc3BlY2lhbCBkb2N1bWVudCBtZW1iZXInKTtcbnZhciBCQURfUkVRVUVTVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ1NvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSByZXF1ZXN0Jyk7XG52YXIgTk9UX0FOX09CSkVDVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ0RvY3VtZW50IG11c3QgYmUgYSBKU09OIG9iamVjdCcpO1xudmFyIERCX01JU1NJTkcgPSBuZXcgUG91Y2hFcnJvcig0MDQsICdub3RfZm91bmQnLCAnRGF0YWJhc2Ugbm90IGZvdW5kJyk7XG52YXIgSURCX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnaW5kZXhlZF9kYl93ZW50X2JhZCcsICd1bmtub3duJyk7XG52YXIgV1NRX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnd2ViX3NxbF93ZW50X2JhZCcsICd1bmtub3duJyk7XG52YXIgTERCX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnbGV2ZWxEQl93ZW50X3dlbnRfYmFkJywgJ3Vua25vd24nKTtcbnZhciBGT1JCSURERU4gPSBuZXcgUG91Y2hFcnJvcig0MDMsICdmb3JiaWRkZW4nLCAnRm9yYmlkZGVuIGJ5IGRlc2lnbiBkb2MgdmFsaWRhdGVfZG9jX3VwZGF0ZSBmdW5jdGlvbicpO1xudmFyIElOVkFMSURfUkVWID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAnYmFkX3JlcXVlc3QnLCAnSW52YWxpZCByZXYgZm9ybWF0Jyk7XG52YXIgRklMRV9FWElTVFMgPSBuZXcgUG91Y2hFcnJvcig0MTIsICdmaWxlX2V4aXN0cycsICdUaGUgZGF0YWJhc2UgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLicpO1xudmFyIE1JU1NJTkdfU1RVQiA9IG5ldyBQb3VjaEVycm9yKDQxMiwgJ21pc3Npbmdfc3R1YicsICdBIHByZS1leGlzdGluZyBhdHRhY2htZW50IHN0dWIgd2FzblxcJ3QgZm91bmQnKTtcbnZhciBJTlZBTElEX1VSTCA9IG5ldyBQb3VjaEVycm9yKDQxMywgJ2ludmFsaWRfdXJsJywgJ1Byb3ZpZGVkIFVSTCBpcyBpbnZhbGlkJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yKGVycm9yLCByZWFzb24pIHtcbiAgZnVuY3Rpb24gQ3VzdG9tUG91Y2hFcnJvcihyZWFzb24pIHtcbiAgICAvLyBpbmhlcml0IGVycm9yIHByb3BlcnRpZXMgZnJvbSBvdXIgcGFyZW50IGVycm9yIG1hbnVhbGx5XG4gICAgLy8gc28gYXMgdG8gYWxsb3cgcHJvcGVyIEpTT04gcGFyc2luZy5cbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXJyb3IpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBuYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKHR5cGVvZiBlcnJvcltuYW1lc1tpXV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpc1tuYW1lc1tpXV0gPSBlcnJvcltuYW1lc1tpXV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gICAgfVxuXG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgIH1cbiAgfVxuICBDdXN0b21Qb3VjaEVycm9yLnByb3RvdHlwZSA9IFBvdWNoRXJyb3IucHJvdG90eXBlO1xuICByZXR1cm4gbmV3IEN1c3RvbVBvdWNoRXJyb3IocmVhc29uKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpIHtcblxuICBpZiAodHlwZW9mIGVyciAhPT0gJ29iamVjdCcpIHtcbiAgICB2YXIgZGF0YSA9IGVycjtcbiAgICBlcnIgPSBVTktOT1dOX0VSUk9SO1xuICAgIGVyci5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGlmICgnZXJyb3InIGluIGVyciAmJiBlcnIuZXJyb3IgPT09ICdjb25mbGljdCcpIHtcbiAgICBlcnIubmFtZSA9ICdjb25mbGljdCc7XG4gICAgZXJyLnN0YXR1cyA9IDQwOTtcbiAgfVxuXG4gIGlmICghKCduYW1lJyBpbiBlcnIpKSB7XG4gICAgZXJyLm5hbWUgPSBlcnIuZXJyb3IgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgaWYgKCEoJ3N0YXR1cycgaW4gZXJyKSkge1xuICAgIGVyci5zdGF0dXMgPSA1MDA7XG4gIH1cblxuICBpZiAoISgnbWVzc2FnZScgaW4gZXJyKSkge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UgfHwgZXJyLnJlYXNvbjtcbiAgfVxuXG4gIGlmICghKCdzdGFjaycgaW4gZXJyKSkge1xuICAgIGVyci5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gIH1cblxuICByZXR1cm4gZXJyO1xufVxuXG5mdW5jdGlvbiB0cnlGaWx0ZXIoZmlsdGVyLCBkb2MsIHJlcSkge1xuICB0cnkge1xuICAgIHJldHVybiAhZmlsdGVyKGRvYywgcmVxKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdmFyIG1zZyA9ICdGaWx0ZXIgZnVuY3Rpb24gdGhyZXc6ICcgKyBlcnIudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3IoQkFEX1JFUVVFU1QsIG1zZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsdGVyQ2hhbmdlKG9wdHMpIHtcbiAgdmFyIHJlcSA9IHt9O1xuICB2YXIgaGFzRmlsdGVyID0gb3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nO1xuICByZXEucXVlcnkgPSBvcHRzLnF1ZXJ5X3BhcmFtcztcblxuICByZXR1cm4gZnVuY3Rpb24gZmlsdGVyKGNoYW5nZSkge1xuICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgLy8gQ1NHIHNlbmRzIGV2ZW50cyBvbiB0aGUgY2hhbmdlcyBmZWVkIHRoYXQgZG9uJ3QgaGF2ZSBkb2N1bWVudHMsXG4gICAgICAvLyB0aGlzIGhhY2sgbWFrZXMgYSB3aG9sZSBsb3Qgb2YgZXhpc3RpbmcgY29kZSByb2J1c3QuXG4gICAgICBjaGFuZ2UuZG9jID0ge307XG4gICAgfVxuXG4gICAgdmFyIGZpbHRlclJldHVybiA9IGhhc0ZpbHRlciAmJiB0cnlGaWx0ZXIob3B0cy5maWx0ZXIsIGNoYW5nZS5kb2MsIHJlcSk7XG5cbiAgICBpZiAodHlwZW9mIGZpbHRlclJldHVybiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJSZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlclJldHVybikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghb3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgIGRlbGV0ZSBjaGFuZ2UuZG9jO1xuICAgIH0gZWxzZSBpZiAoIW9wdHMuYXR0YWNobWVudHMpIHtcbiAgICAgIGZvciAodmFyIGF0dCBpbiBjaGFuZ2UuZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoYW5nZS5kb2MuX2F0dGFjaG1lbnRzLCBhdHQpKSB7XG4gICAgICAgICAgY2hhbmdlLmRvYy5fYXR0YWNobWVudHNbYXR0XS5zdHViID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbihhcnJzKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXMgPSByZXMuY29uY2F0KGFycnNbaV0pO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8vIHNoaW0gZm9yIEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lLFxuXG4vLyBEZXRlcm1pbmUgaWQgYW4gSUQgaXMgdmFsaWRcbi8vICAgLSBpbnZhbGlkIElEcyBiZWdpbiB3aXRoIGFuIHVuZGVyZXNjb3JlIHRoYXQgZG9lcyBub3QgYmVnaW4gJ19kZXNpZ24nIG9yXG4vLyAgICAgJ19sb2NhbCdcbi8vICAgLSBhbnkgb3RoZXIgc3RyaW5nIHZhbHVlIGlzIGEgdmFsaWQgaWRcbi8vIFJldHVybnMgdGhlIHNwZWNpZmljIGVycm9yIG9iamVjdCBmb3IgZWFjaCBjYXNlXG5mdW5jdGlvbiBpbnZhbGlkSWRFcnJvcihpZCkge1xuICB2YXIgZXJyO1xuICBpZiAoIWlkKSB7XG4gICAgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19JRCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgIGVyciA9IGNyZWF0ZUVycm9yKElOVkFMSURfSUQpO1xuICB9IGVsc2UgaWYgKC9eXy8udGVzdChpZCkgJiYgISgvXl8oZGVzaWdufGxvY2FsKS8pLnRlc3QoaWQpKSB7XG4gICAgZXJyID0gY3JlYXRlRXJyb3IoUkVTRVJWRURfSUQpO1xuICB9XG4gIGlmIChlcnIpIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLy8gQ2hlY2tzIGlmIGEgUG91Y2hEQiBvYmplY3QgaXMgXCJyZW1vdGVcIiBvciBub3QuIFRoaXMgaXNcblxuZnVuY3Rpb24gaXNSZW1vdGUoZGIpIHtcbiAgaWYgKHR5cGVvZiBkYi5fcmVtb3RlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZGIuX3JlbW90ZTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodHlwZW9mIGRiLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBndWFyZGVkQ29uc29sZSgnd2FybicsXG4gICAgICAnZGIudHlwZSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICtcbiAgICAgICdhIGZ1dHVyZSB2ZXJzaW9uIG9mIFBvdWNoREInKTtcbiAgICByZXR1cm4gZGIudHlwZSgpID09PSAnaHR0cCc7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KGVlLCB0eXBlKSB7XG4gIHJldHVybiAnbGlzdGVuZXJDb3VudCcgaW4gZWUgPyBlZS5saXN0ZW5lckNvdW50KHR5cGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFLmxpc3RlbmVyQ291bnQoZWUsIHR5cGUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBwYXJ0cyA9IHMuc3BsaXQoJy8nKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiBwYXJ0cztcbiAgfVxuICBpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIFtzLCBzXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKHMpIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShzKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPyBub3JtYWxpemVkLmpvaW4oJy8nKSA6IG51bGw7XG59XG5cbi8vIG9yaWdpbmFsbHkgcGFyc2VVcmkgMS4yLjIsIG5vdyBwYXRjaGVkIGJ5IHVzXG4vLyAoYykgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+XG4vLyBNSVQgTGljZW5zZVxudmFyIGtleXMgPSBbXCJzb3VyY2VcIiwgXCJwcm90b2NvbFwiLCBcImF1dGhvcml0eVwiLCBcInVzZXJJbmZvXCIsIFwidXNlclwiLCBcInBhc3N3b3JkXCIsXG4gICAgXCJob3N0XCIsIFwicG9ydFwiLCBcInJlbGF0aXZlXCIsIFwicGF0aFwiLCBcImRpcmVjdG9yeVwiLCBcImZpbGVcIiwgXCJxdWVyeVwiLCBcImFuY2hvclwiXTtcbnZhciBxTmFtZSA9XCJxdWVyeUtleVwiO1xudmFyIHFQYXJzZXIgPSAvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2c7XG5cbi8vIHVzZSB0aGUgXCJsb29zZVwiIHBhcnNlclxuLyogZXNsaW50IG5vLXVzZWxlc3MtZXNjYXBlOiAwICovXG52YXIgcGFyc2VyID0gL14oPzooPyFbXjpAXSs6W146QFxcL10qQCkoW146XFwvPyMuXSspOik/KD86XFwvXFwvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcXC8/I10qKSg/OjooXFxkKikpPykoKChcXC8oPzpbXj8jXSg/IVtePyNcXC9dKlxcLltePyNcXC8uXSsoPzpbPyNdfCQpKSkqXFwvPyk/KFtePyNcXC9dKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvO1xuXG5mdW5jdGlvbiBwYXJzZVVyaShzdHIpIHtcbiAgdmFyIG0gPSBwYXJzZXIuZXhlYyhzdHIpO1xuICB2YXIgdXJpID0ge307XG4gIHZhciBpID0gMTQ7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IG1baV0gfHwgXCJcIjtcbiAgICB2YXIgZW5jb2RlZCA9IFsndXNlcicsICdwYXNzd29yZCddLmluZGV4T2Yoa2V5KSAhPT0gLTE7XG4gICAgdXJpW2tleV0gPSBlbmNvZGVkID8gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSA6IHZhbHVlO1xuICB9XG5cbiAgdXJpW3FOYW1lXSA9IHt9O1xuICB1cmlba2V5c1sxMl1dLnJlcGxhY2UocVBhcnNlciwgZnVuY3Rpb24gKCQwLCAkMSwgJDIpIHtcbiAgICBpZiAoJDEpIHtcbiAgICAgIHVyaVtxTmFtZV1bJDFdID0gJDI7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdXJpO1xufVxuXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vYWxleGRhdmlkL3Njb3BlLWV2YWwgdjAuMC4zXG4vLyAoc291cmNlOiBodHRwczovL3VucGtnLmNvbS9zY29wZS1ldmFsQDAuMC4zL3Njb3BlX2V2YWwuanMpXG4vLyBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgd3JhcHBlciBhcm91bmQgbmV3IEZ1bmN0aW9uKClcblxuZnVuY3Rpb24gc2NvcGVFdmFsKHNvdXJjZSwgc2NvcGUpIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gc2NvcGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjb3BlLCBrZXkpKSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIHZhbHVlcy5wdXNoKHNjb3BlW2tleV0pO1xuICAgIH1cbiAgfVxuICBrZXlzLnB1c2goc291cmNlKTtcbiAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KG51bGwsIGtleXMpLmFwcGx5KG51bGwsIHZhbHVlcyk7XG59XG5cbi8vIHRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIFwidXBkYXRlIHN1Z2FyXCIgZnVuY3Rpb24gZnJvbSBkYWxlaGFydmV5L3BvdWNoZGIjMTM4OFxuLy8gdGhlIGRpZmZGdW4gdGVsbHMgdXMgd2hhdCBkZWx0YSB0byBhcHBseSB0byB0aGUgZG9jLiAgaXQgZWl0aGVyIHJldHVybnNcbi8vIHRoZSBkb2MsIG9yIGZhbHNlIGlmIGl0IGRvZXNuJ3QgbmVlZCB0byBkbyBhbiB1cGRhdGUgYWZ0ZXIgYWxsXG5mdW5jdGlvbiB1cHNlcnQoZGIsIGRvY0lkLCBkaWZmRnVuKSB7XG4gIHJldHVybiBkYi5nZXQoZG9jSWQpXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgIC8vIHRoZSB1c2VyIG1pZ2h0IGNoYW5nZSB0aGUgX3Jldiwgc28gc2F2ZSBpdCBmb3IgcG9zdGVyaXR5XG4gICAgICB2YXIgZG9jUmV2ID0gZG9jLl9yZXY7XG4gICAgICB2YXIgbmV3RG9jID0gZGlmZkZ1bihkb2MpO1xuXG4gICAgICBpZiAoIW5ld0RvYykge1xuICAgICAgICAvLyBpZiB0aGUgZGlmZkZ1biByZXR1cm5zIGZhbHN5LCB3ZSBzaG9ydC1jaXJjdWl0IGFzXG4gICAgICAgIC8vIGFuIG9wdGltaXphdGlvblxuICAgICAgICByZXR1cm4ge3VwZGF0ZWQ6IGZhbHNlLCByZXY6IGRvY1Jldn07XG4gICAgICB9XG5cbiAgICAgIC8vIHVzZXJzIGFyZW4ndCBhbGxvd2VkIHRvIG1vZGlmeSB0aGVzZSB2YWx1ZXMsXG4gICAgICAvLyBzbyByZXNldCB0aGVtIGhlcmVcbiAgICAgIG5ld0RvYy5faWQgPSBkb2NJZDtcbiAgICAgIG5ld0RvYy5fcmV2ID0gZG9jUmV2O1xuICAgICAgcmV0dXJuIHRyeUFuZFB1dChkYiwgbmV3RG9jLCBkaWZmRnVuKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdHJ5QW5kUHV0KGRiLCBkb2MsIGRpZmZGdW4pIHtcbiAgcmV0dXJuIGRiLnB1dChkb2MpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGVkOiB0cnVlLFxuICAgICAgcmV2OiByZXMucmV2XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKGVyci5zdGF0dXMgIT09IDQwOSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gdXBzZXJ0KGRiLCBkb2MuX2lkLCBkaWZmRnVuKTtcbiAgfSk7XG59XG5cbnZhciB0aGlzQXRvYiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGF0b2Ioc3RyKTtcbn07XG5cbnZhciB0aGlzQnRvYSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGJ0b2Eoc3RyKTtcbn07XG5cbi8vIEFic3RyYWN0cyBjb25zdHJ1Y3RpbmcgYSBCbG9iIG9iamVjdCwgc28gaXQgYWxzbyB3b3JrcyBpbiBvbGRlclxuLy8gYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBuYXRpdmUgQmxvYiBjb25zdHJ1Y3RvciAoZS5nLlxuLy8gb2xkIFF0V2ViS2l0IHZlcnNpb25zLCBBbmRyb2lkIDwgNC40KS5cbmZ1bmN0aW9uIGNyZWF0ZUJsb2IocGFydHMsIHByb3BlcnRpZXMpIHtcbiAgLyogZ2xvYmFsIEJsb2JCdWlsZGVyLE1TQmxvYkJ1aWxkZXIsTW96QmxvYkJ1aWxkZXIsV2ViS2l0QmxvYkJ1aWxkZXIgKi9cbiAgcGFydHMgPSBwYXJ0cyB8fCBbXTtcbiAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwge307XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKHBhcnRzLCBwcm9wZXJ0aWVzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLm5hbWUgIT09IFwiVHlwZUVycm9yXCIpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHZhciBCdWlsZGVyID0gdHlwZW9mIEJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IEJsb2JCdWlsZGVyIDpcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBNU0Jsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IE1TQmxvYkJ1aWxkZXIgOlxuICAgICAgICAgICAgICAgICAgdHlwZW9mIE1vekJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IE1vekJsb2JCdWlsZGVyIDpcbiAgICAgICAgICAgICAgICAgIFdlYktpdEJsb2JCdWlsZGVyO1xuICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBidWlsZGVyLmFwcGVuZChwYXJ0c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLmdldEJsb2IocHJvcGVydGllcy50eXBlKTtcbiAgfVxufVxuXG4vLyBGcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQ5Njc2NDcvIChjb250aW51ZXMgb24gbmV4dCBsaW5lKVxuLy8gZW5jb2RlLWRlY29kZS1pbWFnZS13aXRoLWJhc2U2NC1icmVha3MtaW1hZ2UgKDIwMTMtMDQtMjEpXG5mdW5jdGlvbiBiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyKGJpbikge1xuICB2YXIgbGVuZ3RoID0gYmluLmxlbmd0aDtcbiAgdmFyIGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgpO1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IGJpbi5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBidWY7XG59XG5cbmZ1bmN0aW9uIGJpblN0cmluZ1RvQmx1ZmZlcihiaW5TdHJpbmcsIHR5cGUpIHtcbiAgcmV0dXJuIGNyZWF0ZUJsb2IoW2JpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIoYmluU3RyaW5nKV0sIHt0eXBlOiB0eXBlfSk7XG59XG5cbmZ1bmN0aW9uIGI2NFRvQmx1ZmZlcihiNjQsIHR5cGUpIHtcbiAgcmV0dXJuIGJpblN0cmluZ1RvQmx1ZmZlcih0aGlzQXRvYihiNjQpLCB0eXBlKTtcbn1cblxuLy9DYW4ndCBmaW5kIG9yaWdpbmFsIHBvc3QsIGJ1dCB0aGlzIGlzIGNsb3NlXG4vL2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjk2NTEwNy8gKGNvbnRpbnVlcyBvbiBuZXh0IGxpbmUpXG4vL2NvbnZlcnRpbmctYmV0d2Vlbi1zdHJpbmdzLWFuZC1hcnJheWJ1ZmZlcnNcbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcoYnVmZmVyKSB7XG4gIHZhciBiaW5hcnkgPSAnJztcbiAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgdmFyIGxlbmd0aCA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gIH1cbiAgcmV0dXJuIGJpbmFyeTtcbn1cblxuLy8gc2hpbSBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGl0XG5mdW5jdGlvbiByZWFkQXNCaW5hcnlTdHJpbmcoYmxvYiwgY2FsbGJhY2spIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHZhciBoYXNCaW5hcnlTdHJpbmcgPSB0eXBlb2YgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyA9PT0gJ2Z1bmN0aW9uJztcbiAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGUudGFyZ2V0LnJlc3VsdCB8fCAnJztcbiAgICBpZiAoaGFzQmluYXJ5U3RyaW5nKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0KTtcbiAgICB9XG4gICAgY2FsbGJhY2soYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhyZXN1bHQpKTtcbiAgfTtcbiAgaWYgKGhhc0JpbmFyeVN0cmluZykge1xuICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XG4gIH0gZWxzZSB7XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2JUb0JpbmFyeVN0cmluZyhibG9iT3JCdWZmZXIsIGNhbGxiYWNrKSB7XG4gIHJlYWRBc0JpbmFyeVN0cmluZyhibG9iT3JCdWZmZXIsIGZ1bmN0aW9uIChiaW4pIHtcbiAgICBjYWxsYmFjayhiaW4pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYmxvYlRvQmFzZTY0KGJsb2JPckJ1ZmZlciwgY2FsbGJhY2spIHtcbiAgYmxvYlRvQmluYXJ5U3RyaW5nKGJsb2JPckJ1ZmZlciwgZnVuY3Rpb24gKGJhc2U2NCkge1xuICAgIGNhbGxiYWNrKHRoaXNCdG9hKGJhc2U2NCkpO1xuICB9KTtcbn1cblxuLy8gc2ltcGxpZmllZCBBUEkuIHVuaXZlcnNhbCBicm93c2VyIHN1cHBvcnQgaXMgYXNzdW1lZFxuZnVuY3Rpb24gcmVhZEFzQXJyYXlCdWZmZXIoYmxvYiwgY2FsbGJhY2spIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciByZXN1bHQgPSBlLnRhcmdldC5yZXN1bHQgfHwgbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gIH07XG4gIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbn1cblxuLy8gdGhpcyBpcyBub3QgdXNlZCBpbiB0aGUgYnJvd3NlclxuXG52YXIgc2V0SW1tZWRpYXRlU2hpbSA9IHNlbGYuc2V0SW1tZWRpYXRlIHx8IHNlbGYuc2V0VGltZW91dDtcbnZhciBNRDVfQ0hVTktfU0laRSA9IDMyNzY4O1xuXG5mdW5jdGlvbiByYXdUb0Jhc2U2NChyYXcpIHtcbiAgcmV0dXJuIHRoaXNCdG9hKHJhdyk7XG59XG5cbmZ1bmN0aW9uIHNsaWNlQmxvYihibG9iLCBzdGFydCwgZW5kKSB7XG4gIGlmIChibG9iLndlYmtpdFNsaWNlKSB7XG4gICAgcmV0dXJuIGJsb2Iud2Via2l0U2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIGJsb2Iuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEJsb2IoYnVmZmVyLCBibG9iLCBzdGFydCwgZW5kLCBjYWxsYmFjaykge1xuICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IGJsb2Iuc2l6ZSkge1xuICAgIC8vIG9ubHkgc2xpY2UgYmxvYiBpZiB3ZSByZWFsbHkgbmVlZCB0b1xuICAgIGJsb2IgPSBzbGljZUJsb2IoYmxvYiwgc3RhcnQsIGVuZCk7XG4gIH1cbiAgcmVhZEFzQXJyYXlCdWZmZXIoYmxvYiwgZnVuY3Rpb24gKGFycmF5QnVmZmVyKSB7XG4gICAgYnVmZmVyLmFwcGVuZChhcnJheUJ1ZmZlcik7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFN0cmluZyhidWZmZXIsIHN0cmluZywgc3RhcnQsIGVuZCwgY2FsbGJhY2spIHtcbiAgaWYgKHN0YXJ0ID4gMCB8fCBlbmQgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgLy8gb25seSBjcmVhdGUgYSBzdWJzdHJpbmcgaWYgd2UgcmVhbGx5IG5lZWQgdG9cbiAgICBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICB9XG4gIGJ1ZmZlci5hcHBlbmRCaW5hcnkoc3RyaW5nKTtcbiAgY2FsbGJhY2soKTtcbn1cblxuZnVuY3Rpb24gYmluYXJ5TWQ1KGRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBpbnB1dElzU3RyaW5nID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnO1xuICB2YXIgbGVuID0gaW5wdXRJc1N0cmluZyA/IGRhdGEubGVuZ3RoIDogZGF0YS5zaXplO1xuICB2YXIgY2h1bmtTaXplID0gTWF0aC5taW4oTUQ1X0NIVU5LX1NJWkUsIGxlbik7XG4gIHZhciBjaHVua3MgPSBNYXRoLmNlaWwobGVuIC8gY2h1bmtTaXplKTtcbiAgdmFyIGN1cnJlbnRDaHVuayA9IDA7XG4gIHZhciBidWZmZXIgPSBpbnB1dElzU3RyaW5nID8gbmV3IE1kNSgpIDogbmV3IE1kNS5BcnJheUJ1ZmZlcigpO1xuXG4gIHZhciBhcHBlbmQgPSBpbnB1dElzU3RyaW5nID8gYXBwZW5kU3RyaW5nIDogYXBwZW5kQmxvYjtcblxuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHNldEltbWVkaWF0ZVNoaW0obG9hZE5leHRDaHVuayk7XG4gIH1cblxuICBmdW5jdGlvbiBkb25lKCkge1xuICAgIHZhciByYXcgPSBidWZmZXIuZW5kKHRydWUpO1xuICAgIHZhciBiYXNlNjQgPSByYXdUb0Jhc2U2NChyYXcpO1xuICAgIGNhbGxiYWNrKGJhc2U2NCk7XG4gICAgYnVmZmVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWROZXh0Q2h1bmsoKSB7XG4gICAgdmFyIHN0YXJ0ID0gY3VycmVudENodW5rICogY2h1bmtTaXplO1xuICAgIHZhciBlbmQgPSBzdGFydCArIGNodW5rU2l6ZTtcbiAgICBjdXJyZW50Q2h1bmsrKztcbiAgICBpZiAoY3VycmVudENodW5rIDwgY2h1bmtzKSB7XG4gICAgICBhcHBlbmQoYnVmZmVyLCBkYXRhLCBzdGFydCwgZW5kLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kKGJ1ZmZlciwgZGF0YSwgc3RhcnQsIGVuZCwgZG9uZSk7XG4gICAgfVxuICB9XG4gIGxvYWROZXh0Q2h1bmsoKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nTWQ1KHN0cmluZykge1xuICByZXR1cm4gTWQ1Lmhhc2goc3RyaW5nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJldmlzaW9uIHN0cmluZyB0aGF0IGRvZXMgTk9UIGluY2x1ZGUgdGhlIHJldmlzaW9uIGhlaWdodFxuICogRm9yIGV4YW1wbGUgJzU2NjQ5ZjFiMDUwNmM2Y2E5ZmRhMDc0NmViMGNhY2RmJ1xuICovXG5mdW5jdGlvbiByZXYkJDEoZG9jLCBkZXRlcm1pbmlzdGljX3JldnMpIHtcbiAgaWYgKCFkZXRlcm1pbmlzdGljX3JldnMpIHtcbiAgICByZXR1cm4gdjQoKS5yZXBsYWNlKC8tL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgdmFyIG11dGF0ZWFibGVEb2MgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIGRvYyk7XG4gIGRlbGV0ZSBtdXRhdGVhYmxlRG9jLl9yZXZfdHJlZTtcbiAgcmV0dXJuIHN0cmluZ01kNShKU09OLnN0cmluZ2lmeShtdXRhdGVhYmxlRG9jKSk7XG59XG5cbnZhciB1dWlkID0gdjQ7IC8vIG1pbWljIG9sZCBpbXBvcnQsIG9ubHkgdjQgaXMgZXZlciB1c2VkIGVsc2V3aGVyZVxuXG4vLyBXZSBmZXRjaCBhbGwgbGVhZnMgb2YgdGhlIHJldmlzaW9uIHRyZWUsIGFuZCBzb3J0IHRoZW0gYmFzZWQgb24gdHJlZSBsZW5ndGhcbi8vIGFuZCB3aGV0aGVyIHRoZXkgd2VyZSBkZWxldGVkLCB1bmRlbGV0ZWQgZG9jdW1lbnRzIHdpdGggdGhlIGxvbmdlc3QgcmV2aXNpb25cbi8vIHRyZWUgKG1vc3QgZWRpdHMpIHdpblxuLy8gVGhlIGZpbmFsIHNvcnQgYWxnb3JpdGhtIGlzIHNsaWdodGx5IGRvY3VtZW50ZWQgaW4gYSBzaWRlYmFyIGhlcmU6XG4vLyBodHRwOi8vZ3VpZGUuY291Y2hkYi5vcmcvZHJhZnQvY29uZmxpY3RzLmh0bWxcbmZ1bmN0aW9uIHdpbm5pbmdSZXYobWV0YWRhdGEpIHtcbiAgdmFyIHdpbm5pbmdJZDtcbiAgdmFyIHdpbm5pbmdQb3M7XG4gIHZhciB3aW5uaW5nRGVsZXRlZDtcbiAgdmFyIHRvVmlzaXQgPSBtZXRhZGF0YS5yZXZfdHJlZS5zbGljZSgpO1xuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgdHJlZSA9IG5vZGUuaWRzO1xuICAgIHZhciBicmFuY2hlcyA9IHRyZWVbMl07XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zO1xuICAgIGlmIChicmFuY2hlcy5sZW5ndGgpIHsgLy8gbm9uLWxlYWZcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBicmFuY2hlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0b1Zpc2l0LnB1c2goe3BvczogcG9zICsgMSwgaWRzOiBicmFuY2hlc1tpXX0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBkZWxldGVkID0gISF0cmVlWzFdLmRlbGV0ZWQ7XG4gICAgdmFyIGlkID0gdHJlZVswXTtcbiAgICAvLyBzb3J0IGJ5IGRlbGV0ZWQsIHRoZW4gcG9zLCB0aGVuIGlkXG4gICAgaWYgKCF3aW5uaW5nSWQgfHwgKHdpbm5pbmdEZWxldGVkICE9PSBkZWxldGVkID8gd2lubmluZ0RlbGV0ZWQgOlxuICAgICAgICB3aW5uaW5nUG9zICE9PSBwb3MgPyB3aW5uaW5nUG9zIDwgcG9zIDogd2lubmluZ0lkIDwgaWQpKSB7XG4gICAgICB3aW5uaW5nSWQgPSBpZDtcbiAgICAgIHdpbm5pbmdQb3MgPSBwb3M7XG4gICAgICB3aW5uaW5nRGVsZXRlZCA9IGRlbGV0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdpbm5pbmdQb3MgKyAnLScgKyB3aW5uaW5nSWQ7XG59XG5cbi8vIFByZXR0eSBtdWNoIGFsbCBiZWxvdyBjYW4gYmUgY29tYmluZWQgaW50byBhIGhpZ2hlciBvcmRlciBmdW5jdGlvbiB0b1xuLy8gdHJhdmVyc2UgcmV2aXNpb25zXG4vLyBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIGFzIGNvbnRleHQgdG8gYWxsXG4vLyBjaGlsZHJlbiBvZiB0aGF0IG5vZGVcbmZ1bmN0aW9uIHRyYXZlcnNlUmV2VHJlZShyZXZzLCBjYWxsYmFjaykge1xuICB2YXIgdG9WaXNpdCA9IHJldnMuc2xpY2UoKTtcblxuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3M7XG4gICAgdmFyIHRyZWUgPSBub2RlLmlkcztcbiAgICB2YXIgYnJhbmNoZXMgPSB0cmVlWzJdO1xuICAgIHZhciBuZXdDdHggPVxuICAgICAgY2FsbGJhY2soYnJhbmNoZXMubGVuZ3RoID09PSAwLCBwb3MsIHRyZWVbMF0sIG5vZGUuY3R4LCB0cmVlWzFdKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnJhbmNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBwb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldLCBjdHg6IG5ld0N0eH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzb3J0QnlQb3MoYSwgYikge1xuICByZXR1cm4gYS5wb3MgLSBiLnBvcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdExlYXZlcyhyZXZzKSB7XG4gIHZhciBsZWF2ZXMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKHJldnMsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgaWQsIGFjYywgb3B0cykge1xuICAgIGlmIChpc0xlYWYpIHtcbiAgICAgIGxlYXZlcy5wdXNoKHtyZXY6IHBvcyArIFwiLVwiICsgaWQsIHBvczogcG9zLCBvcHRzOiBvcHRzfSk7XG4gICAgfVxuICB9KTtcbiAgbGVhdmVzLnNvcnQoc29ydEJ5UG9zKS5yZXZlcnNlKCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsZWF2ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBkZWxldGUgbGVhdmVzW2ldLnBvcztcbiAgfVxuICByZXR1cm4gbGVhdmVzO1xufVxuXG4vLyByZXR1cm5zIHJldnMgb2YgYWxsIGNvbmZsaWN0cyB0aGF0IGlzIGxlYXZlcyBzdWNoIHRoYXRcbi8vIDEuIGFyZSBub3QgZGVsZXRlZCBhbmRcbi8vIDIuIGFyZSBkaWZmZXJlbnQgdGhhbiB3aW5uaW5nIHJldmlzaW9uXG5mdW5jdGlvbiBjb2xsZWN0Q29uZmxpY3RzKG1ldGFkYXRhKSB7XG4gIHZhciB3aW4gPSB3aW5uaW5nUmV2KG1ldGFkYXRhKTtcbiAgdmFyIGxlYXZlcyA9IGNvbGxlY3RMZWF2ZXMobWV0YWRhdGEucmV2X3RyZWUpO1xuICB2YXIgY29uZmxpY3RzID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsZWF2ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgbGVhZiA9IGxlYXZlc1tpXTtcbiAgICBpZiAobGVhZi5yZXYgIT09IHdpbiAmJiAhbGVhZi5vcHRzLmRlbGV0ZWQpIHtcbiAgICAgIGNvbmZsaWN0cy5wdXNoKGxlYWYucmV2KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuLy8gY29tcGFjdCBhIHRyZWUgYnkgbWFya2luZyBpdHMgbm9uLWxlYWZzIGFzIG1pc3NpbmcsXG4vLyBhbmQgcmV0dXJuIGEgbGlzdCBvZiByZXZzIHRvIGRlbGV0ZVxuZnVuY3Rpb24gY29tcGFjdFRyZWUobWV0YWRhdGEpIHtcbiAgdmFyIHJldnMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKG1ldGFkYXRhLnJldl90cmVlLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldkhhc2gsIGN0eCwgb3B0cykge1xuICAgIGlmIChvcHRzLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScgJiYgIWlzTGVhZikge1xuICAgICAgcmV2cy5wdXNoKHBvcyArICctJyArIHJldkhhc2gpO1xuICAgICAgb3B0cy5zdGF0dXMgPSAnbWlzc2luZyc7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldnM7XG59XG5cbi8vIGJ1aWxkIHVwIGEgbGlzdCBvZiBhbGwgdGhlIHBhdGhzIHRvIHRoZSBsZWFmcyBpbiB0aGlzIHJldmlzaW9uIHRyZWVcbmZ1bmN0aW9uIHJvb3RUb0xlYWYocmV2cykge1xuICB2YXIgcGF0aHMgPSBbXTtcbiAgdmFyIHRvVmlzaXQgPSByZXZzLnNsaWNlKCk7XG4gIHZhciBub2RlO1xuICB3aGlsZSAoKG5vZGUgPSB0b1Zpc2l0LnBvcCgpKSkge1xuICAgIHZhciBwb3MgPSBub2RlLnBvcztcbiAgICB2YXIgdHJlZSA9IG5vZGUuaWRzO1xuICAgIHZhciBpZCA9IHRyZWVbMF07XG4gICAgdmFyIG9wdHMgPSB0cmVlWzFdO1xuICAgIHZhciBicmFuY2hlcyA9IHRyZWVbMl07XG4gICAgdmFyIGlzTGVhZiA9IGJyYW5jaGVzLmxlbmd0aCA9PT0gMDtcblxuICAgIHZhciBoaXN0b3J5ID0gbm9kZS5oaXN0b3J5ID8gbm9kZS5oaXN0b3J5LnNsaWNlKCkgOiBbXTtcbiAgICBoaXN0b3J5LnB1c2goe2lkOiBpZCwgb3B0czogb3B0c30pO1xuICAgIGlmIChpc0xlYWYpIHtcbiAgICAgIHBhdGhzLnB1c2goe3BvczogKHBvcyArIDEgLSBoaXN0b3J5Lmxlbmd0aCksIGlkczogaGlzdG9yeX0pO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnJhbmNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBwb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldLCBoaXN0b3J5OiBoaXN0b3J5fSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXRocy5yZXZlcnNlKCk7XG59XG5cbi8vIGZvciBhIGJldHRlciBvdmVydmlldyBvZiB3aGF0IHRoaXMgaXMgZG9pbmcsIHJlYWQ6XG5cbmZ1bmN0aW9uIHNvcnRCeVBvcyQxKGEsIGIpIHtcbiAgcmV0dXJuIGEucG9zIC0gYi5wb3M7XG59XG5cbi8vIGNsYXNzaWMgYmluYXJ5IHNlYXJjaFxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGFyciwgaXRlbSwgY29tcGFyYXRvcikge1xuICB2YXIgbG93ID0gMDtcbiAgdmFyIGhpZ2ggPSBhcnIubGVuZ3RoO1xuICB2YXIgbWlkO1xuICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMTtcbiAgICBpZiAoY29tcGFyYXRvcihhcnJbbWlkXSwgaXRlbSkgPCAwKSB7XG4gICAgICBsb3cgPSBtaWQgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWdoID0gbWlkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbG93O1xufVxuXG4vLyBhc3N1bWluZyB0aGUgYXJyIGlzIHNvcnRlZCwgaW5zZXJ0IHRoZSBpdGVtIGluIHRoZSBwcm9wZXIgcGxhY2VcbmZ1bmN0aW9uIGluc2VydFNvcnRlZChhcnIsIGl0ZW0sIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGlkeCA9IGJpbmFyeVNlYXJjaChhcnIsIGl0ZW0sIGNvbXBhcmF0b3IpO1xuICBhcnIuc3BsaWNlKGlkeCwgMCwgaXRlbSk7XG59XG5cbi8vIFR1cm4gYSBwYXRoIGFzIGEgZmxhdCBhcnJheSBpbnRvIGEgdHJlZSB3aXRoIGEgc2luZ2xlIGJyYW5jaC5cbi8vIElmIGFueSBzaG91bGQgYmUgc3RlbW1lZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LCB0aGF0J3MgcGFzc2VkXG4vLyBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG5mdW5jdGlvbiBwYXRoVG9UcmVlKHBhdGgsIG51bVN0ZW1tZWQpIHtcbiAgdmFyIHJvb3Q7XG4gIHZhciBsZWFmO1xuICBmb3IgKHZhciBpID0gbnVtU3RlbW1lZCwgbGVuID0gcGF0aC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBub2RlID0gcGF0aFtpXTtcbiAgICB2YXIgY3VycmVudExlYWYgPSBbbm9kZS5pZCwgbm9kZS5vcHRzLCBbXV07XG4gICAgaWYgKGxlYWYpIHtcbiAgICAgIGxlYWZbMl0ucHVzaChjdXJyZW50TGVhZik7XG4gICAgICBsZWFmID0gY3VycmVudExlYWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3QgPSBsZWFmID0gY3VycmVudExlYWY7XG4gICAgfVxuICB9XG4gIHJldHVybiByb290O1xufVxuXG4vLyBjb21wYXJlIHRoZSBJRHMgb2YgdHdvIHRyZWVzXG5mdW5jdGlvbiBjb21wYXJlVHJlZShhLCBiKSB7XG4gIHJldHVybiBhWzBdIDwgYlswXSA/IC0xIDogMTtcbn1cblxuLy8gTWVyZ2UgdHdvIHRyZWVzIHRvZ2V0aGVyXG4vLyBUaGUgcm9vdHMgb2YgdHJlZTEgYW5kIHRyZWUyIG11c3QgYmUgdGhlIHNhbWUgcmV2aXNpb25cbmZ1bmN0aW9uIG1lcmdlVHJlZShpbl90cmVlMSwgaW5fdHJlZTIpIHtcbiAgdmFyIHF1ZXVlID0gW3t0cmVlMTogaW5fdHJlZTEsIHRyZWUyOiBpbl90cmVlMn1dO1xuICB2YXIgY29uZmxpY3RzID0gZmFsc2U7XG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICB2YXIgdHJlZTEgPSBpdGVtLnRyZWUxO1xuICAgIHZhciB0cmVlMiA9IGl0ZW0udHJlZTI7XG5cbiAgICBpZiAodHJlZTFbMV0uc3RhdHVzIHx8IHRyZWUyWzFdLnN0YXR1cykge1xuICAgICAgdHJlZTFbMV0uc3RhdHVzID1cbiAgICAgICAgKHRyZWUxWzFdLnN0YXR1cyA9PT0gICdhdmFpbGFibGUnIHx8XG4gICAgICAgIHRyZWUyWzFdLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScpID8gJ2F2YWlsYWJsZScgOiAnbWlzc2luZyc7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlMlsyXS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0cmVlMVsyXVswXSkge1xuICAgICAgICBjb25mbGljdHMgPSAnbmV3X2xlYWYnO1xuICAgICAgICB0cmVlMVsyXVswXSA9IHRyZWUyWzJdW2ldO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1lcmdlZCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0cmVlMVsyXS5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAodHJlZTFbMl1bal1bMF0gPT09IHRyZWUyWzJdW2ldWzBdKSB7XG4gICAgICAgICAgcXVldWUucHVzaCh7dHJlZTE6IHRyZWUxWzJdW2pdLCB0cmVlMjogdHJlZTJbMl1baV19KTtcbiAgICAgICAgICBtZXJnZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW1lcmdlZCkge1xuICAgICAgICBjb25mbGljdHMgPSAnbmV3X2JyYW5jaCc7XG4gICAgICAgIGluc2VydFNvcnRlZCh0cmVlMVsyXSwgdHJlZTJbMl1baV0sIGNvbXBhcmVUcmVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtjb25mbGljdHM6IGNvbmZsaWN0cywgdHJlZTogaW5fdHJlZTF9O1xufVxuXG5mdW5jdGlvbiBkb01lcmdlKHRyZWUsIHBhdGgsIGRvbnRFeHBhbmQpIHtcbiAgdmFyIHJlc3RyZWUgPSBbXTtcbiAgdmFyIGNvbmZsaWN0cyA9IGZhbHNlO1xuICB2YXIgbWVyZ2VkID0gZmFsc2U7XG4gIHZhciByZXM7XG5cbiAgaWYgKCF0cmVlLmxlbmd0aCkge1xuICAgIHJldHVybiB7dHJlZTogW3BhdGhdLCBjb25mbGljdHM6ICduZXdfbGVhZid9O1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRyZWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgYnJhbmNoID0gdHJlZVtpXTtcbiAgICBpZiAoYnJhbmNoLnBvcyA9PT0gcGF0aC5wb3MgJiYgYnJhbmNoLmlkc1swXSA9PT0gcGF0aC5pZHNbMF0pIHtcbiAgICAgIC8vIFBhdGhzIHN0YXJ0IGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFuZCBoYXZlIHRoZSBzYW1lIHJvb3QsIHNvIHRoZXkgbmVlZFxuICAgICAgLy8gbWVyZ2VkXG4gICAgICByZXMgPSBtZXJnZVRyZWUoYnJhbmNoLmlkcywgcGF0aC5pZHMpO1xuICAgICAgcmVzdHJlZS5wdXNoKHtwb3M6IGJyYW5jaC5wb3MsIGlkczogcmVzLnRyZWV9KTtcbiAgICAgIGNvbmZsaWN0cyA9IGNvbmZsaWN0cyB8fCByZXMuY29uZmxpY3RzO1xuICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRvbnRFeHBhbmQgIT09IHRydWUpIHtcbiAgICAgIC8vIFRoZSBwYXRocyBzdGFydCBhdCBhIGRpZmZlcmVudCBwb3NpdGlvbiwgdGFrZSB0aGUgZWFybGllc3QgcGF0aCBhbmRcbiAgICAgIC8vIHRyYXZlcnNlIHVwIHVudGlsIGl0IGFzIGF0IHRoZSBzYW1lIHBvaW50IGZyb20gcm9vdCBhcyB0aGUgcGF0aCB3ZVxuICAgICAgLy8gd2FudCB0byBtZXJnZS4gIElmIHRoZSBrZXlzIG1hdGNoIHdlIHJldHVybiB0aGUgbG9uZ2VyIHBhdGggd2l0aCB0aGVcbiAgICAgIC8vIG90aGVyIG1lcmdlZCBBZnRlciBzdGVtbWluZyB3ZSBkb250IHdhbnQgdG8gZXhwYW5kIHRoZSB0cmVlc1xuXG4gICAgICB2YXIgdDEgPSBicmFuY2gucG9zIDwgcGF0aC5wb3MgPyBicmFuY2ggOiBwYXRoO1xuICAgICAgdmFyIHQyID0gYnJhbmNoLnBvcyA8IHBhdGgucG9zID8gcGF0aCA6IGJyYW5jaDtcbiAgICAgIHZhciBkaWZmID0gdDIucG9zIC0gdDEucG9zO1xuXG4gICAgICB2YXIgY2FuZGlkYXRlUGFyZW50cyA9IFtdO1xuXG4gICAgICB2YXIgdHJlZXMgPSBbXTtcbiAgICAgIHRyZWVzLnB1c2goe2lkczogdDEuaWRzLCBkaWZmOiBkaWZmLCBwYXJlbnQ6IG51bGwsIHBhcmVudElkeDogbnVsbH0pO1xuICAgICAgd2hpbGUgKHRyZWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0cmVlcy5wb3AoKTtcbiAgICAgICAgaWYgKGl0ZW0uZGlmZiA9PT0gMCkge1xuICAgICAgICAgIGlmIChpdGVtLmlkc1swXSA9PT0gdDIuaWRzWzBdKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVQYXJlbnRzLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbGVtZW50cyA9IGl0ZW0uaWRzWzJdO1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgZWxlbWVudHNMZW4gPSBlbGVtZW50cy5sZW5ndGg7IGogPCBlbGVtZW50c0xlbjsgaisrKSB7XG4gICAgICAgICAgdHJlZXMucHVzaCh7XG4gICAgICAgICAgICBpZHM6IGVsZW1lbnRzW2pdLFxuICAgICAgICAgICAgZGlmZjogaXRlbS5kaWZmIC0gMSxcbiAgICAgICAgICAgIHBhcmVudDogaXRlbS5pZHMsXG4gICAgICAgICAgICBwYXJlbnRJZHg6IGpcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZWwgPSBjYW5kaWRhdGVQYXJlbnRzWzBdO1xuXG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJlc3RyZWUucHVzaChicmFuY2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzID0gbWVyZ2VUcmVlKGVsLmlkcywgdDIuaWRzKTtcbiAgICAgICAgZWwucGFyZW50WzJdW2VsLnBhcmVudElkeF0gPSByZXMudHJlZTtcbiAgICAgICAgcmVzdHJlZS5wdXNoKHtwb3M6IHQxLnBvcywgaWRzOiB0MS5pZHN9KTtcbiAgICAgICAgY29uZmxpY3RzID0gY29uZmxpY3RzIHx8IHJlcy5jb25mbGljdHM7XG4gICAgICAgIG1lcmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RyZWUucHVzaChicmFuY2gpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlIGRpZG50IGZpbmRcbiAgaWYgKCFtZXJnZWQpIHtcbiAgICByZXN0cmVlLnB1c2gocGF0aCk7XG4gIH1cblxuICByZXN0cmVlLnNvcnQoc29ydEJ5UG9zJDEpO1xuXG4gIHJldHVybiB7XG4gICAgdHJlZTogcmVzdHJlZSxcbiAgICBjb25mbGljdHM6IGNvbmZsaWN0cyB8fCAnaW50ZXJuYWxfbm9kZSdcbiAgfTtcbn1cblxuLy8gVG8gZW5zdXJlIHdlIGRvbnQgZ3JvdyB0aGUgcmV2aXNpb24gdHJlZSBpbmZpbml0ZWx5LCB3ZSBzdGVtIG9sZCByZXZpc2lvbnNcbmZ1bmN0aW9uIHN0ZW0odHJlZSwgZGVwdGgpIHtcbiAgLy8gRmlyc3Qgd2UgYnJlYWsgb3V0IHRoZSB0cmVlIGludG8gYSBjb21wbGV0ZSBsaXN0IG9mIHJvb3QgdG8gbGVhZiBwYXRoc1xuICB2YXIgcGF0aHMgPSByb290VG9MZWFmKHRyZWUpO1xuICB2YXIgc3RlbW1lZFJldnM7XG5cbiAgdmFyIHJlc3VsdDtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhdGhzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgLy8gVGhlbiBmb3IgZWFjaCBwYXRoLCB3ZSBjdXQgb2ZmIHRoZSBzdGFydCBvZiB0aGUgcGF0aCBiYXNlZCBvbiB0aGVcbiAgICAvLyBgZGVwdGhgIHRvIHN0ZW0gdG8sIGFuZCBnZW5lcmF0ZSBhIG5ldyBzZXQgb2YgZmxhdCB0cmVlc1xuICAgIHZhciBwYXRoID0gcGF0aHNbaV07XG4gICAgdmFyIHN0ZW1tZWQgPSBwYXRoLmlkcztcbiAgICB2YXIgbm9kZTtcbiAgICBpZiAoc3RlbW1lZC5sZW5ndGggPiBkZXB0aCkge1xuICAgICAgLy8gb25seSBkbyB0aGUgc3RlbW1pbmcgd29yayBpZiB3ZSBhY3R1YWxseSBuZWVkIHRvIHN0ZW1cbiAgICAgIGlmICghc3RlbW1lZFJldnMpIHtcbiAgICAgICAgc3RlbW1lZFJldnMgPSB7fTsgLy8gYXZvaWQgYWxsb2NhdGluZyB0aGlzIG9iamVjdCB1bm5lY2Vzc2FyaWx5XG4gICAgICB9XG4gICAgICB2YXIgbnVtU3RlbW1lZCA9IHN0ZW1tZWQubGVuZ3RoIC0gZGVwdGg7XG4gICAgICBub2RlID0ge1xuICAgICAgICBwb3M6IHBhdGgucG9zICsgbnVtU3RlbW1lZCxcbiAgICAgICAgaWRzOiBwYXRoVG9UcmVlKHN0ZW1tZWQsIG51bVN0ZW1tZWQpXG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBzID0gMDsgcyA8IG51bVN0ZW1tZWQ7IHMrKykge1xuICAgICAgICB2YXIgcmV2ID0gKHBhdGgucG9zICsgcykgKyAnLScgKyBzdGVtbWVkW3NdLmlkO1xuICAgICAgICBzdGVtbWVkUmV2c1tyZXZdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBubyBuZWVkIHRvIGFjdHVhbGx5IHN0ZW1cbiAgICAgIG5vZGUgPSB7XG4gICAgICAgIHBvczogcGF0aC5wb3MsXG4gICAgICAgIGlkczogcGF0aFRvVHJlZShzdGVtbWVkLCAwKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBUaGVuIHdlIHJlbWVyZ2UgYWxsIHRob3NlIGZsYXQgdHJlZXMgdG9nZXRoZXIsIGVuc3VyaW5nIHRoYXQgd2UgZG9udFxuICAgIC8vIGNvbm5lY3QgdHJlZXMgdGhhdCB3b3VsZCBnbyBiZXlvbmQgdGhlIGRlcHRoIGxpbWl0XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmVzdWx0ID0gZG9NZXJnZShyZXN1bHQsIG5vZGUsIHRydWUpLnRyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFtub2RlXTtcbiAgICB9XG4gIH1cblxuICAvLyB0aGlzIGlzIG1lbW9yeS1oZWF2eSBwZXIgQ2hyb21lIHByb2ZpbGVyLCBhdm9pZCB1bmxlc3Mgd2UgYWN0dWFsbHkgc3RlbW1lZFxuICBpZiAoc3RlbW1lZFJldnMpIHtcbiAgICB0cmF2ZXJzZVJldlRyZWUocmVzdWx0LCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsIHJldkhhc2gpIHtcbiAgICAgIC8vIHNvbWUgcmV2aXNpb25zIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBhIGJyYW5jaCBidXQgbm90IGluIGFub3RoZXJcbiAgICAgIGRlbGV0ZSBzdGVtbWVkUmV2c1twb3MgKyAnLScgKyByZXZIYXNoXTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHJlZTogcmVzdWx0LFxuICAgIHJldnM6IHN0ZW1tZWRSZXZzID8gT2JqZWN0LmtleXMoc3RlbW1lZFJldnMpIDogW11cbiAgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2UodHJlZSwgcGF0aCwgZGVwdGgpIHtcbiAgdmFyIG5ld1RyZWUgPSBkb01lcmdlKHRyZWUsIHBhdGgpO1xuICB2YXIgc3RlbW1lZCA9IHN0ZW0obmV3VHJlZS50cmVlLCBkZXB0aCk7XG4gIHJldHVybiB7XG4gICAgdHJlZTogc3RlbW1lZC50cmVlLFxuICAgIHN0ZW1tZWRSZXZzOiBzdGVtbWVkLnJldnMsXG4gICAgY29uZmxpY3RzOiBuZXdUcmVlLmNvbmZsaWN0c1xuICB9O1xufVxuXG4vLyByZXR1cm4gdHJ1ZSBpZiBhIHJldiBleGlzdHMgaW4gdGhlIHJldiB0cmVlLCBmYWxzZSBvdGhlcndpc2VcbmZ1bmN0aW9uIHJldkV4aXN0cyhyZXZzLCByZXYpIHtcbiAgdmFyIHRvVmlzaXQgPSByZXZzLnNsaWNlKCk7XG4gIHZhciBzcGxpdFJldiA9IHJldi5zcGxpdCgnLScpO1xuICB2YXIgdGFyZ2V0UG9zID0gcGFyc2VJbnQoc3BsaXRSZXZbMF0sIDEwKTtcbiAgdmFyIHRhcmdldElkID0gc3BsaXRSZXZbMV07XG5cbiAgdmFyIG5vZGU7XG4gIHdoaWxlICgobm9kZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgaWYgKG5vZGUucG9zID09PSB0YXJnZXRQb3MgJiYgbm9kZS5pZHNbMF0gPT09IHRhcmdldElkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGJyYW5jaGVzID0gbm9kZS5pZHNbMl07XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJyYW5jaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0b1Zpc2l0LnB1c2goe3Bvczogbm9kZS5wb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJlZXMobm9kZSkge1xuICByZXR1cm4gbm9kZS5pZHM7XG59XG5cbi8vIGNoZWNrIGlmIGEgc3BlY2lmaWMgcmV2aXNpb24gb2YgYSBkb2MgaGFzIGJlZW4gZGVsZXRlZFxuLy8gIC0gbWV0YWRhdGE6IHRoZSBtZXRhZGF0YSBvYmplY3QgZnJvbSB0aGUgZG9jIHN0b3JlXG4vLyAgLSByZXY6IChvcHRpb25hbCkgdGhlIHJldmlzaW9uIHRvIGNoZWNrLiBkZWZhdWx0cyB0byB3aW5uaW5nIHJldmlzaW9uXG5mdW5jdGlvbiBpc0RlbGV0ZWQobWV0YWRhdGEsIHJldikge1xuICBpZiAoIXJldikge1xuICAgIHJldiA9IHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuICB9XG4gIHZhciBpZCA9IHJldi5zdWJzdHJpbmcocmV2LmluZGV4T2YoJy0nKSArIDEpO1xuICB2YXIgdG9WaXNpdCA9IG1ldGFkYXRhLnJldl90cmVlLm1hcChnZXRUcmVlcyk7XG5cbiAgdmFyIHRyZWU7XG4gIHdoaWxlICgodHJlZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgaWYgKHRyZWVbMF0gPT09IGlkKSB7XG4gICAgICByZXR1cm4gISF0cmVlWzFdLmRlbGV0ZWQ7XG4gICAgfVxuICAgIHRvVmlzaXQgPSB0b1Zpc2l0LmNvbmNhdCh0cmVlWzJdKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0xvY2FsSWQoaWQpIHtcbiAgcmV0dXJuICgvXl9sb2NhbC8pLnRlc3QoaWQpO1xufVxuXG4vLyByZXR1cm5zIHRoZSBjdXJyZW50IGxlYWYgbm9kZSBmb3IgYSBnaXZlbiByZXZpc2lvblxuZnVuY3Rpb24gbGF0ZXN0KHJldiwgbWV0YWRhdGEpIHtcbiAgdmFyIHRvVmlzaXQgPSBtZXRhZGF0YS5yZXZfdHJlZS5zbGljZSgpO1xuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3M7XG4gICAgdmFyIHRyZWUgPSBub2RlLmlkcztcbiAgICB2YXIgaWQgPSB0cmVlWzBdO1xuICAgIHZhciBvcHRzID0gdHJlZVsxXTtcbiAgICB2YXIgYnJhbmNoZXMgPSB0cmVlWzJdO1xuICAgIHZhciBpc0xlYWYgPSBicmFuY2hlcy5sZW5ndGggPT09IDA7XG5cbiAgICB2YXIgaGlzdG9yeSA9IG5vZGUuaGlzdG9yeSA/IG5vZGUuaGlzdG9yeS5zbGljZSgpIDogW107XG4gICAgaGlzdG9yeS5wdXNoKHtpZDogaWQsIHBvczogcG9zLCBvcHRzOiBvcHRzfSk7XG5cbiAgICBpZiAoaXNMZWFmKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaGlzdG9yeS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgaGlzdG9yeU5vZGUgPSBoaXN0b3J5W2ldO1xuICAgICAgICB2YXIgaGlzdG9yeVJldiA9IGhpc3RvcnlOb2RlLnBvcyArICctJyArIGhpc3RvcnlOb2RlLmlkO1xuXG4gICAgICAgIGlmIChoaXN0b3J5UmV2ID09PSByZXYpIHtcbiAgICAgICAgICAvLyByZXR1cm4gdGhlIHJldiBvZiB0aGlzIGxlYWZcbiAgICAgICAgICByZXR1cm4gcG9zICsgJy0nICsgaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gMCwgbCA9IGJyYW5jaGVzLmxlbmd0aDsgaiA8IGw7IGorKykge1xuICAgICAgdG9WaXNpdC5wdXNoKHtwb3M6IHBvcyArIDEsIGlkczogYnJhbmNoZXNbal0sIGhpc3Rvcnk6IGhpc3Rvcnl9KTtcbiAgICB9XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byByZXNvbHZlIGxhdGVzdCByZXZpc2lvbiBmb3IgaWQgJyArIG1ldGFkYXRhLmlkICsgJywgcmV2ICcgKyByZXYpO1xufVxuXG5pbmhlcml0cyhDaGFuZ2VzJDEsIEVFKTtcblxuZnVuY3Rpb24gdHJ5Q2F0Y2hJbkNoYW5nZUxpc3RlbmVyKHNlbGYsIGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSkge1xuICAvLyBpc29sYXRlIHRyeS9jYXRjaGVzIHRvIGF2b2lkIFY4IGRlb3B0aW1pemF0aW9uc1xuICB0cnkge1xuICAgIHNlbGYuZW1pdCgnY2hhbmdlJywgY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGd1YXJkZWRDb25zb2xlKCdlcnJvcicsICdFcnJvciBpbiAub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24pOicsIGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIENoYW5nZXMkMShkYiwgb3B0cywgY2FsbGJhY2spIHtcbiAgRUUuY2FsbCh0aGlzKTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmRiID0gZGI7XG4gIG9wdHMgPSBvcHRzID8gY2xvbmUob3B0cykgOiB7fTtcbiAgdmFyIGNvbXBsZXRlID0gb3B0cy5jb21wbGV0ZSA9IG9uY2UoZnVuY3Rpb24gKGVyciwgcmVzcCkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGlmIChsaXN0ZW5lckNvdW50KHNlbGYsICdlcnJvcicpID4gMCkge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5lbWl0KCdjb21wbGV0ZScsIHJlc3ApO1xuICAgIH1cbiAgICBzZWxmLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGRiLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB9KTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgc2VsZi5vbignY29tcGxldGUnLCBmdW5jdGlvbiAocmVzcCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcCk7XG4gICAgfSk7XG4gICAgc2VsZi5vbignZXJyb3InLCBjYWxsYmFjayk7XG4gIH1cbiAgZnVuY3Rpb24gb25EZXN0cm95KCkge1xuICAgIHNlbGYuY2FuY2VsKCk7XG4gIH1cbiAgZGIub25jZSgnZGVzdHJveWVkJywgb25EZXN0cm95KTtcblxuICBvcHRzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeUNhdGNoSW5DaGFuZ2VMaXN0ZW5lcihzZWxmLCBjaGFuZ2UsIHBlbmRpbmcsIGxhc3RTZXEpO1xuICB9O1xuXG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgIG9wdHMuY29tcGxldGUgPSBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmdWxmaWxsKHJlcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHNlbGYub25jZSgnY2FuY2VsJywgZnVuY3Rpb24gKCkge1xuICAgIGRiLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICAgIG9wdHMuY29tcGxldGUobnVsbCwge3N0YXR1czogJ2NhbmNlbGxlZCd9KTtcbiAgfSk7XG4gIHRoaXMudGhlbiA9IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpO1xuICB0aGlzWydjYXRjaCddID0gcHJvbWlzZVsnY2F0Y2gnXS5iaW5kKHByb21pc2UpO1xuICB0aGlzLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGNvbXBsZXRlKG51bGwsIHJlc3VsdCk7XG4gIH0sIGNvbXBsZXRlKTtcblxuXG5cbiAgaWYgKCFkYi50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgIGRiLnRhc2txdWV1ZS5hZGRUYXNrKGZ1bmN0aW9uIChmYWlsZWQpIHtcbiAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgb3B0cy5jb21wbGV0ZShmYWlsZWQpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnY2FuY2VsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnZhbGlkYXRlQ2hhbmdlcyhvcHRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZWxmLnZhbGlkYXRlQ2hhbmdlcyhvcHRzKTtcbiAgfVxufVxuQ2hhbmdlcyQxLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICBpZiAodGhpcy5kYi50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgIHRoaXMuZW1pdCgnY2FuY2VsJyk7XG4gIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzQ2hhbmdlKGRvYywgbWV0YWRhdGEsIG9wdHMpIHtcbiAgdmFyIGNoYW5nZUxpc3QgPSBbe3JldjogZG9jLl9yZXZ9XTtcbiAgaWYgKG9wdHMuc3R5bGUgPT09ICdhbGxfZG9jcycpIHtcbiAgICBjaGFuZ2VMaXN0ID0gY29sbGVjdExlYXZlcyhtZXRhZGF0YS5yZXZfdHJlZSlcbiAgICAubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB7cmV2OiB4LnJldn07IH0pO1xuICB9XG4gIHZhciBjaGFuZ2UgPSB7XG4gICAgaWQ6IG1ldGFkYXRhLmlkLFxuICAgIGNoYW5nZXM6IGNoYW5nZUxpc3QsXG4gICAgZG9jOiBkb2NcbiAgfTtcblxuICBpZiAoaXNEZWxldGVkKG1ldGFkYXRhLCBkb2MuX3JldikpIHtcbiAgICBjaGFuZ2UuZGVsZXRlZCA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgY2hhbmdlLmRvYy5fY29uZmxpY3RzID0gY29sbGVjdENvbmZsaWN0cyhtZXRhZGF0YSk7XG4gICAgaWYgKCFjaGFuZ2UuZG9jLl9jb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICBkZWxldGUgY2hhbmdlLmRvYy5fY29uZmxpY3RzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlO1xufVxuXG5DaGFuZ2VzJDEucHJvdG90eXBlLnZhbGlkYXRlQ2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHZhciBjYWxsYmFjayA9IG9wdHMuY29tcGxldGU7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbikge1xuICAgIFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4udmFsaWRhdGUob3B0cywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZG9DaGFuZ2VzKG9wdHMpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNlbGYuZG9DaGFuZ2VzKG9wdHMpO1xuICB9XG59O1xuXG5DaGFuZ2VzJDEucHJvdG90eXBlLmRvQ2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNhbGxiYWNrID0gb3B0cy5jb21wbGV0ZTtcblxuICBvcHRzID0gY2xvbmUob3B0cyk7XG4gIGlmICgnbGl2ZScgaW4gb3B0cyAmJiAhKCdjb250aW51b3VzJyBpbiBvcHRzKSkge1xuICAgIG9wdHMuY29udGludW91cyA9IG9wdHMubGl2ZTtcbiAgfVxuICBvcHRzLnByb2Nlc3NDaGFuZ2UgPSBwcm9jZXNzQ2hhbmdlO1xuXG4gIGlmIChvcHRzLnNpbmNlID09PSAnbGF0ZXN0Jykge1xuICAgIG9wdHMuc2luY2UgPSAnbm93JztcbiAgfVxuICBpZiAoIW9wdHMuc2luY2UpIHtcbiAgICBvcHRzLnNpbmNlID0gMDtcbiAgfVxuICBpZiAob3B0cy5zaW5jZSA9PT0gJ25vdycpIHtcbiAgICB0aGlzLmRiLmluZm8oKS50aGVuKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9wdHMuc2luY2UgPSBpbmZvLnVwZGF0ZV9zZXE7XG4gICAgICBzZWxmLmRvQ2hhbmdlcyhvcHRzKTtcbiAgICB9LCBjYWxsYmFjayk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4pIHtcbiAgICBQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luLm5vcm1hbGl6ZShvcHRzKTtcbiAgICBpZiAoUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbi5zaG91bGRGaWx0ZXIodGhpcywgb3B0cykpIHtcbiAgICAgIHJldHVybiBQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luLmZpbHRlcih0aGlzLCBvcHRzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgWydkb2NfaWRzJywgJ2ZpbHRlcicsICdzZWxlY3RvcicsICd2aWV3J10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoa2V5IGluIG9wdHMpIHtcbiAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ3dhcm4nLFxuICAgICAgICAgICdUaGUgXCInICsga2V5ICsgJ1wiIG9wdGlvbiB3YXMgcGFzc2VkIGluIHRvIGNoYW5nZXMvcmVwbGljYXRlLCAnICtcbiAgICAgICAgICAnYnV0IHBvdWNoZGItY2hhbmdlcy1maWx0ZXIgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQsIHNvIGl0ICcgK1xuICAgICAgICAgICd3YXMgaWdub3JlZC4gUGxlYXNlIGluc3RhbGwgdGhlIHBsdWdpbiB0byBlbmFibGUgZmlsdGVyaW5nLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmICghKCdkZXNjZW5kaW5nJyBpbiBvcHRzKSkge1xuICAgIG9wdHMuZGVzY2VuZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gMCBhbmQgMSBzaG91bGQgcmV0dXJuIDEgZG9jdW1lbnRcbiAgb3B0cy5saW1pdCA9IG9wdHMubGltaXQgPT09IDAgPyAxIDogb3B0cy5saW1pdDtcbiAgb3B0cy5jb21wbGV0ZSA9IGNhbGxiYWNrO1xuICB2YXIgbmV3UHJvbWlzZSA9IHRoaXMuZGIuX2NoYW5nZXMob3B0cyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChuZXdQcm9taXNlICYmIHR5cGVvZiBuZXdQcm9taXNlLmNhbmNlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBjYW5jZWwgPSBzZWxmLmNhbmNlbDtcbiAgICBzZWxmLmNhbmNlbCA9IGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgICAgbmV3UHJvbWlzZS5jYW5jZWwoKTtcbiAgICAgIGNhbmNlbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLypcbiAqIEEgZ2VuZXJpYyBwb3VjaCBhZGFwdGVyXG4gKi9cblxuZnVuY3Rpb24gY29tcGFyZShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbn1cblxuLy8gV3JhcHBlciBmb3IgZnVuY3Rpb25zIHRoYXQgY2FsbCB0aGUgYnVsa2RvY3MgYXBpIHdpdGggYSBzaW5nbGUgZG9jLFxuLy8gaWYgdGhlIGZpcnN0IHJlc3VsdCBpcyBhbiBlcnJvciwgcmV0dXJuIGFuIGVycm9yXG5mdW5jdGlvbiB5YW5rRXJyb3IoY2FsbGJhY2ssIGRvY0lkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7XG4gICAgaWYgKGVyciB8fCAocmVzdWx0c1swXSAmJiByZXN1bHRzWzBdLmVycm9yKSkge1xuICAgICAgZXJyID0gZXJyIHx8IHJlc3VsdHNbMF07XG4gICAgICBlcnIuZG9jSWQgPSBkb2NJZDtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdHMubGVuZ3RoID8gcmVzdWx0c1swXSAgOiByZXN1bHRzKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIGNsZWFuIGRvY3MgZ2l2ZW4gdG8gdXMgYnkgdGhlIHVzZXJcbmZ1bmN0aW9uIGNsZWFuRG9jcyhkb2NzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkb2MgPSBkb2NzW2ldO1xuICAgIGlmIChkb2MuX2RlbGV0ZWQpIHtcbiAgICAgIGRlbGV0ZSBkb2MuX2F0dGFjaG1lbnRzOyAvLyBpZ25vcmUgYXR0cyBmb3IgZGVsZXRlZCBkb2NzXG4gICAgfSBlbHNlIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAvLyBmaWx0ZXIgb3V0IGV4dHJhbmVvdXMga2V5cyBmcm9tIF9hdHRhY2htZW50c1xuICAgICAgdmFyIGF0dHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXR0cy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgYXR0ID0gYXR0c1tqXTtcbiAgICAgICAgZG9jLl9hdHRhY2htZW50c1thdHRdID0gcGljayhkb2MuX2F0dGFjaG1lbnRzW2F0dF0sXG4gICAgICAgICAgWydkYXRhJywgJ2RpZ2VzdCcsICdjb250ZW50X3R5cGUnLCAnbGVuZ3RoJywgJ3JldnBvcycsICdzdHViJ10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBjb21wYXJlIHR3byBkb2NzLCBmaXJzdCBieSBfaWQgdGhlbiBieSBfcmV2XG5mdW5jdGlvbiBjb21wYXJlQnlJZFRoZW5SZXYoYSwgYikge1xuICB2YXIgaWRDb21wYXJlID0gY29tcGFyZShhLl9pZCwgYi5faWQpO1xuICBpZiAoaWRDb21wYXJlICE9PSAwKSB7XG4gICAgcmV0dXJuIGlkQ29tcGFyZTtcbiAgfVxuICB2YXIgYVN0YXJ0ID0gYS5fcmV2aXNpb25zID8gYS5fcmV2aXNpb25zLnN0YXJ0IDogMDtcbiAgdmFyIGJTdGFydCA9IGIuX3JldmlzaW9ucyA/IGIuX3JldmlzaW9ucy5zdGFydCA6IDA7XG4gIHJldHVybiBjb21wYXJlKGFTdGFydCwgYlN0YXJ0KTtcbn1cblxuLy8gZm9yIGV2ZXJ5IG5vZGUgaW4gYSByZXZpc2lvbiB0cmVlIGNvbXB1dGVzIGl0cyBkaXN0YW5jZSBmcm9tIHRoZSBjbG9zZXN0XG4vLyBsZWFmXG5mdW5jdGlvbiBjb21wdXRlSGVpZ2h0KHJldnMpIHtcbiAgdmFyIGhlaWdodCA9IHt9O1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKHJldnMsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgaWQsIHBybnQpIHtcbiAgICB2YXIgcmV2ID0gcG9zICsgXCItXCIgKyBpZDtcbiAgICBpZiAoaXNMZWFmKSB7XG4gICAgICBoZWlnaHRbcmV2XSA9IDA7XG4gICAgfVxuICAgIGlmIChwcm50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVkZ2VzLnB1c2goe2Zyb206IHBybnQsIHRvOiByZXZ9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldjtcbiAgfSk7XG5cbiAgZWRnZXMucmV2ZXJzZSgpO1xuICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgaWYgKGhlaWdodFtlZGdlLmZyb21dID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlaWdodFtlZGdlLmZyb21dID0gMSArIGhlaWdodFtlZGdlLnRvXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVpZ2h0W2VkZ2UuZnJvbV0gPSBNYXRoLm1pbihoZWlnaHRbZWRnZS5mcm9tXSwgMSArIGhlaWdodFtlZGdlLnRvXSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGhlaWdodDtcbn1cblxuZnVuY3Rpb24gYWxsRG9jc0tleXNQYXJzZShvcHRzKSB7XG4gIHZhciBrZXlzID0gICgnbGltaXQnIGluIG9wdHMpID9cbiAgICBvcHRzLmtleXMuc2xpY2Uob3B0cy5za2lwLCBvcHRzLmxpbWl0ICsgb3B0cy5za2lwKSA6XG4gICAgKG9wdHMuc2tpcCA+IDApID8gb3B0cy5rZXlzLnNsaWNlKG9wdHMuc2tpcCkgOiBvcHRzLmtleXM7XG4gIG9wdHMua2V5cyA9IGtleXM7XG4gIG9wdHMuc2tpcCA9IDA7XG4gIGRlbGV0ZSBvcHRzLmxpbWl0O1xuICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAga2V5cy5yZXZlcnNlKCk7XG4gICAgb3B0cy5kZXNjZW5kaW5nID0gZmFsc2U7XG4gIH1cbn1cblxuLy8gYWxsIGNvbXBhY3Rpb24gaXMgZG9uZSBpbiBhIHF1ZXVlLCB0byBhdm9pZCBhdHRhY2hpbmdcbi8vIHRvbyBtYW55IGxpc3RlbmVycyBhdCBvbmNlXG5mdW5jdGlvbiBkb05leHRDb21wYWN0aW9uKHNlbGYpIHtcbiAgdmFyIHRhc2sgPSBzZWxmLl9jb21wYWN0aW9uUXVldWVbMF07XG4gIHZhciBvcHRzID0gdGFzay5vcHRzO1xuICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICBzZWxmLmdldCgnX2xvY2FsL2NvbXBhY3Rpb24nKS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KS50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAoZG9jICYmIGRvYy5sYXN0X3NlcSkge1xuICAgICAgb3B0cy5sYXN0X3NlcSA9IGRvYy5sYXN0X3NlcTtcbiAgICB9XG4gICAgc2VsZi5fY29tcGFjdChvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgIH1cbiAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAoc2VsZi5fY29tcGFjdGlvblF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIGRvTmV4dENvbXBhY3Rpb24oc2VsZik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXR0YWNobWVudE5hbWVFcnJvcihuYW1lKSB7XG4gIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gJ18nKSB7XG4gICAgcmV0dXJuIG5hbWUgKyAnIGlzIG5vdCBhIHZhbGlkIGF0dGFjaG1lbnQgbmFtZSwgYXR0YWNobWVudCAnICtcbiAgICAgICduYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCBcXCdfXFwnJztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmluaGVyaXRzKEFic3RyYWN0UG91Y2hEQiwgRUUpO1xuXG5mdW5jdGlvbiBBYnN0cmFjdFBvdWNoREIoKSB7XG4gIEVFLmNhbGwodGhpcyk7XG5cbiAgLy8gcmUtYmluZCBwcm90b3R5cGVkIG1ldGhvZHNcbiAgZm9yICh2YXIgcCBpbiBBYnN0cmFjdFBvdWNoREIucHJvdG90eXBlKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzW3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW3BdID0gdGhpc1twXS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgfVxufVxuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnBvc3QgPVxuICBhZGFwdGVyRnVuKCdwb3N0JywgZnVuY3Rpb24gKGRvYywgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGRvYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkb2MpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE5PVF9BTl9PQkpFQ1QpKTtcbiAgfVxuICB0aGlzLmJ1bGtEb2NzKHtkb2NzOiBbZG9jXX0sIG9wdHMsIHlhbmtFcnJvcihjYWxsYmFjaywgZG9jLl9pZCkpO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucHV0ID0gYWRhcHRlckZ1bigncHV0JywgZnVuY3Rpb24gKGRvYywgb3B0cywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGRvYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkb2MpKSB7XG4gICAgcmV0dXJuIGNiKGNyZWF0ZUVycm9yKE5PVF9BTl9PQkpFQ1QpKTtcbiAgfVxuICBpbnZhbGlkSWRFcnJvcihkb2MuX2lkKTtcbiAgaWYgKGlzTG9jYWxJZChkb2MuX2lkKSAmJiB0eXBlb2YgdGhpcy5fcHV0TG9jYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZG9jLl9kZWxldGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVtb3ZlTG9jYWwoZG9jLCBjYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wdXRMb2NhbChkb2MsIGNiKTtcbiAgICB9XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAob3B0cy5mb3JjZSAmJiBkb2MuX3Jldikge1xuICAgIHRyYW5zZm9ybUZvcmNlT3B0aW9uVG9OZXdFZGl0c09wdGlvbigpO1xuICAgIHB1dERvYyhmdW5jdGlvbiAoZXJyKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZXJyID8gbnVsbCA6IHtvazogdHJ1ZSwgaWQ6IGRvYy5faWQsIHJldjogZG9jLl9yZXZ9O1xuICAgICAgY2IoZXJyLCByZXN1bHQpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHB1dERvYyhjYik7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1Gb3JjZU9wdGlvblRvTmV3RWRpdHNPcHRpb24oKSB7XG4gICAgdmFyIHBhcnRzID0gZG9jLl9yZXYuc3BsaXQoJy0nKTtcbiAgICB2YXIgb2xkUmV2SWQgPSBwYXJ0c1sxXTtcbiAgICB2YXIgb2xkUmV2TnVtID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcblxuICAgIHZhciBuZXdSZXZOdW0gPSBvbGRSZXZOdW0gKyAxO1xuICAgIHZhciBuZXdSZXZJZCA9IHJldiQkMSgpO1xuXG4gICAgZG9jLl9yZXZpc2lvbnMgPSB7XG4gICAgICBzdGFydDogbmV3UmV2TnVtLFxuICAgICAgaWRzOiBbbmV3UmV2SWQsIG9sZFJldklkXVxuICAgIH07XG4gICAgZG9jLl9yZXYgPSBuZXdSZXZOdW0gKyAnLScgKyBuZXdSZXZJZDtcbiAgICBvcHRzLm5ld19lZGl0cyA9IGZhbHNlO1xuICB9XG4gIGZ1bmN0aW9uIHB1dERvYyhuZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBzZWxmLl9wdXQgPT09ICdmdW5jdGlvbicgJiYgb3B0cy5uZXdfZWRpdHMgIT09IGZhbHNlKSB7XG4gICAgICBzZWxmLl9wdXQoZG9jLCBvcHRzLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5idWxrRG9jcyh7ZG9jczogW2RvY119LCBvcHRzLCB5YW5rRXJyb3IobmV4dCwgZG9jLl9pZCkpO1xuICAgIH1cbiAgfVxufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucHV0QXR0YWNobWVudCA9XG4gIGFkYXB0ZXJGdW4oJ3B1dEF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCwgcmV2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2IsIHR5cGUpIHtcbiAgdmFyIGFwaSA9IHRoaXM7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHR5cGUgPSBibG9iO1xuICAgIGJsb2IgPSByZXY7XG4gICAgcmV2ID0gbnVsbDtcbiAgfVxuICAvLyBMZXRzIGZpeCBpbiBodHRwczovL2dpdGh1Yi5jb20vcG91Y2hkYi9wb3VjaGRiL2lzc3Vlcy8zMjY3XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHlwZSA9IGJsb2I7XG4gICAgYmxvYiA9IHJldjtcbiAgICByZXYgPSBudWxsO1xuICB9XG4gIGlmICghdHlwZSkge1xuICAgIGd1YXJkZWRDb25zb2xlKCd3YXJuJywgJ0F0dGFjaG1lbnQnLCBhdHRhY2htZW50SWQsICdvbiBkb2N1bWVudCcsIGRvY0lkLCAnaXMgbWlzc2luZyBjb250ZW50X3R5cGUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUF0dGFjaG1lbnQoZG9jKSB7XG4gICAgdmFyIHByZXZyZXZwb3MgPSAnX3JldicgaW4gZG9jID8gcGFyc2VJbnQoZG9jLl9yZXYsIDEwKSA6IDA7XG4gICAgZG9jLl9hdHRhY2htZW50cyA9IGRvYy5fYXR0YWNobWVudHMgfHwge307XG4gICAgZG9jLl9hdHRhY2htZW50c1thdHRhY2htZW50SWRdID0ge1xuICAgICAgY29udGVudF90eXBlOiB0eXBlLFxuICAgICAgZGF0YTogYmxvYixcbiAgICAgIHJldnBvczogKytwcmV2cmV2cG9zXG4gICAgfTtcbiAgICByZXR1cm4gYXBpLnB1dChkb2MpO1xuICB9XG5cbiAgcmV0dXJuIGFwaS5nZXQoZG9jSWQpLnRoZW4oZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChkb2MuX3JldiAhPT0gcmV2KSB7XG4gICAgICB0aHJvdyBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVBdHRhY2htZW50KGRvYyk7XG4gIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgLy8gY3JlYXRlIG5ldyBkb2NcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChlcnIucmVhc29uID09PSBNSVNTSU5HX0RPQy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQXR0YWNobWVudCh7X2lkOiBkb2NJZH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnJlbW92ZUF0dGFjaG1lbnQgPVxuICBhZGFwdGVyRnVuKCdyZW1vdmVBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsIHJldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZ2V0KGRvY0lkLCBmdW5jdGlvbiAoZXJyLCBvYmopIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob2JqLl9yZXYgIT09IHJldikge1xuICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoUkVWX0NPTkZMSUNUKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghb2JqLl9hdHRhY2htZW50cykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGRlbGV0ZSBvYmouX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnRJZF07XG4gICAgaWYgKE9iamVjdC5rZXlzKG9iai5fYXR0YWNobWVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIG9iai5fYXR0YWNobWVudHM7XG4gICAgfVxuICAgIHNlbGYucHV0KG9iaiwgY2FsbGJhY2spO1xuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnJlbW92ZSA9XG4gIGFkYXB0ZXJGdW4oJ3JlbW92ZScsIGZ1bmN0aW9uIChkb2NPcklkLCBvcHRzT3JSZXYsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBkb2M7XG4gIGlmICh0eXBlb2Ygb3B0c09yUmV2ID09PSAnc3RyaW5nJykge1xuICAgIC8vIGlkLCByZXYsIG9wdHMsIGNhbGxiYWNrIHN0eWxlXG4gICAgZG9jID0ge1xuICAgICAgX2lkOiBkb2NPcklkLFxuICAgICAgX3Jldjogb3B0c09yUmV2XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gZG9jLCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgIGRvYyA9IGRvY09ySWQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzT3JSZXYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0c09yUmV2O1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0gb3B0c09yUmV2O1xuICAgIH1cbiAgfVxuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgb3B0cy53YXNfZGVsZXRlID0gdHJ1ZTtcbiAgdmFyIG5ld0RvYyA9IHtfaWQ6IGRvYy5faWQsIF9yZXY6IChkb2MuX3JldiB8fCBvcHRzLnJldil9O1xuICBuZXdEb2MuX2RlbGV0ZWQgPSB0cnVlO1xuICBpZiAoaXNMb2NhbElkKG5ld0RvYy5faWQpICYmIHR5cGVvZiB0aGlzLl9yZW1vdmVMb2NhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0aGlzLl9yZW1vdmVMb2NhbChkb2MsIGNhbGxiYWNrKTtcbiAgfVxuICB0aGlzLmJ1bGtEb2NzKHtkb2NzOiBbbmV3RG9jXX0sIG9wdHMsIHlhbmtFcnJvcihjYWxsYmFjaywgbmV3RG9jLl9pZCkpO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucmV2c0RpZmYgPVxuICBhZGFwdGVyRnVuKCdyZXZzRGlmZicsIGZ1bmN0aW9uIChyZXEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKHJlcSk7XG5cbiAgaWYgKCFpZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHt9KTtcbiAgfVxuXG4gIHZhciBjb3VudCA9IDA7XG4gIHZhciBtaXNzaW5nID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbiAgZnVuY3Rpb24gYWRkVG9NaXNzaW5nKGlkLCByZXZJZCkge1xuICAgIGlmICghbWlzc2luZy5oYXMoaWQpKSB7XG4gICAgICBtaXNzaW5nLnNldChpZCwge21pc3Npbmc6IFtdfSk7XG4gICAgfVxuICAgIG1pc3NpbmcuZ2V0KGlkKS5taXNzaW5nLnB1c2gocmV2SWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0RvYyhpZCwgcmV2X3RyZWUpIHtcbiAgICAvLyBJcyB0aGlzIGZhc3QgZW5vdWdoPyBNYXliZSB3ZSBzaG91bGQgc3dpdGNoIHRvIGEgc2V0IHNpbXVsYXRlZCBieSBhIG1hcFxuICAgIHZhciBtaXNzaW5nRm9ySWQgPSByZXFbaWRdLnNsaWNlKDApO1xuICAgIHRyYXZlcnNlUmV2VHJlZShyZXZfdHJlZSwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCByZXZIYXNoLCBjdHgsXG4gICAgICBvcHRzKSB7XG4gICAgICAgIHZhciByZXYgPSBwb3MgKyAnLScgKyByZXZIYXNoO1xuICAgICAgICB2YXIgaWR4ID0gbWlzc2luZ0ZvcklkLmluZGV4T2YocmV2KTtcbiAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtaXNzaW5nRm9ySWQuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAob3B0cy5zdGF0dXMgIT09ICdhdmFpbGFibGUnKSB7XG4gICAgICAgICAgYWRkVG9NaXNzaW5nKGlkLCByZXYpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIFRyYXZlcnNpbmcgdGhlIHRyZWUgaXMgc3luY2hyb25vdXMsIHNvIG5vdyBgbWlzc2luZ0ZvcklkYCBjb250YWluc1xuICAgIC8vIHJldmlzaW9ucyB0aGF0IHdlcmUgbm90IGZvdW5kIGluIHRoZSB0cmVlXG4gICAgbWlzc2luZ0ZvcklkLmZvckVhY2goZnVuY3Rpb24gKHJldikge1xuICAgICAgYWRkVG9NaXNzaW5nKGlkLCByZXYpO1xuICAgIH0pO1xuICB9XG5cbiAgaWRzLm1hcChmdW5jdGlvbiAoaWQpIHtcbiAgICB0aGlzLl9nZXRSZXZpc2lvblRyZWUoaWQsIGZ1bmN0aW9uIChlcnIsIHJldl90cmVlKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgPT09IDQwNCAmJiBlcnIubWVzc2FnZSA9PT0gJ21pc3NpbmcnKSB7XG4gICAgICAgIG1pc3Npbmcuc2V0KGlkLCB7bWlzc2luZzogcmVxW2lkXX0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzRG9jKGlkLCByZXZfdHJlZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICgrK2NvdW50ID09PSBpZHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgTGF6eU1hcCB0byBvYmplY3RcbiAgICAgICAgdmFyIG1pc3NpbmdPYmogPSB7fTtcbiAgICAgICAgbWlzc2luZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgbWlzc2luZ09ialtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbWlzc2luZ09iaik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIHRoaXMpO1xufSk7XG5cbi8vIF9idWxrX2dldCBBUEkgZm9yIGZhc3RlciByZXBsaWNhdGlvbiwgYXMgZGVzY3JpYmVkIGluXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvdWNoZGItY2h0dHBkL3B1bGwvMzNcbi8vIEF0IHRoZSBcImFic3RyYWN0XCIgbGV2ZWwsIGl0IHdpbGwganVzdCBydW4gbXVsdGlwbGUgZ2V0KClzIGluXG4vLyBwYXJhbGxlbCwgYmVjYXVzZSB0aGlzIGlzbid0IG11Y2ggb2YgYSBwZXJmb3JtYW5jZSBjb3N0XG4vLyBmb3IgbG9jYWwgZGF0YWJhc2VzIChleGNlcHQgdGhlIGNvc3Qgb2YgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLCB3aGljaCBpc1xuLy8gc21hbGwpLiBUaGUgaHR0cCBhZGFwdGVyIG92ZXJyaWRlcyB0aGlzIGluIG9yZGVyXG4vLyB0byBkbyBhIG1vcmUgZWZmaWNpZW50IHNpbmdsZSBIVFRQIHJlcXVlc3QuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmJ1bGtHZXQgPVxuICBhZGFwdGVyRnVuKCdidWxrR2V0JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGJ1bGtHZXQodGhpcywgb3B0cywgY2FsbGJhY2spO1xufSk7XG5cbi8vIGNvbXBhY3Qgb25lIGRvY3VtZW50IGFuZCBmaXJlIGNhbGxiYWNrXG4vLyBieSBjb21wYWN0aW5nIHdlIG1lYW4gcmVtb3ZpbmcgYWxsIHJldmlzaW9ucyB3aGljaFxuLy8gYXJlIGZ1cnRoZXIgZnJvbSB0aGUgbGVhZiBpbiByZXZpc2lvbiB0cmVlIHRoYW4gbWF4X2hlaWdodFxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jb21wYWN0RG9jdW1lbnQgPVxuICBhZGFwdGVyRnVuKCdjb21wYWN0RG9jdW1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIG1heEhlaWdodCwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9nZXRSZXZpc2lvblRyZWUoZG9jSWQsIGZ1bmN0aW9uIChlcnIsIHJldlRyZWUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgdmFyIGhlaWdodCA9IGNvbXB1dGVIZWlnaHQocmV2VHJlZSk7XG4gICAgdmFyIGNhbmRpZGF0ZXMgPSBbXTtcbiAgICB2YXIgcmV2cyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKGhlaWdodCkuZm9yRWFjaChmdW5jdGlvbiAocmV2KSB7XG4gICAgICBpZiAoaGVpZ2h0W3Jldl0gPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHJldik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cmF2ZXJzZVJldlRyZWUocmV2VHJlZSwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCByZXZIYXNoLCBjdHgsIG9wdHMpIHtcbiAgICAgIHZhciByZXYgPSBwb3MgKyAnLScgKyByZXZIYXNoO1xuICAgICAgaWYgKG9wdHMuc3RhdHVzID09PSAnYXZhaWxhYmxlJyAmJiBjYW5kaWRhdGVzLmluZGV4T2YocmV2KSAhPT0gLTEpIHtcbiAgICAgICAgcmV2cy5wdXNoKHJldik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2VsZi5fZG9Db21wYWN0aW9uKGRvY0lkLCByZXZzLCBjYWxsYmFjayk7XG4gIH0pO1xufSk7XG5cbi8vIGNvbXBhY3QgdGhlIHdob2xlIGRhdGFiYXNlIHVzaW5nIHNpbmdsZSBkb2N1bWVudFxuLy8gY29tcGFjdGlvblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jb21wYWN0ID1cbiAgYWRhcHRlckZ1bignY29tcGFjdCcsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICBzZWxmLl9jb21wYWN0aW9uUXVldWUgPSBzZWxmLl9jb21wYWN0aW9uUXVldWUgfHwgW107XG4gIHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5wdXNoKHtvcHRzOiBvcHRzLCBjYWxsYmFjazogY2FsbGJhY2t9KTtcbiAgaWYgKHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICBkb05leHRDb21wYWN0aW9uKHNlbGYpO1xuICB9XG59KTtcbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuX2NvbXBhY3QgPSBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2hhbmdlc09wdHMgPSB7XG4gICAgcmV0dXJuX2RvY3M6IGZhbHNlLFxuICAgIGxhc3Rfc2VxOiBvcHRzLmxhc3Rfc2VxIHx8IDBcbiAgfTtcbiAgdmFyIHByb21pc2VzID0gW107XG5cbiAgZnVuY3Rpb24gb25DaGFuZ2Uocm93KSB7XG4gICAgcHJvbWlzZXMucHVzaChzZWxmLmNvbXBhY3REb2N1bWVudChyb3cuaWQsIDApKTtcbiAgfVxuICBmdW5jdGlvbiBvbkNvbXBsZXRlKHJlc3ApIHtcbiAgICB2YXIgbGFzdFNlcSA9IHJlc3AubGFzdF9zZXE7XG4gICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHVwc2VydChzZWxmLCAnX2xvY2FsL2NvbXBhY3Rpb24nLCBmdW5jdGlvbiBkZWx0YUZ1bmMoZG9jKSB7XG4gICAgICAgIGlmICghZG9jLmxhc3Rfc2VxIHx8IGRvYy5sYXN0X3NlcSA8IGxhc3RTZXEpIHtcbiAgICAgICAgICBkb2MubGFzdF9zZXEgPSBsYXN0U2VxO1xuICAgICAgICAgIHJldHVybiBkb2M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzb21lYm9keSBlbHNlIGdvdCBoZXJlIGZpcnN0LCBkb24ndCB1cGRhdGVcbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwge29rOiB0cnVlfSk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9XG4gIHNlbGYuY2hhbmdlcyhjaGFuZ2VzT3B0cylcbiAgICAub24oJ2NoYW5nZScsIG9uQ2hhbmdlKVxuICAgIC5vbignY29tcGxldGUnLCBvbkNvbXBsZXRlKVxuICAgIC5vbignZXJyb3InLCBjYWxsYmFjayk7XG59O1xuXG4vKiBCZWdpbiBhcGkgd3JhcHBlcnMuIFNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gc3RvcmFnZSBiZWxvbmdzIGluIHRoZVxuICAgX1ttZXRob2RdICovXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmdldCA9IGFkYXB0ZXJGdW4oJ2dldCcsIGZ1bmN0aW9uIChpZCwgb3B0cywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBjYihjcmVhdGVFcnJvcihJTlZBTElEX0lEKSk7XG4gIH1cbiAgaWYgKGlzTG9jYWxJZChpZCkgJiYgdHlwZW9mIHRoaXMuX2dldExvY2FsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldExvY2FsKGlkLCBjYik7XG4gIH1cbiAgdmFyIGxlYXZlcyA9IFtdLCBzZWxmID0gdGhpcztcblxuICBmdW5jdGlvbiBmaW5pc2hPcGVuUmV2cygpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGNvdW50ID0gbGVhdmVzLmxlbmd0aDtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNvdW50KSB7XG4gICAgICByZXR1cm4gY2IobnVsbCwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvLyBvcmRlciB3aXRoIG9wZW5fcmV2cyBpcyB1bnNwZWNpZmllZFxuICAgIGxlYXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChsZWFmKSB7XG4gICAgICBzZWxmLmdldChpZCwge1xuICAgICAgICByZXY6IGxlYWYsXG4gICAgICAgIHJldnM6IG9wdHMucmV2cyxcbiAgICAgICAgbGF0ZXN0OiBvcHRzLmxhdGVzdCxcbiAgICAgICAgYXR0YWNobWVudHM6IG9wdHMuYXR0YWNobWVudHMsXG4gICAgICAgIGJpbmFyeTogb3B0cy5iaW5hcnlcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRvYykge1xuICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgIC8vIHVzaW5nIGxhdGVzdD10cnVlIGNhbiBwcm9kdWNlIGR1cGxpY2F0ZXNcbiAgICAgICAgICB2YXIgZXhpc3Rpbmc7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXN1bHQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0W2ldLm9rICYmIHJlc3VsdFtpXS5vay5fcmV2ID09PSBkb2MuX3Jldikge1xuICAgICAgICAgICAgICBleGlzdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh7b2s6IGRvY30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh7bWlzc2luZzogbGVhZn0pO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIGlmICghY291bnQpIHtcbiAgICAgICAgICBjYihudWxsLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChvcHRzLm9wZW5fcmV2cykge1xuICAgIGlmIChvcHRzLm9wZW5fcmV2cyA9PT0gXCJhbGxcIikge1xuICAgICAgdGhpcy5fZ2V0UmV2aXNpb25UcmVlKGlkLCBmdW5jdGlvbiAoZXJyLCByZXZfdHJlZSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGxlYXZlcyA9IGNvbGxlY3RMZWF2ZXMocmV2X3RyZWUpLm1hcChmdW5jdGlvbiAobGVhZikge1xuICAgICAgICAgIHJldHVybiBsZWFmLnJldjtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbmlzaE9wZW5SZXZzKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cy5vcGVuX3JldnMpKSB7XG4gICAgICAgIGxlYXZlcyA9IG9wdHMub3Blbl9yZXZzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlYXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBsID0gbGVhdmVzW2ldO1xuICAgICAgICAgIC8vIGxvb2tzIGxpa2UgaXQncyB0aGUgb25seSB0aGluZyBjb3VjaGRiIGNoZWNrc1xuICAgICAgICAgIGlmICghKHR5cGVvZiAobCkgPT09IFwic3RyaW5nXCIgJiYgL15cXGQrLS8udGVzdChsKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihjcmVhdGVFcnJvcihJTlZBTElEX1JFVikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5pc2hPcGVuUmV2cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNiKGNyZWF0ZUVycm9yKFVOS05PV05fRVJST1IsICdmdW5jdGlvbl9jbGF1c2UnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjsgLy8gb3Blbl9yZXZzIGRvZXMgbm90IGxpa2Ugb3RoZXIgb3B0aW9uc1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2dldChpZCwgb3B0cywgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgaWYgKGVycikge1xuICAgICAgZXJyLmRvY0lkID0gaWQ7XG4gICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICB9XG5cbiAgICB2YXIgZG9jID0gcmVzdWx0LmRvYztcbiAgICB2YXIgbWV0YWRhdGEgPSByZXN1bHQubWV0YWRhdGE7XG4gICAgdmFyIGN0eCA9IHJlc3VsdC5jdHg7XG5cbiAgICBpZiAob3B0cy5jb25mbGljdHMpIHtcbiAgICAgIHZhciBjb25mbGljdHMgPSBjb2xsZWN0Q29uZmxpY3RzKG1ldGFkYXRhKTtcbiAgICAgIGlmIChjb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICAgIGRvYy5fY29uZmxpY3RzID0gY29uZmxpY3RzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0RlbGV0ZWQobWV0YWRhdGEsIGRvYy5fcmV2KSkge1xuICAgICAgZG9jLl9kZWxldGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yZXZzIHx8IG9wdHMucmV2c19pbmZvKSB7XG4gICAgICB2YXIgc3BsaXR0ZWRSZXYgPSBkb2MuX3Jldi5zcGxpdCgnLScpO1xuICAgICAgdmFyIHJldk5vICAgICAgID0gcGFyc2VJbnQoc3BsaXR0ZWRSZXZbMF0sIDEwKTtcbiAgICAgIHZhciByZXZIYXNoICAgICA9IHNwbGl0dGVkUmV2WzFdO1xuXG4gICAgICB2YXIgcGF0aHMgPSByb290VG9MZWFmKG1ldGFkYXRhLnJldl90cmVlKTtcbiAgICAgIHZhciBwYXRoID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudFBhdGggPSBwYXRoc1tpXTtcbiAgICAgICAgdmFyIGhhc2hJbmRleCA9IGN1cnJlbnRQYXRoLmlkcy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguaWQ7IH0pXG4gICAgICAgICAgLmluZGV4T2YocmV2SGFzaCk7XG4gICAgICAgIHZhciBoYXNoRm91bmRBdFJldlBvcyA9IGhhc2hJbmRleCA9PT0gKHJldk5vIC0gMSk7XG5cbiAgICAgICAgaWYgKGhhc2hGb3VuZEF0UmV2UG9zIHx8ICghcGF0aCAmJiBoYXNoSW5kZXggIT09IC0xKSkge1xuICAgICAgICAgIHBhdGggPSBjdXJyZW50UGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICBlcnIgPSBuZXcgRXJyb3IoJ2ludmFsaWQgcmV2IHRyZWUnKTtcbiAgICAgICAgZXJyLmRvY0lkID0gaWQ7XG4gICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXhPZlJldiA9IHBhdGguaWRzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5pZDsgfSlcbiAgICAgICAgLmluZGV4T2YoZG9jLl9yZXYuc3BsaXQoJy0nKVsxXSkgKyAxO1xuICAgICAgdmFyIGhvd01hbnkgPSBwYXRoLmlkcy5sZW5ndGggLSBpbmRleE9mUmV2O1xuICAgICAgcGF0aC5pZHMuc3BsaWNlKGluZGV4T2ZSZXYsIGhvd01hbnkpO1xuICAgICAgcGF0aC5pZHMucmV2ZXJzZSgpO1xuXG4gICAgICBpZiAob3B0cy5yZXZzKSB7XG4gICAgICAgIGRvYy5fcmV2aXNpb25zID0ge1xuICAgICAgICAgIHN0YXJ0OiAocGF0aC5wb3MgKyBwYXRoLmlkcy5sZW5ndGgpIC0gMSxcbiAgICAgICAgICBpZHM6IHBhdGguaWRzLm1hcChmdW5jdGlvbiAocmV2KSB7XG4gICAgICAgICAgICByZXR1cm4gcmV2LmlkO1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5yZXZzX2luZm8pIHtcbiAgICAgICAgdmFyIHBvcyA9ICBwYXRoLnBvcyArIHBhdGguaWRzLmxlbmd0aDtcbiAgICAgICAgZG9jLl9yZXZzX2luZm8gPSBwYXRoLmlkcy5tYXAoZnVuY3Rpb24gKHJldikge1xuICAgICAgICAgIHBvcy0tO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXY6IHBvcyArICctJyArIHJldi5pZCxcbiAgICAgICAgICAgIHN0YXR1czogcmV2Lm9wdHMuc3RhdHVzXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMgJiYgZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgdmFyIGF0dGFjaG1lbnRzID0gZG9jLl9hdHRhY2htZW50cztcbiAgICAgIHZhciBjb3VudCA9IE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGg7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIGRvYyk7XG4gICAgICB9XG4gICAgICBPYmplY3Qua2V5cyhhdHRhY2htZW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHRoaXMuX2dldEF0dGFjaG1lbnQoZG9jLl9pZCwga2V5LCBhdHRhY2htZW50c1trZXldLCB7XG4gICAgICAgICAgLy8gUHJldmlvdXNseSB0aGUgcmV2aXNpb24gaGFuZGxpbmcgd2FzIGRvbmUgaW4gYWRhcHRlci5qc1xuICAgICAgICAgIC8vIGdldEF0dGFjaG1lbnQsIGhvd2V2ZXIgc2luY2UgaWRiLW5leHQgZG9lc250IHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBwYXNzIHRoZSByZXYgdGhyb3VnaFxuICAgICAgICAgIHJldjogZG9jLl9yZXYsXG4gICAgICAgICAgYmluYXJ5OiBvcHRzLmJpbmFyeSxcbiAgICAgICAgICBjdHg6IGN0eFxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgdmFyIGF0dCA9IGRvYy5fYXR0YWNobWVudHNba2V5XTtcbiAgICAgICAgICBhdHQuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgZGVsZXRlIGF0dC5zdHViO1xuICAgICAgICAgIGRlbGV0ZSBhdHQubGVuZ3RoO1xuICAgICAgICAgIGlmICghLS1jb3VudCkge1xuICAgICAgICAgICAgY2IobnVsbCwgZG9jKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgc2VsZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvYy5fYXR0YWNobWVudHMsIGtleSkpIHtcbiAgICAgICAgICAgIGRvYy5fYXR0YWNobWVudHNba2V5XS5zdHViID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNiKG51bGwsIGRvYyk7XG4gICAgfVxuICB9KTtcbn0pO1xuXG4vLyBUT0RPOiBJIGRvbnQgbGlrZSB0aGlzLCBpdCBmb3JjZXMgYW4gZXh0cmEgcmVhZCBmb3IgZXZlcnlcbi8vIGF0dGFjaG1lbnQgcmVhZCBhbmQgZW5mb3JjZXMgYSBjb25mdXNpbmcgYXBpIGJldHdlZW5cbi8vIGFkYXB0ZXIuanMgYW5kIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmdldEF0dGFjaG1lbnQgPVxuICBhZGFwdGVyRnVuKCdnZXRBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKG9wdHMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgdGhpcy5fZ2V0KGRvY0lkLCBvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgaWYgKHJlcy5kb2MuX2F0dGFjaG1lbnRzICYmIHJlcy5kb2MuX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnRJZF0pIHtcbiAgICAgIG9wdHMuY3R4ID0gcmVzLmN0eDtcbiAgICAgIG9wdHMuYmluYXJ5ID0gdHJ1ZTtcbiAgICAgIHNlbGYuX2dldEF0dGFjaG1lbnQoZG9jSWQsIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmRvYy5fYXR0YWNobWVudHNbYXR0YWNobWVudElkXSwgb3B0cywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuYWxsRG9jcyA9XG4gIGFkYXB0ZXJGdW4oJ2FsbERvY3MnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBvcHRzLnNraXAgPSB0eXBlb2Ygb3B0cy5za2lwICE9PSAndW5kZWZpbmVkJyA/IG9wdHMuc2tpcCA6IDA7XG4gIGlmIChvcHRzLnN0YXJ0X2tleSkge1xuICAgIG9wdHMuc3RhcnRrZXkgPSBvcHRzLnN0YXJ0X2tleTtcbiAgfVxuICBpZiAob3B0cy5lbmRfa2V5KSB7XG4gICAgb3B0cy5lbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gIH1cbiAgaWYgKCdrZXlzJyBpbiBvcHRzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdHMua2V5cykpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgVHlwZUVycm9yKCdvcHRpb25zLmtleXMgbXVzdCBiZSBhbiBhcnJheScpKTtcbiAgICB9XG4gICAgdmFyIGluY29tcGF0aWJsZU9wdCA9XG4gICAgICBbJ3N0YXJ0a2V5JywgJ2VuZGtleScsICdrZXknXS5maWx0ZXIoZnVuY3Rpb24gKGluY29tcGF0aWJsZU9wdCkge1xuICAgICAgcmV0dXJuIGluY29tcGF0aWJsZU9wdCBpbiBvcHRzO1xuICAgIH0pWzBdO1xuICAgIGlmIChpbmNvbXBhdGlibGVPcHQpIHtcbiAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKFFVRVJZX1BBUlNFX0VSUk9SLFxuICAgICAgICAnUXVlcnkgcGFyYW1ldGVyIGAnICsgaW5jb21wYXRpYmxlT3B0ICtcbiAgICAgICAgJ2AgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBtdWx0aS1nZXQnXG4gICAgICApKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc1JlbW90ZSh0aGlzKSkge1xuICAgICAgYWxsRG9jc0tleXNQYXJzZShvcHRzKTtcbiAgICAgIGlmIChvcHRzLmtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxEb2NzKHtsaW1pdDogMH0sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5fYWxsRG9jcyhvcHRzLCBjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jaGFuZ2VzID0gZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAvLyBCeSBkZWZhdWx0IHNldCByZXR1cm5fZG9jcyB0byBmYWxzZSBpZiB0aGUgY2FsbGVyIGhhcyBvcHRzLmxpdmUgPSB0cnVlLFxuICAvLyB0aGlzIHdpbGwgcHJldmVudCB1cyBmcm9tIGNvbGxlY3RpbmcgdGhlIHNldCBvZiBjaGFuZ2VzIGluZGVmaW5pdGVseVxuICAvLyByZXN1bHRpbmcgaW4gZ3Jvd2luZyBtZW1vcnlcbiAgb3B0cy5yZXR1cm5fZG9jcyA9ICgncmV0dXJuX2RvY3MnIGluIG9wdHMpID8gb3B0cy5yZXR1cm5fZG9jcyA6ICFvcHRzLmxpdmU7XG5cbiAgcmV0dXJuIG5ldyBDaGFuZ2VzJDEodGhpcywgb3B0cywgY2FsbGJhY2spO1xufTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jbG9zZSA9IGFkYXB0ZXJGdW4oJ2Nsb3NlJywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG4gIHRoaXMuZW1pdCgnY2xvc2VkJyk7XG4gIHJldHVybiB0aGlzLl9jbG9zZShjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5pbmZvID0gYWRhcHRlckZ1bignaW5mbycsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX2luZm8oZnVuY3Rpb24gKGVyciwgaW5mbykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICAvLyBhc3N1bWUgd2Uga25vdyBiZXR0ZXIgdGhhbiB0aGUgYWRhcHRlciwgdW5sZXNzIGl0IGluZm9ybXMgdXNcbiAgICBpbmZvLmRiX25hbWUgPSBpbmZvLmRiX25hbWUgfHwgc2VsZi5uYW1lO1xuICAgIGluZm8uYXV0b19jb21wYWN0aW9uID0gISEoc2VsZi5hdXRvX2NvbXBhY3Rpb24gJiYgIWlzUmVtb3RlKHNlbGYpKTtcbiAgICBpbmZvLmFkYXB0ZXIgPSBzZWxmLmFkYXB0ZXI7XG4gICAgY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuaWQgPSBhZGFwdGVyRnVuKCdpZCcsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5faWQoY2FsbGJhY2spO1xufSk7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAodHlwZW9mIHRoaXMuX3R5cGUgPT09ICdmdW5jdGlvbicpID8gdGhpcy5fdHlwZSgpIDogdGhpcy5hZGFwdGVyO1xufTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5idWxrRG9jcyA9XG4gIGFkYXB0ZXJGdW4oJ2J1bGtEb2NzJywgZnVuY3Rpb24gKHJlcSwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHJlcSkpIHtcbiAgICByZXEgPSB7XG4gICAgICBkb2NzOiByZXFcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFyZXEgfHwgIXJlcS5kb2NzIHx8ICFBcnJheS5pc0FycmF5KHJlcS5kb2NzKSkge1xuICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihNSVNTSU5HX0JVTEtfRE9DUykpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXEuZG9jcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0eXBlb2YgcmVxLmRvY3NbaV0gIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmVxLmRvY3NbaV0pKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTk9UX0FOX09CSkVDVCkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhdHRhY2htZW50RXJyb3I7XG4gIHJlcS5kb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGF0dGFjaG1lbnRFcnJvciA9IGF0dGFjaG1lbnRFcnJvciB8fCBhdHRhY2htZW50TmFtZUVycm9yKG5hbWUpO1xuICAgICAgICBpZiAoIWRvYy5fYXR0YWNobWVudHNbbmFtZV0uY29udGVudF90eXBlKSB7XG4gICAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ3dhcm4nLCAnQXR0YWNobWVudCcsIG5hbWUsICdvbiBkb2N1bWVudCcsIGRvYy5faWQsICdpcyBtaXNzaW5nIGNvbnRlbnRfdHlwZScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChhdHRhY2htZW50RXJyb3IpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoQkFEX1JFUVVFU1QsIGF0dGFjaG1lbnRFcnJvcikpO1xuICB9XG5cbiAgaWYgKCEoJ25ld19lZGl0cycgaW4gb3B0cykpIHtcbiAgICBpZiAoJ25ld19lZGl0cycgaW4gcmVxKSB7XG4gICAgICBvcHRzLm5ld19lZGl0cyA9IHJlcS5uZXdfZWRpdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMubmV3X2VkaXRzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgYWRhcHRlciA9IHRoaXM7XG4gIGlmICghb3B0cy5uZXdfZWRpdHMgJiYgIWlzUmVtb3RlKGFkYXB0ZXIpKSB7XG4gICAgLy8gZW5zdXJlIHJldmlzaW9ucyBvZiB0aGUgc2FtZSBkb2MgYXJlIHNvcnRlZCwgc28gdGhhdFxuICAgIC8vIHRoZSBsb2NhbCBhZGFwdGVyIHByb2Nlc3NlcyB0aGVtIGNvcnJlY3RseSAoIzI5MzUpXG4gICAgcmVxLmRvY3Muc29ydChjb21wYXJlQnlJZFRoZW5SZXYpO1xuICB9XG5cbiAgY2xlYW5Eb2NzKHJlcS5kb2NzKTtcblxuICAvLyBpbiB0aGUgY2FzZSBvZiBjb25mbGljdHMsIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBfaWRzIHRvIHRoZSB1c2VyXG4gIC8vIGhvd2V2ZXIsIHRoZSB1bmRlcmx5aW5nIGFkYXB0ZXIgbWF5IGRlc3Ryb3kgdGhlIGRvY3MgYXJyYXksIHNvXG4gIC8vIGNyZWF0ZSBhIGNvcHkgaGVyZVxuICB2YXIgaWRzID0gcmVxLmRvY3MubWFwKGZ1bmN0aW9uIChkb2MpIHtcbiAgICByZXR1cm4gZG9jLl9pZDtcbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXMuX2J1bGtEb2NzKHJlcSwgb3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIGlmICghb3B0cy5uZXdfZWRpdHMpIHtcbiAgICAgIC8vIHRoaXMgaXMgd2hhdCBjb3VjaCBkb2VzIHdoZW4gbmV3X2VkaXRzIGlzIGZhbHNlXG4gICAgICByZXMgPSByZXMuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4LmVycm9yO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGFkZCBpZHMgZm9yIGVycm9yL2NvbmZsaWN0IHJlc3BvbnNlcyAobm90IHJlcXVpcmVkIGZvciBDb3VjaERCKVxuICAgIGlmICghaXNSZW1vdGUoYWRhcHRlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZXNbaV0uaWQgPSByZXNbaV0uaWQgfHwgaWRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHJlcyk7XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucmVnaXN0ZXJEZXBlbmRlbnREYXRhYmFzZSA9XG4gIGFkYXB0ZXJGdW4oJ3JlZ2lzdGVyRGVwZW5kZW50RGF0YWJhc2UnLCBmdW5jdGlvbiAoZGVwZW5kZW50RGIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spIHtcbiAgdmFyIGRiT3B0aW9ucyA9IGNsb25lKHRoaXMuX19vcHRzKTtcbiAgaWYgKHRoaXMuX19vcHRzLnZpZXdfYWRhcHRlcikge1xuICAgIGRiT3B0aW9ucy5hZGFwdGVyID0gdGhpcy5fX29wdHMudmlld19hZGFwdGVyO1xuICB9XG5cbiAgdmFyIGRlcERCID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZGVwZW5kZW50RGIsIGRiT3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZGlmZkZ1bihkb2MpIHtcbiAgICBkb2MuZGVwZW5kZW50RGJzID0gZG9jLmRlcGVuZGVudERicyB8fCB7fTtcbiAgICBpZiAoZG9jLmRlcGVuZGVudERic1tkZXBlbmRlbnREYl0pIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gdXBkYXRlIHJlcXVpcmVkXG4gICAgfVxuICAgIGRvYy5kZXBlbmRlbnREYnNbZGVwZW5kZW50RGJdID0gdHJ1ZTtcbiAgICByZXR1cm4gZG9jO1xuICB9XG4gIHVwc2VydCh0aGlzLCAnX2xvY2FsL19wb3VjaF9kZXBlbmRlbnREYnMnLCBkaWZmRnVuKVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHtkYjogZGVwREJ9KTtcbiAgICB9KS5jYXRjaChjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5kZXN0cm95ID1cbiAgYWRhcHRlckZ1bignZGVzdHJveScsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB1c2VQcmVmaXggPSAndXNlX3ByZWZpeCcgaW4gc2VsZiA/IHNlbGYudXNlX3ByZWZpeCA6IHRydWU7XG5cbiAgZnVuY3Rpb24gZGVzdHJveURiKCkge1xuICAgIC8vIGNhbGwgZGVzdHJveSBtZXRob2Qgb2YgdGhlIHBhcnRpY3VsYXIgYWRhcHRvclxuICAgIHNlbGYuX2Rlc3Ryb3kob3B0cywgZnVuY3Rpb24gKGVyciwgcmVzcCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuX2Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICBzZWxmLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcCB8fCB7ICdvayc6IHRydWUgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNSZW1vdGUoc2VsZikpIHtcbiAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGZvciBkZXBlbmRlbnQgREJzIGlmIGl0J3MgYSByZW1vdGUgREJcbiAgICByZXR1cm4gZGVzdHJveURiKCk7XG4gIH1cblxuICBzZWxmLmdldCgnX2xvY2FsL19wb3VjaF9kZXBlbmRlbnREYnMnLCBmdW5jdGlvbiAoZXJyLCBsb2NhbERvYykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7IC8vIG5vIGRlcGVuZGVuY2llc1xuICAgICAgICByZXR1cm4gZGVzdHJveURiKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBkZXBlbmRlbnREYnMgPSBsb2NhbERvYy5kZXBlbmRlbnREYnM7XG4gICAgdmFyIFBvdWNoREIgPSBzZWxmLmNvbnN0cnVjdG9yO1xuICAgIHZhciBkZWxldGVkTWFwID0gT2JqZWN0LmtleXMoZGVwZW5kZW50RGJzKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIC8vIHVzZV9wcmVmaXggaXMgb25seSBmYWxzZSBpbiB0aGUgYnJvd3NlclxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHZhciB0cnVlTmFtZSA9IHVzZVByZWZpeCA/XG4gICAgICAgIG5hbWUucmVwbGFjZShuZXcgUmVnRXhwKCdeJyArIFBvdWNoREIucHJlZml4KSwgJycpIDogbmFtZTtcbiAgICAgIHJldHVybiBuZXcgUG91Y2hEQih0cnVlTmFtZSwgc2VsZi5fX29wdHMpLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBQcm9taXNlLmFsbChkZWxldGVkTWFwKS50aGVuKGRlc3Ryb3lEYiwgY2FsbGJhY2spO1xuICB9KTtcbn0pO1xuXG5mdW5jdGlvbiBUYXNrUXVldWUoKSB7XG4gIHRoaXMuaXNSZWFkeSA9IGZhbHNlO1xuICB0aGlzLmZhaWxlZCA9IGZhbHNlO1xuICB0aGlzLnF1ZXVlID0gW107XG59XG5cblRhc2tRdWV1ZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZ1bjtcbiAgaWYgKHRoaXMuZmFpbGVkKSB7XG4gICAgd2hpbGUgKChmdW4gPSB0aGlzLnF1ZXVlLnNoaWZ0KCkpKSB7XG4gICAgICBmdW4odGhpcy5mYWlsZWQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoKGZ1biA9IHRoaXMucXVldWUuc2hpZnQoKSkpIHtcbiAgICAgIGZ1bigpO1xuICAgIH1cbiAgfVxufTtcblxuVGFza1F1ZXVlLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGVycikge1xuICB0aGlzLmZhaWxlZCA9IGVycjtcbiAgdGhpcy5leGVjdXRlKCk7XG59O1xuXG5UYXNrUXVldWUucHJvdG90eXBlLnJlYWR5ID0gZnVuY3Rpb24gKGRiKSB7XG4gIHRoaXMuaXNSZWFkeSA9IHRydWU7XG4gIHRoaXMuZGIgPSBkYjtcbiAgdGhpcy5leGVjdXRlKCk7XG59O1xuXG5UYXNrUXVldWUucHJvdG90eXBlLmFkZFRhc2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gIHRoaXMucXVldWUucHVzaChmdW4pO1xuICBpZiAodGhpcy5mYWlsZWQpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gcGFyc2VBZGFwdGVyKG5hbWUsIG9wdHMpIHtcbiAgdmFyIG1hdGNoID0gbmFtZS5tYXRjaCgvKFthLXotXSopOlxcL1xcLyguKikvKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgLy8gdGhlIGh0dHAgYWRhcHRlciBleHBlY3RzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAvaHR0cHM/Ly50ZXN0KG1hdGNoWzFdKSA/IG1hdGNoWzFdICsgJzovLycgKyBtYXRjaFsyXSA6IG1hdGNoWzJdLFxuICAgICAgYWRhcHRlcjogbWF0Y2hbMV1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGFkYXB0ZXJzID0gUG91Y2hEQi5hZGFwdGVycztcbiAgdmFyIHByZWZlcnJlZEFkYXB0ZXJzID0gUG91Y2hEQi5wcmVmZXJyZWRBZGFwdGVycztcbiAgdmFyIHByZWZpeCA9IFBvdWNoREIucHJlZml4O1xuICB2YXIgYWRhcHRlck5hbWUgPSBvcHRzLmFkYXB0ZXI7XG5cbiAgaWYgKCFhZGFwdGVyTmFtZSkgeyAvLyBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBhZGFwdGVyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmZXJyZWRBZGFwdGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgYWRhcHRlck5hbWUgPSBwcmVmZXJyZWRBZGFwdGVyc1tpXTtcbiAgICAgIC8vIGNoZWNrIGZvciBicm93c2VycyB0aGF0IGhhdmUgYmVlbiB1cGdyYWRlZCBmcm9tIHdlYnNxbC1vbmx5IHRvIHdlYnNxbCtpZGJcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGFkYXB0ZXJOYW1lID09PSAnaWRiJyAmJiAnd2Vic3FsJyBpbiBhZGFwdGVycyAmJlxuICAgICAgICAgIGhhc0xvY2FsU3RvcmFnZSgpICYmIGxvY2FsU3RvcmFnZVsnX3BvdWNoX193ZWJzcWxkYl8nICsgcHJlZml4ICsgbmFtZV0pIHtcbiAgICAgICAgLy8gbG9nIGl0LCBiZWNhdXNlIHRoaXMgY2FuIGJlIGNvbmZ1c2luZyBkdXJpbmcgZGV2ZWxvcG1lbnRcbiAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ2xvZycsICdQb3VjaERCIGlzIGRvd25ncmFkaW5nIFwiJyArIG5hbWUgKyAnXCIgdG8gV2ViU1FMIHRvJyArXG4gICAgICAgICAgJyBhdm9pZCBkYXRhIGxvc3MsIGJlY2F1c2UgaXQgd2FzIGFscmVhZHkgb3BlbmVkIHdpdGggV2ViU1FMLicpO1xuICAgICAgICBjb250aW51ZTsgLy8ga2VlcCB1c2luZyB3ZWJzcWwgdG8gYXZvaWQgdXNlciBkYXRhIGxvc3NcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhZGFwdGVyID0gYWRhcHRlcnNbYWRhcHRlck5hbWVdO1xuXG4gIC8vIGlmIGFkYXB0ZXIgaXMgaW52YWxpZCwgdGhlbiBhbiBlcnJvciB3aWxsIGJlIHRocm93biBsYXRlclxuICB2YXIgdXNlUHJlZml4ID0gKGFkYXB0ZXIgJiYgJ3VzZV9wcmVmaXgnIGluIGFkYXB0ZXIpID9cbiAgICBhZGFwdGVyLnVzZV9wcmVmaXggOiB0cnVlO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogdXNlUHJlZml4ID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSxcbiAgICBhZGFwdGVyOiBhZGFwdGVyTmFtZVxuICB9O1xufVxuXG4vLyBPSywgc28gaGVyZSdzIHRoZSBkZWFsLiBDb25zaWRlciB0aGlzIGNvZGU6XG4vLyAgICAgdmFyIGRiMSA9IG5ldyBQb3VjaERCKCdmb28nKTtcbi8vICAgICB2YXIgZGIyID0gbmV3IFBvdWNoREIoJ2ZvbycpO1xuLy8gICAgIGRiMS5kZXN0cm95KCk7XG4vLyBeIHRoZXNlIHR3byBib3RoIG5lZWQgdG8gZW1pdCAnZGVzdHJveWVkJyBldmVudHMsXG4vLyBhcyB3ZWxsIGFzIHRoZSBQb3VjaERCIGNvbnN0cnVjdG9yIGl0c2VsZi5cbi8vIFNvIHdlIGhhdmUgb25lIGRiIG9iamVjdCAod2hpY2hldmVyIG9uZSBnb3QgZGVzdHJveSgpIGNhbGxlZCBvbiBpdClcbi8vIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyB0aGUgaW5pdGlhbCBldmVudCwgd2hpY2ggdGhlbiBnZXRzIGVtaXR0ZWRcbi8vIGJ5IHRoZSBjb25zdHJ1Y3Rvciwgd2hpY2ggdGhlbiBicm9hZGNhc3RzIGl0IHRvIGFueSBvdGhlciBkYnNcbi8vIHRoYXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIHNhbWUgbmFtZS5cbmZ1bmN0aW9uIHByZXBhcmVGb3JEZXN0cnVjdGlvbihzZWxmKSB7XG5cbiAgZnVuY3Rpb24gb25EZXN0cm95ZWQoZnJvbV9jb25zdHJ1Y3Rvcikge1xuICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlZCcsIG9uQ2xvc2VkKTtcbiAgICBpZiAoIWZyb21fY29uc3RydWN0b3IpIHtcbiAgICAgIHNlbGYuY29uc3RydWN0b3IuZW1pdCgnZGVzdHJveWVkJywgc2VsZi5uYW1lKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsb3NlZCgpIHtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3llZCk7XG4gICAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCd1bnJlZicsIHNlbGYpO1xuICB9XG5cbiAgc2VsZi5vbmNlKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3llZCk7XG4gIHNlbGYub25jZSgnY2xvc2VkJywgb25DbG9zZWQpO1xuICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ3JlZicsIHNlbGYpO1xufVxuXG5pbmhlcml0cyhQb3VjaERCLCBBYnN0cmFjdFBvdWNoREIpO1xuZnVuY3Rpb24gUG91Y2hEQihuYW1lLCBvcHRzKSB7XG4gIC8vIEluIE5vZGUgb3VyIHRlc3Qgc3VpdGUgb25seSB0ZXN0cyB0aGlzIGZvciBQb3VjaEFsdCB1bmZvcnR1bmF0ZWx5XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUG91Y2hEQikpIHtcbiAgICByZXR1cm4gbmV3IFBvdWNoREIobmFtZSwgb3B0cyk7XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIGlmIChuYW1lICYmIHR5cGVvZiBuYW1lID09PSAnb2JqZWN0Jykge1xuICAgIG9wdHMgPSBuYW1lO1xuICAgIG5hbWUgPSBvcHRzLm5hbWU7XG4gICAgZGVsZXRlIG9wdHMubmFtZTtcbiAgfVxuXG4gIGlmIChvcHRzLmRldGVybWluaXN0aWNfcmV2cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0cy5kZXRlcm1pbmlzdGljX3JldnMgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fX29wdHMgPSBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgc2VsZi5hdXRvX2NvbXBhY3Rpb24gPSBvcHRzLmF1dG9fY29tcGFjdGlvbjtcbiAgc2VsZi5wcmVmaXggPSBQb3VjaERCLnByZWZpeDtcblxuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nL2ludmFsaWQgREIgbmFtZScpO1xuICB9XG5cbiAgdmFyIHByZWZpeGVkTmFtZSA9IChvcHRzLnByZWZpeCB8fCAnJykgKyBuYW1lO1xuICB2YXIgYmFja2VuZCA9IHBhcnNlQWRhcHRlcihwcmVmaXhlZE5hbWUsIG9wdHMpO1xuXG4gIG9wdHMubmFtZSA9IGJhY2tlbmQubmFtZTtcbiAgb3B0cy5hZGFwdGVyID0gb3B0cy5hZGFwdGVyIHx8IGJhY2tlbmQuYWRhcHRlcjtcblxuICBzZWxmLm5hbWUgPSBuYW1lO1xuICBzZWxmLl9hZGFwdGVyID0gb3B0cy5hZGFwdGVyO1xuICBQb3VjaERCLmVtaXQoJ2RlYnVnJywgWydhZGFwdGVyJywgJ1BpY2tlZCBhZGFwdGVyOiAnLCBvcHRzLmFkYXB0ZXJdKTtcblxuICBpZiAoIVBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXSB8fFxuICAgICAgIVBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXS52YWxpZCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFkYXB0ZXI6ICcgKyBvcHRzLmFkYXB0ZXIpO1xuICB9XG5cbiAgaWYgKG9wdHMudmlld19hZGFwdGVyKSB7XG4gICAgaWYgKCFQb3VjaERCLmFkYXB0ZXJzW29wdHMudmlld19hZGFwdGVyXSB8fFxuICAgICAgICAhUG91Y2hEQi5hZGFwdGVyc1tvcHRzLnZpZXdfYWRhcHRlcl0udmFsaWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFZpZXcgQWRhcHRlcjogJyArIG9wdHMudmlld19hZGFwdGVyKTtcbiAgICB9XG4gIH1cblxuICBBYnN0cmFjdFBvdWNoREIuY2FsbChzZWxmKTtcbiAgc2VsZi50YXNrcXVldWUgPSBuZXcgVGFza1F1ZXVlKCk7XG5cbiAgc2VsZi5hZGFwdGVyID0gb3B0cy5hZGFwdGVyO1xuXG4gIFBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXS5jYWxsKHNlbGYsIG9wdHMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gc2VsZi50YXNrcXVldWUuZmFpbChlcnIpO1xuICAgIH1cbiAgICBwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oc2VsZik7XG5cbiAgICBzZWxmLmVtaXQoJ2NyZWF0ZWQnLCBzZWxmKTtcbiAgICBQb3VjaERCLmVtaXQoJ2NyZWF0ZWQnLCBzZWxmLm5hbWUpO1xuICAgIHNlbGYudGFza3F1ZXVlLnJlYWR5KHNlbGYpO1xuICB9KTtcblxufVxuXG4vLyBBYm9ydENvbnRyb2xsZXIgd2FzIGludHJvZHVjZWQgcXVpdGUgYSB3aGlsZSBhZnRlciBmZXRjaCBhbmRcbi8vIGlzbnQgcmVxdWlyZWQgZm9yIFBvdWNoREIgdG8gZnVuY3Rpb24gc28gcG9seWZpbGwgaWYgbmVlZGVkXG52YXIgYSA9ICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAndW5kZWZpbmVkJylcbiAgICA/IEFib3J0Q29udHJvbGxlclxuICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4ge2Fib3J0OiBmdW5jdGlvbiAoKSB7fX07IH07XG5cbnZhciBmJDEgPSBmZXRjaDtcbnZhciBoID0gSGVhZGVycztcblxuUG91Y2hEQi5hZGFwdGVycyA9IHt9O1xuUG91Y2hEQi5wcmVmZXJyZWRBZGFwdGVycyA9IFtdO1xuXG5Qb3VjaERCLnByZWZpeCA9ICdfcG91Y2hfJztcblxudmFyIGV2ZW50RW1pdHRlciA9IG5ldyBFRSgpO1xuXG5mdW5jdGlvbiBzZXRVcEV2ZW50RW1pdHRlcihQb3VjaCkge1xuICBPYmplY3Qua2V5cyhFRS5wcm90b3R5cGUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICh0eXBlb2YgRUUucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIFBvdWNoW2tleV0gPSBldmVudEVtaXR0ZXJba2V5XS5iaW5kKGV2ZW50RW1pdHRlcik7XG4gICAgfVxuICB9KTtcblxuICAvLyB0aGVzZSBhcmUgY3JlYXRlZCBpbiBjb25zdHJ1Y3Rvci5qcywgYW5kIGFsbG93IHVzIHRvIG5vdGlmeSBlYWNoIERCIHdpdGhcbiAgLy8gdGhlIHNhbWUgbmFtZSB0aGF0IGl0IHdhcyBkZXN0cm95ZWQsIHZpYSB0aGUgY29uc3RydWN0b3Igb2JqZWN0XG4gIHZhciBkZXN0cnVjdExpc3RlbmVycyA9IFBvdWNoLl9kZXN0cnVjdGlvbkxpc3RlbmVycyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuXG4gIFBvdWNoLm9uKCdyZWYnLCBmdW5jdGlvbiBvbkNvbnN0cnVjdG9yUmVmKGRiKSB7XG4gICAgaWYgKCFkZXN0cnVjdExpc3RlbmVycy5oYXMoZGIubmFtZSkpIHtcbiAgICAgIGRlc3RydWN0TGlzdGVuZXJzLnNldChkYi5uYW1lLCBbXSk7XG4gICAgfVxuICAgIGRlc3RydWN0TGlzdGVuZXJzLmdldChkYi5uYW1lKS5wdXNoKGRiKTtcbiAgfSk7XG5cbiAgUG91Y2gub24oJ3VucmVmJywgZnVuY3Rpb24gb25Db25zdHJ1Y3RvclVucmVmKGRiKSB7XG4gICAgaWYgKCFkZXN0cnVjdExpc3RlbmVycy5oYXMoZGIubmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRiTGlzdCA9IGRlc3RydWN0TGlzdGVuZXJzLmdldChkYi5uYW1lKTtcbiAgICB2YXIgcG9zID0gZGJMaXN0LmluZGV4T2YoZGIpO1xuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYkxpc3Quc3BsaWNlKHBvcywgMSk7XG4gICAgaWYgKGRiTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVzdHJ1Y3RMaXN0ZW5lcnMuc2V0KGRiLm5hbWUsIGRiTGlzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RydWN0TGlzdGVuZXJzLmRlbGV0ZShkYi5uYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIFBvdWNoLm9uKCdkZXN0cm95ZWQnLCBmdW5jdGlvbiBvbkNvbnN0cnVjdG9yRGVzdHJveWVkKG5hbWUpIHtcbiAgICBpZiAoIWRlc3RydWN0TGlzdGVuZXJzLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZGJMaXN0ID0gZGVzdHJ1Y3RMaXN0ZW5lcnMuZ2V0KG5hbWUpO1xuICAgIGRlc3RydWN0TGlzdGVuZXJzLmRlbGV0ZShuYW1lKTtcbiAgICBkYkxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZGIpIHtcbiAgICAgIGRiLmVtaXQoJ2Rlc3Ryb3llZCcsdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5zZXRVcEV2ZW50RW1pdHRlcihQb3VjaERCKTtcblxuUG91Y2hEQi5hZGFwdGVyID0gZnVuY3Rpb24gKGlkLCBvYmosIGFkZFRvUHJlZmVycmVkQWRhcHRlcnMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKG9iai52YWxpZCgpKSB7XG4gICAgUG91Y2hEQi5hZGFwdGVyc1tpZF0gPSBvYmo7XG4gICAgaWYgKGFkZFRvUHJlZmVycmVkQWRhcHRlcnMpIHtcbiAgICAgIFBvdWNoREIucHJlZmVycmVkQWRhcHRlcnMucHVzaChpZCk7XG4gICAgfVxuICB9XG59O1xuXG5Qb3VjaERCLnBsdWdpbiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHsgLy8gZnVuY3Rpb24gc3R5bGUgZm9yIHBsdWdpbnNcbiAgICBvYmooUG91Y2hEQik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGx1Z2luOiBnb3QgXCInICsgb2JqICsgJ1wiLCBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbicpO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsgLy8gb2JqZWN0IHN0eWxlIGZvciBwbHVnaW5zXG4gICAgICBQb3VjaERCLnByb3RvdHlwZVtpZF0gPSBvYmpbaWRdO1xuICAgIH0pO1xuICB9XG4gIGlmICh0aGlzLl9fZGVmYXVsdHMpIHtcbiAgICBQb3VjaERCLl9fZGVmYXVsdHMgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIHRoaXMuX19kZWZhdWx0cyk7XG4gIH1cbiAgcmV0dXJuIFBvdWNoREI7XG59O1xuXG5Qb3VjaERCLmRlZmF1bHRzID0gZnVuY3Rpb24gKGRlZmF1bHRPcHRzKSB7XG4gIGZ1bmN0aW9uIFBvdWNoQWx0KG5hbWUsIG9wdHMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUG91Y2hBbHQpKSB7XG4gICAgICByZXR1cm4gbmV3IFBvdWNoQWx0KG5hbWUsIG9wdHMpO1xuICAgIH1cblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gICAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBvcHRzID0gbmFtZTtcbiAgICAgIG5hbWUgPSBvcHRzLm5hbWU7XG4gICAgICBkZWxldGUgb3B0cy5uYW1lO1xuICAgIH1cblxuICAgIG9wdHMgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIFBvdWNoQWx0Ll9fZGVmYXVsdHMsIG9wdHMpO1xuICAgIFBvdWNoREIuY2FsbCh0aGlzLCBuYW1lLCBvcHRzKTtcbiAgfVxuXG4gIGluaGVyaXRzKFBvdWNoQWx0LCBQb3VjaERCKTtcblxuICBQb3VjaEFsdC5wcmVmZXJyZWRBZGFwdGVycyA9IFBvdWNoREIucHJlZmVycmVkQWRhcHRlcnMuc2xpY2UoKTtcbiAgT2JqZWN0LmtleXMoUG91Y2hEQikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCEoa2V5IGluIFBvdWNoQWx0KSkge1xuICAgICAgUG91Y2hBbHRba2V5XSA9IFBvdWNoREJba2V5XTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIG1ha2UgZGVmYXVsdCBvcHRpb25zIHRyYW5zaXRpdmVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvdWNoZGIvcG91Y2hkYi9pc3N1ZXMvNTkyMlxuICBQb3VjaEFsdC5fX2RlZmF1bHRzID0gJGluamVjdF9PYmplY3RfYXNzaWduKHt9LCB0aGlzLl9fZGVmYXVsdHMsIGRlZmF1bHRPcHRzKTtcblxuICByZXR1cm4gUG91Y2hBbHQ7XG59O1xuXG5Qb3VjaERCLmZldGNoID0gZnVuY3Rpb24gKHVybCwgb3B0cykge1xuICByZXR1cm4gZiQxKHVybCwgb3B0cyk7XG59O1xuXG4vLyBtYW5hZ2VkIGF1dG9tYXRpY2FsbHkgYnkgc2V0LXZlcnNpb24uanNcbnZhciB2ZXJzaW9uID0gXCI3LjMuMFwiO1xuXG4vLyB0aGlzIHdvdWxkIGp1c3QgYmUgXCJyZXR1cm4gZG9jW2ZpZWxkXVwiLCBidXQgZmllbGRzXG4vLyBjYW4gYmUgXCJkZWVwXCIgZHVlIHRvIGRvdCBub3RhdGlvblxuZnVuY3Rpb24gZ2V0RmllbGRGcm9tRG9jKGRvYywgcGFyc2VkRmllbGQpIHtcbiAgdmFyIHZhbHVlID0gZG9jO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gcGFyc2VkRmllbGQubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIga2V5ID0gcGFyc2VkRmllbGRbaV07XG4gICAgdmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUkMShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbn1cblxuLy8gQ29udmVydHMgYSBzdHJpbmcgaW4gZG90IG5vdGF0aW9uIHRvIGFuIGFycmF5IG9mIGl0cyBjb21wb25lbnRzLCB3aXRoIGJhY2tzbGFzaCBlc2NhcGluZ1xuZnVuY3Rpb24gcGFyc2VGaWVsZChmaWVsZE5hbWUpIHtcbiAgLy8gZmllbGRzIG1heSBiZSBkZWVwIChlLmcuIFwiZm9vLmJhci5iYXpcIiksIHNvIHBhcnNlXG4gIHZhciBmaWVsZHMgPSBbXTtcbiAgdmFyIGN1cnJlbnQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGZpZWxkTmFtZS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBjaCA9IGZpZWxkTmFtZVtpXTtcbiAgICBpZiAoaSA+IDAgJiYgZmllbGROYW1lW2kgLSAxXSA9PT0gJ1xcXFwnICYmIChjaCA9PT0gJyQnIHx8IGNoID09PSAnLicpKSB7XG4gICAgICAvLyBlc2NhcGVkIGRlbGltaXRlclxuICAgICAgY3VycmVudCA9IGN1cnJlbnQuc3Vic3RyaW5nKDAsIGN1cnJlbnQubGVuZ3RoIC0gMSkgKyBjaDtcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnLicpIHtcbiAgICAgIC8vIFdoZW4gYC5gIGlzIG5vdCBlc2NhcGVkIChhYm92ZSksIGl0IGlzIGEgZmllbGQgZGVsaW1pdGVyXG4gICAgICBmaWVsZHMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICB9IGVsc2UgeyAvLyBub3JtYWwgY2hhcmFjdGVyXG4gICAgICBjdXJyZW50ICs9IGNoO1xuICAgIH1cbiAgfVxuICBmaWVsZHMucHVzaChjdXJyZW50KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cblxudmFyIGNvbWJpbmF0aW9uRmllbGRzID0gWyckb3InLCAnJG5vcicsICckbm90J107XG5mdW5jdGlvbiBpc0NvbWJpbmF0aW9uYWxGaWVsZChmaWVsZCkge1xuICByZXR1cm4gY29tYmluYXRpb25GaWVsZHMuaW5kZXhPZihmaWVsZCkgPiAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5KG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVswXTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUob2JqKSB7XG4gIHJldHVybiBvYmpbZ2V0S2V5KG9iaildO1xufVxuXG5cbi8vIGZsYXR0ZW4gYW4gYXJyYXkgb2Ygc2VsZWN0b3JzIGpvaW5lZCBieSBhbiAkYW5kIG9wZXJhdG9yXG5mdW5jdGlvbiBtZXJnZUFuZGVkU2VsZWN0b3JzKHNlbGVjdG9ycykge1xuXG4gIC8vIHNvcnQgdG8gZW5zdXJlIHRoYXQgZS5nLiBpZiB0aGUgdXNlciBzcGVjaWZpZWRcbiAgLy8gJGFuZDogW3skZ3Q6ICdhJ30sIHskZ3Q6ICdiJ31dLCB0aGVuIGl0J3MgY29sbGFwc2VkIGludG9cbiAgLy8ganVzdCB7JGd0OiAnYid9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGZpcnN0ID0geyRvcjogdHJ1ZSwgJG5vcjogdHJ1ZX07XG5cbiAgc2VsZWN0b3JzLmZvckVhY2goZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgT2JqZWN0LmtleXMoc2VsZWN0b3IpLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgbWF0Y2hlciA9IHNlbGVjdG9yW2ZpZWxkXTtcbiAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgbWF0Y2hlciA9IHskZXE6IG1hdGNoZXJ9O1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNDb21iaW5hdGlvbmFsRmllbGQoZmllbGQpKSB7XG4gICAgICAgIC8vIG9yLCBub3JcbiAgICAgICAgaWYgKG1hdGNoZXIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGlmIChmaXJzdFtmaWVsZF0pIHtcbiAgICAgICAgICAgIGZpcnN0W2ZpZWxkXSA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzW2ZpZWxkXSA9IG1hdGNoZXI7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICAgICAgICByZXNbZmllbGRdLmZvckVhY2goZnVuY3Rpb24gKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtYXRjaGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgdmFyIG0gPSBtYXRjaGVyW2tleV07XG4gICAgICAgICAgICAgIHZhciBsb25nZXN0ID0gTWF0aC5tYXgoT2JqZWN0LmtleXMoZXhpc3RpbmcpLmxlbmd0aCwgT2JqZWN0LmtleXMobSkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgdmFyIG1lcmdlZCA9IG1lcmdlQW5kZWRTZWxlY3RvcnMoW2V4aXN0aW5nLCBtXSk7XG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA8PSBsb25nZXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHNpdHVhdGlvbiBsaWtlOiAoYSA6eyRlcSA6MX0gfHwgLi4uKSAmJiAoYSB7JGVxOiAyfSB8fCAuLi4pXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2luZyB3b3VsZCBwcm9kdWNlIGEgJGVxIDIgd2hlbiBhY3R1YWxseSB3ZSBzaG91bGRuJ3QgZXZlciBtYXRjaCBhZ2FpbnN0IHRoZXNlIG1lcmdlZCBjb25kaXRpb25zXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2VkIHNob3VsZCBhbHdheXMgY29udGFpbiBtb3JlIHZhbHVlcyB0byBiZSB2YWxpZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbnRyaWVzLnB1c2gobWVyZ2VkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc1tmaWVsZF0gPSBlbnRyaWVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vdFxuICAgICAgICAgIHJlc1tmaWVsZF0gPSBtZXJnZUFuZGVkU2VsZWN0b3JzKFttYXRjaGVyXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBmaWVsZE1hdGNoZXJzID0gcmVzW2ZpZWxkXSA9IHJlc1tmaWVsZF0gfHwge307XG4gICAgICAgIE9iamVjdC5rZXlzKG1hdGNoZXIpLmZvckVhY2goZnVuY3Rpb24gKG9wZXJhdG9yKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gbWF0Y2hlcltvcGVyYXRvcl07XG5cbiAgICAgICAgICBpZiAob3BlcmF0b3IgPT09ICckZ3QnIHx8IG9wZXJhdG9yID09PSAnJGd0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZUd0R3RlKG9wZXJhdG9yLCB2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gJyRsdCcgfHwgb3BlcmF0b3IgPT09ICckbHRlJykge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlTHRMdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSAnJG5lJykge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlTmUodmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09ICckZXEnKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VFcSh2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gXCIkcmVnZXhcIikge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlUmVnZXgodmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuXG5cbi8vIGNvbGxhcHNlIGxvZ2ljYWxseSBlcXVpdmFsZW50IGd0L2d0ZSB2YWx1ZXNcbmZ1bmN0aW9uIG1lcmdlR3RHdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kZXEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nXG4gIH1cbiAgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRndGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSAnJGd0ZScpIHtcbiAgICAgIGlmICh2YWx1ZSA+IGZpZWxkTWF0Y2hlcnMuJGd0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlID49IGZpZWxkTWF0Y2hlcnMuJGd0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRndGU7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRndCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob3BlcmF0b3IgPT09ICckZ3RlJykge1xuICAgICAgaWYgKHZhbHVlID4gZmllbGRNYXRjaGVycy4kZ3QpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBkZWxldGUgZmllbGRNYXRjaGVycy4kZ3Q7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlID4gZmllbGRNYXRjaGVycy4kZ3QpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBmaWVsZE1hdGNoZXJzLiRndCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICB9XG59XG5cbi8vIGNvbGxhcHNlIGxvZ2ljYWxseSBlcXVpdmFsZW50IGx0L2x0ZSB2YWx1ZXNcbmZ1bmN0aW9uIG1lcmdlTHRMdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kZXEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nXG4gIH1cbiAgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRsdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSAnJGx0ZScpIHtcbiAgICAgIGlmICh2YWx1ZSA8IGZpZWxkTWF0Y2hlcnMuJGx0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlIDw9IGZpZWxkTWF0Y2hlcnMuJGx0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRsdGU7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob3BlcmF0b3IgPT09ICckbHRlJykge1xuICAgICAgaWYgKHZhbHVlIDwgZmllbGRNYXRjaGVycy4kbHQpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBkZWxldGUgZmllbGRNYXRjaGVycy4kbHQ7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlIDwgZmllbGRNYXRjaGVycy4kbHQpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBmaWVsZE1hdGNoZXJzLiRsdCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICB9XG59XG5cbi8vIGNvbWJpbmUgJG5lIHZhbHVlcyBpbnRvIG9uZSBhcnJheVxuZnVuY3Rpb24gbWVyZ2VOZSh2YWx1ZSwgZmllbGRNYXRjaGVycykge1xuICBpZiAoJyRuZScgaW4gZmllbGRNYXRjaGVycykge1xuICAgIC8vIHRoZXJlIGFyZSBtYW55IHRoaW5ncyB0aGlzIGNvdWxkIFwibm90XCIgYmVcbiAgICBmaWVsZE1hdGNoZXJzLiRuZS5wdXNoKHZhbHVlKTtcbiAgfSBlbHNlIHsgLy8gZG9lc24ndCBleGlzdCB5ZXRcbiAgICBmaWVsZE1hdGNoZXJzLiRuZSA9IFt2YWx1ZV07XG4gIH1cbn1cblxuLy8gYWRkICRlcSBpbnRvIHRoZSBtaXhcbmZ1bmN0aW9uIG1lcmdlRXEodmFsdWUsIGZpZWxkTWF0Y2hlcnMpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgbGVzcyBzcGVjaWZpY2l0eSB0aGFuIHRoZSAkZXFcbiAgLy8gVE9ETzogY2hlY2sgZm9yIHVzZXIgZXJyb3JzIGhlcmVcbiAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGd0O1xuICBkZWxldGUgZmllbGRNYXRjaGVycy4kZ3RlO1xuICBkZWxldGUgZmllbGRNYXRjaGVycy4kbHQ7XG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRsdGU7XG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRuZTtcbiAgZmllbGRNYXRjaGVycy4kZXEgPSB2YWx1ZTtcbn1cblxuLy8gY29tYmluZSAkcmVnZXggdmFsdWVzIGludG8gb25lIGFycmF5XG5mdW5jdGlvbiBtZXJnZVJlZ2V4KHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICgnJHJlZ2V4JyBpbiBmaWVsZE1hdGNoZXJzKSB7XG4gICAgLy8gYSB2YWx1ZSBjb3VsZCBtYXRjaCBtdWx0aXBsZSByZWdleGVzXG4gICAgZmllbGRNYXRjaGVycy4kcmVnZXgucHVzaCh2YWx1ZSk7XG4gIH0gZWxzZSB7IC8vIGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgZmllbGRNYXRjaGVycy4kcmVnZXggPSBbdmFsdWVdO1xuICB9XG59XG5cbi8vIzc0NTg6IGV4ZWN1dGUgZnVuY3Rpb24gbWVyZ2VBbmRlZFNlbGVjdG9ycyBvbiBuZXN0ZWQgJGFuZFxuZnVuY3Rpb24gbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZChvYmopIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmpbaV1bJyRhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICBvYmpbaV0gPSBtZXJnZUFuZGVkU2VsZWN0b3JzKG9ialtpXVsnJGFuZCddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZCh2YWx1ZSk7IC8vIDwtIHJlY3Vyc2l2ZSBjYWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cblxuLy8jNzQ1ODogZGV0ZXJtaW5lIGlkICRhbmQgaXMgcHJlc2VudCBpbiBzZWxlY3RvciAoYXQgYW55IGxldmVsKVxuZnVuY3Rpb24gaXNBbmRJblNlbGVjdG9yKG9iaiwgaXNBbmQpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAocHJvcCA9PT0gJyRhbmQnKSB7XG4gICAgICAgICAgICBpc0FuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaXNBbmQgPSBpc0FuZEluU2VsZWN0b3IodmFsdWUsIGlzQW5kKTsgLy8gPC0gcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNBbmQ7XG59XG5cbi8vXG4vLyBub3JtYWxpemUgdGhlIHNlbGVjdG9yXG4vL1xuZnVuY3Rpb24gbWFzc2FnZVNlbGVjdG9yKGlucHV0KSB7XG4gIHZhciByZXN1bHQgPSBjbG9uZShpbnB1dCk7XG4gIHZhciB3YXNBbmRlZCA9IGZhbHNlO1xuICAgIC8vIzc0NTg6IGlmICRhbmQgaXMgcHJlc2VudCBpbiBzZWxlY3RvciAoYXQgYW55IGxldmVsKSBtZXJnZSBuZXN0ZWQgJGFuZFxuICAgIGlmIChpc0FuZEluU2VsZWN0b3IocmVzdWx0LCBmYWxzZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZChyZXN1bHQpO1xuICAgICAgICBpZiAoJyRhbmQnIGluIHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbWVyZ2VBbmRlZFNlbGVjdG9ycyhyZXN1bHRbJyRhbmQnXSk7XG4gICAgICAgIH1cbiAgICAgICAgd2FzQW5kZWQgPSB0cnVlO1xuICAgIH1cblxuICBbJyRvcicsICckbm9yJ10uZm9yRWFjaChmdW5jdGlvbiAob3JPck5vcikge1xuICAgIGlmIChvck9yTm9yIGluIHJlc3VsdCkge1xuICAgICAgLy8gbWVzc2FnZSBlYWNoIGluZGl2aWR1YWwgc2VsZWN0b3JcbiAgICAgIC8vIGUuZy4ge2ZvbzogJ2Jhcid9IGJlY29tZXMge2ZvbzogeyRlcTogJ2Jhcid9fVxuICAgICAgcmVzdWx0W29yT3JOb3JdLmZvckVhY2goZnVuY3Rpb24gKHN1YlNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBmaWVsZHMgPSBPYmplY3Qua2V5cyhzdWJTZWxlY3Rvcik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgIHZhciBtYXRjaGVyID0gc3ViU2VsZWN0b3JbZmllbGRdO1xuICAgICAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ29iamVjdCcgfHwgbWF0Y2hlciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc3ViU2VsZWN0b3JbZmllbGRdID0geyRlcTogbWF0Y2hlcn07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmICgnJG5vdCcgaW4gcmVzdWx0KSB7XG4gICAgLy9UaGlzIGZlZWxzIGEgbGl0dGxlIGxpa2UgZm9yY2luZywgYnV0IGl0IHdpbGwgd29yayBmb3Igbm93LFxuICAgIC8vSSB3b3VsZCBsaWtlIHRvIGNvbWUgYmFjayB0byB0aGlzIGFuZCBtYWtlIHRoZSBtZXJnaW5nIG9mIHNlbGVjdG9ycyBhIGxpdHRsZSBtb3JlIGdlbmVyaWNcbiAgICByZXN1bHRbJyRub3QnXSA9IG1lcmdlQW5kZWRTZWxlY3RvcnMoW3Jlc3VsdFsnJG5vdCddXSk7XG4gIH1cblxuICB2YXIgZmllbGRzID0gT2JqZWN0LmtleXMocmVzdWx0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICB2YXIgbWF0Y2hlciA9IHJlc3VsdFtmaWVsZF07XG5cbiAgICBpZiAodHlwZW9mIG1hdGNoZXIgIT09ICdvYmplY3QnIHx8IG1hdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIG1hdGNoZXIgPSB7JGVxOiBtYXRjaGVyfTtcbiAgICB9IGVsc2UgaWYgKCF3YXNBbmRlZCkge1xuICAgICAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUgcGxhY2VkIGluIGFuIGFycmF5IGJlY2F1c2UgdGhlc2Ugb3BlcmF0b3JzIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGZpZWxkXG4gICAgICAvLyB3aGVuICRhbmQgaXMgdXNlZCwgbWVyZ2VBbmRlZFNlbGVjdG9ycyB0YWtlcyBjYXJlIG9mIHB1dHRpbmcgdGhlbSBpbnRvIGFycmF5cywgb3RoZXJ3aXNlIGl0J3MgZG9uZSBoZXJlOlxuICAgICAgaWYgKCckbmUnIGluIG1hdGNoZXIpIHtcbiAgICAgICAgbWF0Y2hlci4kbmUgPSBbbWF0Y2hlci4kbmVdO1xuICAgICAgfVxuICAgICAgaWYgKCckcmVnZXgnIGluIG1hdGNoZXIpIHtcbiAgICAgICAgbWF0Y2hlci4kcmVnZXggPSBbbWF0Y2hlci4kcmVnZXhdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHRbZmllbGRdID0gbWF0Y2hlcjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHBhZChzdHIsIHBhZFdpdGgsIHVwVG9MZW5ndGgpIHtcbiAgdmFyIHBhZGRpbmcgPSAnJztcbiAgdmFyIHRhcmdldExlbmd0aCA9IHVwVG9MZW5ndGggLSBzdHIubGVuZ3RoO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB3aGlsZSAocGFkZGluZy5sZW5ndGggPCB0YXJnZXRMZW5ndGgpIHtcbiAgICBwYWRkaW5nICs9IHBhZFdpdGg7XG4gIH1cbiAgcmV0dXJuIHBhZGRpbmc7XG59XG5cbmZ1bmN0aW9uIHBhZExlZnQoc3RyLCBwYWRXaXRoLCB1cFRvTGVuZ3RoKSB7XG4gIHZhciBwYWRkaW5nID0gcGFkKHN0ciwgcGFkV2l0aCwgdXBUb0xlbmd0aCk7XG4gIHJldHVybiBwYWRkaW5nICsgc3RyO1xufVxuXG52YXIgTUlOX01BR05JVFVERSA9IC0zMjQ7IC8vIHZlcmlmaWVkIGJ5IC1OdW1iZXIuTUlOX1ZBTFVFXG52YXIgTUFHTklUVURFX0RJR0lUUyA9IDM7IC8vIGRpdHRvXG52YXIgU0VQID0gJyc7IC8vIHNldCB0byAnXycgZm9yIGVhc2llciBkZWJ1Z2dpbmdcblxuZnVuY3Rpb24gY29sbGF0ZShhLCBiKSB7XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGEgPSBub3JtYWxpemVLZXkoYSk7XG4gIGIgPSBub3JtYWxpemVLZXkoYik7XG5cbiAgdmFyIGFpID0gY29sbGF0aW9uSW5kZXgoYSk7XG4gIHZhciBiaSA9IGNvbGxhdGlvbkluZGV4KGIpO1xuICBpZiAoKGFpIC0gYmkpICE9PSAwKSB7XG4gICAgcmV0dXJuIGFpIC0gYmk7XG4gIH1cbiAgc3dpdGNoICh0eXBlb2YgYSkge1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IDE7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiBzdHJpbmdDb2xsYXRlKGEsIGIpO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGEpID8gYXJyYXlDb2xsYXRlKGEsIGIpIDogb2JqZWN0Q29sbGF0ZShhLCBiKTtcbn1cblxuLy8gY291Y2ggY29uc2lkZXJzIG51bGwvTmFOL0luZmluaXR5Ly1JbmZpbml0eSA9PT0gdW5kZWZpbmVkLFxuLy8gZm9yIHRoZSBwdXJwb3NlcyBvZiBtYXByZWR1Y2UgaW5kZXhlcy4gYWxzbywgZGF0ZXMgZ2V0IHN0cmluZ2lmaWVkLlxuZnVuY3Rpb24gbm9ybWFsaXplS2V5KGtleSkge1xuICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGlmIChrZXkgPT09IEluZmluaXR5IHx8IGtleSA9PT0gLUluZmluaXR5IHx8IGlzTmFOKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5O1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB2YXIgb3JpZ0tleSA9IGtleTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgdmFyIGxlbiA9IGtleS5sZW5ndGg7XG4gICAgICAgIGtleSA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAga2V5W2ldID0gbm9ybWFsaXplS2V5KG9yaWdLZXlbaV0pO1xuICAgICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgfSBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBrZXkudG9KU09OKCk7XG4gICAgICB9IGVsc2UgaWYgKGtleSAhPT0gbnVsbCkgeyAvLyBnZW5lcmljIG9iamVjdFxuICAgICAgICBrZXkgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBvcmlnS2V5KSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcmlnS2V5LCBrKSkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9yaWdLZXlba107XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAga2V5W2tdID0gbm9ybWFsaXplS2V5KHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGtleTtcbn1cblxuZnVuY3Rpb24gaW5kZXhpZnkoa2V5KSB7XG4gIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4ga2V5ID8gMSA6IDA7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gbnVtVG9JbmRleGFibGVTdHJpbmcoa2V5KTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIC8vIFdlJ3ZlIHRvIGJlIHN1cmUgdGhhdCBrZXkgZG9lcyBub3QgY29udGFpbiBcXHUwMDAwXG4gICAgICAgIC8vIERvIG9yZGVyLXByZXNlcnZpbmcgcmVwbGFjZW1lbnRzOlxuICAgICAgICAvLyAwIC0+IDEsIDFcbiAgICAgICAgLy8gMSAtPiAxLCAyXG4gICAgICAgIC8vIDIgLT4gMiwgMlxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHJldHVybiBrZXlcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMi9nLCAnXFx1MDAwMlxcdTAwMDInKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXHUwMDAxL2csICdcXHUwMDAxXFx1MDAwMicpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDAvZywgJ1xcdTAwMDFcXHUwMDAxJyk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29udHJvbC1yZWdleCAqL1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGtleSk7XG4gICAgICAgIHZhciBhcnIgPSBpc0FycmF5ID8ga2V5IDogT2JqZWN0LmtleXMoa2V5KTtcbiAgICAgICAgdmFyIGkgPSAtMTtcbiAgICAgICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9JbmRleGFibGVTdHJpbmcoYXJyW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgICAgICAgICAgdmFyIG9iaktleSA9IGFycltpXTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0luZGV4YWJsZVN0cmluZyhvYmpLZXkpICtcbiAgICAgICAgICAgICAgICB0b0luZGV4YWJsZVN0cmluZyhrZXlbb2JqS2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuLy8gY29udmVydCB0aGUgZ2l2ZW4ga2V5IHRvIGEgc3RyaW5nIHRoYXQgd291bGQgYmUgYXBwcm9wcmlhdGVcbi8vIGZvciBsZXhpY2FsIHNvcnRpbmcsIGUuZy4gd2l0aGluIGEgZGF0YWJhc2UsIHdoZXJlIHRoZVxuLy8gc29ydGluZyBpcyB0aGUgc2FtZSBnaXZlbiBieSB0aGUgY29sbGF0ZSgpIGZ1bmN0aW9uLlxuZnVuY3Rpb24gdG9JbmRleGFibGVTdHJpbmcoa2V5KSB7XG4gIHZhciB6ZXJvID0gJ1xcdTAwMDAnO1xuICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcbiAgcmV0dXJuIGNvbGxhdGlvbkluZGV4KGtleSkgKyBTRVAgKyBpbmRleGlmeShrZXkpICsgemVybztcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1iZXIoc3RyLCBpKSB7XG4gIHZhciBvcmlnaW5hbElkeCA9IGk7XG4gIHZhciBudW07XG4gIHZhciB6ZXJvID0gc3RyW2ldID09PSAnMSc7XG4gIGlmICh6ZXJvKSB7XG4gICAgbnVtID0gMDtcbiAgICBpKys7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5lZyA9IHN0cltpXSA9PT0gJzAnO1xuICAgIGkrKztcbiAgICB2YXIgbnVtQXNTdHJpbmcgPSAnJztcbiAgICB2YXIgbWFnQXNTdHJpbmcgPSBzdHIuc3Vic3RyaW5nKGksIGkgKyBNQUdOSVRVREVfRElHSVRTKTtcbiAgICB2YXIgbWFnbml0dWRlID0gcGFyc2VJbnQobWFnQXNTdHJpbmcsIDEwKSArIE1JTl9NQUdOSVRVREU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobmVnKSB7XG4gICAgICBtYWduaXR1ZGUgPSAtbWFnbml0dWRlO1xuICAgIH1cbiAgICBpICs9IE1BR05JVFVERV9ESUdJVFM7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHZhciBjaCA9IHN0cltpXTtcbiAgICAgIGlmIChjaCA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbnVtQXNTdHJpbmcgKz0gY2g7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIG51bUFzU3RyaW5nID0gbnVtQXNTdHJpbmcuc3BsaXQoJy4nKTtcbiAgICBpZiAobnVtQXNTdHJpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgICBudW0gPSBwYXJzZUludChudW1Bc1N0cmluZywgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgbnVtID0gcGFyc2VGbG9hdChudW1Bc1N0cmluZ1swXSArICcuJyArIG51bUFzU3RyaW5nWzFdKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobmVnKSB7XG4gICAgICBudW0gPSBudW0gLSAxMDtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobWFnbml0dWRlICE9PSAwKSB7XG4gICAgICAvLyBwYXJzZUZsb2F0IGlzIG1vcmUgcmVsaWFibGUgdGhhbiBwb3cgZHVlIHRvIHJvdW5kaW5nIGVycm9yc1xuICAgICAgLy8gZS5nLiBOdW1iZXIuTUFYX1ZBTFVFIHdvdWxkIHJldHVybiBJbmZpbml0eSBpZiB3ZSBkaWRcbiAgICAgIC8vIG51bSAqIE1hdGgucG93KDEwLCBtYWduaXR1ZGUpO1xuICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0gKyAnZScgKyBtYWduaXR1ZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge251bTogbnVtLCBsZW5ndGggOiBpIC0gb3JpZ2luYWxJZHh9O1xufVxuXG4vLyBtb3ZlIHVwIHRoZSBzdGFjayB3aGlsZSBwYXJzaW5nXG4vLyB0aGlzIGZ1bmN0aW9uIG1vdmVkIG91dHNpZGUgb2YgcGFyc2VJbmRleGFibGVTdHJpbmcgZm9yIHBlcmZvcm1hbmNlXG5mdW5jdGlvbiBwb3Aoc3RhY2ssIG1ldGFTdGFjaykge1xuICB2YXIgb2JqID0gc3RhY2sucG9wKCk7XG5cbiAgaWYgKG1ldGFTdGFjay5sZW5ndGgpIHtcbiAgICB2YXIgbGFzdE1ldGFFbGVtZW50ID0gbWV0YVN0YWNrW21ldGFTdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAob2JqID09PSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudCkge1xuICAgICAgLy8gcG9wcGluZyBhIG1ldGEtZWxlbWVudCwgZS5nLiBhbiBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgYW5vdGhlciBvYmplY3RcbiAgICAgIG1ldGFTdGFjay5wb3AoKTtcbiAgICAgIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIHZhciBlbGVtZW50ID0gbGFzdE1ldGFFbGVtZW50LmVsZW1lbnQ7XG4gICAgdmFyIGxhc3RFbGVtZW50SW5kZXggPSBsYXN0TWV0YUVsZW1lbnQuaW5kZXg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQucHVzaChvYmopO1xuICAgIH0gZWxzZSBpZiAobGFzdEVsZW1lbnRJbmRleCA9PT0gc3RhY2subGVuZ3RoIC0gMikgeyAvLyBvYmogd2l0aCBrZXkrdmFsdWVcbiAgICAgIHZhciBrZXkgPSBzdGFjay5wb3AoKTtcbiAgICAgIGVsZW1lbnRba2V5XSA9IG9iajtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhY2sucHVzaChvYmopOyAvLyBvYmogd2l0aCBrZXkgb25seVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUluZGV4YWJsZVN0cmluZyhzdHIpIHtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBtZXRhU3RhY2sgPSBbXTsgLy8gc3RhY2sgZm9yIGFycmF5cyBhbmQgb2JqZWN0c1xuICB2YXIgaSA9IDA7XG5cbiAgLyplc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiBbXCJlcnJvclwiLCB7IFwiY2hlY2tMb29wc1wiOiBmYWxzZSB9XSovXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIGNvbGxhdGlvbkluZGV4ID0gc3RyW2krK107XG4gICAgaWYgKGNvbGxhdGlvbkluZGV4ID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9wKHN0YWNrLCBtZXRhU3RhY2spO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoIChjb2xsYXRpb25JbmRleCkge1xuICAgICAgY2FzZSAnMSc6XG4gICAgICAgIHN0YWNrLnB1c2gobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMic6XG4gICAgICAgIHN0YWNrLnB1c2goc3RyW2ldID09PSAnMScpO1xuICAgICAgICBpKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMyc6XG4gICAgICAgIHZhciBwYXJzZWROdW0gPSBwYXJzZU51bWJlcihzdHIsIGkpO1xuICAgICAgICBzdGFjay5wdXNoKHBhcnNlZE51bS5udW0pO1xuICAgICAgICBpICs9IHBhcnNlZE51bS5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnNCc6XG4gICAgICAgIHZhciBwYXJzZWRTdHIgPSAnJztcbiAgICAgICAgLyplc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiBbXCJlcnJvclwiLCB7IFwiY2hlY2tMb29wc1wiOiBmYWxzZSB9XSovXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdmFyIGNoID0gc3RyW2ldO1xuICAgICAgICAgIGlmIChjaCA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyc2VkU3RyICs9IGNoO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBwZXJmb3JtIHRoZSByZXZlcnNlIG9mIHRoZSBvcmRlci1wcmVzZXJ2aW5nIHJlcGxhY2VtZW50XG4gICAgICAgIC8vIGFsZ29yaXRobSAoc2VlIGFib3ZlKVxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHBhcnNlZFN0ciA9IHBhcnNlZFN0ci5yZXBsYWNlKC9cXHUwMDAxXFx1MDAwMS9nLCAnXFx1MDAwMCcpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDFcXHUwMDAyL2csICdcXHUwMDAxJylcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMlxcdTAwMDIvZywgJ1xcdTAwMDInKTtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHN0YWNrLnB1c2gocGFyc2VkU3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc1JzpcbiAgICAgICAgdmFyIGFycmF5RWxlbWVudCA9IHsgZWxlbWVudDogW10sIGluZGV4OiBzdGFjay5sZW5ndGggfTtcbiAgICAgICAgc3RhY2sucHVzaChhcnJheUVsZW1lbnQuZWxlbWVudCk7XG4gICAgICAgIG1ldGFTdGFjay5wdXNoKGFycmF5RWxlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnNic6XG4gICAgICAgIHZhciBvYmpFbGVtZW50ID0geyBlbGVtZW50OiB7fSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKG9iakVsZW1lbnQuZWxlbWVudCk7XG4gICAgICAgIG1ldGFTdGFjay5wdXNoKG9iakVsZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2JhZCBjb2xsYXRpb25JbmRleCBvciB1bmV4cGVjdGVkbHkgcmVhY2hlZCBlbmQgb2YgaW5wdXQ6ICcgK1xuICAgICAgICAgICAgY29sbGF0aW9uSW5kZXgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcnJheUNvbGxhdGUoYSwgYikge1xuICB2YXIgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBzb3J0ID0gY29sbGF0ZShhW2ldLCBiW2ldKTtcbiAgICBpZiAoc29ydCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAoYS5sZW5ndGggPT09IGIubGVuZ3RoKSA/IDAgOlxuICAgIChhLmxlbmd0aCA+IGIubGVuZ3RoKSA/IDEgOiAtMTtcbn1cbmZ1bmN0aW9uIHN0cmluZ0NvbGxhdGUoYSwgYikge1xuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYWxlaGFydmV5L3BvdWNoZGIvaXNzdWVzLzQwXG4gIC8vIFRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENvdWNoREIgaW1wbGVtZW50YXRpb24sIGJ1dCBpdHMgdGhlXG4gIC8vIGJlc3Qgd2UgY2FuIGRvIGZvciBub3dcbiAgcmV0dXJuIChhID09PSBiKSA/IDAgOiAoKGEgPiBiKSA/IDEgOiAtMSk7XG59XG5mdW5jdGlvbiBvYmplY3RDb2xsYXRlKGEsIGIpIHtcbiAgdmFyIGFrID0gT2JqZWN0LmtleXMoYSksIGJrID0gT2JqZWN0LmtleXMoYik7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihhay5sZW5ndGgsIGJrLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAvLyBGaXJzdCBzb3J0IHRoZSBrZXlzXG4gICAgdmFyIHNvcnQgPSBjb2xsYXRlKGFrW2ldLCBia1tpXSk7XG4gICAgaWYgKHNvcnQgIT09IDApIHtcbiAgICAgIHJldHVybiBzb3J0O1xuICAgIH1cbiAgICAvLyBpZiB0aGUga2V5cyBhcmUgZXF1YWwgc29ydCB0aGUgdmFsdWVzXG4gICAgc29ydCA9IGNvbGxhdGUoYVtha1tpXV0sIGJbYmtbaV1dKTtcbiAgICBpZiAoc29ydCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuXG4gIH1cbiAgcmV0dXJuIChhay5sZW5ndGggPT09IGJrLmxlbmd0aCkgPyAwIDpcbiAgICAoYWsubGVuZ3RoID4gYmsubGVuZ3RoKSA/IDEgOiAtMTtcbn1cbi8vIFRoZSBjb2xsYXRpb24gaXMgZGVmaW5lZCBieSBlcmxhbmdzIG9yZGVyZWQgdGVybXNcbi8vIHRoZSBhdG9tcyBudWxsLCB0cnVlLCBmYWxzZSBjb21lIGZpcnN0LCB0aGVuIG51bWJlcnMsIHN0cmluZ3MsXG4vLyBhcnJheXMsIHRoZW4gb2JqZWN0c1xuLy8gbnVsbC91bmRlZmluZWQvTmFOL0luZmluaXR5Ly1JbmZpbml0eSBhcmUgYWxsIGNvbnNpZGVyZWQgbnVsbFxuZnVuY3Rpb24gY29sbGF0aW9uSW5kZXgoeCkge1xuICB2YXIgaWQgPSBbJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ3N0cmluZycsICdvYmplY3QnXTtcbiAgdmFyIGlkeCA9IGlkLmluZGV4T2YodHlwZW9mIHgpO1xuICAvL2ZhbHNlIGlmIC0xIG90aGVyd2lzZSB0cnVlLCBidXQgZmFzdCEhISExXG4gIGlmICh+aWR4KSB7XG4gICAgaWYgKHggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgcmV0dXJuIDU7XG4gICAgfVxuICAgIHJldHVybiBpZHggPCAzID8gKGlkeCArIDIpIDogKGlkeCArIDMpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIDU7XG4gIH1cbn1cblxuLy8gY29udmVyc2lvbjpcbi8vIHggeXl5IHp6Li4uenpcbi8vIHggPSAwIGZvciBuZWdhdGl2ZSwgMSBmb3IgMCwgMiBmb3IgcG9zaXRpdmVcbi8vIHkgPSBleHBvbmVudCAoZm9yIG5lZ2F0aXZlIG51bWJlcnMgbmVnYXRlZCkgbW92ZWQgc28gdGhhdCBpdCdzID49IDBcbi8vIHogPSBtYW50aXNzZVxuZnVuY3Rpb24gbnVtVG9JbmRleGFibGVTdHJpbmcobnVtKSB7XG5cbiAgaWYgKG51bSA9PT0gMCkge1xuICAgIHJldHVybiAnMSc7XG4gIH1cblxuICAvLyBjb252ZXJ0IG51bWJlciB0byBleHBvbmVudGlhbCBmb3JtYXQgZm9yIGVhc2llciBhbmRcbiAgLy8gbW9yZSBzdWNjaW5jdCBzdHJpbmcgc29ydGluZ1xuICB2YXIgZXhwRm9ybWF0ID0gbnVtLnRvRXhwb25lbnRpYWwoKS5zcGxpdCgvZVxcKz8vKTtcbiAgdmFyIG1hZ25pdHVkZSA9IHBhcnNlSW50KGV4cEZvcm1hdFsxXSwgMTApO1xuXG4gIHZhciBuZWcgPSBudW0gPCAwO1xuXG4gIHZhciByZXN1bHQgPSBuZWcgPyAnMCcgOiAnMic7XG5cbiAgLy8gZmlyc3Qgc29ydCBieSBtYWduaXR1ZGVcbiAgLy8gaXQncyBlYXNpZXIgaWYgYWxsIG1hZ25pdHVkZXMgYXJlIHBvc2l0aXZlXG4gIHZhciBtYWdGb3JDb21wYXJpc29uID0gKChuZWcgPyAtbWFnbml0dWRlIDogbWFnbml0dWRlKSAtIE1JTl9NQUdOSVRVREUpO1xuICB2YXIgbWFnU3RyaW5nID0gcGFkTGVmdCgobWFnRm9yQ29tcGFyaXNvbikudG9TdHJpbmcoKSwgJzAnLCBNQUdOSVRVREVfRElHSVRTKTtcblxuICByZXN1bHQgKz0gU0VQICsgbWFnU3RyaW5nO1xuXG4gIC8vIHRoZW4gc29ydCBieSB0aGUgZmFjdG9yXG4gIHZhciBmYWN0b3IgPSBNYXRoLmFicyhwYXJzZUZsb2F0KGV4cEZvcm1hdFswXSkpOyAvLyBbMS4uMTApXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChuZWcpIHsgLy8gZm9yIG5lZ2F0aXZlIHJldmVyc2Ugb3JkZXJpbmdcbiAgICBmYWN0b3IgPSAxMCAtIGZhY3RvcjtcbiAgfVxuXG4gIHZhciBmYWN0b3JTdHIgPSBmYWN0b3IudG9GaXhlZCgyMCk7XG5cbiAgLy8gc3RyaXAgemVyb3MgZnJvbSB0aGUgZW5kXG4gIGZhY3RvclN0ciA9IGZhY3RvclN0ci5yZXBsYWNlKC9cXC4/MCskLywgJycpO1xuXG4gIHJlc3VsdCArPSBTRVAgKyBmYWN0b3JTdHI7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gY3JlYXRlIGEgY29tcGFyYXRvciBiYXNlZCBvbiB0aGUgc29ydCBvYmplY3RcbmZ1bmN0aW9uIGNyZWF0ZUZpZWxkU29ydGVyKHNvcnQpIHtcblxuICBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoZG9jKSB7XG4gICAgcmV0dXJuIHNvcnQubWFwKGZ1bmN0aW9uIChzb3J0aW5nKSB7XG4gICAgICB2YXIgZmllbGROYW1lID0gZ2V0S2V5KHNvcnRpbmcpO1xuICAgICAgdmFyIHBhcnNlZEZpZWxkID0gcGFyc2VGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgdmFyIGRvY0ZpZWxkVmFsdWUgPSBnZXRGaWVsZEZyb21Eb2MoZG9jLCBwYXJzZWRGaWVsZCk7XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoYVJvdywgYlJvdykge1xuICAgIHZhciBhRmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoYVJvdy5kb2MpO1xuICAgIHZhciBiRmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoYlJvdy5kb2MpO1xuICAgIHZhciBjb2xsYXRpb24gPSBjb2xsYXRlKGFGaWVsZFZhbHVlcywgYkZpZWxkVmFsdWVzKTtcbiAgICBpZiAoY29sbGF0aW9uICE9PSAwKSB7XG4gICAgICByZXR1cm4gY29sbGF0aW9uO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHdoYXQgbWFuZ28gc2VlbXMgdG8gZG9cbiAgICByZXR1cm4gY29tcGFyZSQxKGFSb3cuZG9jLl9pZCwgYlJvdy5kb2MuX2lkKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmlsdGVySW5NZW1vcnlGaWVsZHMocm93cywgcmVxdWVzdERlZiwgaW5NZW1vcnlGaWVsZHMpIHtcbiAgcm93cyA9IHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICByZXR1cm4gcm93RmlsdGVyKHJvdy5kb2MsIHJlcXVlc3REZWYuc2VsZWN0b3IsIGluTWVtb3J5RmllbGRzKTtcbiAgfSk7XG5cbiAgaWYgKHJlcXVlc3REZWYuc29ydCkge1xuICAgIC8vIGluLW1lbW9yeSBzb3J0XG4gICAgdmFyIGZpZWxkU29ydGVyID0gY3JlYXRlRmllbGRTb3J0ZXIocmVxdWVzdERlZi5zb3J0KTtcbiAgICByb3dzID0gcm93cy5zb3J0KGZpZWxkU29ydGVyKTtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3REZWYuc29ydFswXSAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgZ2V0VmFsdWUocmVxdWVzdERlZi5zb3J0WzBdKSA9PT0gJ2Rlc2MnKSB7XG4gICAgICByb3dzID0gcm93cy5yZXZlcnNlKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCdsaW1pdCcgaW4gcmVxdWVzdERlZiB8fCAnc2tpcCcgaW4gcmVxdWVzdERlZikge1xuICAgIC8vIGhhdmUgdG8gZG8gdGhlIGxpbWl0IGluLW1lbW9yeVxuICAgIHZhciBza2lwID0gcmVxdWVzdERlZi5za2lwIHx8IDA7XG4gICAgdmFyIGxpbWl0ID0gKCdsaW1pdCcgaW4gcmVxdWVzdERlZiA/IHJlcXVlc3REZWYubGltaXQgOiByb3dzLmxlbmd0aCkgKyBza2lwO1xuICAgIHJvd3MgPSByb3dzLnNsaWNlKHNraXAsIGxpbWl0KTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gcm93RmlsdGVyKGRvYywgc2VsZWN0b3IsIGluTWVtb3J5RmllbGRzKSB7XG4gIHJldHVybiBpbk1lbW9yeUZpZWxkcy5ldmVyeShmdW5jdGlvbiAoZmllbGQpIHtcbiAgICB2YXIgbWF0Y2hlciA9IHNlbGVjdG9yW2ZpZWxkXTtcbiAgICB2YXIgcGFyc2VkRmllbGQgPSBwYXJzZUZpZWxkKGZpZWxkKTtcbiAgICB2YXIgZG9jRmllbGRWYWx1ZSA9IGdldEZpZWxkRnJvbURvYyhkb2MsIHBhcnNlZEZpZWxkKTtcbiAgICBpZiAoaXNDb21iaW5hdGlvbmFsRmllbGQoZmllbGQpKSB7XG4gICAgICByZXR1cm4gbWF0Y2hDb21pbmF0aW9uYWxTZWxlY3RvcihmaWVsZCwgbWF0Y2hlciwgZG9jKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hTZWxlY3RvcihtYXRjaGVyLCBkb2MsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoU2VsZWN0b3IobWF0Y2hlciwgZG9jLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICBpZiAoIW1hdGNoZXIpIHtcbiAgICAvLyBubyBmaWx0ZXJpbmcgbmVjZXNzYXJ5OyB0aGlzIGZpZWxkIGlzIGp1c3QgbmVlZGVkIGZvciBzb3J0aW5nXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBpcyBtYXRjaGVyIGFuIG9iamVjdCwgaWYgc28gY29udGludWUgcmVjdXJzaW9uXG4gIGlmICh0eXBlb2YgbWF0Y2hlciA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWF0Y2hlcikuZXZlcnkoZnVuY3Rpb24gKG1heWJlVXNlck9wZXJhdG9yKSB7XG4gICAgICB2YXIgdXNlclZhbHVlID0gbWF0Y2hlclsgbWF5YmVVc2VyT3BlcmF0b3IgXTtcbiAgICAgIC8vIGV4cGxpY2l0IG9wZXJhdG9yXG4gICAgICBpZiAobWF5YmVVc2VyT3BlcmF0b3IuaW5kZXhPZihcIiRcIikgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoKG1heWJlVXNlck9wZXJhdG9yLCBkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHN1YlBhcnNlZEZpZWxkID0gcGFyc2VGaWVsZChtYXliZVVzZXJPcGVyYXRvcik7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRvY0ZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHR5cGVvZiB1c2VyVmFsdWUgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBzdWJQYXJzZWRGaWVsZC5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIG9yIGdldEZpZWxkRnJvbURvYyB3aWxsIHRocm93XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN1YkRvY0ZpZWxkVmFsdWUgPSBnZXRGaWVsZEZyb21Eb2MoZG9jRmllbGRWYWx1ZSwgc3ViUGFyc2VkRmllbGQpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdXNlclZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gZmllbGQgdmFsdWUgaXMgYW4gb2JqZWN0IHRoYXQgbWlnaHQgY29udGFpbiBtb3JlIG9wZXJhdG9yc1xuICAgICAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgc3ViRG9jRmllbGRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbXBsaWNpdCBvcGVyYXRvclxuICAgICAgICByZXR1cm4gbWF0Y2goXCIkZXFcIiwgZG9jLCB1c2VyVmFsdWUsIHN1YlBhcnNlZEZpZWxkLCBzdWJEb2NGaWVsZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIG5vIG1vcmUgZGVwdGgsIE5vIG5lZWQgdG8gcmVjdXJzZSBmdXJ0aGVyXG4gIHJldHVybiBtYXRjaGVyID09PSBkb2NGaWVsZFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtYXRjaENvbWluYXRpb25hbFNlbGVjdG9yKGZpZWxkLCBtYXRjaGVyLCBkb2MpIHtcblxuICBpZiAoZmllbGQgPT09ICckb3InKSB7XG4gICAgcmV0dXJuIG1hdGNoZXIuc29tZShmdW5jdGlvbiAob3JNYXRjaGVycykge1xuICAgICAgcmV0dXJuIHJvd0ZpbHRlcihkb2MsIG9yTWF0Y2hlcnMsIE9iamVjdC5rZXlzKG9yTWF0Y2hlcnMpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChmaWVsZCA9PT0gJyRub3QnKSB7XG4gICAgcmV0dXJuICFyb3dGaWx0ZXIoZG9jLCBtYXRjaGVyLCBPYmplY3Qua2V5cyhtYXRjaGVyKSk7XG4gIH1cblxuICAvL2Akbm9yYFxuICByZXR1cm4gIW1hdGNoZXIuZmluZChmdW5jdGlvbiAob3JNYXRjaGVycykge1xuICAgIHJldHVybiByb3dGaWx0ZXIoZG9jLCBvck1hdGNoZXJzLCBPYmplY3Qua2V5cyhvck1hdGNoZXJzKSk7XG4gIH0pO1xuXG59XG5cbmZ1bmN0aW9uIG1hdGNoKHVzZXJPcGVyYXRvciwgZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gIGlmICghbWF0Y2hlcnNbdXNlck9wZXJhdG9yXSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIG9wZXJhdG9yIFwiJyArIHVzZXJPcGVyYXRvciArXG4gICAgICAnXCIgLSBzaG91bGQgYmUgb25lIG9mICRlcSwgJGx0ZSwgJGx0LCAkZ3QsICRndGUsICRleGlzdHMsICRuZSwgJGluLCAnICtcbiAgICAgICckbmluLCAkc2l6ZSwgJG1vZCwgJHJlZ2V4LCAkZWxlbU1hdGNoLCAkdHlwZSwgJGFsbE1hdGNoIG9yICRhbGwnKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlcnNbdXNlck9wZXJhdG9yXShkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgZG9jRmllbGRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jRmllbGRWYWx1ZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgZG9jRmllbGRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIG1vZEZpZWxkKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICBpZiAodHlwZW9mIGRvY0ZpZWxkVmFsdWUgIT09IFwibnVtYmVyXCIgfHxcbiAgICBwYXJzZUludChkb2NGaWVsZFZhbHVlLCAxMCkgIT09IGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZGl2aXNvciA9IHVzZXJWYWx1ZVswXTtcbiAgdmFyIG1vZCA9IHVzZXJWYWx1ZVsxXTtcblxuICByZXR1cm4gZG9jRmllbGRWYWx1ZSAlIGRpdmlzb3IgPT09IG1vZDtcbn1cblxuZnVuY3Rpb24gYXJyYXlDb250YWluc1ZhbHVlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICByZXR1cm4gdXNlclZhbHVlLnNvbWUoZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmIChkb2NGaWVsZFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLnNvbWUoZnVuY3Rpb24gKGRvY0ZpZWxkVmFsdWVJdGVtKSB7XG4gICAgICAgIHJldHVybiBjb2xsYXRlKHZhbCwgZG9jRmllbGRWYWx1ZUl0ZW0pID09PSAwO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbGxhdGUodmFsLCBkb2NGaWVsZFZhbHVlKSA9PT0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q29udGFpbnNBbGxWYWx1ZXMoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIHJldHVybiB1c2VyVmFsdWUuZXZlcnkoZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLnNvbWUoZnVuY3Rpb24gKGRvY0ZpZWxkVmFsdWVJdGVtKSB7XG4gICAgICByZXR1cm4gY29sbGF0ZSh2YWwsIGRvY0ZpZWxkVmFsdWVJdGVtKSA9PT0gMDtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFycmF5U2l6ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIHtcbiAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUubGVuZ3RoID09PSB1c2VyVmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlZ2V4TWF0Y2goZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIHZhciByZSA9IG5ldyBSZWdFeHAodXNlclZhbHVlKTtcblxuICByZXR1cm4gcmUudGVzdChkb2NGaWVsZFZhbHVlKTtcbn1cblxuZnVuY3Rpb24gdHlwZU1hdGNoKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuXG4gIHN3aXRjaCAodXNlclZhbHVlKSB7XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZSA9PT0gbnVsbDtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB0eXBlb2YgKGRvY0ZpZWxkVmFsdWUpID09PSAnYm9vbGVhbic7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiB0eXBlb2YgKGRvY0ZpZWxkVmFsdWUpID09PSAnbnVtYmVyJztcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHR5cGVvZiAoZG9jRmllbGRWYWx1ZSkgPT09ICdzdHJpbmcnO1xuICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlIGluc3RhbmNlb2YgQXJyYXk7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHJldHVybiAoe30pLnRvU3RyaW5nLmNhbGwoZG9jRmllbGRWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuICB9XG59XG5cbnZhciBtYXRjaGVycyA9IHtcblxuICAnJGVsZW1NYXRjaCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZG9jRmllbGRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZG9jRmllbGRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRvY0ZpZWxkVmFsdWVbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHJvd0ZpbHRlcih2YWwsIHVzZXJWYWx1ZSwgT2JqZWN0LmtleXModXNlclZhbHVlKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgdmFsKTtcbiAgICB9KTtcbiAgfSxcblxuICAnJGFsbE1hdGNoJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkb2NGaWVsZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKGRvY0ZpZWxkVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkb2NGaWVsZFZhbHVlWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUuZXZlcnkoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gcm93RmlsdGVyKHZhbCwgdXNlclZhbHVlLCBPYmplY3Qua2V5cyh1c2VyVmFsdWUpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLmV2ZXJ5KGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgdmFsKTtcbiAgICB9KTtcbiAgfSxcblxuICAnJGVxJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA9PT0gMDtcbiAgfSxcblxuICAnJGd0ZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPj0gMDtcbiAgfSxcblxuICAnJGd0JzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA+IDA7XG4gIH0sXG5cbiAgJyRsdGUnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSkgJiYgY29sbGF0ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIDw9IDA7XG4gIH0sXG5cbiAgJyRsdCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPCAwO1xuICB9LFxuXG4gICckZXhpc3RzJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIC8vYSBmaWVsZCB0aGF0IGlzIG51bGwgaXMgc3RpbGwgY29uc2lkZXJlZCB0byBleGlzdFxuICAgIGlmICh1c2VyVmFsdWUpIHtcbiAgICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiAhZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKTtcbiAgfSxcblxuICAnJG1vZCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiYgbW9kRmllbGQoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJG5lJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiB1c2VyVmFsdWUuZXZlcnkoZnVuY3Rpb24gKG5lVmFsdWUpIHtcbiAgICAgIHJldHVybiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIG5lVmFsdWUpICE9PSAwO1xuICAgIH0pO1xuICB9LFxuICAnJGluJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJiBhcnJheUNvbnRhaW5zVmFsdWUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJG5pbic6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiYgIWFycmF5Q29udGFpbnNWYWx1ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckc2l6ZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoZG9jRmllbGRWYWx1ZSkgJiZcbiAgICAgIGFycmF5U2l6ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckYWxsJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRvY0ZpZWxkVmFsdWUpICYmIGFycmF5Q29udGFpbnNBbGxWYWx1ZXMoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJHJlZ2V4JzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJlxuICAgICAgdHlwZW9mIGRvY0ZpZWxkVmFsdWUgPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgdXNlclZhbHVlLmV2ZXJ5KGZ1bmN0aW9uIChyZWdleFZhbHVlKSB7XG4gICAgICAgIHJldHVybiByZWdleE1hdGNoKGRvY0ZpZWxkVmFsdWUsIHJlZ2V4VmFsdWUpO1xuICAgICAgfSk7XG4gIH0sXG5cbiAgJyR0eXBlJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiB0eXBlTWF0Y2goZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfVxufTtcblxuLy8gcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGRvYyBtYXRjaGVzIHRoZSBzdXBwbGllZCBzZWxlY3RvclxuZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yKGRvYywgc2VsZWN0b3IpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICdvYmplY3QnKSB7XG4gICAgLy8gbWF0Y2ggdGhlIENvdWNoREIgZXJyb3IgbWVzc2FnZVxuICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0b3IgZXJyb3I6IGV4cGVjdGVkIGEgSlNPTiBvYmplY3QnKTtcbiAgfVxuXG4gIHNlbGVjdG9yID0gbWFzc2FnZVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgdmFyIHJvdyA9IHtcbiAgICAnZG9jJzogZG9jXG4gIH07XG5cbiAgdmFyIHJvd3NNYXRjaGVkID0gZmlsdGVySW5NZW1vcnlGaWVsZHMoW3Jvd10sIHsgJ3NlbGVjdG9yJzogc2VsZWN0b3IgfSwgT2JqZWN0LmtleXMoc2VsZWN0b3IpKTtcbiAgcmV0dXJuIHJvd3NNYXRjaGVkICYmIHJvd3NNYXRjaGVkLmxlbmd0aCA9PT0gMTtcbn1cblxuZnVuY3Rpb24gZXZhbEZpbHRlcihpbnB1dCkge1xuICByZXR1cm4gc2NvcGVFdmFsKCdcInVzZSBzdHJpY3RcIjtcXG5yZXR1cm4gJyArIGlucHV0ICsgJzsnLCB7fSk7XG59XG5cbmZ1bmN0aW9uIGV2YWxWaWV3KGlucHV0KSB7XG4gIHZhciBjb2RlID0gW1xuICAgICdyZXR1cm4gZnVuY3Rpb24oZG9jKSB7JyxcbiAgICAnICBcInVzZSBzdHJpY3RcIjsnLFxuICAgICcgIHZhciBlbWl0dGVkID0gZmFsc2U7JyxcbiAgICAnICB2YXIgZW1pdCA9IGZ1bmN0aW9uIChhLCBiKSB7JyxcbiAgICAnICAgIGVtaXR0ZWQgPSB0cnVlOycsXG4gICAgJyAgfTsnLFxuICAgICcgIHZhciB2aWV3ID0gJyArIGlucHV0ICsgJzsnLFxuICAgICcgIHZpZXcoZG9jKTsnLFxuICAgICcgIGlmIChlbWl0dGVkKSB7JyxcbiAgICAnICAgIHJldHVybiB0cnVlOycsXG4gICAgJyAgfScsXG4gICAgJ307J1xuICBdLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBzY29wZUV2YWwoY29kZSwge30pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZShvcHRzLCBjYWxsYmFjaykge1xuICBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgIGlmIChvcHRzLmZpbHRlciAmJiBvcHRzLmZpbHRlciAhPT0gJ19zZWxlY3RvcicpIHtcbiAgICAgIHZhciBmaWx0ZXJOYW1lID0gdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnc3RyaW5nJyA/XG4gICAgICAgIG9wdHMuZmlsdGVyIDogJ2Z1bmN0aW9uJztcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ3NlbGVjdG9yIGludmFsaWQgZm9yIGZpbHRlciBcIicgKyBmaWx0ZXJOYW1lICsgJ1wiJykpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjaygpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUob3B0cykge1xuICBpZiAob3B0cy52aWV3ICYmICFvcHRzLmZpbHRlcikge1xuICAgIG9wdHMuZmlsdGVyID0gJ192aWV3JztcbiAgfVxuXG4gIGlmIChvcHRzLnNlbGVjdG9yICYmICFvcHRzLmZpbHRlcikge1xuICAgIG9wdHMuZmlsdGVyID0gJ19zZWxlY3Rvcic7XG4gIH1cblxuICBpZiAob3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnc3RyaW5nJykge1xuICAgIGlmIChvcHRzLmZpbHRlciA9PT0gJ192aWV3Jykge1xuICAgICAgb3B0cy52aWV3ID0gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMudmlldyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMuZmlsdGVyID0gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMuZmlsdGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkRmlsdGVyKGNoYW5nZXNIYW5kbGVyLCBvcHRzKSB7XG4gIHJldHVybiBvcHRzLmZpbHRlciAmJiB0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdzdHJpbmcnICYmXG4gICAgIW9wdHMuZG9jX2lkcyAmJiAhaXNSZW1vdGUoY2hhbmdlc0hhbmRsZXIuZGIpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXIoY2hhbmdlc0hhbmRsZXIsIG9wdHMpIHtcbiAgdmFyIGNhbGxiYWNrID0gb3B0cy5jb21wbGV0ZTtcbiAgaWYgKG9wdHMuZmlsdGVyID09PSAnX3ZpZXcnKSB7XG4gICAgaWYgKCFvcHRzLnZpZXcgfHwgdHlwZW9mIG9wdHMudmlldyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihCQURfUkVRVUVTVCxcbiAgICAgICAgJ2B2aWV3YCBmaWx0ZXIgcGFyYW1ldGVyIG5vdCBmb3VuZCBvciBpbnZhbGlkLicpO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIC8vIGZldGNoIGEgdmlldyBmcm9tIGEgZGVzaWduIGRvYywgbWFrZSBpdCBiZWhhdmUgbGlrZSBhIGZpbHRlclxuICAgIHZhciB2aWV3TmFtZSA9IHBhcnNlRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMudmlldyk7XG4gICAgY2hhbmdlc0hhbmRsZXIuZGIuZ2V0KCdfZGVzaWduLycgKyB2aWV3TmFtZVswXSwgZnVuY3Rpb24gKGVyciwgZGRvYykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlc0hhbmRsZXIuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpKTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXBGdW4gPSBkZG9jICYmIGRkb2Mudmlld3MgJiYgZGRvYy52aWV3c1t2aWV3TmFtZVsxXV0gJiZcbiAgICAgICAgZGRvYy52aWV3c1t2aWV3TmFtZVsxXV0ubWFwO1xuICAgICAgaWYgKCFtYXBGdW4pIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLFxuICAgICAgICAgIChkZG9jLnZpZXdzID8gJ21pc3NpbmcganNvbiBrZXk6ICcgKyB2aWV3TmFtZVsxXSA6XG4gICAgICAgICAgICAnbWlzc2luZyBqc29uIGtleTogdmlld3MnKSkpO1xuICAgICAgfVxuICAgICAgb3B0cy5maWx0ZXIgPSBldmFsVmlldyhtYXBGdW4pO1xuICAgICAgY2hhbmdlc0hhbmRsZXIuZG9DaGFuZ2VzKG9wdHMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKG9wdHMuc2VsZWN0b3IpIHtcbiAgICBvcHRzLmZpbHRlciA9IGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgIHJldHVybiBtYXRjaGVzU2VsZWN0b3IoZG9jLCBvcHRzLnNlbGVjdG9yKTtcbiAgICB9O1xuICAgIGNoYW5nZXNIYW5kbGVyLmRvQ2hhbmdlcyhvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBmZXRjaCBhIGZpbHRlciBmcm9tIGEgZGVzaWduIGRvY1xuICAgIHZhciBmaWx0ZXJOYW1lID0gcGFyc2VEZXNpZ25Eb2NGdW5jdGlvbk5hbWUob3B0cy5maWx0ZXIpO1xuICAgIGNoYW5nZXNIYW5kbGVyLmRiLmdldCgnX2Rlc2lnbi8nICsgZmlsdGVyTmFtZVswXSwgZnVuY3Rpb24gKGVyciwgZGRvYykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlc0hhbmRsZXIuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpKTtcbiAgICAgIH1cbiAgICAgIHZhciBmaWx0ZXJGdW4gPSBkZG9jICYmIGRkb2MuZmlsdGVycyAmJiBkZG9jLmZpbHRlcnNbZmlsdGVyTmFtZVsxXV07XG4gICAgICBpZiAoIWZpbHRlckZ1bikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsXG4gICAgICAgICAgKChkZG9jICYmIGRkb2MuZmlsdGVycykgPyAnbWlzc2luZyBqc29uIGtleTogJyArIGZpbHRlck5hbWVbMV1cbiAgICAgICAgICAgIDogJ21pc3NpbmcganNvbiBrZXk6IGZpbHRlcnMnKSkpO1xuICAgICAgfVxuICAgICAgb3B0cy5maWx0ZXIgPSBldmFsRmlsdGVyKGZpbHRlckZ1bik7XG4gICAgICBjaGFuZ2VzSGFuZGxlci5kb0NoYW5nZXMob3B0cyk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlDaGFuZ2VzRmlsdGVyUGx1Z2luKFBvdWNoREIpIHtcbiAgUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbiA9IHtcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgbm9ybWFsaXplOiBub3JtYWxpemUsXG4gICAgc2hvdWxkRmlsdGVyOiBzaG91bGRGaWx0ZXIsXG4gICAgZmlsdGVyOiBmaWx0ZXJcbiAgfTtcbn1cblxuLy8gVE9ETzogcmVtb3ZlIGZyb20gcG91Y2hkYi1jb3JlIChicmVha2luZylcblBvdWNoREIucGx1Z2luKGFwcGx5Q2hhbmdlc0ZpbHRlclBsdWdpbik7XG5cblBvdWNoREIudmVyc2lvbiA9IHZlcnNpb247XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KGFycmF5KSB7XG4gIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgaXRlbSkge1xuICAgIG9ialtpdGVtXSA9IHRydWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufVxuLy8gTGlzdCBvZiB0b3AgbGV2ZWwgcmVzZXJ2ZWQgd29yZHMgZm9yIGRvY1xudmFyIHJlc2VydmVkV29yZHMgPSB0b09iamVjdChbXG4gICdfaWQnLFxuICAnX3JldicsXG4gICdfYWNjZXNzJyxcbiAgJ19hdHRhY2htZW50cycsXG4gICdfZGVsZXRlZCcsXG4gICdfcmV2aXNpb25zJyxcbiAgJ19yZXZzX2luZm8nLFxuICAnX2NvbmZsaWN0cycsXG4gICdfZGVsZXRlZF9jb25mbGljdHMnLFxuICAnX2xvY2FsX3NlcScsXG4gICdfcmV2X3RyZWUnLFxuICAvLyByZXBsaWNhdGlvbiBkb2N1bWVudHNcbiAgJ19yZXBsaWNhdGlvbl9pZCcsXG4gICdfcmVwbGljYXRpb25fc3RhdGUnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlX3RpbWUnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlX3JlYXNvbicsXG4gICdfcmVwbGljYXRpb25fc3RhdHMnLFxuICAvLyBTcGVjaWZpYyB0byBDb3VjaGJhc2UgU3luYyBHYXRld2F5XG4gICdfcmVtb3ZlZCdcbl0pO1xuXG4vLyBMaXN0IG9mIHJlc2VydmVkIHdvcmRzIHRoYXQgc2hvdWxkIGVuZCB1cCBpbiB0aGUgZG9jdW1lbnRcbnZhciBkYXRhV29yZHMgPSB0b09iamVjdChbXG4gICdfYWNjZXNzJyxcbiAgJ19hdHRhY2htZW50cycsXG4gIC8vIHJlcGxpY2F0aW9uIGRvY3VtZW50c1xuICAnX3JlcGxpY2F0aW9uX2lkJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0ZScsXG4gICdfcmVwbGljYXRpb25fc3RhdGVfdGltZScsXG4gICdfcmVwbGljYXRpb25fc3RhdGVfcmVhc29uJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0cydcbl0pO1xuXG5mdW5jdGlvbiBwYXJzZVJldmlzaW9uSW5mbyhyZXYpIHtcbiAgaWYgKCEvXlxcZCstLy50ZXN0KHJldikpIHtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3IoSU5WQUxJRF9SRVYpO1xuICB9XG4gIHZhciBpZHggPSByZXYuaW5kZXhPZignLScpO1xuICB2YXIgbGVmdCA9IHJldi5zdWJzdHJpbmcoMCwgaWR4KTtcbiAgdmFyIHJpZ2h0ID0gcmV2LnN1YnN0cmluZyhpZHggKyAxKTtcbiAgcmV0dXJuIHtcbiAgICBwcmVmaXg6IHBhcnNlSW50KGxlZnQsIDEwKSxcbiAgICBpZDogcmlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWFrZVJldlRyZWVGcm9tUmV2aXNpb25zKHJldmlzaW9ucywgb3B0cykge1xuICB2YXIgcG9zID0gcmV2aXNpb25zLnN0YXJ0IC0gcmV2aXNpb25zLmlkcy5sZW5ndGggKyAxO1xuXG4gIHZhciByZXZpc2lvbklkcyA9IHJldmlzaW9ucy5pZHM7XG4gIHZhciBpZHMgPSBbcmV2aXNpb25JZHNbMF0sIG9wdHMsIFtdXTtcblxuICBmb3IgKHZhciBpID0gMSwgbGVuID0gcmV2aXNpb25JZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZHMgPSBbcmV2aXNpb25JZHNbaV0sIHtzdGF0dXM6ICdtaXNzaW5nJ30sIFtpZHNdXTtcbiAgfVxuXG4gIHJldHVybiBbe1xuICAgIHBvczogcG9zLFxuICAgIGlkczogaWRzXG4gIH1dO1xufVxuXG4vLyBQcmVwcm9jZXNzIGRvY3VtZW50cywgcGFyc2UgdGhlaXIgcmV2aXNpb25zLCBhc3NpZ24gYW4gaWQgYW5kIGFcbi8vIHJldmlzaW9uIGZvciBuZXcgd3JpdGVzIHRoYXQgYXJlIG1pc3NpbmcgdGhlbSwgZXRjXG5mdW5jdGlvbiBwYXJzZURvYyhkb2MsIG5ld0VkaXRzLCBkYk9wdHMpIHtcbiAgaWYgKCFkYk9wdHMpIHtcbiAgICBkYk9wdHMgPSB7XG4gICAgICBkZXRlcm1pbmlzdGljX3JldnM6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgdmFyIG5SZXZOdW07XG4gIHZhciBuZXdSZXZJZDtcbiAgdmFyIHJldkluZm87XG4gIHZhciBvcHRzID0ge3N0YXR1czogJ2F2YWlsYWJsZSd9O1xuICBpZiAoZG9jLl9kZWxldGVkKSB7XG4gICAgb3B0cy5kZWxldGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChuZXdFZGl0cykge1xuICAgIGlmICghZG9jLl9pZCkge1xuICAgICAgZG9jLl9pZCA9IHV1aWQoKTtcbiAgICB9XG4gICAgbmV3UmV2SWQgPSByZXYkJDEoZG9jLCBkYk9wdHMuZGV0ZXJtaW5pc3RpY19yZXZzKTtcbiAgICBpZiAoZG9jLl9yZXYpIHtcbiAgICAgIHJldkluZm8gPSBwYXJzZVJldmlzaW9uSW5mbyhkb2MuX3Jldik7XG4gICAgICBpZiAocmV2SW5mby5lcnJvcikge1xuICAgICAgICByZXR1cm4gcmV2SW5mbztcbiAgICAgIH1cbiAgICAgIGRvYy5fcmV2X3RyZWUgPSBbe1xuICAgICAgICBwb3M6IHJldkluZm8ucHJlZml4LFxuICAgICAgICBpZHM6IFtyZXZJbmZvLmlkLCB7c3RhdHVzOiAnbWlzc2luZyd9LCBbW25ld1JldklkLCBvcHRzLCBbXV1dXVxuICAgICAgfV07XG4gICAgICBuUmV2TnVtID0gcmV2SW5mby5wcmVmaXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MuX3Jldl90cmVlID0gW3tcbiAgICAgICAgcG9zOiAxLFxuICAgICAgICBpZHMgOiBbbmV3UmV2SWQsIG9wdHMsIFtdXVxuICAgICAgfV07XG4gICAgICBuUmV2TnVtID0gMTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRvYy5fcmV2aXNpb25zKSB7XG4gICAgICBkb2MuX3Jldl90cmVlID0gbWFrZVJldlRyZWVGcm9tUmV2aXNpb25zKGRvYy5fcmV2aXNpb25zLCBvcHRzKTtcbiAgICAgIG5SZXZOdW0gPSBkb2MuX3JldmlzaW9ucy5zdGFydDtcbiAgICAgIG5ld1JldklkID0gZG9jLl9yZXZpc2lvbnMuaWRzWzBdO1xuICAgIH1cbiAgICBpZiAoIWRvYy5fcmV2X3RyZWUpIHtcbiAgICAgIHJldkluZm8gPSBwYXJzZVJldmlzaW9uSW5mbyhkb2MuX3Jldik7XG4gICAgICBpZiAocmV2SW5mby5lcnJvcikge1xuICAgICAgICByZXR1cm4gcmV2SW5mbztcbiAgICAgIH1cbiAgICAgIG5SZXZOdW0gPSByZXZJbmZvLnByZWZpeDtcbiAgICAgIG5ld1JldklkID0gcmV2SW5mby5pZDtcbiAgICAgIGRvYy5fcmV2X3RyZWUgPSBbe1xuICAgICAgICBwb3M6IG5SZXZOdW0sXG4gICAgICAgIGlkczogW25ld1JldklkLCBvcHRzLCBbXV1cbiAgICAgIH1dO1xuICAgIH1cbiAgfVxuXG4gIGludmFsaWRJZEVycm9yKGRvYy5faWQpO1xuXG4gIGRvYy5fcmV2ID0gblJldk51bSArICctJyArIG5ld1JldklkO1xuXG4gIHZhciByZXN1bHQgPSB7bWV0YWRhdGEgOiB7fSwgZGF0YSA6IHt9fTtcbiAgZm9yICh2YXIga2V5IGluIGRvYykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkb2MsIGtleSkpIHtcbiAgICAgIHZhciBzcGVjaWFsS2V5ID0ga2V5WzBdID09PSAnXyc7XG4gICAgICBpZiAoc3BlY2lhbEtleSAmJiAhcmVzZXJ2ZWRXb3Jkc1trZXldKSB7XG4gICAgICAgIHZhciBlcnJvciA9IGNyZWF0ZUVycm9yKERPQ19WQUxJREFUSU9OLCBrZXkpO1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gRE9DX1ZBTElEQVRJT04ubWVzc2FnZSArICc6ICcgKyBrZXk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBlbHNlIGlmIChzcGVjaWFsS2V5ICYmICFkYXRhV29yZHNba2V5XSkge1xuICAgICAgICByZXN1bHQubWV0YWRhdGFba2V5LnNsaWNlKDEpXSA9IGRvY1trZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmRhdGFba2V5XSA9IGRvY1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwYXJzZUJhc2U2NChkYXRhKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXNBdG9iKGRhdGEpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKEJBRF9BUkcsXG4gICAgICAnQXR0YWNobWVudCBpcyBub3QgYSB2YWxpZCBiYXNlNjQgc3RyaW5nJyk7XG4gICAgcmV0dXJuIHtlcnJvcjogZXJyfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwcm9jZXNzU3RyaW5nKGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIHZhciBhc0JpbmFyeSA9IHBhcnNlQmFzZTY0KGF0dC5kYXRhKTtcbiAgaWYgKGFzQmluYXJ5LmVycm9yKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGFzQmluYXJ5LmVycm9yKTtcbiAgfVxuXG4gIGF0dC5sZW5ndGggPSBhc0JpbmFyeS5sZW5ndGg7XG4gIGlmIChibG9iVHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgYXR0LmRhdGEgPSBiaW5TdHJpbmdUb0JsdWZmZXIoYXNCaW5hcnksIGF0dC5jb250ZW50X3R5cGUpO1xuICB9IGVsc2UgaWYgKGJsb2JUeXBlID09PSAnYmFzZTY0Jykge1xuICAgIGF0dC5kYXRhID0gdGhpc0J0b2EoYXNCaW5hcnkpO1xuICB9IGVsc2UgeyAvLyBiaW5hcnlcbiAgICBhdHQuZGF0YSA9IGFzQmluYXJ5O1xuICB9XG4gIGJpbmFyeU1kNShhc0JpbmFyeSwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGF0dC5kaWdlc3QgPSAnbWQ1LScgKyByZXN1bHQ7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NCbG9iKGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIGJpbmFyeU1kNShhdHQuZGF0YSwgZnVuY3Rpb24gKG1kNSkge1xuICAgIGF0dC5kaWdlc3QgPSAnbWQ1LScgKyBtZDU7XG4gICAgLy8gc2l6ZSBpcyBmb3IgYmxvYnMgKGJyb3dzZXIpLCBsZW5ndGggaXMgZm9yIGJ1ZmZlcnMgKG5vZGUpXG4gICAgYXR0Lmxlbmd0aCA9IGF0dC5kYXRhLnNpemUgfHwgYXR0LmRhdGEubGVuZ3RoIHx8IDA7XG4gICAgaWYgKGJsb2JUeXBlID09PSAnYmluYXJ5Jykge1xuICAgICAgYmxvYlRvQmluYXJ5U3RyaW5nKGF0dC5kYXRhLCBmdW5jdGlvbiAoYmluU3RyaW5nKSB7XG4gICAgICAgIGF0dC5kYXRhID0gYmluU3RyaW5nO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChibG9iVHlwZSA9PT0gJ2Jhc2U2NCcpIHtcbiAgICAgIGJsb2JUb0Jhc2U2NChhdHQuZGF0YSwgZnVuY3Rpb24gKGI2NCkge1xuICAgICAgICBhdHQuZGF0YSA9IGI2NDtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NBdHRhY2htZW50KGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIGlmIChhdHQuc3R1Yikge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG4gIGlmICh0eXBlb2YgYXR0LmRhdGEgPT09ICdzdHJpbmcnKSB7IC8vIGlucHV0IGlzIGEgYmFzZTY0IHN0cmluZ1xuICAgIHByZXByb2Nlc3NTdHJpbmcoYXR0LCBibG9iVHlwZSwgY2FsbGJhY2spO1xuICB9IGVsc2UgeyAvLyBpbnB1dCBpcyBhIGJsb2JcbiAgICBwcmVwcm9jZXNzQmxvYihhdHQsIGJsb2JUeXBlLCBjYWxsYmFjayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzKGRvY0luZm9zLCBibG9iVHlwZSwgY2FsbGJhY2spIHtcblxuICBpZiAoIWRvY0luZm9zLmxlbmd0aCkge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgdmFyIGRvY3YgPSAwO1xuICB2YXIgb3ZlcmFsbEVycjtcblxuICBkb2NJbmZvcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2NJbmZvKSB7XG4gICAgdmFyIGF0dGFjaG1lbnRzID0gZG9jSW5mby5kYXRhICYmIGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMgP1xuICAgICAgT2JqZWN0LmtleXMoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cykgOiBbXTtcbiAgICB2YXIgcmVjdiA9IDA7XG5cbiAgICBpZiAoIWF0dGFjaG1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzZWRBdHRhY2htZW50KGVycikge1xuICAgICAgb3ZlcmFsbEVyciA9IGVycjtcbiAgICAgIHJlY3YrKztcbiAgICAgIGlmIChyZWN2ID09PSBhdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMsIGtleSkpIHtcbiAgICAgICAgcHJlcHJvY2Vzc0F0dGFjaG1lbnQoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50c1trZXldLFxuICAgICAgICAgIGJsb2JUeXBlLCBwcm9jZXNzZWRBdHRhY2htZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgZG9jdisrO1xuICAgIGlmIChkb2NJbmZvcy5sZW5ndGggPT09IGRvY3YpIHtcbiAgICAgIGlmIChvdmVyYWxsRXJyKSB7XG4gICAgICAgIGNhbGxiYWNrKG92ZXJhbGxFcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRG9jKHJldkxpbWl0LCBwcmV2LCBkb2NJbmZvLCByZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgIGksIGNiLCB3cml0ZURvYywgbmV3RWRpdHMpIHtcblxuICBpZiAocmV2RXhpc3RzKHByZXYucmV2X3RyZWUsIGRvY0luZm8ubWV0YWRhdGEucmV2KSAmJiAhbmV3RWRpdHMpIHtcbiAgICByZXN1bHRzW2ldID0gZG9jSW5mbztcbiAgICByZXR1cm4gY2IoKTtcbiAgfVxuXG4gIC8vIHNvbWV0aW1lcyB0aGlzIGlzIHByZS1jYWxjdWxhdGVkLiBoaXN0b3JpY2FsbHkgbm90IGFsd2F5c1xuICB2YXIgcHJldmlvdXNXaW5uaW5nUmV2ID0gcHJldi53aW5uaW5nUmV2IHx8IHdpbm5pbmdSZXYocHJldik7XG4gIHZhciBwcmV2aW91c2x5RGVsZXRlZCA9ICdkZWxldGVkJyBpbiBwcmV2ID8gcHJldi5kZWxldGVkIDpcbiAgICBpc0RlbGV0ZWQocHJldiwgcHJldmlvdXNXaW5uaW5nUmV2KTtcbiAgdmFyIGRlbGV0ZWQgPSAnZGVsZXRlZCcgaW4gZG9jSW5mby5tZXRhZGF0YSA/IGRvY0luZm8ubWV0YWRhdGEuZGVsZXRlZCA6XG4gICAgaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEpO1xuICB2YXIgaXNSb290ID0gL14xLS8udGVzdChkb2NJbmZvLm1ldGFkYXRhLnJldik7XG5cbiAgaWYgKHByZXZpb3VzbHlEZWxldGVkICYmICFkZWxldGVkICYmIG5ld0VkaXRzICYmIGlzUm9vdCkge1xuICAgIHZhciBuZXdEb2MgPSBkb2NJbmZvLmRhdGE7XG4gICAgbmV3RG9jLl9yZXYgPSBwcmV2aW91c1dpbm5pbmdSZXY7XG4gICAgbmV3RG9jLl9pZCA9IGRvY0luZm8ubWV0YWRhdGEuaWQ7XG4gICAgZG9jSW5mbyA9IHBhcnNlRG9jKG5ld0RvYywgbmV3RWRpdHMpO1xuICB9XG5cbiAgdmFyIG1lcmdlZCA9IG1lcmdlKHByZXYucmV2X3RyZWUsIGRvY0luZm8ubWV0YWRhdGEucmV2X3RyZWVbMF0sIHJldkxpbWl0KTtcblxuICB2YXIgaW5Db25mbGljdCA9IG5ld0VkaXRzICYmICgoXG4gICAgKHByZXZpb3VzbHlEZWxldGVkICYmIGRlbGV0ZWQgJiYgbWVyZ2VkLmNvbmZsaWN0cyAhPT0gJ25ld19sZWFmJykgfHxcbiAgICAoIXByZXZpb3VzbHlEZWxldGVkICYmIG1lcmdlZC5jb25mbGljdHMgIT09ICduZXdfbGVhZicpIHx8XG4gICAgKHByZXZpb3VzbHlEZWxldGVkICYmICFkZWxldGVkICYmIG1lcmdlZC5jb25mbGljdHMgPT09ICduZXdfYnJhbmNoJykpKTtcblxuICBpZiAoaW5Db25mbGljdCkge1xuICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgIHJlc3VsdHNbaV0gPSBlcnI7XG4gICAgcmV0dXJuIGNiKCk7XG4gIH1cblxuICB2YXIgbmV3UmV2ID0gZG9jSW5mby5tZXRhZGF0YS5yZXY7XG4gIGRvY0luZm8ubWV0YWRhdGEucmV2X3RyZWUgPSBtZXJnZWQudHJlZTtcbiAgZG9jSW5mby5zdGVtbWVkUmV2cyA9IG1lcmdlZC5zdGVtbWVkUmV2cyB8fCBbXTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHByZXYucmV2X21hcCkge1xuICAgIGRvY0luZm8ubWV0YWRhdGEucmV2X21hcCA9IHByZXYucmV2X21hcDsgLy8gdXNlZCBvbmx5IGJ5IGxldmVsZGJcbiAgfVxuXG4gIC8vIHJlY2FsY3VsYXRlXG4gIHZhciB3aW5uaW5nUmV2JCQxID0gd2lubmluZ1Jldihkb2NJbmZvLm1ldGFkYXRhKTtcbiAgdmFyIHdpbm5pbmdSZXZJc0RlbGV0ZWQgPSBpc0RlbGV0ZWQoZG9jSW5mby5tZXRhZGF0YSwgd2lubmluZ1JldiQkMSk7XG5cbiAgLy8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZG9jdW1lbnRzIHRoYXQgd2VyZSBhZGRlZC9yZW1vdmVkLFxuICAvLyBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0b3RhbF9yb3dzL2RvY19jb3VudFxuICB2YXIgZGVsdGEgPSAocHJldmlvdXNseURlbGV0ZWQgPT09IHdpbm5pbmdSZXZJc0RlbGV0ZWQpID8gMCA6XG4gICAgcHJldmlvdXNseURlbGV0ZWQgPCB3aW5uaW5nUmV2SXNEZWxldGVkID8gLTEgOiAxO1xuXG4gIHZhciBuZXdSZXZJc0RlbGV0ZWQ7XG4gIGlmIChuZXdSZXYgPT09IHdpbm5pbmdSZXYkJDEpIHtcbiAgICAvLyBpZiB0aGUgbmV3IHJldiBpcyB0aGUgc2FtZSBhcyB0aGUgd2lubmluZyByZXYsIHdlIGNhbiByZXVzZSB0aGF0IHZhbHVlXG4gICAgbmV3UmV2SXNEZWxldGVkID0gd2lubmluZ1JldklzRGVsZXRlZDtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiB0aGV5J3JlIG5vdCB0aGUgc2FtZSwgdGhlbiB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlXG4gICAgbmV3UmV2SXNEZWxldGVkID0gaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEsIG5ld1Jldik7XG4gIH1cblxuICB3cml0ZURvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLCBuZXdSZXZJc0RlbGV0ZWQsXG4gICAgdHJ1ZSwgZGVsdGEsIGksIGNiKTtcbn1cblxuZnVuY3Rpb24gcm9vdElzTWlzc2luZyhkb2NJbmZvKSB7XG4gIHJldHVybiBkb2NJbmZvLm1ldGFkYXRhLnJldl90cmVlWzBdLmlkc1sxXS5zdGF0dXMgPT09ICdtaXNzaW5nJztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0RvY3MocmV2TGltaXQsIGRvY0luZm9zLCBhcGksIGZldGNoZWREb2NzLCB0eCwgcmVzdWx0cyxcbiAgICAgICAgICAgICAgICAgICAgIHdyaXRlRG9jLCBvcHRzLCBvdmVyYWxsQ2FsbGJhY2spIHtcblxuICAvLyBEZWZhdWx0IHRvIDEwMDAgbG9jYWxseVxuICByZXZMaW1pdCA9IHJldkxpbWl0IHx8IDEwMDA7XG5cbiAgZnVuY3Rpb24gaW5zZXJ0RG9jKGRvY0luZm8sIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG4gICAgLy8gQ2FudCBpbnNlcnQgbmV3IGRlbGV0ZWQgZG9jdW1lbnRzXG4gICAgdmFyIHdpbm5pbmdSZXYkJDEgPSB3aW5uaW5nUmV2KGRvY0luZm8ubWV0YWRhdGEpO1xuICAgIHZhciBkZWxldGVkID0gaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEsIHdpbm5pbmdSZXYkJDEpO1xuICAgIGlmICgnd2FzX2RlbGV0ZScgaW4gb3B0cyAmJiBkZWxldGVkKSB7XG4gICAgICByZXN1bHRzW3Jlc3VsdHNJZHhdID0gY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsICdkZWxldGVkJyk7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICAvLyA0NzEyIC0gZGV0ZWN0IHdoZXRoZXIgYSBuZXcgZG9jdW1lbnQgd2FzIGluc2VydGVkIHdpdGggYSBfcmV2XG4gICAgdmFyIGluQ29uZmxpY3QgPSBuZXdFZGl0cyAmJiByb290SXNNaXNzaW5nKGRvY0luZm8pO1xuXG4gICAgaWYgKGluQ29uZmxpY3QpIHtcbiAgICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgICAgcmVzdWx0c1tyZXN1bHRzSWR4XSA9IGVycjtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHZhciBkZWx0YSA9IGRlbGV0ZWQgPyAwIDogMTtcblxuICAgIHdyaXRlRG9jKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIGRlbGV0ZWQsIGRlbGV0ZWQsIGZhbHNlLFxuICAgICAgZGVsdGEsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHZhciBuZXdFZGl0cyA9IG9wdHMubmV3X2VkaXRzO1xuICB2YXIgaWRzVG9Eb2NzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbiAgdmFyIGRvY3NEb25lID0gMDtcbiAgdmFyIGRvY3NUb0RvID0gZG9jSW5mb3MubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNoZWNrQWxsRG9jc0RvbmUoKSB7XG4gICAgaWYgKCsrZG9jc0RvbmUgPT09IGRvY3NUb0RvICYmIG92ZXJhbGxDYWxsYmFjaykge1xuICAgICAgb3ZlcmFsbENhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZG9jSW5mb3MuZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudERvYywgcmVzdWx0c0lkeCkge1xuXG4gICAgaWYgKGN1cnJlbnREb2MuX2lkICYmIGlzTG9jYWxJZChjdXJyZW50RG9jLl9pZCkpIHtcbiAgICAgIHZhciBmdW4gPSBjdXJyZW50RG9jLl9kZWxldGVkID8gJ19yZW1vdmVMb2NhbCcgOiAnX3B1dExvY2FsJztcbiAgICAgIGFwaVtmdW5dKGN1cnJlbnREb2MsIHtjdHg6IHR4fSwgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIHJlc3VsdHNbcmVzdWx0c0lkeF0gPSBlcnIgfHwgcmVzO1xuICAgICAgICBjaGVja0FsbERvY3NEb25lKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaWQgPSBjdXJyZW50RG9jLm1ldGFkYXRhLmlkO1xuICAgIGlmIChpZHNUb0RvY3MuaGFzKGlkKSkge1xuICAgICAgZG9jc1RvRG8tLTsgLy8gZHVwbGljYXRlXG4gICAgICBpZHNUb0RvY3MuZ2V0KGlkKS5wdXNoKFtjdXJyZW50RG9jLCByZXN1bHRzSWR4XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkc1RvRG9jcy5zZXQoaWQsIFtbY3VycmVudERvYywgcmVzdWx0c0lkeF1dKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGluIHRoZSBjYXNlIG9mIG5ld19lZGl0cywgdGhlIHVzZXIgY2FuIHByb3ZpZGUgbXVsdGlwbGUgZG9jc1xuICAvLyB3aXRoIHRoZSBzYW1lIGlkLiB0aGVzZSBuZWVkIHRvIGJlIHByb2Nlc3NlZCBzZXF1ZW50aWFsbHlcbiAgaWRzVG9Eb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvY3MsIGlkKSB7XG4gICAgdmFyIG51bURvbmUgPSAwO1xuXG4gICAgZnVuY3Rpb24gZG9jV3JpdHRlbigpIHtcbiAgICAgIGlmICgrK251bURvbmUgPCBkb2NzLmxlbmd0aCkge1xuICAgICAgICBuZXh0RG9jKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja0FsbERvY3NEb25lKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5leHREb2MoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBkb2NzW251bURvbmVdO1xuICAgICAgdmFyIGN1cnJlbnREb2MgPSB2YWx1ZVswXTtcbiAgICAgIHZhciByZXN1bHRzSWR4ID0gdmFsdWVbMV07XG5cbiAgICAgIGlmIChmZXRjaGVkRG9jcy5oYXMoaWQpKSB7XG4gICAgICAgIHVwZGF0ZURvYyhyZXZMaW1pdCwgZmV0Y2hlZERvY3MuZ2V0KGlkKSwgY3VycmVudERvYywgcmVzdWx0cyxcbiAgICAgICAgICByZXN1bHRzSWR4LCBkb2NXcml0dGVuLCB3cml0ZURvYywgbmV3RWRpdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRW5zdXJlIHN0ZW1taW5nIGFwcGxpZXMgdG8gbmV3IHdyaXRlcyBhcyB3ZWxsXG4gICAgICAgIHZhciBtZXJnZWQgPSBtZXJnZShbXSwgY3VycmVudERvYy5tZXRhZGF0YS5yZXZfdHJlZVswXSwgcmV2TGltaXQpO1xuICAgICAgICBjdXJyZW50RG9jLm1ldGFkYXRhLnJldl90cmVlID0gbWVyZ2VkLnRyZWU7XG4gICAgICAgIGN1cnJlbnREb2Muc3RlbW1lZFJldnMgPSBtZXJnZWQuc3RlbW1lZFJldnMgfHwgW107XG4gICAgICAgIGluc2VydERvYyhjdXJyZW50RG9jLCByZXN1bHRzSWR4LCBkb2NXcml0dGVuKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbmV4dERvYygpO1xuICB9KTtcbn1cblxuLy8gSW5kZXhlZERCIHJlcXVpcmVzIGEgdmVyc2lvbmVkIGRhdGFiYXNlIHN0cnVjdHVyZSwgc28gd2UgdXNlIHRoZVxuLy8gdmVyc2lvbiBoZXJlIHRvIG1hbmFnZSBtaWdyYXRpb25zLlxudmFyIEFEQVBURVJfVkVSU0lPTiA9IDU7XG5cbi8vIFRoZSBvYmplY3Qgc3RvcmVzIGNyZWF0ZWQgZm9yIGVhY2ggZGF0YWJhc2Vcbi8vIERPQ19TVE9SRSBzdG9yZXMgdGhlIGRvY3VtZW50IG1ldGEgZGF0YSwgaXRzIHJldmlzaW9uIGhpc3RvcnkgYW5kIHN0YXRlXG4vLyBLZXllZCBieSBkb2N1bWVudCBpZFxudmFyIERPQ19TVE9SRSA9ICdkb2N1bWVudC1zdG9yZSc7XG4vLyBCWV9TRVFfU1RPUkUgc3RvcmVzIGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQsIGtleWVkIGJ5IGl0c1xuLy8gc2VxdWVuY2UgaWRcbnZhciBCWV9TRVFfU1RPUkUgPSAnYnktc2VxdWVuY2UnO1xuLy8gV2hlcmUgd2Ugc3RvcmUgYXR0YWNobWVudHNcbnZhciBBVFRBQ0hfU1RPUkUgPSAnYXR0YWNoLXN0b3JlJztcbi8vIFdoZXJlIHdlIHN0b3JlIG1hbnktdG8tbWFueSByZWxhdGlvbnNcbi8vIGJldHdlZW4gYXR0YWNobWVudCBkaWdlc3RzIGFuZCBzZXFzXG52YXIgQVRUQUNIX0FORF9TRVFfU1RPUkUgPSAnYXR0YWNoLXNlcS1zdG9yZSc7XG5cbi8vIFdoZXJlIHdlIHN0b3JlIGRhdGFiYXNlLXdpZGUgbWV0YSBkYXRhIGluIGEgc2luZ2xlIHJlY29yZFxuLy8ga2V5ZWQgYnkgaWQ6IE1FVEFfU1RPUkVcbnZhciBNRVRBX1NUT1JFID0gJ21ldGEtc3RvcmUnO1xuLy8gV2hlcmUgd2Ugc3RvcmUgbG9jYWwgZG9jdW1lbnRzXG52YXIgTE9DQUxfU1RPUkUgPSAnbG9jYWwtc3RvcmUnO1xuLy8gV2hlcmUgd2UgZGV0ZWN0IGJsb2Igc3VwcG9ydFxudmFyIERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUgPSAnZGV0ZWN0LWJsb2Itc3VwcG9ydCc7XG5cbmZ1bmN0aW9uIHNhZmVKc29uUGFyc2Uoc3RyKSB7XG4gIC8vIFRoaXMgdHJ5L2NhdGNoIGd1YXJkcyBhZ2FpbnN0IHN0YWNrIG92ZXJmbG93IGVycm9ycy5cbiAgLy8gSlNPTi5wYXJzZSgpIGlzIGZhc3RlciB0aGFuIHZ1dnV6ZWxhLnBhcnNlKCkgYnV0IHZ1dnV6ZWxhXG4gIC8vIGNhbm5vdCBvdmVyZmxvdy5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdnV2dXplbGEucGFyc2Uoc3RyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlSnNvblN0cmluZ2lmeShqc29uKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzb24pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdnV2dXplbGEuc3RyaW5naWZ5KGpzb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlkYkVycm9yKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAndW5rbm93bl9lcnJvcic7XG4gICAgaWYgKGV2dC50YXJnZXQgJiYgZXZ0LnRhcmdldC5lcnJvcikge1xuICAgICAgbWVzc2FnZSA9IGV2dC50YXJnZXQuZXJyb3IubmFtZSB8fCBldnQudGFyZ2V0LmVycm9yLm1lc3NhZ2U7XG4gICAgfVxuICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKElEQl9FUlJPUiwgbWVzc2FnZSwgZXZ0LnR5cGUpKTtcbiAgfTtcbn1cblxuLy8gVW5mb3J0dW5hdGVseSwgdGhlIG1ldGFkYXRhIGhhcyB0byBiZSBzdHJpbmdpZmllZFxuLy8gd2hlbiBpdCBpcyBwdXQgaW50byB0aGUgZGF0YWJhc2UsIGJlY2F1c2Ugb3RoZXJ3aXNlXG4vLyBJbmRleGVkREIgY2FuIHRocm93IGVycm9ycyBmb3IgZGVlcGx5LW5lc3RlZCBvYmplY3RzLlxuLy8gT3JpZ2luYWxseSB3ZSBqdXN0IHVzZWQgSlNPTi5wYXJzZS9KU09OLnN0cmluZ2lmeTsgbm93XG4vLyB3ZSB1c2UgdGhpcyBjdXN0b20gdnV2dXplbGEgbGlicmFyeSB0aGF0IGF2b2lkcyByZWN1cnNpb24uXG4vLyBJZiB3ZSBjb3VsZCBkbyBpdCBhbGwgb3ZlciBhZ2Fpbiwgd2UnZCBwcm9iYWJseSB1c2UgYVxuLy8gZm9ybWF0IGZvciB0aGUgcmV2aXNpb24gdHJlZXMgb3RoZXIgdGhhbiBKU09OLlxuZnVuY3Rpb24gZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEsIHdpbm5pbmdSZXYsIGRlbGV0ZWQpIHtcbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBzYWZlSnNvblN0cmluZ2lmeShtZXRhZGF0YSksXG4gICAgd2lubmluZ1Jldjogd2lubmluZ1JldixcbiAgICBkZWxldGVkT3JMb2NhbDogZGVsZXRlZCA/ICcxJyA6ICcwJyxcbiAgICBzZXE6IG1ldGFkYXRhLnNlcSwgLy8gaGlnaGVzdCBzZXEgZm9yIHRoaXMgZG9jXG4gICAgaWQ6IG1ldGFkYXRhLmlkXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlY29kZU1ldGFkYXRhKHN0b3JlZE9iamVjdCkge1xuICBpZiAoIXN0b3JlZE9iamVjdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBtZXRhZGF0YSA9IHNhZmVKc29uUGFyc2Uoc3RvcmVkT2JqZWN0LmRhdGEpO1xuICBtZXRhZGF0YS53aW5uaW5nUmV2ID0gc3RvcmVkT2JqZWN0Lndpbm5pbmdSZXY7XG4gIG1ldGFkYXRhLmRlbGV0ZWQgPSBzdG9yZWRPYmplY3QuZGVsZXRlZE9yTG9jYWwgPT09ICcxJztcbiAgbWV0YWRhdGEuc2VxID0gc3RvcmVkT2JqZWN0LnNlcTtcbiAgcmV0dXJuIG1ldGFkYXRhO1xufVxuXG4vLyByZWFkIHRoZSBkb2MgYmFjayBvdXQgZnJvbSB0aGUgZGF0YWJhc2UuIHdlIGRvbid0IHN0b3JlIHRoZVxuLy8gX2lkIG9yIF9yZXYgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgX2RvY19pZF9yZXYuXG5mdW5jdGlvbiBkZWNvZGVEb2MoZG9jKSB7XG4gIGlmICghZG9jKSB7XG4gICAgcmV0dXJuIGRvYztcbiAgfVxuICB2YXIgaWR4ID0gZG9jLl9kb2NfaWRfcmV2Lmxhc3RJbmRleE9mKCc6Jyk7XG4gIGRvYy5faWQgPSBkb2MuX2RvY19pZF9yZXYuc3Vic3RyaW5nKDAsIGlkeCAtIDEpO1xuICBkb2MuX3JldiA9IGRvYy5fZG9jX2lkX3Jldi5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gIGRlbGV0ZSBkb2MuX2RvY19pZF9yZXY7XG4gIHJldHVybiBkb2M7XG59XG5cbi8vIFJlYWQgYSBibG9iIGZyb20gdGhlIGRhdGFiYXNlLCBlbmNvZGluZyBhcyBuZWNlc3Nhcnlcbi8vIGFuZCB0cmFuc2xhdGluZyBmcm9tIGJhc2U2NCBpZiB0aGUgSURCIGRvZXNuJ3Qgc3VwcG9ydFxuLy8gbmF0aXZlIEJsb2JzXG5mdW5jdGlvbiByZWFkQmxvYkRhdGEoYm9keSwgdHlwZSwgYXNCbG9iLCBjYWxsYmFjaykge1xuICBpZiAoYXNCbG9iKSB7XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICBjYWxsYmFjayhjcmVhdGVCbG9iKFsnJ10sIHt0eXBlOiB0eXBlfSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgIT09ICdzdHJpbmcnKSB7IC8vIHdlIGhhdmUgYmxvYiBzdXBwb3J0XG4gICAgICBjYWxsYmFjayhib2R5KTtcbiAgICB9IGVsc2UgeyAvLyBubyBibG9iIHN1cHBvcnRcbiAgICAgIGNhbGxiYWNrKGI2NFRvQmx1ZmZlcihib2R5LCB0eXBlKSk7XG4gICAgfVxuICB9IGVsc2UgeyAvLyBhcyBiYXNlNjQgc3RyaW5nXG4gICAgaWYgKCFib2R5KSB7XG4gICAgICBjYWxsYmFjaygnJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycpIHsgLy8gd2UgaGF2ZSBibG9iIHN1cHBvcnRcbiAgICAgIHJlYWRBc0JpbmFyeVN0cmluZyhib2R5LCBmdW5jdGlvbiAoYmluYXJ5KSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXNCdG9hKGJpbmFyeSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHsgLy8gbm8gYmxvYiBzdXBwb3J0XG4gICAgICBjYWxsYmFjayhib2R5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmV0Y2hBdHRhY2htZW50c0lmTmVjZXNzYXJ5KGRvYywgb3B0cywgdHhuLCBjYikge1xuICB2YXIgYXR0YWNobWVudHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzIHx8IHt9KTtcbiAgaWYgKCFhdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY2IgJiYgY2IoKTtcbiAgfVxuICB2YXIgbnVtRG9uZSA9IDA7XG5cbiAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgIGlmICgrK251bURvbmUgPT09IGF0dGFjaG1lbnRzLmxlbmd0aCAmJiBjYikge1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaEF0dGFjaG1lbnQoZG9jLCBhdHQpIHtcbiAgICB2YXIgYXR0T2JqID0gZG9jLl9hdHRhY2htZW50c1thdHRdO1xuICAgIHZhciBkaWdlc3QgPSBhdHRPYmouZGlnZXN0O1xuICAgIHZhciByZXEgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKS5nZXQoZGlnZXN0KTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGF0dE9iai5ib2R5ID0gZS50YXJnZXQucmVzdWx0LmJvZHk7XG4gICAgICBjaGVja0RvbmUoKTtcbiAgICB9O1xuICB9XG5cbiAgYXR0YWNobWVudHMuZm9yRWFjaChmdW5jdGlvbiAoYXR0KSB7XG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgIGZldGNoQXR0YWNobWVudChkb2MsIGF0dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvYy5fYXR0YWNobWVudHNbYXR0XS5zdHViID0gdHJ1ZTtcbiAgICAgIGNoZWNrRG9uZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIElEQi1zcGVjaWZpYyBwb3N0cHJvY2Vzc2luZyBuZWNlc3NhcnkgYmVjYXVzZVxuLy8gd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHdlIHN0b3JlZCBhIHRydWUgQmxvYiBvclxuLy8gYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcsIGFuZCBpZiBpdCdzIGEgQmxvYiBpdFxuLy8gbmVlZHMgdG8gYmUgcmVhZCBvdXRzaWRlIG9mIHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG5mdW5jdGlvbiBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMsIGFzQmxvYikge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocmVzdWx0cy5tYXAoZnVuY3Rpb24gKHJvdykge1xuICAgIGlmIChyb3cuZG9jICYmIHJvdy5kb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICB2YXIgYXR0TmFtZXMgPSBPYmplY3Qua2V5cyhyb3cuZG9jLl9hdHRhY2htZW50cyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYXR0TmFtZXMubWFwKGZ1bmN0aW9uIChhdHQpIHtcbiAgICAgICAgdmFyIGF0dE9iaiA9IHJvdy5kb2MuX2F0dGFjaG1lbnRzW2F0dF07XG4gICAgICAgIGlmICghKCdib2R5JyBpbiBhdHRPYmopKSB7IC8vIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBib2R5ID0gYXR0T2JqLmJvZHk7XG4gICAgICAgIHZhciB0eXBlID0gYXR0T2JqLmNvbnRlbnRfdHlwZTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVhZEJsb2JEYXRhKGJvZHksIHR5cGUsIGFzQmxvYiwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHJvdy5kb2MuX2F0dGFjaG1lbnRzW2F0dF0gPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oXG4gICAgICAgICAgICAgIHBpY2soYXR0T2JqLCBbJ2RpZ2VzdCcsICdjb250ZW50X3R5cGUnXSksXG4gICAgICAgICAgICAgIHtkYXRhOiBkYXRhfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhY3RSZXZzKHJldnMsIGRvY0lkLCB0eG4pIHtcblxuICB2YXIgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMgPSBbXTtcbiAgdmFyIHNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gIHZhciBhdHRTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfU1RPUkUpO1xuICB2YXIgYXR0QW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuICB2YXIgY291bnQgPSByZXZzLmxlbmd0aDtcblxuICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgY291bnQtLTtcbiAgICBpZiAoIWNvdW50KSB7IC8vIGRvbmUgcHJvY2Vzc2luZyBhbGwgcmV2c1xuICAgICAgZGVsZXRlT3JwaGFuZWRBdHRhY2htZW50cygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGV0ZU9ycGhhbmVkQXR0YWNobWVudHMoKSB7XG4gICAgaWYgKCFwb3NzaWJseU9ycGhhbmVkRGlnZXN0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMuZm9yRWFjaChmdW5jdGlvbiAoZGlnZXN0KSB7XG4gICAgICB2YXIgY291bnRSZXEgPSBhdHRBbmRTZXFTdG9yZS5pbmRleCgnZGlnZXN0U2VxJykuY291bnQoXG4gICAgICAgIElEQktleVJhbmdlLmJvdW5kKFxuICAgICAgICAgIGRpZ2VzdCArICc6OicsIGRpZ2VzdCArICc6OlxcdWZmZmYnLCBmYWxzZSwgZmFsc2UpKTtcbiAgICAgIGNvdW50UmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBjb3VudCA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICAgIC8vIG9ycGhhbmVkXG4gICAgICAgICAgYXR0U3RvcmUuZGVsZXRlKGRpZ2VzdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXZzLmZvckVhY2goZnVuY3Rpb24gKHJldikge1xuICAgIHZhciBpbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICAgIHZhciBrZXkgPSBkb2NJZCArIFwiOjpcIiArIHJldjtcbiAgICBpbmRleC5nZXRLZXkoa2V5KS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHNlcSA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICh0eXBlb2Ygc2VxICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gY2hlY2tEb25lKCk7XG4gICAgICB9XG4gICAgICBzZXFTdG9yZS5kZWxldGUoc2VxKTtcblxuICAgICAgdmFyIGN1cnNvciA9IGF0dEFuZFNlcVN0b3JlLmluZGV4KCdzZXEnKVxuICAgICAgICAub3BlbkN1cnNvcihJREJLZXlSYW5nZS5vbmx5KHNlcSkpO1xuXG4gICAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgdmFyIGRpZ2VzdCA9IGN1cnNvci52YWx1ZS5kaWdlc3RTZXEuc3BsaXQoJzo6JylbMF07XG4gICAgICAgICAgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMucHVzaChkaWdlc3QpO1xuICAgICAgICAgIGF0dEFuZFNlcVN0b3JlLmRlbGV0ZShjdXJzb3IucHJpbWFyeUtleSk7XG4gICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgIH0gZWxzZSB7IC8vIGRvbmVcbiAgICAgICAgICBjaGVja0RvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgc3RvcmVzLCBtb2RlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4bjogaWRiLnRyYW5zYWN0aW9uKHN0b3JlcywgbW9kZSlcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGVyclxuICAgIH07XG4gIH1cbn1cblxudmFyIGNoYW5nZXNIYW5kbGVyID0gbmV3IENoYW5nZXMoKTtcblxuZnVuY3Rpb24gaWRiQnVsa0RvY3MoZGJPcHRzLCByZXEsIG9wdHMsIGFwaSwgaWRiLCBjYWxsYmFjaykge1xuICB2YXIgZG9jSW5mb3MgPSByZXEuZG9jcztcbiAgdmFyIHR4bjtcbiAgdmFyIGRvY1N0b3JlO1xuICB2YXIgYnlTZXFTdG9yZTtcbiAgdmFyIGF0dGFjaFN0b3JlO1xuICB2YXIgYXR0YWNoQW5kU2VxU3RvcmU7XG4gIHZhciBtZXRhU3RvcmU7XG4gIHZhciBkb2NJbmZvRXJyb3I7XG4gIHZhciBtZXRhRG9jO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkb2NJbmZvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBkb2MgPSBkb2NJbmZvc1tpXTtcbiAgICBpZiAoZG9jLl9pZCAmJiBpc0xvY2FsSWQoZG9jLl9pZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBkb2MgPSBkb2NJbmZvc1tpXSA9IHBhcnNlRG9jKGRvYywgb3B0cy5uZXdfZWRpdHMsIGRiT3B0cyk7XG4gICAgaWYgKGRvYy5lcnJvciAmJiAhZG9jSW5mb0Vycm9yKSB7XG4gICAgICBkb2NJbmZvRXJyb3IgPSBkb2M7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRvY0luZm9FcnJvcikge1xuICAgIHJldHVybiBjYWxsYmFjayhkb2NJbmZvRXJyb3IpO1xuICB9XG5cbiAgdmFyIGFsbERvY3NQcm9jZXNzZWQgPSBmYWxzZTtcbiAgdmFyIGRvY0NvdW50RGVsdGEgPSAwO1xuICB2YXIgcmVzdWx0cyA9IG5ldyBBcnJheShkb2NJbmZvcy5sZW5ndGgpO1xuICB2YXIgZmV0Y2hlZERvY3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgdmFyIHByZWNvbmRpdGlvbkVycm9yZWQgPSBmYWxzZTtcbiAgdmFyIGJsb2JUeXBlID0gYXBpLl9tZXRhLmJsb2JTdXBwb3J0ID8gJ2Jsb2InIDogJ2Jhc2U2NCc7XG5cbiAgcHJlcHJvY2Vzc0F0dGFjaG1lbnRzKGRvY0luZm9zLCBibG9iVHlwZSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICBzdGFydFRyYW5zYWN0aW9uKCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oKSB7XG5cbiAgICB2YXIgc3RvcmVzID0gW1xuICAgICAgRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsXG4gICAgICBBVFRBQ0hfU1RPUkUsXG4gICAgICBMT0NBTF9TVE9SRSwgQVRUQUNIX0FORF9TRVFfU1RPUkUsXG4gICAgICBNRVRBX1NUT1JFXG4gICAgXTtcbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgc3RvcmVzLCAncmVhZHdyaXRlJyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgdHhuLm9udGltZW91dCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICB0eG4ub25jb21wbGV0ZSA9IGNvbXBsZXRlO1xuICAgIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgYnlTZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICAgIGF0dGFjaFN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSk7XG4gICAgYXR0YWNoQW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuICAgIG1ldGFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKTtcblxuICAgIG1ldGFTdG9yZS5nZXQoTUVUQV9TVE9SRSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1ldGFEb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICB1cGRhdGVEb2NDb3VudElmUmVhZHkoKTtcbiAgICB9O1xuXG4gICAgdmVyaWZ5QXR0YWNobWVudHMoZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBwcmVjb25kaXRpb25FcnJvcmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgICBmZXRjaEV4aXN0aW5nRG9jcygpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25BbGxEb2NzUHJvY2Vzc2VkKCkge1xuICAgIGFsbERvY3NQcm9jZXNzZWQgPSB0cnVlO1xuICAgIHVwZGF0ZURvY0NvdW50SWZSZWFkeSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaWRiUHJvY2Vzc0RvY3MoKSB7XG4gICAgcHJvY2Vzc0RvY3MoZGJPcHRzLnJldnNfbGltaXQsIGRvY0luZm9zLCBhcGksIGZldGNoZWREb2NzLFxuICAgICAgICAgICAgICAgIHR4biwgcmVzdWx0cywgd3JpdGVEb2MsIG9wdHMsIG9uQWxsRG9jc1Byb2Nlc3NlZCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVEb2NDb3VudElmUmVhZHkoKSB7XG4gICAgaWYgKCFtZXRhRG9jIHx8ICFhbGxEb2NzUHJvY2Vzc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGNhY2hpbmcgdGhlIGRvY0NvdW50IHNhdmVzIGEgbG90IG9mIHRpbWUgaW4gYWxsRG9jcygpIGFuZFxuICAgIC8vIGluZm8oKSwgd2hpY2ggaXMgd2h5IHdlIGdvIHRvIGFsbCB0aGUgdHJvdWJsZSBvZiBkb2luZyB0aGlzXG4gICAgbWV0YURvYy5kb2NDb3VudCArPSBkb2NDb3VudERlbHRhO1xuICAgIG1ldGFTdG9yZS5wdXQobWV0YURvYyk7XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaEV4aXN0aW5nRG9jcygpIHtcblxuICAgIGlmICghZG9jSW5mb3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG51bUZldGNoZWQgPSAwO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgICAgaWYgKCsrbnVtRmV0Y2hlZCA9PT0gZG9jSW5mb3MubGVuZ3RoKSB7XG4gICAgICAgIGlkYlByb2Nlc3NEb2NzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZE1ldGFkYXRhKGV2ZW50KSB7XG4gICAgICB2YXIgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShldmVudC50YXJnZXQucmVzdWx0KTtcblxuICAgICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgIGZldGNoZWREb2NzLnNldChtZXRhZGF0YS5pZCwgbWV0YWRhdGEpO1xuICAgICAgfVxuICAgICAgY2hlY2tEb25lKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRvY0luZm9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgZG9jSW5mbyA9IGRvY0luZm9zW2ldO1xuICAgICAgaWYgKGRvY0luZm8uX2lkICYmIGlzTG9jYWxJZChkb2NJbmZvLl9pZCkpIHtcbiAgICAgICAgY2hlY2tEb25lKCk7IC8vIHNraXAgbG9jYWwgZG9jc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXEgPSBkb2NTdG9yZS5nZXQoZG9jSW5mby5tZXRhZGF0YS5pZCk7XG4gICAgICByZXEub25zdWNjZXNzID0gcmVhZE1ldGFkYXRhO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgIGlmIChwcmVjb25kaXRpb25FcnJvcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2hhbmdlc0hhbmRsZXIubm90aWZ5KGFwaS5fbWV0YS5uYW1lKTtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZlcmlmeUF0dGFjaG1lbnQoZGlnZXN0LCBjYWxsYmFjaykge1xuXG4gICAgdmFyIHJlcSA9IGF0dGFjaFN0b3JlLmdldChkaWdlc3QpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFlLnRhcmdldC5yZXN1bHQpIHtcbiAgICAgICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfU1RVQixcbiAgICAgICAgICAndW5rbm93biBzdHViIGF0dGFjaG1lbnQgd2l0aCBkaWdlc3QgJyArXG4gICAgICAgICAgZGlnZXN0KTtcbiAgICAgICAgZXJyLnN0YXR1cyA9IDQxMjtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZlcmlmeUF0dGFjaG1lbnRzKGZpbmlzaCkge1xuXG5cbiAgICB2YXIgZGlnZXN0cyA9IFtdO1xuICAgIGRvY0luZm9zLmZvckVhY2goZnVuY3Rpb24gKGRvY0luZm8pIHtcbiAgICAgIGlmIChkb2NJbmZvLmRhdGEgJiYgZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cykge1xuICAgICAgICBPYmplY3Qua2V5cyhkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgICAgICAgIHZhciBhdHQgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lXTtcbiAgICAgICAgICBpZiAoYXR0LnN0dWIpIHtcbiAgICAgICAgICAgIGRpZ2VzdHMucHVzaChhdHQuZGlnZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghZGlnZXN0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmaW5pc2goKTtcbiAgICB9XG4gICAgdmFyIG51bURvbmUgPSAwO1xuICAgIHZhciBlcnI7XG5cbiAgICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgICBpZiAoKytudW1Eb25lID09PSBkaWdlc3RzLmxlbmd0aCkge1xuICAgICAgICBmaW5pc2goZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZGlnZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChkaWdlc3QpIHtcbiAgICAgIHZlcmlmeUF0dGFjaG1lbnQoZGlnZXN0LCBmdW5jdGlvbiAoYXR0RXJyKSB7XG4gICAgICAgIGlmIChhdHRFcnIgJiYgIWVycikge1xuICAgICAgICAgIGVyciA9IGF0dEVycjtcbiAgICAgICAgfVxuICAgICAgICBjaGVja0RvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVEb2MoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgd2lubmluZ1JldklzRGVsZXRlZCwgbmV3UmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICBpc1VwZGF0ZSwgZGVsdGEsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG5cbiAgICBkb2NJbmZvLm1ldGFkYXRhLndpbm5pbmdSZXYgPSB3aW5uaW5nUmV2JCQxO1xuICAgIGRvY0luZm8ubWV0YWRhdGEuZGVsZXRlZCA9IHdpbm5pbmdSZXZJc0RlbGV0ZWQ7XG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuICAgIGRvYy5faWQgPSBkb2NJbmZvLm1ldGFkYXRhLmlkO1xuICAgIGRvYy5fcmV2ID0gZG9jSW5mby5tZXRhZGF0YS5yZXY7XG5cbiAgICBpZiAobmV3UmV2SXNEZWxldGVkKSB7XG4gICAgICBkb2MuX2RlbGV0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBoYXNBdHRhY2htZW50cyA9IGRvYy5fYXR0YWNobWVudHMgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpLmxlbmd0aDtcbiAgICBpZiAoaGFzQXR0YWNobWVudHMpIHtcbiAgICAgIHJldHVybiB3cml0ZUF0dGFjaG1lbnRzKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIHdpbm5pbmdSZXZJc0RlbGV0ZWQsXG4gICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZG9jQ291bnREZWx0YSArPSBkZWx0YTtcbiAgICB1cGRhdGVEb2NDb3VudElmUmVhZHkoKTtcblxuICAgIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuICAgIHZhciBtZXRhZGF0YSA9IGRvY0luZm8ubWV0YWRhdGE7XG5cbiAgICBkb2MuX2RvY19pZF9yZXYgPSBtZXRhZGF0YS5pZCArICc6OicgKyBtZXRhZGF0YS5yZXY7XG4gICAgZGVsZXRlIGRvYy5faWQ7XG4gICAgZGVsZXRlIGRvYy5fcmV2O1xuXG4gICAgZnVuY3Rpb24gYWZ0ZXJQdXREb2MoZSkge1xuICAgICAgdmFyIHJldnNUb0RlbGV0ZSA9IGRvY0luZm8uc3RlbW1lZFJldnMgfHwgW107XG5cbiAgICAgIGlmIChpc1VwZGF0ZSAmJiBhcGkuYXV0b19jb21wYWN0aW9uKSB7XG4gICAgICAgIHJldnNUb0RlbGV0ZSA9IHJldnNUb0RlbGV0ZS5jb25jYXQoY29tcGFjdFRyZWUoZG9jSW5mby5tZXRhZGF0YSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmV2c1RvRGVsZXRlICYmIHJldnNUb0RlbGV0ZS5sZW5ndGgpIHtcbiAgICAgICAgY29tcGFjdFJldnMocmV2c1RvRGVsZXRlLCBkb2NJbmZvLm1ldGFkYXRhLmlkLCB0eG4pO1xuICAgICAgfVxuXG4gICAgICBtZXRhZGF0YS5zZXEgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAvLyBDdXJyZW50IF9yZXYgaXMgY2FsY3VsYXRlZCBmcm9tIF9yZXZfdHJlZSBvbiByZWFkXG4gICAgICAvLyBkZWxldGUgbWV0YWRhdGEucmV2O1xuICAgICAgdmFyIG1ldGFkYXRhVG9TdG9yZSA9IGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhLCB3aW5uaW5nUmV2JCQxLFxuICAgICAgICB3aW5uaW5nUmV2SXNEZWxldGVkKTtcbiAgICAgIHZhciBtZXRhRGF0YVJlcSA9IGRvY1N0b3JlLnB1dChtZXRhZGF0YVRvU3RvcmUpO1xuICAgICAgbWV0YURhdGFSZXEub25zdWNjZXNzID0gYWZ0ZXJQdXRNZXRhZGF0YTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZnRlclB1dERvY0Vycm9yKGUpIHtcbiAgICAgIC8vIENvbnN0cmFpbnRFcnJvciwgbmVlZCB0byB1cGRhdGUsIG5vdCBwdXQgKHNlZSAjMTYzOCBmb3IgZGV0YWlscylcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gYXZvaWQgdHJhbnNhY3Rpb24gYWJvcnRcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIG9uZXJyb3JcbiAgICAgIHZhciBpbmRleCA9IGJ5U2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG4gICAgICB2YXIgZ2V0S2V5UmVxID0gaW5kZXguZ2V0S2V5KGRvYy5fZG9jX2lkX3Jldik7XG4gICAgICBnZXRLZXlSZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHB1dFJlcSA9IGJ5U2VxU3RvcmUucHV0KGRvYywgZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgcHV0UmVxLm9uc3VjY2VzcyA9IGFmdGVyUHV0RG9jO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZnRlclB1dE1ldGFkYXRhKCkge1xuICAgICAgcmVzdWx0c1tyZXN1bHRzSWR4XSA9IHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGlkOiBtZXRhZGF0YS5pZCxcbiAgICAgICAgcmV2OiBtZXRhZGF0YS5yZXZcbiAgICAgIH07XG4gICAgICBmZXRjaGVkRG9jcy5zZXQoZG9jSW5mby5tZXRhZGF0YS5pZCwgZG9jSW5mby5tZXRhZGF0YSk7XG4gICAgICBpbnNlcnRBdHRhY2htZW50TWFwcGluZ3MoZG9jSW5mbywgbWV0YWRhdGEuc2VxLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgdmFyIHB1dFJlcSA9IGJ5U2VxU3RvcmUucHV0KGRvYyk7XG5cbiAgICBwdXRSZXEub25zdWNjZXNzID0gYWZ0ZXJQdXREb2M7XG4gICAgcHV0UmVxLm9uZXJyb3IgPSBhZnRlclB1dERvY0Vycm9yO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVBdHRhY2htZW50cyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjaykge1xuXG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuXG4gICAgdmFyIG51bURvbmUgPSAwO1xuICAgIHZhciBhdHRhY2htZW50cyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpO1xuXG4gICAgZnVuY3Rpb24gY29sbGVjdFJlc3VsdHMoKSB7XG4gICAgICBpZiAobnVtRG9uZSA9PT0gYXR0YWNobWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXR0YWNobWVudFNhdmVkKCkge1xuICAgICAgbnVtRG9uZSsrO1xuICAgICAgY29sbGVjdFJlc3VsdHMoKTtcbiAgICB9XG5cbiAgICBhdHRhY2htZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBhdHQgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2tleV07XG4gICAgICBpZiAoIWF0dC5zdHViKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXR0LmRhdGE7XG4gICAgICAgIGRlbGV0ZSBhdHQuZGF0YTtcbiAgICAgICAgYXR0LnJldnBvcyA9IHBhcnNlSW50KHdpbm5pbmdSZXYkJDEsIDEwKTtcbiAgICAgICAgdmFyIGRpZ2VzdCA9IGF0dC5kaWdlc3Q7XG4gICAgICAgIHNhdmVBdHRhY2htZW50KGRpZ2VzdCwgZGF0YSwgYXR0YWNobWVudFNhdmVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bURvbmUrKztcbiAgICAgICAgY29sbGVjdFJlc3VsdHMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIG1hcCBzZXFzIHRvIGF0dGFjaG1lbnQgZGlnZXN0cywgd2hpY2hcbiAgLy8gd2Ugd2lsbCBuZWVkIGxhdGVyIGR1cmluZyBjb21wYWN0aW9uXG4gIGZ1bmN0aW9uIGluc2VydEF0dGFjaG1lbnRNYXBwaW5ncyhkb2NJbmZvLCBzZXEsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgYXR0c0FkZGVkID0gMDtcbiAgICB2YXIgYXR0c1RvQWRkID0gT2JqZWN0LmtleXMoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cyB8fCB7fSk7XG5cbiAgICBpZiAoIWF0dHNUb0FkZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICAgIGlmICgrK2F0dHNBZGRlZCA9PT0gYXR0c1RvQWRkLmxlbmd0aCkge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZChhdHQpIHtcbiAgICAgIHZhciBkaWdlc3QgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2F0dF0uZGlnZXN0O1xuICAgICAgdmFyIHJlcSA9IGF0dGFjaEFuZFNlcVN0b3JlLnB1dCh7XG4gICAgICAgIHNlcTogc2VxLFxuICAgICAgICBkaWdlc3RTZXE6IGRpZ2VzdCArICc6OicgKyBzZXFcbiAgICAgIH0pO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gY2hlY2tEb25lO1xuICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyB0aGlzIGNhbGxiYWNrIGlzIGZvciBhIGNvbnN0YWludCBlcnJvciwgd2hpY2ggd2UgaWdub3JlXG4gICAgICAgIC8vIGJlY2F1c2UgdGhpcyBkb2NpZC9yZXYgaGFzIGFscmVhZHkgYmVlbiBhc3NvY2lhdGVkIHdpdGhcbiAgICAgICAgLy8gdGhlIGRpZ2VzdCAoZS5nLiB3aGVuIG5ld19lZGl0cyA9PSBmYWxzZSlcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBhYm9ydFxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBvbmVycm9yXG4gICAgICAgIGNoZWNrRG9uZSgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRzVG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZChhdHRzVG9BZGRbaV0pOyAvLyBkbyBpbiBwYXJhbGxlbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVBdHRhY2htZW50KGRpZ2VzdCwgZGF0YSwgY2FsbGJhY2spIHtcblxuXG4gICAgdmFyIGdldEtleVJlcSA9IGF0dGFjaFN0b3JlLmNvdW50KGRpZ2VzdCk7XG4gICAgZ2V0S2V5UmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgY291bnQgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7IC8vIGFscmVhZHkgZXhpc3RzXG4gICAgICB9XG4gICAgICB2YXIgbmV3QXR0ID0ge1xuICAgICAgICBkaWdlc3Q6IGRpZ2VzdCxcbiAgICAgICAgYm9keTogZGF0YVxuICAgICAgfTtcbiAgICAgIHZhciBwdXRSZXEgPSBhdHRhY2hTdG9yZS5wdXQobmV3QXR0KTtcbiAgICAgIHB1dFJlcS5vbnN1Y2Nlc3MgPSBjYWxsYmFjaztcbiAgICB9O1xuICB9XG59XG5cbi8vIEFic3RyYWN0aW9uIG92ZXIgSURCQ3Vyc29yIGFuZCBnZXRBbGwoKS9nZXRBbGxLZXlzKCkgdGhhdCBhbGxvd3MgdXMgdG8gYmF0Y2ggb3VyIG9wZXJhdGlvbnNcbi8vIHdoaWxlIGZhbGxpbmcgYmFjayB0byBhIG5vcm1hbCBJREJDdXJzb3Igb3BlcmF0aW9uIG9uIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBnZXRBbGwoKSBvclxuLy8gZ2V0QWxsS2V5cygpLiBUaGlzIGFsbG93cyBmb3IgYSBtdWNoIGZhc3RlciBpbXBsZW1lbnRhdGlvbiB0aGFuIGp1c3Qgc3RyYWlnaHQtdXAgY3Vyc29ycywgYmVjYXVzZVxuLy8gd2UncmUgbm90IHByb2Nlc3NpbmcgZWFjaCBkb2N1bWVudCBvbmUtYXQtYS10aW1lLlxuZnVuY3Rpb24gcnVuQmF0Y2hlZEN1cnNvcihvYmplY3RTdG9yZSwga2V5UmFuZ2UsIGRlc2NlbmRpbmcsIGJhdGNoU2l6ZSwgb25CYXRjaCkge1xuXG4gIGlmIChiYXRjaFNpemUgPT09IC0xKSB7XG4gICAgYmF0Y2hTaXplID0gMTAwMDtcbiAgfVxuXG4gIC8vIEJhaWwgb3V0IG9mIGdldEFsbCgpL2dldEFsbEtleXMoKSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICAvLyAxKSBlaXRoZXIgbWV0aG9kIGlzIHVuc3VwcG9ydGVkIC0gd2UgbmVlZCBib3RoXG4gIC8vIDIpIGJhdGNoU2l6ZSBpcyAxIChtaWdodCBhcyB3ZWxsIHVzZSBJREJDdXJzb3IpXG4gIC8vIDMpIGRlc2NlbmRpbmcg4oCTIG5vIHJlYWwgd2F5IHRvIGRvIHRoaXMgdmlhIGdldEFsbCgpL2dldEFsbEtleXMoKVxuXG4gIHZhciB1c2VHZXRBbGwgPSB0eXBlb2Ygb2JqZWN0U3RvcmUuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdFN0b3JlLmdldEFsbEtleXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICBiYXRjaFNpemUgPiAxICYmICFkZXNjZW5kaW5nO1xuXG4gIHZhciBrZXlzQmF0Y2g7XG4gIHZhciB2YWx1ZXNCYXRjaDtcbiAgdmFyIHBzZXVkb0N1cnNvcjtcblxuICBmdW5jdGlvbiBvbkdldEFsbChlKSB7XG4gICAgdmFsdWVzQmF0Y2ggPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKGtleXNCYXRjaCkge1xuICAgICAgb25CYXRjaChrZXlzQmF0Y2gsIHZhbHVlc0JhdGNoLCBwc2V1ZG9DdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uR2V0QWxsS2V5cyhlKSB7XG4gICAga2V5c0JhdGNoID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmICh2YWx1ZXNCYXRjaCkge1xuICAgICAgb25CYXRjaChrZXlzQmF0Y2gsIHZhbHVlc0JhdGNoLCBwc2V1ZG9DdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVlUHNldWRvQ3Vyc29yKCkge1xuICAgIGlmICgha2V5c0JhdGNoLmxlbmd0aCkgeyAvLyBubyBtb3JlIHJlc3VsdHNcbiAgICAgIHJldHVybiBvbkJhdGNoKCk7XG4gICAgfVxuICAgIC8vIGZldGNoIG5leHQgYmF0Y2gsIGV4Y2x1c2l2ZSBzdGFydFxuICAgIHZhciBsYXN0S2V5ID0ga2V5c0JhdGNoW2tleXNCYXRjaC5sZW5ndGggLSAxXTtcbiAgICB2YXIgbmV3S2V5UmFuZ2U7XG4gICAgaWYgKGtleVJhbmdlICYmIGtleVJhbmdlLnVwcGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXdLZXlSYW5nZSA9IElEQktleVJhbmdlLmJvdW5kKGxhc3RLZXksIGtleVJhbmdlLnVwcGVyLFxuICAgICAgICAgIHRydWUsIGtleVJhbmdlLnVwcGVyT3Blbik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09IFwiRGF0YUVycm9yXCIgJiYgZS5jb2RlID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG9uQmF0Y2goKTsgLy8gd2UncmUgZG9uZSwgc3RhcnRrZXkgYW5kIGVuZGtleSBhcmUgZXF1YWxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdLZXlSYW5nZSA9IElEQktleVJhbmdlLmxvd2VyQm91bmQobGFzdEtleSwgdHJ1ZSk7XG4gICAgfVxuICAgIGtleVJhbmdlID0gbmV3S2V5UmFuZ2U7XG4gICAga2V5c0JhdGNoID0gbnVsbDtcbiAgICB2YWx1ZXNCYXRjaCA9IG51bGw7XG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlLCBiYXRjaFNpemUpLm9uc3VjY2VzcyA9IG9uR2V0QWxsO1xuICAgIG9iamVjdFN0b3JlLmdldEFsbEtleXMoa2V5UmFuZ2UsIGJhdGNoU2l6ZSkub25zdWNjZXNzID0gb25HZXRBbGxLZXlzO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DdXJzb3IoZSkge1xuICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKCFjdXJzb3IpIHsgLy8gZG9uZVxuICAgICAgcmV0dXJuIG9uQmF0Y2goKTtcbiAgICB9XG4gICAgLy8gcmVndWxhciBJREJDdXJzb3IgYWN0cyBsaWtlIGEgYmF0Y2ggd2hlcmUgYmF0Y2ggc2l6ZSBpcyBhbHdheXMgMVxuICAgIG9uQmF0Y2goW2N1cnNvci5rZXldLCBbY3Vyc29yLnZhbHVlXSwgY3Vyc29yKTtcbiAgfVxuXG4gIGlmICh1c2VHZXRBbGwpIHtcbiAgICBwc2V1ZG9DdXJzb3IgPSB7XCJjb250aW51ZVwiOiBjb250aW51ZVBzZXVkb0N1cnNvcn07XG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlLCBiYXRjaFNpemUpLm9uc3VjY2VzcyA9IG9uR2V0QWxsO1xuICAgIG9iamVjdFN0b3JlLmdldEFsbEtleXMoa2V5UmFuZ2UsIGJhdGNoU2l6ZSkub25zdWNjZXNzID0gb25HZXRBbGxLZXlzO1xuICB9IGVsc2UgaWYgKGRlc2NlbmRpbmcpIHtcbiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlLCAncHJldicpLm9uc3VjY2VzcyA9IG9uQ3Vyc29yO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2UpLm9uc3VjY2VzcyA9IG9uQ3Vyc29yO1xuICB9XG59XG5cbi8vIHNpbXBsZSBzaGltIGZvciBvYmplY3RTdG9yZS5nZXRBbGwoKSwgZmFsbGluZyBiYWNrIHRvIElEQkN1cnNvclxuZnVuY3Rpb24gZ2V0QWxsKG9iamVjdFN0b3JlLCBrZXlSYW5nZSwgb25TdWNjZXNzKSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0U3RvcmUuZ2V0QWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gdXNlIG5hdGl2ZSBnZXRBbGxcbiAgICBvYmplY3RTdG9yZS5nZXRBbGwoa2V5UmFuZ2UpLm9uc3VjY2VzcyA9IG9uU3VjY2VzcztcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZmFsbCBiYWNrIHRvIGN1cnNvcnNcbiAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIG9uQ3Vyc29yKGUpIHtcbiAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmIChjdXJzb3IpIHtcbiAgICAgIHZhbHVlcy5wdXNoKGN1cnNvci52YWx1ZSk7XG4gICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25TdWNjZXNzKHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgcmVzdWx0OiB2YWx1ZXNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSkub25zdWNjZXNzID0gb25DdXJzb3I7XG59XG5cbmZ1bmN0aW9uIGFsbERvY3NLZXlzKGtleXMsIGRvY1N0b3JlLCBvbkJhdGNoKSB7XG4gIC8vIEl0J3Mgbm90IGd1YXJhbnRlZCB0byBiZSByZXR1cm5lZCBpbiByaWdodCBvcmRlciAgXG4gIHZhciB2YWx1ZXNCYXRjaCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gIHZhciBjb3VudCA9IDA7XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5LCBpbmRleCkge1xuICAgIGRvY1N0b3JlLmdldChrZXkpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5yZXN1bHQpIHtcbiAgICAgICAgdmFsdWVzQmF0Y2hbaW5kZXhdID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc0JhdGNoW2luZGV4XSA9IHtrZXk6IGtleSwgZXJyb3I6ICdub3RfZm91bmQnfTtcbiAgICAgIH1cbiAgICAgIGNvdW50Kys7XG4gICAgICBpZiAoY291bnQgPT09IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIG9uQmF0Y2goa2V5cywgdmFsdWVzQmF0Y2gsIHt9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5UmFuZ2Uoc3RhcnQsIGVuZCwgaW5jbHVzaXZlRW5kLCBrZXksIGRlc2NlbmRpbmcpIHtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICBpZiAoZGVzY2VuZGluZykge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoZW5kLCBzdGFydCwgIWluY2x1c2l2ZUVuZCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQsIGZhbHNlLCAhaW5jbHVzaXZlRW5kKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgICBpZiAoZGVzY2VuZGluZykge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UudXBwZXJCb3VuZChzdGFydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChzdGFydCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmQpIHtcbiAgICAgIGlmIChkZXNjZW5kaW5nKSB7XG4gICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5sb3dlckJvdW5kKGVuZCwgIWluY2x1c2l2ZUVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UudXBwZXJCb3VuZChlbmQsICFpbmNsdXNpdmVFbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5KSB7XG4gICAgICByZXR1cm4gSURCS2V5UmFuZ2Uub25seShrZXkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpZGJBbGxEb2NzKG9wdHMsIGlkYiwgY2FsbGJhY2spIHtcbiAgdmFyIHN0YXJ0ID0gJ3N0YXJ0a2V5JyBpbiBvcHRzID8gb3B0cy5zdGFydGtleSA6IGZhbHNlO1xuICB2YXIgZW5kID0gJ2VuZGtleScgaW4gb3B0cyA/IG9wdHMuZW5ka2V5IDogZmFsc2U7XG4gIHZhciBrZXkgPSAna2V5JyBpbiBvcHRzID8gb3B0cy5rZXkgOiBmYWxzZTtcbiAgdmFyIGtleXMgPSAna2V5cycgaW4gb3B0cyA/IG9wdHMua2V5cyA6IGZhbHNlOyBcbiAgdmFyIHNraXAgPSBvcHRzLnNraXAgfHwgMDtcbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgPT09ICdudW1iZXInID8gb3B0cy5saW1pdCA6IC0xO1xuICB2YXIgaW5jbHVzaXZlRW5kID0gb3B0cy5pbmNsdXNpdmVfZW5kICE9PSBmYWxzZTtcblxuICB2YXIga2V5UmFuZ2UgOyBcbiAgdmFyIGtleVJhbmdlRXJyb3I7XG4gIGlmICgha2V5cykge1xuICAgIGtleVJhbmdlID0gY3JlYXRlS2V5UmFuZ2Uoc3RhcnQsIGVuZCwgaW5jbHVzaXZlRW5kLCBrZXksIG9wdHMuZGVzY2VuZGluZyk7XG4gICAga2V5UmFuZ2VFcnJvciA9IGtleVJhbmdlICYmIGtleVJhbmdlLmVycm9yO1xuICAgIGlmIChrZXlSYW5nZUVycm9yICYmIFxuICAgICAgIShrZXlSYW5nZUVycm9yLm5hbWUgPT09IFwiRGF0YUVycm9yXCIgJiYga2V5UmFuZ2VFcnJvci5jb2RlID09PSAwKSkge1xuICAgICAgLy8gRGF0YUVycm9yIHdpdGggZXJyb3IgY29kZSAwIGluZGljYXRlcyBzdGFydCBpcyBsZXNzIHRoYW4gZW5kLCBzb1xuICAgICAgLy8gY2FuIGp1c3QgZG8gYW4gZW1wdHkgcXVlcnkuIEVsc2UgbmVlZCB0byB0aHJvd1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKElEQl9FUlJPUixcbiAgICAgICAga2V5UmFuZ2VFcnJvci5uYW1lLCBrZXlSYW5nZUVycm9yLm1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RvcmVzID0gW0RPQ19TVE9SRSwgQllfU0VRX1NUT1JFLCBNRVRBX1NUT1JFXTtcblxuICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgIHN0b3Jlcy5wdXNoKEFUVEFDSF9TVE9SRSk7XG4gIH1cbiAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIHN0b3JlcywgJ3JlYWRvbmx5Jyk7XG4gIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgfVxuICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgdHhuLm9uY29tcGxldGUgPSBvblR4bkNvbXBsZXRlO1xuICB0eG4ub25hYm9ydCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gIHZhciBzZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICB2YXIgbWV0YVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpO1xuICB2YXIgZG9jSWRSZXZJbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgZG9jQ291bnQ7XG4gIHZhciB1cGRhdGVTZXE7XG5cbiAgbWV0YVN0b3JlLmdldChNRVRBX1NUT1JFKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgIGRvY0NvdW50ID0gZS50YXJnZXQucmVzdWx0LmRvY0NvdW50O1xuICB9O1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgZ2V0TWF4VXBkYXRlU2VxKHNlcVN0b3JlLCBmdW5jdGlvbiAoZSkgeyBcbiAgICAgIGlmIChlLnRhcmdldC5yZXN1bHQgJiYgZS50YXJnZXQucmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXBkYXRlU2VxID0gZS50YXJnZXQucmVzdWx0WzBdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWF4VXBkYXRlU2VxKG9iamVjdFN0b3JlLCBvblN1Y2Nlc3MpIHtcbiAgICBmdW5jdGlvbiBvbkN1cnNvcihlKSB7XG4gICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgdmFyIG1heEtleSA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjdXJzb3IgJiYgY3Vyc29yLmtleSkge1xuICAgICAgICBtYXhLZXkgPSBjdXJzb3Iua2V5O1xuICAgICAgfSBcbiAgICAgIHJldHVybiBvblN1Y2Nlc3Moe1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICByZXN1bHQ6IFttYXhLZXldXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKG51bGwsICdwcmV2Jykub25zdWNjZXNzID0gb25DdXJzb3I7XG4gIH1cblxuICAvLyBpZiB0aGUgdXNlciBzcGVjaWZpZXMgaW5jbHVkZV9kb2NzPXRydWUsIHRoZW4gd2UgZG9uJ3RcbiAgLy8gd2FudCB0byBibG9jayB0aGUgbWFpbiBjdXJzb3Igd2hpbGUgd2UncmUgZmV0Y2hpbmcgdGhlIGRvY1xuICBmdW5jdGlvbiBmZXRjaERvY0FzeW5jaHJvbm91c2x5KG1ldGFkYXRhLCByb3csIHdpbm5pbmdSZXYkJDEpIHtcbiAgICB2YXIga2V5ID0gbWV0YWRhdGEuaWQgKyBcIjo6XCIgKyB3aW5uaW5nUmV2JCQxO1xuICAgIGRvY0lkUmV2SW5kZXguZ2V0KGtleSkub25zdWNjZXNzID0gIGZ1bmN0aW9uIG9uR2V0RG9jKGUpIHtcbiAgICAgIHJvdy5kb2MgPSBkZWNvZGVEb2MoZS50YXJnZXQucmVzdWx0KSB8fCB7fTtcbiAgICAgIGlmIChvcHRzLmNvbmZsaWN0cykge1xuICAgICAgICB2YXIgY29uZmxpY3RzID0gY29sbGVjdENvbmZsaWN0cyhtZXRhZGF0YSk7XG4gICAgICAgIGlmIChjb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICAgICAgcm93LmRvYy5fY29uZmxpY3RzID0gY29uZmxpY3RzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmZXRjaEF0dGFjaG1lbnRzSWZOZWNlc3Nhcnkocm93LmRvYywgb3B0cywgdHhuKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYWxsRG9jc0lubmVyKHdpbm5pbmdSZXYkJDEsIG1ldGFkYXRhKSB7XG4gICAgdmFyIHJvdyA9IHtcbiAgICAgIGlkOiBtZXRhZGF0YS5pZCxcbiAgICAgIGtleTogbWV0YWRhdGEuaWQsXG4gICAgICB2YWx1ZToge1xuICAgICAgICByZXY6IHdpbm5pbmdSZXYkJDFcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBkZWxldGVkID0gbWV0YWRhdGEuZGVsZXRlZDtcbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgaWYgKGtleXMpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJvdyk7XG4gICAgICAgIC8vIGRlbGV0ZWQgZG9jcyBhcmUgb2theSB3aXRoIFwia2V5c1wiIHJlcXVlc3RzXG4gICAgICAgIHJvdy52YWx1ZS5kZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgcm93LmRvYyA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChza2lwLS0gPD0gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHJvdyk7XG4gICAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgICAgZmV0Y2hEb2NBc3luY2hyb25vdXNseShtZXRhZGF0YSwgcm93LCB3aW5uaW5nUmV2JCQxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzQmF0Y2goYmF0Y2hWYWx1ZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYmF0Y2hWYWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gbGltaXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2YXIgYmF0Y2hWYWx1ZSA9IGJhdGNoVmFsdWVzW2ldO1xuICAgICAgaWYgKGJhdGNoVmFsdWUuZXJyb3IgJiYga2V5cykge1xuICAgICAgICAvLyBrZXkgd2FzIG5vdCBmb3VuZCB3aXRoIFwia2V5c1wiIHJlcXVlc3RzXG4gICAgICAgIHJlc3VsdHMucHVzaChiYXRjaFZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShiYXRjaFZhbHVlKTtcbiAgICAgIHZhciB3aW5uaW5nUmV2JCQxID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgIGFsbERvY3NJbm5lcih3aW5uaW5nUmV2JCQxLCBtZXRhZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25CYXRjaChiYXRjaEtleXMsIGJhdGNoVmFsdWVzLCBjdXJzb3IpIHtcbiAgICBpZiAoIWN1cnNvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzQmF0Y2goYmF0Y2hWYWx1ZXMpO1xuICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8IGxpbWl0KSB7XG4gICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkdldEFsbChlKSB7XG4gICAgdmFyIHZhbHVlcyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICBwcm9jZXNzQmF0Y2godmFsdWVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUmVzdWx0c1JlYWR5KCkge1xuICAgIHZhciByZXR1cm5WYWwgPSB7XG4gICAgICB0b3RhbF9yb3dzOiBkb2NDb3VudCxcbiAgICAgIG9mZnNldDogb3B0cy5za2lwLFxuICAgICAgcm93czogcmVzdWx0c1xuICAgIH07XG4gICAgXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSAmJiB1cGRhdGVTZXEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuVmFsLnVwZGF0ZV9zZXEgPSB1cGRhdGVTZXE7XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwsIHJldHVyblZhbCk7XG4gIH1cblxuICBmdW5jdGlvbiBvblR4bkNvbXBsZXRlKCkge1xuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMsIG9wdHMuYmluYXJ5KS50aGVuKG9uUmVzdWx0c1JlYWR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25SZXN1bHRzUmVhZHkoKTtcbiAgICB9XG4gIH1cblxuICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IHJlcXVlc3RzIGlmIHN0YXJ0ID4gZW5kIG9yIGxpbWl0ID09PSAwXG4gIGlmIChrZXlSYW5nZUVycm9yIHx8IGxpbWl0ID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChrZXlzKSB7XG4gICAgcmV0dXJuIGFsbERvY3NLZXlzKG9wdHMua2V5cywgZG9jU3RvcmUsIG9uQmF0Y2gpO1xuICB9XG4gIGlmIChsaW1pdCA9PT0gLTEpIHsgLy8ganVzdCBmZXRjaCBldmVyeXRoaW5nXG4gICAgcmV0dXJuIGdldEFsbChkb2NTdG9yZSwga2V5UmFuZ2UsIG9uR2V0QWxsKTtcbiAgfVxuICAvLyBlbHNlIGRvIGEgY3Vyc29yXG4gIC8vIGNob29zZSBhIGJhdGNoIHNpemUgYmFzZWQgb24gdGhlIHNraXAsIHNpbmNlIHdlJ2xsIG5lZWQgdG8gc2tpcCB0aGF0IG1hbnlcbiAgcnVuQmF0Y2hlZEN1cnNvcihkb2NTdG9yZSwga2V5UmFuZ2UsIG9wdHMuZGVzY2VuZGluZywgbGltaXQgKyBza2lwLCBvbkJhdGNoKTtcbn1cblxuLy9cbi8vIEJsb2JzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGFsbCB2ZXJzaW9ucyBvZiBJbmRleGVkREIsIG5vdGFibHlcbi8vIENocm9tZSA8MzcgYW5kIEFuZHJvaWQgPDUuIEluIHRob3NlIHZlcnNpb25zLCBzdG9yaW5nIGEgYmxvYiB3aWxsIHRocm93LlxuLy9cbi8vIFZhcmlvdXMgb3RoZXIgYmxvYiBidWdzIGV4aXN0IGluIENocm9tZSB2MzctNDIgKGluY2x1c2l2ZSkuXG4vLyBEZXRlY3RpbmcgdGhlbSBpcyBleHBlbnNpdmUgYW5kIGNvbmZ1c2luZyB0byB1c2VycywgYW5kIENocm9tZSAzNy00MlxuLy8gaXMgYXQgdmVyeSBsb3cgdXNhZ2Ugd29ybGR3aWRlLCBzbyB3ZSBkbyBhIGhhY2t5IHVzZXJBZ2VudCBjaGVjayBpbnN0ZWFkLlxuLy9cbi8vIGNvbnRlbnQtdHlwZSBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00MDgxMjBcbi8vIDQwNCBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDc5MTZcbi8vIEZpbGVSZWFkZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ3ODM2XG4vL1xuZnVuY3Rpb24gY2hlY2tCbG9iU3VwcG9ydCh0eG4pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgdmFyIGJsb2IkJDEgPSBjcmVhdGVCbG9iKFsnJ10pO1xuICAgIHZhciByZXEgPSB0eG4ub2JqZWN0U3RvcmUoREVURUNUX0JMT0JfU1VQUE9SVF9TVE9SRSkucHV0KGJsb2IkJDEsICdrZXknKTtcblxuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbWF0Y2hlZENocm9tZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgICAgdmFyIG1hdGNoZWRFZGdlID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLy8pO1xuICAgICAgLy8gTVMgRWRnZSBwcmV0ZW5kcyB0byBiZSBDaHJvbWUgNDI6XG4gICAgICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2hoODY5MzAxJTI4dj12cy44NSUyOS5hc3B4XG4gICAgICByZXNvbHZlKG1hdGNoZWRFZGdlIHx8ICFtYXRjaGVkQ2hyb21lIHx8XG4gICAgICAgIHBhcnNlSW50KG1hdGNoZWRDaHJvbWVbMV0sIDEwKSA+PSA0Myk7XG4gICAgfTtcblxuICAgIHJlcS5vbmVycm9yID0gdHhuLm9uYWJvcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gSWYgdGhlIHRyYW5zYWN0aW9uIGFib3J0cyBub3cgaXRzIGR1ZSB0byBub3QgYmVpbmcgYWJsZSB0b1xuICAgICAgLy8gd3JpdGUgdG8gdGhlIGRhdGFiYXNlLCBsaWtlbHkgZHVlIHRvIHRoZSBkaXNrIGJlaW5nIGZ1bGxcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9O1xuICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBlcnJvciwgc28gYXNzdW1lIHVuc3VwcG9ydGVkXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb3VudERvY3ModHhuLCBjYikge1xuICB2YXIgaW5kZXggPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKS5pbmRleCgnZGVsZXRlZE9yTG9jYWwnKTtcbiAgaW5kZXguY291bnQoSURCS2V5UmFuZ2Uub25seSgnMCcpKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgIGNiKGUudGFyZ2V0LnJlc3VsdCk7XG4gIH07XG59XG5cbi8vIFRoaXMgdGFzayBxdWV1ZSBlbnN1cmVzIHRoYXQgSURCIG9wZW4gY2FsbHMgYXJlIGRvbmUgaW4gdGhlaXIgb3duIHRpY2tcblxudmFyIHJ1bm5pbmcgPSBmYWxzZTtcbnZhciBxdWV1ZSA9IFtdO1xuXG5mdW5jdGlvbiB0cnlDb2RlKGZ1biwgZXJyLCByZXMsIFBvdWNoREIpIHtcbiAgdHJ5IHtcbiAgICBmdW4oZXJyLCByZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBTaG91bGRuJ3QgaGFwcGVuLCBidXQgaW4gc29tZSBvZGQgY2FzZXNcbiAgICAvLyBJbmRleGVkREIgaW1wbGVtZW50YXRpb25zIG1pZ2h0IHRocm93IGEgc3luY1xuICAgIC8vIGVycm9yLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCBhdCBsZWFzdCBsb2cgaXQuXG4gICAgUG91Y2hEQi5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlOZXh0KCkge1xuICBpZiAocnVubmluZyB8fCAhcXVldWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJ1bm5pbmcgPSB0cnVlO1xuICBxdWV1ZS5zaGlmdCgpKCk7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVUYXNrKGFjdGlvbiwgY2FsbGJhY2ssIFBvdWNoREIpIHtcbiAgcXVldWUucHVzaChmdW5jdGlvbiBydW5BY3Rpb24oKSB7XG4gICAgYWN0aW9uKGZ1bmN0aW9uIHJ1bkNhbGxiYWNrKGVyciwgcmVzKSB7XG4gICAgICB0cnlDb2RlKGNhbGxiYWNrLCBlcnIsIHJlcywgUG91Y2hEQik7XG4gICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gcnVuTmV4dCgpIHtcbiAgICAgICAgYXBwbHlOZXh0KFBvdWNoREIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuICBhcHBseU5leHQoKTtcbn1cblxuZnVuY3Rpb24gY2hhbmdlcyhvcHRzLCBhcGksIGRiTmFtZSwgaWRiKSB7XG4gIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICBpZiAob3B0cy5jb250aW51b3VzKSB7XG4gICAgdmFyIGlkID0gZGJOYW1lICsgJzonICsgdXVpZCgpO1xuICAgIGNoYW5nZXNIYW5kbGVyLmFkZExpc3RlbmVyKGRiTmFtZSwgaWQsIGFwaSwgb3B0cyk7XG4gICAgY2hhbmdlc0hhbmRsZXIubm90aWZ5KGRiTmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFuZ2VzSGFuZGxlci5yZW1vdmVMaXN0ZW5lcihkYk5hbWUsIGlkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGRvY0lkcyA9IG9wdHMuZG9jX2lkcyAmJiBuZXcgRXhwb3J0ZWRTZXQob3B0cy5kb2NfaWRzKTtcblxuICBvcHRzLnNpbmNlID0gb3B0cy5zaW5jZSB8fCAwO1xuICB2YXIgbGFzdFNlcSA9IG9wdHMuc2luY2U7XG5cbiAgdmFyIGxpbWl0ID0gJ2xpbWl0JyBpbiBvcHRzID8gb3B0cy5saW1pdCA6IC0xO1xuICBpZiAobGltaXQgPT09IDApIHtcbiAgICBsaW1pdCA9IDE7IC8vIHBlciBDb3VjaERCIF9jaGFuZ2VzIHNwZWNcbiAgfVxuXG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBudW1SZXN1bHRzID0gMDtcbiAgdmFyIGZpbHRlciA9IGZpbHRlckNoYW5nZShvcHRzKTtcbiAgdmFyIGRvY0lkc1RvTWV0YWRhdGEgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcblxuICB2YXIgdHhuO1xuICB2YXIgYnlTZXFTdG9yZTtcbiAgdmFyIGRvY1N0b3JlO1xuICB2YXIgZG9jSWRSZXZJbmRleDtcblxuICBmdW5jdGlvbiBvbkJhdGNoKGJhdGNoS2V5cywgYmF0Y2hWYWx1ZXMsIGN1cnNvcikge1xuICAgIGlmICghY3Vyc29yIHx8ICFiYXRjaEtleXMubGVuZ3RoKSB7IC8vIGRvbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgd2lubmluZ0RvY3MgPSBuZXcgQXJyYXkoYmF0Y2hLZXlzLmxlbmd0aCk7XG4gICAgdmFyIG1ldGFkYXRhcyA9IG5ldyBBcnJheShiYXRjaEtleXMubGVuZ3RoKTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NNZXRhZGF0YUFuZFdpbm5pbmdEb2MobWV0YWRhdGEsIHdpbm5pbmdEb2MpIHtcbiAgICAgIHZhciBjaGFuZ2UgPSBvcHRzLnByb2Nlc3NDaGFuZ2Uod2lubmluZ0RvYywgbWV0YWRhdGEsIG9wdHMpO1xuICAgICAgbGFzdFNlcSA9IGNoYW5nZS5zZXEgPSBtZXRhZGF0YS5zZXE7XG5cbiAgICAgIHZhciBmaWx0ZXJlZCA9IGZpbHRlcihjaGFuZ2UpO1xuICAgICAgaWYgKHR5cGVvZiBmaWx0ZXJlZCA9PT0gJ29iamVjdCcpIHsgLy8gYW55dGhpbmcgYnV0IHRydWUvZmFsc2UgaW5kaWNhdGVzIGVycm9yXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChmaWx0ZXJlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZmlsdGVyZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgbnVtUmVzdWx0cysrO1xuICAgICAgaWYgKG9wdHMucmV0dXJuX2RvY3MpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGNoYW5nZSk7XG4gICAgICB9XG4gICAgICAvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50IGltbWVkaWF0ZWx5XG4gICAgICAvLyBmb3IgdGhlIGJlbmVmaXQgb2YgbGl2ZSBsaXN0ZW5lcnNcbiAgICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGZldGNoQXR0YWNobWVudHNJZk5lY2Vzc2FyeSh3aW5uaW5nRG9jLCBvcHRzLCB0eG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHBvc3RQcm9jZXNzQXR0YWNobWVudHMoW2NoYW5nZV0sIG9wdHMuYmluYXJ5KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShjaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQmF0Y2hEb25lKCkge1xuICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gd2lubmluZ0RvY3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKG51bVJlc3VsdHMgPT09IGxpbWl0KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpbm5pbmdEb2MgPSB3aW5uaW5nRG9jc1tpXTtcbiAgICAgICAgaWYgKCF3aW5uaW5nRG9jKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1ldGFkYXRhID0gbWV0YWRhdGFzW2ldO1xuICAgICAgICBwcm9taXNlcy5wdXNoKHByb2Nlc3NNZXRhZGF0YUFuZFdpbm5pbmdEb2MobWV0YWRhdGEsIHdpbm5pbmdEb2MpKTtcbiAgICAgIH1cblxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNoYW5nZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBpZiAoY2hhbmdlc1tpXSkge1xuICAgICAgICAgICAgb3B0cy5vbkNoYW5nZShjaGFuZ2VzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKG9wdHMuY29tcGxldGUpO1xuXG4gICAgICBpZiAobnVtUmVzdWx0cyAhPT0gbGltaXQpIHtcbiAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggYWxsIG1ldGFkYXRhcy93aW5uaW5nZG9jcyBmcm9tIHRoaXMgYmF0Y2ggaW4gcGFyYWxsZWwsIHRoZW4gcHJvY2Vzc1xuICAgIC8vIHRoZW0gYWxsIG9ubHkgb25jZSBhbGwgZGF0YSBoYXMgYmVlbiBjb2xsZWN0ZWQuIFRoaXMgaXMgZG9uZSBpbiBwYXJhbGxlbFxuICAgIC8vIGJlY2F1c2UgaXQncyBmYXN0ZXIgdGhhbiBkb2luZyBpdCBvbmUtYXQtYS10aW1lLlxuICAgIHZhciBudW1Eb25lID0gMDtcbiAgICBiYXRjaFZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgdmFyIGRvYyA9IGRlY29kZURvYyh2YWx1ZSk7XG4gICAgICB2YXIgc2VxID0gYmF0Y2hLZXlzW2ldO1xuICAgICAgZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEoZG9jLCBzZXEsIGZ1bmN0aW9uIChtZXRhZGF0YSwgd2lubmluZ0RvYykge1xuICAgICAgICBtZXRhZGF0YXNbaV0gPSBtZXRhZGF0YTtcbiAgICAgICAgd2lubmluZ0RvY3NbaV0gPSB3aW5uaW5nRG9jO1xuICAgICAgICBpZiAoKytudW1Eb25lID09PSBiYXRjaEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgb25CYXRjaERvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkdldE1ldGFkYXRhKGRvYywgc2VxLCBtZXRhZGF0YSwgY2IpIHtcbiAgICBpZiAobWV0YWRhdGEuc2VxICE9PSBzZXEpIHtcbiAgICAgIC8vIHNvbWUgb3RoZXIgc2VxIGlzIGxhdGVyXG4gICAgICByZXR1cm4gY2IoKTtcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEud2lubmluZ1JldiA9PT0gZG9jLl9yZXYpIHtcbiAgICAgIC8vIHRoaXMgaXMgdGhlIHdpbm5pbmcgZG9jXG4gICAgICByZXR1cm4gY2IobWV0YWRhdGEsIGRvYyk7XG4gICAgfVxuXG4gICAgLy8gZmV0Y2ggd2lubmluZyBkb2MgaW4gc2VwYXJhdGUgcmVxdWVzdFxuICAgIHZhciBkb2NJZFJldiA9IGRvYy5faWQgKyAnOjonICsgbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICB2YXIgcmVxID0gZG9jSWRSZXZJbmRleC5nZXQoZG9jSWRSZXYpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgY2IobWV0YWRhdGEsIGRlY29kZURvYyhlLnRhcmdldC5yZXN1bHQpKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEoZG9jLCBzZXEsIGNiKSB7XG4gICAgaWYgKGRvY0lkcyAmJiAhZG9jSWRzLmhhcyhkb2MuX2lkKSkge1xuICAgICAgcmV0dXJuIGNiKCk7XG4gICAgfVxuXG4gICAgdmFyIG1ldGFkYXRhID0gZG9jSWRzVG9NZXRhZGF0YS5nZXQoZG9jLl9pZCk7XG4gICAgaWYgKG1ldGFkYXRhKSB7IC8vIGNhY2hlZFxuICAgICAgcmV0dXJuIG9uR2V0TWV0YWRhdGEoZG9jLCBzZXEsIG1ldGFkYXRhLCBjYik7XG4gICAgfVxuICAgIC8vIG1ldGFkYXRhIG5vdCBjYWNoZWQsIGhhdmUgdG8gZ28gZmV0Y2ggaXRcbiAgICBkb2NTdG9yZS5nZXQoZG9jLl9pZCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1ldGFkYXRhID0gZGVjb2RlTWV0YWRhdGEoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgIGRvY0lkc1RvTWV0YWRhdGEuc2V0KGRvYy5faWQsIG1ldGFkYXRhKTtcbiAgICAgIG9uR2V0TWV0YWRhdGEoZG9jLCBzZXEsIG1ldGFkYXRhLCBjYik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICBvcHRzLmNvbXBsZXRlKG51bGwsIHtcbiAgICAgIHJlc3VsdHM6IHJlc3VsdHMsXG4gICAgICBsYXN0X3NlcTogbGFzdFNlcVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25UeG5Db21wbGV0ZSgpIHtcbiAgICBpZiAoIW9wdHMuY29udGludW91cyAmJiBvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICAvLyBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgcG9zdFByb2Nlc3Npbmcgd2FzIGFscmVhZHkgZG9uZSxcbiAgICAgIC8vIHNvIGRvIGl0IGFnYWluXG4gICAgICBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMpLnRoZW4oZmluaXNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmluaXNoKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIG9iamVjdFN0b3JlcyA9IFtET0NfU1RPUkUsIEJZX1NFUV9TVE9SRV07XG4gIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgb2JqZWN0U3RvcmVzLnB1c2goQVRUQUNIX1NUT1JFKTtcbiAgfVxuICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgb2JqZWN0U3RvcmVzLCAncmVhZG9ubHknKTtcbiAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgIHJldHVybiBvcHRzLmNvbXBsZXRlKHR4blJlc3VsdC5lcnJvcik7XG4gIH1cbiAgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihvcHRzLmNvbXBsZXRlKTtcbiAgdHhuLm9uY29tcGxldGUgPSBvblR4bkNvbXBsZXRlO1xuXG4gIGJ5U2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgZG9jU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKTtcbiAgZG9jSWRSZXZJbmRleCA9IGJ5U2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG5cbiAgdmFyIGtleVJhbmdlID0gKG9wdHMuc2luY2UgJiYgIW9wdHMuZGVzY2VuZGluZykgP1xuICAgIElEQktleVJhbmdlLmxvd2VyQm91bmQob3B0cy5zaW5jZSwgdHJ1ZSkgOiBudWxsO1xuXG4gIHJ1bkJhdGNoZWRDdXJzb3IoYnlTZXFTdG9yZSwga2V5UmFuZ2UsIG9wdHMuZGVzY2VuZGluZywgbGltaXQsIG9uQmF0Y2gpO1xufVxuXG52YXIgY2FjaGVkREJzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG52YXIgYmxvYlN1cHBvcnRQcm9taXNlO1xudmFyIG9wZW5SZXFMaXN0ID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbmZ1bmN0aW9uIElkYlBvdWNoKG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBhcGkgPSB0aGlzO1xuXG4gIGVucXVldWVUYXNrKGZ1bmN0aW9uICh0aGlzQ2FsbGJhY2spIHtcbiAgICBpbml0KGFwaSwgb3B0cywgdGhpc0NhbGxiYWNrKTtcbiAgfSwgY2FsbGJhY2ssIGFwaS5jb25zdHJ1Y3Rvcik7XG59XG5cbmZ1bmN0aW9uIGluaXQoYXBpLCBvcHRzLCBjYWxsYmFjaykge1xuXG4gIHZhciBkYk5hbWUgPSBvcHRzLm5hbWU7XG5cbiAgdmFyIGlkYiA9IG51bGw7XG4gIHZhciBpZGJHbG9iYWxGYWlsdXJlRXJyb3IgPSBudWxsO1xuICBhcGkuX21ldGEgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGVucmljaENhbGxiYWNrRXJyb3IoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHtcbiAgICAgIGlmIChlcnJvciAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICFlcnJvci5yZWFzb24pIHtcbiAgICAgICAgaWYgKGlkYkdsb2JhbEZhaWx1cmVFcnJvcikge1xuICAgICAgICAgIGVycm9yLnJlYXNvbiA9IGlkYkdsb2JhbEZhaWx1cmVFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0KTtcbiAgICB9O1xuICB9XG5cbiAgLy8gY2FsbGVkIHdoZW4gY3JlYXRpbmcgYSBmcmVzaCBuZXcgZGF0YWJhc2VcbiAgZnVuY3Rpb24gY3JlYXRlU2NoZW1hKGRiKSB7XG4gICAgdmFyIGRvY1N0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoRE9DX1NUT1JFLCB7a2V5UGF0aCA6ICdpZCd9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShCWV9TRVFfU1RPUkUsIHthdXRvSW5jcmVtZW50OiB0cnVlfSlcbiAgICAgIC5jcmVhdGVJbmRleCgnX2RvY19pZF9yZXYnLCAnX2RvY19pZF9yZXYnLCB7dW5pcXVlOiB0cnVlfSk7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFLCB7a2V5UGF0aDogJ2RpZ2VzdCd9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShNRVRBX1NUT1JFLCB7a2V5UGF0aDogJ2lkJywgYXV0b0luY3JlbWVudDogZmFsc2V9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShERVRFQ1RfQkxPQl9TVVBQT1JUX1NUT1JFKTtcblxuICAgIC8vIGFkZGVkIGluIHYyXG4gICAgZG9jU3RvcmUuY3JlYXRlSW5kZXgoJ2RlbGV0ZWRPckxvY2FsJywgJ2RlbGV0ZWRPckxvY2FsJywge3VuaXF1ZSA6IGZhbHNlfSk7XG5cbiAgICAvLyBhZGRlZCBpbiB2M1xuICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKExPQ0FMX1NUT1JFLCB7a2V5UGF0aDogJ19pZCd9KTtcblxuICAgIC8vIGFkZGVkIGluIHY0XG4gICAgdmFyIGF0dEFuZFNlcVN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUsXG4gICAgICB7YXV0b0luY3JlbWVudDogdHJ1ZX0pO1xuICAgIGF0dEFuZFNlcVN0b3JlLmNyZWF0ZUluZGV4KCdzZXEnLCAnc2VxJyk7XG4gICAgYXR0QW5kU2VxU3RvcmUuY3JlYXRlSW5kZXgoJ2RpZ2VzdFNlcScsICdkaWdlc3RTZXEnLCB7dW5pcXVlOiB0cnVlfSk7XG4gIH1cblxuICAvLyBtaWdyYXRpb24gdG8gdmVyc2lvbiAyXG4gIC8vIHVuZm9ydHVuYXRlbHkgXCJkZWxldGVkT3JMb2NhbFwiIGlzIGEgbWlzbm9tZXIgbm93IHRoYXQgd2Ugbm8gbG9uZ2VyXG4gIC8vIHN0b3JlIGxvY2FsIGRvY3MgaW4gdGhlIG1haW4gZG9jLXN0b3JlLCBidXQgd2hhZGR5YWdvbm5hZG9cbiAgZnVuY3Rpb24gYWRkRGVsZXRlZE9yTG9jYWxJbmRleCh0eG4sIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgZG9jU3RvcmUuY3JlYXRlSW5kZXgoJ2RlbGV0ZWRPckxvY2FsJywgJ2RlbGV0ZWRPckxvY2FsJywge3VuaXF1ZSA6IGZhbHNlfSk7XG5cbiAgICBkb2NTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgY3Vyc29yID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gY3Vyc29yLnZhbHVlO1xuICAgICAgICB2YXIgZGVsZXRlZCA9IGlzRGVsZXRlZChtZXRhZGF0YSk7XG4gICAgICAgIG1ldGFkYXRhLmRlbGV0ZWRPckxvY2FsID0gZGVsZXRlZCA/IFwiMVwiIDogXCIwXCI7XG4gICAgICAgIGRvY1N0b3JlLnB1dChtZXRhZGF0YSk7XG4gICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gMyAocGFydCAxKVxuICBmdW5jdGlvbiBjcmVhdGVMb2NhbFN0b3JlU2NoZW1hKGRiKSB7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUsIHtrZXlQYXRoOiAnX2lkJ30pXG4gICAgICAuY3JlYXRlSW5kZXgoJ19kb2NfaWRfcmV2JywgJ19kb2NfaWRfcmV2Jywge3VuaXF1ZTogdHJ1ZX0pO1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gMyAocGFydCAyKVxuICBmdW5jdGlvbiBtaWdyYXRlTG9jYWxTdG9yZSh0eG4sIGNiKSB7XG4gICAgdmFyIGxvY2FsU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUpO1xuICAgIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuICAgIHZhciBzZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuXG4gICAgdmFyIGN1cnNvciA9IGRvY1N0b3JlLm9wZW5DdXJzb3IoKTtcbiAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgY3Vyc29yID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gY3Vyc29yLnZhbHVlO1xuICAgICAgICB2YXIgZG9jSWQgPSBtZXRhZGF0YS5pZDtcbiAgICAgICAgdmFyIGxvY2FsID0gaXNMb2NhbElkKGRvY0lkKTtcbiAgICAgICAgdmFyIHJldiA9IHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuICAgICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgICB2YXIgZG9jSWRSZXYgPSBkb2NJZCArIFwiOjpcIiArIHJldjtcbiAgICAgICAgICAvLyByZW1vdmUgYWxsIHNlcSBlbnRyaWVzXG4gICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jSWRcbiAgICAgICAgICB2YXIgc3RhcnQgPSBkb2NJZCArIFwiOjpcIjtcbiAgICAgICAgICB2YXIgZW5kID0gZG9jSWQgKyBcIjo6flwiO1xuICAgICAgICAgIHZhciBpbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICAgICAgICAgIHZhciByYW5nZSA9IElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgdmFyIHNlcUN1cnNvciA9IGluZGV4Lm9wZW5DdXJzb3IocmFuZ2UpO1xuICAgICAgICAgIHNlcUN1cnNvci5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgc2VxQ3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgaWYgKCFzZXFDdXJzb3IpIHtcbiAgICAgICAgICAgICAgLy8gZG9uZVxuICAgICAgICAgICAgICBkb2NTdG9yZS5kZWxldGUoY3Vyc29yLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBkYXRhID0gc2VxQ3Vyc29yLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZGF0YS5fZG9jX2lkX3JldiA9PT0gZG9jSWRSZXYpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JlLnB1dChkYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXFTdG9yZS5kZWxldGUoc2VxQ3Vyc29yLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICBzZXFDdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNiKSB7XG4gICAgICAgIGNiKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDQgKHBhcnQgMSlcbiAgZnVuY3Rpb24gYWRkQXR0YWNoQW5kU2VxU3RvcmUoZGIpIHtcbiAgICB2YXIgYXR0QW5kU2VxU3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShBVFRBQ0hfQU5EX1NFUV9TVE9SRSxcbiAgICAgIHthdXRvSW5jcmVtZW50OiB0cnVlfSk7XG4gICAgYXR0QW5kU2VxU3RvcmUuY3JlYXRlSW5kZXgoJ3NlcScsICdzZXEnKTtcbiAgICBhdHRBbmRTZXFTdG9yZS5jcmVhdGVJbmRleCgnZGlnZXN0U2VxJywgJ2RpZ2VzdFNlcScsIHt1bmlxdWU6IHRydWV9KTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDQgKHBhcnQgMilcbiAgZnVuY3Rpb24gbWlncmF0ZUF0dHNBbmRTZXFzKHR4biwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgICB2YXIgYXR0U3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKTtcbiAgICB2YXIgYXR0QW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuXG4gICAgLy8gbmVlZCB0byBhY3R1YWxseSBwb3B1bGF0ZSB0aGUgdGFibGUuIHRoaXMgaXMgdGhlIGV4cGVuc2l2ZSBwYXJ0LFxuICAgIC8vIHNvIGFzIGFuIG9wdGltaXphdGlvbiwgY2hlY2sgZmlyc3QgdGhhdCB0aGlzIGRhdGFiYXNlIGV2ZW5cbiAgICAvLyBjb250YWlucyBhdHRhY2htZW50c1xuICAgIHZhciByZXEgPSBhdHRTdG9yZS5jb3VudCgpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGNvdW50ID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsgLy8gZG9uZVxuICAgICAgfVxuXG4gICAgICBzZXFTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFjdXJzb3IpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsgLy8gZG9uZVxuICAgICAgICB9XG4gICAgICAgIHZhciBkb2MgPSBjdXJzb3IudmFsdWU7XG4gICAgICAgIHZhciBzZXEgPSBjdXJzb3IucHJpbWFyeUtleTtcbiAgICAgICAgdmFyIGF0dHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzIHx8IHt9KTtcbiAgICAgICAgdmFyIGRpZ2VzdE1hcCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGF0dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgYXR0ID0gZG9jLl9hdHRhY2htZW50c1thdHRzW2pdXTtcbiAgICAgICAgICBkaWdlc3RNYXBbYXR0LmRpZ2VzdF0gPSB0cnVlOyAvLyB1bmlxIGRpZ2VzdHMsIGp1c3QgaW4gY2FzZVxuICAgICAgICB9XG4gICAgICAgIHZhciBkaWdlc3RzID0gT2JqZWN0LmtleXMoZGlnZXN0TWFwKTtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGRpZ2VzdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgZGlnZXN0ID0gZGlnZXN0c1tqXTtcbiAgICAgICAgICBhdHRBbmRTZXFTdG9yZS5wdXQoe1xuICAgICAgICAgICAgc2VxOiBzZXEsXG4gICAgICAgICAgICBkaWdlc3RTZXE6IGRpZ2VzdCArICc6OicgKyBzZXFcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDVcbiAgLy8gSW5zdGVhZCBvZiByZWx5aW5nIG9uIG9uLXRoZS1mbHkgbWlncmF0aW9uIG9mIG1ldGFkYXRhLFxuICAvLyB0aGlzIGJyaW5ncyB0aGUgZG9jLXN0b3JlIHRvIGl0cyBtb2Rlcm4gZm9ybTpcbiAgLy8gLSBtZXRhZGF0YS53aW5uaW5ncmV2XG4gIC8vIC0gbWV0YWRhdGEuc2VxXG4gIC8vIC0gc3RyaW5naWZ5IHRoZSBtZXRhZGF0YSB3aGVuIHN0b3JpbmcgaXRcbiAgZnVuY3Rpb24gbWlncmF0ZU1ldGFkYXRhKHR4bikge1xuXG4gICAgZnVuY3Rpb24gZGVjb2RlTWV0YWRhdGFDb21wYXQoc3RvcmVkT2JqZWN0KSB7XG4gICAgICBpZiAoIXN0b3JlZE9iamVjdC5kYXRhKSB7XG4gICAgICAgIC8vIG9sZCBmb3JtYXQsIHdoZW4gd2UgZGlkbid0IHN0b3JlIGl0IHN0cmluZ2lmaWVkXG4gICAgICAgIHN0b3JlZE9iamVjdC5kZWxldGVkID0gc3RvcmVkT2JqZWN0LmRlbGV0ZWRPckxvY2FsID09PSAnMSc7XG4gICAgICAgIHJldHVybiBzdG9yZWRPYmplY3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVjb2RlTWV0YWRhdGEoc3RvcmVkT2JqZWN0KTtcbiAgICB9XG5cbiAgICAvLyBlbnN1cmUgdGhhdCBldmVyeSBtZXRhZGF0YSBoYXMgYSB3aW5uaW5nUmV2IGFuZCBzZXEsXG4gICAgLy8gd2hpY2ggd2FzIHByZXZpb3VzbHkgY3JlYXRlZCBvbi10aGUtZmx5IGJ1dCBiZXR0ZXIgdG8gbWlncmF0ZVxuICAgIHZhciBieVNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gICAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgdmFyIGN1cnNvciA9IGRvY1N0b3JlLm9wZW5DdXJzb3IoKTtcbiAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoIWN1cnNvcikge1xuICAgICAgICByZXR1cm47IC8vIGRvbmVcbiAgICAgIH1cbiAgICAgIHZhciBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhQ29tcGF0KGN1cnNvci52YWx1ZSk7XG5cbiAgICAgIG1ldGFkYXRhLndpbm5pbmdSZXYgPSBtZXRhZGF0YS53aW5uaW5nUmV2IHx8XG4gICAgICAgIHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuXG4gICAgICBmdW5jdGlvbiBmZXRjaE1ldGFkYXRhU2VxKCkge1xuICAgICAgICAvLyBtZXRhZGF0YS5zZXEgd2FzIGFkZGVkIHBvc3QtMy4yLjAsIHNvIGlmIGl0J3MgbWlzc2luZyxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBmZXRjaCBpdCBtYW51YWxseVxuICAgICAgICB2YXIgc3RhcnQgPSBtZXRhZGF0YS5pZCArICc6Oic7XG4gICAgICAgIHZhciBlbmQgPSBtZXRhZGF0YS5pZCArICc6OlxcdWZmZmYnO1xuICAgICAgICB2YXIgcmVxID0gYnlTZXFTdG9yZS5pbmRleCgnX2RvY19pZF9yZXYnKS5vcGVuQ3Vyc29yKFxuICAgICAgICAgIElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQpKTtcblxuICAgICAgICB2YXIgbWV0YWRhdGFTZXEgPSAwO1xuICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgIGlmICghY3Vyc29yKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5zZXEgPSBtZXRhZGF0YVNlcTtcbiAgICAgICAgICAgIHJldHVybiBvbkdldE1ldGFkYXRhU2VxKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBzZXEgPSBjdXJzb3IucHJpbWFyeUtleTtcbiAgICAgICAgICBpZiAoc2VxID4gbWV0YWRhdGFTZXEpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhU2VxID0gc2VxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25HZXRNZXRhZGF0YVNlcSgpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhVG9TdG9yZSA9IGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhLFxuICAgICAgICAgIG1ldGFkYXRhLndpbm5pbmdSZXYsIG1ldGFkYXRhLmRlbGV0ZWQpO1xuXG4gICAgICAgIHZhciByZXEgPSBkb2NTdG9yZS5wdXQobWV0YWRhdGFUb1N0b3JlKTtcbiAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGFkYXRhLnNlcSkge1xuICAgICAgICByZXR1cm4gb25HZXRNZXRhZGF0YVNlcSgpO1xuICAgICAgfVxuXG4gICAgICBmZXRjaE1ldGFkYXRhU2VxKCk7XG4gICAgfTtcblxuICB9XG5cbiAgYXBpLl9yZW1vdGUgPSBmYWxzZTtcbiAgYXBpLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdpZGInO1xuICB9O1xuXG4gIGFwaS5faWQgPSB0b1Byb21pc2UoZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sobnVsbCwgYXBpLl9tZXRhLmluc3RhbmNlSWQpO1xuICB9KTtcblxuICBhcGkuX2J1bGtEb2NzID0gZnVuY3Rpb24gaWRiX2J1bGtEb2NzKHJlcSwgcmVxT3B0cywgY2FsbGJhY2spIHtcbiAgICBpZGJCdWxrRG9jcyhvcHRzLCByZXEsIHJlcU9wdHMsIGFwaSwgaWRiLCBlbnJpY2hDYWxsYmFja0Vycm9yKGNhbGxiYWNrKSk7XG4gIH07XG5cbiAgLy8gRmlyc3Qgd2UgbG9vayB1cCB0aGUgbWV0YWRhdGEgaW4gdGhlIGlkcyBkYXRhYmFzZSwgdGhlbiB3ZSBmZXRjaCB0aGVcbiAgLy8gY3VycmVudCByZXZpc2lvbihzKSBmcm9tIHRoZSBieSBzZXF1ZW5jZSBzdG9yZVxuICBhcGkuX2dldCA9IGZ1bmN0aW9uIGlkYl9nZXQoaWQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRvYztcbiAgICB2YXIgbWV0YWRhdGE7XG4gICAgdmFyIGVycjtcbiAgICB2YXIgdHhuID0gb3B0cy5jdHg7XG4gICAgaWYgKCF0eG4pIHtcbiAgICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLFxuICAgICAgICBbRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsIEFUVEFDSF9TVE9SRV0sICdyZWFkb25seScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgY2FsbGJhY2soZXJyLCB7ZG9jOiBkb2MsIG1ldGFkYXRhOiBtZXRhZGF0YSwgY3R4OiB0eG59KTtcbiAgICB9XG5cbiAgICB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKS5nZXQoaWQpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAvLyB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSByZXN1bHQgaGVyZSBpZjpcbiAgICAgIC8vIDEuIHRoZXJlIGlzIG5vIHN1Y2ggZG9jdW1lbnRcbiAgICAgIC8vIDIuIHRoZSBkb2N1bWVudCBpcyBkZWxldGVkIGFuZCB3ZSBkb24ndCBhc2sgYWJvdXQgc3BlY2lmaWMgcmV2XG4gICAgICAvLyBXaGVuIHdlIGFzayB3aXRoIG9wdHMucmV2IHdlIGV4cGVjdCB0aGUgYW5zd2VyIHRvIGJlIGVpdGhlclxuICAgICAgLy8gZG9jIChwb3NzaWJseSB3aXRoIF9kZWxldGVkPXRydWUpIG9yIG1pc3NpbmcgZXJyb3JcbiAgICAgIGlmICghbWV0YWRhdGEpIHtcbiAgICAgICAgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsICdtaXNzaW5nJyk7XG4gICAgICAgIHJldHVybiBmaW5pc2goKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJldjtcbiAgICAgIGlmICghb3B0cy5yZXYpIHtcbiAgICAgICAgcmV2ID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgICAgdmFyIGRlbGV0ZWQgPSBpc0RlbGV0ZWQobWV0YWRhdGEpO1xuICAgICAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgICAgIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLCBcImRlbGV0ZWRcIik7XG4gICAgICAgICAgcmV0dXJuIGZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXYgPSBvcHRzLmxhdGVzdCA/IGxhdGVzdChvcHRzLnJldiwgbWV0YWRhdGEpIDogb3B0cy5yZXY7XG4gICAgICB9XG5cbiAgICAgIHZhciBvYmplY3RTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICAgICAgdmFyIGtleSA9IG1ldGFkYXRhLmlkICsgJzo6JyArIHJldjtcblxuICAgICAgb2JqZWN0U3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2JykuZ2V0KGtleSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgZG9jID0gZGVjb2RlRG9jKGRvYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICBlcnIgPSBjcmVhdGVFcnJvcihNSVNTSU5HX0RPQywgJ21pc3NpbmcnKTtcbiAgICAgICAgICByZXR1cm4gZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoKCk7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG5cbiAgYXBpLl9nZXRBdHRhY2htZW50ID0gZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2hJZCwgYXR0YWNobWVudCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICB2YXIgdHhuO1xuICAgIGlmIChvcHRzLmN0eCkge1xuICAgICAgdHhuID0gb3B0cy5jdHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLFxuICAgICAgICBbRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsIEFUVEFDSF9TVE9SRV0sICdyZWFkb25seScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgfVxuICAgIHZhciBkaWdlc3QgPSBhdHRhY2htZW50LmRpZ2VzdDtcbiAgICB2YXIgdHlwZSA9IGF0dGFjaG1lbnQuY29udGVudF90eXBlO1xuXG4gICAgdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSkuZ2V0KGRpZ2VzdCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBib2R5ID0gZS50YXJnZXQucmVzdWx0LmJvZHk7XG4gICAgICByZWFkQmxvYkRhdGEoYm9keSwgdHlwZSwgb3B0cy5iaW5hcnksIGZ1bmN0aW9uIChibG9iRGF0YSkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBibG9iRGF0YSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIGFwaS5faW5mbyA9IGZ1bmN0aW9uIGlkYl9pbmZvKGNhbGxiYWNrKSB7XG4gICAgdmFyIHVwZGF0ZVNlcTtcbiAgICB2YXIgZG9jQ291bnQ7XG5cbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW01FVEFfU1RPUkUsIEJZX1NFUV9TVE9SRV0sICdyZWFkb25seScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgICB0eG4ub2JqZWN0U3RvcmUoTUVUQV9TVE9SRSkuZ2V0KE1FVEFfU1RPUkUpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBkb2NDb3VudCA9IGUudGFyZ2V0LnJlc3VsdC5kb2NDb3VudDtcbiAgICB9O1xuICAgIHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpLm9wZW5DdXJzb3IobnVsbCwgJ3ByZXYnKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIHVwZGF0ZVNlcSA9IGN1cnNvciA/IGN1cnNvci5rZXkgOiAwO1xuICAgIH07XG5cbiAgICB0eG4ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgZG9jX2NvdW50OiBkb2NDb3VudCxcbiAgICAgICAgdXBkYXRlX3NlcTogdXBkYXRlU2VxLFxuICAgICAgICAvLyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlkYl9hdHRhY2htZW50X2Zvcm1hdDogKGFwaS5fbWV0YS5ibG9iU3VwcG9ydCA/ICdiaW5hcnknIDogJ2Jhc2U2NCcpXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIGFwaS5fYWxsRG9jcyA9IGZ1bmN0aW9uIGlkYl9hbGxEb2NzKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWRiQWxsRG9jcyhvcHRzLCBpZGIsIGVucmljaENhbGxiYWNrRXJyb3IoY2FsbGJhY2spKTtcbiAgfTtcblxuICBhcGkuX2NoYW5nZXMgPSBmdW5jdGlvbiBpZGJDaGFuZ2VzKG9wdHMpIHtcbiAgICByZXR1cm4gY2hhbmdlcyhvcHRzLCBhcGksIGRiTmFtZSwgaWRiKTtcbiAgfTtcblxuICBhcGkuX2Nsb3NlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9JbmRleGVkREIvSURCRGF0YWJhc2UjY2xvc2VcbiAgICAvLyBcIlJldHVybnMgaW1tZWRpYXRlbHkgYW5kIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBpbiBhIHNlcGFyYXRlIHRocmVhZC4uLlwiXG4gICAgaWRiLmNsb3NlKCk7XG4gICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH07XG5cbiAgYXBpLl9nZXRSZXZpc2lvblRyZWUgPSBmdW5jdGlvbiAoZG9jSWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtET0NfU1RPUkVdLCAncmVhZG9ubHknKTtcbiAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICB9XG4gICAgdmFyIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgdmFyIHJlcSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpLmdldChkb2NJZCk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGRvYyA9IGRlY29kZU1ldGFkYXRhKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRvYy5yZXZfdHJlZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgcmV2aXNpb25zIG9mIGRvY3VtZW50IGRvY0lkXG4gIC8vIHdoaWNoIGFyZSBsaXN0ZWQgaW4gcmV2cyBhbmQgc2V0cyB0aGlzIGRvY3VtZW50XG4gIC8vIHJldmlzaW9uIHRvIHRvIHJldl90cmVlXG4gIGFwaS5fZG9Db21wYWN0aW9uID0gZnVuY3Rpb24gKGRvY0lkLCByZXZzLCBjYWxsYmFjaykge1xuICAgIHZhciBzdG9yZXMgPSBbXG4gICAgICBET0NfU1RPUkUsXG4gICAgICBCWV9TRVFfU1RPUkUsXG4gICAgICBBVFRBQ0hfU1RPUkUsXG4gICAgICBBVFRBQ0hfQU5EX1NFUV9TVE9SRVxuICAgIF07XG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIHN0b3JlcywgJ3JlYWR3cml0ZScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcblxuICAgIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuXG4gICAgZG9jU3RvcmUuZ2V0KGRvY0lkKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgdHJhdmVyc2VSZXZUcmVlKG1ldGFkYXRhLnJldl90cmVlLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZIYXNoLCBjdHgsIG9wdHMpIHtcbiAgICAgICAgdmFyIHJldiA9IHBvcyArICctJyArIHJldkhhc2g7XG4gICAgICAgIGlmIChyZXZzLmluZGV4T2YocmV2KSAhPT0gLTEpIHtcbiAgICAgICAgICBvcHRzLnN0YXR1cyA9ICdtaXNzaW5nJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb21wYWN0UmV2cyhyZXZzLCBkb2NJZCwgdHhuKTtcbiAgICAgIHZhciB3aW5uaW5nUmV2JCQxID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgIHZhciBkZWxldGVkID0gbWV0YWRhdGEuZGVsZXRlZDtcbiAgICAgIHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpLnB1dChcbiAgICAgICAgZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEsIHdpbm5pbmdSZXYkJDEsIGRlbGV0ZWQpKTtcbiAgICB9O1xuICAgIHR4bi5vbmFib3J0ID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgIHR4bi5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xuICB9O1xuXG5cbiAgYXBpLl9nZXRMb2NhbCA9IGZ1bmN0aW9uIChpZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW0xPQ0FMX1NUT1JFXSwgJ3JlYWRvbmx5Jyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHZhciB0eCA9IHR4blJlc3VsdC50eG47XG4gICAgdmFyIHJlcSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKS5nZXQoaWQpO1xuXG4gICAgcmVxLm9uZXJyb3IgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBkb2NbJ19kb2NfaWRfcmV2J107IC8vIGZvciBiYWNrd2FyZHMgY29tcGF0XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRvYyk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX3B1dExvY2FsID0gZnVuY3Rpb24gKGRvYywgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgZGVsZXRlIGRvYy5fcmV2aXNpb25zOyAvLyBpZ25vcmUgdGhpcywgdHJ1c3QgdGhlIHJldlxuICAgIHZhciBvbGRSZXYgPSBkb2MuX3JldjtcbiAgICB2YXIgaWQgPSBkb2MuX2lkO1xuICAgIGlmICghb2xkUmV2KSB7XG4gICAgICBkb2MuX3JldiA9ICcwLTEnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MuX3JldiA9ICcwLScgKyAocGFyc2VJbnQob2xkUmV2LnNwbGl0KCctJylbMV0sIDEwKSArIDEpO1xuICAgIH1cblxuICAgIHZhciB0eCA9IG9wdHMuY3R4O1xuICAgIHZhciByZXQ7XG4gICAgaWYgKCF0eCkge1xuICAgICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtMT0NBTF9TVE9SRV0sICdyZWFkd3JpdGUnKTtcbiAgICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgICB9XG4gICAgICB0eCA9IHR4blJlc3VsdC50eG47XG4gICAgICB0eC5vbmVycm9yID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgICAgdHgub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG9TdG9yZSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKTtcbiAgICB2YXIgcmVxO1xuICAgIGlmIChvbGRSZXYpIHtcbiAgICAgIHJlcSA9IG9TdG9yZS5nZXQoaWQpO1xuICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBvbGREb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGlmICghb2xkRG9jIHx8IG9sZERvYy5fcmV2ICE9PSBvbGRSZXYpIHtcbiAgICAgICAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gdXBkYXRlXG4gICAgICAgICAgdmFyIHJlcSA9IG9TdG9yZS5wdXQoZG9jKTtcbiAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0ID0ge29rOiB0cnVlLCBpZDogZG9jLl9pZCwgcmV2OiBkb2MuX3Jldn07XG4gICAgICAgICAgICBpZiAob3B0cy5jdHgpIHsgLy8gcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgeyAvLyBuZXcgZG9jXG4gICAgICByZXEgPSBvU3RvcmUuYWRkKGRvYyk7XG4gICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIC8vIGNvbnN0cmFpbnQgZXJyb3IsIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKFJFVl9DT05GTElDVCkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIGFib3J0XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIG9uZXJyb3JcbiAgICAgIH07XG4gICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXQgPSB7b2s6IHRydWUsIGlkOiBkb2MuX2lkLCByZXY6IGRvYy5fcmV2fTtcbiAgICAgICAgaWYgKG9wdHMuY3R4KSB7IC8vIHJldHVybiBpbW1lZGlhdGVseVxuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIGFwaS5fcmVtb3ZlTG9jYWwgPSBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICB2YXIgdHggPSBvcHRzLmN0eDtcbiAgICBpZiAoIXR4KSB7XG4gICAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW0xPQ0FMX1NUT1JFXSwgJ3JlYWR3cml0ZScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4ID0gdHhuUmVzdWx0LnR4bjtcbiAgICAgIHR4Lm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgcmV0O1xuICAgIHZhciBpZCA9IGRvYy5faWQ7XG4gICAgdmFyIG9TdG9yZSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKTtcbiAgICB2YXIgcmVxID0gb1N0b3JlLmdldChpZCk7XG5cbiAgICByZXEub25lcnJvciA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbGREb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoIW9sZERvYyB8fCBvbGREb2MuX3JldiAhPT0gZG9jLl9yZXYpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9TdG9yZS5kZWxldGUoaWQpO1xuICAgICAgICByZXQgPSB7b2s6IHRydWUsIGlkOiBpZCwgcmV2OiAnMC0wJ307XG4gICAgICAgIGlmIChvcHRzLmN0eCkgeyAvLyByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgICBjaGFuZ2VzSGFuZGxlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZGJOYW1lKTtcblxuICAgIC8vQ2xvc2Ugb3BlbiByZXF1ZXN0IGZvciBcImRiTmFtZVwiIGRhdGFiYXNlIHRvIGZpeCBpZSBkZWxheS5cbiAgICB2YXIgb3BlblJlcSA9IG9wZW5SZXFMaXN0LmdldChkYk5hbWUpO1xuICAgIGlmIChvcGVuUmVxICYmIG9wZW5SZXEucmVzdWx0KSB7XG4gICAgICBvcGVuUmVxLnJlc3VsdC5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH1cbiAgICB2YXIgcmVxID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKGRiTmFtZSk7XG5cbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy9SZW1vdmUgb3BlbiByZXF1ZXN0IGZyb20gdGhlIGxpc3QuXG4gICAgICBvcGVuUmVxTGlzdC5kZWxldGUoZGJOYW1lKTtcbiAgICAgIGlmIChoYXNMb2NhbFN0b3JhZ2UoKSAmJiAoZGJOYW1lIGluIGxvY2FsU3RvcmFnZSkpIHtcbiAgICAgICAgZGVsZXRlIGxvY2FsU3RvcmFnZVtkYk5hbWVdO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgeyAnb2snOiB0cnVlIH0pO1xuICAgIH07XG5cbiAgICByZXEub25lcnJvciA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgfTtcblxuICB2YXIgY2FjaGVkID0gY2FjaGVkREJzLmdldChkYk5hbWUpO1xuXG4gIGlmIChjYWNoZWQpIHtcbiAgICBpZGIgPSBjYWNoZWQuaWRiO1xuICAgIGFwaS5fbWV0YSA9IGNhY2hlZC5nbG9iYWw7XG4gICAgcmV0dXJuIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCBhcGkpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHJlcSA9IGluZGV4ZWREQi5vcGVuKGRiTmFtZSwgQURBUFRFUl9WRVJTSU9OKTtcbiAgb3BlblJlcUxpc3Quc2V0KGRiTmFtZSwgcmVxKTtcblxuICByZXEub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgZGIgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKGUub2xkVmVyc2lvbiA8IDEpIHtcbiAgICAgIHJldHVybiBjcmVhdGVTY2hlbWEoZGIpOyAvLyBuZXcgZGIsIGluaXRpYWwgc2NoZW1hXG4gICAgfVxuICAgIC8vIGRvIG1pZ3JhdGlvbnNcblxuICAgIHZhciB0eG4gPSBlLmN1cnJlbnRUYXJnZXQudHJhbnNhY3Rpb247XG4gICAgLy8gdGhlc2UgbWlncmF0aW9ucyBoYXZlIHRvIGJlIGRvbmUgaW4gdGhpcyBmdW5jdGlvbiwgYmVmb3JlXG4gICAgLy8gY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgZXZlbnQgbG9vcCwgYmVjYXVzZSBJbmRleGVkREJcblxuICAgIGlmIChlLm9sZFZlcnNpb24gPCAzKSB7XG4gICAgICBjcmVhdGVMb2NhbFN0b3JlU2NoZW1hKGRiKTsgLy8gdjIgLT4gdjNcbiAgICB9XG4gICAgaWYgKGUub2xkVmVyc2lvbiA8IDQpIHtcbiAgICAgIGFkZEF0dGFjaEFuZFNlcVN0b3JlKGRiKTsgLy8gdjMgLT4gdjRcbiAgICB9XG5cbiAgICB2YXIgbWlncmF0aW9ucyA9IFtcbiAgICAgIGFkZERlbGV0ZWRPckxvY2FsSW5kZXgsIC8vIHYxIC0+IHYyXG4gICAgICBtaWdyYXRlTG9jYWxTdG9yZSwgICAgICAvLyB2MiAtPiB2M1xuICAgICAgbWlncmF0ZUF0dHNBbmRTZXFzLCAgICAgLy8gdjMgLT4gdjRcbiAgICAgIG1pZ3JhdGVNZXRhZGF0YSAgICAgICAgIC8vIHY0IC0+IHY1XG4gICAgXTtcblxuICAgIHZhciBpID0gZS5vbGRWZXJzaW9uO1xuXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHZhciBtaWdyYXRpb24gPSBtaWdyYXRpb25zW2kgLSAxXTtcbiAgICAgIGkrKztcbiAgICAgIGlmIChtaWdyYXRpb24pIHtcbiAgICAgICAgbWlncmF0aW9uKHR4biwgbmV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xuXG4gIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuXG4gICAgaWRiID0gZS50YXJnZXQucmVzdWx0O1xuXG4gICAgaWRiLm9udmVyc2lvbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlkYi5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH07XG5cbiAgICBpZGIub25hYm9ydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLCAnRGF0YWJhc2UgaGFzIGEgZ2xvYmFsIGZhaWx1cmUnLCBlLnRhcmdldC5lcnJvcik7XG4gICAgICBpZGJHbG9iYWxGYWlsdXJlRXJyb3IgPSBlLnRhcmdldC5lcnJvcjtcbiAgICAgIGlkYi5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH07XG5cbiAgICAvLyBEbyBhIGZldyBzZXR1cCBvcGVyYXRpb25zIChpbiBwYXJhbGxlbCBhcyBtdWNoIGFzIHBvc3NpYmxlKTpcbiAgICAvLyAxLiBGZXRjaCBtZXRhIGRvY1xuICAgIC8vIDIuIENoZWNrIGJsb2Igc3VwcG9ydFxuICAgIC8vIDMuIENhbGN1bGF0ZSBkb2NDb3VudFxuICAgIC8vIDQuIEdlbmVyYXRlIGFuIGluc3RhbmNlSWQgaWYgbmVjZXNzYXJ5XG4gICAgLy8gNS4gU3RvcmUgZG9jQ291bnQgYW5kIGluc3RhbmNlSWQgb24gbWV0YSBkb2NcblxuICAgIHZhciB0eG4gPSBpZGIudHJhbnNhY3Rpb24oW1xuICAgICAgTUVUQV9TVE9SRSxcbiAgICAgIERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUsXG4gICAgICBET0NfU1RPUkVcbiAgICBdLCAncmVhZHdyaXRlJyk7XG5cbiAgICB2YXIgc3RvcmVkTWV0YURvYyA9IGZhbHNlO1xuICAgIHZhciBtZXRhRG9jO1xuICAgIHZhciBkb2NDb3VudDtcbiAgICB2YXIgYmxvYlN1cHBvcnQ7XG4gICAgdmFyIGluc3RhbmNlSWQ7XG5cbiAgICBmdW5jdGlvbiBjb21wbGV0ZVNldHVwKCkge1xuICAgICAgaWYgKHR5cGVvZiBibG9iU3VwcG9ydCA9PT0gJ3VuZGVmaW5lZCcgfHwgIXN0b3JlZE1ldGFEb2MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLl9tZXRhID0ge1xuICAgICAgICBuYW1lOiBkYk5hbWUsXG4gICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlSWQsXG4gICAgICAgIGJsb2JTdXBwb3J0OiBibG9iU3VwcG9ydFxuICAgICAgfTtcblxuICAgICAgY2FjaGVkREJzLnNldChkYk5hbWUsIHtcbiAgICAgICAgaWRiOiBpZGIsXG4gICAgICAgIGdsb2JhbDogYXBpLl9tZXRhXG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGFwaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RvcmVNZXRhRG9jSWZSZWFkeSgpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jQ291bnQgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBtZXRhRG9jID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaW5zdGFuY2VLZXkgPSBkYk5hbWUgKyAnX2lkJztcbiAgICAgIGlmIChpbnN0YW5jZUtleSBpbiBtZXRhRG9jKSB7XG4gICAgICAgIGluc3RhbmNlSWQgPSBtZXRhRG9jW2luc3RhbmNlS2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGFEb2NbaW5zdGFuY2VLZXldID0gaW5zdGFuY2VJZCA9IHV1aWQoKTtcbiAgICAgIH1cbiAgICAgIG1ldGFEb2MuZG9jQ291bnQgPSBkb2NDb3VudDtcbiAgICAgIHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKS5wdXQobWV0YURvYyk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBmZXRjaCBvciBnZW5lcmF0ZSB0aGUgaW5zdGFuY2VJZFxuICAgIC8vXG4gICAgdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpLmdldChNRVRBX1NUT1JFKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgbWV0YURvYyA9IGUudGFyZ2V0LnJlc3VsdCB8fCB7IGlkOiBNRVRBX1NUT1JFIH07XG4gICAgICBzdG9yZU1ldGFEb2NJZlJlYWR5KCk7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gY291bnREb2NzXG4gICAgLy9cbiAgICBjb3VudERvY3ModHhuLCBmdW5jdGlvbiAoY291bnQpIHtcbiAgICAgIGRvY0NvdW50ID0gY291bnQ7XG4gICAgICBzdG9yZU1ldGFEb2NJZlJlYWR5KCk7XG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIGNoZWNrIGJsb2Igc3VwcG9ydFxuICAgIC8vXG4gICAgaWYgKCFibG9iU3VwcG9ydFByb21pc2UpIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSBibG9iIHN1cHBvcnQgaXMgb25seSBjaGVja2VkIG9uY2VcbiAgICAgIGJsb2JTdXBwb3J0UHJvbWlzZSA9IGNoZWNrQmxvYlN1cHBvcnQodHhuKTtcbiAgICB9XG5cbiAgICBibG9iU3VwcG9ydFByb21pc2UudGhlbihmdW5jdGlvbiAodmFsKSB7XG4gICAgICBibG9iU3VwcG9ydCA9IHZhbDtcbiAgICAgIGNvbXBsZXRlU2V0dXAoKTtcbiAgICB9KTtcblxuICAgIC8vIG9ubHkgd2hlbiB0aGUgbWV0YWRhdGEgcHV0IHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsXG4gICAgLy8gY29uc2lkZXIgdGhlIHNldHVwIGRvbmVcbiAgICB0eG4ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHN0b3JlZE1ldGFEb2MgPSB0cnVlO1xuICAgICAgY29tcGxldGVTZXR1cCgpO1xuICAgIH07XG4gICAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gIH07XG5cbiAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBtc2cgPSBlLnRhcmdldC5lcnJvciAmJiBlLnRhcmdldC5lcnJvci5tZXNzYWdlO1xuXG4gICAgaWYgKCFtc2cpIHtcbiAgICAgIG1zZyA9ICdGYWlsZWQgdG8gb3BlbiBpbmRleGVkREIsIGFyZSB5b3UgaW4gcHJpdmF0ZSBicm93c2luZyBtb2RlPyc7XG4gICAgfSBlbHNlIGlmIChtc2cuaW5kZXhPZihcInN0b3JlZCBkYXRhYmFzZSBpcyBhIGhpZ2hlciB2ZXJzaW9uXCIpICE9PSAtMSkge1xuICAgICAgbXNnID0gbmV3IEVycm9yKCdUaGlzIERCIHdhcyBjcmVhdGVkIHdpdGggdGhlIG5ld2VyIFwiaW5kZXhlZGRiXCIgYWRhcHRlciwgYnV0IHlvdSBhcmUgdHJ5aW5nIHRvIG9wZW4gaXQgd2l0aCB0aGUgb2xkZXIgXCJpZGJcIiBhZGFwdGVyJyk7XG4gICAgfVxuXG4gICAgZ3VhcmRlZENvbnNvbGUoJ2Vycm9yJywgbXNnKTtcbiAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihJREJfRVJST1IsIG1zZykpO1xuICB9O1xufVxuXG5JZGJQb3VjaC52YWxpZCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRm9sbG93aW5nICM3MDg1IGJ1Z2d5IGlkYiB2ZXJzaW9ucyAodHlwaWNhbGx5IFNhZmFyaSA8IDEwLjEpIGFyZVxuICAvLyBjb25zaWRlcmVkIHZhbGlkLlxuXG4gIC8vIE9uIEZpcmVmb3ggU2VjdXJpdHlFcnJvciBpcyB0aHJvd24gd2hpbGUgcmVmZXJlbmNpbmcgaW5kZXhlZERCIGlmIGNvb2tpZXNcbiAgLy8gYXJlIG5vdCBhbGxvd2VkLiBgdHlwZW9mIGluZGV4ZWREQmAgYWxzbyB0cmlnZ2VycyB0aGUgZXJyb3IuXG4gIHRyeSB7XG4gICAgLy8gc29tZSBvdXRkYXRlZCBpbXBsZW1lbnRhdGlvbnMgb2YgSURCIHRoYXQgYXBwZWFyIG9uIFNhbXN1bmdcbiAgICAvLyBhbmQgSFRDIEFuZHJvaWQgZGV2aWNlcyA8NC40IGFyZSBtaXNzaW5nIElEQktleVJhbmdlXG4gICAgcmV0dXJuIHR5cGVvZiBpbmRleGVkREIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBJREJLZXlSYW5nZSAhPT0gJ3VuZGVmaW5lZCc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIElEQlBvdWNoIChQb3VjaERCKSB7XG4gIFBvdWNoREIuYWRhcHRlcignaWRiJywgSWRiUG91Y2gsIHRydWUpO1xufVxuXG4vLyBkZWFkIHNpbXBsZSBwcm9taXNlIHBvb2wsIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS90aW1kcC9lczYtcHJvbWlzZS1wb29sXG4vLyBidXQgbXVjaCBzbWFsbGVyIGluIGNvZGUgc2l6ZS4gbGltaXRzIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBwcm9taXNlcyB0aGF0IGFyZSBleGVjdXRlZFxuXG5cbmZ1bmN0aW9uIHBvb2wocHJvbWlzZUZhY3RvcmllcywgbGltaXQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcnVubmluZyA9IDA7XG4gICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgIHZhciBkb25lID0gMDtcbiAgICB2YXIgbGVuID0gcHJvbWlzZUZhY3Rvcmllcy5sZW5ndGg7XG4gICAgdmFyIGVycjtcblxuICAgIGZ1bmN0aW9uIHJ1bk5leHQoKSB7XG4gICAgICBydW5uaW5nKys7XG4gICAgICBwcm9taXNlRmFjdG9yaWVzW2N1cnJlbnQrK10oKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9OZXh0KCkge1xuICAgICAgaWYgKCsrZG9uZSA9PT0gbGVuKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydW5OZXh0QmF0Y2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoKSB7XG4gICAgICBydW5uaW5nLS07XG4gICAgICBkb05leHQoKTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGZ1bmN0aW9uIG9uRXJyb3IodGhpc0Vycikge1xuICAgICAgcnVubmluZy0tO1xuICAgICAgZXJyID0gZXJyIHx8IHRoaXNFcnI7XG4gICAgICBkb05leHQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5OZXh0QmF0Y2goKSB7XG4gICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIGN1cnJlbnQgPCBsZW4pIHtcbiAgICAgICAgcnVuTmV4dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJ1bk5leHRCYXRjaCgpO1xuICB9KTtcbn1cblxudmFyIENIQU5HRVNfQkFUQ0hfU0laRSA9IDI1O1xudmFyIE1BWF9TSU1VTFRBTkVPVVNfUkVWUyA9IDUwO1xudmFyIENIQU5HRVNfVElNRU9VVF9CVUZGRVIgPSA1MDAwO1xudmFyIERFRkFVTFRfSEVBUlRCRUFUID0gMTAwMDA7XG5cbnZhciBzdXBwb3J0c0J1bGtHZXRNYXAgPSB7fTtcblxuZnVuY3Rpb24gcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIocm93KSB7XG4gIHZhciBkb2MgPSByb3cuZG9jIHx8IHJvdy5vaztcbiAgdmFyIGF0dHMgPSBkb2MgJiYgZG9jLl9hdHRhY2htZW50cztcbiAgaWYgKCFhdHRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIE9iamVjdC5rZXlzKGF0dHMpLmZvckVhY2goZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgIGF0dC5kYXRhID0gYjY0VG9CbHVmZmVyKGF0dC5kYXRhLCBhdHQuY29udGVudF90eXBlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuY29kZURvY0lkKGlkKSB7XG4gIGlmICgvXl9kZXNpZ24vLnRlc3QoaWQpKSB7XG4gICAgcmV0dXJuICdfZGVzaWduLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQuc2xpY2UoOCkpO1xuICB9XG4gIGlmICgvXl9sb2NhbC8udGVzdChpZCkpIHtcbiAgICByZXR1cm4gJ19sb2NhbC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkLnNsaWNlKDcpKTtcbiAgfVxuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGlkKTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEoZG9jKSB7XG4gIGlmICghZG9jLl9hdHRhY2htZW50cyB8fCAhT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgYXR0YWNobWVudCA9IGRvYy5fYXR0YWNobWVudHNba2V5XTtcbiAgICBpZiAoYXR0YWNobWVudC5kYXRhICYmIHR5cGVvZiBhdHRhY2htZW50LmRhdGEgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgYmxvYlRvQmFzZTY0KGF0dGFjaG1lbnQuZGF0YSwgcmVzb2x2ZSk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChiNjQpIHtcbiAgICAgICAgYXR0YWNobWVudC5kYXRhID0gYjY0O1xuICAgICAgfSk7XG4gICAgfVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGhhc1VybFByZWZpeChvcHRzKSB7XG4gIGlmICghb3B0cy5wcmVmaXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvY29sID0gcGFyc2VVcmkob3B0cy5wcmVmaXgpLnByb3RvY29sO1xuICByZXR1cm4gcHJvdG9jb2wgPT09ICdodHRwJyB8fCBwcm90b2NvbCA9PT0gJ2h0dHBzJztcbn1cblxuLy8gR2V0IGFsbCB0aGUgaW5mb3JtYXRpb24geW91IHBvc3NpYmx5IGNhbiBhYm91dCB0aGUgVVJJIGdpdmVuIGJ5IG5hbWUgYW5kXG4vLyByZXR1cm4gaXQgYXMgYSBzdWl0YWJsZSBvYmplY3QuXG5mdW5jdGlvbiBnZXRIb3N0KG5hbWUsIG9wdHMpIHtcbiAgLy8gZW5jb2RlIGRiIG5hbWUgaWYgb3B0cy5wcmVmaXggaXMgYSB1cmwgKCM1NTc0KVxuICBpZiAoaGFzVXJsUHJlZml4KG9wdHMpKSB7XG4gICAgdmFyIGRiTmFtZSA9IG9wdHMubmFtZS5zdWJzdHIob3B0cy5wcmVmaXgubGVuZ3RoKTtcbiAgICAvLyBFbnN1cmUgcHJlZml4IGhhcyBhIHRyYWlsaW5nIHNsYXNoXG4gICAgdmFyIHByZWZpeCA9IG9wdHMucHJlZml4LnJlcGxhY2UoL1xcLz8kLywgJy8nKTtcbiAgICBuYW1lID0gcHJlZml4ICsgZW5jb2RlVVJJQ29tcG9uZW50KGRiTmFtZSk7XG4gIH1cblxuICB2YXIgdXJpID0gcGFyc2VVcmkobmFtZSk7XG4gIGlmICh1cmkudXNlciB8fCB1cmkucGFzc3dvcmQpIHtcbiAgICB1cmkuYXV0aCA9IHt1c2VybmFtZTogdXJpLnVzZXIsIHBhc3N3b3JkOiB1cmkucGFzc3dvcmR9O1xuICB9XG5cbiAgLy8gU3BsaXQgdGhlIHBhdGggcGFydCBvZiB0aGUgVVJJIGludG8gcGFydHMgdXNpbmcgJy8nIGFzIHRoZSBkZWxpbWl0ZXJcbiAgLy8gYWZ0ZXIgcmVtb3ZpbmcgYW55IGxlYWRpbmcgJy8nIGFuZCBhbnkgdHJhaWxpbmcgJy8nXG4gIHZhciBwYXJ0cyA9IHVyaS5wYXRoLnJlcGxhY2UoLyheXFwvfFxcLyQpL2csICcnKS5zcGxpdCgnLycpO1xuXG4gIHVyaS5kYiA9IHBhcnRzLnBvcCgpO1xuICAvLyBQcmV2ZW50IGRvdWJsZSBlbmNvZGluZyBvZiBVUkkgY29tcG9uZW50XG4gIGlmICh1cmkuZGIuaW5kZXhPZignJScpID09PSAtMSkge1xuICAgIHVyaS5kYiA9IGVuY29kZVVSSUNvbXBvbmVudCh1cmkuZGIpO1xuICB9XG5cbiAgdXJpLnBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgcmV0dXJuIHVyaTtcbn1cblxuLy8gR2VuZXJhdGUgYSBVUkwgd2l0aCB0aGUgaG9zdCBkYXRhIGdpdmVuIGJ5IG9wdHMgYW5kIHRoZSBnaXZlbiBwYXRoXG5mdW5jdGlvbiBnZW5EQlVybChvcHRzLCBwYXRoKSB7XG4gIHJldHVybiBnZW5Vcmwob3B0cywgb3B0cy5kYiArICcvJyArIHBhdGgpO1xufVxuXG4vLyBHZW5lcmF0ZSBhIFVSTCB3aXRoIHRoZSBob3N0IGRhdGEgZ2l2ZW4gYnkgb3B0cyBhbmQgdGhlIGdpdmVuIHBhdGhcbmZ1bmN0aW9uIGdlblVybChvcHRzLCBwYXRoKSB7XG4gIC8vIElmIHRoZSBob3N0IGFscmVhZHkgaGFzIGEgcGF0aCwgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSBwYXRoIGRlbGltaXRlclxuICAvLyBPdGhlcndpc2UsIHRoZSBwYXRoIGRlbGltaXRlciBpcyB0aGUgZW1wdHkgc3RyaW5nXG4gIHZhciBwYXRoRGVsID0gIW9wdHMucGF0aCA/ICcnIDogJy8nO1xuXG4gIC8vIElmIHRoZSBob3N0IGFscmVhZHkgaGFzIGEgcGF0aCwgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSBwYXRoIGRlbGltaXRlclxuICAvLyBPdGhlcndpc2UsIHRoZSBwYXRoIGRlbGltaXRlciBpcyB0aGUgZW1wdHkgc3RyaW5nXG4gIHJldHVybiBvcHRzLnByb3RvY29sICsgJzovLycgKyBvcHRzLmhvc3QgK1xuICAgICAgICAgKG9wdHMucG9ydCA/ICgnOicgKyBvcHRzLnBvcnQpIDogJycpICtcbiAgICAgICAgICcvJyArIG9wdHMucGF0aCArIHBhdGhEZWwgKyBwYXRoO1xufVxuXG5mdW5jdGlvbiBwYXJhbXNUb1N0cihwYXJhbXMpIHtcbiAgcmV0dXJuICc/JyArIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgcmV0dXJuIGsgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zW2tdKTtcbiAgfSkuam9pbignJicpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRDYWNoZUJ1c3Qob3B0cykge1xuICB2YXIgdWEgPSAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCkgP1xuICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpIDogJyc7XG4gIHZhciBpc0lFID0gdWEuaW5kZXhPZignbXNpZScpICE9PSAtMTtcbiAgdmFyIGlzVHJpZGVudCA9IHVhLmluZGV4T2YoJ3RyaWRlbnQnKSAhPT0gLTE7XG4gIHZhciBpc0VkZ2UgPSB1YS5pbmRleE9mKCdlZGdlJykgIT09IC0xO1xuICB2YXIgaXNHRVQgPSAhKCdtZXRob2QnIGluIG9wdHMpIHx8IG9wdHMubWV0aG9kID09PSAnR0VUJztcbiAgcmV0dXJuIChpc0lFIHx8IGlzVHJpZGVudCB8fCBpc0VkZ2UpICYmIGlzR0VUO1xufVxuXG4vLyBJbXBsZW1lbnRzIHRoZSBQb3VjaERCIEFQSSBmb3IgZGVhbGluZyB3aXRoIENvdWNoREIgaW5zdGFuY2VzIG92ZXIgSFRUUFxuZnVuY3Rpb24gSHR0cFBvdWNoKG9wdHMsIGNhbGxiYWNrKSB7XG5cbiAgLy8gVGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBIdHRwUG91Y2hcbiAgdmFyIGFwaSA9IHRoaXM7XG5cbiAgdmFyIGhvc3QgPSBnZXRIb3N0KG9wdHMubmFtZSwgb3B0cyk7XG4gIHZhciBkYlVybCA9IGdlbkRCVXJsKGhvc3QsICcnKTtcblxuICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgdmFyIG91ckZldGNoID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IG5ldyBoKCk7XG5cbiAgICBvcHRpb25zLmNyZWRlbnRpYWxzID0gJ2luY2x1ZGUnO1xuXG4gICAgaWYgKG9wdHMuYXV0aCB8fCBob3N0LmF1dGgpIHtcbiAgICAgIHZhciBuQXV0aCA9IG9wdHMuYXV0aCB8fCBob3N0LmF1dGg7XG4gICAgICB2YXIgc3RyID0gbkF1dGgudXNlcm5hbWUgKyAnOicgKyBuQXV0aC5wYXNzd29yZDtcbiAgICAgIHZhciB0b2tlbiA9IHRoaXNCdG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyB0b2tlbik7XG4gICAgfVxuXG4gICAgdmFyIGhlYWRlcnMgPSBvcHRzLmhlYWRlcnMgfHwge307XG4gICAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuYXBwZW5kKGtleSwgaGVhZGVyc1trZXldKTtcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzaG91bGRDYWNoZUJ1c3Qob3B0aW9ucykpIHtcbiAgICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgJ19ub25jZT0nICsgRGF0ZS5ub3coKTtcbiAgICB9XG5cbiAgICB2YXIgZmV0Y2hGdW4gPSBvcHRzLmZldGNoIHx8IGYkMTtcbiAgICByZXR1cm4gZmV0Y2hGdW4odXJsLCBvcHRpb25zKTtcbiAgfTtcblxuICBmdW5jdGlvbiBhZGFwdGVyRnVuJCQxKG5hbWUsIGZ1bikge1xuICAgIHJldHVybiBhZGFwdGVyRnVuKG5hbWUsIGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgICAgc2V0dXAoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgfSk7XG4gICAgfSkpLmJpbmQoYXBpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoSlNPTih1cmwsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwgbmV3IGgoKTtcblxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzLmdldCgnQWNjZXB0JykpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91ckZldGNoKHVybCwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJlc3VsdC5vayA9IHJlc3BvbnNlLm9rO1xuICAgICAgcmVzdWx0LnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoanNvbikge1xuICAgICAgcmVzdWx0LmRhdGEgPSBqc29uO1xuICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgcmVzdWx0LmRhdGEuc3RhdHVzID0gcmVzdWx0LnN0YXR1cztcbiAgICAgICAgdmFyIGVyciA9IGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UocmVzdWx0LmRhdGEpO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0LmRhdGEpKSB7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gcmVzdWx0LmRhdGEubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgaWYgKHYuZXJyb3IgfHwgdi5taXNzaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZSh2KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdC5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgc2V0dXBQcm9taXNlO1xuXG4gIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgIGlmIChvcHRzLnNraXBfc2V0dXApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIHNldHVwIGluIHByb2Nlc3Mgb3IgcHJldmlvdXMgc3VjY2Vzc2Z1bCBzZXR1cFxuICAgIC8vIGRvbmUgdGhlbiB3ZSB3aWxsIHVzZSB0aGF0XG4gICAgLy8gSWYgcHJldmlvdXMgc2V0dXBzIGhhdmUgYmVlbiByZWplY3RlZCB3ZSB3aWxsIHRyeSBhZ2FpblxuICAgIGlmIChzZXR1cFByb21pc2UpIHtcbiAgICAgIHJldHVybiBzZXR1cFByb21pc2U7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9taXNlID0gZmV0Y2hKU09OKGRiVXJsKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgJiYgZXJyLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIC8vIERvZXNudCBleGlzdCwgY3JlYXRlIGl0XG4gICAgICAgIGV4cGxhaW5FcnJvcig0MDQsICdQb3VjaERCIGlzIGp1c3QgZGV0ZWN0aW5nIGlmIHRoZSByZW1vdGUgZXhpc3RzLicpO1xuICAgICAgICByZXR1cm4gZmV0Y2hKU09OKGRiVXJsLCB7bWV0aG9kOiAnUFVUJ30pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgLy8gSWYgd2UgdHJ5IHRvIGNyZWF0ZSBhIGRhdGFiYXNlIHRoYXQgYWxyZWFkeSBleGlzdHMsIHNraXBwZWQgaW5cbiAgICAgIC8vIGlzdGFuYnVsIHNpbmNlIGl0cyBjYXRjaGluZyBhIHJhY2UgY29uZGl0aW9uLlxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgJiYgZXJyLnN0YXR1cyA9PT0gNDEyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfSk7XG5cbiAgICBzZXR1cFByb21pc2UuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgc2V0dXBQcm9taXNlID0gbnVsbDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzZXR1cFByb21pc2U7XG4gIH1cblxuICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKG51bGwsIGFwaSk7XG4gIH0pO1xuXG4gIGFwaS5fcmVtb3RlID0gdHJ1ZTtcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBhcGkudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ2h0dHAnO1xuICB9O1xuXG4gIGFwaS5pZCA9IGFkYXB0ZXJGdW4kJDEoJ2lkJywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgb3VyRmV0Y2goZ2VuVXJsKGhvc3QsICcnKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgLy8gQmFkIHJlc3BvbnNlIG9yIG1pc3NpbmcgYHV1aWRgIHNob3VsZCBub3QgcHJldmVudCBJRCBnZW5lcmF0aW9uLlxuICAgICAgdmFyIHV1aWQkJDEgPSAocmVzdWx0ICYmIHJlc3VsdC51dWlkKSA/XG4gICAgICAgICAgKHJlc3VsdC51dWlkICsgaG9zdC5kYikgOiBnZW5EQlVybChob3N0LCAnJyk7XG4gICAgICBjYWxsYmFjayhudWxsLCB1dWlkJCQxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gdGhlIGhvc3QgY2FsbGluZyB0aGUgY291Y2hkYiBfY29tcGFjdCBmdW5jdGlvblxuICAvLyAgICB2ZXJzaW9uOiBUaGUgdmVyc2lvbiBvZiBDb3VjaERCIGl0IGlzIHJ1bm5pbmdcbiAgYXBpLmNvbXBhY3QgPSBhZGFwdGVyRnVuJCQxKCdjb21wYWN0JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX2NvbXBhY3QnKSwge21ldGhvZDogJ1BPU1QnfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBwaW5nKCkge1xuICAgICAgICBhcGkuaW5mbyhmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgICAvLyBDb3VjaERCIG1heSBzZW5kIGEgXCJjb21wYWN0X3J1bm5pbmc6dHJ1ZVwiIGlmIGl0J3NcbiAgICAgICAgICAvLyBhbHJlYWR5IGNvbXBhY3RpbmcuIFBvdWNoREIgU2VydmVyIGRvZXNuJ3QuXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAocmVzICYmICFyZXMuY29tcGFjdF9ydW5uaW5nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7b2s6IHRydWV9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChwaW5nLCBvcHRzLmludGVydmFsIHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFBpbmcgdGhlIGh0dHAgaWYgaXQncyBmaW5pc2hlZCBjb21wYWN0aW9uXG4gICAgICBwaW5nKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGFwaS5idWxrR2V0ID0gYWRhcHRlckZ1bignYnVsa0dldCcsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvQnVsa0dldChjYikge1xuICAgICAgdmFyIHBhcmFtcyA9IHt9O1xuICAgICAgaWYgKG9wdHMucmV2cykge1xuICAgICAgICBwYXJhbXMucmV2cyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBwYXJhbXMuYXR0YWNobWVudHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMubGF0ZXN0KSB7XG4gICAgICAgIHBhcmFtcy5sYXRlc3QgPSB0cnVlO1xuICAgICAgfVxuICAgICAgZmV0Y2hKU09OKGdlbkRCVXJsKGhvc3QsICdfYnVsa19nZXQnICsgcGFyYW1zVG9TdHIocGFyYW1zKSksIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZG9jczogb3B0cy5kb2NzfSlcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAob3B0cy5hdHRhY2htZW50cyAmJiBvcHRzLmJpbmFyeSkge1xuICAgICAgICAgIHJlc3VsdC5kYXRhLnJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICByZXMuZG9jcy5mb3JFYWNoKHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYihudWxsLCByZXN1bHQuZGF0YSk7XG4gICAgICB9KS5jYXRjaChjYik7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBmdW5jdGlvbiBkb0J1bGtHZXRTaGltKCkge1xuICAgICAgLy8gYXZvaWQgXCJ1cmwgdG9vIGxvbmcgZXJyb3JcIiBieSBzcGxpdHRpbmcgdXAgaW50byBtdWx0aXBsZSByZXF1ZXN0c1xuICAgICAgdmFyIGJhdGNoU2l6ZSA9IE1BWF9TSU1VTFRBTkVPVVNfUkVWUztcbiAgICAgIHZhciBudW1CYXRjaGVzID0gTWF0aC5jZWlsKG9wdHMuZG9jcy5sZW5ndGggLyBiYXRjaFNpemUpO1xuICAgICAgdmFyIG51bURvbmUgPSAwO1xuICAgICAgdmFyIHJlc3VsdHMgPSBuZXcgQXJyYXkobnVtQmF0Y2hlcyk7XG5cbiAgICAgIGZ1bmN0aW9uIG9uUmVzdWx0KGJhdGNoTnVtKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgICAvLyBlcnIgaXMgaW1wb3NzaWJsZSBiZWNhdXNlIHNoaW0gcmV0dXJucyBhIGxpc3Qgb2YgZXJycyBpbiB0aGF0IGNhc2VcbiAgICAgICAgICByZXN1bHRzW2JhdGNoTnVtXSA9IHJlcy5yZXN1bHRzO1xuICAgICAgICAgIGlmICgrK251bURvbmUgPT09IG51bUJhdGNoZXMpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtyZXN1bHRzOiBmbGF0dGVuKHJlc3VsdHMpfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUJhdGNoZXM7IGkrKykge1xuICAgICAgICB2YXIgc3ViT3B0cyA9IHBpY2sob3B0cywgWydyZXZzJywgJ2F0dGFjaG1lbnRzJywgJ2JpbmFyeScsICdsYXRlc3QnXSk7XG4gICAgICAgIHN1Yk9wdHMuZG9jcyA9IG9wdHMuZG9jcy5zbGljZShpICogYmF0Y2hTaXplLFxuICAgICAgICAgIE1hdGgubWluKG9wdHMuZG9jcy5sZW5ndGgsIChpICsgMSkgKiBiYXRjaFNpemUpKTtcbiAgICAgICAgYnVsa0dldChzZWxmLCBzdWJPcHRzLCBvblJlc3VsdChpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbWFyayB0aGUgd2hvbGUgZGF0YWJhc2UgYXMgZWl0aGVyIHN1cHBvcnRpbmcgb3Igbm90IHN1cHBvcnRpbmcgX2J1bGtfZ2V0XG4gICAgdmFyIGRiVXJsID0gZ2VuVXJsKGhvc3QsICcnKTtcbiAgICB2YXIgc3VwcG9ydHNCdWxrR2V0ID0gc3VwcG9ydHNCdWxrR2V0TWFwW2RiVXJsXTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHR5cGVvZiBzdXBwb3J0c0J1bGtHZXQgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBkYXRhYmFzZSBzdXBwb3J0cyBfYnVsa19nZXRcbiAgICAgIGRvQnVsa0dldChmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHN1cHBvcnRzQnVsa0dldE1hcFtkYlVybF0gPSBmYWxzZTtcbiAgICAgICAgICBleHBsYWluRXJyb3IoXG4gICAgICAgICAgICBlcnIuc3RhdHVzLFxuICAgICAgICAgICAgJ1BvdWNoREIgaXMganVzdCBkZXRlY3RpbmcgaWYgdGhlIHJlbW90ZSAnICtcbiAgICAgICAgICAgICdzdXBwb3J0cyB0aGUgX2J1bGtfZ2V0IEFQSS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkb0J1bGtHZXRTaGltKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VwcG9ydHNCdWxrR2V0TWFwW2RiVXJsXSA9IHRydWU7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0c0J1bGtHZXQpIHtcbiAgICAgIGRvQnVsa0dldChjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvQnVsa0dldFNoaW0oKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENhbGxzIEdFVCBvbiB0aGUgaG9zdCwgd2hpY2ggZ2V0cyBiYWNrIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZ1xuICAvLyAgICBjb3VjaGRiOiBBIHdlbGNvbWUgc3RyaW5nXG4gIC8vICAgIHZlcnNpb246IFRoZSB2ZXJzaW9uIG9mIENvdWNoREIgaXQgaXMgcnVubmluZ1xuICBhcGkuX2luZm8gPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG91ckZldGNoKGdlbkRCVXJsKGhvc3QsICcnKSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoaW5mbykge1xuICAgICAgaW5mby5ob3N0ID0gZ2VuREJVcmwoaG9zdCwgJycpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9O1xuXG4gIGFwaS5mZXRjaCA9IGZ1bmN0aW9uIChwYXRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdXJsID0gcGF0aC5zdWJzdHJpbmcoMCwgMSkgPT09ICcvJyA/XG4gICAgICAgIGdlblVybChob3N0LCBwYXRoLnN1YnN0cmluZygxKSkgOlxuICAgICAgICBnZW5EQlVybChob3N0LCBwYXRoKTtcbiAgICAgIHJldHVybiBvdXJGZXRjaCh1cmwsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEdldCB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQgZnJvbSB0aGUgZGF0YWJhc2UgZ2l2ZW4gYnkgaG9zdC5cbiAgLy8gVGhlIGlkIGNvdWxkIGJlIHNvbGVseSB0aGUgX2lkIGluIHRoZSBkYXRhYmFzZSwgb3IgaXQgbWF5IGJlIGFcbiAgLy8gX2Rlc2lnbi9JRCBvciBfbG9jYWwvSUQgcGF0aFxuICBhcGkuZ2V0ID0gYWRhcHRlckZ1biQkMSgnZ2V0JywgZnVuY3Rpb24gKGlkLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIC8vIElmIG5vIG9wdGlvbnMgd2VyZSBnaXZlbiwgc2V0IHRoZSBjYWxsYmFjayB0byB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgICAvLyBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBHRVQgcmVxdWVzdFxuICAgIHZhciBwYXJhbXMgPSB7fTtcblxuICAgIGlmIChvcHRzLnJldnMpIHtcbiAgICAgIHBhcmFtcy5yZXZzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yZXZzX2luZm8pIHtcbiAgICAgIHBhcmFtcy5yZXZzX2luZm8gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmxhdGVzdCkge1xuICAgICAgcGFyYW1zLmxhdGVzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMub3Blbl9yZXZzKSB7XG4gICAgICBpZiAob3B0cy5vcGVuX3JldnMgIT09IFwiYWxsXCIpIHtcbiAgICAgICAgb3B0cy5vcGVuX3JldnMgPSBKU09OLnN0cmluZ2lmeShvcHRzLm9wZW5fcmV2cyk7XG4gICAgICB9XG4gICAgICBwYXJhbXMub3Blbl9yZXZzID0gb3B0cy5vcGVuX3JldnM7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucmV2KSB7XG4gICAgICBwYXJhbXMucmV2ID0gb3B0cy5yZXY7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gb3B0cy5jb25mbGljdHM7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgcGFyYW1zLnVwZGF0ZV9zZXEgPSBvcHRzLnVwZGF0ZV9zZXE7XG4gICAgfVxuXG4gICAgaWQgPSBlbmNvZGVEb2NJZChpZCk7XG5cbiAgICBmdW5jdGlvbiBmZXRjaEF0dGFjaG1lbnRzKGRvYykge1xuICAgICAgdmFyIGF0dHMgPSBkb2MuX2F0dGFjaG1lbnRzO1xuICAgICAgdmFyIGZpbGVuYW1lcyA9IGF0dHMgJiYgT2JqZWN0LmtleXMoYXR0cyk7XG4gICAgICBpZiAoIWF0dHMgfHwgIWZpbGVuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gd2UgZmV0Y2ggdGhlc2UgbWFudWFsbHkgaW4gc2VwYXJhdGUgWEhScywgYmVjYXVzZVxuICAgICAgLy8gU3luYyBHYXRld2F5IHdvdWxkIG5vcm1hbGx5IHNlbmQgaXQgYmFjayBhcyBtdWx0aXBhcnQvbWl4ZWQsXG4gICAgICAvLyB3aGljaCB3ZSBjYW5ub3QgcGFyc2UuIEFsc28sIHRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhblxuICAgICAgLy8gcmVjZWl2aW5nIGF0dGFjaG1lbnRzIGFzIGJhc2U2NC1lbmNvZGVkIHN0cmluZ3MuXG4gICAgICBmdW5jdGlvbiBmZXRjaERhdGEoZmlsZW5hbWUpIHtcbiAgICAgICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgICAgICB2YXIgcGF0aCA9IGVuY29kZURvY0lkKGRvYy5faWQpICsgJy8nICsgZW5jb2RlQXR0YWNobWVudElkKGZpbGVuYW1lKSArXG4gICAgICAgICAgICAnP3Jldj0nICsgZG9jLl9yZXY7XG4gICAgICAgIHJldHVybiBvdXJGZXRjaChnZW5EQlVybChob3N0LCBwYXRoKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBpZiAoJ2J1ZmZlcicgaW4gcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5idWZmZXIoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gICAgICAgICAgaWYgKG9wdHMuYmluYXJ5KSB7XG4gICAgICAgICAgICB2YXIgdHlwZUZpZWxkRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmxvYi5fX3Byb3RvX18sICd0eXBlJyk7XG4gICAgICAgICAgICBpZiAoIXR5cGVGaWVsZERlc2NyaXB0b3IgfHwgdHlwZUZpZWxkRGVzY3JpcHRvci5zZXQpIHtcbiAgICAgICAgICAgICAgYmxvYi50eXBlID0gYXR0LmNvbnRlbnRfdHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBibG9iO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIGJsb2JUb0Jhc2U2NChibG9iLCByZXNvbHZlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHQuc3R1YjtcbiAgICAgICAgICBkZWxldGUgYXR0Lmxlbmd0aDtcbiAgICAgICAgICBhdHQuZGF0YSA9IGRhdGE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvbWlzZUZhY3RvcmllcyA9IGZpbGVuYW1lcy5tYXAoZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YShmaWxlbmFtZSk7XG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhpcyBsaW1pdHMgdGhlIG51bWJlciBvZiBwYXJhbGxlbCB4aHIgcmVxdWVzdHMgdG8gNSBhbnkgdGltZVxuICAgICAgLy8gdG8gYXZvaWQgaXNzdWVzIHdpdGggbWF4aW11bSBicm93c2VyIHJlcXVlc3QgbGltaXRzXG4gICAgICByZXR1cm4gcG9vbChwcm9taXNlRmFjdG9yaWVzLCA1KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmZXRjaEFsbEF0dGFjaG1lbnRzKGRvY09yRG9jcykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZG9jT3JEb2NzKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZG9jT3JEb2NzLm1hcChmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5vaykge1xuICAgICAgICAgICAgcmV0dXJuIGZldGNoQXR0YWNobWVudHMoZG9jLm9rKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmZXRjaEF0dGFjaG1lbnRzKGRvY09yRG9jcyk7XG4gICAgfVxuXG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGlkICsgcGFyYW1zVG9TdHIocGFyYW1zKSk7XG4gICAgZmV0Y2hKU09OKHVybCkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoQWxsQXR0YWNobWVudHMocmVzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzLmRhdGEpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUuZG9jSWQgPSBpZDtcbiAgICAgIGNhbGxiYWNrKGUpO1xuICAgIH0pO1xuICB9KTtcblxuXG4gIC8vIERlbGV0ZSB0aGUgZG9jdW1lbnQgZ2l2ZW4gYnkgZG9jIGZyb20gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIGFwaS5yZW1vdmUgPSBhZGFwdGVyRnVuJCQxKCdyZW1vdmUnLCBmdW5jdGlvbiAoZG9jT3JJZCwgb3B0c09yUmV2LCBvcHRzLCBjYikge1xuICAgIHZhciBkb2M7XG4gICAgaWYgKHR5cGVvZiBvcHRzT3JSZXYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpZCwgcmV2LCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgICAgZG9jID0ge1xuICAgICAgICBfaWQ6IGRvY09ySWQsXG4gICAgICAgIF9yZXY6IG9wdHNPclJldlxuICAgICAgfTtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IG9wdHM7XG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG9jLCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgICAgZG9jID0gZG9jT3JJZDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0c09yUmV2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNiID0gb3B0c09yUmV2O1xuICAgICAgICBvcHRzID0ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYiA9IG9wdHM7XG4gICAgICAgIG9wdHMgPSBvcHRzT3JSZXY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJldiA9IChkb2MuX3JldiB8fCBvcHRzLnJldik7XG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGVuY29kZURvY0lkKGRvYy5faWQpKSArICc/cmV2PScgKyByZXY7XG5cbiAgICBmZXRjaEpTT04odXJsLCB7bWV0aG9kOiAnREVMRVRFJ30sIGNiKS5jYXRjaChjYik7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGVuY29kZUF0dGFjaG1lbnRJZChhdHRhY2htZW50SWQpIHtcbiAgICByZXR1cm4gYXR0YWNobWVudElkLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgYXR0YWNobWVudFxuICBhcGkuZ2V0QXR0YWNobWVudCA9IGFkYXB0ZXJGdW4kJDEoJ2dldEF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIHZhciBwYXJhbXMgPSBvcHRzLnJldiA/ICgnP3Jldj0nICsgb3B0cy5yZXYpIDogJyc7XG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGVuY29kZURvY0lkKGRvY0lkKSkgKyAnLycgK1xuICAgICAgICBlbmNvZGVBdHRhY2htZW50SWQoYXR0YWNobWVudElkKSArIHBhcmFtcztcbiAgICB2YXIgY29udGVudFR5cGU7XG4gICAgb3VyRmV0Y2godXJsLCB7bWV0aG9kOiAnR0VUJ30pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICFwcm9jZXNzLmJyb3dzZXIgJiYgdHlwZW9mIHJlc3BvbnNlLmJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5idWZmZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gICAgICAvLyBUT0RPOiBhbHNvIHJlbW92ZVxuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAhcHJvY2Vzcy5icm93c2VyKSB7XG4gICAgICAgIGJsb2IudHlwZSA9IGNvbnRlbnRUeXBlO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgYmxvYik7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gUmVtb3ZlIHRoZSBhdHRhY2htZW50IGdpdmVuIGJ5IHRoZSBpZCBhbmQgcmV2XG4gIGFwaS5yZW1vdmVBdHRhY2htZW50ID0gIGFkYXB0ZXJGdW4kJDEoJ3JlbW92ZUF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaykge1xuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBlbmNvZGVEb2NJZChkb2NJZCkgKyAnLycgK1xuICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVBdHRhY2htZW50SWQoYXR0YWNobWVudElkKSkgKyAnP3Jldj0nICsgcmV2O1xuICAgIGZldGNoSlNPTih1cmwsIHttZXRob2Q6ICdERUxFVEUnfSwgY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG5cbiAgLy8gQWRkIHRoZSBhdHRhY2htZW50IGdpdmVuIGJ5IGJsb2IgYW5kIGl0cyBjb250ZW50VHlwZSBwcm9wZXJ0eVxuICAvLyB0byB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQsIHRoZSByZXZpc2lvbiBnaXZlbiBieSByZXYsIGFuZFxuICAvLyBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIGFwaS5wdXRBdHRhY2htZW50ID0gYWRhcHRlckZ1biQkMSgncHV0QXR0YWNobWVudCcsIGZ1bmN0aW9uIChkb2NJZCwgYXR0YWNobWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2LCBibG9iLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gdHlwZTtcbiAgICAgIHR5cGUgPSBibG9iO1xuICAgICAgYmxvYiA9IHJldjtcbiAgICAgIHJldiA9IG51bGw7XG4gICAgfVxuICAgIHZhciBpZCA9IGVuY29kZURvY0lkKGRvY0lkKSArICcvJyArIGVuY29kZUF0dGFjaG1lbnRJZChhdHRhY2htZW50SWQpO1xuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBpZCk7XG4gICAgaWYgKHJldikge1xuICAgICAgdXJsICs9ICc/cmV2PScgKyByZXY7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gaW5wdXQgaXMgYXNzdW1lZCB0byBiZSBhIGJhc2U2NCBzdHJpbmdcbiAgICAgIHZhciBiaW5hcnk7XG4gICAgICB0cnkge1xuICAgICAgICBiaW5hcnkgPSB0aGlzQXRvYihibG9iKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoQkFEX0FSRyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBdHRhY2htZW50IGlzIG5vdCBhIHZhbGlkIGJhc2U2NCBzdHJpbmcnKSk7XG4gICAgICB9XG4gICAgICBibG9iID0gYmluYXJ5ID8gYmluU3RyaW5nVG9CbHVmZmVyKGJpbmFyeSwgdHlwZSkgOiAnJztcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGF0dGFjaG1lbnRcbiAgICBmZXRjaEpTT04odXJsLCB7XG4gICAgICBoZWFkZXJzOiBuZXcgaCh7J0NvbnRlbnQtVHlwZSc6IHR5cGV9KSxcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICBib2R5OiBibG9iXG4gICAgfSwgY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG5cbiAgLy8gVXBkYXRlL2NyZWF0ZSBtdWx0aXBsZSBkb2N1bWVudHMgZ2l2ZW4gYnkgcmVxIGluIHRoZSBkYXRhYmFzZVxuICAvLyBnaXZlbiBieSBob3N0LlxuICBhcGkuX2J1bGtEb2NzID0gZnVuY3Rpb24gKHJlcSwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAvLyBJZiBuZXdfZWRpdHM9ZmFsc2UgdGhlbiBpdCBwcmV2ZW50cyB0aGUgZGF0YWJhc2UgZnJvbSBjcmVhdGluZ1xuICAgIC8vIG5ldyByZXZpc2lvbiBudW1iZXJzIGZvciB0aGUgZG9jdW1lbnRzLiBJbnN0ZWFkIGl0IGp1c3QgdXNlc1xuICAgIC8vIHRoZSBvbGQgb25lcy4gVGhpcyBpcyB1c2VkIGluIGRhdGFiYXNlIHJlcGxpY2F0aW9uLlxuICAgIHJlcS5uZXdfZWRpdHMgPSBvcHRzLm5ld19lZGl0cztcblxuICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVxLmRvY3MubWFwKHByZXByb2Nlc3NBdHRhY2htZW50cyQxKSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVcGRhdGUvY3JlYXRlIHRoZSBkb2N1bWVudHNcbiAgICAgIHJldHVybiBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJ19idWxrX2RvY3MnKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxKVxuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH0pLmNhdGNoKGNhbGxiYWNrKTtcbiAgfTtcblxuXG4gIC8vIFVwZGF0ZS9jcmVhdGUgZG9jdW1lbnRcbiAgYXBpLl9wdXQgPSBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEoZG9jKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgZW5jb2RlRG9jSWQoZG9jLl9pZCkpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRvYylcbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0LmRhdGEpO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGVyci5kb2NJZCA9IGRvYyAmJiBkb2MuX2lkO1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgfTtcblxuXG4gIC8vIEdldCBhIGxpc3Rpbmcgb2YgdGhlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgZ2l2ZW5cbiAgLy8gYnkgaG9zdCBhbmQgb3JkZXJlZCBieSBpbmNyZWFzaW5nIGlkLlxuICBhcGkuYWxsRG9jcyA9IGFkYXB0ZXJGdW4kJDEoJ2FsbERvY3MnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gICAgLy8gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgR0VUIHJlcXVlc3RcbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgdmFyIGJvZHk7XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnO1xuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICBwYXJhbXMudXBkYXRlX3NlcSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGVzY2VuZGluZykge1xuICAgICAgcGFyYW1zLmRlc2NlbmRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgcGFyYW1zLmluY2x1ZGVfZG9jcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gYWRkZWQgaW4gQ291Y2hEQiAxLjYuMFxuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBwYXJhbXMuYXR0YWNobWVudHMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmtleSkge1xuICAgICAgcGFyYW1zLmtleSA9IEpTT04uc3RyaW5naWZ5KG9wdHMua2V5KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zdGFydF9rZXkpIHtcbiAgICAgIG9wdHMuc3RhcnRrZXkgPSBvcHRzLnN0YXJ0X2tleTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zdGFydGtleSkge1xuICAgICAgcGFyYW1zLnN0YXJ0a2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5zdGFydGtleSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5kX2tleSkge1xuICAgICAgb3B0cy5lbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5ka2V5KSB7XG4gICAgICBwYXJhbXMuZW5ka2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5lbmRrZXkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5pbmNsdXNpdmVfZW5kICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmluY2x1c2l2ZV9lbmQgPSAhIW9wdHMuaW5jbHVzaXZlX2VuZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMubGltaXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMubGltaXQgPSBvcHRzLmxpbWl0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5za2lwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLnNraXAgPSBvcHRzLnNraXA7XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtU3RyID0gcGFyYW1zVG9TdHIocGFyYW1zKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0cy5rZXlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbWV0aG9kID0gJ1BPU1QnO1xuICAgICAgYm9keSA9IHtrZXlzOiBvcHRzLmtleXN9O1xuICAgIH1cblxuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX2FsbF9kb2NzJyArIHBhcmFtU3RyKSwge1xuICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcyAmJiBvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuYmluYXJ5KSB7XG4gICAgICAgIHJlc3VsdC5kYXRhLnJvd3MuZm9yRWFjaChyZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlcik7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQuZGF0YSk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcblxuICAvLyBHZXQgYSBsaXN0IG9mIGNoYW5nZXMgbWFkZSB0byBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIC8vIFRPRE8gQWNjb3JkaW5nIHRvIHRoZSBSRUFETUUsIHRoZXJlIHNob3VsZCBiZSB0d28gb3RoZXIgbWV0aG9kcyBoZXJlLFxuICAvLyBhcGkuY2hhbmdlcy5hZGRMaXN0ZW5lciBhbmQgYXBpLmNoYW5nZXMucmVtb3ZlTGlzdGVuZXIuXG4gIGFwaS5fY2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cbiAgICAvLyBXZSBpbnRlcm5hbGx5IHBhZ2UgdGhlIHJlc3VsdHMgb2YgYSBjaGFuZ2VzIHJlcXVlc3QsIHRoaXMgbWVhbnNcbiAgICAvLyBpZiB0aGVyZSBpcyBhIGxhcmdlIHNldCBvZiBjaGFuZ2VzIHRvIGJlIHJldHVybmVkIHdlIGNhbiBzdGFydFxuICAgIC8vIHByb2Nlc3NpbmcgdGhlbSBxdWlja2VyIGluc3RlYWQgb2Ygd2FpdGluZyBvbiB0aGUgZW50aXJlXG4gICAgLy8gc2V0IG9mIGNoYW5nZXMgdG8gcmV0dXJuIGFuZCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlbSBhdCBvbmNlXG4gICAgdmFyIGJhdGNoU2l6ZSA9ICdiYXRjaF9zaXplJyBpbiBvcHRzID8gb3B0cy5iYXRjaF9zaXplIDogQ0hBTkdFU19CQVRDSF9TSVpFO1xuXG4gICAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gICAgaWYgKG9wdHMuY29udGludW91cyAmJiAhKCdoZWFydGJlYXQnIGluIG9wdHMpKSB7XG4gICAgICBvcHRzLmhlYXJ0YmVhdCA9IERFRkFVTFRfSEVBUlRCRUFUO1xuICAgIH1cblxuICAgIHZhciByZXF1ZXN0VGltZW91dCA9ICgndGltZW91dCcgaW4gb3B0cykgPyBvcHRzLnRpbWVvdXQgOiAzMCAqIDEwMDA7XG5cbiAgICAvLyBlbnN1cmUgQ0hBTkdFU19USU1FT1VUX0JVRkZFUiBhcHBsaWVzXG4gICAgaWYgKCd0aW1lb3V0JyBpbiBvcHRzICYmIG9wdHMudGltZW91dCAmJlxuICAgICAgKHJlcXVlc3RUaW1lb3V0IC0gb3B0cy50aW1lb3V0KSA8IENIQU5HRVNfVElNRU9VVF9CVUZGRVIpIHtcbiAgICAgICAgcmVxdWVzdFRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgKyBDSEFOR0VTX1RJTUVPVVRfQlVGRkVSO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICgnaGVhcnRiZWF0JyBpbiBvcHRzICYmIG9wdHMuaGVhcnRiZWF0ICYmXG4gICAgICAgKHJlcXVlc3RUaW1lb3V0IC0gb3B0cy5oZWFydGJlYXQpIDwgQ0hBTkdFU19USU1FT1VUX0JVRkZFUikge1xuICAgICAgICByZXF1ZXN0VGltZW91dCA9IG9wdHMuaGVhcnRiZWF0ICsgQ0hBTkdFU19USU1FT1VUX0JVRkZFUjtcbiAgICB9XG5cbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgaWYgKCd0aW1lb3V0JyBpbiBvcHRzICYmIG9wdHMudGltZW91dCkge1xuICAgICAgcGFyYW1zLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQ7XG4gICAgfVxuXG4gICAgdmFyIGxpbWl0ID0gKHR5cGVvZiBvcHRzLmxpbWl0ICE9PSAndW5kZWZpbmVkJykgPyBvcHRzLmxpbWl0IDogZmFsc2U7XG4gICAgdmFyIGxlZnRUb0ZldGNoID0gbGltaXQ7XG5cbiAgICBpZiAob3B0cy5zdHlsZSkge1xuICAgICAgcGFyYW1zLnN0eWxlID0gb3B0cy5zdHlsZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MgfHwgb3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwYXJhbXMuaW5jbHVkZV9kb2NzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgcGFyYW1zLmF0dGFjaG1lbnRzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jb250aW51b3VzKSB7XG4gICAgICBwYXJhbXMuZmVlZCA9ICdsb25ncG9sbCc7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuc2VxX2ludGVydmFsKSB7XG4gICAgICBwYXJhbXMuc2VxX2ludGVydmFsID0gb3B0cy5zZXFfaW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICBwYXJhbXMuZGVzY2VuZGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgcGFyYW1zLnVwZGF0ZV9zZXEgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICgnaGVhcnRiZWF0JyBpbiBvcHRzKSB7XG4gICAgICAvLyBJZiB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzIGZhbHNlLCBpdCBkaXNhYmxlcyB0aGUgZGVmYXVsdCBoZWFydGJlYXRcbiAgICAgIGlmIChvcHRzLmhlYXJ0YmVhdCkge1xuICAgICAgICBwYXJhbXMuaGVhcnRiZWF0ID0gb3B0cy5oZWFydGJlYXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZmlsdGVyICYmIHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBhcmFtcy5maWx0ZXIgPSBvcHRzLmZpbHRlcjtcbiAgICB9XG5cbiAgICBpZiAob3B0cy52aWV3ICYmIHR5cGVvZiBvcHRzLnZpZXcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXJhbXMuZmlsdGVyID0gJ192aWV3JztcbiAgICAgIHBhcmFtcy52aWV3ID0gb3B0cy52aWV3O1xuICAgIH1cblxuICAgIC8vIElmIG9wdHMucXVlcnlfcGFyYW1zIGV4aXN0cywgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjaGFuZ2VzIHJlcXVlc3QuXG4gICAgLy8gVGhlc2UgcGFyYW1ldGVycyBtYXkgYmUgdXNlZCBieSB0aGUgZmlsdGVyIG9uIHRoZSBzb3VyY2UgZGF0YWJhc2UuXG4gICAgaWYgKG9wdHMucXVlcnlfcGFyYW1zICYmIHR5cGVvZiBvcHRzLnF1ZXJ5X3BhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gb3B0cy5xdWVyeV9wYXJhbXMpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRzLnF1ZXJ5X3BhcmFtcywgcGFyYW1fbmFtZSkpIHtcbiAgICAgICAgICBwYXJhbXNbcGFyYW1fbmFtZV0gPSBvcHRzLnF1ZXJ5X3BhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtZXRob2QgPSAnR0VUJztcbiAgICB2YXIgYm9keTtcblxuICAgIGlmIChvcHRzLmRvY19pZHMpIHtcbiAgICAgIC8vIHNldCB0aGlzIGF1dG9tYWdpY2FsbHkgZm9yIHRoZSB1c2VyOyBpdCdzIGFubm95aW5nIHRoYXQgY291Y2hkYlxuICAgICAgLy8gcmVxdWlyZXMgYm90aCBhIFwiZmlsdGVyXCIgYW5kIGEgXCJkb2NfaWRzXCIgcGFyYW0uXG4gICAgICBwYXJhbXMuZmlsdGVyID0gJ19kb2NfaWRzJztcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgIGJvZHkgPSB7ZG9jX2lkczogb3B0cy5kb2NfaWRzIH07XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZWxzZSBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgICAgLy8gc2V0IHRoaXMgYXV0b21hZ2ljYWxseSBmb3IgdGhlIHVzZXIsIHNpbWlsYXIgdG8gYWJvdmVcbiAgICAgIHBhcmFtcy5maWx0ZXIgPSAnX3NlbGVjdG9yJztcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgIGJvZHkgPSB7c2VsZWN0b3I6IG9wdHMuc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICB2YXIgY29udHJvbGxlciA9IG5ldyBhKCk7XG4gICAgdmFyIGxhc3RGZXRjaGVkU2VxO1xuXG4gICAgLy8gR2V0IGFsbCB0aGUgY2hhbmdlcyBzdGFydGluZyB3dGloIHRoZSBvbmUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXG4gICAgLy8gc2VxdWVuY2UgbnVtYmVyIGdpdmVuIGJ5IHNpbmNlLlxuICAgIHZhciBmZXRjaERhdGEgPSBmdW5jdGlvbiAoc2luY2UsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5zaW5jZSA9IHNpbmNlO1xuICAgICAgLy8gXCJzaW5jZVwiIGNhbiBiZSBhbnkga2luZCBvZiBqc29uIG9iamVjdCBpbiBDbG91ZGFudC9Db3VjaERCIDIueFxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmICh0eXBlb2YgcGFyYW1zLnNpbmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHBhcmFtcy5zaW5jZSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcy5zaW5jZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLmRlc2NlbmRpbmcpIHtcbiAgICAgICAgaWYgKGxpbWl0KSB7XG4gICAgICAgICAgcGFyYW1zLmxpbWl0ID0gbGVmdFRvRmV0Y2g7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcy5saW1pdCA9ICghbGltaXQgfHwgbGVmdFRvRmV0Y2ggPiBiYXRjaFNpemUpID9cbiAgICAgICAgICBiYXRjaFNpemUgOiBsZWZ0VG9GZXRjaDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBvcHRpb25zIGZvciB0aGUgYWpheCBjYWxsXG4gICAgICB2YXIgdXJsID0gZ2VuREJVcmwoaG9zdCwgJ19jaGFuZ2VzJyArIHBhcmFtc1RvU3RyKHBhcmFtcykpO1xuICAgICAgdmFyIGZldGNoT3B0cyA9IHtcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgICB9O1xuICAgICAgbGFzdEZldGNoZWRTZXEgPSBzaW5jZTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBjaGFuZ2VzXG4gICAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmV0Y2hKU09OKHVybCwgZmV0Y2hPcHRzLCBjYWxsYmFjayk7XG4gICAgICB9KS5jYXRjaChjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIC8vIElmIG9wdHMuc2luY2UgZXhpc3RzLCBnZXQgYWxsIHRoZSBjaGFuZ2VzIGZyb20gdGhlIHNlcXVlbmNlXG4gICAgLy8gbnVtYmVyIGdpdmVuIGJ5IG9wdHMuc2luY2UuIE90aGVyd2lzZSwgZ2V0IGFsbCB0aGUgY2hhbmdlc1xuICAgIC8vIGZyb20gdGhlIHNlcXVlbmNlIG51bWJlciAwLlxuICAgIHZhciByZXN1bHRzID0ge3Jlc3VsdHM6IFtdfTtcblxuICAgIHZhciBmZXRjaGVkID0gZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciByYXdfcmVzdWx0c19sZW5ndGggPSAwO1xuICAgICAgLy8gSWYgdGhlIHJlc3VsdCBvZiB0aGUgYWpheCBjYWxsIChyZXMpIGNvbnRhaW5zIGNoYW5nZXMgKHJlcy5yZXN1bHRzKVxuICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0cykge1xuICAgICAgICByYXdfcmVzdWx0c19sZW5ndGggPSByZXMucmVzdWx0cy5sZW5ndGg7XG4gICAgICAgIHJlc3VsdHMubGFzdF9zZXEgPSByZXMubGFzdF9zZXE7XG4gICAgICAgIHZhciBwZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdmFyIGxhc3RTZXEgPSBudWxsO1xuICAgICAgICAvLyBBdHRhY2ggJ3BlbmRpbmcnIHByb3BlcnR5IGlmIHNlcnZlciBzdXBwb3J0cyBpdCAoQ291Y2hEQiAyLjArKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHR5cGVvZiByZXMucGVuZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBwZW5kaW5nID0gcmVzLnBlbmRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRzLmxhc3Rfc2VxID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVzdWx0cy5sYXN0X3NlcSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsYXN0U2VxID0gcmVzdWx0cy5sYXN0X3NlcTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgZWFjaCBjaGFuZ2VcbiAgICAgICAgdmFyIHJlcSA9IHt9O1xuICAgICAgICByZXEucXVlcnkgPSBvcHRzLnF1ZXJ5X3BhcmFtcztcbiAgICAgICAgcmVzLnJlc3VsdHMgPSByZXMucmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICBsZWZ0VG9GZXRjaC0tO1xuICAgICAgICAgIHZhciByZXQgPSBmaWx0ZXJDaGFuZ2Uob3B0cykoYyk7XG4gICAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgICAgaWYgKG9wdHMuaW5jbHVkZV9kb2NzICYmIG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5iaW5hcnkpIHtcbiAgICAgICAgICAgICAgcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIoYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0cy5yZXR1cm5fZG9jcykge1xuICAgICAgICAgICAgICByZXN1bHRzLnJlc3VsdHMucHVzaChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdHMub25DaGFuZ2UoYywgcGVuZGluZywgbGFzdFNlcSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBlcnJvciwgc3RvcCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMgYW5kIGNhbGxcbiAgICAgICAgLy8gb3B0cy5jb21wbGV0ZVxuICAgICAgICBvcHRzLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICBvcHRzLmNvbXBsZXRlKGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNoYW5nZXMgZmVlZCBtYXkgaGF2ZSB0aW1lZCBvdXQgd2l0aCBubyByZXN1bHRzXG4gICAgICAvLyBpZiBzbyByZXVzZSBsYXN0IHVwZGF0ZSBzZXF1ZW5jZVxuICAgICAgaWYgKHJlcyAmJiByZXMubGFzdF9zZXEpIHtcbiAgICAgICAgbGFzdEZldGNoZWRTZXEgPSByZXMubGFzdF9zZXE7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaW5pc2hlZCA9IChsaW1pdCAmJiBsZWZ0VG9GZXRjaCA8PSAwKSB8fFxuICAgICAgICAocmVzICYmIHJhd19yZXN1bHRzX2xlbmd0aCA8IGJhdGNoU2l6ZSkgfHxcbiAgICAgICAgKG9wdHMuZGVzY2VuZGluZyk7XG5cbiAgICAgIGlmICgob3B0cy5jb250aW51b3VzICYmICEobGltaXQgJiYgbGVmdFRvRmV0Y2ggPD0gMCkpIHx8ICFmaW5pc2hlZCkge1xuICAgICAgICAvLyBRdWV1ZSBhIGNhbGwgdG8gZmV0Y2ggYWdhaW4gd2l0aCB0aGUgbmV3ZXN0IHNlcXVlbmNlIG51bWJlclxuICAgICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkgeyBmZXRjaERhdGEobGFzdEZldGNoZWRTZXEsIGZldGNoZWQpOyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdlJ3JlIGRvbmUsIGNhbGwgdGhlIGNhbGxiYWNrXG4gICAgICAgIG9wdHMuY29tcGxldGUobnVsbCwgcmVzdWx0cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZldGNoRGF0YShvcHRzLnNpbmNlIHx8IDAsIGZldGNoZWQpO1xuXG4gICAgLy8gUmV0dXJuIGEgbWV0aG9kIHRvIGNhbmNlbCB0aGlzIG1ldGhvZCBmcm9tIHByb2Nlc3NpbmcgYW55IG1vcmVcbiAgICByZXR1cm4ge1xuICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9wdHMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIC8vIEdpdmVuIGEgc2V0IG9mIGRvY3VtZW50L3JldmlzaW9uIElEcyAoZ2l2ZW4gYnkgcmVxKSwgdGV0cyB0aGUgc3Vic2V0IG9mXG4gIC8vIHRob3NlIHRoYXQgZG8gTk9UIGNvcnJlc3BvbmQgdG8gcmV2aXNpb25zIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuXG4gIC8vIFNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL2NvdWNoZGIvSHR0cFBvc3RSZXZzRGlmZlxuICBhcGkucmV2c0RpZmYgPSBhZGFwdGVyRnVuJCQxKCdyZXZzRGlmZicsIGZ1bmN0aW9uIChyZXEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgLy8gSWYgbm8gb3B0aW9ucyB3ZXJlIGdpdmVuLCBzZXQgdGhlIGNhbGxiYWNrIHRvIGJlIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBtaXNzaW5nIGRvY3VtZW50L3JldmlzaW9uIElEc1xuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX3JldnNfZGlmZicpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcSlcbiAgICB9LCBjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcblxuICBhcGkuX2Nsb3NlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfTtcblxuICBhcGkuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJycpLCB7bWV0aG9kOiAnREVMRVRFJ30pLnRoZW4oZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGpzb24pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB7b2s6IHRydWV9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59XG5cbi8vIEh0dHBQb3VjaCBpcyBhIHZhbGlkIGFkYXB0ZXIuXG5IdHRwUG91Y2gudmFsaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gSHR0cFBvdWNoJDEgKFBvdWNoREIpIHtcbiAgUG91Y2hEQi5hZGFwdGVyKCdodHRwJywgSHR0cFBvdWNoLCBmYWxzZSk7XG4gIFBvdWNoREIuYWRhcHRlcignaHR0cHMnLCBIdHRwUG91Y2gsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gUXVlcnlQYXJzZUVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5zdGF0dXMgPSA0MDA7XG4gIHRoaXMubmFtZSA9ICdxdWVyeV9wYXJzZV9lcnJvcic7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMuZXJyb3IgPSB0cnVlO1xuICB0cnkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFF1ZXJ5UGFyc2VFcnJvcik7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbmluaGVyaXRzKFF1ZXJ5UGFyc2VFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBOb3RGb3VuZEVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5zdGF0dXMgPSA0MDQ7XG4gIHRoaXMubmFtZSA9ICdub3RfZm91bmQnO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBOb3RGb3VuZEVycm9yKTtcbiAgfSBjYXRjaCAoZSkge31cbn1cblxuaW5oZXJpdHMoTm90Rm91bmRFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBCdWlsdEluRXJyb3IobWVzc2FnZSkge1xuICB0aGlzLnN0YXR1cyA9IDUwMDtcbiAgdGhpcy5uYW1lID0gJ2ludmFsaWRfdmFsdWUnO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBCdWlsdEluRXJyb3IpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5pbmhlcml0cyhCdWlsdEluRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gcHJvbWlzZWRDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2spIHtcbiAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrKHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gY2FsbGJhY2tpZnkoZnVuKSB7XG4gIHJldHVybiBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICB2YXIgY2IgPSBhcmdzLnBvcCgpO1xuICAgIHZhciBwcm9taXNlID0gZnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb21pc2VkQ2FsbGJhY2socHJvbWlzZSwgY2IpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSk7XG59XG5cbi8vIFByb21pc2UgZmluYWxseSB1dGlsIHNpbWlsYXIgdG8gUS5maW5hbGx5XG5mdW5jdGlvbiBmaW4ocHJvbWlzZSwgZmluYWxQcm9taXNlRmFjdG9yeSkge1xuICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICByZXR1cm4gZmluYWxQcm9taXNlRmFjdG9yeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIHJldHVybiBmaW5hbFByb21pc2VGYWN0b3J5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyByZWFzb247XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXF1ZW50aWFsaXplKHF1ZXVlLCBwcm9taXNlRmFjdG9yeSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gcXVldWUuYWRkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlRmFjdG9yeS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuLy8gdW5pcSBhbiBhcnJheSBvZiBzdHJpbmdzLCBvcmRlciBub3QgZ3VhcmFudGVlZFxuLy8gc2ltaWxhciB0byB1bmRlcnNjb3JlL2xvZGFzaCBfLnVuaXFcbmZ1bmN0aW9uIHVuaXEoYXJyKSB7XG4gIHZhciB0aGVTZXQgPSBuZXcgRXhwb3J0ZWRTZXQoYXJyKTtcbiAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSh0aGVTZXQuc2l6ZSk7XG4gIHZhciBpbmRleCA9IC0xO1xuICB0aGVTZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1hcFRvS2V5c0FycmF5KG1hcCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KG1hcC5zaXplKTtcbiAgdmFyIGluZGV4ID0gLTE7XG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0ga2V5O1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVpbHRJbkVycm9yKG5hbWUpIHtcbiAgdmFyIG1lc3NhZ2UgPSAnYnVpbHRpbiAnICsgbmFtZSArXG4gICAgJyBmdW5jdGlvbiByZXF1aXJlcyBtYXAgdmFsdWVzIHRvIGJlIG51bWJlcnMnICtcbiAgICAnIG9yIG51bWJlciBhcnJheXMnO1xuICByZXR1cm4gbmV3IEJ1aWx0SW5FcnJvcihtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gc3VtKHZhbHVlcykge1xuICB2YXIgcmVzdWx0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBudW0gPSB2YWx1ZXNbaV07XG4gICAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShudW0pKSB7XG4gICAgICAgIC8vIGxpc3RzIG9mIG51bWJlcnMgYXJlIGFsc28gYWxsb3dlZCwgc3VtIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICByZXN1bHQgPSB0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJyA/IFtyZXN1bHRdIDogcmVzdWx0O1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgakxlbiA9IG51bS5sZW5ndGg7IGogPCBqTGVuOyBqKyspIHtcbiAgICAgICAgICB2YXIgak51bSA9IG51bVtqXTtcbiAgICAgICAgICBpZiAodHlwZW9mIGpOdW0gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVCdWlsdEluRXJyb3IoJ19zdW0nKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHRbal0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChqTnVtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0W2pdICs9IGpOdW07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAvLyBub3QgYXJyYXkvbnVtYmVyXG4gICAgICAgIHRocm93IGNyZWF0ZUJ1aWx0SW5FcnJvcignX3N1bScpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJlc3VsdCArPSBudW07XG4gICAgfSBlbHNlIHsgLy8gYWRkIG51bWJlciB0byBhcnJheVxuICAgICAgcmVzdWx0WzBdICs9IG51bTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIGxvZyA9IGd1YXJkZWRDb25zb2xlLmJpbmQobnVsbCwgJ2xvZycpO1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIHRvSlNPTiA9IEpTT04ucGFyc2U7XG5cbmZ1bmN0aW9uIGV2YWxGdW5jdGlvbldpdGhFdmFsKGZ1bmMsIGVtaXQpIHtcbiAgcmV0dXJuIHNjb3BlRXZhbChcbiAgICBcInJldHVybiAoXCIgKyBmdW5jLnJlcGxhY2UoLztcXHMqJC8sIFwiXCIpICsgXCIpO1wiLFxuICAgIHtcbiAgICAgIGVtaXQ6IGVtaXQsXG4gICAgICBzdW06IHN1bSxcbiAgICAgIGxvZzogbG9nLFxuICAgICAgaXNBcnJheTogaXNBcnJheSxcbiAgICAgIHRvSlNPTjogdG9KU09OXG4gICAgfVxuICApO1xufVxuXG4vKlxuICogU2ltcGxlIHRhc2sgcXVldWUgdG8gc2VxdWVudGlhbGl6ZSBhY3Rpb25zLiBBc3N1bWVzXG4gKiBjYWxsYmFja3Mgd2lsbCBldmVudHVhbGx5IGZpcmUgKG9uY2UpLlxuICovXG5cblxuZnVuY3Rpb24gVGFza1F1ZXVlJDEoKSB7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsKSB7ZnVsZmlsbCgpOyB9KTtcbn1cblRhc2tRdWV1ZSQxLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAocHJvbWlzZUZhY3RvcnkpIHtcbiAgdGhpcy5wcm9taXNlID0gdGhpcy5wcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBqdXN0IHJlY292ZXJcbiAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb21pc2VGYWN0b3J5KCk7XG4gIH0pO1xuICByZXR1cm4gdGhpcy5wcm9taXNlO1xufTtcblRhc2tRdWV1ZSQxLnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnByb21pc2U7XG59O1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkoaW5wdXQpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJzsgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3IgZW1wdHkgcmVkdWNlXG4gIH1cbiAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXQgd2l0aCBtYXByZWR1Y2UsIGZ1bmN0aW9ucy9zdHJpbmdzIGFyZSBzdHJpbmdpZmllZFxuICAvLyBhcy1pcy4gZXZlcnl0aGluZyBlbHNlIGlzIEpTT04tc3RyaW5naWZpZWQuXG4gIHN3aXRjaCAodHlwZW9mIGlucHV0KSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgLy8gZS5nLiBhIG1hcHJlZHVjZSBtYXBcbiAgICAgIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAvLyBlLmcuIGEgbWFwcmVkdWNlIGJ1aWx0LWluIF9yZWR1Y2UgZnVuY3Rpb25cbiAgICAgIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlLmcuIGEgSlNPTiBvYmplY3QgaW4gdGhlIGNhc2Ugb2YgbWFuZ28gcXVlcmllc1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGlucHV0KTtcbiAgfVxufVxuXG4vKiBjcmVhdGUgYSBzdHJpbmcgc2lnbmF0dXJlIGZvciBhIHZpZXcgc28gd2UgY2FuIGNhY2hlIGl0IGFuZCB1bmlxIGl0ICovXG5mdW5jdGlvbiBjcmVhdGVWaWV3U2lnbmF0dXJlKG1hcEZ1biwgcmVkdWNlRnVuKSB7XG4gIC8vIHRoZSBcInVuZGVmaW5lZFwiIHBhcnQgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIHJldHVybiBzdHJpbmdpZnkobWFwRnVuKSArIHN0cmluZ2lmeShyZWR1Y2VGdW4pICsgJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpZXcoc291cmNlREIsIHZpZXdOYW1lLCBtYXBGdW4sIHJlZHVjZUZ1biwgdGVtcG9yYXJ5LCBsb2NhbERvY05hbWUpIHtcbiAgdmFyIHZpZXdTaWduYXR1cmUgPSBjcmVhdGVWaWV3U2lnbmF0dXJlKG1hcEZ1biwgcmVkdWNlRnVuKTtcblxuICB2YXIgY2FjaGVkVmlld3M7XG4gIGlmICghdGVtcG9yYXJ5KSB7XG4gICAgLy8gY2FjaGUgdGhpcyB0byBlbnN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHVwZGF0ZSB0aGUgc2FtZSB2aWV3IHR3aWNlXG4gICAgY2FjaGVkVmlld3MgPSBzb3VyY2VEQi5fY2FjaGVkVmlld3MgPSBzb3VyY2VEQi5fY2FjaGVkVmlld3MgfHwge307XG4gICAgaWYgKGNhY2hlZFZpZXdzW3ZpZXdTaWduYXR1cmVdKSB7XG4gICAgICByZXR1cm4gY2FjaGVkVmlld3Nbdmlld1NpZ25hdHVyZV07XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb21pc2VGb3JWaWV3ID0gc291cmNlREIuaW5mbygpLnRoZW4oZnVuY3Rpb24gKGluZm8pIHtcblxuICAgIHZhciBkZXBEYk5hbWUgPSBpbmZvLmRiX25hbWUgKyAnLW1ydmlldy0nICtcbiAgICAgICh0ZW1wb3JhcnkgPyAndGVtcCcgOiBzdHJpbmdNZDUodmlld1NpZ25hdHVyZSkpO1xuXG4gICAgLy8gc2F2ZSB0aGUgdmlldyBuYW1lIGluIHRoZSBzb3VyY2UgZGIgc28gaXQgY2FuIGJlIGNsZWFuZWQgdXAgaWYgbmVjZXNzYXJ5XG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgX2Rlc2lnbiBkb2MgaXMgZGVsZXRlZCwgcmVtb3ZlIGFsbCBhc3NvY2lhdGVkIHZpZXcgZGF0YSlcbiAgICBmdW5jdGlvbiBkaWZmRnVuY3Rpb24oZG9jKSB7XG4gICAgICBkb2Mudmlld3MgPSBkb2Mudmlld3MgfHwge307XG4gICAgICB2YXIgZnVsbFZpZXdOYW1lID0gdmlld05hbWU7XG4gICAgICBpZiAoZnVsbFZpZXdOYW1lLmluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgICAgZnVsbFZpZXdOYW1lID0gdmlld05hbWUgKyAnLycgKyB2aWV3TmFtZTtcbiAgICAgIH1cbiAgICAgIHZhciBkZXBEYnMgPSBkb2Mudmlld3NbZnVsbFZpZXdOYW1lXSA9IGRvYy52aWV3c1tmdWxsVmlld05hbWVdIHx8IHt9O1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZGVwRGJzW2RlcERiTmFtZV0pIHtcbiAgICAgICAgcmV0dXJuOyAvLyBubyB1cGRhdGUgbmVjZXNzYXJ5XG4gICAgICB9XG4gICAgICBkZXBEYnNbZGVwRGJOYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZG9jO1xuICAgIH1cbiAgICByZXR1cm4gdXBzZXJ0KHNvdXJjZURCLCAnX2xvY2FsLycgKyBsb2NhbERvY05hbWUsIGRpZmZGdW5jdGlvbikudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc291cmNlREIucmVnaXN0ZXJEZXBlbmRlbnREYXRhYmFzZShkZXBEYk5hbWUpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB2YXIgZGIgPSByZXMuZGI7XG4gICAgICAgIGRiLmF1dG9fY29tcGFjdGlvbiA9IHRydWU7XG4gICAgICAgIHZhciB2aWV3ID0ge1xuICAgICAgICAgIG5hbWU6IGRlcERiTmFtZSxcbiAgICAgICAgICBkYjogZGIsXG4gICAgICAgICAgc291cmNlREI6IHNvdXJjZURCLFxuICAgICAgICAgIGFkYXB0ZXI6IHNvdXJjZURCLmFkYXB0ZXIsXG4gICAgICAgICAgbWFwRnVuOiBtYXBGdW4sXG4gICAgICAgICAgcmVkdWNlRnVuOiByZWR1Y2VGdW5cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZpZXcuZGIuZ2V0KCdfbG9jYWwvbGFzdFNlcScpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChsYXN0U2VxRG9jKSB7XG4gICAgICAgICAgdmlldy5zZXEgPSBsYXN0U2VxRG9jID8gbGFzdFNlcURvYy5zZXEgOiAwO1xuICAgICAgICAgIGlmIChjYWNoZWRWaWV3cykge1xuICAgICAgICAgICAgdmlldy5kYi5vbmNlKCdkZXN0cm95ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZWRWaWV3c1t2aWV3U2lnbmF0dXJlXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmlldztcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKGNhY2hlZFZpZXdzKSB7XG4gICAgY2FjaGVkVmlld3Nbdmlld1NpZ25hdHVyZV0gPSBwcm9taXNlRm9yVmlldztcbiAgfVxuICByZXR1cm4gcHJvbWlzZUZvclZpZXc7XG59XG5cbnZhciBwZXJzaXN0ZW50UXVldWVzID0ge307XG52YXIgdGVtcFZpZXdRdWV1ZSA9IG5ldyBUYXNrUXVldWUkMSgpO1xudmFyIENIQU5HRVNfQkFUQ0hfU0laRSQxID0gNTA7XG5cbmZ1bmN0aW9uIHBhcnNlVmlld05hbWUobmFtZSkge1xuICAvLyBjYW4gYmUgZWl0aGVyICdkZG9jbmFtZS92aWV3bmFtZScgb3IganVzdCAndmlld25hbWUnXG4gIC8vICh3aGVyZSB0aGUgZGRvYyBuYW1lIGlzIHRoZSBzYW1lKVxuICByZXR1cm4gbmFtZS5pbmRleE9mKCcvJykgPT09IC0xID8gW25hbWUsIG5hbWVdIDogbmFtZS5zcGxpdCgnLycpO1xufVxuXG5mdW5jdGlvbiBpc0dlbk9uZShjaGFuZ2VzKSB7XG4gIC8vIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgY2hhbmdlIGlzIDEtXG4gIC8vIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgbGVhZnNcbiAgcmV0dXJuIGNoYW5nZXMubGVuZ3RoID09PSAxICYmIC9eMS0vLnRlc3QoY2hhbmdlc1swXS5yZXYpO1xufVxuXG5mdW5jdGlvbiBlbWl0RXJyb3IoZGIsIGUpIHtcbiAgdHJ5IHtcbiAgICBkYi5lbWl0KCdlcnJvcicsIGUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLFxuICAgICAgJ1RoZSB1c2VyXFwncyBtYXAvcmVkdWNlIGZ1bmN0aW9uIHRocmV3IGFuIHVuY2F1Z2h0IGVycm9yLlxcbicgK1xuICAgICAgJ1lvdSBjYW4gZGVidWcgdGhpcyBlcnJvciBieSBkb2luZzpcXG4nICtcbiAgICAgICdteURhdGFiYXNlLm9uKFxcJ2Vycm9yXFwnLCBmdW5jdGlvbiAoZXJyKSB7IGRlYnVnZ2VyOyB9KTtcXG4nICtcbiAgICAgICdQbGVhc2UgZG91YmxlLWNoZWNrIHlvdXIgbWFwL3JlZHVjZSBmdW5jdGlvbi4nKTtcbiAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLCBlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gXCJhYnN0cmFjdFwiIG1hcHJlZHVjZSBvYmplY3Qgb2YgdGhlIGZvcm06XG4gKlxuICogICB7XG4gKiAgICAgcXVlcnk6IHF1ZXJ5RnVuLFxuICogICAgIHZpZXdDbGVhbnVwOiB2aWV3Q2xlYW51cEZ1blxuICogICB9XG4gKlxuICogQXJndW1lbnRzIGFyZTpcbiAqXG4gKiBsb2NhbERvYzogc3RyaW5nXG4gKiAgIFRoaXMgaXMgZm9yIHRoZSBsb2NhbCBkb2MgdGhhdCBnZXRzIHNhdmVkIGluIG9yZGVyIHRvIHRyYWNrIHRoZVxuICogICBcImRlcGVuZGVudFwiIERCcyBhbmQgY2xlYW4gdGhlbSB1cCBmb3Igdmlld0NsZWFudXAuIEl0IHNob3VsZCBiZVxuICogICB1bmlxdWUsIHNvIHRoYXQgaW5kZXhlciBwbHVnaW5zIGRvbid0IGNvbGxpZGUgd2l0aCBlYWNoIG90aGVyLlxuICogbWFwcGVyOiBmdW5jdGlvbiAobWFwRnVuRGVmLCBlbWl0KVxuICogICBSZXR1cm5zIGEgbWFwIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBtYXBGdW5EZWYsIHdoaWNoIGluIHRoZSBjYXNlIG9mXG4gKiAgIG5vcm1hbCBtYXAvcmVkdWNlIGlzIGp1c3QgdGhlIGRlLXN0cmluZ2lmaWVkIGZ1bmN0aW9uLCBidXQgbWF5IGJlXG4gKiAgIHNvbWV0aGluZyBlbHNlLCBzdWNoIGFzIGFuIG9iamVjdCBpbiB0aGUgY2FzZSBvZiBwb3VjaGRiLWZpbmQuXG4gKiByZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlRnVuRGVmKVxuICogICBEaXR0bywgYnV0IGZvciByZWR1Y2luZy4gTW9kdWxlcyBkb24ndCBoYXZlIHRvIHN1cHBvcnQgcmVkdWNpbmdcbiAqICAgKGUuZy4gcG91Y2hkYi1maW5kKS5cbiAqIGRkb2NWYWxpZGF0b3I6IGZ1bmN0aW9uIChkZG9jLCB2aWV3TmFtZSlcbiAqICAgVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBkZG9jIG9yIHZpZXdOYW1lIGlzIG5vdCB2YWxpZC5cbiAqICAgVGhpcyBjb3VsZCBiZSBhIHdheSB0byBjb21tdW5pY2F0ZSB0byB0aGUgdXNlciB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGVcbiAqICAgaW5kZXhlciBpcyBpbnZhbGlkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBYnN0cmFjdE1hcFJlZHVjZShsb2NhbERvY05hbWUsIG1hcHBlciwgcmVkdWNlciwgZGRvY1ZhbGlkYXRvcikge1xuXG4gIGZ1bmN0aW9uIHRyeU1hcChkYiwgZnVuLCBkb2MpIHtcbiAgICAvLyBlbWl0IGFuIGV2ZW50IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB0aHJvd24gYnkgYSBtYXAgZnVuY3Rpb24uXG4gICAgLy8gcHV0dGluZyB0cnkvY2F0Y2hlcyBpbiBhIHNpbmdsZSBmdW5jdGlvbiBhbHNvIGF2b2lkcyBkZW9wdGltaXphdGlvbnMuXG4gICAgdHJ5IHtcbiAgICAgIGZ1bihkb2MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVtaXRFcnJvcihkYiwgZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJ5UmVkdWNlKGRiLCBmdW4sIGtleXMsIHZhbHVlcywgcmVyZWR1Y2UpIHtcbiAgICAvLyBzYW1lIGFzIGFib3ZlLCBidXQgcmV0dXJuaW5nIHRoZSByZXN1bHQgb3IgYW4gZXJyb3IuIHRoZXJlIGFyZSB0d28gc2VwYXJhdGVcbiAgICAvLyBmdW5jdGlvbnMgdG8gYXZvaWQgZXh0cmEgbWVtb3J5IGFsbG9jYXRpb25zIHNpbmNlIHRoZSB0cnlDb2RlKCkgY2FzZSBpcyB1c2VkXG4gICAgLy8gZm9yIGN1c3RvbSBtYXAgZnVuY3Rpb25zIChjb21tb24pIHZzIHRoaXMgZnVuY3Rpb24sIHdoaWNoIGlzIG9ubHkgdXNlZCBmb3JcbiAgICAvLyBjdXN0b20gcmVkdWNlIGZ1bmN0aW9ucyAocmFyZSlcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtvdXRwdXQgOiBmdW4oa2V5cywgdmFsdWVzLCByZXJlZHVjZSl9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVtaXRFcnJvcihkYiwgZSk7XG4gICAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzb3J0QnlLZXlUaGVuVmFsdWUoeCwgeSkge1xuICAgIHZhciBrZXlDb21wYXJlID0gY29sbGF0ZSh4LmtleSwgeS5rZXkpO1xuICAgIHJldHVybiBrZXlDb21wYXJlICE9PSAwID8ga2V5Q29tcGFyZSA6IGNvbGxhdGUoeC52YWx1ZSwgeS52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzbGljZVJlc3VsdHMocmVzdWx0cywgbGltaXQsIHNraXApIHtcbiAgICBza2lwID0gc2tpcCB8fCAwO1xuICAgIGlmICh0eXBlb2YgbGltaXQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5zbGljZShza2lwLCBsaW1pdCArIHNraXApO1xuICAgIH0gZWxzZSBpZiAoc2tpcCA+IDApIHtcbiAgICAgIHJldHVybiByZXN1bHRzLnNsaWNlKHNraXApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJvd1RvRG9jSWQocm93KSB7XG4gICAgdmFyIHZhbCA9IHJvdy52YWx1ZTtcbiAgICAvLyBVc2VycyBjYW4gZXhwbGljaXRseSBzcGVjaWZ5IGEgam9pbmVkIGRvYyBfaWQsIG9yIGl0XG4gICAgLy8gZGVmYXVsdHMgdG8gdGhlIGRvYyBfaWQgdGhhdCBlbWl0dGVkIHRoZSBrZXkvdmFsdWUuXG4gICAgdmFyIGRvY0lkID0gKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwuX2lkKSB8fCByb3cuaWQ7XG4gICAgcmV0dXJuIGRvY0lkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIocmVzKSB7XG4gICAgcmVzLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICB2YXIgYXR0cyA9IHJvdy5kb2MgJiYgcm93LmRvYy5fYXR0YWNobWVudHM7XG4gICAgICBpZiAoIWF0dHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmtleXMoYXR0cykuZm9yRWFjaChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICAgICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgICAgICBhdHRzW2ZpbGVuYW1lXS5kYXRhID0gYjY0VG9CbHVmZmVyKGF0dC5kYXRhLCBhdHQuY29udGVudF90eXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcyAmJiBvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuYmluYXJ5KSB7XG4gICAgICAgIHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKHJlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhZGRIdHRwUGFyYW0ocGFyYW1OYW1lLCBvcHRzLCBwYXJhbXMsIGFzSnNvbikge1xuICAgIC8vIGFkZCBhbiBodHRwIHBhcmFtIGZyb20gb3B0cyB0byBwYXJhbXMsIG9wdGlvbmFsbHkganNvbi1lbmNvZGVkXG4gICAgdmFyIHZhbCA9IG9wdHNbcGFyYW1OYW1lXTtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChhc0pzb24pIHtcbiAgICAgICAgdmFsID0gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHZhbCkpO1xuICAgICAgfVxuICAgICAgcGFyYW1zLnB1c2gocGFyYW1OYW1lICsgJz0nICsgdmFsKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb2VyY2VJbnRlZ2VyKGludGVnZXJDYW5kaWRhdGUpIHtcbiAgICBpZiAodHlwZW9mIGludGVnZXJDYW5kaWRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgYXNOdW1iZXIgPSBOdW1iZXIoaW50ZWdlckNhbmRpZGF0ZSk7XG4gICAgICAvLyBwcmV2ZW50cyBlLmcuICcxZm9vJyBvciAnMS4xJyBiZWluZyBjb2VyY2VkIHRvIDFcbiAgICAgIGlmICghaXNOYU4oYXNOdW1iZXIpICYmIGFzTnVtYmVyID09PSBwYXJzZUludChpbnRlZ2VyQ2FuZGlkYXRlLCAxMCkpIHtcbiAgICAgICAgcmV0dXJuIGFzTnVtYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGludGVnZXJDYW5kaWRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29lcmNlT3B0aW9ucyhvcHRzKSB7XG4gICAgb3B0cy5ncm91cF9sZXZlbCA9IGNvZXJjZUludGVnZXIob3B0cy5ncm91cF9sZXZlbCk7XG4gICAgb3B0cy5saW1pdCA9IGNvZXJjZUludGVnZXIob3B0cy5saW1pdCk7XG4gICAgb3B0cy5za2lwID0gY29lcmNlSW50ZWdlcihvcHRzLnNraXApO1xuICAgIHJldHVybiBvcHRzO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tQb3NpdGl2ZUludGVnZXIobnVtYmVyKSB7XG4gICAgaWYgKG51bWJlcikge1xuICAgICAgaWYgKHR5cGVvZiBudW1iZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiAgbmV3IFF1ZXJ5UGFyc2VFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgaW50ZWdlcjogXCInICtcbiAgICAgICAgICBudW1iZXIgKyAnXCInKTtcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlQYXJzZUVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBwb3NpdGl2ZSBpbnRlZ2VyOiAnICtcbiAgICAgICAgICAnXCInICsgbnVtYmVyICsgJ1wiJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tRdWVyeVBhcnNlRXJyb3Iob3B0aW9ucywgZnVuKSB7XG4gICAgdmFyIHN0YXJ0a2V5TmFtZSA9IG9wdGlvbnMuZGVzY2VuZGluZyA/ICdlbmRrZXknIDogJ3N0YXJ0a2V5JztcbiAgICB2YXIgZW5ka2V5TmFtZSA9IG9wdGlvbnMuZGVzY2VuZGluZyA/ICdzdGFydGtleScgOiAnZW5ka2V5JztcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uc1tzdGFydGtleU5hbWVdICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIG9wdGlvbnNbZW5ka2V5TmFtZV0gIT09ICd1bmRlZmluZWQnICYmXG4gICAgICBjb2xsYXRlKG9wdGlvbnNbc3RhcnRrZXlOYW1lXSwgb3B0aW9uc1tlbmRrZXlOYW1lXSkgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUVycm9yKCdObyByb3dzIGNhbiBtYXRjaCB5b3VyIGtleSByYW5nZSwgJyArXG4gICAgICAgICdyZXZlcnNlIHlvdXIgc3RhcnRfa2V5IGFuZCBlbmRfa2V5IG9yIHNldCB7ZGVzY2VuZGluZyA6IHRydWV9Jyk7XG4gICAgfSBlbHNlIGlmIChmdW4ucmVkdWNlICYmIG9wdGlvbnMucmVkdWNlICE9PSBmYWxzZSkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICAgIHRocm93IG5ldyBRdWVyeVBhcnNlRXJyb3IoJ3tpbmNsdWRlX2RvY3M6dHJ1ZX0gaXMgaW52YWxpZCBmb3IgcmVkdWNlJyk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMua2V5cyAmJiBvcHRpb25zLmtleXMubGVuZ3RoID4gMSAmJlxuICAgICAgICAhb3B0aW9ucy5ncm91cCAmJiAhb3B0aW9ucy5ncm91cF9sZXZlbCkge1xuICAgICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUVycm9yKCdNdWx0aS1rZXkgZmV0Y2hlcyBmb3IgcmVkdWNlIHZpZXdzIG11c3QgdXNlICcgK1xuICAgICAgICAgICd7Z3JvdXA6IHRydWV9Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIFsnZ3JvdXBfbGV2ZWwnLCAnbGltaXQnLCAnc2tpcCddLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbk5hbWUpIHtcbiAgICAgIHZhciBlcnJvciA9IGNoZWNrUG9zaXRpdmVJbnRlZ2VyKG9wdGlvbnNbb3B0aW9uTmFtZV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaHR0cFF1ZXJ5KGRiLCBmdW4sIG9wdHMpIHtcbiAgICAvLyBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBQVVQgcmVxdWVzdFxuICAgIHZhciBwYXJhbXMgPSBbXTtcbiAgICB2YXIgYm9keTtcbiAgICB2YXIgbWV0aG9kID0gJ0dFVCc7XG4gICAgdmFyIG9rLCBzdGF0dXM7XG5cbiAgICAvLyBJZiBvcHRzLnJlZHVjZSBleGlzdHMgYW5kIGlzIGRlZmluZWQsIHRoZW4gYWRkIGl0IHRvIHRoZSBsaXN0XG4gICAgLy8gb2YgcGFyYW1ldGVycy5cbiAgICAvLyBJZiByZWR1Y2U9ZmFsc2UgdGhlbiB0aGUgcmVzdWx0cyBhcmUgdGhhdCBvZiBvbmx5IHRoZSBtYXAgZnVuY3Rpb25cbiAgICAvLyBub3QgdGhlIGZpbmFsIHJlc3VsdCBvZiBtYXAgYW5kIHJlZHVjZS5cbiAgICBhZGRIdHRwUGFyYW0oJ3JlZHVjZScsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdpbmNsdWRlX2RvY3MnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnYXR0YWNobWVudHMnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnbGltaXQnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnZGVzY2VuZGluZycsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdncm91cCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdncm91cF9sZXZlbCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdza2lwJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ3N0YWxlJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2NvbmZsaWN0cycsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdzdGFydGtleScsIG9wdHMsIHBhcmFtcywgdHJ1ZSk7XG4gICAgYWRkSHR0cFBhcmFtKCdzdGFydF9rZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgnZW5ka2V5Jywgb3B0cywgcGFyYW1zLCB0cnVlKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2VuZF9rZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgnaW5jbHVzaXZlX2VuZCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdrZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgndXBkYXRlX3NlcScsIG9wdHMsIHBhcmFtcyk7XG5cbiAgICAvLyBGb3JtYXQgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBpbnRvIGEgdmFsaWQgVVJJIHF1ZXJ5IHN0cmluZ1xuICAgIHBhcmFtcyA9IHBhcmFtcy5qb2luKCcmJyk7XG4gICAgcGFyYW1zID0gcGFyYW1zID09PSAnJyA/ICcnIDogJz8nICsgcGFyYW1zO1xuXG4gICAgLy8gSWYga2V5cyBhcmUgc3VwcGxpZWQsIGlzc3VlIGEgUE9TVCB0byBjaXJjdW12ZW50IEdFVCBxdWVyeSBzdHJpbmcgbGltaXRzXG4gICAgLy8gc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY291Y2hkYi9IVFRQX3ZpZXdfQVBJI1F1ZXJ5aW5nX09wdGlvbnNcbiAgICBpZiAodHlwZW9mIG9wdHMua2V5cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBNQVhfVVJMX0xFTkdUSCA9IDIwMDA7XG4gICAgICAvLyBhY2NvcmRpbmcgdG8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDE3MTg0LzY4MDc0MixcbiAgICAgIC8vIHRoZSBkZSBmYWN0byBVUkwgbGVuZ3RoIGxpbWl0IGlzIDIwMDAgY2hhcmFjdGVyc1xuXG4gICAgICB2YXIga2V5c0FzU3RyaW5nID1cbiAgICAgICAgJ2tleXM9JyArIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvcHRzLmtleXMpKTtcbiAgICAgIGlmIChrZXlzQXNTdHJpbmcubGVuZ3RoICsgcGFyYW1zLmxlbmd0aCArIDEgPD0gTUFYX1VSTF9MRU5HVEgpIHtcbiAgICAgICAgLy8gSWYgdGhlIGtleXMgYXJlIHNob3J0IGVub3VnaCwgZG8gYSBHRVQuIHdlIGRvIHRoaXMgdG8gd29yayBhcm91bmRcbiAgICAgICAgLy8gU2FmYXJpIG5vdCB1bmRlcnN0YW5kaW5nIDMwNHMgb24gUE9TVHMgKHNlZSBwb3VjaGRiL3BvdWNoZGIjMTIzOSlcbiAgICAgICAgcGFyYW1zICs9IChwYXJhbXNbMF0gPT09ICc/JyA/ICcmJyA6ICc/JykgKyBrZXlzQXNTdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGJvZHkgPSB7a2V5czogb3B0cy5rZXlzfTtcbiAgICAgICAgfSBlbHNlIHsgLy8gZnVuIGlzIHttYXAgOiBtYXBmdW59LCBzbyBhcHBlbmQgdG8gdGhpc1xuICAgICAgICAgIGZ1bi5rZXlzID0gb3B0cy5rZXlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIHJlZmVyZW5jaW5nIGEgcXVlcnkgZGVmaW5lZCBpbiB0aGUgZGVzaWduIGRvY1xuICAgIGlmICh0eXBlb2YgZnVuID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIHBhcnRzID0gcGFyc2VWaWV3TmFtZShmdW4pO1xuICAgICAgcmV0dXJuIGRiLmZldGNoKCdfZGVzaWduLycgKyBwYXJ0c1swXSArICcvX3ZpZXcvJyArIHBhcnRzWzFdICsgcGFyYW1zLCB7XG4gICAgICAgIGhlYWRlcnM6IG5ldyBoKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSksXG4gICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgb2sgPSByZXNwb25zZS5vaztcbiAgICAgICAgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICByZXN1bHQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICAgIHRocm93IGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmYWlsIHRoZSBlbnRpcmUgcmVxdWVzdCBpZiB0aGUgcmVzdWx0IGNvbnRhaW5zIGFuIGVycm9yXG4gICAgICAgIHJlc3VsdC5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChyb3cudmFsdWUgJiYgcm93LnZhbHVlLmVycm9yICYmIHJvdy52YWx1ZS5lcnJvciA9PT0gXCJidWlsdGluX3JlZHVjZV9lcnJvclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Iocm93LnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLnRoZW4ocG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSk7XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIHVzaW5nIGEgdGVtcG9yYXJ5IHZpZXcsIHRlcnJpYmxlIGZvciBwZXJmb3JtYW5jZSwgZ29vZCBmb3IgdGVzdGluZ1xuICAgIGJvZHkgPSBib2R5IHx8IHt9O1xuICAgIE9iamVjdC5rZXlzKGZ1bikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmdW5ba2V5XSkpIHtcbiAgICAgICAgYm9keVtrZXldID0gZnVuW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5W2tleV0gPSBmdW5ba2V5XS50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRiLmZldGNoKCdfdGVtcF92aWV3JyArIHBhcmFtcywge1xuICAgICAgaGVhZGVyczogbmV3IGgoeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9KSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBvayA9IHJlc3BvbnNlLm9rO1xuICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICByZXN1bHQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aHJvdyBnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLnRoZW4ocG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSk7XG4gIH1cblxuICAvLyBjdXN0b20gYWRhcHRlcnMgY2FuIGRlZmluZSB0aGVpciBvd24gYXBpLl9xdWVyeVxuICAvLyBhbmQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZnVuY3Rpb24gY3VzdG9tUXVlcnkoZGIsIGZ1biwgb3B0cykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBkYi5fcXVlcnkoZnVuLCBvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGN1c3RvbSBhZGFwdGVycyBjYW4gZGVmaW5lIHRoZWlyIG93biBhcGkuX3ZpZXdDbGVhbnVwXG4gIC8vIGFuZCBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmdW5jdGlvbiBjdXN0b21WaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBkYi5fdmlld0NsZWFudXAoZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0c1RvKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocmVhc29uLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gcmV0dXJucyBhIHByb21pc2UgZm9yIGEgbGlzdCBvZiBkb2NzIHRvIHVwZGF0ZSwgYmFzZWQgb24gdGhlIGlucHV0IGRvY0lkLlxuICAvLyB0aGUgb3JkZXIgZG9lc24ndCBtYXR0ZXIsIGJlY2F1c2UgcG9zdC0zLjIuMCwgYnVsa0RvY3NcbiAgLy8gaXMgYW4gYXRvbWljIG9wZXJhdGlvbiBpbiBhbGwgdGhyZWUgYWRhcHRlcnMuXG4gIGZ1bmN0aW9uIGdldERvY3NUb1BlcnNpc3QoZG9jSWQsIHZpZXcsIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKSB7XG4gICAgdmFyIG1ldGFEb2NJZCA9ICdfbG9jYWwvZG9jXycgKyBkb2NJZDtcbiAgICB2YXIgZGVmYXVsdE1ldGFEb2MgPSB7X2lkOiBtZXRhRG9jSWQsIGtleXM6IFtdfTtcbiAgICB2YXIgZG9jRGF0YSA9IGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLmdldChkb2NJZCk7XG4gICAgdmFyIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyA9IGRvY0RhdGFbMF07XG4gICAgdmFyIGNoYW5nZXMgPSBkb2NEYXRhWzFdO1xuXG4gICAgZnVuY3Rpb24gZ2V0TWV0YURvYygpIHtcbiAgICAgIGlmIChpc0dlbk9uZShjaGFuZ2VzKSkge1xuICAgICAgICAvLyBnZW5lcmF0aW9uIDEsIHNvIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGluaXRpYWwgc3RhdGVcbiAgICAgICAgLy8gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKGF2b2lkcyB1bm5lY2Vzc2FyeSBHRVRzKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRlZmF1bHRNZXRhRG9jKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2aWV3LmRiLmdldChtZXRhRG9jSWQpLmNhdGNoKGRlZmF1bHRzVG8oZGVmYXVsdE1ldGFEb2MpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRLZXlWYWx1ZURvY3MobWV0YURvYykge1xuICAgICAgaWYgKCFtZXRhRG9jLmtleXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIG5vIGtleXMsIG5vIG5lZWQgZm9yIGEgbG9va3VwXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe3Jvd3M6IFtdfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmlldy5kYi5hbGxEb2NzKHtcbiAgICAgICAga2V5czogbWV0YURvYy5rZXlzLFxuICAgICAgICBpbmNsdWRlX2RvY3M6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NLZXlWYWx1ZURvY3MobWV0YURvYywga3ZEb2NzUmVzKSB7XG4gICAgICB2YXIga3ZEb2NzID0gW107XG4gICAgICB2YXIgb2xkS2V5cyA9IG5ldyBFeHBvcnRlZFNldCgpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0ga3ZEb2NzUmVzLnJvd3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHJvdyA9IGt2RG9jc1Jlcy5yb3dzW2ldO1xuICAgICAgICB2YXIgZG9jID0gcm93LmRvYztcbiAgICAgICAgaWYgKCFkb2MpIHsgLy8gZGVsZXRlZFxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGt2RG9jcy5wdXNoKGRvYyk7XG4gICAgICAgIG9sZEtleXMuYWRkKGRvYy5faWQpO1xuICAgICAgICBkb2MuX2RlbGV0ZWQgPSAhaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLmhhcyhkb2MuX2lkKTtcbiAgICAgICAgaWYgKCFkb2MuX2RlbGV0ZWQpIHtcbiAgICAgICAgICB2YXIga2V5VmFsdWUgPSBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMuZ2V0KGRvYy5faWQpO1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIGtleVZhbHVlKSB7XG4gICAgICAgICAgICBkb2MudmFsdWUgPSBrZXlWYWx1ZS52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBuZXdLZXlzID0gbWFwVG9LZXlzQXJyYXkoaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzKTtcbiAgICAgIG5ld0tleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghb2xkS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIC8vIG5ldyBkb2NcbiAgICAgICAgICB2YXIga3ZEb2MgPSB7XG4gICAgICAgICAgICBfaWQ6IGtleVxuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIGtleVZhbHVlID0gaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLmdldChrZXkpO1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIGtleVZhbHVlKSB7XG4gICAgICAgICAgICBrdkRvYy52YWx1ZSA9IGtleVZhbHVlLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrdkRvY3MucHVzaChrdkRvYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbWV0YURvYy5rZXlzID0gdW5pcShuZXdLZXlzLmNvbmNhdChtZXRhRG9jLmtleXMpKTtcbiAgICAgIGt2RG9jcy5wdXNoKG1ldGFEb2MpO1xuXG4gICAgICByZXR1cm4ga3ZEb2NzO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRNZXRhRG9jKCkudGhlbihmdW5jdGlvbiAobWV0YURvYykge1xuICAgICAgcmV0dXJuIGdldEtleVZhbHVlRG9jcyhtZXRhRG9jKS50aGVuKGZ1bmN0aW9uIChrdkRvY3NSZXMpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NLZXlWYWx1ZURvY3MobWV0YURvYywga3ZEb2NzUmVzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdXBkYXRlcyBhbGwgZW1pdHRlZCBrZXkvdmFsdWUgZG9jcyBhbmQgbWV0YURvY3MgaW4gdGhlIG1ydmlldyBkYXRhYmFzZVxuICAvLyBmb3IgdGhlIGdpdmVuIGJhdGNoIG9mIGRvY3VtZW50cyBmcm9tIHRoZSBzb3VyY2UgZGF0YWJhc2VcbiAgZnVuY3Rpb24gc2F2ZUtleVZhbHVlcyh2aWV3LCBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cywgc2VxKSB7XG4gICAgdmFyIHNlcURvY0lkID0gJ19sb2NhbC9sYXN0U2VxJztcbiAgICByZXR1cm4gdmlldy5kYi5nZXQoc2VxRG9jSWQpXG4gICAgICAuY2F0Y2goZGVmYXVsdHNUbyh7X2lkOiBzZXFEb2NJZCwgc2VxOiAwfSkpXG4gICAgICAudGhlbihmdW5jdGlvbiAobGFzdFNlcURvYykge1xuICAgICAgICB2YXIgZG9jSWRzID0gbWFwVG9LZXlzQXJyYXkoZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZG9jSWRzLm1hcChmdW5jdGlvbiAoZG9jSWQpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RG9jc1RvUGVyc2lzdChkb2NJZCwgdmlldywgZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMpO1xuICAgICAgICB9KSkudGhlbihmdW5jdGlvbiAobGlzdE9mRG9jc1RvUGVyc2lzdCkge1xuICAgICAgICAgIHZhciBkb2NzVG9QZXJzaXN0ID0gZmxhdHRlbihsaXN0T2ZEb2NzVG9QZXJzaXN0KTtcbiAgICAgICAgICBsYXN0U2VxRG9jLnNlcSA9IHNlcTtcbiAgICAgICAgICBkb2NzVG9QZXJzaXN0LnB1c2gobGFzdFNlcURvYyk7XG4gICAgICAgICAgLy8gd3JpdGUgYWxsIGRvY3MgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLCB1cGRhdGUgdGhlIHNlcSBvbmNlXG4gICAgICAgICAgcmV0dXJuIHZpZXcuZGIuYnVsa0RvY3Moe2RvY3MgOiBkb2NzVG9QZXJzaXN0fSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRRdWV1ZSh2aWV3KSB7XG4gICAgdmFyIHZpZXdOYW1lID0gdHlwZW9mIHZpZXcgPT09ICdzdHJpbmcnID8gdmlldyA6IHZpZXcubmFtZTtcbiAgICB2YXIgcXVldWUgPSBwZXJzaXN0ZW50UXVldWVzW3ZpZXdOYW1lXTtcbiAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICBxdWV1ZSA9IHBlcnNpc3RlbnRRdWV1ZXNbdmlld05hbWVdID0gbmV3IFRhc2tRdWV1ZSQxKCk7XG4gICAgfVxuICAgIHJldHVybiBxdWV1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXcodmlldywgb3B0cykge1xuICAgIHJldHVybiBzZXF1ZW50aWFsaXplKGdldFF1ZXVlKHZpZXcpLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdXBkYXRlVmlld0luUXVldWUodmlldywgb3B0cyk7XG4gICAgfSkoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXdJblF1ZXVlKHZpZXcsIG9wdHMpIHtcbiAgICAvLyBiaW5kIHRoZSBlbWl0IGZ1bmN0aW9uIG9uY2VcbiAgICB2YXIgbWFwUmVzdWx0cztcbiAgICB2YXIgZG9jO1xuXG4gICAgZnVuY3Rpb24gZW1pdChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb3V0cHV0ID0ge2lkOiBkb2MuX2lkLCBrZXk6IG5vcm1hbGl6ZUtleShrZXkpfTtcbiAgICAgIC8vIERvbid0IGV4cGxpY2l0bHkgc3RvcmUgdGhlIHZhbHVlIHVubGVzcyBpdCdzIGRlZmluZWQgYW5kIG5vbi1udWxsLlxuICAgICAgLy8gVGhpcyBzYXZlcyBvbiBzdG9yYWdlIHNwYWNlLCBiZWNhdXNlIG9mdGVuIHBlb3BsZSBkb24ndCB1c2UgaXQuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXQudmFsdWUgPSBub3JtYWxpemVLZXkodmFsdWUpO1xuICAgICAgfVxuICAgICAgbWFwUmVzdWx0cy5wdXNoKG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIG1hcEZ1biA9IG1hcHBlcih2aWV3Lm1hcEZ1biwgZW1pdCk7XG5cbiAgICB2YXIgY3VycmVudFNlcSA9IHZpZXcuc2VxIHx8IDA7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQ2hhbmdlKGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLCBzZXEpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzYXZlS2V5VmFsdWVzKHZpZXcsIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLCBzZXEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgaW5kZXhlZF9kb2NzID0gMDtcbiAgICBsZXQgcHJvZ3Jlc3MgPSB7XG4gICAgICB2aWV3OiB2aWV3Lm5hbWUsXG4gICAgICBpbmRleGVkX2RvY3M6IGluZGV4ZWRfZG9jc1xuICAgIH07XG4gICAgdmlldy5zb3VyY2VEQi5lbWl0KCdpbmRleGluZycsIHByb2dyZXNzKTtcblxuICAgIHZhciBxdWV1ZSA9IG5ldyBUYXNrUXVldWUkMSgpO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc05leHRCYXRjaCgpIHtcbiAgICAgIHJldHVybiB2aWV3LnNvdXJjZURCLmNoYW5nZXMoe1xuICAgICAgICByZXR1cm5fZG9jczogdHJ1ZSxcbiAgICAgICAgY29uZmxpY3RzOiB0cnVlLFxuICAgICAgICBpbmNsdWRlX2RvY3M6IHRydWUsXG4gICAgICAgIHN0eWxlOiAnYWxsX2RvY3MnLFxuICAgICAgICBzaW5jZTogY3VycmVudFNlcSxcbiAgICAgICAgbGltaXQ6IG9wdHMuY2hhbmdlc19iYXRjaF9zaXplXG4gICAgICB9KS50aGVuKHByb2Nlc3NCYXRjaCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoKHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IHJlc3BvbnNlLnJlc3VsdHM7XG4gICAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyA9IGNyZWF0ZURvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKHJlc3VsdHMpO1xuICAgICAgcXVldWUuYWRkKHByb2Nlc3NDaGFuZ2UoZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMsIGN1cnJlbnRTZXEpKTtcblxuICAgICAgaW5kZXhlZF9kb2NzID0gaW5kZXhlZF9kb2NzICsgcmVzdWx0cy5sZW5ndGg7XG4gICAgICBsZXQgcHJvZ3Jlc3MgPSB7XG4gICAgICAgIHZpZXc6IHZpZXcubmFtZSxcbiAgICAgICAgbGFzdF9zZXE6IHJlc3BvbnNlLmxhc3Rfc2VxLFxuICAgICAgICByZXN1bHRzX2NvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgICAgaW5kZXhlZF9kb2NzOiBpbmRleGVkX2RvY3NcbiAgICAgIH07XG4gICAgICB2aWV3LnNvdXJjZURCLmVtaXQoJ2luZGV4aW5nJywgcHJvZ3Jlc3MpO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPCBvcHRzLmNoYW5nZXNfYmF0Y2hfc2l6ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvY2Vzc05leHRCYXRjaCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKHJlc3VsdHMpIHtcbiAgICAgIHZhciBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IHJlc3VsdHNbaV07XG4gICAgICAgIGlmIChjaGFuZ2UuZG9jLl9pZFswXSAhPT0gJ18nKSB7XG4gICAgICAgICAgbWFwUmVzdWx0cyA9IFtdO1xuICAgICAgICAgIGRvYyA9IGNoYW5nZS5kb2M7XG5cbiAgICAgICAgICBpZiAoIWRvYy5fZGVsZXRlZCkge1xuICAgICAgICAgICAgdHJ5TWFwKHZpZXcuc291cmNlREIsIG1hcEZ1biwgZG9jKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwUmVzdWx0cy5zb3J0KHNvcnRCeUtleVRoZW5WYWx1ZSk7XG5cbiAgICAgICAgICB2YXIgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzID0gY3JlYXRlSW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzKG1hcFJlc3VsdHMpO1xuICAgICAgICAgIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLnNldChjaGFuZ2UuZG9jLl9pZCwgW1xuICAgICAgICAgICAgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLFxuICAgICAgICAgICAgY2hhbmdlLmNoYW5nZXNcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50U2VxID0gY2hhbmdlLnNlcTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMobWFwUmVzdWx0cykge1xuICAgICAgdmFyIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICAgICAgdmFyIGxhc3RLZXk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbWFwUmVzdWx0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgZW1pdHRlZEtleVZhbHVlID0gbWFwUmVzdWx0c1tpXTtcbiAgICAgICAgdmFyIGNvbXBsZXhLZXkgPSBbZW1pdHRlZEtleVZhbHVlLmtleSwgZW1pdHRlZEtleVZhbHVlLmlkXTtcbiAgICAgICAgaWYgKGkgPiAwICYmIGNvbGxhdGUoZW1pdHRlZEtleVZhbHVlLmtleSwgbGFzdEtleSkgPT09IDApIHtcbiAgICAgICAgICBjb21wbGV4S2V5LnB1c2goaSk7IC8vIGR1cCBrZXkraWQsIHNvIG1ha2UgaXQgdW5pcXVlXG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLnNldCh0b0luZGV4YWJsZVN0cmluZyhjb21wbGV4S2V5KSwgZW1pdHRlZEtleVZhbHVlKTtcbiAgICAgICAgbGFzdEtleSA9IGVtaXR0ZWRLZXlWYWx1ZS5rZXk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzTmV4dEJhdGNoKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcXVldWUuZmluaXNoKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2aWV3LnNlcSA9IGN1cnJlbnRTZXE7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWR1Y2VWaWV3KHZpZXcsIHJlc3VsdHMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5ncm91cF9sZXZlbCA9PT0gMCkge1xuICAgICAgZGVsZXRlIG9wdGlvbnMuZ3JvdXBfbGV2ZWw7XG4gICAgfVxuXG4gICAgdmFyIHNob3VsZEdyb3VwID0gb3B0aW9ucy5ncm91cCB8fCBvcHRpb25zLmdyb3VwX2xldmVsO1xuXG4gICAgdmFyIHJlZHVjZUZ1biA9IHJlZHVjZXIodmlldy5yZWR1Y2VGdW4pO1xuXG4gICAgdmFyIGdyb3VwcyA9IFtdO1xuICAgIHZhciBsdmwgPSBpc05hTihvcHRpb25zLmdyb3VwX2xldmVsKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6XG4gICAgICBvcHRpb25zLmdyb3VwX2xldmVsO1xuICAgIHJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGxhc3QgPSBncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIGdyb3VwS2V5ID0gc2hvdWxkR3JvdXAgPyBlLmtleSA6IG51bGw7XG5cbiAgICAgIC8vIG9ubHkgc2V0IGdyb3VwX2xldmVsIGZvciBhcnJheSBrZXlzXG4gICAgICBpZiAoc2hvdWxkR3JvdXAgJiYgQXJyYXkuaXNBcnJheShncm91cEtleSkpIHtcbiAgICAgICAgZ3JvdXBLZXkgPSBncm91cEtleS5zbGljZSgwLCBsdmwpO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdCAmJiBjb2xsYXRlKGxhc3QuZ3JvdXBLZXksIGdyb3VwS2V5KSA9PT0gMCkge1xuICAgICAgICBsYXN0LmtleXMucHVzaChbZS5rZXksIGUuaWRdKTtcbiAgICAgICAgbGFzdC52YWx1ZXMucHVzaChlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZ3JvdXBzLnB1c2goe1xuICAgICAgICBrZXlzOiBbW2Uua2V5LCBlLmlkXV0sXG4gICAgICAgIHZhbHVlczogW2UudmFsdWVdLFxuICAgICAgICBncm91cEtleTogZ3JvdXBLZXlcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlc3VsdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgZSA9IGdyb3Vwc1tpXTtcbiAgICAgIHZhciByZWR1Y2VUcnkgPSB0cnlSZWR1Y2Uodmlldy5zb3VyY2VEQiwgcmVkdWNlRnVuLCBlLmtleXMsIGUudmFsdWVzLCBmYWxzZSk7XG4gICAgICBpZiAocmVkdWNlVHJ5LmVycm9yICYmIHJlZHVjZVRyeS5lcnJvciBpbnN0YW5jZW9mIEJ1aWx0SW5FcnJvcikge1xuICAgICAgICAvLyBDb3VjaERCIHJldHVybnMgYW4gZXJyb3IgaWYgYSBidWlsdC1pbiBlcnJvcnMgb3V0XG4gICAgICAgIHRocm93IHJlZHVjZVRyeS5lcnJvcjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIC8vIENvdWNoREIganVzdCBzZXRzIHRoZSB2YWx1ZSB0byBudWxsIGlmIGEgbm9uLWJ1aWx0LWluIGVycm9ycyBvdXRcbiAgICAgICAgdmFsdWU6IHJlZHVjZVRyeS5lcnJvciA/IG51bGwgOiByZWR1Y2VUcnkub3V0cHV0LFxuICAgICAgICBrZXk6IGUuZ3JvdXBLZXlcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBubyB0b3RhbF9yb3dzL29mZnNldCB3aGVuIHJlZHVjaW5nXG4gICAgcmV0dXJuIHtyb3dzOiBzbGljZVJlc3VsdHMocmVzdWx0cywgb3B0aW9ucy5saW1pdCwgb3B0aW9ucy5za2lwKX07XG4gIH1cblxuICBmdW5jdGlvbiBxdWVyeVZpZXcodmlldywgb3B0cykge1xuICAgIHJldHVybiBzZXF1ZW50aWFsaXplKGdldFF1ZXVlKHZpZXcpLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcXVlcnlWaWV3SW5RdWV1ZSh2aWV3LCBvcHRzKTtcbiAgICB9KSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcXVlcnlWaWV3SW5RdWV1ZSh2aWV3LCBvcHRzKSB7XG4gICAgdmFyIHRvdGFsUm93cztcbiAgICB2YXIgc2hvdWxkUmVkdWNlID0gdmlldy5yZWR1Y2VGdW4gJiYgb3B0cy5yZWR1Y2UgIT09IGZhbHNlO1xuICAgIHZhciBza2lwID0gb3B0cy5za2lwIHx8IDA7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmtleXMgIT09ICd1bmRlZmluZWQnICYmICFvcHRzLmtleXMubGVuZ3RoKSB7XG4gICAgICAvLyBlcXVpdmFsZW50IHF1ZXJ5XG4gICAgICBvcHRzLmxpbWl0ID0gMDtcbiAgICAgIGRlbGV0ZSBvcHRzLmtleXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmV0Y2hGcm9tVmlldyh2aWV3T3B0cykge1xuICAgICAgdmlld09wdHMuaW5jbHVkZV9kb2NzID0gdHJ1ZTtcbiAgICAgIHJldHVybiB2aWV3LmRiLmFsbERvY3Modmlld09wdHMpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB0b3RhbFJvd3MgPSByZXMudG90YWxfcm93cztcbiAgICAgICAgcmV0dXJuIHJlcy5yb3dzLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7XG5cbiAgICAgICAgICAvLyBpbXBsaWNpdCBtaWdyYXRpb24gLSBpbiBvbGRlciB2ZXJzaW9ucyBvZiBQb3VjaERCLFxuICAgICAgICAgIC8vIHdlIGV4cGxpY2l0bHkgc3RvcmVkIHRoZSBkb2MgYXMge2lkOiAuLi4sIGtleTogLi4uLCB2YWx1ZTogLi4ufVxuICAgICAgICAgIC8vIHRoaXMgaXMgdGVzdGVkIGluIGEgbWlncmF0aW9uIHRlc3RcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIHJlc3VsdC5kb2MgJiYgdHlwZW9mIHJlc3VsdC5kb2MudmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICByZXN1bHQuZG9jLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdC5kb2MudmFsdWUpLnNvcnQoKTtcbiAgICAgICAgICAgIC8vIHRoaXMgZGV0ZWN0aW9uIG1ldGhvZCBpcyBub3QgcGVyZmVjdCwgYnV0IGl0J3MgdW5saWtlbHkgdGhlIHVzZXJcbiAgICAgICAgICAgIC8vIGVtaXR0ZWQgYSB2YWx1ZSB3aGljaCB3YXMgYW4gb2JqZWN0IHdpdGggdGhlc2UgMyBleGFjdCBrZXlzXG4gICAgICAgICAgICB2YXIgZXhwZWN0ZWRLZXlzID0gWydpZCcsICdrZXknLCAndmFsdWUnXTtcbiAgICAgICAgICAgIGlmICghKGtleXMgPCBleHBlY3RlZEtleXMgfHwga2V5cyA+IGV4cGVjdGVkS2V5cykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb2MudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHBhcnNlZEtleUFuZERvY0lkID0gcGFyc2VJbmRleGFibGVTdHJpbmcocmVzdWx0LmRvYy5faWQpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IHBhcnNlZEtleUFuZERvY0lkWzBdLFxuICAgICAgICAgICAgaWQ6IHBhcnNlZEtleUFuZERvY0lkWzFdLFxuICAgICAgICAgICAgdmFsdWU6ICgndmFsdWUnIGluIHJlc3VsdC5kb2MgPyByZXN1bHQuZG9jLnZhbHVlIDogbnVsbClcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTWFwUmVzdWx0c1JlYWR5KHJvd3MpIHtcbiAgICAgIHZhciBmaW5hbFJlc3VsdHM7XG4gICAgICBpZiAoc2hvdWxkUmVkdWNlKSB7XG4gICAgICAgIGZpbmFsUmVzdWx0cyA9IHJlZHVjZVZpZXcodmlldywgcm93cywgb3B0cyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRzLmtleXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZpbmFsUmVzdWx0cyA9IHtcbiAgICAgICAgICB0b3RhbF9yb3dzOiB0b3RhbFJvd3MsXG4gICAgICAgICAgb2Zmc2V0OiBza2lwLFxuICAgICAgICAgIHJvd3M6IHJvd3NcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN1cHBvcnQgbGltaXQsIHNraXAgZm9yIGtleXMgcXVlcnlcbiAgICAgICAgZmluYWxSZXN1bHRzID0ge1xuICAgICAgICAgIHRvdGFsX3Jvd3M6IHRvdGFsUm93cyxcbiAgICAgICAgICBvZmZzZXQ6IHNraXAsXG4gICAgICAgICAgcm93czogc2xpY2VSZXN1bHRzKHJvd3Msb3B0cy5saW1pdCxvcHRzLnNraXApXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChvcHRzLnVwZGF0ZV9zZXEpIHtcbiAgICAgICAgZmluYWxSZXN1bHRzLnVwZGF0ZV9zZXEgPSB2aWV3LnNlcTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgICB2YXIgZG9jSWRzID0gdW5pcShyb3dzLm1hcChyb3dUb0RvY0lkKSk7XG5cbiAgICAgICAgcmV0dXJuIHZpZXcuc291cmNlREIuYWxsRG9jcyh7XG4gICAgICAgICAga2V5czogZG9jSWRzLFxuICAgICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZSxcbiAgICAgICAgICBjb25mbGljdHM6IG9wdHMuY29uZmxpY3RzLFxuICAgICAgICAgIGF0dGFjaG1lbnRzOiBvcHRzLmF0dGFjaG1lbnRzLFxuICAgICAgICAgIGJpbmFyeTogb3B0cy5iaW5hcnlcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYWxsRG9jc1Jlcykge1xuICAgICAgICAgIHZhciBkb2NJZHNUb0RvY3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgICAgICAgICBhbGxEb2NzUmVzLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICBkb2NJZHNUb0RvY3Muc2V0KHJvdy5pZCwgcm93LmRvYyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHZhciBkb2NJZCA9IHJvd1RvRG9jSWQocm93KTtcbiAgICAgICAgICAgIHZhciBkb2MgPSBkb2NJZHNUb0RvY3MuZ2V0KGRvY0lkKTtcbiAgICAgICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICAgICAgcm93LmRvYyA9IGRvYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZmluYWxSZXN1bHRzO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmaW5hbFJlc3VsdHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmtleXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIga2V5cyA9IG9wdHMua2V5cztcbiAgICAgIHZhciBmZXRjaFByb21pc2VzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmlld09wdHMgPSB7XG4gICAgICAgICAgc3RhcnRrZXkgOiB0b0luZGV4YWJsZVN0cmluZyhba2V5XSksXG4gICAgICAgICAgZW5ka2V5ICAgOiB0b0luZGV4YWJsZVN0cmluZyhba2V5LCB7fV0pXG4gICAgICAgIH07XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICAgICAgdmlld09wdHMudXBkYXRlX3NlcSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZldGNoRnJvbVZpZXcodmlld09wdHMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZmV0Y2hQcm9taXNlcykudGhlbihmbGF0dGVuKS50aGVuKG9uTWFwUmVzdWx0c1JlYWR5KTtcbiAgICB9IGVsc2UgeyAvLyBub3JtYWwgcXVlcnksIG5vICdrZXlzJ1xuICAgICAgdmFyIHZpZXdPcHRzID0ge1xuICAgICAgICBkZXNjZW5kaW5nIDogb3B0cy5kZXNjZW5kaW5nXG4gICAgICB9O1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICAgIHZpZXdPcHRzLnVwZGF0ZV9zZXEgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHN0YXJ0a2V5O1xuICAgICAgdmFyIGVuZGtleTtcbiAgICAgIGlmICgnc3RhcnRfa2V5JyBpbiBvcHRzKSB7XG4gICAgICAgIHN0YXJ0a2V5ID0gb3B0cy5zdGFydF9rZXk7XG4gICAgICB9XG4gICAgICBpZiAoJ3N0YXJ0a2V5JyBpbiBvcHRzKSB7XG4gICAgICAgIHN0YXJ0a2V5ID0gb3B0cy5zdGFydGtleTtcbiAgICAgIH1cbiAgICAgIGlmICgnZW5kX2tleScgaW4gb3B0cykge1xuICAgICAgICBlbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gICAgICB9XG4gICAgICBpZiAoJ2VuZGtleScgaW4gb3B0cykge1xuICAgICAgICBlbmRrZXkgPSBvcHRzLmVuZGtleTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3RhcnRrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0gb3B0cy5kZXNjZW5kaW5nID9cbiAgICAgICAgICB0b0luZGV4YWJsZVN0cmluZyhbc3RhcnRrZXksIHt9XSkgOlxuICAgICAgICAgIHRvSW5kZXhhYmxlU3RyaW5nKFtzdGFydGtleV0pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBlbmRrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBpbmNsdXNpdmVFbmQgPSBvcHRzLmluY2x1c2l2ZV9lbmQgIT09IGZhbHNlO1xuICAgICAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICAgICAgaW5jbHVzaXZlRW5kID0gIWluY2x1c2l2ZUVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpZXdPcHRzLmVuZGtleSA9IHRvSW5kZXhhYmxlU3RyaW5nKFxuICAgICAgICAgIGluY2x1c2l2ZUVuZCA/IFtlbmRrZXksIHt9XSA6IFtlbmRrZXldKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5rZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBrZXlTdGFydCA9IHRvSW5kZXhhYmxlU3RyaW5nKFtvcHRzLmtleV0pO1xuICAgICAgICB2YXIga2V5RW5kID0gdG9JbmRleGFibGVTdHJpbmcoW29wdHMua2V5LCB7fV0pO1xuICAgICAgICBpZiAodmlld09wdHMuZGVzY2VuZGluZykge1xuICAgICAgICAgIHZpZXdPcHRzLmVuZGtleSA9IGtleVN0YXJ0O1xuICAgICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0ga2V5RW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0ga2V5U3RhcnQ7XG4gICAgICAgICAgdmlld09wdHMuZW5ka2V5ID0ga2V5RW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNob3VsZFJlZHVjZSkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubGltaXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdmlld09wdHMubGltaXQgPSBvcHRzLmxpbWl0O1xuICAgICAgICB9XG4gICAgICAgIHZpZXdPcHRzLnNraXAgPSBza2lwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZldGNoRnJvbVZpZXcodmlld09wdHMpLnRoZW4ob25NYXBSZXN1bHRzUmVhZHkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGh0dHBWaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBkYi5mZXRjaCgnX3ZpZXdfY2xlYW51cCcsIHtcbiAgICAgIGhlYWRlcnM6IG5ldyBoKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSksXG4gICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9jYWxWaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBkYi5nZXQoJ19sb2NhbC8nICsgbG9jYWxEb2NOYW1lKS50aGVuKGZ1bmN0aW9uIChtZXRhRG9jKSB7XG4gICAgICB2YXIgZG9jc1RvVmlld3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgICAgIE9iamVjdC5rZXlzKG1ldGFEb2Mudmlld3MpLmZvckVhY2goZnVuY3Rpb24gKGZ1bGxWaWV3TmFtZSkge1xuICAgICAgICB2YXIgcGFydHMgPSBwYXJzZVZpZXdOYW1lKGZ1bGxWaWV3TmFtZSk7XG4gICAgICAgIHZhciBkZXNpZ25Eb2NOYW1lID0gJ19kZXNpZ24vJyArIHBhcnRzWzBdO1xuICAgICAgICB2YXIgdmlld05hbWUgPSBwYXJ0c1sxXTtcbiAgICAgICAgdmFyIHZpZXdzID0gZG9jc1RvVmlld3MuZ2V0KGRlc2lnbkRvY05hbWUpO1xuICAgICAgICBpZiAoIXZpZXdzKSB7XG4gICAgICAgICAgdmlld3MgPSBuZXcgRXhwb3J0ZWRTZXQoKTtcbiAgICAgICAgICBkb2NzVG9WaWV3cy5zZXQoZGVzaWduRG9jTmFtZSwgdmlld3MpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXdzLmFkZCh2aWV3TmFtZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICBrZXlzIDogbWFwVG9LZXlzQXJyYXkoZG9jc1RvVmlld3MpLFxuICAgICAgICBpbmNsdWRlX2RvY3MgOiB0cnVlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGRiLmFsbERvY3Mob3B0cykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHZhciB2aWV3c1RvU3RhdHVzID0ge307XG4gICAgICAgIHJlcy5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHZhciBkZG9jTmFtZSA9IHJvdy5rZXkuc3Vic3RyaW5nKDgpOyAvLyBjdXRzIG9mZiAnX2Rlc2lnbi8nXG4gICAgICAgICAgZG9jc1RvVmlld3MuZ2V0KHJvdy5rZXkpLmZvckVhY2goZnVuY3Rpb24gKHZpZXdOYW1lKSB7XG4gICAgICAgICAgICB2YXIgZnVsbFZpZXdOYW1lID0gZGRvY05hbWUgKyAnLycgKyB2aWV3TmFtZTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgaWYgKCFtZXRhRG9jLnZpZXdzW2Z1bGxWaWV3TmFtZV0pIHtcbiAgICAgICAgICAgICAgLy8gbmV3IGZvcm1hdCwgd2l0aG91dCBzbGFzaGVzLCB0byBzdXBwb3J0IFBvdWNoREIgMi4yLjBcbiAgICAgICAgICAgICAgLy8gbWlncmF0aW9uIHRlc3QgaW4gcG91Y2hkYidzIGJyb3dzZXIubWlncmF0aW9uLmpzIHZlcmlmaWVzIHRoaXNcbiAgICAgICAgICAgICAgZnVsbFZpZXdOYW1lID0gdmlld05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmlld0RCTmFtZXMgPSBPYmplY3Qua2V5cyhtZXRhRG9jLnZpZXdzW2Z1bGxWaWV3TmFtZV0pO1xuICAgICAgICAgICAgLy8gZGVzaWduIGRvYyBkZWxldGVkLCBvciB2aWV3IGZ1bmN0aW9uIG5vbmV4aXN0ZW50XG4gICAgICAgICAgICB2YXIgc3RhdHVzSXNHb29kID0gcm93LmRvYyAmJiByb3cuZG9jLnZpZXdzICYmXG4gICAgICAgICAgICAgIHJvdy5kb2Mudmlld3Nbdmlld05hbWVdO1xuICAgICAgICAgICAgdmlld0RCTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAodmlld0RCTmFtZSkge1xuICAgICAgICAgICAgICB2aWV3c1RvU3RhdHVzW3ZpZXdEQk5hbWVdID1cbiAgICAgICAgICAgICAgICB2aWV3c1RvU3RhdHVzW3ZpZXdEQk5hbWVdIHx8IHN0YXR1c0lzR29vZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGRic1RvRGVsZXRlID0gT2JqZWN0LmtleXModmlld3NUb1N0YXR1cykuZmlsdGVyKFxuICAgICAgICAgIGZ1bmN0aW9uICh2aWV3REJOYW1lKSB7IHJldHVybiAhdmlld3NUb1N0YXR1c1t2aWV3REJOYW1lXTsgfSk7XG4gICAgICAgIHZhciBkZXN0cm95UHJvbWlzZXMgPSBkYnNUb0RlbGV0ZS5tYXAoZnVuY3Rpb24gKHZpZXdEQk5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gc2VxdWVudGlhbGl6ZShnZXRRdWV1ZSh2aWV3REJOYW1lKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBkYi5jb25zdHJ1Y3Rvcih2aWV3REJOYW1lLCBkYi5fX29wdHMpLmRlc3Ryb3koKTtcbiAgICAgICAgICB9KSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGRlc3Ryb3lQcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHtvazogdHJ1ZX07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgZGVmYXVsdHNUbyh7b2s6IHRydWV9KSk7XG4gIH1cblxuICBmdW5jdGlvbiBxdWVyeVByb21pc2VkKGRiLCBmdW4sIG9wdHMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZGIuX3F1ZXJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY3VzdG9tUXVlcnkoZGIsIGZ1biwgb3B0cyk7XG4gICAgfVxuICAgIGlmIChpc1JlbW90ZShkYikpIHtcbiAgICAgIHJldHVybiBodHRwUXVlcnkoZGIsIGZ1biwgb3B0cyk7XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZVZpZXdPcHRzID0ge1xuICAgICAgY2hhbmdlc19iYXRjaF9zaXplOiBkYi5fX29wdHMudmlld191cGRhdGVfY2hhbmdlc19iYXRjaF9zaXplIHx8IENIQU5HRVNfQkFUQ0hfU0laRSQxXG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgZnVuICE9PSAnc3RyaW5nJykge1xuICAgICAgLy8gdGVtcF92aWV3XG4gICAgICBjaGVja1F1ZXJ5UGFyc2VFcnJvcihvcHRzLCBmdW4pO1xuXG4gICAgICB0ZW1wVmlld1F1ZXVlLmFkZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjcmVhdGVWaWV3UHJvbWlzZSA9IGNyZWF0ZVZpZXcoXG4gICAgICAgICAgLyogc291cmNlREIgKi8gZGIsXG4gICAgICAgICAgLyogdmlld05hbWUgKi8gJ3RlbXBfdmlldy90ZW1wX3ZpZXcnLFxuICAgICAgICAgIC8qIG1hcEZ1biAqLyBmdW4ubWFwLFxuICAgICAgICAgIC8qIHJlZHVjZUZ1biAqLyBmdW4ucmVkdWNlLFxuICAgICAgICAgIC8qIHRlbXBvcmFyeSAqLyB0cnVlLFxuICAgICAgICAgIC8qIGxvY2FsRG9jTmFtZSAqLyBsb2NhbERvY05hbWUpO1xuICAgICAgICByZXR1cm4gY3JlYXRlVmlld1Byb21pc2UudGhlbihmdW5jdGlvbiAodmlldykge1xuICAgICAgICAgIHJldHVybiBmaW4odXBkYXRlVmlldyh2aWV3LCB1cGRhdGVWaWV3T3B0cykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVlcnlWaWV3KHZpZXcsIG9wdHMpO1xuICAgICAgICAgIH0pLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5kYi5kZXN0cm95KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGVtcFZpZXdRdWV1ZS5maW5pc2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcGVyc2lzdGVudCB2aWV3XG4gICAgICB2YXIgZnVsbFZpZXdOYW1lID0gZnVuO1xuICAgICAgdmFyIHBhcnRzID0gcGFyc2VWaWV3TmFtZShmdWxsVmlld05hbWUpO1xuICAgICAgdmFyIGRlc2lnbkRvY05hbWUgPSBwYXJ0c1swXTtcbiAgICAgIHZhciB2aWV3TmFtZSA9IHBhcnRzWzFdO1xuICAgICAgcmV0dXJuIGRiLmdldCgnX2Rlc2lnbi8nICsgZGVzaWduRG9jTmFtZSkudGhlbihmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgIHZhciBmdW4gPSBkb2Mudmlld3MgJiYgZG9jLnZpZXdzW3ZpZXdOYW1lXTtcblxuICAgICAgICBpZiAoIWZ1bikge1xuICAgICAgICAgIC8vIGJhc2ljIHZhbGlkYXRvcjsgaXQncyBhc3N1bWVkIHRoYXQgZXZlcnkgc3ViY2xhc3Mgd291bGQgd2FudCB0aGlzXG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ2Rkb2MgJyArIGRvYy5faWQgKyAnIGhhcyBubyB2aWV3IG5hbWVkICcgK1xuICAgICAgICAgICAgdmlld05hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGRvY1ZhbGlkYXRvcihkb2MsIHZpZXdOYW1lKTtcbiAgICAgICAgY2hlY2tRdWVyeVBhcnNlRXJyb3Iob3B0cywgZnVuKTtcblxuICAgICAgICB2YXIgY3JlYXRlVmlld1Byb21pc2UgPSBjcmVhdGVWaWV3KFxuICAgICAgICAgIC8qIHNvdXJjZURCICovIGRiLFxuICAgICAgICAgIC8qIHZpZXdOYW1lICovIGZ1bGxWaWV3TmFtZSxcbiAgICAgICAgICAvKiBtYXBGdW4gKi8gZnVuLm1hcCxcbiAgICAgICAgICAvKiByZWR1Y2VGdW4gKi8gZnVuLnJlZHVjZSxcbiAgICAgICAgICAvKiB0ZW1wb3JhcnkgKi8gZmFsc2UsXG4gICAgICAgICAgLyogbG9jYWxEb2NOYW1lICovIGxvY2FsRG9jTmFtZSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVWaWV3UHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgaWYgKG9wdHMuc3RhbGUgPT09ICdvaycgfHwgb3B0cy5zdGFsZSA9PT0gJ3VwZGF0ZV9hZnRlcicpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLnN0YWxlID09PSAndXBkYXRlX2FmdGVyJykge1xuICAgICAgICAgICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVZpZXcodmlldywgdXBkYXRlVmlld09wdHMpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBxdWVyeVZpZXcodmlldywgb3B0cyk7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gc3RhbGUgbm90IG9rXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVmlldyh2aWV3LCB1cGRhdGVWaWV3T3B0cykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBxdWVyeVZpZXcodmlldywgb3B0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWJzdHJhY3RRdWVyeShmdW4sIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRiID0gdGhpcztcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IG9wdHMgPyBjb2VyY2VPcHRpb25zKG9wdHMpIDoge307XG5cbiAgICBpZiAodHlwZW9mIGZ1biA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZnVuID0ge21hcCA6IGZ1bn07XG4gICAgfVxuXG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBxdWVyeVByb21pc2VkKGRiLCBmdW4sIG9wdHMpO1xuICAgIH0pO1xuICAgIHByb21pc2VkQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgdmFyIGFic3RyYWN0Vmlld0NsZWFudXAgPSBjYWxsYmFja2lmeShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRiID0gdGhpcztcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZGIuX3ZpZXdDbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY3VzdG9tVmlld0NsZWFudXAoZGIpO1xuICAgIH1cbiAgICBpZiAoaXNSZW1vdGUoZGIpKSB7XG4gICAgICByZXR1cm4gaHR0cFZpZXdDbGVhbnVwKGRiKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsVmlld0NsZWFudXAoZGIpO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHF1ZXJ5OiBhYnN0cmFjdFF1ZXJ5LFxuICAgIHZpZXdDbGVhbnVwOiBhYnN0cmFjdFZpZXdDbGVhbnVwXG4gIH07XG59XG5cbnZhciBidWlsdEluUmVkdWNlID0ge1xuICBfc3VtOiBmdW5jdGlvbiAoa2V5cywgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHN1bSh2YWx1ZXMpO1xuICB9LFxuXG4gIF9jb3VudDogZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoO1xuICB9LFxuXG4gIF9zdGF0czogZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgIC8vIG5vIG5lZWQgdG8gaW1wbGVtZW50IHJlcmVkdWNlPXRydWUsIGJlY2F1c2UgUG91Y2hcbiAgICAvLyB3aWxsIG5ldmVyIGNhbGwgaXRcbiAgICBmdW5jdGlvbiBzdW1zcXIodmFsdWVzKSB7XG4gICAgICB2YXIgX3N1bXNxciA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBudW0gPSB2YWx1ZXNbaV07XG4gICAgICAgIF9zdW1zcXIgKz0gKG51bSAqIG51bSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3N1bXNxcjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1bSAgICAgOiBzdW0odmFsdWVzKSxcbiAgICAgIG1pbiAgICAgOiBNYXRoLm1pbi5hcHBseShudWxsLCB2YWx1ZXMpLFxuICAgICAgbWF4ICAgICA6IE1hdGgubWF4LmFwcGx5KG51bGwsIHZhbHVlcyksXG4gICAgICBjb3VudCAgIDogdmFsdWVzLmxlbmd0aCxcbiAgICAgIHN1bXNxciA6IHN1bXNxcih2YWx1ZXMpXG4gICAgfTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0QnVpbHRJbihyZWR1Y2VGdW5TdHJpbmcpIHtcbiAgaWYgKC9eX3N1bS8udGVzdChyZWR1Y2VGdW5TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGJ1aWx0SW5SZWR1Y2UuX3N1bTtcbiAgfSBlbHNlIGlmICgvXl9jb3VudC8udGVzdChyZWR1Y2VGdW5TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGJ1aWx0SW5SZWR1Y2UuX2NvdW50O1xuICB9IGVsc2UgaWYgKC9eX3N0YXRzLy50ZXN0KHJlZHVjZUZ1blN0cmluZykpIHtcbiAgICByZXR1cm4gYnVpbHRJblJlZHVjZS5fc3RhdHM7XG4gIH0gZWxzZSBpZiAoL15fLy50ZXN0KHJlZHVjZUZ1blN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVkdWNlRnVuU3RyaW5nICsgJyBpcyBub3QgYSBzdXBwb3J0ZWQgcmVkdWNlIGZ1bmN0aW9uLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcHBlcihtYXBGdW4sIGVtaXQpIHtcbiAgLy8gZm9yIHRlbXBfdmlld3Mgb25lIGNhbiB1c2UgZW1pdChkb2MsIGVtaXQpLCBzZWUgIzM4XG4gIGlmICh0eXBlb2YgbWFwRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgbWFwRnVuLmxlbmd0aCA9PT0gMikge1xuICAgIHZhciBvcmlnTWFwID0gbWFwRnVuO1xuICAgIHJldHVybiBmdW5jdGlvbiAoZG9jKSB7XG4gICAgICByZXR1cm4gb3JpZ01hcChkb2MsIGVtaXQpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV2YWxGdW5jdGlvbldpdGhFdmFsKG1hcEZ1bi50b1N0cmluZygpLCBlbWl0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWR1Y2VyKHJlZHVjZUZ1bikge1xuICB2YXIgcmVkdWNlRnVuU3RyaW5nID0gcmVkdWNlRnVuLnRvU3RyaW5nKCk7XG4gIHZhciBidWlsdEluID0gZ2V0QnVpbHRJbihyZWR1Y2VGdW5TdHJpbmcpO1xuICBpZiAoYnVpbHRJbikge1xuICAgIHJldHVybiBidWlsdEluO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBldmFsRnVuY3Rpb25XaXRoRXZhbChyZWR1Y2VGdW5TdHJpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRkb2NWYWxpZGF0b3IoZGRvYywgdmlld05hbWUpIHtcbiAgdmFyIGZ1biA9IGRkb2Mudmlld3MgJiYgZGRvYy52aWV3c1t2aWV3TmFtZV07XG4gIGlmICh0eXBlb2YgZnVuLm1hcCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignZGRvYyAnICsgZGRvYy5faWQgKyAnIGhhcyBubyBzdHJpbmcgdmlldyBuYW1lZCAnICtcbiAgICAgIHZpZXdOYW1lICsgJywgaW5zdGVhZCBmb3VuZCBvYmplY3Qgb2YgdHlwZTogJyArIHR5cGVvZiBmdW4ubWFwKTtcbiAgfVxufVxuXG52YXIgbG9jYWxEb2NOYW1lID0gJ21ydmlld3MnO1xudmFyIGFic3RyYWN0ID0gY3JlYXRlQWJzdHJhY3RNYXBSZWR1Y2UobG9jYWxEb2NOYW1lLCBtYXBwZXIsIHJlZHVjZXIsIGRkb2NWYWxpZGF0b3IpO1xuXG5mdW5jdGlvbiBxdWVyeShmdW4sIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBhYnN0cmFjdC5xdWVyeS5jYWxsKHRoaXMsIGZ1biwgb3B0cywgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiB2aWV3Q2xlYW51cChjYWxsYmFjaykge1xuICByZXR1cm4gYWJzdHJhY3Qudmlld0NsZWFudXAuY2FsbCh0aGlzLCBjYWxsYmFjayk7XG59XG5cbnZhciBtYXByZWR1Y2UgPSB7XG4gIHF1ZXJ5OiBxdWVyeSxcbiAgdmlld0NsZWFudXA6IHZpZXdDbGVhbnVwXG59O1xuXG5mdW5jdGlvbiBpc0dlbk9uZSQxKHJldikge1xuICByZXR1cm4gL14xLS8udGVzdChyZXYpO1xufVxuXG5mdW5jdGlvbiBmaWxlSGFzQ2hhbmdlZChsb2NhbERvYywgcmVtb3RlRG9jLCBmaWxlbmFtZSkge1xuICByZXR1cm4gIWxvY2FsRG9jLl9hdHRhY2htZW50cyB8fFxuICAgICAgICAgIWxvY2FsRG9jLl9hdHRhY2htZW50c1tmaWxlbmFtZV0gfHxcbiAgICAgICAgIGxvY2FsRG9jLl9hdHRhY2htZW50c1tmaWxlbmFtZV0uZGlnZXN0ICE9PSByZW1vdGVEb2MuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lXS5kaWdlc3Q7XG59XG5cbmZ1bmN0aW9uIGdldERvY0F0dGFjaG1lbnRzKGRiLCBkb2MpIHtcbiAgdmFyIGZpbGVuYW1lcyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpO1xuICByZXR1cm4gUHJvbWlzZS5hbGwoZmlsZW5hbWVzLm1hcChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICByZXR1cm4gZGIuZ2V0QXR0YWNobWVudChkb2MuX2lkLCBmaWxlbmFtZSwge3JldjogZG9jLl9yZXZ9KTtcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBnZXREb2NBdHRhY2htZW50c0Zyb21UYXJnZXRPclNvdXJjZSh0YXJnZXQsIHNyYywgZG9jKSB7XG4gIHZhciBkb0NoZWNrRm9yTG9jYWxBdHRhY2htZW50cyA9IGlzUmVtb3RlKHNyYykgJiYgIWlzUmVtb3RlKHRhcmdldCk7XG4gIHZhciBmaWxlbmFtZXMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKTtcblxuICBpZiAoIWRvQ2hlY2tGb3JMb2NhbEF0dGFjaG1lbnRzKSB7XG4gICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzKHNyYywgZG9jKTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQuZ2V0KGRvYy5faWQpLnRoZW4oZnVuY3Rpb24gKGxvY2FsRG9jKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGZpbGVuYW1lcy5tYXAoZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICBpZiAoZmlsZUhhc0NoYW5nZWQobG9jYWxEb2MsIGRvYywgZmlsZW5hbWUpKSB7XG4gICAgICAgIHJldHVybiBzcmMuZ2V0QXR0YWNobWVudChkb2MuX2lkLCBmaWxlbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXQuZ2V0QXR0YWNobWVudChsb2NhbERvYy5faWQsIGZpbGVuYW1lKTtcbiAgICB9KSk7XG4gIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlcnJvci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzKHNyYywgZG9jKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1bGtHZXRPcHRzKGRpZmZzKSB7XG4gIHZhciByZXF1ZXN0cyA9IFtdO1xuICBPYmplY3Qua2V5cyhkaWZmcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbWlzc2luZ1JldnMgPSBkaWZmc1tpZF0ubWlzc2luZztcbiAgICBtaXNzaW5nUmV2cy5mb3JFYWNoKGZ1bmN0aW9uIChtaXNzaW5nUmV2KSB7XG4gICAgICByZXF1ZXN0cy5wdXNoKHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICByZXY6IG1pc3NpbmdSZXZcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGRvY3M6IHJlcXVlc3RzLFxuICAgIHJldnM6IHRydWUsXG4gICAgbGF0ZXN0OiB0cnVlXG4gIH07XG59XG5cbi8vXG4vLyBGZXRjaCBhbGwgdGhlIGRvY3VtZW50cyBmcm9tIHRoZSBzcmMgYXMgZGVzY3JpYmVkIGluIHRoZSBcImRpZmZzXCIsXG4vLyB3aGljaCBpcyBhIG1hcHBpbmcgb2YgZG9jcyBJRHMgdG8gcmV2aXNpb25zLiBJZiB0aGUgc3RhdGUgZXZlclxuLy8gY2hhbmdlcyB0byBcImNhbmNlbGxlZFwiLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQuXG4vLyBFbHNlIGl0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCBhIGxpc3Qgb2YgZmV0Y2hlZCBkb2N1bWVudHMuXG4vL1xuZnVuY3Rpb24gZ2V0RG9jcyhzcmMsIHRhcmdldCwgZGlmZnMsIHN0YXRlKSB7XG4gIGRpZmZzID0gY2xvbmUoZGlmZnMpOyAvLyB3ZSBkbyBub3QgbmVlZCB0byBtb2RpZnkgdGhpc1xuXG4gIHZhciByZXN1bHREb2NzID0gW10sXG4gICAgICBvayA9IHRydWU7XG5cbiAgZnVuY3Rpb24gZ2V0QWxsRG9jcygpIHtcblxuICAgIHZhciBidWxrR2V0T3B0cyA9IGNyZWF0ZUJ1bGtHZXRPcHRzKGRpZmZzKTtcblxuICAgIGlmICghYnVsa0dldE9wdHMuZG9jcy5sZW5ndGgpIHsgLy8gb3B0aW1pemF0aW9uOiBza2lwIGVtcHR5IHJlcXVlc3RzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNyYy5idWxrR2V0KGJ1bGtHZXRPcHRzKS50aGVuKGZ1bmN0aW9uIChidWxrR2V0UmVzcG9uc2UpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHN0YXRlLmNhbmNlbGxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGJ1bGtHZXRSZXNwb25zZS5yZXN1bHRzLm1hcChmdW5jdGlvbiAoYnVsa0dldEluZm8pIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGJ1bGtHZXRJbmZvLmRvY3MubWFwKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgICB2YXIgcmVtb3RlRG9jID0gZG9jLm9rO1xuXG4gICAgICAgICAgaWYgKGRvYy5lcnJvcikge1xuICAgICAgICAgICAgLy8gd2hlbiBBVVRPX0NPTVBBQ1RJT04gaXMgc2V0LCBkb2NzIGNhbiBiZSByZXR1cm5lZCB3aGljaCBsb29rXG4gICAgICAgICAgICAvLyBsaWtlIHRoaXM6IHtcIm1pc3NpbmdcIjpcIjEtN2MzYWMyNTZiNjkzYzQ2MmFmODQ0MmY5OTJiODM2OTZcIn1cbiAgICAgICAgICAgIG9rID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFyZW1vdGVEb2MgfHwgIXJlbW90ZURvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiByZW1vdGVEb2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzRnJvbVRhcmdldE9yU291cmNlKHRhcmdldCwgc3JjLCByZW1vdGVEb2MpXG4gICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWVzID0gT2JqZWN0LmtleXMocmVtb3RlRG9jLl9hdHRhY2htZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoYXR0YWNobWVudCwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHQgPSByZW1vdGVEb2MuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lc1tpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGF0dC5zdHViO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dC5kYXRhID0gYXR0YWNobWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbW90ZURvYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9KSlcblxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgcmVzdWx0RG9jcyA9IHJlc3VsdERvY3MuY29uY2F0KGZsYXR0ZW4ocmVzdWx0cykuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzQXR0YWNobWVudHMoZG9jKSB7XG4gICAgcmV0dXJuIGRvYy5fYXR0YWNobWVudHMgJiYgT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0NvbmZsaWN0cyhkb2MpIHtcbiAgICByZXR1cm4gZG9jLl9jb25mbGljdHMgJiYgZG9jLl9jb25mbGljdHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoUmV2aXNpb25PbmVEb2NzKGlkcykge1xuICAgIC8vIE9wdGltaXphdGlvbjogZmV0Y2ggZ2VuLTEgZG9jcyBhbmQgYXR0YWNobWVudHMgaW5cbiAgICAvLyBhIHNpbmdsZSByZXF1ZXN0IHVzaW5nIF9hbGxfZG9jc1xuICAgIHJldHVybiBzcmMuYWxsRG9jcyh7XG4gICAgICBrZXlzOiBpZHMsXG4gICAgICBpbmNsdWRlX2RvY3M6IHRydWUsXG4gICAgICBjb25mbGljdHM6IHRydWVcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChzdGF0ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cbiAgICAgIHJlcy5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICBpZiAocm93LmRlbGV0ZWQgfHwgIXJvdy5kb2MgfHwgIWlzR2VuT25lJDEocm93LnZhbHVlLnJldikgfHxcbiAgICAgICAgICAgIGhhc0F0dGFjaG1lbnRzKHJvdy5kb2MpIHx8IGhhc0NvbmZsaWN0cyhyb3cuZG9jKSkge1xuICAgICAgICAgIC8vIGlmIGFueSBvZiB0aGVzZSBjb25kaXRpb25zIGFwcGx5LCB3ZSBuZWVkIHRvIGZldGNoIHVzaW5nIGdldCgpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RyaXAgX2NvbmZsaWN0cyBhcnJheSB0byBhcHBlYXNlIENTRyAoIzU3OTMpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocm93LmRvYy5fY29uZmxpY3RzKSB7XG4gICAgICAgICAgZGVsZXRlIHJvdy5kb2MuX2NvbmZsaWN0cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZSBkb2Mgd2UgZ290IGJhY2sgZnJvbSBhbGxEb2NzKCkgaXMgc3VmZmljaWVudFxuICAgICAgICByZXN1bHREb2NzLnB1c2gocm93LmRvYyk7XG4gICAgICAgIGRlbGV0ZSBkaWZmc1tyb3cuaWRdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZXZpc2lvbk9uZURvY3MoKSB7XG4gICAgLy8gZmlsdGVyIG91dCB0aGUgZ2VuZXJhdGlvbiAxIGRvY3MgYW5kIGdldCB0aGVtXG4gICAgLy8gbGVhdmluZyB0aGUgbm9uLWdlbmVyYXRpb24gb25lIGRvY3MgdG8gYmUgZ290IG90aGVyd2lzZVxuICAgIHZhciBpZHMgPSBPYmplY3Qua2V5cyhkaWZmcykuZmlsdGVyKGZ1bmN0aW9uIChpZCkge1xuICAgICAgdmFyIG1pc3NpbmcgPSBkaWZmc1tpZF0ubWlzc2luZztcbiAgICAgIHJldHVybiBtaXNzaW5nLmxlbmd0aCA9PT0gMSAmJiBpc0dlbk9uZSQxKG1pc3NpbmdbMF0pO1xuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZldGNoUmV2aXNpb25PbmVEb2NzKGlkcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmV0dXJuUmVzdWx0KCkge1xuICAgIHJldHVybiB7IG9rOm9rLCBkb2NzOnJlc3VsdERvY3MgfTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKGdldFJldmlzaW9uT25lRG9jcylcbiAgICAudGhlbihnZXRBbGxEb2NzKVxuICAgIC50aGVuKHJldHVyblJlc3VsdCk7XG59XG5cbnZhciBDSEVDS1BPSU5UX1ZFUlNJT04gPSAxO1xudmFyIFJFUExJQ0FUT1IgPSBcInBvdWNoZGJcIjtcbi8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IG51bWJlciB0byBsaW1pdCB0aGVcbi8vIGFtb3VudCBvZiByZXBsaWNhdGlvbiBoaXN0b3J5IHdlIHNhdmUgaW4gdGhlIGNoZWNrcG9pbnQuXG4vLyBJZiB3ZSBzYXZlIHRvbyBtdWNoLCB0aGUgY2hlY2twb2luZyBkb2NzIHdpbGwgYmVjb21lIHZlcnkgYmlnLFxuLy8gaWYgd2Ugc2F2ZSBmZXdlciwgd2UnbGwgcnVuIGEgZ3JlYXRlciByaXNrIG9mIGhhdmluZyB0b1xuLy8gcmVhZCBhbGwgdGhlIGNoYW5nZXMgZnJvbSAwIHdoZW4gY2hlY2twb2ludCBQVVRzIGZhaWxcbi8vIENvdWNoREIgMi4wIGhhcyBhIG1vcmUgaW52b2x2ZWQgaGlzdG9yeSBwcnVuaW5nLFxuLy8gYnV0IGxldCdzIGdvIGZvciB0aGUgc2ltcGxlIHZlcnNpb24gZm9yIG5vdy5cbnZhciBDSEVDS1BPSU5UX0hJU1RPUllfU0laRSA9IDU7XG52YXIgTE9XRVNUX1NFUSA9IDA7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrcG9pbnQoZGIsIGlkLCBjaGVja3BvaW50LCBzZXNzaW9uLCByZXR1cm5WYWx1ZSkge1xuICByZXR1cm4gZGIuZ2V0KGlkKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgaWYgKGRiLmFkYXB0ZXIgPT09ICdodHRwJyB8fCBkYi5hZGFwdGVyID09PSAnaHR0cHMnKSB7XG4gICAgICAgIGV4cGxhaW5FcnJvcihcbiAgICAgICAgICA0MDQsICdQb3VjaERCIGlzIGp1c3QgY2hlY2tpbmcgaWYgYSByZW1vdGUgY2hlY2twb2ludCBleGlzdHMuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbixcbiAgICAgICAgX2lkOiBpZCxcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICAgIHJlcGxpY2F0b3I6IFJFUExJQ0FUT1IsXG4gICAgICAgIHZlcnNpb246IENIRUNLUE9JTlRfVkVSU0lPTlxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9KS50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGNoZWNrcG9pbnQgaGFzIG5vdCBjaGFuZ2VkLCBkbyBub3QgdXBkYXRlXG4gICAgaWYgKGRvYy5sYXN0X3NlcSA9PT0gY2hlY2twb2ludCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbHRlciBvdXQgY3VycmVudCBlbnRyeSBmb3IgdGhpcyByZXBsaWNhdGlvblxuICAgIGRvYy5oaXN0b3J5ID0gKGRvYy5oaXN0b3J5IHx8IFtdKS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLnNlc3Npb25faWQgIT09IHNlc3Npb247XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdGhlIGxhdGVzdCBjaGVja3BvaW50IHRvIGhpc3RvcnlcbiAgICBkb2MuaGlzdG9yeS51bnNoaWZ0KHtcbiAgICAgIGxhc3Rfc2VxOiBjaGVja3BvaW50LFxuICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvblxuICAgIH0pO1xuXG4gICAgLy8gSnVzdCB0YWtlIHRoZSBsYXN0IHBpZWNlcyBpbiBoaXN0b3J5LCB0b1xuICAgIC8vIGF2b2lkIHJlYWxseSBiaWcgY2hlY2twb2ludCBkb2NzLlxuICAgIC8vIHNlZSBjb21tZW50IG9uIGhpc3Rvcnkgc2l6ZSBhYm92ZVxuICAgIGRvYy5oaXN0b3J5ID0gZG9jLmhpc3Rvcnkuc2xpY2UoMCwgQ0hFQ0tQT0lOVF9ISVNUT1JZX1NJWkUpO1xuXG4gICAgZG9jLnZlcnNpb24gPSBDSEVDS1BPSU5UX1ZFUlNJT047XG4gICAgZG9jLnJlcGxpY2F0b3IgPSBSRVBMSUNBVE9SO1xuXG4gICAgZG9jLnNlc3Npb25faWQgPSBzZXNzaW9uO1xuICAgIGRvYy5sYXN0X3NlcSA9IGNoZWNrcG9pbnQ7XG5cbiAgICByZXR1cm4gZGIucHV0KGRvYykuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAvLyByZXRyeTsgc29tZW9uZSBpcyB0cnlpbmcgdG8gd3JpdGUgYSBjaGVja3BvaW50IHNpbXVsdGFuZW91c2x5XG4gICAgICAgIHJldHVybiB1cGRhdGVDaGVja3BvaW50KGRiLCBpZCwgY2hlY2twb2ludCwgc2Vzc2lvbiwgcmV0dXJuVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gQ2hlY2twb2ludGVyKHNyYywgdGFyZ2V0LCBpZCwgcmV0dXJuVmFsdWUsIG9wdHMpIHtcbiAgdGhpcy5zcmMgPSBzcmM7XG4gIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICB0aGlzLmlkID0gaWQ7XG4gIHRoaXMucmV0dXJuVmFsdWUgPSByZXR1cm5WYWx1ZTtcbiAgdGhpcy5vcHRzID0gb3B0cyB8fCB7fTtcbn1cblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS53cml0ZUNoZWNrcG9pbnQgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJldHVybiB0aGlzLnVwZGF0ZVRhcmdldChjaGVja3BvaW50LCBzZXNzaW9uKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2VsZi51cGRhdGVTb3VyY2UoY2hlY2twb2ludCwgc2Vzc2lvbik7XG4gIH0pO1xufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS51cGRhdGVUYXJnZXQgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICBpZiAodGhpcy5vcHRzLndyaXRlVGFyZ2V0Q2hlY2twb2ludCkge1xuICAgIHJldHVybiB1cGRhdGVDaGVja3BvaW50KHRoaXMudGFyZ2V0LCB0aGlzLmlkLCBjaGVja3BvaW50LFxuICAgICAgc2Vzc2lvbiwgdGhpcy5yZXR1cm5WYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS51cGRhdGVTb3VyY2UgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICBpZiAodGhpcy5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gdXBkYXRlQ2hlY2twb2ludCh0aGlzLnNyYywgdGhpcy5pZCwgY2hlY2twb2ludCxcbiAgICAgIHNlc3Npb24sIHRoaXMucmV0dXJuVmFsdWUpXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoaXNGb3JiaWRkZW5FcnJvcihlcnIpKSB7XG4gICAgICAgICAgc2VsZi5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn07XG5cbnZhciBjb21wYXJpc29ucyA9IHtcbiAgXCJ1bmRlZmluZWRcIjogZnVuY3Rpb24gKHRhcmdldERvYywgc291cmNlRG9jKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcHJldmlvdXMgY29tcGFyaXNvbiBmdW5jdGlvblxuICAgIGlmIChjb2xsYXRlKHRhcmdldERvYy5sYXN0X3NlcSwgc291cmNlRG9jLmxhc3Rfc2VxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNvdXJjZURvYy5sYXN0X3NlcTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgXCIxXCI6IGZ1bmN0aW9uICh0YXJnZXREb2MsIHNvdXJjZURvYykge1xuICAgIC8vIFRoaXMgaXMgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gcG9ydGVkIGZyb20gQ291Y2hEQlxuICAgIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25Mb2dzKHNvdXJjZURvYywgdGFyZ2V0RG9jKS5sYXN0X3NlcTtcbiAgfVxufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS5nZXRDaGVja3BvaW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKHNlbGYub3B0cyAmJiBzZWxmLm9wdHMud3JpdGVTb3VyY2VDaGVja3BvaW50ICYmICFzZWxmLm9wdHMud3JpdGVUYXJnZXRDaGVja3BvaW50KSB7XG4gICAgcmV0dXJuIHNlbGYuc3JjLmdldChzZWxmLmlkKS50aGVuKGZ1bmN0aW9uIChzb3VyY2VEb2MpIHtcbiAgICAgIHJldHVybiBzb3VyY2VEb2MubGFzdF9zZXEgfHwgTE9XRVNUX1NFUTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc2VsZi50YXJnZXQuZ2V0KHNlbGYuaWQpLnRoZW4oZnVuY3Rpb24gKHRhcmdldERvYykge1xuICAgIGlmIChzZWxmLm9wdHMgJiYgc2VsZi5vcHRzLndyaXRlVGFyZ2V0Q2hlY2twb2ludCAmJiAhc2VsZi5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCkge1xuICAgICAgcmV0dXJuIHRhcmdldERvYy5sYXN0X3NlcSB8fCBMT1dFU1RfU0VRO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLnNyYy5nZXQoc2VsZi5pZCkudGhlbihmdW5jdGlvbiAoc291cmNlRG9jKSB7XG4gICAgICAvLyBTaW5jZSB3ZSBjYW4ndCBtaWdyYXRlIGFuIG9sZCB2ZXJzaW9uIGRvYyB0byBhIG5ldyBvbmVcbiAgICAgIC8vIChubyBzZXNzaW9uIGlkKSwgd2UganVzdCBnbyB3aXRoIHRoZSBsb3dlc3Qgc2VxIGluIHRoaXMgY2FzZVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAodGFyZ2V0RG9jLnZlcnNpb24gIT09IHNvdXJjZURvYy52ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmVyc2lvbjtcbiAgICAgIGlmICh0YXJnZXREb2MudmVyc2lvbikge1xuICAgICAgICB2ZXJzaW9uID0gdGFyZ2V0RG9jLnZlcnNpb24udG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb24gPSBcInVuZGVmaW5lZFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAodmVyc2lvbiBpbiBjb21wYXJpc29ucykge1xuICAgICAgICByZXR1cm4gY29tcGFyaXNvbnNbdmVyc2lvbl0odGFyZ2V0RG9jLCBzb3VyY2VEb2MpO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDQgJiYgdGFyZ2V0RG9jLmxhc3Rfc2VxKSB7XG4gICAgICAgIHJldHVybiBzZWxmLnNyYy5wdXQoe1xuICAgICAgICAgIF9pZDogc2VsZi5pZCxcbiAgICAgICAgICBsYXN0X3NlcTogTE9XRVNUX1NFUVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGlmIChpc0ZvcmJpZGRlbkVycm9yKGVycikpIHtcbiAgICAgICAgICAgIHNlbGYub3B0cy53cml0ZVNvdXJjZUNoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXREb2MubGFzdF9zZXE7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgfSk7XG59O1xuLy8gVGhpcyBjaGVja3BvaW50IGNvbXBhcmlzb24gaXMgcG9ydGVkIGZyb20gQ291Y2hEQnMgc291cmNlXG4vLyB0aGV5IGNvbWUgZnJvbSBoZXJlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jb3VjaGRiLWNvdWNoLXJlcGxpY2F0b3IvYmxvYi9tYXN0ZXIvc3JjL2NvdWNoX3JlcGxpY2F0b3IuZXJsI0w4NjMtTDkwNlxuXG5mdW5jdGlvbiBjb21wYXJlUmVwbGljYXRpb25Mb2dzKHNyY0RvYywgdGd0RG9jKSB7XG4gIGlmIChzcmNEb2Muc2Vzc2lvbl9pZCA9PT0gdGd0RG9jLnNlc3Npb25faWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IHNyY0RvYy5sYXN0X3NlcSxcbiAgICAgIGhpc3Rvcnk6IHNyY0RvYy5oaXN0b3J5XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25IaXN0b3J5KHNyY0RvYy5oaXN0b3J5LCB0Z3REb2MuaGlzdG9yeSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVSZXBsaWNhdGlvbkhpc3Rvcnkoc291cmNlSGlzdG9yeSwgdGFyZ2V0SGlzdG9yeSkge1xuICAvLyB0aGUgZXJsYW5nIGxvb3AgdmlhIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBub3Qgc28gZWFzeSB0byByZXBlYXQgaW4gSlNcbiAgLy8gdGhlcmVmb3JlLCBkb2luZyB0aGlzIGFzIHJlY3Vyc2lvblxuICB2YXIgUyA9IHNvdXJjZUhpc3RvcnlbMF07XG4gIHZhciBzb3VyY2VSZXN0ID0gc291cmNlSGlzdG9yeS5zbGljZSgxKTtcbiAgdmFyIFQgPSB0YXJnZXRIaXN0b3J5WzBdO1xuICB2YXIgdGFyZ2V0UmVzdCA9IHRhcmdldEhpc3Rvcnkuc2xpY2UoMSk7XG5cbiAgaWYgKCFTIHx8IHRhcmdldEhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhc3Rfc2VxOiBMT1dFU1RfU0VRLFxuICAgICAgaGlzdG9yeTogW11cbiAgICB9O1xuICB9XG5cbiAgdmFyIHNvdXJjZUlkID0gUy5zZXNzaW9uX2lkO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGhhc1Nlc3Npb25JZChzb3VyY2VJZCwgdGFyZ2V0SGlzdG9yeSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IFMubGFzdF9zZXEsXG4gICAgICBoaXN0b3J5OiBzb3VyY2VIaXN0b3J5XG4gICAgfTtcbiAgfVxuXG4gIHZhciB0YXJnZXRJZCA9IFQuc2Vzc2lvbl9pZDtcbiAgaWYgKGhhc1Nlc3Npb25JZCh0YXJnZXRJZCwgc291cmNlUmVzdCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IFQubGFzdF9zZXEsXG4gICAgICBoaXN0b3J5OiB0YXJnZXRSZXN0XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25IaXN0b3J5KHNvdXJjZVJlc3QsIHRhcmdldFJlc3QpO1xufVxuXG5mdW5jdGlvbiBoYXNTZXNzaW9uSWQoc2Vzc2lvbklkLCBoaXN0b3J5KSB7XG4gIHZhciBwcm9wcyA9IGhpc3RvcnlbMF07XG4gIHZhciByZXN0ID0gaGlzdG9yeS5zbGljZSgxKTtcblxuICBpZiAoIXNlc3Npb25JZCB8fCBoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzZXNzaW9uSWQgPT09IHByb3BzLnNlc3Npb25faWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBoYXNTZXNzaW9uSWQoc2Vzc2lvbklkLCByZXN0KTtcbn1cblxuZnVuY3Rpb24gaXNGb3JiaWRkZW5FcnJvcihlcnIpIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnIuc3RhdHVzID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGVyci5zdGF0dXMgLyAxMDApID09PSA0O1xufVxuXG52YXIgU1RBUlRJTkdfQkFDS19PRkYgPSAwO1xuXG5mdW5jdGlvbiBiYWNrT2ZmKG9wdHMsIHJldHVyblZhbHVlLCBlcnJvciwgY2FsbGJhY2spIHtcbiAgaWYgKG9wdHMucmV0cnkgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuVmFsdWUuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgcmV0dXJuVmFsdWUucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIG9wdHMuYmFja19vZmZfZnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRzLmJhY2tfb2ZmX2Z1bmN0aW9uID0gZGVmYXVsdEJhY2tPZmY7XG4gIH1cbiAgcmV0dXJuVmFsdWUuZW1pdCgncmVxdWVzdEVycm9yJywgZXJyb3IpO1xuICBpZiAocmV0dXJuVmFsdWUuc3RhdGUgPT09ICdhY3RpdmUnIHx8IHJldHVyblZhbHVlLnN0YXRlID09PSAncGVuZGluZycpIHtcbiAgICByZXR1cm5WYWx1ZS5lbWl0KCdwYXVzZWQnLCBlcnJvcik7XG4gICAgcmV0dXJuVmFsdWUuc3RhdGUgPSAnc3RvcHBlZCc7XG4gICAgdmFyIGJhY2tPZmZTZXQgPSBmdW5jdGlvbiBiYWNrb2ZmVGltZVNldCgpIHtcbiAgICAgIG9wdHMuY3VycmVudF9iYWNrX29mZiA9IFNUQVJUSU5HX0JBQ0tfT0ZGO1xuICAgIH07XG4gICAgdmFyIHJlbW92ZUJhY2tPZmZTZXR0ZXIgPSBmdW5jdGlvbiByZW1vdmVCYWNrT2ZmVGltZVNldCgpIHtcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUxpc3RlbmVyKCdhY3RpdmUnLCBiYWNrT2ZmU2V0KTtcbiAgICB9O1xuICAgIHJldHVyblZhbHVlLm9uY2UoJ3BhdXNlZCcsIHJlbW92ZUJhY2tPZmZTZXR0ZXIpO1xuICAgIHJldHVyblZhbHVlLm9uY2UoJ2FjdGl2ZScsIGJhY2tPZmZTZXQpO1xuICB9XG5cbiAgb3B0cy5jdXJyZW50X2JhY2tfb2ZmID0gb3B0cy5jdXJyZW50X2JhY2tfb2ZmIHx8IFNUQVJUSU5HX0JBQ0tfT0ZGO1xuICBvcHRzLmN1cnJlbnRfYmFja19vZmYgPSBvcHRzLmJhY2tfb2ZmX2Z1bmN0aW9uKG9wdHMuY3VycmVudF9iYWNrX29mZik7XG4gIHNldFRpbWVvdXQoY2FsbGJhY2ssIG9wdHMuY3VycmVudF9iYWNrX29mZik7XG59XG5cbmZ1bmN0aW9uIHNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkocXVlcnlQYXJhbXMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5zb3J0KGNvbGxhdGUpLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBrZXkpIHtcbiAgICByZXN1bHRba2V5XSA9IHF1ZXJ5UGFyYW1zW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwge30pO1xufVxuXG4vLyBHZW5lcmF0ZSBhIHVuaXF1ZSBpZCBwYXJ0aWN1bGFyIHRvIHRoaXMgcmVwbGljYXRpb24uXG4vLyBOb3QgZ3VhcmFudGVlZCB0byBhbGlnbiBwZXJmZWN0bHkgd2l0aCBDb3VjaERCJ3MgcmVwIGlkcy5cbmZ1bmN0aW9uIGdlbmVyYXRlUmVwbGljYXRpb25JZChzcmMsIHRhcmdldCwgb3B0cykge1xuICB2YXIgZG9jSWRzID0gb3B0cy5kb2NfaWRzID8gb3B0cy5kb2NfaWRzLnNvcnQoY29sbGF0ZSkgOiAnJztcbiAgdmFyIGZpbHRlckZ1biA9IG9wdHMuZmlsdGVyID8gb3B0cy5maWx0ZXIudG9TdHJpbmcoKSA6ICcnO1xuICB2YXIgcXVlcnlQYXJhbXMgPSAnJztcbiAgdmFyIGZpbHRlclZpZXdOYW1lID0gICcnO1xuICB2YXIgc2VsZWN0b3IgPSAnJztcblxuICAvLyBwb3NzaWJpbGl0eSBmb3IgY2hlY2twb2ludHMgdG8gYmUgbG9zdCBoZXJlIGFzIGJlaGF2aW91ciBvZlxuICAvLyBKU09OLnN0cmluZ2lmeSBpcyBub3Qgc3RhYmxlIChzZWUgIzYyMjYpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgIHNlbGVjdG9yID0gSlNPTi5zdHJpbmdpZnkob3B0cy5zZWxlY3Rvcik7XG4gIH1cblxuICBpZiAob3B0cy5maWx0ZXIgJiYgb3B0cy5xdWVyeV9wYXJhbXMpIHtcbiAgICBxdWVyeVBhcmFtcyA9IEpTT04uc3RyaW5naWZ5KHNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkob3B0cy5xdWVyeV9wYXJhbXMpKTtcbiAgfVxuXG4gIGlmIChvcHRzLmZpbHRlciAmJiBvcHRzLmZpbHRlciA9PT0gJ192aWV3Jykge1xuICAgIGZpbHRlclZpZXdOYW1lID0gb3B0cy52aWV3LnRvU3RyaW5nKCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoW3NyYy5pZCgpLCB0YXJnZXQuaWQoKV0pLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHZhciBxdWVyeURhdGEgPSByZXNbMF0gKyByZXNbMV0gKyBmaWx0ZXJGdW4gKyBmaWx0ZXJWaWV3TmFtZSArXG4gICAgICBxdWVyeVBhcmFtcyArIGRvY0lkcyArIHNlbGVjdG9yO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgYmluYXJ5TWQ1KHF1ZXJ5RGF0YSwgcmVzb2x2ZSk7XG4gICAgfSk7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKG1kNXN1bSkge1xuICAgIC8vIGNhbid0IHVzZSBzdHJhaWdodC11cCBtZDUgYWxwaGFiZXQsIGJlY2F1c2VcbiAgICAvLyB0aGUgY2hhciAnLycgaXMgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgZm9yIGF0dGFjaG1lbnRzLFxuICAgIC8vIGFuZCArIGlzIGFsc28gbm90IHVybC1zYWZlXG4gICAgbWQ1c3VtID0gbWQ1c3VtLnJlcGxhY2UoL1xcLy9nLCAnLicpLnJlcGxhY2UoL1xcKy9nLCAnXycpO1xuICAgIHJldHVybiAnX2xvY2FsLycgKyBtZDVzdW07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsaWNhdGUoc3JjLCB0YXJnZXQsIG9wdHMsIHJldHVyblZhbHVlLCByZXN1bHQpIHtcbiAgdmFyIGJhdGNoZXMgPSBbXTsgICAgICAgICAgICAgICAvLyBsaXN0IG9mIGJhdGNoZXMgdG8gYmUgcHJvY2Vzc2VkXG4gIHZhciBjdXJyZW50QmF0Y2g7ICAgICAgICAgICAgICAgLy8gdGhlIGJhdGNoIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWRcbiAgdmFyIHBlbmRpbmdCYXRjaCA9IHtcbiAgICBzZXE6IDAsXG4gICAgY2hhbmdlczogW10sXG4gICAgZG9jczogW11cbiAgfTsgLy8gbmV4dCBiYXRjaCwgbm90IHlldCByZWFkeSB0byBiZSBwcm9jZXNzZWRcbiAgdmFyIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7ICAvLyB0cnVlIHdoaWxlIGNoZWNrcG9pbnQgaXMgYmVpbmcgd3JpdHRlblxuICB2YXIgY2hhbmdlc0NvbXBsZXRlZCA9IGZhbHNlOyAgIC8vIHRydWUgd2hlbiBhbGwgY2hhbmdlcyByZWNlaXZlZFxuICB2YXIgcmVwbGljYXRpb25Db21wbGV0ZWQgPSBmYWxzZTsgLy8gdHJ1ZSB3aGVuIHJlcGxpY2F0aW9uIGhhcyBjb21wbGV0ZWRcbiAgdmFyIGxhc3Rfc2VxID0gMDtcbiAgdmFyIGNvbnRpbnVvdXMgPSBvcHRzLmNvbnRpbnVvdXMgfHwgb3B0cy5saXZlIHx8IGZhbHNlO1xuICB2YXIgYmF0Y2hfc2l6ZSA9IG9wdHMuYmF0Y2hfc2l6ZSB8fCAxMDA7XG4gIHZhciBiYXRjaGVzX2xpbWl0ID0gb3B0cy5iYXRjaGVzX2xpbWl0IHx8IDEwO1xuICB2YXIgc3R5bGUgPSBvcHRzLnN0eWxlIHx8ICdhbGxfZG9jcyc7XG4gIHZhciBjaGFuZ2VzUGVuZGluZyA9IGZhbHNlOyAgICAgLy8gdHJ1ZSB3aGlsZSBzcmMuY2hhbmdlcyBpcyBydW5uaW5nXG4gIHZhciBkb2NfaWRzID0gb3B0cy5kb2NfaWRzO1xuICB2YXIgc2VsZWN0b3IgPSBvcHRzLnNlbGVjdG9yO1xuICB2YXIgcmVwSWQ7XG4gIHZhciBjaGVja3BvaW50ZXI7XG4gIHZhciBjaGFuZ2VkRG9jcyA9IFtdO1xuICAvLyBMaWtlIGNvdWNoZGIsIGV2ZXJ5IHJlcGxpY2F0aW9uIGdldHMgYSB1bmlxdWUgc2Vzc2lvbiBpZFxuICB2YXIgc2Vzc2lvbiA9IHV1aWQoKTtcblxuICByZXN1bHQgPSByZXN1bHQgfHwge1xuICAgIG9rOiB0cnVlLFxuICAgIHN0YXJ0X3RpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBkb2NzX3JlYWQ6IDAsXG4gICAgZG9jc193cml0dGVuOiAwLFxuICAgIGRvY193cml0ZV9mYWlsdXJlczogMCxcbiAgICBlcnJvcnM6IFtdXG4gIH07XG5cbiAgdmFyIGNoYW5nZXNPcHRzID0ge307XG4gIHJldHVyblZhbHVlLnJlYWR5KHNyYywgdGFyZ2V0KTtcblxuICBmdW5jdGlvbiBpbml0Q2hlY2twb2ludGVyKCkge1xuICAgIGlmIChjaGVja3BvaW50ZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIGdlbmVyYXRlUmVwbGljYXRpb25JZChzcmMsIHRhcmdldCwgb3B0cykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICByZXBJZCA9IHJlcztcblxuICAgICAgdmFyIGNoZWNrcG9pbnRPcHRzID0ge307XG4gICAgICBpZiAob3B0cy5jaGVja3BvaW50ID09PSBmYWxzZSkge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiBmYWxzZSwgd3JpdGVUYXJnZXRDaGVja3BvaW50OiBmYWxzZSB9O1xuICAgICAgfSBlbHNlIGlmIChvcHRzLmNoZWNrcG9pbnQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIGNoZWNrcG9pbnRPcHRzID0geyB3cml0ZVNvdXJjZUNoZWNrcG9pbnQ6IHRydWUsIHdyaXRlVGFyZ2V0Q2hlY2twb2ludDogZmFsc2UgfTtcbiAgICAgIH0gZWxzZSBpZiAob3B0cy5jaGVja3BvaW50ID09PSAndGFyZ2V0Jykge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiBmYWxzZSwgd3JpdGVUYXJnZXRDaGVja3BvaW50OiB0cnVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiB0cnVlLCB3cml0ZVRhcmdldENoZWNrcG9pbnQ6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgY2hlY2twb2ludGVyID0gbmV3IENoZWNrcG9pbnRlcihzcmMsIHRhcmdldCwgcmVwSWQsIHJldHVyblZhbHVlLCBjaGVja3BvaW50T3B0cyk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZURvY3MoKSB7XG4gICAgY2hhbmdlZERvY3MgPSBbXTtcblxuICAgIGlmIChjdXJyZW50QmF0Y2guZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRvY3MgPSBjdXJyZW50QmF0Y2guZG9jcztcbiAgICB2YXIgYnVsa09wdHMgPSB7dGltZW91dDogb3B0cy50aW1lb3V0fTtcbiAgICByZXR1cm4gdGFyZ2V0LmJ1bGtEb2NzKHtkb2NzOiBkb2NzLCBuZXdfZWRpdHM6IGZhbHNlfSwgYnVsa09wdHMpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gYHJlc2AgZG9lc24ndCBpbmNsdWRlIGZ1bGwgZG9jdW1lbnRzICh3aGljaCBsaXZlIGluIGBkb2NzYCksIHNvIHdlIGNyZWF0ZSBhIG1hcCBvZlxuICAgICAgLy8gKGlkIC0+IGVycm9yKSwgYW5kIGNoZWNrIGZvciBlcnJvcnMgd2hpbGUgaXRlcmF0aW5nIG92ZXIgYGRvY3NgXG4gICAgICB2YXIgZXJyb3JzQnlJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICByZXMuZm9yRWFjaChmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIGlmIChyZXMuZXJyb3IpIHtcbiAgICAgICAgICBlcnJvcnNCeUlkW3Jlcy5pZF0gPSByZXM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgZXJyb3JzTm8gPSBPYmplY3Qua2V5cyhlcnJvcnNCeUlkKS5sZW5ndGg7XG4gICAgICByZXN1bHQuZG9jX3dyaXRlX2ZhaWx1cmVzICs9IGVycm9yc05vO1xuICAgICAgcmVzdWx0LmRvY3Nfd3JpdHRlbiArPSBkb2NzLmxlbmd0aCAtIGVycm9yc05vO1xuXG4gICAgICBkb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvYykge1xuICAgICAgICB2YXIgZXJyb3IgPSBlcnJvcnNCeUlkW2RvYy5faWRdO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgIC8vIE5vcm1hbGl6ZSBlcnJvciBuYW1lLiBpLmUuICdVbmF1dGhvcml6ZWQnIC0+ICd1bmF1dGhvcml6ZWQnIChlZyBTeW5jIEdhdGV3YXkpXG4gICAgICAgICAgdmFyIGVycm9yTmFtZSA9IChlcnJvci5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChlcnJvck5hbWUgPT09ICd1bmF1dGhvcml6ZWQnIHx8IGVycm9yTmFtZSA9PT0gJ2ZvcmJpZGRlbicpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2RlbmllZCcsIGNsb25lKGVycm9yKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VkRG9jcy5wdXNoKGRvYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgcmVzdWx0LmRvY193cml0ZV9mYWlsdXJlcyArPSBkb2NzLmxlbmd0aDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaEJhdGNoKCkge1xuICAgIGlmIChjdXJyZW50QmF0Y2guZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgd2FzIGEgcHJvYmxlbSBnZXR0aW5nIGRvY3MuJyk7XG4gICAgfVxuICAgIHJlc3VsdC5sYXN0X3NlcSA9IGxhc3Rfc2VxID0gY3VycmVudEJhdGNoLnNlcTtcbiAgICB2YXIgb3V0UmVzdWx0ID0gY2xvbmUocmVzdWx0KTtcbiAgICBpZiAoY2hhbmdlZERvY3MubGVuZ3RoKSB7XG4gICAgICBvdXRSZXN1bHQuZG9jcyA9IGNoYW5nZWREb2NzO1xuICAgICAgLy8gQXR0YWNoICdwZW5kaW5nJyBwcm9wZXJ0eSBpZiBzZXJ2ZXIgc3VwcG9ydHMgaXQgKENvdWNoREIgMi4wKylcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHR5cGVvZiBjdXJyZW50QmF0Y2gucGVuZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgb3V0UmVzdWx0LnBlbmRpbmcgPSBjdXJyZW50QmF0Y2gucGVuZGluZztcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRCYXRjaC5wZW5kaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hhbmdlJywgb3V0UmVzdWx0KTtcbiAgICB9XG4gICAgd3JpdGluZ0NoZWNrcG9pbnQgPSB0cnVlO1xuICAgIHJldHVybiBjaGVja3BvaW50ZXIud3JpdGVDaGVja3BvaW50KGN1cnJlbnRCYXRjaC5zZXEsXG4gICAgICAgIHNlc3Npb24pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hlY2twb2ludCcsIHsgJ2NoZWNrcG9pbnQnOiBjdXJyZW50QmF0Y2guc2VxIH0pO1xuICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG4gICAgICB9XG4gICAgICBjdXJyZW50QmF0Y2ggPSB1bmRlZmluZWQ7XG4gICAgICBnZXRDaGFuZ2VzKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgb25DaGVja3BvaW50RXJyb3IoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpZmZzKCkge1xuICAgIHZhciBkaWZmID0ge307XG4gICAgY3VycmVudEJhdGNoLmNoYW5nZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hhbmdlKSB7XG4gICAgICByZXR1cm5WYWx1ZS5lbWl0KCdjaGVja3BvaW50JywgeyAncmV2c19kaWZmJzogY2hhbmdlIH0pO1xuICAgICAgLy8gQ291Y2hiYXNlIFN5bmMgR2F0ZXdheSBlbWl0cyB0aGVzZSwgYnV0IHdlIGNhbiBpZ25vcmUgdGhlbVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlLmlkID09PSBcIl91c2VyL1wiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRpZmZbY2hhbmdlLmlkXSA9IGNoYW5nZS5jaGFuZ2VzLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4geC5yZXY7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0LnJldnNEaWZmKGRpZmYpLnRoZW4oZnVuY3Rpb24gKGRpZmZzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuICAgICAgLy8gY3VycmVudEJhdGNoLmRpZmZzIGVsZW1lbnRzIGFyZSBkZWxldGVkIGFzIHRoZSBkb2N1bWVudHMgYXJlIHdyaXR0ZW5cbiAgICAgIGN1cnJlbnRCYXRjaC5kaWZmcyA9IGRpZmZzO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmF0Y2hEb2NzKCkge1xuICAgIHJldHVybiBnZXREb2NzKHNyYywgdGFyZ2V0LCBjdXJyZW50QmF0Y2guZGlmZnMsIHJldHVyblZhbHVlKS50aGVuKGZ1bmN0aW9uIChnb3QpIHtcbiAgICAgIGN1cnJlbnRCYXRjaC5lcnJvciA9ICFnb3Qub2s7XG4gICAgICBnb3QuZG9jcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRCYXRjaC5kaWZmc1tkb2MuX2lkXTtcbiAgICAgICAgcmVzdWx0LmRvY3NfcmVhZCsrO1xuICAgICAgICBjdXJyZW50QmF0Y2guZG9jcy5wdXNoKGRvYyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0TmV4dEJhdGNoKCkge1xuICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQgfHwgY3VycmVudEJhdGNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChiYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcHJvY2Vzc1BlbmRpbmdCYXRjaCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3VycmVudEJhdGNoID0gYmF0Y2hlcy5zaGlmdCgpO1xuICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoZWNrcG9pbnQnLCB7ICdzdGFydF9uZXh0X2JhdGNoJzogY3VycmVudEJhdGNoLnNlcSB9KTtcbiAgICBnZXREaWZmcygpXG4gICAgICAudGhlbihnZXRCYXRjaERvY3MpXG4gICAgICAudGhlbih3cml0ZURvY3MpXG4gICAgICAudGhlbihmaW5pc2hCYXRjaClcbiAgICAgIC50aGVuKHN0YXJ0TmV4dEJhdGNoKVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgYWJvcnRSZXBsaWNhdGlvbignYmF0Y2ggcHJvY2Vzc2luZyB0ZXJtaW5hdGVkIHdpdGggZXJyb3InLCBlcnIpO1xuICAgICAgfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NQZW5kaW5nQmF0Y2goaW1tZWRpYXRlJCQxKSB7XG4gICAgaWYgKHBlbmRpbmdCYXRjaC5jaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGJhdGNoZXMubGVuZ3RoID09PSAwICYmICFjdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgaWYgKChjb250aW51b3VzICYmIGNoYW5nZXNPcHRzLmxpdmUpIHx8IGNoYW5nZXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICByZXR1cm5WYWx1ZS5zdGF0ZSA9ICdwZW5kaW5nJztcbiAgICAgICAgICByZXR1cm5WYWx1ZS5lbWl0KCdwYXVzZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc0NvbXBsZXRlZCkge1xuICAgICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBpbW1lZGlhdGUkJDEgfHxcbiAgICAgIGNoYW5nZXNDb21wbGV0ZWQgfHxcbiAgICAgIHBlbmRpbmdCYXRjaC5jaGFuZ2VzLmxlbmd0aCA+PSBiYXRjaF9zaXplXG4gICAgKSB7XG4gICAgICBiYXRjaGVzLnB1c2gocGVuZGluZ0JhdGNoKTtcbiAgICAgIHBlbmRpbmdCYXRjaCA9IHtcbiAgICAgICAgc2VxOiAwLFxuICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgZG9jczogW11cbiAgICAgIH07XG4gICAgICBpZiAocmV0dXJuVmFsdWUuc3RhdGUgPT09ICdwZW5kaW5nJyB8fCByZXR1cm5WYWx1ZS5zdGF0ZSA9PT0gJ3N0b3BwZWQnKSB7XG4gICAgICAgIHJldHVyblZhbHVlLnN0YXRlID0gJ2FjdGl2ZSc7XG4gICAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgICAgc3RhcnROZXh0QmF0Y2goKTtcbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGFib3J0UmVwbGljYXRpb24ocmVhc29uLCBlcnIpIHtcbiAgICBpZiAocmVwbGljYXRpb25Db21wbGV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFlcnIubWVzc2FnZSkge1xuICAgICAgZXJyLm1lc3NhZ2UgPSByZWFzb247XG4gICAgfVxuICAgIHJlc3VsdC5vayA9IGZhbHNlO1xuICAgIHJlc3VsdC5zdGF0dXMgPSAnYWJvcnRpbmcnO1xuICAgIGJhdGNoZXMgPSBbXTtcbiAgICBwZW5kaW5nQmF0Y2ggPSB7XG4gICAgICBzZXE6IDAsXG4gICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgIGRvY3M6IFtdXG4gICAgfTtcbiAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKGVycik7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlUmVwbGljYXRpb24oZmF0YWxFcnJvcikge1xuICAgIGlmIChyZXBsaWNhdGlvbkNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXN1bHQuc3RhdHVzID0gJ2NhbmNlbGxlZCc7XG4gICAgICBpZiAod3JpdGluZ0NoZWNrcG9pbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc3RhdHVzID0gcmVzdWx0LnN0YXR1cyB8fCAnY29tcGxldGUnO1xuICAgIHJlc3VsdC5lbmRfdGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICByZXN1bHQubGFzdF9zZXEgPSBsYXN0X3NlcTtcbiAgICByZXBsaWNhdGlvbkNvbXBsZXRlZCA9IHRydWU7XG5cbiAgICBpZiAoZmF0YWxFcnJvcikge1xuICAgICAgLy8gbmVlZCB0byBleHRlbmQgdGhlIGVycm9yIGJlY2F1c2UgRmlyZWZveCBjb25zaWRlcnMgXCIucmVzdWx0XCIgcmVhZC1vbmx5XG4gICAgICBmYXRhbEVycm9yID0gY3JlYXRlRXJyb3IoZmF0YWxFcnJvcik7XG4gICAgICBmYXRhbEVycm9yLnJlc3VsdCA9IHJlc3VsdDtcblxuICAgICAgLy8gTm9ybWFsaXplIGVycm9yIG5hbWUuIGkuZS4gJ1VuYXV0aG9yaXplZCcgLT4gJ3VuYXV0aG9yaXplZCcgKGVnIFN5bmMgR2F0ZXdheSlcbiAgICAgIHZhciBlcnJvck5hbWUgPSAoZmF0YWxFcnJvci5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGVycm9yTmFtZSA9PT0gJ3VuYXV0aG9yaXplZCcgfHwgZXJyb3JOYW1lID09PSAnZm9yYmlkZGVuJykge1xuICAgICAgICByZXR1cm5WYWx1ZS5lbWl0KCdlcnJvcicsIGZhdGFsRXJyb3IpO1xuICAgICAgICByZXR1cm5WYWx1ZS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhY2tPZmYob3B0cywgcmV0dXJuVmFsdWUsIGZhdGFsRXJyb3IsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXBsaWNhdGUoc3JjLCB0YXJnZXQsIG9wdHMsIHJldHVyblZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2NvbXBsZXRlJywgcmVzdWx0KTtcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25DaGFuZ2UoY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG4gICAgLy8gQXR0YWNoICdwZW5kaW5nJyBwcm9wZXJ0eSBpZiBzZXJ2ZXIgc3VwcG9ydHMgaXQgKENvdWNoREIgMi4wKylcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodHlwZW9mIHBlbmRpbmcgPT09ICdudW1iZXInKSB7XG4gICAgICBwZW5kaW5nQmF0Y2gucGVuZGluZyA9IHBlbmRpbmc7XG4gICAgfVxuXG4gICAgdmFyIGZpbHRlciA9IGZpbHRlckNoYW5nZShvcHRzKShjaGFuZ2UpO1xuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBlbmRpbmdCYXRjaC5zZXEgPSBjaGFuZ2Uuc2VxIHx8IGxhc3RTZXE7XG4gICAgcGVuZGluZ0JhdGNoLmNoYW5nZXMucHVzaChjaGFuZ2UpO1xuICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoZWNrcG9pbnQnLCB7ICdwZW5kaW5nX2JhdGNoJzogcGVuZGluZ0JhdGNoLnNlcSB9KTtcbiAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzc1BlbmRpbmdCYXRjaChiYXRjaGVzLmxlbmd0aCA9PT0gMCAmJiBjaGFuZ2VzT3B0cy5saXZlKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25DaGFuZ2VzQ29tcGxldGUoY2hhbmdlcykge1xuICAgIGNoYW5nZXNQZW5kaW5nID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBpZiBubyByZXN1bHRzIHdlcmUgcmV0dXJuZWQgdGhlbiB3ZSdyZSBkb25lLFxuICAgIC8vIGVsc2UgZmV0Y2ggbW9yZVxuICAgIGlmIChjaGFuZ2VzLnJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlc09wdHMuc2luY2UgPSBjaGFuZ2VzLnJlc3VsdHNbY2hhbmdlcy5yZXN1bHRzLmxlbmd0aCAtIDFdLnNlcTtcbiAgICAgIGdldENoYW5nZXMoKTtcbiAgICAgIHByb2Nlc3NQZW5kaW5nQmF0Y2godHJ1ZSk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGludW91cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLmxpdmUgPSB0cnVlO1xuICAgICAgICAgIGdldENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUGVuZGluZ0JhdGNoKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBjaGVja3BvaW50IHNvIHdlIHN0YXJ0IGZyb20gdGhlIHJpZ2h0IHNlcSBuZXh0IHRpbWVcbiAgICAgIGlmICghY3VycmVudEJhdGNoICYmIGNoYW5nZXMucmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSB0cnVlO1xuICAgICAgICBjaGVja3BvaW50ZXIud3JpdGVDaGVja3BvaW50KGNoYW5nZXMubGFzdF9zZXEsXG4gICAgICAgICAgICBzZXNzaW9uKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgICAgIHJlc3VsdC5sYXN0X3NlcSA9IGxhc3Rfc2VxID0gY2hhbmdlcy5sYXN0X3NlcTtcbiAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gob25DaGVja3BvaW50RXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlc0Vycm9yKGVycikge1xuICAgIGNoYW5nZXNQZW5kaW5nID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG4gICAgYWJvcnRSZXBsaWNhdGlvbignY2hhbmdlcyByZWplY3RlZCcsIGVycik7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGdldENoYW5nZXMoKSB7XG4gICAgaWYgKCEoXG4gICAgICAhY2hhbmdlc1BlbmRpbmcgJiZcbiAgICAgICFjaGFuZ2VzQ29tcGxldGVkICYmXG4gICAgICBiYXRjaGVzLmxlbmd0aCA8IGJhdGNoZXNfbGltaXRcbiAgICAgICkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2hhbmdlc1BlbmRpbmcgPSB0cnVlO1xuICAgIGZ1bmN0aW9uIGFib3J0Q2hhbmdlcygpIHtcbiAgICAgIGNoYW5nZXMuY2FuY2VsKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKCkge1xuICAgICAgcmV0dXJuVmFsdWUucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIGFib3J0Q2hhbmdlcyk7XG4gICAgfVxuXG4gICAgaWYgKHJldHVyblZhbHVlLl9jaGFuZ2VzKSB7IC8vIHJlbW92ZSBvbGQgY2hhbmdlcygpIGFuZCBsaXN0ZW5lcnNcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUxpc3RlbmVyKCdjYW5jZWwnLCByZXR1cm5WYWx1ZS5fYWJvcnRDaGFuZ2VzKTtcbiAgICAgIHJldHVyblZhbHVlLl9jaGFuZ2VzLmNhbmNlbCgpO1xuICAgIH1cbiAgICByZXR1cm5WYWx1ZS5vbmNlKCdjYW5jZWwnLCBhYm9ydENoYW5nZXMpO1xuXG4gICAgdmFyIGNoYW5nZXMgPSBzcmMuY2hhbmdlcyhjaGFuZ2VzT3B0cylcbiAgICAgIC5vbignY2hhbmdlJywgb25DaGFuZ2UpO1xuICAgIGNoYW5nZXMudGhlbihyZW1vdmVMaXN0ZW5lciwgcmVtb3ZlTGlzdGVuZXIpO1xuICAgIGNoYW5nZXMudGhlbihvbkNoYW5nZXNDb21wbGV0ZSlcbiAgICAgIC5jYXRjaChvbkNoYW5nZXNFcnJvcik7XG5cbiAgICBpZiAob3B0cy5yZXRyeSkge1xuICAgICAgLy8gc2F2ZSBmb3IgbGF0ZXIgc28gd2UgY2FuIGNhbmNlbCBpZiBuZWNlc3NhcnlcbiAgICAgIHJldHVyblZhbHVlLl9jaGFuZ2VzID0gY2hhbmdlcztcbiAgICAgIHJldHVyblZhbHVlLl9hYm9ydENoYW5nZXMgPSBhYm9ydENoYW5nZXM7XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBzdGFydENoYW5nZXMoKSB7XG4gICAgaW5pdENoZWNrcG9pbnRlcigpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrcG9pbnRlci5nZXRDaGVja3BvaW50KCkudGhlbihmdW5jdGlvbiAoY2hlY2twb2ludCkge1xuICAgICAgICBsYXN0X3NlcSA9IGNoZWNrcG9pbnQ7XG4gICAgICAgIGNoYW5nZXNPcHRzID0ge1xuICAgICAgICAgIHNpbmNlOiBsYXN0X3NlcSxcbiAgICAgICAgICBsaW1pdDogYmF0Y2hfc2l6ZSxcbiAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplLFxuICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICBkb2NfaWRzOiBkb2NfaWRzLFxuICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICByZXR1cm5fZG9jczogdHJ1ZSAvLyByZXF1aXJlZCBzbyB3ZSBrbm93IHdoZW4gd2UncmUgZG9uZVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0cy5maWx0ZXIpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG9wdHMuZmlsdGVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gcmVxdWlyZWQgZm9yIHRoZSBjbGllbnQtc2lkZSBmaWx0ZXIgaW4gb25DaGFuZ2VcbiAgICAgICAgICAgIGNoYW5nZXNPcHRzLmluY2x1ZGVfZG9jcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gZGRvYyBmaWx0ZXJcbiAgICAgICAgICAgIGNoYW5nZXNPcHRzLmZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2hlYXJ0YmVhdCcgaW4gb3B0cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLmhlYXJ0YmVhdCA9IG9wdHMuaGVhcnRiZWF0O1xuICAgICAgICB9XG4gICAgICAgIGlmICgndGltZW91dCcgaW4gb3B0cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMucXVlcnlfcGFyYW1zKSB7XG4gICAgICAgICAgY2hhbmdlc09wdHMucXVlcnlfcGFyYW1zID0gb3B0cy5xdWVyeV9wYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMudmlldykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLnZpZXcgPSBvcHRzLnZpZXc7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgYWJvcnRSZXBsaWNhdGlvbignZ2V0Q2hlY2twb2ludCByZWplY3RlZCB3aXRoICcsIGVycik7XG4gICAgfSk7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmdW5jdGlvbiBvbkNoZWNrcG9pbnRFcnJvcihlcnIpIHtcbiAgICB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgIGFib3J0UmVwbGljYXRpb24oJ3dyaXRlQ2hlY2twb2ludCBjb21wbGV0ZWQgd2l0aCBlcnJvcicsIGVycik7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkgeyAvLyBjYW5jZWxsZWQgaW1tZWRpYXRlbHlcbiAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFyZXR1cm5WYWx1ZS5fYWRkZWRMaXN0ZW5lcnMpIHtcbiAgICByZXR1cm5WYWx1ZS5vbmNlKCdjYW5jZWwnLCBjb21wbGV0ZVJlcGxpY2F0aW9uKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0cy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuVmFsdWUub25jZSgnZXJyb3InLCBvcHRzLmNvbXBsZXRlKTtcbiAgICAgIHJldHVyblZhbHVlLm9uY2UoJ2NvbXBsZXRlJywgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBvcHRzLmNvbXBsZXRlKG51bGwsIHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuVmFsdWUuX2FkZGVkTGlzdGVuZXJzID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cy5zaW5jZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdGFydENoYW5nZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBpbml0Q2hlY2twb2ludGVyKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB3cml0aW5nQ2hlY2twb2ludCA9IHRydWU7XG4gICAgICByZXR1cm4gY2hlY2twb2ludGVyLndyaXRlQ2hlY2twb2ludChvcHRzLnNpbmNlLCBzZXNzaW9uKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0X3NlcSA9IG9wdHMuc2luY2U7XG4gICAgICBzdGFydENoYW5nZXMoKTtcbiAgICB9KS5jYXRjaChvbkNoZWNrcG9pbnRFcnJvcik7XG4gIH1cbn1cblxuLy8gV2UgY3JlYXRlIGEgYmFzaWMgcHJvbWlzZSBzbyB0aGUgY2FsbGVyIGNhbiBjYW5jZWwgdGhlIHJlcGxpY2F0aW9uIHBvc3NpYmx5XG4vLyBiZWZvcmUgd2UgaGF2ZSBhY3R1YWxseSBzdGFydGVkIGxpc3RlbmluZyB0byBjaGFuZ2VzIGV0Y1xuaW5oZXJpdHMoUmVwbGljYXRpb24sIEVFKTtcbmZ1bmN0aW9uIFJlcGxpY2F0aW9uKCkge1xuICBFRS5jYWxsKHRoaXMpO1xuICB0aGlzLmNhbmNlbGxlZCA9IGZhbHNlO1xuICB0aGlzLnN0YXRlID0gJ3BlbmRpbmcnO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgIHNlbGYub25jZSgnY29tcGxldGUnLCBmdWxmaWxsKTtcbiAgICBzZWxmLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG4gIHNlbGYudGhlbiA9IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gIH07XG4gIHNlbGYuY2F0Y2ggPSBmdW5jdGlvbiAocmVqZWN0KSB7XG4gICAgcmV0dXJuIHByb21pc2UuY2F0Y2gocmVqZWN0KTtcbiAgfTtcbiAgLy8gQXMgd2UgYWxsb3cgZXJyb3IgaGFuZGxpbmcgdmlhIFwiZXJyb3JcIiBldmVudCBhcyB3ZWxsLFxuICAvLyBwdXQgYSBzdHViIGluIGhlcmUgc28gdGhhdCByZWplY3RpbmcgbmV2ZXIgdGhyb3dzIFVuaGFuZGxlZEVycm9yLlxuICBzZWxmLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbn1cblxuUmVwbGljYXRpb24ucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICB0aGlzLnN0YXRlID0gJ2NhbmNlbGxlZCc7XG4gIHRoaXMuZW1pdCgnY2FuY2VsJyk7XG59O1xuXG5SZXBsaWNhdGlvbi5wcm90b3R5cGUucmVhZHkgPSBmdW5jdGlvbiAoc3JjLCB0YXJnZXQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi5fcmVhZHlDYWxsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc2VsZi5fcmVhZHlDYWxsZWQgPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIG9uRGVzdHJveSgpIHtcbiAgICBzZWxmLmNhbmNlbCgpO1xuICB9XG4gIHNyYy5vbmNlKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB0YXJnZXQub25jZSgnZGVzdHJveWVkJywgb25EZXN0cm95KTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveSk7XG4gICAgdGFyZ2V0LnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB9XG4gIHNlbGYub25jZSgnY29tcGxldGUnLCBjbGVhbnVwKTtcbiAgc2VsZi5vbmNlKCdlcnJvcicsIGNsZWFudXApO1xufTtcblxuZnVuY3Rpb24gdG9Qb3VjaChkYiwgb3B0cykge1xuICB2YXIgUG91Y2hDb25zdHJ1Y3RvciA9IG9wdHMuUG91Y2hDb25zdHJ1Y3RvcjtcbiAgaWYgKHR5cGVvZiBkYiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFBvdWNoQ29uc3RydWN0b3IoZGIsIG9wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkYjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsaWNhdGVXcmFwcGVyKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRzID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIGlmIChvcHRzLmRvY19pZHMgJiYgIUFycmF5LmlzQXJyYXkob3B0cy5kb2NfaWRzKSkge1xuICAgIHRocm93IGNyZWF0ZUVycm9yKEJBRF9SRVFVRVNULFxuICAgICAgICAgICAgICAgICAgICAgICBcImBkb2NfaWRzYCBmaWx0ZXIgcGFyYW1ldGVyIGlzIG5vdCBhIGxpc3QuXCIpO1xuICB9XG5cbiAgb3B0cy5jb21wbGV0ZSA9IGNhbGxiYWNrO1xuICBvcHRzID0gY2xvbmUob3B0cyk7XG4gIG9wdHMuY29udGludW91cyA9IG9wdHMuY29udGludW91cyB8fCBvcHRzLmxpdmU7XG4gIG9wdHMucmV0cnkgPSAoJ3JldHJ5JyBpbiBvcHRzKSA/IG9wdHMucmV0cnkgOiBmYWxzZTtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgb3B0cy5Qb3VjaENvbnN0cnVjdG9yID0gb3B0cy5Qb3VjaENvbnN0cnVjdG9yIHx8IHRoaXM7XG4gIHZhciByZXBsaWNhdGVSZXQgPSBuZXcgUmVwbGljYXRpb24ob3B0cyk7XG4gIHZhciBzcmNQb3VjaCA9IHRvUG91Y2goc3JjLCBvcHRzKTtcbiAgdmFyIHRhcmdldFBvdWNoID0gdG9Qb3VjaCh0YXJnZXQsIG9wdHMpO1xuICByZXBsaWNhdGUoc3JjUG91Y2gsIHRhcmdldFBvdWNoLCBvcHRzLCByZXBsaWNhdGVSZXQpO1xuICByZXR1cm4gcmVwbGljYXRlUmV0O1xufVxuXG5pbmhlcml0cyhTeW5jLCBFRSk7XG5mdW5jdGlvbiBzeW5jKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRzID0ge307XG4gIH1cbiAgb3B0cyA9IGNsb25lKG9wdHMpO1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICBvcHRzLlBvdWNoQ29uc3RydWN0b3IgPSBvcHRzLlBvdWNoQ29uc3RydWN0b3IgfHwgdGhpcztcbiAgc3JjID0gdG9Qb3VjaChzcmMsIG9wdHMpO1xuICB0YXJnZXQgPSB0b1BvdWNoKHRhcmdldCwgb3B0cyk7XG4gIHJldHVybiBuZXcgU3luYyhzcmMsIHRhcmdldCwgb3B0cywgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBTeW5jKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuY2FuY2VsZWQgPSBmYWxzZTtcblxuICB2YXIgb3B0c1B1c2ggPSBvcHRzLnB1c2ggPyAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIG9wdHMsIG9wdHMucHVzaCkgOiBvcHRzO1xuICB2YXIgb3B0c1B1bGwgPSBvcHRzLnB1bGwgPyAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIG9wdHMsIG9wdHMucHVsbCkgOiBvcHRzO1xuXG4gIHRoaXMucHVzaCA9IHJlcGxpY2F0ZVdyYXBwZXIoc3JjLCB0YXJnZXQsIG9wdHNQdXNoKTtcbiAgdGhpcy5wdWxsID0gcmVwbGljYXRlV3JhcHBlcih0YXJnZXQsIHNyYywgb3B0c1B1bGwpO1xuXG4gIHRoaXMucHVzaFBhdXNlZCA9IHRydWU7XG4gIHRoaXMucHVsbFBhdXNlZCA9IHRydWU7XG5cbiAgZnVuY3Rpb24gcHVsbENoYW5nZShjaGFuZ2UpIHtcbiAgICBzZWxmLmVtaXQoJ2NoYW5nZScsIHtcbiAgICAgIGRpcmVjdGlvbjogJ3B1bGwnLFxuICAgICAgY2hhbmdlOiBjaGFuZ2VcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBwdXNoQ2hhbmdlKGNoYW5nZSkge1xuICAgIHNlbGYuZW1pdCgnY2hhbmdlJywge1xuICAgICAgZGlyZWN0aW9uOiAncHVzaCcsXG4gICAgICBjaGFuZ2U6IGNoYW5nZVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hEZW5pZWQoZG9jKSB7XG4gICAgc2VsZi5lbWl0KCdkZW5pZWQnLCB7XG4gICAgICBkaXJlY3Rpb246ICdwdXNoJyxcbiAgICAgIGRvYzogZG9jXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gcHVsbERlbmllZChkb2MpIHtcbiAgICBzZWxmLmVtaXQoJ2RlbmllZCcsIHtcbiAgICAgIGRpcmVjdGlvbjogJ3B1bGwnLFxuICAgICAgZG9jOiBkb2NcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBwdXNoUGF1c2VkKCkge1xuICAgIHNlbGYucHVzaFBhdXNlZCA9IHRydWU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYucHVsbFBhdXNlZCkge1xuICAgICAgc2VsZi5lbWl0KCdwYXVzZWQnKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHVsbFBhdXNlZCgpIHtcbiAgICBzZWxmLnB1bGxQYXVzZWQgPSB0cnVlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLnB1c2hQYXVzZWQpIHtcbiAgICAgIHNlbGYuZW1pdCgncGF1c2VkJyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHB1c2hBY3RpdmUoKSB7XG4gICAgc2VsZi5wdXNoUGF1c2VkID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYucHVsbFBhdXNlZCkge1xuICAgICAgc2VsZi5lbWl0KCdhY3RpdmUnLCB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3B1c2gnXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHVsbEFjdGl2ZSgpIHtcbiAgICBzZWxmLnB1bGxQYXVzZWQgPSBmYWxzZTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoc2VsZi5wdXNoUGF1c2VkKSB7XG4gICAgICBzZWxmLmVtaXQoJ2FjdGl2ZScsIHtcbiAgICAgICAgZGlyZWN0aW9uOiAncHVsbCdcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZW1vdmVkID0ge307XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQWxsKHR5cGUpIHsgLy8gdHlwZSBpcyAncHVzaCcgb3IgJ3B1bGwnXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCwgZnVuYykge1xuICAgICAgdmFyIGlzQ2hhbmdlID0gZXZlbnQgPT09ICdjaGFuZ2UnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsQ2hhbmdlIHx8IGZ1bmMgPT09IHB1c2hDaGFuZ2UpO1xuICAgICAgdmFyIGlzRGVuaWVkID0gZXZlbnQgPT09ICdkZW5pZWQnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsRGVuaWVkIHx8IGZ1bmMgPT09IHB1c2hEZW5pZWQpO1xuICAgICAgdmFyIGlzUGF1c2VkID0gZXZlbnQgPT09ICdwYXVzZWQnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsUGF1c2VkIHx8IGZ1bmMgPT09IHB1c2hQYXVzZWQpO1xuICAgICAgdmFyIGlzQWN0aXZlID0gZXZlbnQgPT09ICdhY3RpdmUnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsQWN0aXZlIHx8IGZ1bmMgPT09IHB1c2hBY3RpdmUpO1xuXG4gICAgICBpZiAoaXNDaGFuZ2UgfHwgaXNEZW5pZWQgfHwgaXNQYXVzZWQgfHwgaXNBY3RpdmUpIHtcbiAgICAgICAgaWYgKCEoZXZlbnQgaW4gcmVtb3ZlZCkpIHtcbiAgICAgICAgICByZW1vdmVkW2V2ZW50XSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZWRbZXZlbnRdW3R5cGVdID0gdHJ1ZTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlbW92ZWRbZXZlbnRdKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAvLyBib3RoIHB1c2ggYW5kIHB1bGwgaGF2ZSBhc2tlZCB0byBiZSByZW1vdmVkXG4gICAgICAgICAgc2VsZi5yZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRzLmxpdmUpIHtcbiAgICB0aGlzLnB1c2gub24oJ2NvbXBsZXRlJywgc2VsZi5wdWxsLmNhbmNlbC5iaW5kKHNlbGYucHVsbCkpO1xuICAgIHRoaXMucHVsbC5vbignY29tcGxldGUnLCBzZWxmLnB1c2guY2FuY2VsLmJpbmQoc2VsZi5wdXNoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRPbmVMaXN0ZW5lcihlZSwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGVlLmxpc3RlbmVycyhldmVudCkuaW5kZXhPZihsaXN0ZW5lcikgPT0gLTEpIHtcbiAgICAgIGVlLm9uKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5vbignbmV3TGlzdGVuZXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjaGFuZ2UnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdjaGFuZ2UnLCBwdWxsQ2hhbmdlKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2NoYW5nZScsIHB1c2hDaGFuZ2UpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdkZW5pZWQnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdkZW5pZWQnLCBwdWxsRGVuaWVkKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2RlbmllZCcsIHB1c2hEZW5pZWQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdhY3RpdmUnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdhY3RpdmUnLCBwdWxsQWN0aXZlKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2FjdGl2ZScsIHB1c2hBY3RpdmUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdwYXVzZWQnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdwYXVzZWQnLCBwdWxsUGF1c2VkKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ3BhdXNlZCcsIHB1c2hQYXVzZWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5vbigncmVtb3ZlTGlzdGVuZXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjaGFuZ2UnKSB7XG4gICAgICBzZWxmLnB1bGwucmVtb3ZlTGlzdGVuZXIoJ2NoYW5nZScsIHB1bGxDaGFuZ2UpO1xuICAgICAgc2VsZi5wdXNoLnJlbW92ZUxpc3RlbmVyKCdjaGFuZ2UnLCBwdXNoQ2hhbmdlKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnZGVuaWVkJykge1xuICAgICAgc2VsZi5wdWxsLnJlbW92ZUxpc3RlbmVyKCdkZW5pZWQnLCBwdWxsRGVuaWVkKTtcbiAgICAgIHNlbGYucHVzaC5yZW1vdmVMaXN0ZW5lcignZGVuaWVkJywgcHVzaERlbmllZCk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgIHNlbGYucHVsbC5yZW1vdmVMaXN0ZW5lcignYWN0aXZlJywgcHVsbEFjdGl2ZSk7XG4gICAgICBzZWxmLnB1c2gucmVtb3ZlTGlzdGVuZXIoJ2FjdGl2ZScsIHB1c2hBY3RpdmUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdwYXVzZWQnKSB7XG4gICAgICBzZWxmLnB1bGwucmVtb3ZlTGlzdGVuZXIoJ3BhdXNlZCcsIHB1bGxQYXVzZWQpO1xuICAgICAgc2VsZi5wdXNoLnJlbW92ZUxpc3RlbmVyKCdwYXVzZWQnLCBwdXNoUGF1c2VkKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMucHVsbC5vbigncmVtb3ZlTGlzdGVuZXInLCByZW1vdmVBbGwoJ3B1bGwnKSk7XG4gIHRoaXMucHVzaC5vbigncmVtb3ZlTGlzdGVuZXInLCByZW1vdmVBbGwoJ3B1c2gnKSk7XG5cbiAgdmFyIHByb21pc2UgPSBQcm9taXNlLmFsbChbXG4gICAgdGhpcy5wdXNoLFxuICAgIHRoaXMucHVsbFxuICBdKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgdmFyIG91dCA9IHtcbiAgICAgIHB1c2g6IHJlc3BbMF0sXG4gICAgICBwdWxsOiByZXNwWzFdXG4gICAgfTtcbiAgICBzZWxmLmVtaXQoJ2NvbXBsZXRlJywgb3V0KTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIG91dCk7XG4gICAgfVxuICAgIHNlbGYucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIHNlbGYuY2FuY2VsKCk7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAvLyBpZiB0aGVyZSdzIGEgY2FsbGJhY2ssIHRoZW4gdGhlIGNhbGxiYWNrIGNhbiByZWNlaXZlXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnRcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gY2FsbGJhY2ssIHRoZW4gd2UncmUgc2FmZSB0byBlbWl0IGFuIGVycm9yXG4gICAgICAvLyBldmVudCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IGFuIHVuaGFuZGxlZCBlcnJvclxuICAgICAgLy8gZHVlIHRvICdlcnJvcicgYmVpbmcgYSBzcGVjaWFsIGV2ZW50IGluIEV2ZW50RW1pdHRlcnNcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICBzZWxmLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgLy8gbm8gc2Vuc2UgdGhyb3dpbmcgaWYgd2UncmUgYWxyZWFkeSBlbWl0dGluZyBhbiAnZXJyb3InIGV2ZW50XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLnRoZW4gPSBmdW5jdGlvbiAoc3VjY2VzcywgZXJyKSB7XG4gICAgcmV0dXJuIHByb21pc2UudGhlbihzdWNjZXNzLCBlcnIpO1xuICB9O1xuXG4gIHRoaXMuY2F0Y2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgcmV0dXJuIHByb21pc2UuY2F0Y2goZXJyKTtcbiAgfTtcbn1cblxuU3luYy5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY2FuY2VsZWQpIHtcbiAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICB0aGlzLnB1c2guY2FuY2VsKCk7XG4gICAgdGhpcy5wdWxsLmNhbmNlbCgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiByZXBsaWNhdGlvbihQb3VjaERCKSB7XG4gIFBvdWNoREIucmVwbGljYXRlID0gcmVwbGljYXRlV3JhcHBlcjtcbiAgUG91Y2hEQi5zeW5jID0gc3luYztcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUG91Y2hEQi5wcm90b3R5cGUsICdyZXBsaWNhdGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICBpZiAodHlwZW9mIHRoaXMucmVwbGljYXRlTWV0aG9kcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5yZXBsaWNhdGVNZXRob2RzID0ge1xuICAgICAgICAgIGZyb206IGZ1bmN0aW9uIChvdGhlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdG9yLnJlcGxpY2F0ZShvdGhlciwgc2VsZiwgb3B0cywgY2FsbGJhY2spO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86IGZ1bmN0aW9uIChvdGhlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdG9yLnJlcGxpY2F0ZShzZWxmLCBvdGhlciwgb3B0cywgY2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlcGxpY2F0ZU1ldGhvZHM7XG4gICAgfVxuICB9KTtcblxuICBQb3VjaERCLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24gKGRiTmFtZSwgb3B0cywgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5zeW5jKHRoaXMsIGRiTmFtZSwgb3B0cywgY2FsbGJhY2spO1xuICB9O1xufVxuXG5Qb3VjaERCLnBsdWdpbihJREJQb3VjaClcbiAgLnBsdWdpbihIdHRwUG91Y2gkMSlcbiAgLnBsdWdpbihtYXByZWR1Y2UpXG4gIC5wbHVnaW4ocmVwbGljYXRpb24pO1xuXG4vLyBQdWxsIGZyb20gc3JjIGJlY2F1c2UgcG91Y2hkYi1ub2RlL3BvdWNoZGItYnJvd3NlciB0aGVtc2VsdmVzXG5cbmV4cG9ydCBkZWZhdWx0IFBvdWNoREI7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJzsgLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcblxudmFyIF9jbG9ja3NlcTsgLy8gUHJldmlvdXMgdXVpZCBjcmVhdGlvbiB0aW1lXG5cblxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgbmV3IEFycmF5KDE2KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvY2tzZXEgOiBfY2xvY2tzZXE7IC8vIG5vZGUgYW5kIGNsb2Nrc2VxIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gcmFuZG9tIHZhbHVlcyBpZiB0aGV5J3JlIG5vdFxuICAvLyBzcGVjaWZpZWQuICBXZSBkbyB0aGlzIGxhemlseSB0byBtaW5pbWl6ZSBpc3N1ZXMgcmVsYXRlZCB0byBpbnN1ZmZpY2llbnRcbiAgLy8gc3lzdGVtIGVudHJvcHkuICBTZWUgIzE4OVxuXG4gIGlmIChub2RlID09IG51bGwgfHwgY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgIHZhciBzZWVkQnl0ZXMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpO1xuXG4gICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuNSwgY3JlYXRlIGFuZCA0OC1iaXQgbm9kZSBpZCwgKDQ3IHJhbmRvbSBiaXRzICsgbXVsdGljYXN0IGJpdCA9IDEpXG4gICAgICBub2RlID0gX25vZGVJZCA9IFtzZWVkQnl0ZXNbMF0gfCAweDAxLCBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XV07XG4gICAgfVxuXG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgfVxuICB9IC8vIFVVSUQgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvXG4gIC8vIHRpbWUgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuXG5cbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IERhdGUubm93KCk7IC8vIFBlciA0LjIuMS4yLCB1c2UgY291bnQgb2YgdXVpZCdzIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgY2xvY2tcbiAgLy8gY3ljbGUgdG8gc2ltdWxhdGUgaGlnaGVyIHJlc29sdXRpb24gY2xvY2tcblxuICB2YXIgbnNlY3MgPSBvcHRpb25zLm5zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zZWNzIDogX2xhc3ROU2VjcyArIDE7IC8vIFRpbWUgc2luY2UgbGFzdCB1dWlkIGNyZWF0aW9uIChpbiBtc2VjcylcblxuICB2YXIgZHQgPSBtc2VjcyAtIF9sYXN0TVNlY3MgKyAobnNlY3MgLSBfbGFzdE5TZWNzKSAvIDEwMDAwOyAvLyBQZXIgNC4yLjEuMiwgQnVtcCBjbG9ja3NlcSBvbiBjbG9jayByZWdyZXNzaW9uXG5cbiAgaWYgKGR0IDwgMCAmJiBvcHRpb25zLmNsb2Nrc2VxID09PSB1bmRlZmluZWQpIHtcbiAgICBjbG9ja3NlcSA9IGNsb2Nrc2VxICsgMSAmIDB4M2ZmZjtcbiAgfSAvLyBSZXNldCBuc2VjcyBpZiBjbG9jayByZWdyZXNzZXMgKG5ldyBjbG9ja3NlcSkgb3Igd2UndmUgbW92ZWQgb250byBhIG5ld1xuICAvLyB0aW1lIGludGVydmFsXG5cblxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfSAvLyBQZXIgNC4yLjEuMiBUaHJvdyBlcnJvciBpZiB0b28gbWFueSB1dWlkcyBhcmUgcmVxdWVzdGVkXG5cblxuICBpZiAobnNlY3MgPj0gMTAwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlY1wiKTtcbiAgfVxuXG4gIF9sYXN0TVNlY3MgPSBtc2VjcztcbiAgX2xhc3ROU2VjcyA9IG5zZWNzO1xuICBfY2xvY2tzZXEgPSBjbG9ja3NlcTsgLy8gUGVyIDQuMS40IC0gQ29udmVydCBmcm9tIHVuaXggZXBvY2ggdG8gR3JlZ29yaWFuIGVwb2NoXG5cbiAgbXNlY3MgKz0gMTIyMTkyOTI4MDAwMDA7IC8vIGB0aW1lX2xvd2BcblxuICB2YXIgdGwgPSAoKG1zZWNzICYgMHhmZmZmZmZmKSAqIDEwMDAwICsgbnNlY3MpICUgMHgxMDAwMDAwMDA7XG4gIGJbaSsrXSA9IHRsID4+PiAyNCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiAxNiAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdGwgJiAweGZmOyAvLyBgdGltZV9taWRgXG5cbiAgdmFyIHRtaCA9IG1zZWNzIC8gMHgxMDAwMDAwMDAgKiAxMDAwMCAmIDB4ZmZmZmZmZjtcbiAgYltpKytdID0gdG1oID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdG1oICYgMHhmZjsgLy8gYHRpbWVfaGlnaF9hbmRfdmVyc2lvbmBcblxuICBiW2krK10gPSB0bWggPj4+IDI0ICYgMHhmIHwgMHgxMDsgLy8gaW5jbHVkZSB2ZXJzaW9uXG5cbiAgYltpKytdID0gdG1oID4+PiAxNiAmIDB4ZmY7IC8vIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYCAoUGVyIDQuMi4yIC0gaW5jbHVkZSB2YXJpYW50KVxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxID4+PiA4IHwgMHg4MDsgLy8gYGNsb2NrX3NlcV9sb3dgXG5cbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmOyAvLyBgbm9kZWBcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuXG4gIHJldHVybiBidWYgfHwgc3RyaW5naWZ5KGIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2MTsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcblxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZTsiLCJpbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlLmpzJztcblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCB2YXIgRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgdmFyIFVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIGhhc2hmdW5jKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCh2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXNwYWNlID0gcGFyc2UobmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH0gLy8gQ29tcHV0ZSBoYXNoIG9mIG5hbWVzcGFjZSBhbmQgdmFsdWUsIFBlciA0LjNcbiAgICAvLyBGdXR1cmU6IFVzZSBzcHJlYWQgc3ludGF4IHdoZW4gc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGUuZy4gYGJ5dGVzID1cbiAgICAvLyBoYXNoZnVuYyhbLi4ubmFtZXNwYWNlLCAuLi4gdmFsdWVdKWBcblxuXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcblxuICAgIGlmIChidWYpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ2lmeShieXRlcyk7XG4gIH0gLy8gRnVuY3Rpb24jbmFtZSBpcyBub3Qgc2V0dGFibGUgb24gc29tZSBwbGF0Zm9ybXMgKCMyNzApXG5cblxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gIH0gY2F0Y2ggKGVycikge30gLy8gRm9yIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0IHN1cHBvcnRcblxuXG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiLypcbiAqIEJyb3dzZXItY29tcGF0aWJsZSBKYXZhU2NyaXB0IE1ENVxuICpcbiAqIE1vZGlmaWNhdGlvbiBvZiBKYXZhU2NyaXB0IE1ENVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvSmF2YVNjcmlwdC1NRDVcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb25cbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2VcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXG4gKiBWZXJzaW9uIDIuMiBDb3B5cmlnaHQgKEMpIFBhdWwgSm9obnN0b24gMTk5OSAtIDIwMDlcbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cbiAqL1xuZnVuY3Rpb24gbWQ1KGJ5dGVzKSB7XG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShtc2cubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlc1tpXSA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZDVUb0hleEVuY29kZWRBcnJheSh3b3Jkc1RvTWQ1KGJ5dGVzVG9Xb3JkcyhieXRlcyksIGJ5dGVzLmxlbmd0aCAqIDgpKTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNVRvSGV4RW5jb2RlZEFycmF5KGlucHV0KSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGxlbmd0aDMyID0gaW5wdXQubGVuZ3RoICogMzI7XG4gIHZhciBoZXhUYWIgPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgdmFyIHggPSBpbnB1dFtpID4+IDVdID4+PiBpICUgMzIgJiAweGZmO1xuICAgIHZhciBoZXggPSBwYXJzZUludChoZXhUYWIuY2hhckF0KHggPj4+IDQgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpLCAxNik7XG4gICAgb3V0cHV0LnB1c2goaGV4KTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZSBvdXRwdXQgbGVuZ3RoIHdpdGggcGFkZGluZyBhbmQgYml0IGxlbmd0aFxuICovXG5cblxuZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoOCkge1xuICByZXR1cm4gKGlucHV0TGVuZ3RoOCArIDY0ID4+PiA5IDw8IDQpICsgMTQgKyAxO1xufVxuLypcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMsIGFuZCBhIGJpdCBsZW5ndGguXG4gKi9cblxuXG5mdW5jdGlvbiB3b3Jkc1RvTWQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4W2dldE91dHB1dExlbmd0aChsZW4pIC0gMV0gPSBsZW47XG4gIHZhciBhID0gMTczMjU4NDE5MztcbiAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICB2YXIgZCA9IDI3MTczMzg3ODtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgdmFyIG9sZGEgPSBhO1xuICAgIHZhciBvbGRiID0gYjtcbiAgICB2YXIgb2xkYyA9IGM7XG4gICAgdmFyIG9sZGQgPSBkO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2ldLCA3LCAtNjgwODc2OTM2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE3LCA2MDYxMDU4MTkpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAzXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgNF0sIDcsIC0xNzY0MTg4OTcpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA1XSwgMTIsIDEyMDAwODA0MjYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNywgMTc3MDAzNTQxNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDldLCAxMiwgLTE5NTg0MTQ0MTcpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE3LCAtNDIwNjMpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNywgMTgwNDYwMzY4Mik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTVdLCAyMiwgMTIzNjUzNTMyOSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgNV0sIDQsIC0zNzg1NTgpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNiwgMTgzOTAzMDU2Mik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDE0XSwgMjMsIC0zNTMwOTU1Nik7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDRdLCAxMSwgMTI3Mjg5MzM1Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNiwgLTE1NTQ5NzYzMik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMTNdLCA0LCA2ODEyNzkxNzQpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2ldLCAxMSwgLTM1ODUzNzIyMik7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2ldLCA2LCAtMTk4NjMwODQ0KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgN10sIDEwLCAxMTI2ODkxNDE1KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA1XSwgMjEsIC01NzQzNDA1NSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNiwgMTcwMDQ4NTU3MSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE1LCAtMTA1MTUyMyk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNiwgMTg3MzMxMzM1OSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDE1XSwgMTAsIC0zMDYxMTc0NCk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNSwgLTE1NjAxOTgzODApO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxM10sIDIxLCAxMzA5MTUxNjQ5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgNF0sIDYsIC0xNDU1MjMwNzApO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNSwgNzE4Nzg3MjU5KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcbiAgICBhID0gc2FmZUFkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZUFkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZUFkZChjLCBvbGRjKTtcbiAgICBkID0gc2FmZUFkZChkLCBvbGRkKTtcbiAgfVxuXG4gIHJldHVybiBbYSwgYiwgYywgZF07XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBieXRlcyB0byBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKiBDaGFyYWN0ZXJzID4yNTUgaGF2ZSB0aGVpciBoaWdoLWJ5dGUgc2lsZW50bHkgaWdub3JlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJ5dGVzVG9Xb3JkcyhpbnB1dCkge1xuICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGxlbmd0aDggPSBpbnB1dC5sZW5ndGggKiA4O1xuICB2YXIgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGdldE91dHB1dExlbmd0aChsZW5ndGg4KSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg4OyBpICs9IDgpIHtcbiAgICBvdXRwdXRbaSA+PiA1XSB8PSAoaW5wdXRbaSAvIDhdICYgMHhmZikgPDwgaSAlIDMyO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qXG4gKiBBZGQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9ucyBpbnRlcm5hbGx5XG4gKiB0byB3b3JrIGFyb3VuZCBidWdzIGluIHNvbWUgSlMgaW50ZXJwcmV0ZXJzLlxuICovXG5cblxuZnVuY3Rpb24gc2FmZUFkZCh4LCB5KSB7XG4gIHZhciBsc3cgPSAoeCAmIDB4ZmZmZikgKyAoeSAmIDB4ZmZmZik7XG4gIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgcmV0dXJuIG1zdyA8PCAxNiB8IGxzdyAmIDB4ZmZmZjtcbn1cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cblxuXG5mdW5jdGlvbiBiaXRSb3RhdGVMZWZ0KG51bSwgY250KSB7XG4gIHJldHVybiBudW0gPDwgY250IHwgbnVtID4+PiAzMiAtIGNudDtcbn1cbi8qXG4gKiBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBmb3VyIGJhc2ljIG9wZXJhdGlvbnMgdGhlIGFsZ29yaXRobSB1c2VzLlxuICovXG5cblxuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5cbmZ1bmN0aW9uIG1kNWZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgYyB8IH5iICYgZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWdnKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgZCB8IGMgJiB+ZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVpaShhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYyBeIChiIHwgfmQpLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWQ1OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IG1kNSBmcm9tICcuL21kNS5qcyc7XG52YXIgdjMgPSB2MzUoJ3YzJywgMHgzMCwgbWQ1KTtcbmV4cG9ydCBkZWZhdWx0IHYzOyIsIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImV4cG9ydCBkZWZhdWx0ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8qKlxyXG4qIHZrQmVhdXRpZnkgLSBqYXZhc2NyaXB0IHBsdWdpbiB0byBwcmV0dHktcHJpbnQgb3IgbWluaWZ5IHRleHQgaW4gWE1MLCBKU09OLCBDU1MgYW5kIFNRTCBmb3JtYXRzLlxyXG4qXHJcbiogQ29weXJpZ2h0IChjKSAyMDEyIFZhZGltIEtpcnl1a2hpblxyXG4qIHZraXJ5dWtoaW4gQCBnbWFpbC5jb21cclxuKiBodHRwOi8vd3d3LmVzbGluc3RydWN0b3IubmV0L3ZrYmVhdXRpZnkvXHJcbipcclxuKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczpcclxuKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcbiogICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWxcclxuKlxyXG4qICAgUHJldHR5IHByaW50XHJcbipcclxuKiAgICAgICAgdmtiZWF1dGlmeS54bWwodGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuanNvbih0ZXh0IFssaW5kZW50X3BhdHRlcm5dKTtcclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3ModGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsKHRleHQgWyxpbmRlbnRfcGF0dGVybl0pO1xyXG4qXHJcbiogICAgICAgIEB0ZXh0IC0gU3RyaW5nOyB0ZXh0IHRvIGJlYXR1Znk7XHJcbiogICAgICAgIEBpbmRlbnRfcGF0dGVybiAtIEludGVnZXIgfCBTdHJpbmc7XHJcbiogICAgICAgICAgICAgICAgSW50ZWdlcjogIG51bWJlciBvZiB3aGl0ZSBzcGFjZXM7XHJcbiogICAgICAgICAgICAgICAgU3RyaW5nOiAgIGNoYXJhY3RlciBzdHJpbmcgdG8gdmlzdWFsaXplIGluZGVudGF0aW9uICggY2FuIGFsc28gYmUgYSBzZXQgb2Ygd2hpdGUgc3BhY2VzIClcclxuKiAgIE1pbmlmeVxyXG4qXHJcbiogICAgICAgIHZrYmVhdXRpZnkueG1sbWluKHRleHQgWyxwcmVzZXJ2ZV9jb21tZW50c10pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb25taW4odGV4dCk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuY3NzbWluKHRleHQgWyxwcmVzZXJ2ZV9jb21tZW50c10pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5LnNxbG1pbih0ZXh0KTtcclxuKlxyXG4qICAgICAgICBAdGV4dCAtIFN0cmluZzsgdGV4dCB0byBtaW5pZnk7XHJcbiogICAgICAgIEBwcmVzZXJ2ZV9jb21tZW50cyAtIEJvb2w7IFtvcHRpb25hbF07XHJcbiogICAgICAgICAgICAgICAgU2V0IHRoaXMgZmxhZyB0byB0cnVlIHRvIHByZXZlbnQgcmVtb3ZpbmcgY29tbWVudHMgZnJvbSBAdGV4dCAoIG1pbnhtbCBhbmQgbWluY3NzIGZ1bmN0aW9ucyBvbmx5LiApXHJcbipcclxuKiAgIEV4YW1wbGVzOlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbCh0ZXh0KTsgLy8gcHJldHR5IHByaW50IFhNTFxyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb24odGV4dCwgNCApOyAvLyBwcmV0dHkgcHJpbnQgSlNPTlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LmNzcyh0ZXh0LCAnLiAuIC4gLicpOyAvLyBwcmV0dHkgcHJpbnQgQ1NTXHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsKHRleHQsICctLS0tJyk7IC8vIHByZXR0eSBwcmludCBTUUxcclxuKlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbG1pbih0ZXh0LCB0cnVlKTsvLyBtaW5pZnkgWE1MLCBwcmVzZXJ2ZSBjb21tZW50c1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb25taW4odGV4dCk7Ly8gbWluaWZ5IEpTT05cclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3NtaW4odGV4dCk7Ly8gbWluaWZ5IENTUywgcmVtb3ZlIGNvbW1lbnRzICggZGVmYXVsdCApXHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsbWluKHRleHQpOy8vIG1pbmlmeSBTUUxcclxuKlxyXG4qL1xyXG5mdW5jdGlvbiBjcmVhdGVTaGlmdEFycihzdGVwKSB7XHJcblxyXG5cdHZhciBzcGFjZSA9ICcgICAgJztcclxuXHJcblx0aWYgKCBpc05hTihwYXJzZUludChzdGVwKSkgKSB7ICAvLyBhcmd1bWVudCBpcyBzdHJpbmdcclxuXHRcdHNwYWNlID0gc3RlcDtcclxuXHR9IGVsc2UgeyAvLyBhcmd1bWVudCBpcyBpbnRlZ2VyXHJcblx0XHRzd2l0Y2goc3RlcCkge1xyXG5cdFx0XHRjYXNlIDE6IHNwYWNlID0gJyAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSAyOiBzcGFjZSA9ICcgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDM6IHNwYWNlID0gJyAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDQ6IHNwYWNlID0gJyAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA1OiBzcGFjZSA9ICcgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDY6IHNwYWNlID0gJyAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDc6IHNwYWNlID0gJyAgICAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA4OiBzcGFjZSA9ICcgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDk6IHNwYWNlID0gJyAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDEwOiBzcGFjZSA9ICcgICAgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTE6IHNwYWNlID0gJyAgICAgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTI6IHNwYWNlID0gJyAgICAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dmFyIHNoaWZ0ID0gWydcXG4nXTsgLy8gYXJyYXkgb2Ygc2hpZnRzXHJcblx0Zm9yKHZhciBpeD0wO2l4PDEwMDtpeCsrKSB7XHJcblx0XHRzaGlmdC5wdXNoKHNoaWZ0W2l4XStzcGFjZSk7XHJcblx0fVxyXG5cdHJldHVybiBzaGlmdDtcclxufVxyXG5cclxuZnVuY3Rpb24gdmtiZWF1dGlmeSgpe1xyXG5cdHRoaXMuc3RlcCA9ICcgICAgJzsgLy8gNCBzcGFjZXNcclxuXHR0aGlzLnNoaWZ0ID0gY3JlYXRlU2hpZnRBcnIodGhpcy5zdGVwKTtcclxufTtcclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLnhtbCA9IGZ1bmN0aW9uKHRleHQsc3RlcCkge1xyXG5cclxuXHR2YXIgYXIgPSB0ZXh0LnJlcGxhY2UoLz5cXHN7MCx9PC9nLFwiPjxcIilcclxuXHRcdFx0XHQgLnJlcGxhY2UoLzwvZyxcIn46On48XCIpXHJcblx0XHRcdFx0IC5yZXBsYWNlKC9cXHMqeG1sbnNcXDovZyxcIn46On54bWxuczpcIilcclxuXHRcdFx0XHQgLnJlcGxhY2UoL1xccyp4bWxuc1xcPS9nLFwifjo6fnhtbG5zPVwiKVxyXG5cdFx0XHRcdCAuc3BsaXQoJ346On4nKSxcclxuXHRcdGxlbiA9IGFyLmxlbmd0aCxcclxuXHRcdGluQ29tbWVudCA9IGZhbHNlLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHRzdHIgPSAnJyxcclxuXHRcdGl4ID0gMCxcclxuXHRcdHNoaWZ0ID0gc3RlcCA/IGNyZWF0ZVNoaWZ0QXJyKHN0ZXApIDogdGhpcy5zaGlmdDtcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cdFx0XHQvLyBzdGFydCBjb21tZW50IG9yIDwhW0NEQVRBWy4uLl1dPiBvciA8IURPQ1RZUEUgLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvPCEvKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0XHRpbkNvbW1lbnQgPSB0cnVlO1xyXG5cdFx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cclxuXHRcdFx0XHRpZihhcltpeF0uc2VhcmNoKC8tLT4vKSA+IC0xIHx8IGFyW2l4XS5zZWFyY2goL1xcXT4vKSA+IC0xIHx8IGFyW2l4XS5zZWFyY2goLyFET0NUWVBFLykgPiAtMSApIHtcclxuXHRcdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvLS0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC9cXF0+LykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBhcltpeF07XHJcblx0XHRcdFx0aW5Db21tZW50ID0gZmFsc2U7XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyA8ZWxtPjwvZWxtPiAvL1xyXG5cdFx0XHRpZiggL148XFx3Ly5leGVjKGFyW2l4LTFdKSAmJiAvXjxcXC9cXHcvLmV4ZWMoYXJbaXhdKSAmJlxyXG5cdFx0XHRcdC9ePFtcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXgtMV0pID09IC9ePFxcL1tcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXhdKVswXS5yZXBsYWNlKCcvJywnJykpIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHRcdGlmKCFpbkNvbW1lbnQpIGRlZXAtLTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdCAvLyA8ZWxtPiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFx3LykgPiAtMSAmJiBhcltpeF0uc2VhcmNoKC88XFwvLykgPT0gLTEgJiYgYXJbaXhdLnNlYXJjaCgvXFwvPi8pID09IC0xICkge1xyXG5cdFx0XHRcdHN0ciA9ICFpbkNvbW1lbnQgPyBzdHIgKz0gc2hpZnRbZGVlcCsrXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0IC8vIDxlbG0+Li4uPC9lbG0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzxcXHcvKSA+IC0xICYmIGFyW2l4XS5zZWFyY2goLzxcXC8vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPC9lbG0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzxcXC8vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFstLWRlZXBdK2FyW2l4XSA6IHN0ciArPSBhcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyA8ZWxtLz4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvXFwvPi8pID4gLTEgKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPD8geG1sIC4uLiA/PiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFw/LykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyB4bWxucyAvL1xyXG5cdFx0XHRpZiggYXJbaXhdLnNlYXJjaCgveG1sbnNcXDovKSA+IC0xICB8fCBhcltpeF0uc2VhcmNoKC94bWxuc1xcPS8pID4gLTEpIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdHJldHVybiAgKHN0clswXSA9PSAnXFxuJykgPyBzdHIuc2xpY2UoMSkgOiBzdHI7XHJcbn1cclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLmpzb24gPSBmdW5jdGlvbih0ZXh0LHN0ZXApIHtcclxuXHJcblx0dmFyIHN0ZXAgPSBzdGVwID8gc3RlcCA6IHRoaXMuc3RlcDtcclxuXHJcblx0aWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJyApIHJldHVybiB0ZXh0O1xyXG5cclxuXHRpZiAoIHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiICkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGV4dCksIG51bGwsIHN0ZXApO1xyXG5cdGlmICggdHlwZW9mIHRleHQgPT09IFwib2JqZWN0XCIgKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGV4dCwgbnVsbCwgc3RlcCk7XHJcblxyXG5cdHJldHVybiB0ZXh0OyAvLyB0ZXh0IGlzIG5vdCBzdHJpbmcgbm9yIG9iamVjdFxyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5jc3MgPSBmdW5jdGlvbih0ZXh0LCBzdGVwKSB7XHJcblxyXG5cdHZhciBhciA9IHRleHQucmVwbGFjZSgvXFxzezEsfS9nLCcgJylcclxuXHRcdFx0XHQucmVwbGFjZSgvXFx7L2csXCJ7fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXH0vZyxcIn46On59fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXDsvZyxcIjt+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcL1xcKi9nLFwifjo6fi8qXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcKlxcLy9nLFwiKi9+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL346On5cXHN7MCx9fjo6fi9nLFwifjo6flwiKVxyXG5cdFx0XHRcdC5zcGxpdCgnfjo6ficpLFxyXG5cdFx0bGVuID0gYXIubGVuZ3RoLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHRzdHIgPSAnJyxcclxuXHRcdGl4ID0gMCxcclxuXHRcdHNoaWZ0ID0gc3RlcCA/IGNyZWF0ZVNoaWZ0QXJyKHN0ZXApIDogdGhpcy5zaGlmdDtcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cclxuXHRcdFx0aWYoIC9cXHsvLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcCsrXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFstLWRlZXBdK2FyW2l4XTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdGlmKCAvXFwqXFxcXC8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxuezEsfS8sJycpO1xyXG59XHJcblxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmZ1bmN0aW9uIGlzU3VicXVlcnkoc3RyLCBwYXJlbnRoZXNpc0xldmVsKSB7XHJcblx0cmV0dXJuICBwYXJlbnRoZXNpc0xldmVsIC0gKHN0ci5yZXBsYWNlKC9cXCgvZywnJykubGVuZ3RoIC0gc3RyLnJlcGxhY2UoL1xcKS9nLCcnKS5sZW5ndGggKVxyXG59XHJcblxyXG5mdW5jdGlvbiBzcGxpdF9zcWwoc3RyLCB0YWIpIHtcclxuXHJcblx0cmV0dXJuIHN0ci5yZXBsYWNlKC9cXHN7MSx9L2csXCIgXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQU5EIC9pZyxcIn46On5cIit0YWIrdGFiK1wiQU5EIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQkVUV0VFTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiQkVUV0VFTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIENBU0UgL2lnLFwifjo6flwiK3RhYitcIkNBU0UgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBFTFNFIC9pZyxcIn46On5cIit0YWIrXCJFTFNFIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gRU5EIC9pZyxcIn46On5cIit0YWIrXCJFTkQgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBGUk9NIC9pZyxcIn46On5GUk9NIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gR1JPVVBcXHN7MSx9QlkvaWcsXCJ+Ojp+R1JPVVAgQlkgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBIQVZJTkcgL2lnLFwifjo6fkhBVklORyBcIilcclxuXHRcdFx0XHQvLy5yZXBsYWNlKC8gU0VUIC9pZyxcIiBTRVR+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBJTiAvaWcsXCIgSU4gXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSk9JTiAvaWcsXCJ+Ojp+Sk9JTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIENST1NTfjo6fnsxLH1KT0lOIC9pZyxcIn46On5DUk9TUyBKT0lOIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSU5ORVJ+Ojp+ezEsfUpPSU4gL2lnLFwifjo6fklOTkVSIEpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBMRUZUfjo6fnsxLH1KT0lOIC9pZyxcIn46On5MRUZUIEpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBSSUdIVH46On57MSx9Sk9JTiAvaWcsXCJ+Ojp+UklHSFQgSk9JTiBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiT04gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPUiAvaWcsXCJ+Ojp+XCIrdGFiK3RhYitcIk9SIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gT1JERVJcXHN7MSx9QlkvaWcsXCJ+Ojp+T1JERVIgQlkgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPVkVSIC9pZyxcIn46On5cIit0YWIrXCJPVkVSIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvXFwoXFxzezAsfVNFTEVDVCAvaWcsXCJ+Ojp+KFNFTEVDVCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvXFwpXFxzezAsfVNFTEVDVCAvaWcsXCIpfjo6flNFTEVDVCBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBUSEVOIC9pZyxcIiBUSEVOfjo6flwiK3RhYitcIlwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVU5JT04gL2lnLFwifjo6flVOSU9Ofjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVVNJTkcgL2lnLFwifjo6flVTSU5HIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gV0hFTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiV0hFTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdIRVJFIC9pZyxcIn46On5XSEVSRSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdJVEggL2lnLFwifjo6fldJVEggXCIpXHJcblxyXG5cdFx0XHRcdC8vLnJlcGxhY2UoL1xcLFxcc3swLH1cXCgvaWcsXCIsfjo6figgXCIpXHJcblx0XHRcdFx0Ly8ucmVwbGFjZSgvXFwsL2lnLFwiLH46On5cIit0YWIrdGFiK1wiXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQUxMIC9pZyxcIiBBTEwgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBBUyAvaWcsXCIgQVMgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBBU0MgL2lnLFwiIEFTQyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIERFU0MgL2lnLFwiIERFU0MgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBESVNUSU5DVCAvaWcsXCIgRElTVElOQ1QgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBFWElTVFMgL2lnLFwiIEVYSVNUUyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIE5PVCAvaWcsXCIgTk9UIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gTlVMTCAvaWcsXCIgTlVMTCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIExJS0UgL2lnLFwiIExJS0UgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcc3swLH1TRUxFQ1QgL2lnLFwiU0VMRUNUIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXHN7MCx9VVBEQVRFIC9pZyxcIlVQREFURSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFNFVCAvaWcsXCIgU0VUIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvfjo6fnsxLH0vZyxcIn46On5cIilcclxuXHRcdFx0XHQuc3BsaXQoJ346On4nKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuc3FsID0gZnVuY3Rpb24odGV4dCxzdGVwKSB7XHJcblxyXG5cdHZhciBhcl9ieV9xdW90ZSA9IHRleHQucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXCcvaWcsXCJ+Ojp+XFwnXCIpXHJcblx0XHRcdFx0XHRcdFx0LnNwbGl0KCd+Ojp+JyksXHJcblx0XHRsZW4gPSBhcl9ieV9xdW90ZS5sZW5ndGgsXHJcblx0XHRhciA9IFtdLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHR0YWIgPSB0aGlzLnN0ZXAsLy8rdGhpcy5zdGVwLFxyXG5cdFx0aW5Db21tZW50ID0gdHJ1ZSxcclxuXHRcdGluUXVvdGUgPSBmYWxzZSxcclxuXHRcdHBhcmVudGhlc2lzTGV2ZWwgPSAwLFxyXG5cdFx0c3RyID0gJycsXHJcblx0XHRpeCA9IDAsXHJcblx0XHRzaGlmdCA9IHN0ZXAgPyBjcmVhdGVTaGlmdEFycihzdGVwKSA6IHRoaXMuc2hpZnQ7O1xyXG5cclxuXHRcdGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XHJcblx0XHRcdGlmKGl4JTIpIHtcclxuXHRcdFx0XHRhciA9IGFyLmNvbmNhdChhcl9ieV9xdW90ZVtpeF0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyID0gYXIuY29uY2F0KHNwbGl0X3NxbChhcl9ieV9xdW90ZVtpeF0sIHRhYikgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGxlbiA9IGFyLmxlbmd0aDtcclxuXHRcdGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XHJcblxyXG5cdFx0XHRwYXJlbnRoZXNpc0xldmVsID0gaXNTdWJxdWVyeShhcltpeF0sIHBhcmVudGhlc2lzTGV2ZWwpO1xyXG5cclxuXHRcdFx0aWYoIC9cXHN7MCx9XFxzezAsfVNFTEVDVFxcc3swLH0vLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRhcltpeF0gPSBhcltpeF0ucmVwbGFjZSgvXFwsL2csXCIsXFxuXCIrdGFiK3RhYitcIlwiKVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiggL1xcc3swLH1cXHN7MCx9U0VUXFxzezAsfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdGFyW2l4XSA9IGFyW2l4XS5yZXBsYWNlKC9cXCwvZyxcIixcXG5cIit0YWIrdGFiK1wiXCIpXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKCAvXFxzezAsfVxcKFxcc3swLH1TRUxFQ1RcXHN7MCx9Ly5leGVjKGFyW2l4XSkpICB7XHJcblx0XHRcdFx0ZGVlcCsrO1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcJy8uZXhlYyhhcltpeF0pICkgIHtcclxuXHRcdFx0XHRpZihwYXJlbnRoZXNpc0xldmVsPDEgJiYgZGVlcCkge1xyXG5cdFx0XHRcdFx0ZGVlcC0tO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHRcdGlmKHBhcmVudGhlc2lzTGV2ZWw8MSAmJiBkZWVwKSB7XHJcblx0XHRcdFx0XHRkZWVwLS07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHZhciBqdW5rID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHRzdHIgPSBzdHIucmVwbGFjZSgvXlxcbnsxLH0vLCcnKS5yZXBsYWNlKC9cXG57MSx9L2csXCJcXG5cIik7XHJcblx0XHRyZXR1cm4gc3RyO1xyXG59XHJcblxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUueG1sbWluID0gZnVuY3Rpb24odGV4dCwgcHJlc2VydmVDb21tZW50cykge1xyXG5cclxuXHR2YXIgc3RyID0gcHJlc2VydmVDb21tZW50cyA/IHRleHRcclxuXHRcdFx0XHRcdFx0XHQgICA6IHRleHQucmVwbGFjZSgvXFw8IVsgXFxyXFxuXFx0XSooLS0oW15cXC1dfFtcXHJcXG5dfC1bXlxcLV0pKi0tWyBcXHJcXG5cXHRdKilcXD4vZyxcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgLnJlcGxhY2UoL1sgXFxyXFxuXFx0XXsxLH14bWxucy9nLCAnIHhtbG5zJyk7XHJcblx0cmV0dXJuICBzdHIucmVwbGFjZSgvPlxcc3swLH08L2csXCI+PFwiKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuanNvbm1pbiA9IGZ1bmN0aW9uKHRleHQpIHtcclxuXHJcblx0aWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJyApIHJldHVybiB0ZXh0O1xyXG5cclxuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZSh0ZXh0KSwgbnVsbCwgMCk7XHJcblxyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5jc3NtaW4gPSBmdW5jdGlvbih0ZXh0LCBwcmVzZXJ2ZUNvbW1lbnRzKSB7XHJcblxyXG5cdHZhciBzdHIgPSBwcmVzZXJ2ZUNvbW1lbnRzID8gdGV4dFxyXG5cdFx0XHRcdFx0XHRcdCAgIDogdGV4dC5yZXBsYWNlKC9cXC9cXCooW14qXXxbXFxyXFxuXXwoXFwqKyhbXiovXXxbXFxyXFxuXSkpKSpcXCorXFwvL2csXCJcIikgO1xyXG5cclxuXHRyZXR1cm4gc3RyLnJlcGxhY2UoL1xcc3sxLH0vZywnICcpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xce1xcc3sxLH0vZyxcIntcIilcclxuXHRcdFx0ICAucmVwbGFjZSgvXFx9XFxzezEsfS9nLFwifVwiKVxyXG5cdFx0XHQgIC5yZXBsYWNlKC9cXDtcXHN7MSx9L2csXCI7XCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcL1xcKlxcc3sxLH0vZyxcIi8qXCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcKlxcL1xcc3sxLH0vZyxcIiovXCIpO1xyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5zcWxtaW4gPSBmdW5jdGlvbih0ZXh0KSB7XHJcblx0cmV0dXJuIHRleHQucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKS5yZXBsYWNlKC9cXHN7MSx9XFwoLyxcIihcIikucmVwbGFjZSgvXFxzezEsfVxcKS8sXCIpXCIpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyB2a2JlYXV0aWZ5KCk7XHJcbiIsImV4cG9ydCBjb25zdCB1cGxvYWRBcmVhSFRNTCA9IFxuICBgPGRpdiBpZD1cImRvY3VtZW50LXVwbG9hZC1jb250YWluZXJcIj5cblxuICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9jb250YWluZXJcIj5cbiAgICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9hcmVhXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9tZXNzYWdlXCI+VXBsb2FkIEZpbGVzPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2IGlkPVwidXBsb2FkaW5nX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpbGVfY29udGFpbmVyXCIgaWQ9XCJ1bnBhaXJlZF9jb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXItdGl0bGVcIj5VbnBhaXJlZCBEb2N1bWVudHM8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZmlsZXNfY29udGFpbmVyXCI+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwibWVpX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPk1FSTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfc29ydF9uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2xpc3RcIiBpZD1cIm1laV9saXN0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX2NvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJhY2tncm91bmQ6ICNEQUVBRjE7IGJvcmRlci1yYWRpdXM6IDVweDtcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX2xhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX3JhZGlvXCIgbmFtZT1cIm1laV9yYWRpb19ncm91cFwiIHZhbHVlPVwiY3JlYXRlX21laVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi10b3A6IGF1dG87bWFyZ2luLWxlZnQ6IDNweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgbmV3IE1FSSBmaWxlXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBpZD1cImltYWdlX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPkltYWdlczwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfc29ydF9uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2xpc3RcIiBpZD1cImltYWdlX2xpc3RcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZ2VuZXJhdGUtcGFpci1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbl9idXR0b25cIiBpZD1cIm1ha2VfcGFpclwiPk1ha2UgUGFpcjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZV9jb250YWluZXJcIiBpZD1cInBhaXJlZF9jb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXItdGl0bGVcIj5QYWlyZWQgRm9saW9zPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX3NvcnRfbmFtZVwiPlxuICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb3J0X25hbWUgYXJyb3dfYnRuXCI+JiN4MjJDMDs8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb2xpb19saXN0XCIgaWQ9XCJwYWlyZWRfbGlzdFwiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJ1cGxvYWRfYnV0dG9uX2NvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25fYnV0dG9uXCIgaWQ9XCJ1cGxvYWRfYnV0dG9uXCI+XG4gICAgICAgICAgICBVcGxvYWRcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJ1cGxvYWRpbmdfc3Bpbm5lclwiPuKGuzwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS1cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2NvbnRhaW5lclwiIGlkPVwibWFudXNjcmlwdHNfY29udGFpbmVyXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPk1hbnVzY3JpcHRzPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbGlvX2xpc3RcIiBpZD1cIm1hbnVzY3JpcHRfbGlzdFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAtLT5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5gO1xuXG5leHBvcnQgY29uc3QgbmV3Rm9sZGVySFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwicmVuYW1lX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBpZD1cImRhc2hib2FyZF9pbnB1dF9jb250YWluZXJcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJlbmFtZV9idXR0b25zX2NvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FuY2VsX2Rhc2hib2FyZFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybV9kYXNoYm9hcmRcIj5DcmVhdGU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuXG5leHBvcnQgY29uc3QgcmVuYW1lSFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwicmVuYW1lX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBpZD1cImRhc2hib2FyZF9pbnB1dF9jb250YWluZXJcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJlbmFtZV9idXR0b25zX2NvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FuY2VsX2Rhc2hib2FyZFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybV9kYXNoYm9hcmRcIj5Db25maXJtPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDsiLCIvKiogQG1vZHVsZSBXYXJuaW5ncyAqL1xuXG4vKipcbiAqIFdhcm4gd2hlbiBncm91cGVkIG5ldW1lIGNvbXBvbmVudHMgZm9ybSBhbiB1bnJlY29nbml6ZWQgbmV1bWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cGluZ05vdFJlY29nbml6ZWQgKCk6IHZvaWQge1xuICBpZiAoISh3aW5kb3cuY29uZmlybSgnTmVvbiBkb2VzIG5vdCByZWNvZ25pemUgdGhpcyBuZXVtZSBncm91cGluZy4gV291bGQgeW91IGxpa2UgdG8gY3JlYXRlIGEgY29tcG91bmQgbmV1bWU/JykpKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZG8nKS5jbGljaygpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBTcGxpdEFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IHNlbGVjdEFsbCB9IGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuLi91dGlscy9EcmFnSGFuZGxlcic7XG5pbXBvcnQgeyBnZXRTVkdSZWxDb29yZHMgfSBmcm9tICcuLi91dGlscy9Db29yZGluYXRlcyc7XG5cbi8qKiBIYW5kbGUgc3BsaXR0aW5nIGEgc3RhZmYgaW50byB0d28gc3RhdmVzIHRocm91Z2ggVmVyb3Zpby4gKi9cbmV4cG9ydCBjbGFzcyBTcGxpdFN0YWZmSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcmVhZG9ubHkgc3RhZmY6IFNWR0dFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhZmYgLSBUaGUgc3RhZmYgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgc3RhZmY6IFNWR0dFbGVtZW50KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMuc3RhZmYgPSBzdGFmZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBwYXJ0IG9mIHRoZSBzcGxpdCBhY3Rpb24uXG4gICAqL1xuICBzdGFydFNwbGl0ICgpOiB2b2lkIHtcbiAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleXByZXNzZXNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xpY2sgV2hlcmUgdG8gU3BsaXQnKTtcbiAgfVxuXG4gIHNwbGl0RGlzYWJsZSAoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnJlc2V0SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2thd2F5SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBpbnB1dCB0byBzcGxpdCBhIHN0YWZmLiAqL1xuICBoYW5kbGVyID0gKChldnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAvLyBGaW5kIHN0YWZmIHBvaW50IGNvcnJlc3BvbmRzIHRvIGlmIG9uZSBleGlzdHNcbiAgICAvLyBUT0RPXG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YWZmLmlkO1xuICAgIGNvbnN0IGN1cnNvciA9IGdldFNWR1JlbENvb3JkcyhldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogU3BsaXRBY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdzcGxpdCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICB4OiBjdXJzb3IueFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gc3VjY2Vzc2Z1bCcsICdzdWNjZXNzJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLnN0YWZmJyk7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtpZH1gKV0sIHRoaXMubmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcblxuICAgICAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKTtcbiAgICAgIGlmIChtb3JlRWRpdCkge1xuICAgICAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdHMgc3BsaXQgb24gRXNjYXBlIHByZXNzLCBkaXNhYmxlcyBvbiBTaGlmdC4gKi9cbiAga2V5ZG93bkxpc3RlbmVyID0gKChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMuc3BsaXREaXNhYmxlKCk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVyLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKiBFeGl0IHNwbGl0IGlmIHVzZXIgY2xpY2tzIG9mZiBvZiBhY3RpdmUgcGFnZS4gKi9cbiAgY2xpY2thd2F5SGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5hY3RpdmUtcGFnZScpID09PSBudWxsKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogQ2FsbGVkIHRvIHJlYXBwbHkgdGhlIGV2ZW50IGxpc3RlbmVyIGlmIG5lY2Vzc2FyeS4gKi9cbiAgcmVzZXRIYW5kbGVyID0gKChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcbn1cbiIsImltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCB7IFNwbGl0TmV1bWVBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKiBIYW5kbGUgc3BsaXR0aW5nIGEgbmV1bWUgaW50byB0d28gbmV1bWVzIHRocm91Z2ggVmVyb3Zpby4gKi9cbmV4cG9ydCBjbGFzcyBTcGxpdE5ldW1lSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcmVhZG9ubHkgbmV1bWU6IFNWR0dFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbmV1bWUgLSBUaGUgbmV1bWUgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgbmV1bWU6IFNWR0dFbGVtZW50KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMubmV1bWUgPSBuZXVtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBwYXJ0IG9mIHRoZSBzcGxpdCBhY3Rpb24uXG4gICAqL1xuICBzdGFydFNwbGl0ICgpOiB2b2lkIHtcbiAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleXByZXNzZXNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xpY2sgVGhlIEJlZ2lubmluZyBvZiBUaGUgU2Vjb25kIE5ldW1lJyk7XG4gIH1cblxuICBzcGxpdERpc2FibGUgKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5yZXNldEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrYXdheUhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgaW5wdXQgdG8gc3BsaXQgYSBuZXVtZS4gKi9cbiAgaGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLm5ldW1lLmlkO1xuXG4gICAgLy8gdW5zZWxlY3QoKTtcbiAgICBcbiAgICBjb25zdCBuYyA9IChldnQudGFyZ2V0IGFzIFNWR0dFbGVtZW50KS5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnN0IG5jSWQgPSBuYy5pZDtcblxuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogU3BsaXROZXVtZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ3NwbGl0TmV1bWUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgbmNJZDogbmNJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gc3VjY2Vzc2Z1bCcsICdzdWNjZXNzJyk7XG4gICAgICB9IFxuICAgICAgZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gZmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgICAvLyB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAvLyBjb25zdCBkcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLm5ldW1lJyk7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgLy8gc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKSBhcyBTVkdHRWxlbWVudF0sIHRoaXMubmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcbiAgICAgIC8vIHRyeSB7XG4gICAgICAvLyAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgLy8gICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5jbGFzc0xpc3QuYWRkKCdpcy1oaWRkZW4nKTtcbiAgICAgIC8vIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSk7XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIEV4aXRzIHNwbGl0IG9uIEVzY2FwZSBwcmVzcywgZGlzYWJsZXMgb24gU2hpZnQuICovXG4gIGtleWRvd25MaXN0ZW5lciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdCBzcGxpdCBpZiB1c2VyIGNsaWNrcyBvZmYgb2YgYWN0aXZlIHBhZ2UuICovXG4gIGNsaWNrYXdheUhhbmRsZXIgPSAoKGV2dDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYWN0aXZlLXBhZ2UnKSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zcGxpdERpc2FibGUoKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIENhbGxlZCB0byByZWFwcGx5IHRoZSBldmVudCBsaXN0ZW5lciBpZiBuZWNlc3NhcnkuICovXG4gIHJlc2V0SGFuZGxlciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdTaGlmdCcpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLnRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0eXBlb2YgZ2xvYmFsLnF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBnbG9iYWwucXVldWVNaWNyb3Rhc2soZnVuYyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy9iYXNlZCBvZmYgcnN2cCBodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzXG4vL2xpY2Vuc2UgaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9tYXN0ZXIvbGliL3JzdnAvYXNhcC5qc1xuXG52YXIgTXV0YXRpb24gPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTXV0YXRpb247XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb24oaGFuZGxlKTtcbiAgdmFyIGVsZW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHtcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGVsZW1lbnQuZGF0YSA9IChjYWxsZWQgPSArK2NhbGxlZCAlIDIpO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAvLyB3ZSBjYW4gb25seSBnZXQgaGVyZSBpbiBJRTEwXG4gICAgLy8gd2hpY2ggZG9lc24ndCBoYW5kZWwgcG9zdE1lc3NhZ2Ugd2VsbFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAoZnVuYykge1xuICB2YXIgY2hhbm5lbCA9IG5ldyBnbG9iYWwuTWVzc2FnZUNoYW5uZWwoKTtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gIH07XG59OyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2RvY3VtZW50JyBpbiBnbG9iYWwgJiYgJ29ucmVhZHlzdGF0ZWNoYW5nZScgaW4gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXG4gICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICB2YXIgc2NyaXB0RWwgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0RWwub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlKCk7XG5cbiAgICAgIHNjcmlwdEVsLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICBzY3JpcHRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdEVsKTtcbiAgICAgIHNjcmlwdEVsID0gbnVsbDtcbiAgICB9O1xuICAgIGdsb2JhbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpO1xuXG4gICAgcmV0dXJuIGhhbmRsZTtcbiAgfTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydHMuaW5zdGFsbCA9IGZ1bmN0aW9uICh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dCh0LCAwKTtcbiAgfTtcbn07IiwiaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcbmltcG9ydCB7IEFsbERvY3MsIERvYywgdXBsb2Fkc0luZm8gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgKiBhcyBsb2NhbE1hbmlmZXN0IGZyb20gJy4uLy4uL2Fzc2V0cy9tYW5pZmVzdC5qc29uJztcblxuZXhwb3J0IGNvbnN0IGRiID0gbmV3IFBvdWNoREIoJ05lb24tVXNlci1TdG9yYWdlJyk7XG5cbmZ1bmN0aW9uIGdldEFsbERvY3VtZW50cygpOiBQcm9taXNlPEFsbERvY3M+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBkYi5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4gcmVzb2x2ZShyZXN1bHQpKVxuICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hVcGxvYWRzKCk6IFByb21pc2U8dXBsb2Fkc0luZm8+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBnZXRBbGxEb2N1bWVudHMoKTtcbiAgICByZXR1cm4gcmVzLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgIG5hbWU6IHJvdy5kb2MgPyByb3cuZG9jLm5hbWUgOiAndW5kZWZpbmVkJyxcbiAgICB9KSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKCdDb3VsZG5cXCd0IGZldGNoIHVwbG9hZGVkIGRvY3VtZW50cycsIGVyci5tZXNzYWdlKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hbmlmZXN0KGlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIG1laTogRmlsZSwgYmc6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobG9jYWxNYW5pZmVzdCkpO1xuICAgIG1hbmlmZXN0WydAaWQnXSA9IGlkO1xuICAgIG1hbmlmZXN0Wyd0aXRsZSddID0gdGl0bGU7XG4gICAgbWFuaWZlc3RbJ3RpbWVzdGFtcCddID0gKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBjb25zdCBtZWlQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCBtZWlSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgbWVpUmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUobWVpUmVhZGVyLnJlc3VsdCk7XG4gICAgICB9KTtcbiAgICAgIG1laVJlYWRlci5yZWFkQXNEYXRhVVJMKG1laSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBiZ1Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGJnUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIGJnUmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoYmdSZWFkZXIucmVzdWx0KTtcbiAgICAgIH0pO1xuICAgICAgYmdSZWFkZXIucmVhZEFzRGF0YVVSTChiZyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBtZWlVcmkgPSBhd2FpdCBtZWlQcm9taXNlO1xuICAgIGNvbnN0IGJnVXJpID0gYXdhaXQgYmdQcm9taXNlO1xuXG4gICAgbWFuaWZlc3RbJ2ltYWdlJ10gPSBiZ1VyaTtcbiAgICBtYW5pZmVzdFsnbWVpX2Fubm90YXRpb25zJ10gPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiB1dWlkdjQoKSxcbiAgICAgICAgdHlwZTogJ0Fubm90YXRpb24nLFxuICAgICAgICBib2R5OiBtZWlVcmksXG4gICAgICAgIHRhcmdldDogYmdVcmlcbiAgICAgIH1cbiAgICBdO1xuICAgIHJlc29sdmUobWFuaWZlc3QpO1xuICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZCBuZXcgZW50cnkgdG8gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0gaWQgXG4gKiBAcGFyYW0gdGl0bGUgXG4gKiBAcGFyYW0gY29udGVudCBcbiAqIEBwYXJhbSBzaW5nbGUgaXMgaXQgYSBzaW5nbGUgcGFnZSBvciBhIG1hbnVzY3JpcHRcbiAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERvY3VtZW50KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29udGVudDogQmxvYiwgc2luZ2xlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZGIucHV0KHtcbiAgICAgIF9pZDogaWQsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogc2luZ2xlID8gJ3BhZ2UnIDogJ21hbnVzY3JpcHQnLFxuICAgICAgX2F0dGFjaG1lbnRzOiB7XG4gICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgY29udGVudF90eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgICAgZGF0YTogY29udGVudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICByZXNvbHZlKHRydWUpO1xuICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICB3aW5kb3cuYWxlcnQoYEVycm9yIFVwbG9hZGluZyBEb2N1bWVudDogJHtlcnIubWVzc2FnZX0sIHRpdGxlOiAke25hbWV9LCBpZDogJHtpZH0uYCk7XG4gICAgICByZWplY3QoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxldGUgZW50cnkgZnJvbSB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSBpZCBcbiAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZURvY3VtZW50KGlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBkYi5nZXQoaWQpXG4gICAgICAudGhlbihkb2MgPT4ge1xuICAgICAgICBkYi5yZW1vdmUoZG9jKVxuICAgICAgICAgIC50aGVuKF8gPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIGRvYyBmcm9tIHRoZSBkYXRhYmFzZSAoc3VwcG9ydHMgb25seSB0aXRsZSBmb3Igbm93KVxuICogQHBhcmFtIGlkIFxuICogQHBhcmFtIG5ld05hbWUgXG4gKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEb2NOYW1lKGlkOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIFJldHJpZXZlIGRvYyBmcm9tIGRhdGFiYXNlICh0byBnZXQgX3JldilcbiAgICBkYi5nZXQ8RG9jPihpZCkudGhlbihkb2MgPT4ge1xuXG4gICAgICAvLyBSZXRyaWV2ZSBtYW5pZmVzdCBmcm9tIGRhdGFiYXNlXG4gICAgICBkYi5nZXRBdHRhY2htZW50KGlkLCAnbWFuaWZlc3QnKS50aGVuKChtYW5pZmVzdEJsb2I6IEJsb2IpID0+IHtcbiAgICAgICAgbWFuaWZlc3RCbG9iLnRleHQoKS50aGVuKG1hbmlmZXN0VGV4dCA9PiB7XG4gICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKG1hbmlmZXN0VGV4dCk7XG4gICAgXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSBtYW5pZmVzdFxuICAgICAgICAgIGRvYy5uYW1lID0gbmV3TmFtZTtcbiAgICAgICAgICBtYW5pZmVzdFsndGl0bGUnXSA9IG5ld05hbWU7XG4gICAgXG4gICAgICAgICAgLy8gQ29udmVydCBiYWNrIHRvIGJsb2JcbiAgICAgICAgICBjb25zdCBuZXdNYW5pZmVzdEJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicgfSk7XG5cbiAgICAgICAgICBkb2MuX2F0dGFjaG1lbnRzWydtYW5pZmVzdCddID0ge1xuICAgICAgICAgICAgY29udGVudF90eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgICAgICBkYXRhOiBuZXdNYW5pZmVzdEJsb2JcbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICAgIGRiLnB1dChkb2MpXG4gICAgICAgICAgICAudGhlbigoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7IC8vIGRiLnB1dFxuICAgICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpOyAvLyBtYW5pZmVzdFRleHRQcm9taXNlXG4gICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpOyAvLyBkYi5nZXRBdHRhY2htZW50XG4gICAgfSkuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTsgLy8gZGIuZ2V0XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgSUVudHJ5LCBJRmlsZSwgSUZvbGRlciwgRmlsZVN5c3RlbVRvb2xzIH0gZnJvbSAnLi9GaWxlU3lzdGVtJztcbmltcG9ydCB7IGRlbGV0ZURvY3VtZW50LCB1cGRhdGVEb2NOYW1lIH0gZnJvbSAnLi9TdG9yYWdlJztcbmltcG9ydCB7IEZpbGVTeXN0ZW1NYW5hZ2VyIH0gZnJvbSAnLi9GaWxlU3lzdGVtJztcbmltcG9ydCB7IFNoaWZ0U2VsZWN0aW9uTWFuYWdlciwgZGFzaGJvYXJkU3RhdGUgfSBmcm9tICcuL0Rhc2hib2FyZFRvb2xzJztcbmltcG9ydCB7IEluaXRVcGxvYWRBcmVhIH0gZnJvbSAnLi9VcGxvYWRBcmVhJztcbmltcG9ydCAqIGFzIGNvbnRleHRNZW51Q29udGVudCBmcm9tICcuL0NvbnRleHRNZW51Q29udGVudCc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvdywgTW9kYWxXaW5kb3dWaWV3IH0gZnJvbSAnLi4vdXRpbHMvTW9kYWxXaW5kb3cnO1xuXG5jb25zdCBkb2N1bWVudHNDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWNvbnRlbnQtY29udGFpbmVyJyk7XG5jb25zdCBiYWNrZ3JvdW5kQXJlYTogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFpbi1zZWN0aW9uLWNvbnRlbnQnKTtcbmNvbnN0IG9wZW5CdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI29wZW4tZG9jJyk7XG5jb25zdCByZW1vdmVCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3JlbW92ZS1kb2MnKTtcbmNvbnN0IG5hdlBhdGhDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25hdi1wYXRoLWNvbnRhaW5lcicpO1xubGV0IGJhY2tCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWJhY2stYnRuJyk7XG5sZXQgZW1wdHlCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWVtcHR5LWJ0bicpO1xubGV0IGRlbGV0ZUJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZnMtZGVsZXRlLWJ0bicpO1xuY29uc3QgdXBsb2FkRG9jdW1lbnRzQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN1cGxvYWQtbmV3LWRvYy1idXR0b24nKTtcbmNvbnN0IG5ld0ZvbGRlckJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYWRkLWZvbGRlci1idXR0b24nKTtcblxuY29uc3Qgc2hpZnRTZWxlY3Rpb24gPSBuZXcgU2hpZnRTZWxlY3Rpb25NYW5hZ2VyKCk7XG5jb25zdCBmc20gPSBGaWxlU3lzdGVtTWFuYWdlcigpO1xuY29uc3Qgc3RhdGUgPSBkYXNoYm9hcmRTdGF0ZSgpO1xuXG5jb25zdCBtYWluU2VjdGlvbjogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFpbi1zZWN0aW9uLWNvbnRlbnQnKTtcbmNvbnN0IGNvbnRleHRNZW51OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yaWdodC1jbGljay1maWxlLW1lbnUnKTtcbmNvbnN0IGNvbnRleHRNZW51Q29udGVudFdyYXBwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRleHQtbWVudS1pdGVtcy13cmFwcGVyJyk7XG5cbmxldCBtZXRhS2V5SXNQcmVzc2VkID0gZmFsc2U7XG5sZXQgc2hpZnRLZXlJc1ByZXNzZWQgPSBmYWxzZTtcbmxldCBjdXJyZW50RHJhZ1RhcmdldCA9IG51bGw7XG5sZXQgcmlnaHRDbGlja2VkID0gZmFsc2U7XG5cbm9wZW5CdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkRvY3NIYW5kbGVyKTtcbnJlbW92ZUJ1dHRvbj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZW1vdmVEb2NzSGFuZGxlcik7XG51cGxvYWREb2N1bWVudHNCdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlblVwbG9hZEFyZWFIYW5kbGVyKTtcbm5ld0ZvbGRlckJ1dHRvbj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuTmV3Rm9sZGVyV2luZG93KTtcblxuLy8gU29ydGluZyBhbGdvcml0aG1zXG4vLyBjb25zdCBzb3J0QnlBbHBoYW51bWVyaWNhbCA9IChhOiBJRW50cnksIGI6IElFbnRyeSkgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbi8vIGNvbnN0IHNvcnRCeVRpbWUgPSAoYTogSUVudHJ5LCBiOiBJRW50cnkpID0+IHtcbi8vICAgY29uc3QgYVRpbWUgPSBhLm1ldGFkYXRhWydjcmVhdGVkX29uJ107XG4vLyAgIGNvbnN0IGJUaW1lID0gYi5tZXRhZGF0YVsnY3JlYXRlZF9vbiddO1xuLy8gICBpZiAoYVRpbWUgJiYgYlRpbWUpIHJldHVybiBhVGltZSAtIGJUaW1lO1xuLy8gICBlbHNlIGlmIChhVGltZSkgcmV0dXJuIC0xO1xuLy8gfTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICBpZiAoZS5tZXRhS2V5KSBtZXRhS2V5SXNQcmVzc2VkID0gdHJ1ZTtcbiAgaWYgKGUuc2hpZnRLZXkpIHNoaWZ0S2V5SXNQcmVzc2VkID0gdHJ1ZTtcbiAgLy8gTG9zZSBmb2N1cyBvbiBlc2Mga2V5XG4gIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICB1bnNlbGVjdEFsbCgpO1xuICAgIHNoaWZ0U2VsZWN0aW9uLnJlc2V0KCk7XG4gICAgdXBkYXRlQWN0aW9uQmFyQnV0dG9ucygpO1xuICAgIHVwZGF0ZUZTQnV0dG9ucygpO1xuICB9XG59KTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGUpID0+IHtcbiAgaWYgKCFlLm1ldGFLZXkpIG1ldGFLZXlJc1ByZXNzZWQgPSBmYWxzZTtcbiAgaWYgKCFlLnNoaWZ0S2V5KSBzaGlmdEtleUlzUHJlc3NlZCA9IGZhbHNlO1xufSk7XG5cbmJhY2tncm91bmRBcmVhPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEVsZW1lbnQ7XG4gIC8vIExvc2UgZm9jdXMgaWYgY2xpY2sgZXZlbnQgaW4gbWFpbiBzZWN0aW9uIGlzIG5vdCBhIGRvY3VtZW50IHRpbGVcbiAgY29uc3QgaXNEb2N1bWVudCA9IEJvb2xlYW4odGFyZ2V0LmNsb3Nlc3QoJy5kb2N1bWVudC1lbnRyeScpKTtcbiAgaWYgKCFpc0RvY3VtZW50KSB7XG4gICAgdW5zZWxlY3RBbGwoKTtcbiAgICBzaGlmdFNlbGVjdGlvbi5yZXNldCgpO1xuICAgIHVwZGF0ZUFjdGlvbkJhckJ1dHRvbnMoKTtcbiAgICB1cGRhdGVGU0J1dHRvbnMoKTtcbiAgfVxufSk7XG5cbi8qKlxuICogXG4gKiBAcmV0dXJucyBcbiAqL1xuZnVuY3Rpb24gb3BlblVwbG9hZEFyZWFIYW5kbGVyKCkge1xuICBpZiAoIXVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG4gIEluaXRVcGxvYWRBcmVhKHN0YXRlLmdldFBhcmVudEZvbGRlcigpKTtcbn1cblxuXG4vKipcbiAqIE9wZW5zIGEgbmV3IHRhYiB3aXRoIHRoZSBOZW9uIGVkaXRvciBmb3IgdGhlIGdpdmVuIGlkXG4gKiBcbiAqIEBwYXJhbSBpZCBrZXkgb2YgZmlsZSBpbiBiYmIgb3IgbWFuaWZlc3QgdXJsXG4gKiBAcGFyYW0gaXNTYW1wbGUgYm9vbGVhbiB0byBkZWNpZGUgd2hlcmUgdG8gZmV0Y2ggZmlsZVxuICovXG5mdW5jdGlvbiBvcGVuRWRpdG9yVGFiKGlkOiBzdHJpbmcsIGlzU2FtcGxlOiBib29sZWFuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IChpc1NhbXBsZSlcbiAgICA/IHsgbWFuaWZlc3Q6IGlkIH1cbiAgICA6IHsgc3RvcmFnZTogaWQgfTtcbiAgY29uc3QgcXVlcnkgPSBtYWtlUXVlcnkocGFyYW1zKTtcbiAgd2luZG93Lm9wZW4oYC4vZWRpdG9yLmh0bWw/JHtxdWVyeX1gLCAnX2JsYW5rJyk7XG59XG5cblxuLyoqXG4gKiBPcGVucyBlZGl0b3IgdGFiIGdpdmVuIGEgZG9jdW1lbnQgdGlsZSBlbGVtZW50XG4gKiBcbiAqIEBwYXJhbSBlbnRyeSBcbiAqL1xuZnVuY3Rpb24gb3BlbkZpbGUoZW50cnk6IElGaWxlKSB7XG4gIGNvbnN0IGRvY3VtZW50VHlwZSA9IGVudHJ5Lm1ldGFkYXRhWydkb2N1bWVudCddO1xuICBpZiAodHlwZW9mIGRvY3VtZW50VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgaXNTYW1wbGUgPSBkb2N1bWVudFR5cGUgPT09ICdzYW1wbGUnO1xuICAgIG9wZW5FZGl0b3JUYWIoZW50cnkuaWQsIGlzU2FtcGxlKTtcbiAgfVxufVxuXG5cbi8qKlxuICogXG4gKiBAcGFyYW0gb2JqIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIG1ha2VRdWVyeShvYmopOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoa2V5ID0+IHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pO1xuICB9KS5qb2luKCcmJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSBpbmRleCBcbiAqL1xuZnVuY3Rpb24gc2VsZWN0KGluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgZW50cnkgPSBzdGF0ZS5nZXRFbnRyaWVzKCkuYXQoaW5kZXgpO1xuICBzdGF0ZS5zZXRTZWxlY3Rpb24oaW5kZXgsIHRydWUpO1xuICBjb25zdCB0aWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZW50cnkuaWQpO1xuICB0aWxlLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSBpbmRleCBcbiAqL1xuZnVuY3Rpb24gdW5zZWxlY3QoaW5kZXg6IG51bWJlcikge1xuICBjb25zdCBpZCA9IHN0YXRlLmdldEVudHJpZXMoKS5hdChpbmRleCkuaWQ7XG4gIHN0YXRlLnNldFNlbGVjdGlvbihpbmRleCwgZmFsc2UpO1xuICBjb25zdCB0aWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB0aWxlLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqL1xuZnVuY3Rpb24gdW5zZWxlY3RBbGwoKSB7XG4gIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRvY3VtZW50LWVudHJ5LnNlbGVjdGVkJykpXG4gICAgLmZvckVhY2goKHRpbGUpID0+IHRpbGUuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gIHN0YXRlLnJlc2V0U2VsZWN0aW9uKCk7XG59XG5cbi8qKiBcbiAqIENyZWF0ZXMgYSBmb2xkZXIgb3IgZmlsZSB0aWxlIGVsZW1lbnQgZ2l2ZW4gYW4gZW50cnlcbiAqIEBwYXJhbSBlbnRyeSBJRW50cnlcbiAqIEByZXR1cm5zIEhUTUxEaXZFbGVtZW50IHRpbGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBjcmVhdGVUaWxlKGVudHJ5OiBJRW50cnkpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkb2N1bWVudC1lbnRyeScpO1xuICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpOyAvLyBtYWtlIGZpbGUgb3IgZm9sZGVyIGRyYWdnYWJsZVxuXG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgaWNvbi5jbGFzc0xpc3QuYWRkKCdkb2N1bWVudC1pY29uJyk7XG4gIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbmFtZS5pbm5lclRleHQgPSBlbnRyeS5uYW1lO1xuXG4gIHN3aXRjaCAoZW50cnkudHlwZSkge1xuICAgIGNhc2UgJ2ZvbGRlcic6XG4gICAgICAvLyBzZXQgdHlwZSBhdHRyaWIgYW5kIGlkXG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZm9sZGVyLWVudHJ5Jyk7XG4gICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIGVudHJ5LmlkKTtcbiAgICAgIC8vIHNldCBpY29uXG4gICAgICBpY29uLnNyYyA9ICcuL05lb24tZ2gvYXNzZXRzL2ltZy9mb2xkZXItaWNvbi5zdmcnO1xuICAgICAgLy8gc2V0IGRyb3AgdGFyZ2V0IGF0dHJpYlxuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZHJvcC1pZCcsIGVudHJ5LmlkKTtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wLXRhcmdldCcpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndHJhc2gnOlxuICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2ZvbGRlci1lbnRyeScpO1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBlbnRyeS5pZCk7XG4gICAgICAvLyBzZXQgaWNvblxuICAgICAgaWNvbi5zcmMgPSAnLi9OZW9uLWdoL2Fzc2V0cy9pbWcvdHJhc2gtaWNvbi5zdmcnO1xuICAgICAgLy8gc2V0IGRyb3AgdGFyZ2V0IGF0dHJpYlxuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZHJvcC1pZCcsIGVudHJ5LmlkKTtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wLXRhcmdldCcpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmlsZSc6XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZmlsZS1lbnRyeScpO1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCAoZW50cnkgYXMgSUZpbGUpLmlkKTtcblxuICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGljb24gYW5kIGNsYXNzIHRvIGFkZCBkZXBlbmRpbmcgb24gZXhpc3RpbmcgbWV0YWRhdGFcbiAgICAgIGlmIChlbnRyeS5tZXRhZGF0YVsndHlwZSddID09PSAnbWFudXNjcmlwdCcpIHtcbiAgICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFudXNjcmlwdC1lbnRyeScpO1xuICAgICAgICAvLyBzZXQgaWNvblxuICAgICAgICBpY29uLnNyYyA9ICcuL05lb24tZ2gvYXNzZXRzL2ltZy9tYW51c2NyaXB0LWljb24uc3ZnJztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGVudHJ5Lm1ldGFkYXRhWyd0eXBlJ10gPT09ICdmb2xpbycpIHtcbiAgICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZm9saW8tZW50cnknKTtcbiAgICAgICAgLy8gc2V0IGljb25cbiAgICAgICAgaWNvbi5zcmMgPSAnLi9OZW9uLWdoL2Fzc2V0cy9pbWcvZm9saW8taWNvbi5zdmcnO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIHNldCBpY29uIGZvciBubyB0eXBlXG4gICAgICAgIGljb24uc3JjID0gJy4vTmVvbi1naC9hc3NldHMvaW1nL2ZvbGlvLWljb24uc3ZnJztcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpY29uKTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKG5hbWUpO1xuXG4gIHJldHVybiBjb250YWluZXI7XG59XG5cbi8qKlxuICogQWRkcyBkYmxjbGljayBldmVudCBsaXN0ZW5lciB0byB0aWxlIGVsZW1lbnQgYW5kIGFkZHMgc2hpZnQgc2VsZWN0aW9uIGJlaGF2aW91clxuICogXG4gKiBAcGFyYW0gaW5kZXggYXMgZGlzcGxheWVkIG9uIGRhc2hib2FyZCB0byB1c2VyXG4gKiBAcGFyYW0gZW50cnkgY29ycmVzcG9uZGluZyBlbnRyeSBpbiBjdXJyZW50IGZvbGRlclxuICogQHBhcmFtIHRpbGUgSFRNTERpdkVsZW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkVGlsZUV2ZW50TGlzdGVuZXIoaW5kZXg6IG51bWJlciwgZW50cnk6IElFbnRyeSwgdGlsZTogSFRNTERpdkVsZW1lbnQpIHtcbiAgLy8gZG91YmxlIGNsaWNrIGV2ZW50IGltbWVkaWF0ZWx5IG9wZW5zIGRvY3VtZW50XG4gIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGVudGVyRm9sZGVyKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHVwZGF0ZURhc2hib2FyZChbLi4uc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLCBlbnRyeSBhcyBJRm9sZGVyXSk7XG4gICAgfVxuICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBlbnRlckZvbGRlciwgZmFsc2UpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBvcGVuRG9jc0hhbmRsZXIsIGZhbHNlKTtcbiAgfVxuICBhZGRTaGlmdFNlbGVjdGlvbkxpc3RlbmVyKHRpbGUsIGluZGV4KTtcbiAgYWRkU3BlY2lmaWNDb250ZXh0TWVudUxpc3RlbmVycyh0aWxlLCBpbmRleCk7XG59XG5cbi8qKlxuICogQWRkIHNoaWZ0IHNlbGVjdGlvbiBiZWhhdmlvdXIgdG8gaHRtbCB0aWxlIGVsZW1lbnRcbiAqIFxuICogV2hlbiBubyBrZXlzIGFyZSBwcmVzc2VkOiBlcmFzZSBhbnkgcHJldmlvdXMgc2VsZWN0aW9ucyBhbmQgc2VsZWN0IG9ubHkgY3VycmVudCB0aWxlXG4gKiBXaGVuIG1ldGEga2V5IGlzIHByZXNzZWQ6IGFkZCBjdXJyZW50IHRpbGUgdG8gc2VsZWN0aW9uIGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkLCBlbHNlIHJlbW92ZSBmcm9tXG4gKiBzZWxlY3Rpb24uIFdoZW4gc2hpZnQga2V5IGlzIHByZXNzZWQ6IHNlbGVjdCBhbGwgdGlsZXMgYmV0d2VlbiBjdXJyZW50IHRpbGUgYW5kIHByZXZpb3VzIHRpbGVcbiAqIFxuICogV2hlbiB0aGVyZSBpcyBhIHByZXZpb3VzIHNlbGVjdGlvbiwgdGhlIHN0YXJ0IG9mIHRoZSBzaGlmdCBzZWxlY3Rpb24gaXMgdGhlIGxhc3Qgc2VsZWN0ZWQgdGlsZS4gXG4gKiBTaGlmdCBjbGlja2luZyBhZnRlciB3aWxsIGFkZCB0aGUgc2hpZnQgc2VsZWN0aW9uIHRvIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uXG4gKiBcbiAqIEBwYXJhbSB0aWxlIFxuICogQHBhcmFtIGluZGV4IFxuICovXG5mdW5jdGlvbiBhZGRTaGlmdFNlbGVjdGlvbkxpc3RlbmVyKHRpbGU6IEhUTUxEaXZFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihfZSkge1xuICAgIHNoaWZ0U2VsZWN0aW9uSGFuZGxlcihpbmRleCk7XG4gIH0sIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc2hpZnRTZWxlY3Rpb25IYW5kbGVyKGluZGV4KSB7XG4gIGlmICghbWV0YUtleUlzUHJlc3NlZCAmJiAhc2hpZnRLZXlJc1ByZXNzZWQpIHtcbiAgICB1bnNlbGVjdEFsbCgpO1xuICAgIHNlbGVjdChpbmRleCk7XG4gICAgc2hpZnRTZWxlY3Rpb24uc2V0U3RhcnQoaW5kZXgpO1xuICB9XG4gIGVsc2UgaWYgKG1ldGFLZXlJc1ByZXNzZWQpIHtcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0aW9uKClbaW5kZXhdKSB7XG4gICAgICB1bnNlbGVjdChpbmRleCk7XG4gICAgICBzaGlmdFNlbGVjdGlvbi5zZXRTdGFydChzdGF0ZS5nZXRTZWxlY3Rpb24oKS5sYXN0SW5kZXhPZih0cnVlKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0KGluZGV4KTtcbiAgICAgIHNoaWZ0U2VsZWN0aW9uLnNldFN0YXJ0KGluZGV4KTsgXG4gICAgfVxuICB9XG4gIGVsc2UgaWYgKHNoaWZ0S2V5SXNQcmVzc2VkKSB7XG4gICAgc2hpZnRTZWxlY3Rpb24uZ2V0UHJldlNlbGVjdGlvbigpLmZvckVhY2goKGlkeCkgPT4ge1xuICAgICAgdW5zZWxlY3QoaWR4KTtcbiAgICB9KTtcbiAgICBzaGlmdFNlbGVjdGlvbi5zZXRFbmQoaW5kZXgpO1xuICAgIHNoaWZ0U2VsZWN0aW9uLmdldFNlbGVjdGlvbihzdGF0ZS5nZXRTZWxlY3Rpb24oKSkuZm9yRWFjaCgoaWR4KSA9PiB7XG4gICAgICBzZWxlY3QoaWR4KTtcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCk7XG4gIHVwZGF0ZUZTQnV0dG9ucygpO1xufVxuLyoqXG4gKiBPcGVucyBjdXJyZW50IHNlbGVjdGlvbiBvZiBkb2N1bWVudHMgb24gZGFzaGJvYXJkLlxuICogXG4gKiBJZiBhIGZvbGRlciBpcyBzZWxlY3RlZCwgb3BlbnMgZm9sZGVyLlxuICogSWYgYSBmaWxlKHMpIGlzIHNlbGVjdGVkLCBvcGVucyBmaWxlKHMpLlxuICogSWYgYSBmb2xkZXIgYW5kIGZpbGUocykgYXJlIHNlbGVjdGVkLCBvcGVucyBmaWxlKHMpLlxuICovXG5mdW5jdGlvbiBvcGVuRG9jc0hhbmRsZXIoKSB7XG4gIGlmICghb3BlbkJ1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG5cbiAgLy8gT3BlbiBmb2xkZXIgaWYgb25seSBvbmUgZm9sZGVyIGlzIHNlbGVjdGVkXG4gIGlmIChzdGF0ZS5nZXRTZWxlY3RlZEZvbGRlcnMoKS5sZW5ndGggPT09IDEgfHwgc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG5ld1BhdGggPSBbLi4uc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLCBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXSBhcyBJRm9sZGVyXTtcbiAgICB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT3BlbiBhbGwgZmlsZXMsIGlnbm9yaW5nIGlmIGZvbGRlcnMgYXJlIHNlbGVjdGVkXG4gIHN0YXRlLmdldFNlbGVjdGVkRmlsZXMoKS5mb3JFYWNoKChlbnRyeTogSUVudHJ5KSA9PiBvcGVuRmlsZShlbnRyeSBhcyBJRmlsZSkpO1xuICBzaGlmdFNlbGVjdGlvbi5yZXNldCgpO1xuICB1bnNlbGVjdEFsbCgpO1xuICB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCk7XG59XG5cbi8qKlxuICogTW92ZSBjdXJyZW50IHNlbGVjdGlvbiBvZiBkb2N1bWVudHMgb24gZGFzaGJvYXJkIHRvIHRyYXNoLiBcbiAqIFxuICovXG5mdW5jdGlvbiByZW1vdmVEb2NzSGFuZGxlcigpIHtcbiAgaWYgKCFyZW1vdmVCdXR0b24uY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNlbGVjdGVkRW50cmllcyA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpO1xuICBjb25zdCBwYXJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgY29uc3QgdHJhc2hGb2xkZXIgPSBzdGF0ZS5nZXRUcmFzaEZvbGRlcigpO1xuXG4gIGNvbnN0IGRhdGV0aW1lID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpO1xuICBcbiAgZm9yIChsZXQgZW50cnkgb2Ygc2VsZWN0ZWRFbnRyaWVzKSB7XG4gICAgZW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuYWRkTWV0YWRhdGEoZW50cnksIHsgcmVtb3ZlZF9vbjogZGF0ZXRpbWUsIHJlY292ZXJfZm9sZGVyOiBzdGF0ZS5nZXRGb2xkZXJQYXRoTmFtZXMoKSB9KTtcbiAgfVxuXG4gIG1vdmVUb0ZvbGRlcihzZWxlY3RlZEVudHJpZXMsIHBhcmVudEZvbGRlciwgdHJhc2hGb2xkZXIpO1xufVxuXG5mdW5jdGlvbiBwdXRCYWNrRG9jc0hhbmRsZXIoKSB7XG4gIGNvbnN0IHNlbGVjdGVkRW50cmllcyA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpO1xuICBjb25zdCBwYXJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgXG4gIGZvciAobGV0IGVudHJ5IG9mIHNlbGVjdGVkRW50cmllcykge1xuICAgIGNvbnN0IGZvbGRlclBhdGhOYW1lcyA9IGVudHJ5Lm1ldGFkYXRhWydyZWNvdmVyX2ZvbGRlciddIGFzIHN0cmluZ1tdO1xuICAgIGNvbnN0IHRhcmdldEZvbGRlciA9IHN0YXRlLmdldEZvbGRlclBhdGhCeU5hbWVzKGZvbGRlclBhdGhOYW1lcyk7XG4gICAgaWYgKHRhcmdldEZvbGRlcikge1xuICAgICAgZW50cnkgPSBGaWxlU3lzdGVtVG9vbHMucmVtb3ZlTWV0YWRhdGEoZW50cnksIFsncmVtb3ZlZF9vbicsICdyZWNvdmVyX2ZvbGRlciddKTtcbiAgICAgIGNvbnN0IGRhdGVUaW1lUGF0dGVybiA9IC8gLSBcXGR7MSwyfVxcL1xcZHsxLDJ9XFwvXFxkezR9LCBcXGR7MSwyfTpcXGR7Mn06XFxkezJ9IFtBUE1hcG1dezJ9JC87XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlbmFtZSBlbmRzIHdpdGggdGhlIGRhdGUgdGltZSBwYXR0ZXJuXG4gICAgICBpZiAoZGF0ZVRpbWVQYXR0ZXJuLnRlc3QoZW50cnkubmFtZSkpIHtcbiAgICAgICAgZW50cnkubmFtZSA9IGVudHJ5Lm5hbWUucmVwbGFjZShkYXRlVGltZVBhdHRlcm4sICcnKTtcbiAgICAgIH1cbiAgICAgIG1vdmVUb0ZvbGRlcihbZW50cnldLCBwYXJlbnRGb2xkZXIsIHRhcmdldEZvbGRlcik7XG4gICAgfSAgICBcbiAgfVxufVxuXG4vKipcbiAqIERlbGV0ZSBhIGZpbGVcbiAqIFxuICogQHBhcmFtIGZpbGUgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZpbGVFbnRyeShmaWxlOiBJRmlsZSwgcGFyZW50Rm9sZGVyOiBJRm9sZGVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZGVsZXRlRG9jdW1lbnQoZmlsZS5pZClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgRmlsZVN5c3RlbVRvb2xzLnJlbW92ZUVudHJ5KGZpbGUsIHBhcmVudEZvbGRlcik7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHJlamVjdChmYWxzZSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxldGUgYSBmb2xkZXIgYW5kIGl0cyBjb250ZW50XG4gKiBcbiAqIEBwYXJhbSBmb2xkZXIgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZvbGRlckVudHJ5KGZvbGRlcjogSUZvbGRlciwgcGFyZW50Rm9sZGVyOiBJRm9sZGVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRlbGV0ZVByb21pc2VzID0gZm9sZGVyLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGVFbnRyeShjaGlsZCBhcyBJRmlsZSwgZm9sZGVyKTsgLy8gUGFzcyB0aGUgY3VycmVudCBmb2xkZXIgYXMgdGhlIHBhcmVudFxuICAgICAgfSBlbHNlIGlmIChjaGlsZC50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoY2hpbGQgYXMgSUZvbGRlciwgZm9sZGVyKTsgLy8gUGFzcyB0aGUgY3VycmVudCBmb2xkZXIgYXMgdGhlIHBhcmVudFxuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7IC8vIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCByZXNvbHZpbmcgZm9yIHNhZmV0eVxuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoZGVsZXRlUHJvbWlzZXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIEZpbGVTeXN0ZW1Ub29scy5yZW1vdmVFbnRyeShmb2xkZXIsIHBhcmVudEZvbGRlcik7IC8vIFVzZSB0aGUgcHJvdmlkZWQgcGFyZW50IGZvbGRlclxuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiByZXNvbHZlKGZhbHNlKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGV0ZXMgY3VycmVudCBzZWxlY3Rpb24gb2YgZG9jdW1lbnRzIG9uIGRhc2hib2FyZC4gXG4gKiBcbiAqIElmIGEgZm9sZGVyIGlzIHNlbGVjdGVkLCBkZWxldGVzIGZvbGRlci5cbiAqIElmIGEgZmlsZShzKSBpcyBzZWxlY3RlZCwgZGVsZXRlcyBmaWxlKHMpLlxuICogSWYgYSBmb2xkZXIgYW5kIGZpbGUocykgYXJlIHNlbGVjdGVkLCBkZWxldGVzIGFsbC5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlRG9jc0hhbmRsZXIoKSB7XG4gIGNvbnN0IGFsbEVudHJpZXMgPSBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKTtcblxuICAvLyBDcmVhdGUgYSBmb3JtYXR0ZWQgbGlzdCBvZiBmaWxlbmFtZXMgdG8gZGlzcGxheSBpbiBhbGVydCBtZXNzYWdlXG4gIGNvbnN0IGNyZWF0ZUxpc3QgPSAoZW50cnlBcnJheTogSUVudHJ5W10pID0+IGVudHJ5QXJyYXkubWFwKGVudHJ5ID0+IGAtICR7ZW50cnkubmFtZX0gKCR7ZW50cnkudHlwZX0pYCkuam9pbignXFxuJyk7XG4gIFxuICBjb25zdCBhbGVydE1lc3NhZ2UgPSBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZTpcXG4ke2NyZWF0ZUxpc3QoYWxsRW50cmllcyl9XFxuVGhpcyBhY3Rpb24gaXMgaXJyZXZlcnNpYmxlLmA7XG5cbiAgY29uc3QgaXNDb25maXJtZWQgPSB3aW5kb3cuY29uZmlybShhbGVydE1lc3NhZ2UpO1xuXG4gIGlmIChpc0NvbmZpcm1lZCkge1xuICAgIGNvbnN0IGRlbGV0ZVByb21pc2VzID0gYWxsRW50cmllcy5tYXAoZW50cnkgPT4ge1xuICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRmlsZUVudHJ5KGVudHJ5IGFzIElGaWxlLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoZW50cnkgYXMgSUZvbGRlciwgc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoZGVsZXRlUHJvbWlzZXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHVwZGF0ZURhc2hib2FyZChzdGF0ZS5nZXRGb2xkZXJQYXRoKCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCggZXJyID0+IGNvbnNvbGUuZGVidWcoJ2ZhaWxlZCB0byBkZWxldGUgZmlsZXM6ICcsIGVycikpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZW1wdHlUcmFzaEhhbmRsZXIoKSB7XG4gIGNvbnN0IHRyYXNoRm9sZGVyID0gc3RhdGUuZ2V0VHJhc2hGb2xkZXIoKTtcblxuICBpZiAoIXRyYXNoRm9sZGVyKSB7XG4gICAgY29uc29sZS5lcnJvcignVHJhc2ggZm9sZGVyIG5vdCBmb3VuZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhbGVydE1lc3NhZ2UgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBhbGwgdGhlIGZpbGVzIGluIFRyYXNoIEZvbGRlcj9cXG5UaGlzIGFjdGlvbiBpcyBpcnJldmVyc2libGUuJztcblxuICBjb25zdCBpc0NvbmZpcm1lZCA9IHdpbmRvdy5jb25maXJtKGFsZXJ0TWVzc2FnZSk7XG5cbiAgaWYgKGlzQ29uZmlybWVkKSB7XG5cbiAgICBjb25zdCBkZWxldGVQcm9taXNlcyA9IHRyYXNoRm9sZGVyLmNoaWxkcmVuLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGVFbnRyeShlbnRyeSBhcyBJRmlsZSwgdHJhc2hGb2xkZXIpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoZW50cnkgYXMgSUZvbGRlciwgdHJhc2hGb2xkZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsgLy8gU2hvdWxkbid0IGhhcHBlbiwgYnV0IHJlc29sdmluZyBmb3Igc2FmZXR5XG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChkZWxldGVQcm9taXNlcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gQWZ0ZXIgZGVsZXRpbmcgYWxsIGNvbnRlbnQsIHVwZGF0ZSB0aGUgZGFzaGJvYXJkXG4gICAgICAgIHVwZGF0ZURhc2hib2FyZChzdGF0ZS5nZXRGb2xkZXJQYXRoKCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmRlYnVnKCdmYWlsZWQgdG8gZGVsZXRlIGZpbGVzOiAnLCBlcnIpKTtcbiAgfVxufVxuXG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmlzaWJpbGl0eSBvZiBhY3Rpb24gYmFyIGJ1dHRvbnMgYmFzZWQgb24gY3VycmVudCBzZWxlY3Rpb25zXG4gKiBcbiAqIE5vdGU6IGJldHRlciBub3QgdG8gY2hhbmdlIHRoZSBvcmRlclxuICovXG5mdW5jdGlvbiB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCkge1xuICAvLyBpbnNpZGUgLi9TYW1wbGVzwqBvciBzZWxlY3RpbmcgdGhlIHNhbXBsZXMgZm9sZGVyXG4gIGlmIChzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10gfHwgXG4gICAgKHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdICYmIHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdLm1ldGFkYXRhWydpbW11dGFibGUnXSkpIHtcbiAgICB1cGxvYWREb2N1bWVudHNCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgbmV3Rm9sZGVyQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHJlbW92ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICBvcGVuQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVuQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIH1cbiAgfVxuICAvLyBpbnNpZGUgLi9UcmFzaFxuICBlbHNlIGlmIChzdGF0ZS5pc0luVHJhc2goKSkge1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cbiAgLy8gc2VsZWN0aW5nIHRoZSB0cmFzaCBmb2xkZXJcbiAgZWxzZSBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aCkge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH0gXG4gIC8vIHNlbGVjdGluZyBlbnRyaWVzXG4gIGVsc2UgaWYgKHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpLmxlbmd0aCkge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cbiAgLy8gbm90aGluZyBzZWxlY3RlZCwgbm90IGluIC4vU2FtcGxlcyBvciAuL1RyYXNoXG4gIGVsc2Uge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBuYXYgcGF0aCB3aXRoIGN1cnJlbnQgZm9sZGVyIHBhdGhcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTmF2UGF0aCgpOiB2b2lkIHtcbiAgbmF2UGF0aENvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAvLyBjcmVhdGUgbmF2IGVsZW1lbnRzIGFuZCBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gIGNvbnN0IG5hdkVsZW1lbnRzID0gc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLm1hcCgoZm9sZGVyLCBpZHgpID0+IHtcbiAgICBjb25zdCBuYXZTZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbmF2U2VjdGlvbi5jbGFzc0xpc3QuYWRkKCduYXYtcGF0aC1zZWN0aW9uJyk7XG4gICAgbmF2U2VjdGlvbi5pbm5lckhUTUwgPSBmb2xkZXIubmFtZTtcblxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuc2xpY2UoMCwgaWR4ICsgMSk7XG4gICAgbmF2U2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IGF3YWl0IHVwZGF0ZURhc2hib2FyZCh0YXJnZXRQYXRoKSk7XG4gICAgLy8gYWRkIGRyb3AgdGFyZ2V0IHRvIG1vdmUgZHJhZ2dlZCBlbGVtZW50IHRvIHRoZSBwcm9zcGVjdGl2ZSBmb2xkZXJzXG4gICAgYWRkRHJvcFRhcmdldExpc3RlbmVycyhuYXZTZWN0aW9uLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSwgdGFyZ2V0UGF0aC5hdCgtMSkpO1xuXG4gICAgcmV0dXJuIG5hdlNlY3Rpb247XG4gIH0pO1xuXG4gIC8vIGFkZCBuYXYgZWxlbWVudHMgdG8gbmF2IHBhdGggY29udGFpbmVyXG4gIG5hdkVsZW1lbnRzLmZvckVhY2goKG5hdkVsZW1lbnQsIGlkeCkgPT4ge1xuICAgIG5hdlBhdGhDb250YWluZXIuYXBwZW5kQ2hpbGQobmF2RWxlbWVudCk7XG4gICAgaWYgKGlkeCAhPT0gbmF2RWxlbWVudHMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3Qgc2VwZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzZXBlcmF0b3IuY2xhc3NMaXN0LmFkZCgnbmF2LXBhdGgtc2VwZXJhdG9yJyk7XG4gICAgICBzZXBlcmF0b3IuaW5uZXJIVE1MID0gJyAvICc7XG4gICAgICBuYXZQYXRoQ29udGFpbmVyLmFwcGVuZENoaWxkKHNlcGVyYXRvcik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBiYWNrIGJ1dHRvbiB3aXRoIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIGdvIGJhY2sgb25lIGZvbGRlciBpZiBwb3NzaWJsZVxuICovXG5mdW5jdGlvbiB1cGRhdGVCYWNrQnV0dG9uKCkge1xuICAvLyBFcmFzZSBwcmV2aW91cyBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgYnV0dG9uQ2xvbmUgPSBiYWNrQnV0dG9uLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgYmFja0J1dHRvbi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChidXR0b25DbG9uZSwgYmFja0J1dHRvbik7XG5cbiAgLy8gRGlzYWJsZSBiYWNrIGJ1dHRvbiBpZiBhdCByb290XG4gIGNvbnN0IGlzUm9vdCA9IHN0YXRlLmdldEZvbGRlclBhdGgoKS5sZW5ndGggPT09IDE7XG4gIGlmIChpc1Jvb3QpIHtcbiAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBidXR0b25DbG9uZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcbiAgfVxuICBlbHNlIHtcbiAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBidXR0b25DbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgYnV0dG9uQ2xvbmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVOYXZpZ2F0ZUJhY2spO1xuICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ29uZHJhZ2VudGVyJywgKCkgPT4gYnV0dG9uQ2xvbmUuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJykpO1xuICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ29uZHJhZ2xlYXZlJywgKCkgPT4gYnV0dG9uQ2xvbmUuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIGFkZERyb3BUYXJnZXRMaXN0ZW5lcnMoYnV0dG9uQ2xvbmUsIHN0YXRlLmdldFBhcmVudEZvbGRlcigpLCBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuYXQoLTIpKTtcbiAgfVxuICBiYWNrQnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVtcHR5QnV0dG9uKCkge1xuICAvLyBFcmFzZSBwcmV2aW91cyBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgYnV0dG9uQ2xvbmUgPSBlbXB0eUJ1dHRvbi5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGVtcHR5QnV0dG9uLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1dHRvbkNsb25lLCBlbXB0eUJ1dHRvbik7XG5cbiAgY29uc3QgcGFyZW50Rm9sZGVyID0gc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCk7XG5cbiAgLy8gRGlzcGxheSBpZiBpbiB0cmFzaFxuICBpZiAocGFyZW50Rm9sZGVyLnR5cGUgPT09ICd0cmFzaCcgfHwgc3RhdGUuaXNJblRyYXNoKCkpIHtcbiAgICBidXR0b25DbG9uZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgICAvLyBBY3RpdmF0ZSBidXR0b24gaWYgaGFzIGNvbnRlbnQgYW5kIG5vdCBzZWxlY3Rpbmcgd2hlbiBmaXJzdCBsZXZlbCBwYXJlbnQgaXMgdHJhc2hcbiAgICBpZiAocGFyZW50Rm9sZGVyLmNoaWxkcmVuLmxlbmd0aCAmJiAhc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoICYmIHBhcmVudEZvbGRlci50eXBlID09PSAndHJhc2gnKSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZW1wdHlUcmFzaEhhbmRsZXIpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIGJ1dHRvbiBpZiBubyBjb250ZW50XG4gICAgZWxzZSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAndHJ1ZScpO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBidXR0b25DbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG4gIGVtcHR5QnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlbGV0ZUJ1dHRvbigpIHtcbiAgLy8gRXJhc2UgcHJldmlvdXMgZXZlbnQgbGlzdGVuZXJzXG4gIGNvbnN0IGJ1dHRvbkNsb25lID0gZGVsZXRlQnV0dG9uLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgZGVsZXRlQnV0dG9uLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1dHRvbkNsb25lLCBkZWxldGVCdXR0b24pO1xuXG4gIGNvbnN0IHBhcmVudEZvbGRlciA9IHN0YXRlLmdldFBhcmVudEZvbGRlcigpO1xuICAvLyBEaXNwbGF5IGlmIGluIHRyYXNoXG4gIGlmIChwYXJlbnRGb2xkZXIudHlwZSA9PT0gJ3RyYXNoJyB8fCBzdGF0ZS5pc0luVHJhc2goKSkge1xuICAgIGJ1dHRvbkNsb25lLnN0eWxlLmRpc3BsYXkgPSAnJztcblxuICAgIC8vIEFkZCBsaXN0ZW5lciBpZiBzZWxlY3RzIGVudHJpZXNcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZGVsZXRlRG9jc0hhbmRsZXIpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIGlmIG5vdGhpbmcgc2VsZWN0ZWRcbiAgICBlbHNlIHtcbiAgICAgIGJ1dHRvbkNsb25lLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgYnV0dG9uQ2xvbmUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICd0cnVlJyk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGJ1dHRvbkNsb25lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbiAgZGVsZXRlQnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZTQnV0dG9ucygpIHtcbiAgdXBkYXRlQmFja0J1dHRvbigpO1xuICB1cGRhdGVFbXB0eUJ1dHRvbigpO1xuICB1cGRhdGVEZWxldGVCdXR0b24oKTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGNsaWNrIGV2ZW50IG9uIGJhY2sgYnV0dG9uIHRvIGdvIGJhY2sgb25lIGZvbGRlciBpZiBwb3NzaWJsZVxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVOYXZpZ2F0ZUJhY2soKSB7XG4gIGNvbnN0IG5ld1BhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuc2xpY2UoMCwgLTEpO1xuICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aCk7XG59XG5cbi8qKlxuICogQWRkIG5ldyBGb2xkZXIgdG8gY3VycmVudCBmb2xkZXIgYW5kIHJlZnJlc2ggZGFzaGJvYXJkXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUFkZEZvbGRlcihmb2xkZXJOYW1lOiBzdHJpbmcpIHtcbiAgLy8gY3JlYXRlIG5ldyBmb2xkZXIgZWxlbWVudFxuICBjb25zdCBuZXdGb2xkZXJUaWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5ld0ZvbGRlclRpbGUuY2xhc3NMaXN0LmFkZCgnZG9jdW1lbnQtZW50cnknKTtcbiAgbmV3Rm9sZGVyVGlsZS5jbGFzc0xpc3QuYWRkKCdmb2xkZXItZW50cnknKTtcbiAgbmV3Rm9sZGVyVGlsZS5zZXRBdHRyaWJ1dGUoJ2lkJywgJ25ldy1mb2xkZXInKTtcblxuICBjb25zdCBuZXdGb2xkZXIgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlRm9sZGVyKGZvbGRlck5hbWUpO1xuICBjb25zdCBzdWNjZWVkZWQgPSBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkobmV3Rm9sZGVyLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSk7XG4gIGlmIChzdWNjZWVkZWQpIHtcbiAgICBuZXdGb2xkZXJUaWxlLnNldEF0dHJpYnV0ZSgnaWQnLCBmb2xkZXJOYW1lKTtcbiAgICB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBuZXdGb2xkZXJUaWxlLnJlbW92ZSgpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmFtZXMgY3VycmVudCBzZWxlY3Rpb24gb2YgZG9jdW1lbnQgb24gZGFzaGJvYXJkLCB1cGRhdGluZyB0aGUgZGF0YWJhc2UgZm9yIGZpbGVzXG4gKiBcbiAqIEBwYXJhbSBlbnRyeSBJRW50cnkgdG8gcmVuYW1lXG4gKi9cbmZ1bmN0aW9uIHJlbmFtZUVudHJ5KGVudHJ5OiBJRW50cnksIG5ld05hbWU6IHN0cmluZykgeyAgXG4gIGNvbnN0IHN1Y2NlZWRlZCA9IEZpbGVTeXN0ZW1Ub29scy5yZW5hbWVFbnRyeShlbnRyeSwgc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCksIG5ld05hbWUpO1xuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgLy8gVXBkYXRlIGRhdGFiYXNlIGlmIGVudHJ5IGlzIGEgZmlsZVxuICAgIGlmIChlbnRyeS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBlbnRyeSBhcyBJRmlsZTtcbiAgICAgIHVwZGF0ZURvY05hbWUoZmlsZS5pZCwgbmV3TmFtZSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHVwZGF0ZURhc2hib2FyZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKipcbiAqIEdpdmVuIGFuIGVudHJ5IGlkLCByZXR1cm5zIHRoZSBlbnRyeSBmcm9tIHRoZSBjdXJyZW50IGZvbGRlclxuICogXG4gKiBAcGFyYW0gaWQgXG4gKiBAcmV0dXJucyBJRW50cnlcbiovXG5mdW5jdGlvbiBnZXRFbnRyeUJ5SWQoaWQ6IHN0cmluZyk6IElFbnRyeSB7XG4gIGNvbnN0IHRhcmdldEVudHJ5ID0gc3RhdGUuZ2V0RW50cmllcygpLmZpbmQoZW50cnkgPT4ge1xuICAgIHJldHVybiBlbnRyeS5pZCA9PT0gaWQ7XG4gIH0pO1xuICByZXR1cm4gdGFyZ2V0RW50cnk7XG59XG5cbi8qKlxuICogUmVmbGVjdHMgY2hhbmdlcyBpbiBmaWxlIHN5c3RlbSBpbiBkYXNoYm9hcmQgVUlcbiAqIFxuICogQHBhcmFtIG5ld1BhdGggSWYgcHJvdmlkZWQsIHVzZXMgdGhpcyBwYXRoIHRvIHVwZGF0ZSBkYXNoYm9hcmQuIE90aGVyd2lzZSwgdXNlcyBjdXJyZW50IHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aD86IElGb2xkZXJbXSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW5ld1BhdGgpIG5ld1BhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCk7XG4gIHN0YXRlLnNldEZvbGRlclBhdGgobmV3UGF0aCk7XG4gIGNvbnN0IGN1cnJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgLy8gY2xlYXIgY29udGVudCBhbmQgc2VsZWN0aW9uXG4gIGRvY3VtZW50c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgc2hpZnRTZWxlY3Rpb24ucmVzZXQoKTtcblxuICAvLyB1cGRhdGUgb3JkZXJlZCBpdGVtcyBmb3IgY3VycmVudCBmcy1jb250ZW50c1xuICBzdGF0ZS5zZXRFbnRyaWVzKGN1cnJlbnRGb2xkZXIuY2hpbGRyZW4pO1xuXG4gIC8vIHBvcHVsYXRlIGZvbGRlciBjb250ZW50c1xuICBjdXJyZW50Rm9sZGVyLmNoaWxkcmVuLmZvckVhY2goYXN5bmMgKGVudHJ5LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHRpbGUgPSBjcmVhdGVUaWxlKGVudHJ5KTtcbiAgICBkb2N1bWVudHNDb250YWluZXIuYXBwZW5kQ2hpbGQodGlsZSk7XG4gICAgYXdhaXQgYWRkVGlsZUV2ZW50TGlzdGVuZXIoaW5kZXgsIGVudHJ5LCB0aWxlKTtcbiAgfSk7IFxuXG4gIHVwZGF0ZUFjdGlvbkJhckJ1dHRvbnMoKTtcbiAgdXBkYXRlTmF2UGF0aCgpO1xuICB1cGRhdGVGU0J1dHRvbnMoKTtcblxuICBjb25zdCBpbmZvQmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby1iYWRnZScpO1xuICBpZiAoc3RhdGUuaXNJblRyYXNoKCkpIHtcbiAgICBpbmZvQmFkZ2UudGV4dENvbnRlbnQgPSAnRmlsZXMgd2lsbCBiZSBkZWxldGVkIGFmdGVyIDMwIGRheXMnO1xuICAgIGluZm9CYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyM5REIyQkYnO1xuICB9IGVsc2Uge1xuICAgIGluZm9CYWRnZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIGluZm9CYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7XG4gIH1cblxuICAvLyBhZGQgZHJhZyBhbmQgZHJvcCBsaXN0ZW5lcnMgZm9yIGN1cnJlbnQgZm9sZGVyIGNvbnRlbnRcbiAgY3VycmVudEZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IHRpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbnRyeS5pZCk7XG4gICAgYWRkRHJhZ1N0YXJ0TGlzdGVuZXIodGlsZSk7XG5cbiAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZvbGRlcicgfHwgZW50cnkudHlwZSA9PT0gJ3RyYXNoJykgeyBcbiAgICAgIGFkZERyb3BUYXJnZXRMaXN0ZW5lcnModGlsZSwgY3VycmVudEZvbGRlciwgZW50cnkgYXMgSUZvbGRlcik7XG4gICAgfVxuICB9KTtcbiAgXG4gIGZzbS5zZXRGaWxlU3lzdGVtKHN0YXRlLmdldEZvbGRlclBhdGgoKS5hdCgwKSk7XG59XG5cbmZ1bmN0aW9uIGFkZERyYWdTdGFydExpc3RlbmVyKGVsZW06IEVsZW1lbnQpIHtcbiAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcbiAgICBjdXJyZW50RHJhZ1RhcmdldCA9IGUudGFyZ2V0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRHJvcFRhcmdldExpc3RlbmVycyhlbGVtOiBFbGVtZW50LCBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLCBkZXN0aW5hdGlvbkZvbGRlcjogSUZvbGRlcikge1xuICAvKipcbiAgICAgKiBUaGUgZHJhZ2VudGVyIGFuZCBkcmFnb3ZlciBldmVudHMgbmVlZCB0byBiZSBvdmVycmlkZW4gaW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBkcmFnLWFuZC1kcm9wIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogUmVhZCBtb3JlIGF0OiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9EcmFnX2FuZF9Ecm9wX0FQSS9EcmFnX29wZXJhdGlvbnNcbiAgICAgKi9cbiAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlbGVtLmNsYXNzTGlzdC5hZGQoJ2RyYWdlbnRlcicpO1xuICB9KTsgICAgXG4gIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnZW50ZXInKTtcbiAgfSk7XG4gIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcblxuICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBjcmVhdGVIYW5kbGVEcm9wKGN1cnJlbnRGb2xkZXIsIGRlc3RpbmF0aW9uRm9sZGVyKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhhbmRsZURyb3AoY3VycmVudEZvbGRlcjogSUZvbGRlciwgZGVzdGluYXRpb25Gb2xkZXI6IElGb2xkZXIpIHtcbiAgcmV0dXJuIChlOiBFdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIGdldCB0aGUgSUQgb2YgdGhlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxuICAgIGNvbnN0IGRyYWdUYXJnZXRJRCA9ICg8SFRNTEVsZW1lbnQ+IGN1cnJlbnREcmFnVGFyZ2V0KS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICAvLyBVc2luZyBkcmFnVGFyZ2V0SUQsIGZpbmQgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIEZpbGUgYmVpbmcgZHJvcHBlZC5cbiAgICBjb25zdCBkcmFnRW50cnkgPSBnZXRFbnRyeUJ5SWQoZHJhZ1RhcmdldElEKTtcblxuICAgIC8vIElmIGZvbGRlciwgZGVzdGluYXRpb24sIGFuZCBmaWxlIHdlcmUgZm91bmQsIG1vdmUgdGhlIGZpbGUgaW50byB0aGUgZm9sZGVyLiBHcmVhdCBzdWNjZXNzIVxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGEgZm9sZGVyIGlzIG5vdCBiZWluZyBkcm9wcGVkIGludG8gdGhlIHNhbWUgZm9sZGVyLlxuICAgIGlmIChkcmFnRW50cnkgJiYgZHJhZ0VudHJ5ICE9PSBkZXN0aW5hdGlvbkZvbGRlcikge1xuICAgICAgbW92ZVRvRm9sZGVyKFtkcmFnRW50cnldLCBjdXJyZW50Rm9sZGVyLCBkZXN0aW5hdGlvbkZvbGRlcik7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgbW92ZWQgdG8gbmV3Rm9sZGVyLCBhbmQgaWYgc28sIG1vdmVzIGl0IGFuZCByZWZyZXNoZXMgZGFzaGJvYXJkLlxuICogXG4gKiBAcGFyYW0gZW50cnkgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHBhcmFtIG5ld0ZvbGRlciBcbiAqL1xuZnVuY3Rpb24gbW92ZVRvRm9sZGVyKGVudHJpZXM6IElFbnRyeVtdLCBwYXJlbnRGb2xkZXI6IElGb2xkZXIsIG5ld0ZvbGRlcjogSUZvbGRlcikge1xuICBjb25zdCBlcnJvck1lc3NhZ2VzID0gW107XG4gIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAvLyBIYW5kbGUgbmFtZSBjb25mbGljdHMgZm9yIHRyYXNoIGZvbGRlclxuICAgIGlmIChuZXdGb2xkZXIudHlwZSA9PT0gJ3RyYXNoJyAmJiBuZXdGb2xkZXIuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lKSkge1xuICAgICAgZW50cnkubmFtZSA9IHRyYXNoRk5Db25mbGljdEhhbmRsZXIoZW50cnkubmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gRmlsZVN5c3RlbVRvb2xzLmNhbk1vdmVFbnRyeShlbnRyeSwgcGFyZW50Rm9sZGVyLCBuZXdGb2xkZXIpO1xuICAgIGlmICghcmVzcG9uc2Uuc3VjY2VlZGVkKSBlcnJvck1lc3NhZ2VzLnB1c2gocmVzcG9uc2UuZXJyb3IpO1xuICAgIGVsc2UgRmlsZVN5c3RlbVRvb2xzLm1vdmVFbnRyeShlbnRyeSwgcGFyZW50Rm9sZGVyLCBuZXdGb2xkZXIpO1xuICB9KTtcbiAgXG4gIGVycm9yTWVzc2FnZXMuZmlsdGVyKChtc2csIGlkeCwgYXJyKSA9PiBhcnIuaW5kZXhPZihtc2cpID09PSBpZHgpO1xuICBpZiAoZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwKSB3aW5kb3cuYWxlcnQoZXJyb3JNZXNzYWdlcy5qb2luKCdcXG4nKSk7XG5cbiAgdXBkYXRlRGFzaGJvYXJkKCk7XG59XG5cbmZ1bmN0aW9uIHRyYXNoRk5Db25mbGljdEhhbmRsZXIoZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGV0aW1lID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpO1xuICByZXR1cm4gZmlsZW5hbWUgKyAnIC0gJyArIGRhdGV0aW1lO1xufVxuXG4vKipcbiAqIE9wZW5zIE1vdmUtVG8gbWVudSBtb2RhbCB3aW5kb3cgd2l0aCBVSSBmb3IgbW92aW5nIHNlbGVjdGVkIGVudHJpZXMgdG8gYSBuZXcgZm9sZGVyLlxuICovXG5mdW5jdGlvbiBvcGVuTW92ZVRvV2luZG93KCkge1xuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5NT1ZFX1RPKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRFbnRyaWVzID0gc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCk7XG4gIGNvbnN0IHBhcmVudEZvbGRlciA9IHN0YXRlLmdldFBhcmVudEZvbGRlcigpO1xuXG4gIC8vIENhbGxiYWNrIGZvciB3aGVuIHVzZXIgZG91YmxlLWNsaWNrcyBvbiBhIGZvbGRlciBhbmQgbW92ZXMgc2VsZWN0aW9uXG4gIGNvbnN0IG1vdmVUb0NhbGxiYWNrID0gKG5ld1BhcmVudEZvbGRlcjogSUZvbGRlcikgPT4ge1xuICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIG1vdmVUb0ZvbGRlcihzZWxlY3RlZEVudHJpZXMsIHBhcmVudEZvbGRlciwgbmV3UGFyZW50Rm9sZGVyKTtcbiAgfTtcblxuICBjb25zdCByb290VHJlZSA9IGdlbmVyYXRlUm9vdFRyZWUobW92ZVRvQ2FsbGJhY2spO1xuICBjb25zdCB0cmVlQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRyZWVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgndHJlZS1jb250YWluZXInKTtcbiAgdHJlZUNvbnRhaW5lci5hcHBlbmRDaGlsZChyb290VHJlZSk7XG5cbiAgY29uc3QgbW9kYWxDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1jb250YWluZXInKTtcbiAgbW9kYWxDb250YWluZXIuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwibW92ZS1tZW51LW1zZ1wiPkRvdWJsZS1jbGljayB0aGUgZm9sZGVyIHlvdSB3YW50IHRvIG1vdmUgeW91ciBpdGVtcyB0byE8L3NwYW4+JztcbiAgbW9kYWxDb250YWluZXIuYXBwZW5kQ2hpbGQodHJlZUNvbnRhaW5lcik7XG59XG5cbi8qKlxuICogT3BlbnMgTmV3IEZvbGRlciBtZW51IG1vZGFsIHdpbmRvdyB0aGF0IHByb21wdHMgZm9yIGEgbmFtZS5cbiAqIE9uIGNsaWNraW5nIHRoZSBDcmVhdGUgYnV0dG9uLCBjbG9zZXMgbW9kYWwgd2luZG93IGFuZCBjcmVhdGVzIG5ldyBmb2xkZXIuXG4gKi9cbmZ1bmN0aW9uIG9wZW5OZXdGb2xkZXJXaW5kb3coKSB7XG4gIGlmICghbmV3Rm9sZGVyQnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHJldHVybjtcblxuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgXG4gIGNvbnN0IGlucHV0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hib2FyZF9pbnB1dF9jb250YWluZXInKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgY29uc3QgY2FuY2VsQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbF9kYXNoYm9hcmQnKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgY29uc3QgY29uZmlybUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtX2Rhc2hib2FyZCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuXG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgaW5wdXQuaWQgPSAnZGFzaGJvYXJkX2lucHV0JztcbiAgaW5wdXQudHlwZSA9ICd0ZXh0JztcbiAgaW5wdXQucGxhY2Vob2xkZXIgPSAnVW50aXRsZWQgRm9sZGVyJztcbiAgaW5wdXQudmFsdWUgPSAnVW50aXRsZWQgRm9sZGVyJztcbiAgaW5wdXRDb250YWluZXIuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuXG4gIGlucHV0LnNlbGVjdCgpO1xuICBpbnB1dC5mb2N1cygpO1xuXG4gIGNhbmNlbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpKTtcbiAgY29uZmlybUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGNvbmZpcm1OZXdGb2xkZXJBY3Rpb24obW9kYWxXaW5kb3csIGlucHV0LnZhbHVlKSk7XG5cbiAgaW5wdXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgY29uZmlybU5ld0ZvbGRlckFjdGlvbihtb2RhbFdpbmRvdywgaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpcm1OZXdGb2xkZXJBY3Rpb24obW9kYWxXaW5kb3c6IE1vZGFsV2luZG93LCBmb2xkZXJOYW1lOiBzdHJpbmcpIHtcbiAgaWYgKCFuYW1lRXhpc3RzKGZvbGRlck5hbWUpKSB7XG4gICAgbW9kYWxXaW5kb3cuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgaGFuZGxlQWRkRm9sZGVyKGZvbGRlck5hbWUpO1xuICB9IFxuICBlbHNlIHtcbiAgICB3aW5kb3cuYWxlcnQoJ1RoZSBmb2xkZXIgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBmb2xkZXIhJyk7XG4gICAgb3Blbk5ld0ZvbGRlcldpbmRvdygpO1xuICB9XG59XG5cbi8qKlxuICogT3BlbnMgUmVuYW1lIG1lbnUgbW9kYWwgd2luZG93IHRoYXQgcHJvbXB0cyBmb3IgYSBuZXcgbmFtZS5cbiAqL1xuZnVuY3Rpb24gb3BlblJlbmFtZVdpbmRvdygpIHtcbiAgLy8gZ2VuZXJhdGUgbW9kYWwgd2luZG93XG4gIGNvbnN0IG1vZGFsV2luZG93ID0gbmV3IE1vZGFsV2luZG93KCk7XG4gIG1vZGFsV2luZG93LnNldE1vZGFsV2luZG93VmlldyhNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgY29uc3QgaW5wdXRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkX2lucHV0X2NvbnRhaW5lcicpIGFzIEhUTUxEaXZFbGVtZW50O1xuICBjb25zdCBjYW5jZWxCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FuY2VsX2Rhc2hib2FyZCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICBjb25zdCBjb25maXJtQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1fZGFzaGJvYXJkJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICBpbnB1dC5pZCA9ICdkYXNoYm9hcmRfaW5wdXQnO1xuICBpbnB1dC50eXBlID0gJ3RleHQnO1xuICBjb25zdCBwcmV2TmFtZSA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdLm5hbWU7XG4gIGlucHV0LnBsYWNlaG9sZGVyID0gcHJldk5hbWU7XG4gIGlucHV0LnZhbHVlID0gcHJldk5hbWU7XG4gIGlucHV0Q29udGFpbmVyLmFwcGVuZENoaWxkKGlucHV0KTtcblxuICBpbnB1dC5zZWxlY3QoKTtcbiAgaW5wdXQuZm9jdXMoKTtcblxuICBjYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKSk7XG4gIGNvbmZpcm1CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjb25maXJtUmVuYW1lQWN0aW9uKG1vZGFsV2luZG93LCBpbnB1dC52YWx1ZSwgcHJldk5hbWUpKTtcblxuICBpbnB1dENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICBjb25maXJtUmVuYW1lQWN0aW9uKG1vZGFsV2luZG93LCBpbnB1dC52YWx1ZSwgcHJldk5hbWUpO1xuICAgIH1cbiAgfSk7XG4gIFxufVxuXG4vLyBPbiBjb25maXJtYXRpb24sIGNsb3NlIG1vZGFsIHdpbmRvdyBhbmQgcmVuYW1lIGVudHJ5IChpZiBmaWxlLCBkYXRhYmFzZSBpcyB1cGRhdGVkKVxuZnVuY3Rpb24gY29uZmlybVJlbmFtZUFjdGlvbihtb2RhbFdpbmRvdzogTW9kYWxXaW5kb3csIG5ld05hbWU6IHN0cmluZywgcHJldk5hbWU6IHN0cmluZykge1xuICAvLyBjaGVjayBmb3IgZHVwbGljYXRlZCBuYW1lc1xuICBpZiAobmV3TmFtZSA9PT0gcHJldk5hbWUpIHtcbiAgICBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgfVxuICBlbHNlIHtcbiAgICBpZiAoIW5hbWVFeGlzdHMobmV3TmFtZSkpIHtcbiAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgICAgY29uc3QgZW50cnkgPSBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXTtcbiAgICAgIHJlbmFtZUVudHJ5KGVudHJ5LCBuZXdOYW1lKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB3aW5kb3cuYWxlcnQoJ1RoZSBmaWxlbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBmb2xkZXIhJyk7XG4gICAgICBvcGVuUmVuYW1lV2luZG93KCk7XG4gICAgfVxuICB9ICBcbn1cblxuZnVuY3Rpb24gbmFtZUV4aXN0cyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyZW50ID0gc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCk7XG4gIHJldHVybiBwYXJlbnQuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgZm9sZGVyIHRyZWUgc3RydWN0dXJlIGZvciBtb3ZlLXRvIG1lbnVcbiAqIFxuICogQHBhcmFtIGZvbGRlciBJRm9sZGVyIHRvIGdlbmVyYXRlIHRyZWUgc3RydWN0dXJlIGZvciBhbmQgYWxsIGl0cyBzdWJmb2xkZXJzXG4gKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdoZW4gdXNlciBkb3VibGUtY2xpY2tzIG9uIGEgZm9sZGVyIGFuZCBtb3ZlcyBzZWxlY3Rpb25cbiAqIEBwYXJhbSBkZWdyZWUgVGhlIGxldmVsIG9mIHN1YmZvbGRlcnMgZGVlcFxuICogQHJldHVybnMgTGlzdCBpdGVtIG5vZGVcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVGb2xkZXJUcmVlKGZvbGRlcjogSUZvbGRlciwgbW92ZVRvQ2FsbGJhY2s6IChuZXdQYXJlbnRGb2xkZXIgOklGb2xkZXIpID0+IHZvaWQsIGRlZ3JlZTogbnVtYmVyKTogSFRNTExJRWxlbWVudCB7XG5cbiAgY29uc3QgdHJlZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gIC8vIGNvbnRhaW5lciBmb3IgZm9sZGVyIG5hbWUgYW5kIGFycm93XG4gIGNvbnN0IGxpQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGxpQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3RyZWUtbGktY29udGFpbmVyJyk7XG5cbiAgLy8gRm9sZGVyIFRFWFQ6IGNsaWNrIHRvIHNlbGVjdCAoZm9yIFVYKSwgZG91YmxlIGNsaWNrIHRvIG1vdmUgaXRlbXMgdG8gZm9sZGVyXG4gIGNvbnN0IGZvbGRlck5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9sZGVyTmFtZS5jbGFzc0xpc3QuYWRkKCd0cmVlLW5hbWUnKTtcbiAgZm9sZGVyTmFtZS5pbm5lckhUTUwgPSBmb2xkZXIubmFtZTtcblxuICAvLyBPbiBzaW5nbGUgY2xpY2ssIGhpZ2hsaWdodC9zZWxlY3QgZm9sZGVyIG5hbWVcbiAgZm9sZGVyTmFtZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudHJlZS1uYW1lJykuZm9yRWFjaChlbGVtID0+IGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gICAgZm9sZGVyTmFtZS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICB9KTtcblxuICAvLyBPbiBkb3VibGUgY2xpY2ssIG1vdmUgc2VsZWN0ZWQgaXRlbXMgdG8gZm9sZGVyXG4gIGZvbGRlck5hbWUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XG4gICAgbW92ZVRvQ2FsbGJhY2soZm9sZGVyKTtcbiAgfSk7XG5cbiAgLy8gSWYgRm9sZGVyIGhhcyBubyBzdWJmb2xkZXJzLCByZXR1cm4gd2l0aG91dCBuZXN0ZWQgdWxcbiAgY29uc3QgaXNMZWFmID0gZm9sZGVyLmNoaWxkcmVuLmV2ZXJ5KGVudHJ5ID0+IGVudHJ5LnR5cGUgIT09ICdmb2xkZXInKTtcbiAgaWYgKGlzTGVhZikge1xuICAgIHRyZWUuYXBwZW5kQ2hpbGQobGlDb250YWluZXIpO1xuICAgIGxpQ29udGFpbmVyLmFwcGVuZENoaWxkKGZvbGRlck5hbWUpO1xuICAgIHJldHVybiB0cmVlO1xuICB9XG4gIC8vIE90aGVyd2lzZSBGb2xkZXIgaXMgbm90IGVtcHR5LCBtYWtlIHRyZWUgc3RydWN0dXJlXG5cbiAgLy8gVW5vcmRlcmVkIExJU1QgKGhpZGluZyBvciB1bmhpZGluZyBsaSlcbiAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuXG4gIC8vIEFSUk9XXG4gIGNvbnN0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGFycm93LmNsYXNzTGlzdC5hZGQoJ3RyZWUtYXJyb3cnKTtcbiAgYXJyb3cuaW5uZXJIVE1MID0gJ+KWtic7XG5cbiAgLy8gaWYgbW9yZSB0aGFuIC4uLiBzdWJmb2xkZXJzIGRvd24sIGhpZGUgYnkgZGVmYXVsdFxuICBpZiAoZGVncmVlIDwgMikgdWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGlmIChkZWdyZWUgPCAyKSBhcnJvdy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgXG4gIGFycm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGFycm93LmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpO1xuICAgIHVsLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpO1xuICB9KTtcblxuICB0cmVlLmFwcGVuZENoaWxkKGxpQ29udGFpbmVyKTtcbiAgbGlDb250YWluZXIuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICBsaUNvbnRhaW5lci5hcHBlbmRDaGlsZChmb2xkZXJOYW1lKTtcbiAgdHJlZS5hcHBlbmRDaGlsZCh1bCk7XG5cbiAgLy8gQXBwZW5kIGZvbGRlciBjb250ZW50c1xuICBmb2xkZXIuY2hpbGRyZW4uZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZvbGRlcicpIHtcbiAgICAgIGNvbnN0IGZvbGRlclRyZWUgPSBnZW5lcmF0ZUZvbGRlclRyZWUoZW50cnkgYXMgSUZvbGRlciwgbW92ZVRvQ2FsbGJhY2ssIGRlZ3JlZSArIDEpO1xuICAgICAgdWwuYXBwZW5kQ2hpbGQoZm9sZGVyVHJlZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGVudGlyZSBmaWxlIHN5c3RlbSBmb2xkZXIgdHJlZSBmb3IgbW92ZS10byBtZW51XG4gKiBcbiAqIEBwYXJhbSBtb3ZlVG9DYWxsYmFjayBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiB1c2VyIGRvdWJsZS1jbGlja3Mgb24gYSBmb2xkZXIgYW5kIG1vdmVzIHNlbGVjdGlvblxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUm9vdFRyZWUobW92ZVRvQ2FsbGJhY2s6IChuZXdQYXJlbnRGb2xkZXIgOklGb2xkZXIpID0+IHZvaWQpOiBIVE1MVUxpc3RFbGVtZW50IHtcbiAgY29uc3Qgcm9vdFRyZWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICByb290VHJlZS5pZCA9ICd0cmVlLXJvb3QnO1xuICByb290VHJlZS5hcHBlbmRDaGlsZChnZW5lcmF0ZUZvbGRlclRyZWUoc3RhdGUucm9vdCgpLCBtb3ZlVG9DYWxsYmFjaywgMCkpO1xuICByZXR1cm4gcm9vdFRyZWU7XG59XG5cbi8qKlxuICogRGlzcGxheXMgZGFzaGJvYXJkIGNvbnRleHQgbWVudSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IFxuICogXG4gKiBAcGFyYW0gdmlldyBjb250ZXh0IG1lbnUgdmlldyAoZGV0ZXJtaW5lcyBjb250ZW50IG9mIGNvbnRleHQgbWVudSlcbiAqL1xuZnVuY3Rpb24gc2hvd0NvbnRleHRNZW51KHZpZXc6IHN0cmluZywgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpIHtcblxuICBzd2l0Y2ggKHZpZXcpIHtcbiAgICAvLyBDb250ZXh0IG1lbnUgb3B0aW9ucyB3aGVuIGZpbGVzL2ZvbGRlcnMgYXJlIHJpZ2h0LWNsaWNrZWRcbiAgICBjYXNlICdzZWxlY3Rpb24tb3B0aW9ucyc6XG5cbiAgICAgIC8vIE5lZWQgdG8gZGV0ZXJtaW5lIHNlbGVjdGlvbiBjYXRlZ29yeSBiZWZvcmUgZGlzcGxheWluZyBvcHRpb25zXG4gICAgICBjb25zdCBudW1iZXJPZlNlbGVjdGVkRmlsZXMgPSBzdGF0ZS5nZXRTZWxlY3RlZEZpbGVzKCkubGVuZ3RoO1xuICAgICAgY29uc3QgbnVtYmVyT2ZTZWxlY3RlZEZvbGRlcnMgPSBzdGF0ZS5nZXRTZWxlY3RlZEZvbGRlcnMoKS5sZW5ndGg7XG4gICAgICBjb25zdCBzZWxlY3RlZFRyYXNoID0gc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aDtcblxuICAgICAgLyoqXG4gICAgICAgKiBDb250ZXh0IG1lbnUgb3B0aW9ucyBjb25kaXRpb25zOlxuICAgICAgICogICAgMSkgMSBmaWxlIC0+IG9wZW4sIG1vdmUgdG8gdHJhc2gsIG1vdmVcbiAgICAgICAqICAgIDIpIDIrIGZpbGVzIC0+IG9wZW4sIG1vdmUgdG8gdHJhc2gsIG1vdmVcbiAgICAgICAqICAgIDMpIGZpbGUocykgKyBmb2xkZXIocykgLT4gbW92ZSB0byB0cmFzaCwgbW92ZVxuICAgICAgICogICAgNCkgMSBmb2xkZXIgLT4gb3BlbiwgbW92ZSB0byB0cmFzaCwgbW92ZVxuICAgICAgICogICAgNSkgMisgZm9sZGVycyAtPiBtb3ZlIHRvIHRyYXNoLCBtb3ZlXG4gICAgICAgKiAgICA2KSB0cmFzaCAtPiBlbXB0eSB0cmFzaFxuICAgICAgICogICAgNykgZW50cnkgaW4gdHJhc2ggLT4gcHV0IGJhY2ssIGRlbGV0ZVxuICAgICAgICovXG5cblxuICAgICAgLy8gdHJhc2hcbiAgICAgIGlmICghbnVtYmVyT2ZTZWxlY3RlZEZpbGVzICYmICFudW1iZXJPZlNlbGVjdGVkRm9sZGVycyAmJiBzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50LnRyYXNoRm9sZGVyT3B0aW9ucztcbiAgICAgICAgc2V0Q29udGV4dE1lbnVJdGVtc0V2ZW50TGlzdGVuZXJzKCd0cmFzaC1mb2xkZXItb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLmxlbmd0aCA+IDEgJiYgc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLmF0KDEpLm5hbWUgPT0gJ1RyYXNoJykge1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC50cmFzaEVudHJ5T3B0aW9ucztcbiAgICAgICAgc2V0Q29udGV4dE1lbnVJdGVtc0V2ZW50TGlzdGVuZXJzKCd0cmFzaC1lbnRyeS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyAxIGZpbGVcbiAgICAgIGVsc2UgaWYgKG51bWJlck9mU2VsZWN0ZWRGaWxlcyA9PT0gMSAmJiAhbnVtYmVyT2ZTZWxlY3RlZEZvbGRlcnMgJiYgIXNlbGVjdGVkVHJhc2gpIHtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50V3JhcHBlci5pbm5lckhUTUwgPSBjb250ZXh0TWVudUNvbnRlbnQuc2luZ2xlRmlsZU9wdGlvbnM7XG4gICAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnc2luZ2xlLWZpbGUtb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgLy8gMisgZmlsZXNcbiAgICAgIGVsc2UgaWYgKG51bWJlck9mU2VsZWN0ZWRGaWxlcyA+IDEgJiYgIW51bWJlck9mU2VsZWN0ZWRGb2xkZXJzICYmICFzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50Lm11bHRpRmlsZU9wdGlvbnM7XG4gICAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnbXVsdGktZmlsZS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyBmaWxlKHMpICsgZm9sZGVyKHMpXG4gICAgICBlbHNlIGlmIChudW1iZXJPZlNlbGVjdGVkRmlsZXMgPj0gMSAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA+PSAxICYmICFzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50LmZvbGRlckFuZEZpbGVPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ2ZvbGRlci1hbmQtZmlsZS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyAxIGZvbGRlclxuICAgICAgZWxzZSBpZiAoIW51bWJlck9mU2VsZWN0ZWRGaWxlcyAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA9PT0gMSAmJiAhc2VsZWN0ZWRUcmFzaCkge1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC5zaW5nbGVGb2xkZXJPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ3NpbmdsZS1mb2xkZXItb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgLy8gMisgZm9sZGVyc1xuICAgICAgZWxzZSBpZiAoIW51bWJlck9mU2VsZWN0ZWRGaWxlcyAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA+IDEgJiYgIXNlbGVjdGVkVHJhc2gpIHtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50V3JhcHBlci5pbm5lckhUTUwgPSBjb250ZXh0TWVudUNvbnRlbnQubXVsdGlGb2xkZXJPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ211bHRpLWZvbGRlci1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIC8vIERlZmF1bHQgY29udGV4dCBtZW51IChyaWdoLWNsaWNraW5nIG9uIGRhc2hib2FyZCBiYWNrZ3JvdW5kKVxuICAgIGRlZmF1bHQ6XG4gICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC5kZWZhdWx0T3B0aW9ucztcbiAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnZGVmYXVsdCcpO1xuICB9XG5cbiAgLy8gZGlzYWJsZSBlZGl0b3IgbWVudSBmb3IgdGhlIHNhbXBsZXMgZm9sZGVyIGFuZCB0cmFzaFxuICBpZihzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10gfHwgXG4gIChzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXSAmJiBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10pIHx8XG4gIHN0YXRlLmlzSW5UcmFzaCgpKSB7XG4gICAgY29uc3QgZGVsZXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NtLXJlbW92ZS1idG4nKTtcbiAgICBjb25zdCByZW5hbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tcmVuYW1lLWJ0bicpO1xuICAgIGNvbnN0IG1vdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tbW92ZS1idG4nKTtcbiAgICBjb25zdCB1cGRhdGVEb2NCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tdXBsb2FkLWRvYy1idG4nKTtcbiAgICBjb25zdCBuZXdGb2xkZXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tbmV3LWZvbGRlci1idG4nKTtcblxuICAgIGlmIChkZWxldGVCdG4pIHtcbiAgICAgIGRlbGV0ZUJ0bi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgICBpZiAocmVuYW1lQnRuKSB7XG4gICAgICByZW5hbWVCdG4uY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKG1vdmVCdG4pIHtcbiAgICAgIG1vdmVCdG4uY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZURvY0J0bikge1xuICAgICAgdXBkYXRlRG9jQnRuLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgfVxuICAgIGlmIChuZXdGb2xkZXJCdG4pIHtcbiAgICAgIG5ld0ZvbGRlckJ0bi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHVzZXIncyBtb3VzZVxuICBjb250ZXh0TWVudS5zdHlsZS5sZWZ0ID0gYCR7Y2xpZW50WH1weGA7XG4gIGNvbnRleHRNZW51LnN0eWxlLnRvcCA9IGAke2NsaWVudFl9cHhgO1xuXG4gIC8vIGRpc3BsYXkgY29udGV4dCBtZW51XG4gIGNvbnRleHRNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xufVxuXG5cbi8qKlxuICogU2V0IGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG1lbnUgaXRlbXMgaW4gYSBwYXJ0aWN1bGFyIGNvbnRleHQgbWVudS5cbiAqIFxuICogQHBhcmFtIHZpZXcgVGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgbWVudSB2aWV3IHRoYXQgaXMgYmVpbmcgZGlzcGxheWVkLlxuICovXG5mdW5jdGlvbiBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnModmlldzogc3RyaW5nKSB7XG4gIC8vIEFsbCB0aGUgYnV0dG9ucyB0aGF0IHdpbGwgaGF2ZSBldmVudHMgYXR0YWNoZWQgdG8gdGhlbSBoYXZlIHRoZSBzYW1lIGNsYXNzbmFtZS5cbiAgY29uc3QgYnRuQ2xhc3NuYW1lID0gJ2NvbnRleHQtbWVudS1pdGVtLXdyYXBwZXInO1xuXG4gIHN3aXRjaCAodmlldykge1xuXG4gICAgY2FzZSAnc2luZ2xlLWZpbGUtb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIlJlbmFtZVwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1yZW5hbWUtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5SZW5hbWVXaW5kb3coKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpOyAgIFxuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ211bHRpLWZpbGUtb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7ICAgICAgXG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9sZGVyLWFuZC1maWxlLW9wdGlvbnMnOlxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ3NpbmdsZS1mb2xkZXItb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIlJlbmFtZVwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1yZW5hbWUtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5SZW5hbWVXaW5kb3coKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7ICAgICAgXG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbXVsdGktZm9sZGVyLW9wdGlvbnMnOlxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ3RyYXNoLWZvbGRlci1vcHRpb25zJzpcbiAgICAgIC8vIFwiRW1wdHkgVHJhc2hcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tZW1wdHktdHJhc2gtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIGVtcHR5VHJhc2hIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0cmFzaC1lbnRyeS1vcHRpb25zJzpcbiAgICAgIC8vIFwiUHV0IEJhY2tcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tcmVjb3Zlci1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcHV0QmFja0RvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJEZWxldGVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tZGVsZXRlLWJ0bmApLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKF9lKSA9PiB7XG4gICAgICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICBkZWxldGVEb2NzSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFwiVXBsb2FkIGRvY3VtZW50XCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXVwbG9hZC1kb2MtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5VcGxvYWRBcmVhSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFwiTmV3IGZvbGRlclwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1uZXctZm9sZGVyLWJ0bmApLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKF9lKSA9PiB7XG4gICAgICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICBvcGVuTmV3Rm9sZGVyV2luZG93KCk7XG4gICAgICB9KTtcblxuICB9XG5cbn1cblxuXG4vKipcbiAqIEluaXRpYWxpemUgZGFzaGJvYXJkIGNvbnRleHQgbWVudSAocmlnaHQgY2xpY2sgbWVudSkuXG4gKiBUaGlzIHdpbGwgc2V0IHVwIGFsbCBuZWNlc3NhcnkgZXZlbnQgbGlzdGVuZXJzIGFzIHdlbGwgYXNcbiAqIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbnRleHQgbWVudSwgd2hpY2hcbiAqIG1heSBjaGFuZ2UgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSB1c2VyIHJpZ2h0LWNsaWNrcyAoZmlsZSwgZmlsZXMsIGZvbGRlciwgYmFja2dyb3VuZCwgZXRjLilcbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZURlZmF1bHRDb250ZXh0TWVudSgpIHtcblxuICAvLyByaWdodC1jbGljayBvbiBkYXNoYm9hcmQgYmFja2dyb3VuZFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFpbi1zZWN0aW9uJykuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIHVuc2VsZWN0QWxsKCk7XG5cbiAgICBzaG93Q29udGV4dE1lbnUoXG4gICAgICAnZGVmYXVsdCcsIFxuICAgICAgKDxNb3VzZUV2ZW50PiBlKS5jbGllbnRYLCBcbiAgICAgICg8TW91c2VFdmVudD4gZSkuY2xpZW50WVxuICAgICk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tYWluLXNlY3Rpb24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZCBsaXN0ZW5lcnMgZm9yIHNwZWNpZmljIGNvbnRleHQgbWVudXMuXG4gKiBTcGVjaWZpYyBjb250ZXh0IG1lbnVzIGFwcGVhciB3aGVuIHVzZXIgcmlnaHQtY2xpY2tzIG9uIHNlbGVjdGVkIGZpbGVzL2ZvbGRlcnMuXG4gKiBUaGUgYWN0dWFsIG1lbnUgdGhhdCBpcyBzaG93biBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHNlbGVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gYWRkU3BlY2lmaWNDb250ZXh0TWVudUxpc3RlbmVycyh0aWxlLCBpbmRleCkge1xuXG4gIC8vIHJpZ2h0LWNsaWNrIG9uIGZvbGRlciBpdGVtIChmaWxlIG9yIGZvbGRlcilcbiAgdGlsZS5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlKSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAocmlnaHRDbGlja2VkIHx8IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdW5zZWxlY3RBbGwoKTtcbiAgICB9XG5cbiAgICAvLyBzZWxlY3RcbiAgICBzZWxlY3QoaW5kZXgpO1xuXG4gICAgc2hvd0NvbnRleHRNZW51KFxuICAgICAgJ3NlbGVjdGlvbi1vcHRpb25zJywgXG4gICAgICAoPE1vdXNlRXZlbnQ+IGUpLmNsaWVudFgsIFxuICAgICAgKDxNb3VzZUV2ZW50PiBlKS5jbGllbnRZXG4gICAgKTtcbiAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICByaWdodENsaWNrZWQgPSB0cnVlO1xuICB9KTtcbiAgICBcbiAgLy8gaGlkZSBjb250ZXh0IG1lbnUgaWYgdXNlciBjbGlja3MgYXdheVxuICBtYWluU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKHJpZ2h0Q2xpY2tlZCkge1xuICAgICAgbGV0IGNsaWNrZWRFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY3VtZW50LWVudHJ5JykpIHtcbiAgICAgICAgY2xpY2tlZEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIHJpZ2h0Q2xpY2tlZCA9IGZhbHNlO1xuICAgICAgaWYgKCFjbGlja2VkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY3VtZW50LWVudHJ5JykpIHtcbiAgICAgICAgLy8gaWYgY2xpY2tzIG9uIGJsYW5rIFxuICAgICAgICB1bnNlbGVjdEFsbCgpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIGlmIGNsaWNrcyBvbiBhIGZpbGUvZm9sZGVyLCBzZWxlY3QgaXRcbiAgICAgICAgY29uc3QgY2xpY2tlZEVudHJ5ID0gZ2V0RW50cnlCeUlkKGNsaWNrZWRFbGVtZW50LmlkKTtcbiAgICAgICAgc2hpZnRTZWxlY3Rpb25IYW5kbGVyKHN0YXRlLmdldEluZGV4QnlFbnRyeU5hbWUoY2xpY2tlZEVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgVHJhc2ggZm9sZGVyIGJ5IGRlbGV0aW5nIGVudHJpZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgMzAgZGF5cyBhZ29cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVHJhc2gocm9vdDogSUZvbGRlcik6IHZvaWQge1xuICBpZiAoIXN0YXRlLmdldFRyYXNoRm9sZGVyKCkpIHtcbiAgICBmc20ubmV3VHJhc2gocm9vdCk7XG4gIH1cbiAgY29uc3QgdHJhc2hGb2xkZXIgPSBzdGF0ZS5nZXRUcmFzaEZvbGRlcigpO1xuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHRoaXJ0eURheXNBZ28gPSBuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRUaW1lKCkgLSAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDApOyAvLyAzMCBkYXlzIGluIG1pbGxpc2Vjb25kc1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhbiBlbnRyeSB3YXMgZGVsZXRlZCAzMCBkYXlzIGFnb1xuICBjb25zdCB0b0RlbGV0ZSA9IChlbnRyeTogSUVudHJ5KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKGVudHJ5Lm1ldGFkYXRhICYmIGVudHJ5Lm1ldGFkYXRhWydyZW1vdmVkX29uJ10pIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShlbnRyeS5tZXRhZGF0YVsncmVtb3ZlZF9vbiddIGFzIHN0cmluZyk7XG4gICAgICByZXR1cm4gZGF0ZSA8PSB0aGlydHlEYXlzQWdvO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBlbnRyaWVzIGluIHRoZSBUcmFzaFxuICB0cmFzaEZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGlmICh0b0RlbGV0ZShlbnRyeSkpIHtcbiAgICAgIC8vIERlbGV0ZSBlbnRyeSBpZiBkZWxldGVkIDMwIGRheXMgYWdvXG4gICAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgIGRlbGV0ZUZpbGVFbnRyeShlbnRyeSBhcyBJRmlsZSwgdHJhc2hGb2xkZXIpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICBkZWxldGVGb2xkZXJFbnRyeShlbnRyeSBhcyBJRm9sZGVyLCB0cmFzaEZvbGRlcik7IFxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTG9hZHMgcm9vdCBmb2xkZXIgaW50byBkYXNoYm9hcmQgb24gc3RhcnR1cC4gXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRGFzaGJvYXJkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb290ID0gYXdhaXQgZnNtLmdldFJvb3QoKTtcbiAgc3RhdGUucm9vdChyb290KTtcbiAgdXBkYXRlVHJhc2gocm9vdCk7XG4gIHVwZGF0ZURhc2hib2FyZChbcm9vdF0pO1xuICBpbml0aWFsaXplRGVmYXVsdENvbnRleHRNZW51KCk7XG59OyIsImltcG9ydCB7IGxvYWREYXNoYm9hcmQgfSBmcm9tICcuLi8uLi9zcmMvRGFzaGJvYXJkL0Rhc2hib2FyZCc7XG5cbmxvYWREYXNoYm9hcmQoKTtcbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNob21lLWxpbmsnKT8uc2V0QXR0cmlidXRlKCdocmVmJywgX19MSU5LX0xPQ0FUSU9OX18pOyIsImV4cG9ydCBlbnVtIEVudHJ5VHlwZSB7XG4gIEZvbGRlciA9ICdmb2xkZXInLFxuICBUcmFzaCA9ICd0cmFzaCcsXG4gIEZpbGUgPSAnZmlsZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW50cnkge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IEVudHJ5VHlwZTtcbiAgaWQ6IHN0cmluZztcbiAgY2hpbGRyZW46IElFbnRyeVtdO1xuICBtZXRhZGF0YTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvbGRlciBleHRlbmRzIElFbnRyeSB7XG4gIHR5cGU6IEVudHJ5VHlwZS5Gb2xkZXIgfCBFbnRyeVR5cGUuVHJhc2g7XG4gIGlkOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBJRW50cnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRmlsZSBleHRlbmRzIElFbnRyeSB7XG4gIHR5cGU6IEVudHJ5VHlwZS5GaWxlXG4gIGlkOiBzdHJpbmc7XG59IiwiaW1wb3J0IHsgRW50cnlUeXBlLCBJRW50cnksIElGb2xkZXIsIElGaWxlIH0gZnJvbSAnLic7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tICcuLi8uLi91dGlscy9yYW5kb20nO1xuXG4vKlxuKiAgIEZpbGUgU3lzdGVtIEZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGNyZWF0ZSwgbW92ZSwgYW5kIGRlbGV0ZSBmaWxlIHN5c3RlbSBlbnRyaWVzXG4qICAgRG9lcyBub3QgZGVwZW5kIG9uIHN0YXRlIFxuKi9cblxuaW50ZXJmYWNlIHJlc3BvbnNlUHJvcCB7XG4gIHN1Y2NlZWRlZDogYm9vbGVhbixcbiAgZXJyb3I6IHN0cmluZyxcbn1cblxuY29uc3QgY3JlYXRlRW50cnkgPSAobmFtZTogc3RyaW5nLCB0eXBlOiBFbnRyeVR5cGUsIGlkOiBzdHJpbmcsIGNoaWxkcmVuPzogSUVudHJ5W10pOiBJRW50cnkgPT4ge1xuICBjb25zdCBtZXRhZGF0YSA9IHt9O1xuICBpZiAodHlwZSA9PT0gRW50cnlUeXBlLkZpbGUpIHJldHVybiB7IG5hbWUsIHR5cGUsIGlkLCBtZXRhZGF0YSB9IGFzIElFbnRyeTtcbiAgZWxzZSByZXR1cm4geyBuYW1lLCB0eXBlLCBpZCwgY2hpbGRyZW4sIG1ldGFkYXRhIH0gYXMgSUVudHJ5O1xufTtcblxuY29uc3QgY3JlYXRlRm9sZGVyID0gKG5hbWU6IHN0cmluZyk6IElGb2xkZXIgPT4ge1xuICByZXR1cm4gY3JlYXRlRW50cnkobmFtZSwgRW50cnlUeXBlLkZvbGRlciwgdXVpZHY0KCksIFtdKSBhcyBJRm9sZGVyO1xufTtcblxuY29uc3QgY3JlYXRlVHJhc2ggPSAobmFtZTogc3RyaW5nKTogSUZvbGRlciA9PiB7XG4gIHJldHVybiBjcmVhdGVFbnRyeShuYW1lLCBFbnRyeVR5cGUuVHJhc2gsIHV1aWR2NCgpLCBbXSkgYXMgSUZvbGRlcjtcbn07XG5cbmNvbnN0IGNyZWF0ZUZpbGUgPSAobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogSUZpbGUgPT4ge1xuICByZXR1cm4gY3JlYXRlRW50cnkobmFtZSwgRW50cnlUeXBlLkZpbGUsIGlkKSBhcyBJRmlsZTtcbn07XG5cbmZ1bmN0aW9uIGFkZE1ldGFkYXRhKGVudHJ5OiBJRW50cnksIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IElFbnRyeSB7XG4gIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBlbnRyeS5tZXRhZGF0YVtrZXldID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gZW50cnk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU1ldGFkYXRhKGVudHJ5OiBJRW50cnksIGtleXM6IHN0cmluZ1tdKTogSUVudHJ5IHtcbiAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBkZWxldGUgZW50cnkubWV0YWRhdGFba2V5XTtcbiAgfSk7XG4gIHJldHVybiBlbnRyeTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZW50cnkgY2FuIGJlIGFkZGVkIHRvIHBhcmVudCBmb2xkZXJcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yOiBzdHJpbmcgfVxuICovXG5jb25zdCBjYW5BZGRFbnRyeSA9IChlbnRyeTogSUVudHJ5LCBwYXJlbnQ6IElGb2xkZXIpOiByZXNwb25zZVByb3AgPT4ge1xuICBjb25zdCBuYW1lRXhpc3RzID0gcGFyZW50LmNoaWxkcmVuLnNvbWUoKGUpID0+IGUubmFtZSA9PT0gZW50cnkubmFtZSk7XG4gIGNvbnN0IGlzSW1tdXRhYmxlID0gcGFyZW50Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcblxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAobmFtZUV4aXN0cykgICAgICAgcmV0dXJuT2JqLmVycm9yID0gYER1cGxpY2F0ZSBuYW1lOiAke2VudHJ5Lm5hbWV9IGFscmVhZHkgZXhpc3RzIGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlKSAgcmV0dXJuT2JqLmVycm9yID0gYCR7cGFyZW50Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuXG4gIHJldHVybiByZXR1cm5PYmo7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHBhcmVudCBmb2xkZXJcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yPzogc3RyaW5nIH1cbiAqL1xuY29uc3QgY2FuUmVtb3ZlRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyKTogcmVzcG9uc2VQcm9wID0+IHtcbiAgY29uc3QgaWR4ID0gcGFyZW50LmNoaWxkcmVuLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gZW50cnkuaWQpO1xuICBjb25zdCBleGlzdHNJblBhcmVudCA9IGlkeCAhPT0gLTE7XG4gIGNvbnN0IGlzSW1tdXRhYmxlUGFyZW50ID0gcGFyZW50Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcbiAgY29uc3QgaXNJbW11dGFibGVFbnRyeSA9IGVudHJ5Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcblxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAoIWV4aXN0c0luUGFyZW50KSAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGAke2VudHJ5Lm5hbWV9IGRvZXMgbm90IGV4aXN0IGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlUGFyZW50KSAgICAgcmV0dXJuT2JqLmVycm9yID0gYCR7cGFyZW50Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIGlmIChpc0ltbXV0YWJsZUVudHJ5KSAgICAgIHJldHVybk9iai5lcnJvciA9IGAke2VudHJ5Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuXG4gIHJldHVybiByZXR1cm5PYmo7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgbW92ZWQgZnJvbSBwYXJlbnQgdG8gbmV3UGFyZW50IChubyBkdXBsaWNhdGUsIG11dGFibGUgcGFyZW50cywgZW50cnkgZXhpc3RzKVxuICogQHBhcmFtIGVudHJ5IFxuICogQHBhcmFtIHBhcmVudCBcbiAqIEBwYXJhbSBuZXdQYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yOiBzdHJpbmcgfVxuICovXG5jb25zdCBjYW5Nb3ZlRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdQYXJlbnQ6IElGb2xkZXIpOiByZXNwb25zZVByb3AgPT4ge1xuICAvLyBpcyBBIGEgY2hpbGQgb2YgQlxuICBmdW5jdGlvbiBpc0NoaWxkT2YoYTogSUVudHJ5LCBiOiBJRm9sZGVyKSB7XG4gICAgcmV0dXJuIGIuY2hpbGRyZW5cbiAgICAgIC5maWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gRW50cnlUeXBlLkZvbGRlcilcbiAgICAgIC5tYXAoKGM6IElGb2xkZXIpID0+IHtcbiAgICAgICAgaWYgKGMgPT09IGEpIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiBpc0NoaWxkT2YoYSwgYyk7XG4gICAgICB9KVxuICAgICAgLnNvbWUoKGUpID0+IGUgPT09IHRydWUpO1xuICB9XG4gICAgXG4gIGNvbnN0IGlzU2FtZSA9IGVudHJ5ID09PSBuZXdQYXJlbnQ7XG4gIGNvbnN0IG5hbWVFeGlzdHMgPSBuZXdQYXJlbnQuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lKTtcbiAgY29uc3QgaXNJbW11dGFibGVQYXJlbnQgPSBwYXJlbnQubWV0YWRhdGFbJ2ltbXV0YWJsZSddO1xuICBjb25zdCBpc0ltbXV0YWJsZU5ld1BhcmVudCA9IG5ld1BhcmVudC5tZXRhZGF0YVsnaW1tdXRhYmxlJ107XG4gIGNvbnN0IGV4aXN0c0luUGFyZW50ID0gcGFyZW50LmNoaWxkcmVuLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gZW50cnkuaWQpICE9PSAtMTtcbiAgLy8gaWYgZW50cnkgaXMgYSBmb2xkZXIsIGNoZWNrIGlmIG5ld1BhcmVudCBpcyBhIHN1YmZvbGRlciBvZiBlbnRyeVxuICBjb25zdCBuZXdQYXJlbnRJc0NoaWxkT2ZFbnRyeSA9IChlbnRyeS50eXBlID09IEVudHJ5VHlwZS5Gb2xkZXIpID8gaXNDaGlsZE9mKG5ld1BhcmVudCwgZW50cnkgYXMgSUZvbGRlcikgOiBmYWxzZTtcblxuXG4gIGNvbnN0IHJldHVybk9iaiA9IHsgc3VjY2VlZGVkOiBmYWxzZSwgZXJyb3I6ICcnIH07XG4gIGlmIChpc1NhbWUpICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGBDYW5ub3QgbW92ZSAke2VudHJ5Lm5hbWV9IHRvIGl0c2VsZi5gO1xuICBlbHNlIGlmIChuYW1lRXhpc3RzKSAgICAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGBEdXBsaWNhdGUgbmFtZTogJHtlbnRyeS5uYW1lfSBhbHJlYWR5IGV4aXN0cyBpbiAke25ld1BhcmVudC5uYW1lfS5gO1xuICBlbHNlIGlmIChpc0ltbXV0YWJsZVBhcmVudCkgICAgICAgICByZXR1cm5PYmouZXJyb3IgPSBgJHtwYXJlbnQubmFtZX0gaXMgaW1tdXRhYmxlLmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlTmV3UGFyZW50KSAgICAgIHJldHVybk9iai5lcnJvciA9IGAke25ld1BhcmVudC5uYW1lfSBpcyBpbW11dGFibGUuYDtcbiAgZWxzZSBpZiAoIWV4aXN0c0luUGFyZW50KSAgICAgICAgICAgcmV0dXJuT2JqLmVycm9yID0gYCR7ZW50cnkubmFtZX0gZG9lcyBub3QgZXhpc3QgaW4gJHtwYXJlbnQubmFtZX0uYDtcbiAgZWxzZSBpZiAobmV3UGFyZW50SXNDaGlsZE9mRW50cnkpICAgcmV0dXJuT2JqLmVycm9yID0gYENhbm5vdCBtb3ZlICR7ZW50cnkubmFtZX0gaW50byBhIGl0cyBvd24gc3ViZm9sZGVyLCAke25ld1BhcmVudC5uYW1lfS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuICAgIFxuICByZXR1cm4gcmV0dXJuT2JqO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgZW50cnkgY2FuIGJlIHJlbmFtZWQgKG5vIGR1cGxpY2F0ZSlcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcGFyYW0gbmV3TmFtZSBcbiAqIEByZXR1cm5zIHJlc3BvbnNlIG9iamVjdCB7IHN1Y2NlZWRlZDogYm9vbGVhbiwgZXJyb3I6IHN0cmluZyB9XG4gKi9cbmNvbnN0IGNhblJlbmFtZUVudHJ5ID0gKGVudHJ5OiBJRW50cnksIHBhcmVudDogSUZvbGRlciwgbmV3TmFtZTogc3RyaW5nKTogcmVzcG9uc2VQcm9wID0+IHtcbiAgLy8gQ2hlY2sgaWYgbmV3TmFtZSBhbHJlYWR5IGV4aXN0cyBpbiBwYXJlbnRcbiAgY29uc3QgbmFtZUV4aXN0cyA9IHBhcmVudC5jaGlsZHJlbi5zb21lKChlLCBpZHgsIGFycikgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lICYmIGlkeCAhPT0gYXJyLmluZGV4T2YoZSkpO1xuICAgIFxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAobmFtZUV4aXN0cykgcmV0dXJuT2JqLmVycm9yID0gYER1cGxpY2F0ZSBuYW1lOiAke25ld05hbWV9IGFscmVhZHkgZXhpc3RzIGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgcmV0dXJuT2JqLnN1Y2NlZWRlZCA9IHRydWU7XG5cbiAgcmV0dXJuIHJldHVybk9iajtcbn07XG5cbi8qKlxuICogQWRkcyBlbnRyeSB0byBwYXJlbnQgZm9sZGVyXG4gKiBAcGFyYW0gZW50cnlcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFkZGVkLCBlbHNlIGZhbHNlXG4gKi9cbmNvbnN0IGFkZEVudHJ5ID0gKGVudHJ5OiBJRW50cnksIHBhcmVudDogSUZvbGRlcik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB7IHN1Y2NlZWRlZCwgZXJyb3IgfSA9IGNhbkFkZEVudHJ5KGVudHJ5LCBwYXJlbnQpO1xuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgLy8gQWRkIGVudHJ5IHRvIHBhcmVudCwgc29ydCBieSBhbHBoYW51bWVyaWNhbCBhbmQgZm9sZGVycyBiZWZvcmUgZmlsZXNcbiAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChlbnRyeSk7XG4gICAgc29ydEZvbGRlcihwYXJlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZW1vdmVzIGVudHJ5IGZyb20gcGFyZW50IGZvbGRlclxuICogQHBhcmFtIGVudHJ5IFxuICogQHBhcmFtIHBhcmVudCBcbiAqIEBwYXJhbSBmb3JjZSBmb3JjZSBhIHJlbW92YWxcbiAqIEByZXR1cm5zIHRydWUgaWYgcmVtb3ZlZCwgZWxzZSBmYWxzZVxuICovXG5jb25zdCByZW1vdmVFbnRyeSA9IChlbnRyeTogSUVudHJ5LCBwYXJlbnQ6IElGb2xkZXIsIGZvcmNlPWZhbHNlKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHsgc3VjY2VlZGVkLCBlcnJvciB9ID0gY2FuUmVtb3ZlRW50cnkoZW50cnksIHBhcmVudCk7XG4gIGlmIChzdWNjZWVkZWQgfHwgZm9yY2UpIHtcbiAgICBjb25zdCBpZHggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihlbnRyeSk7XG4gICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpZHgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBNb3ZlcyBlbnRyeSBmcm9tIHBhcmVudCB0byBuZXdQYXJlbnRcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcGFyYW0gbmV3UGFyZW50IFxuICogQHJldHVybnMgdHJ1ZSBpZiBtb3ZlZCwgZWxzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBtb3ZlRW50cnkoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdQYXJlbnQ6IElGb2xkZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbW92ZVJlc3BvbnNlID0gY2FuTW92ZUVudHJ5KGVudHJ5LCBwYXJlbnQsIG5ld1BhcmVudCk7XG5cbiAgaWYgKG1vdmVSZXNwb25zZS5zdWNjZWVkZWQpIHtcbiAgICBjb25zdCByZW1vdmVkID0gcmVtb3ZlRW50cnkoZW50cnksIHBhcmVudCwgdHJ1ZSk7XG4gICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgIGNvbnN0IGFkZGVkID0gYWRkRW50cnkoZW50cnksIG5ld1BhcmVudCk7XG4gICAgICBpZiAoYWRkZWQpIHJldHVybiB0cnVlO1xuICAgICAgZWxzZSBjb25zb2xlLmVycm9yKGBNb3Zpbmc6IGZhaWxlZCB0byBhZGQgJHtlbnRyeS5uYW1lfSB0byAke25ld1BhcmVudC5uYW1lfWApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYE1vdmluZzogZmFpbGVkIHRvIHJlbW92ZSAke2VudHJ5Lm5hbWV9IGZyb20gJHtwYXJlbnQubmFtZX1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihtb3ZlUmVzcG9uc2UuZXJyb3IpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZW5hbWVzIGVudHJ5XG4gKiBAcGFyYW0gZW50cnkgXG4gKiBAcGFyYW0gcGFyZW50IFxuICogQHBhcmFtIG5ld05hbWUgXG4gKiBAcmV0dXJucyB0cnVlIGlmIHJlbmFtZWQsIGVsc2UgZmFsc2VcbiAqL1xuY29uc3QgcmVuYW1lRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdOYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgeyBzdWNjZWVkZWQsIGVycm9yIH0gPSBjYW5SZW5hbWVFbnRyeShlbnRyeSwgcGFyZW50LCBuZXdOYW1lKTtcblxuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgZW50cnkubmFtZSA9IG5ld05hbWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBnZXRBbGxOYW1lcyA9IChmb2xkZXI6IElGb2xkZXIpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IG5hbWVzID0gZm9sZGVyLmNoaWxkcmVuLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKTtcbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiAgU29ydHMgZm9sZGVyIGJ5IGFscGhhbnVtZXJpY2FsIGFuZCBmb2xkZXJzIGJlZm9yZSBmaWxlcyBcbiAqIEBwYXJhbSBmb2xkZXIgXG4gKiBAcmV0dXJucyByZWZlcmVuY2UgdG8gc2FtZSBmb2xkZXJcbiAqL1xuZnVuY3Rpb24gc29ydEZvbGRlcihmb2xkZXI6IElGb2xkZXIpOiBJRm9sZGVyIHtcbiAgZm9sZGVyLmNoaWxkcmVuLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICBmb2xkZXIuY2hpbGRyZW4uc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLnR5cGUgPT09IEVudHJ5VHlwZS5GaWxlICYmIGIudHlwZSA9PT0gRW50cnlUeXBlLkZvbGRlcikgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoYS50eXBlID09PSBFbnRyeVR5cGUuRm9sZGVyICYmIGIudHlwZSA9PT0gRW50cnlUeXBlLkZpbGUpIHJldHVybiAtMTtcbiAgICBlbHNlIHJldHVybiAwO1xuICB9KTtcbiAgcmV0dXJuIGZvbGRlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEZpbGVTeXN0ZW1Ub29scyA9IHtcbiAgY3JlYXRlRm9sZGVyOiBjcmVhdGVGb2xkZXIsXG4gIGNyZWF0ZVRyYXNoOiBjcmVhdGVUcmFzaCxcbiAgY3JlYXRlRmlsZTogY3JlYXRlRmlsZSxcbiAgbW92ZUVudHJ5OiBtb3ZlRW50cnksXG4gIGNhbkFkZEVudHJ5OiBjYW5BZGRFbnRyeSxcbiAgY2FuUmVtb3ZlRW50cnk6IGNhblJlbW92ZUVudHJ5LFxuICBjYW5Nb3ZlRW50cnk6IGNhbk1vdmVFbnRyeSxcbiAgY2FuUmVuYW1lRW50cnk6IGNhblJlbmFtZUVudHJ5LFxuICBhZGRFbnRyeTogYWRkRW50cnksXG4gIHJlbW92ZUVudHJ5OiByZW1vdmVFbnRyeSxcbiAgYWRkTWV0YWRhdGE6IGFkZE1ldGFkYXRhLFxuICByZW1vdmVNZXRhZGF0YTogcmVtb3ZlTWV0YWRhdGEsXG4gIGdldEFsbE5hbWVzOiBnZXRBbGxOYW1lcyxcbiAgcmVuYW1lRW50cnk6IHJlbmFtZUVudHJ5LFxufTsiLCJpbXBvcnQgeyBJRm9sZGVyLCBGaWxlU3lzdGVtVG9vbHMgfSBmcm9tICcuJztcbmltcG9ydCB7IGZldGNoVXBsb2FkcyB9IGZyb20gJy4uL1N0b3JhZ2UnO1xuaW1wb3J0IHsgc2FtcGxlcyB9IGZyb20gJy4uL3NhbXBsZXNfZmlsZW5hbWVzJztcblxuaW50ZXJmYWNlIEZpbGVTeXN0ZW1Qcm9wcyB7XG4gIGdldFJvb3Q6ICgpID0+IFByb21pc2U8SUZvbGRlcj47XG4gIHNldEZpbGVTeXN0ZW06IChyb290OiBJRm9sZGVyKSA9PiBib29sZWFuO1xuICBnZXRGaWxlU3lzdGVtOiAoKSA9PiBQcm9taXNlPElGb2xkZXI+O1xuICBuZXdUcmFzaDogKHJvb3Q6IElGb2xkZXIpID0+IHZvaWQ7XG59XG4gIFxuXG4vLyBNYW5hZ2VyIGlzIHVzZWQgZm9yIGFjY2Vzc2luZyBsb2NhbCBzdG9yYWdlIGFuZCB0cmFja2luZyB0aGUgcG9zaXRpb24gb2YgY3VycmVudCBmb2xkZXJcbmV4cG9ydCBjb25zdCBGaWxlU3lzdGVtTWFuYWdlciA9ICgpOiBGaWxlU3lzdGVtUHJvcHMgPT4ge1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFJvb3QoKTogUHJvbWlzZTxJRm9sZGVyPiB7IFxuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlU3lzdGVtKCk7XG4gIH1cblxuICAvLyBTYXZlIGZpbGVzeXN0ZW0gaW50byBsb2NhbCBzdG9yYWdlXG4gIGZ1bmN0aW9uIHNldEZpbGVTeXN0ZW0ocm9vdDogSUZvbGRlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ25lb24tZnMnLCBKU09OLnN0cmluZ2lmeShyb290KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHdpbmRvdy5hbGVydCgnRXJyb3Igc2F2aW5nIGZpbGUgc3lzdGVtJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gTG9hZCBmaWxlc3lzdGVtIGZyb20gbG9jYWwgc3RvcmFnZSwgY3JlYXRlcyBuZXcgcm9vdCBpZiBub25lIGV4aXN0c1xuICBhc3luYyBmdW5jdGlvbiBnZXRGaWxlU3lzdGVtKCk6IFByb21pc2U8SUZvbGRlcj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmcyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbmVvbi1mcycpO1xuICAgICAgICAgICAgXG4gICAgICAvLyBpZiBsb2NhbHN0b3JhZ2UgZXhpc3RzLCBsb2FkIHByZXZpb3VzIHJvb3RcbiAgICAgIGlmIChmcykge1xuICAgICAgICBjb25zdCBsb2NhbEZpbGVTeXN0ZW0gPSBKU09OLnBhcnNlKGZzKSBhcyBJRm9sZGVyO1xuICAgICAgICByZXR1cm4gbG9jYWxGaWxlU3lzdGVtO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSwgY3JlYXRlIG5ldyByb290XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGb2xkZXIoJ0hvbWUnKTtcbiAgICAgICAgbG9hZFNhbXBsZXMocm9vdCk7XG4gICAgICAgIG5ld1RyYXNoKHJvb3QpO1xuICAgICAgICBhd2FpdCBsb2FkUHJldmlvdXNVcGxvYWRzKHJvb3QpO1xuICAgICAgICBzZXRGaWxlU3lzdGVtKHJvb3QpO1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgd2luZG93LmFsZXJ0KCdFcnJvciBsb2FkaW5nIGZpbGUgc3lzdGVtJyk7XG4gICAgfVxuICB9IFxuXG4gIC8vIFRoaXMgbmV4dCBmdW5jdGlvbiBpcyBzb2xlbHkgZm9yIGxvYWRpbmcgc2FtcGxlcyBpbnRvIHRoZSByb290IGFzIGEgZGVmYXVsdCBmb3IgTmVvblxuICBmdW5jdGlvbiBsb2FkU2FtcGxlcyhyb290OiBJRm9sZGVyKSB7XG4gICAgLy8gTWFrZSBzYW1wbGUgZW50cmllc1xuICAgIGNvbnN0IHNhbXBsZUVudHJpZXMgPSBzYW1wbGVzLm1hcCgoW25hbWUsIHR5cGVdKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGaWxlKG5hbWUsIG5hbWUpO1xuICAgICAgaWYgKHR5cGUgPT09ICdmb2xpbycpIHtcbiAgICAgICAgRmlsZVN5c3RlbVRvb2xzLmFkZE1ldGFkYXRhKGVudHJ5LCB7IHR5cGU6ICdmb2xpbycsIGRvY3VtZW50OiAnc2FtcGxlJywgaW1tdXRhYmxlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ21hbnVzY3JpcHQnKSB7XG4gICAgICAgIEZpbGVTeXN0ZW1Ub29scy5hZGRNZXRhZGF0YShlbnRyeSwgeyB0eXBlOiAnbWFudXNjcmlwdCcsIGRvY3VtZW50OiAnc2FtcGxlJywgaW1tdXRhYmxlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xuXG4gICAgLy8gTWFrZSBzYW1wbGVzIGZvbGRlciBhbmQgYWRkIHRvIHJvb3RcbiAgICBjb25zdCBzYW1wbGVzRm9sZGVyID0gRmlsZVN5c3RlbVRvb2xzLmNyZWF0ZUZvbGRlcignU2FtcGxlcycpO1xuICAgIC8vIEFkZCBzYW1wbGUgZW50cmllcyB0byBzYW1wbGVzIGZvbGRlclxuICAgIHNhbXBsZUVudHJpZXMuZm9yRWFjaCgoc2FtcGxlKSA9PiB7XG4gICAgICBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkoc2FtcGxlLCBzYW1wbGVzRm9sZGVyKTtcbiAgICB9KTtcbiAgICBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkoc2FtcGxlc0ZvbGRlciwgcm9vdCk7XG4gICAgRmlsZVN5c3RlbVRvb2xzLmFkZE1ldGFkYXRhKHNhbXBsZXNGb2xkZXIsIHsgaW1tdXRhYmxlOiB0cnVlIH0pO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBmdW5jdGlvbiBuZXdUcmFzaChyb290OiBJRm9sZGVyKSB7XG4gICAgY29uc3QgdHJhc2hGb2xkZXIgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlVHJhc2goJ1RyYXNoJyk7XG4gICAgRmlsZVN5c3RlbVRvb2xzLmFkZEVudHJ5KHRyYXNoRm9sZGVyLCByb290KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRQcmV2aW91c1VwbG9hZHMocm9vdDogSUZvbGRlcikge1xuICAgIC8vIEdldCBwcmV2aW91cyB1cGxvYWRzIGZyb20gbG9jYWwgc3RvcmFnZVxuICAgIGNvbnN0IHVwbG9hZHMgPSBhd2FpdCBmZXRjaFVwbG9hZHMoKTtcblxuICAgIC8vIE1ha2UgdXBsb2FkIGVudHJpZXNcbiAgICBjb25zdCB1cGxvYWRFbnRyaWVzID0gdXBsb2Fkcy5tYXAoKHVwbG9hZCkgPT4ge1xuICAgICAgcmV0dXJuIEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGaWxlKHVwbG9hZC5uYW1lLCB1cGxvYWQuaWQpO1xuICAgIH0pO1xuXG4gICAgdXBsb2FkRW50cmllcy5mb3JFYWNoKCh1cGxvYWQpID0+IHtcbiAgICAgIEZpbGVTeXN0ZW1Ub29scy5hZGRFbnRyeSh1cGxvYWQsIHJvb3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBjb25zdCBGaWxlU3lzdGVtUHJvcHM6IEZpbGVTeXN0ZW1Qcm9wcyA9IHtcbiAgICBnZXRSb290OiBnZXRSb290LFxuICAgIHNldEZpbGVTeXN0ZW06IHNldEZpbGVTeXN0ZW0sXG4gICAgZ2V0RmlsZVN5c3RlbTogZ2V0RmlsZVN5c3RlbSxcbiAgICBuZXdUcmFzaDogbmV3VHJhc2gsXG4gIH07XG5cbiAgcmV0dXJuIEZpbGVTeXN0ZW1Qcm9wcztcbn07IiwiZXhwb3J0IGNvbnN0IHNhbXBsZXMgPSBbXG4gIFsnQ0ROLUhzbXVfTTIxNDkuTDRfMDAxcicsICdmb2xpbyddLFxuICBbJ0NETi1Ic211X00yMTQ5Lkw0XzAwMnInLCAnZm9saW8nXSxcbiAgWydDSC1FXzYxMV8wMjRyJywgJ2ZvbGlvJ10sXG4gIFsnQ0gtRV82MTFfMDI2cicsICdmb2xpbyddLFxuICBbJ0NILUVfNjExXzAyOHInLCAnZm9saW8nXSxcbiAgWydTYWx6aW5uZXMnLCAnbWFudXNjcmlwdCddXG5dOyIsImltcG9ydCB7IElFbnRyeSwgSUZvbGRlciB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmV4cG9ydCBjbGFzcyBTaGlmdFNlbGVjdGlvbk1hbmFnZXIge1xuICBwcml2YXRlIHN0YXJ0OiBudW1iZXI7XG4gIHByaXZhdGUgZW5kOiBudW1iZXI7XG4gIHByaXZhdGUgcHJldlNlbGVjdGlvbjogbnVtYmVyW10gPSBbXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgcHVibGljIHNldFN0YXJ0KHN0YXJ0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5zdGFydCA9IE1hdGgubWF4KHN0YXJ0LCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFbmQoZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0ID0gMDtcbiAgICB0aGlzLmVuZCA9IC0xO1xuICAgIHRoaXMucHJldlNlbGVjdGlvbi5zcGxpY2UoMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJldlNlbGVjdGlvbigpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJldlNlbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3Rpb24ob3JkZXJlZFNlbGVjdGlvbjogYm9vbGVhbltdKTogbnVtYmVyW10ge1xuICAgIGxldCBzdGFydDogbnVtYmVyO1xuICAgIGxldCBlbmQ6IG51bWJlcjtcblxuICAgIGlmICh0aGlzLmVuZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kIDwgdGhpcy5zdGFydCkge1xuICAgICAgc3RhcnQgPSB0aGlzLmVuZDtcbiAgICAgIGVuZCA9IHRoaXMuc3RhcnQgKyAxO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN0YXJ0ID0gdGhpcy5zdGFydDtcbiAgICAgIGVuZCA9IHRoaXMuZW5kICsgMTtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2UgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAoZW5kIC0gc3RhcnQpIH0sICh2LCBrKSA9PiBrICsgc3RhcnQpO1xuXG4gICAgLy8gRm9yIGVhY2ggc2hpZnQgc2VsZWN0aW9uIGFjdGlvbjogaWYgdGhlIFNoaWZ0IGtleSBpcyBzdGlsbCBoZWxkLCB0aGUgZW5kIHNoaWZ0IHBvcyBjYW4gY2hhbmdlXG4gICAgLy8gd2l0aCB0aGUgcHJldmlvdXNseSAoYmVmb3JlLXNoaWZ0KSBzZWxlY3RlZCBlbGVtZW50cyBzdGlsbCBzZWxlY3RlZCB3aGlsZSB0aGUgY3VycmVudCBzaGlmdCBzZWxlY3Rpb25zIHVuc2VsZWN0LlxuICAgIGNvbnN0IHNwZWNpZmljU2VsZWN0aW9uID0gcmFuZ2UuZmlsdGVyKGlkeCA9PiAhKG9yZGVyZWRTZWxlY3Rpb25baWR4XSkpO1xuICAgIHRoaXMucHJldlNlbGVjdGlvbiA9IHNwZWNpZmljU2VsZWN0aW9uO1xuICAgIHJldHVybiBzcGVjaWZpY1NlbGVjdGlvbjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFN0YXRlIHtcbiAgcm9vdChyb290Rm9sZGVyPzogSUZvbGRlcik6IElGb2xkZXIgfCBudWxsO1xuICBzZXRFbnRyaWVzKGVudHJpZXM6IElFbnRyeVtdKTogdm9pZDtcbiAgZ2V0RW50cmllcygpOiBJRW50cnlbXTtcbiAgZ2V0SW5kZXhCeUVudHJ5TmFtZShuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIHNldFNlbGVjdGlvbihpbmRleDogbnVtYmVyLCBib29sOiBib29sZWFuKTogdm9pZDtcbiAgZ2V0U2VsZWN0aW9uKCk6IGJvb2xlYW5bXTtcbiAgcmVzZXRTZWxlY3Rpb24oKTogdm9pZDtcbiAgc2V0Rm9sZGVyUGF0aChwYXRoOiBJRm9sZGVyW10pOiB2b2lkO1xuICBnZXRGb2xkZXJQYXRoKCk6IElGb2xkZXJbXTtcbiAgZ2V0Rm9sZGVyUGF0aE5hbWVzKCk6IHN0cmluZ1tdO1xuICBnZXRGb2xkZXJQYXRoQnlOYW1lcyhmb2xkZXJOYW1lczogc3RyaW5nW10pOiBJRm9sZGVyIHwgdm9pZDtcbiAgZ2V0UGFyZW50Rm9sZGVyKCk6IElGb2xkZXIgfCB1bmRlZmluZWQ7XG4gIGdldFRyYXNoRm9sZGVyKCk6IElGb2xkZXI7XG4gIGdldFNlbGVjdGVkRW50cmllcygpOiBJRW50cnlbXTtcbiAgZ2V0U2VsZWN0ZWRGb2xkZXJzKCk6IElFbnRyeVtdO1xuICBnZXRTZWxlY3RlZFRyYXNoKCk6IElFbnRyeVtdO1xuICBnZXRTZWxlY3RlZEZpbGVzKCk6IElFbnRyeVtdO1xuICBpc0luVHJhc2goKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZFN0YXRlKCk6IERhc2hib2FyZFN0YXRlIHtcbiAgLy8gYXMgZGlzcGxheWVkIG9uIHRoZSBkYXNoYm9hcmRcbiAgbGV0IG9yZGVyZWRFbnRyaWVzOiBJRW50cnlbXSA9IFtdO1xuICBsZXQgb3JkZXJlZFNlbGVjdGlvbjogYm9vbGVhbltdID0gW107XG4gIC8vIGNvbnN0IGN1cnJlbnRGaWxlU2VsZWN0aW9uID0gW107IC8vIGN1cnJlbnRseSB1c2VyLXNlbGVjdGVkIGZpbGVzXG4gIC8vIGNvbnN0IGN1cnJlbnRGb2xkZXJTZWxlY3Rpb24gPSBbXTsgLy8gY3VycmVudGx5IHVzZXItc2VsZWN0ZWQgZm9sZGVyc1xuXG4gIC8vIHBhdGggbGVhZGluZyB0byBjdXJyZW50IGZvbGRlclxuICBsZXQgZm9sZGVyUGF0aDogSUZvbGRlcltdID0gW107XG4gIGxldCBfcm9vdDogSUZvbGRlciA9IG51bGw7XG5cbiAgLyoqIFxuICAgKiBTZXRzIG9yIGdldHMgdGhlIHJvb3QgZm9sZGVyXG4gICAqIEBwYXJhbSByb290Rm9sZGVyIChvcHRpb25hbCkgLSB0aGUgcm9vdCBmb2xkZXIgdG8gc2V0XG4gICAqIEByZXR1cm5zIHRoZSByb290IGZvbGRlclxuICAgKi8gXG4gIGZ1bmN0aW9uIHJvb3Qocm9vdEZvbGRlcj86IElGb2xkZXIpIHtcbiAgICBpZiAocm9vdEZvbGRlcikgX3Jvb3QgPSByb290Rm9sZGVyO1xuICAgIHJldHVybiBfcm9vdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEVudHJpZXMoZW50cmllczogSUVudHJ5W10pIHtcbiAgICBvcmRlcmVkRW50cmllcyA9IGVudHJpZXM7XG4gICAgb3JkZXJlZFNlbGVjdGlvbiA9IEFycmF5KGVudHJpZXMubGVuZ3RoKS5maWxsKGZhbHNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIG9yZGVyZWRFbnRyaWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5kZXhCeUVudHJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gb3JkZXJlZEVudHJpZXMuZmluZEluZGV4KGVudHJ5ID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIGJvb2w6IGJvb2xlYW4pIHtcbiAgICBvcmRlcmVkU2VsZWN0aW9uW2luZGV4XSA9IGJvb2w7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9yZGVyZWRTZWxlY3Rpb247XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFNlbGVjdGlvbigpIHtcbiAgICBvcmRlcmVkU2VsZWN0aW9uLmZpbGwoZmFsc2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0Rm9sZGVyUGF0aChwYXRoOiBJRm9sZGVyW10pIHtcbiAgICBmb2xkZXJQYXRoID0gcGF0aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZvbGRlclBhdGgoKSB7XG4gICAgcmV0dXJuIGZvbGRlclBhdGg7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb2xkZXJQYXRoTmFtZXMoKSB7XG4gICAgcmV0dXJuIGZvbGRlclBhdGgubWFwKGZvbGRlciA9PiBmb2xkZXIubmFtZSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb2xkZXJQYXRoQnlOYW1lcyhmb2xkZXJOYW1lczogc3RyaW5nW10pOiBJRm9sZGVyIHwgdm9pZCB7XG4gICAgbGV0IGN1cnJlbnRGb2xkZXIgPSByb290KCk7XG4gICAgZm9sZGVyTmFtZXMgPSBmb2xkZXJOYW1lcy5zbGljZSgxKTtcblxuICAgIGZvciAoY29uc3QgZm9sZGVyTmFtZSBvZiBmb2xkZXJOYW1lcykge1xuICAgICAgY29uc3QgdGFyZ2V0Rm9sZGVyID0gY3VycmVudEZvbGRlci5jaGlsZHJlbi5maW5kKGNoaWxkID0+IGNoaWxkLm5hbWUgPT09IGZvbGRlck5hbWUpO1xuICAgICAgaWYgKHRhcmdldEZvbGRlciAmJiB0YXJnZXRGb2xkZXIudHlwZSA9PT0gJ2ZvbGRlcicpIHtcbiAgICAgICAgY3VycmVudEZvbGRlciA9IHRhcmdldEZvbGRlciBhcyBJRm9sZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnZmFpbGVkIHRvIGZpbmQgZm9sZGVyOiAnLCBmb2xkZXJOYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50Rm9sZGVyO1xuICB9XG5cblxuICBmdW5jdGlvbiBnZXRQYXJlbnRGb2xkZXIoKSB7IFxuICAgIHJldHVybiBmb2xkZXJQYXRoLmF0KC0xKTsgXG4gIH1cblxuICBmdW5jdGlvbiBnZXRUcmFzaEZvbGRlcigpIHtcbiAgICBjb25zdCB0cmFzaEZvbGRlcnMgPSByb290KCkuY2hpbGRyZW4uZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnR5cGUgPT09ICd0cmFzaCcpIGFzIElGb2xkZXJbXTtcbiAgICByZXR1cm4gdHJhc2hGb2xkZXJzWzBdO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRFbnRyaWVzKCkge1xuICAgIHJldHVybiBvcmRlcmVkRW50cmllcy5maWx0ZXIoKF8sIGlkeCkgPT4gb3JkZXJlZFNlbGVjdGlvbltpZHhdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkRm9sZGVycygpIHtcbiAgICByZXR1cm4gZ2V0U2VsZWN0ZWRFbnRyaWVzKCkuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnR5cGUgPT09ICdmb2xkZXInKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkVHJhc2goKSB7XG4gICAgcmV0dXJuIGdldFNlbGVjdGVkRW50cmllcygpLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50eXBlID09PSAndHJhc2gnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkRmlsZXMoKSB7XG4gICAgcmV0dXJuIGdldFNlbGVjdGVkRW50cmllcygpLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50eXBlID09PSAnZmlsZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNJblRyYXNoKCkge1xuICAgIGNvbnN0IGlzVHJhc2hGb2xkZXIgPSAoZm9sZGVyOiBJRm9sZGVyKTogYm9vbGVhbiA9PiBmb2xkZXIudHlwZSA9PT0gJ3RyYXNoJztcbiAgICByZXR1cm4gZm9sZGVyUGF0aC5zb21lKGlzVHJhc2hGb2xkZXIpO1xuICB9XG5cbiAgLy8gVE9ETzpcbiAgLy8gZnVuY3Rpb24gc29ydEVudHJpZXMoKSB7fVxuXG4gIHJldHVybiB7XG4gICAgcm9vdDogcm9vdCxcbiAgICBzZXRFbnRyaWVzOiBzZXRFbnRyaWVzLFxuICAgIGdldEVudHJpZXM6IGdldEVudHJpZXMsXG4gICAgZ2V0SW5kZXhCeUVudHJ5TmFtZTogZ2V0SW5kZXhCeUVudHJ5TmFtZSxcbiAgICBzZXRTZWxlY3Rpb246IHNldFNlbGVjdGlvbixcbiAgICBnZXRTZWxlY3Rpb246IGdldFNlbGVjdGlvbixcbiAgICByZXNldFNlbGVjdGlvbjogcmVzZXRTZWxlY3Rpb24sXG4gICAgc2V0Rm9sZGVyUGF0aDogc2V0Rm9sZGVyUGF0aCxcbiAgICBnZXRGb2xkZXJQYXRoOiBnZXRGb2xkZXJQYXRoLFxuICAgIGdldEZvbGRlclBhdGhOYW1lczogZ2V0Rm9sZGVyUGF0aE5hbWVzLFxuICAgIGdldEZvbGRlclBhdGhCeU5hbWVzOiBnZXRGb2xkZXJQYXRoQnlOYW1lcyxcbiAgICBnZXRQYXJlbnRGb2xkZXI6IGdldFBhcmVudEZvbGRlcixcbiAgICBnZXRUcmFzaEZvbGRlcjogZ2V0VHJhc2hGb2xkZXIsXG4gICAgZ2V0U2VsZWN0ZWRFbnRyaWVzOiBnZXRTZWxlY3RlZEVudHJpZXMsXG4gICAgZ2V0U2VsZWN0ZWRGb2xkZXJzOiBnZXRTZWxlY3RlZEZvbGRlcnMsXG4gICAgZ2V0U2VsZWN0ZWRUcmFzaDogZ2V0U2VsZWN0ZWRUcmFzaCxcbiAgICBnZXRTZWxlY3RlZEZpbGVzOiBnZXRTZWxlY3RlZEZpbGVzLFxuICAgIGlzSW5UcmFzaDogaXNJblRyYXNoLFxuICB9O1xufSIsImltcG9ydCB7IE1vZGFsV2luZG93LCBNb2RhbFdpbmRvd1ZpZXcgfSBmcm9tICcuLi91dGlscy9Nb2RhbFdpbmRvdyc7XG5pbXBvcnQge1xuICBhZGROZXdGaWxlcyxcbiAgaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzLFxuICBoYW5kbGVNYWtlUGFpcixcbiAgc29ydEZpbGVCeU5hbWUsXG59IGZyb20gJy4vVXBsb2FkVG9vbHMnO1xuaW1wb3J0IHsgdXBkYXRlRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgSUZvbGRlciB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVVwbG9hZFVwZGF0ZShcbiAgbW9kYWxXaW5kb3c6IE1vZGFsV2luZG93LFxuICBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLFxuKSB7XG4gIGNvbnN0IHNwaW5uZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdXBsb2FkaW5nX3NwaW5uZXInKTtcbiAgc3Bpbm5lci5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzKGN1cnJlbnRGb2xkZXIpXG4gICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICAgICAgc3Bpbm5lci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuXG4gICAgICAgIC8vIFNob3cgdXBsb2FkZWQgZmlsZW5hbWVzXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxGaWxlcyA9IHJlc3VsdHNcbiAgICAgICAgICAuZmlsdGVyKChyZXN1bHQpID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZSlcbiAgICAgICAgICAubWFwKChyZXN1bHQpID0+IHJlc3VsdC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHN1Y2Nlc3NmdWxGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgaW5mb0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tYmFkZ2UnKTtcbiAgICAgICAgICBpbmZvQmFkZ2UudGV4dENvbnRlbnQgPSBgVXBsb2FkZWQgZmlsZXM6ICR7c3VjY2Vzc2Z1bEZpbGVzLmpvaW4oXG4gICAgICAgICAgICAnLCAnLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgICBpbmZvQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgaW5mb0JhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAnIzlEQjJCRic7XG4gICAgICAgIH1cbiAgICAgIH0sIDIwMDApO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ09uZSBvciBtb3JlIHVwbG9hZHMgcmVqZWN0ZWQ6ICcsIGVycm9yKTtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICAgICAgc3Bpbm5lci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgICAgfSwgMjAwMCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJbml0VXBsb2FkQXJlYShjdXJyZW50Rm9sZGVyOiBJRm9sZGVyKTogdm9pZCB7XG4gIC8vIGdlbmVyYXRlIG1vZGFsIHdpbmRvd1xuICBjb25zdCBtb2RhbFdpbmRvdyA9IG5ldyBNb2RhbFdpbmRvdygpO1xuICBtb2RhbFdpbmRvdy5zZXRNb2RhbFdpbmRvd1ZpZXcoTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRCk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xuXG4gIGNvbnN0IHBhaXJCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFrZV9wYWlyJyk7XG4gIGNvbnN0IHVwbG9hZEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN1cGxvYWRfYnV0dG9uJyk7XG5cbiAgcGFpckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZU1ha2VQYWlyKTtcbiAgdXBsb2FkQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT5cbiAgICBoYW5kbGVVcGxvYWRVcGRhdGUobW9kYWxXaW5kb3csIGN1cnJlbnRGb2xkZXIpLFxuICApO1xuXG4gIC8vIHJlcXVlc3QgdXNlciBmaWxlIHN5c3RlbSB3aGVuIGNsaWNraW5nIG9uIHVwbG9hZCBhcmVhXG4gIGNvbnN0IGZpbGVTZWxlY3RvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGZpbGVTZWxlY3Rvci50eXBlID0gJ2ZpbGUnO1xuICBmaWxlU2VsZWN0b3IubXVsdGlwbGUgPSB0cnVlO1xuICBmaWxlU2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gaGFuZGxlRmlsZVNlbGVjdG9yQ2hhbmdlKCkge1xuICAgIGNvbnN0IGZpbGVMaXN0OiBGaWxlTGlzdCA9IGZpbGVTZWxlY3Rvci5maWxlcztcbiAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20oZmlsZUxpc3QpO1xuICAgIGNvbnN0IHJlamVjdEZpbGVzID0gYWRkTmV3RmlsZXMoZmlsZXMpO1xuICAgIGlmIChyZWplY3RGaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lcyA9IHJlamVjdEZpbGVzLm1hcCgoZmlsZSkgPT4gZmlsZS5uYW1lKTtcbiAgICAgIHdpbmRvdy5hbGVydChcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIG5vdCAubWVpLCAucG5nLCAuanBlZywgb3IgLmpzb25sZCBmaWxlczogXFxuXFxuJHtmaWxlbmFtZXMuam9pbihcbiAgICAgICAgICAnXFxuJyxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIHNlbGVjdGlvblxuICAgIGZpbGVTZWxlY3Rvci52YWx1ZSA9IG51bGw7XG4gIH0pO1xuXG4gIC8vIEFkZCBldmVudCBsaXN0ZW5lcnMgZm9yIGNsaWNrIGFuZCBkcmFnIGFuZCBkcm9wXG4gIGNvbnN0IHVwbG9hZF9hcmVhOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJyNpbml0aWFsX3VwbG9hZF9hcmVhJyxcbiAgKTtcbiAgdXBsb2FkX2FyZWEub25jbGljayA9ICgpID0+IGZpbGVTZWxlY3Rvci5jbGljaygpO1xuICAvLyBhZGQgdmlzdWFsIGN1ZXMgZm9yIGRyYWdnaW5nIGZpbGVzIG92ZXIgdXBsb2FkIGFyZWFcbiAgdXBsb2FkX2FyZWEub25kcmFnbGVhdmUgPSAoKSA9PiB1cGxvYWRfYXJlYS5jbGFzc0xpc3QucmVtb3ZlKCdvdmVyJyk7XG4gIHVwbG9hZF9hcmVhLm9uZHJhZ292ZXIgPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHVwbG9hZF9hcmVhLmNsYXNzTGlzdC5hZGQoJ292ZXInKTtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JztcbiAgfTtcbiAgLy8gcmVjZWl2ZSBmaWxlcyBvbmNlIGZpbGVzIGFyZSBkcm9wcGVkXG4gIHVwbG9hZF9hcmVhLm9uZHJvcCA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdXBsb2FkX2FyZWEuY2xhc3NMaXN0LnJlbW92ZSgnb3ZlcicpO1xuICAgIGNvbnN0IGZpbGVMaXN0ID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShmaWxlTGlzdCk7XG4gICAgY29uc3QgcmVqZWN0RmlsZXMgPSBhZGROZXdGaWxlcyhmaWxlcyk7XG4gICAgaWYgKHJlamVjdEZpbGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3QgZmlsZW5hbWVzID0gcmVqZWN0RmlsZXMubWFwKChmaWxlKSA9PiBmaWxlLm5hbWUpO1xuICAgICAgd2luZG93LmFsZXJ0KFxuICAgICAgICBgVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbm90IC5tZWksIC5wbmcsIC5qcGVnLCBvciAuanNvbmxkIGZpbGVzOiBcXG5cXG4ke2ZpbGVuYW1lcy5qb2luKFxuICAgICAgICAgICdcXG4nLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvLyBMaXN0ZW5lciBmb3Igc29ydGluZyBmaWxlL2ZvbGlvXG4gIGNvbnN0IHNvcnRCeU5hbWVCdG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNvcnRfbmFtZScpO1xuICBzb3J0QnlOYW1lQnRucy5mb3JFYWNoKChzb3J0QnlOYW1lQnRuKSA9PiB7XG4gICAgc29ydEJ5TmFtZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+XG4gICAgICBzb3J0RmlsZUJ5TmFtZShzb3J0QnlOYW1lQnRuKSxcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IFVwbG9hZEZpbGVNYW5hZ2VyIGZyb20gJy4vVXBsb2FkRmlsZU1hbmFnZXInO1xuaW1wb3J0IHsgY3JlYXRlTWFuaWZlc3QsIGFkZERvY3VtZW50IH0gZnJvbSAnLi9TdG9yYWdlJztcbmltcG9ydCB7IElGb2xkZXIsIEZpbGVTeXN0ZW1Ub29scyB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmNvbnN0IGZtID0gVXBsb2FkRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuLy8gU2V0IE1FSSB0ZW1wbGF0ZVxuY29uc3QgdGVtcGxhdGVQYXRoID0gJ3NhbXBsZXMvbWVpL21laV90ZW1wbGF0ZS5tZWknO1xuZm0uc2V0TWVpVGVtcGxhdGUodGVtcGxhdGVQYXRoKTtcblxuLy8gQWRkcyBuZXcgZmlsZXMgdG8gdXBsb2FkIHBhaXJpbmcgY29udGFpbmVyIGFuZCBmaWxlbWFuYWdlciwgcmV0dXJucyBsaXN0IG9mIHJlamVjdGVkIGZpbGVzXG5leHBvcnQgZnVuY3Rpb24gYWRkTmV3RmlsZXMoZmlsZXM6IEZpbGVbXSk6IEZpbGVbXSB7XG4gIGNvbnN0IG1laV9jb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21laV9saXN0Jyk7XG4gIGNvbnN0IGltYWdlX2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaW1hZ2VfbGlzdCcpO1xuXG4gIGNvbnN0IHJlamVjdEZpbGVzOiBGaWxlW10gPSBbXTtcbiAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IGV4dCA9IGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpO1xuXG4gICAgaWYgKGV4dCA9PT0gJ21laScpIHtcbiAgICAgIGNvbnN0IHVucGFpcmVkSXRlbSA9IGNyZWF0ZVVucGFpcmVkSXRlbShmaWxlLm5hbWUsICdtZWknKTtcbiAgICAgIG1laV9jb250YWluZXIuYXBwZW5kQ2hpbGQodW5wYWlyZWRJdGVtKTtcbiAgICAgIGZtLmFkZEZpbGUoZmlsZSk7XG4gICAgfSBlbHNlIGlmIChbJ3BuZycsICdqcGcnLCAnanBlZyddLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgIGNvbnN0IHVucGFpcmVkSXRlbSA9IGNyZWF0ZVVucGFpcmVkSXRlbShmaWxlLm5hbWUsICdpbWFnZScpO1xuICAgICAgaW1hZ2VfY29udGFpbmVyLmFwcGVuZENoaWxkKHVucGFpcmVkSXRlbSk7XG4gICAgICBmbS5hZGRGaWxlKGZpbGUpO1xuICAgIH0gZWxzZSBpZiAoZXh0ID09PSAnanNvbmxkJykge1xuICAgICAgLy8gLy8gcmVtb3ZlIG1hbnVzY3JpcHQgc3VwcG9ydCBmb3IgdGhlIGltbWVkaWF0ZSBmdXR1cmUhXG4gICAgICAvLyBjb25zdCBtYW51c2NyaXB0Rm9saW8gPSBjcmVhdGVNYW51c2NyaXB0Rm9saW8oZmlsZS5uYW1lKTtcbiAgICAgIC8vIG1hbnVzY3JpcHRfY29udGFpbmVyLmFwcGVuZENoaWxkKG1hbnVzY3JpcHRGb2xpbyk7XG4gICAgICAvLyBmbS5hZGRGaWxlKGZpbGUpO1xuICAgICAgLy8gZm0uYWRkTWFudXNjcmlwdChmaWxlLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWplY3RGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZWplY3RGaWxlcztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVW5wYWlyZWRJdGVtKGZpbGVuYW1lOiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcpOiBIVE1MRGl2RWxlbWVudCB7XG4gIGlmIChncm91cCAhPT0gJ21laScgJiYgZ3JvdXAgIT09ICdpbWFnZScpIHJldHVybjtcbiAgY29uc3QgcmFkaW9OYW1lID0gJ21laScgPT09IGdyb3VwID8gJ21laV9yYWRpb19ncm91cCcgOiAnaW1hZ2VfcmFkaW9fZ3JvdXAnO1xuICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuXG4gIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbm9kZS5jbGFzc05hbWUgPSAndW5wYWlyZWRfaXRlbV9jb250YWluZXInO1xuXG4gIGNvbnN0IHJhZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgcmFkaW8udHlwZSA9ICdyYWRpbyc7XG4gIHJhZGlvLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9pdGVtX3JhZGlvJztcbiAgcmFkaW8ubmFtZSA9IHJhZGlvTmFtZTtcbiAgcmFkaW8udmFsdWUgPSBmaWxlbmFtZTtcbiAgcmFkaW8uaWQgPSBpZDtcblxuICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gIGxhYmVsLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9pdGVtX2xhYmVsJztcbiAgbGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLCBpZCk7XG5cbiAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgdGV4dC5pbm5lclRleHQgPSBmb3JtYXRGaWxlbmFtZShmaWxlbmFtZSwgNTApO1xuICB0ZXh0LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnbWFyZ2luLXRvcDogYXV0bzsgbWFyZ2luLWxlZnQ6IDNweDsnKTtcblxuICBjb25zdCBkZWxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgZGVsQnRuLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9kZWxfYnRuJztcbiAgZGVsQnRuLnNyYyA9IGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy91bnBhaXJlZC1yZW1vdmUtZG9jLnN2Z2A7XG4gIGRlbEJ0bi50aXRsZSA9ICdkZWxldGUnO1xuXG4gIGxhYmVsLmFwcGVuZENoaWxkKHJhZGlvKTtcbiAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG4gIG5vZGUuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICBub2RlLmFwcGVuZENoaWxkKGRlbEJ0bik7XG5cbiAgZGVsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIG5vZGUucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlTWFrZVBhaXIoKTogdm9pZCB7XG4gIGNvbnN0IHBhaXJlZF9jb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID1cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGFpcmVkX2xpc3QnKTtcblxuICAvLyBnZXQgYW5kIGNoZWNrIGlmIHNlbGVjdGVkIHJhZGlvIGV4aXN0c1xuICBjb25zdCBzZWxlY3RlZE1laUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICdpbnB1dFtuYW1lPVwibWVpX3JhZGlvX2dyb3VwXCJdOmNoZWNrZWQnLFxuICApO1xuICBjb25zdCBzZWxlY3RlZEltYWdlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJ2lucHV0W25hbWU9XCJpbWFnZV9yYWRpb19ncm91cFwiXTpjaGVja2VkJyxcbiAgKTtcbiAgaWYgKHNlbGVjdGVkTWVpRWxlbWVudCA9PT0gbnVsbCB8fCBzZWxlY3RlZEltYWdlRWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gIGxldCBtZWlfZmlsZW5hbWUgPSBzZWxlY3RlZE1laUVsZW1lbnQudmFsdWU7XG4gIGNvbnN0IGltYWdlX2ZpbGVuYW1lID0gc2VsZWN0ZWRJbWFnZUVsZW1lbnQudmFsdWU7XG4gIGxldCBpc0NyZWF0ZWQgPSBmYWxzZTtcblxuICBpZiAoc2VsZWN0ZWRNZWlFbGVtZW50LnZhbHVlID09PSAnY3JlYXRlX21laScpIHtcbiAgICBpc0NyZWF0ZWQgPSB0cnVlO1xuICAgIC8vIENoYW5nZSBleHRlbnNpb25cbiAgICBjb25zdCBmbiA9IGltYWdlX2ZpbGVuYW1lLnNwbGl0KCcuJyk7XG4gICAgaWYgKGZuLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZuLnBvcCgpO1xuICAgIH1cbiAgICBmbi5wdXNoKCdtZWknKTtcblxuICAgIG1laV9maWxlbmFtZSA9IGZuLmpvaW4oJy4nKTtcbiAgICAvLyBDcmVhdGUgbmV3IE1FSSBmaWxlXG4gICAgZm0uZ2V0SW1nRGltZW5zaW9uKGltYWdlX2ZpbGVuYW1lKVxuICAgICAgLnRoZW4oKGRpbWVuc2lvbnMpID0+IHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBzdGFmZlNwYWNlIH0gPSBkaW1lbnNpb25zO1xuICAgICAgICBjb25zdCBuZXdNZWlGaWxlID0gZm0uY3JlYXRlTWVpRmlsZShcbiAgICAgICAgICBtZWlfZmlsZW5hbWUsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHN0YWZmU3BhY2UsXG4gICAgICAgICk7XG4gICAgICAgIGZtLmFkZEZpbGUobmV3TWVpRmlsZSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cbiAgY29uc3QgZmlsZW5hbWUgPSBtZWlfZmlsZW5hbWUuc3Vic3RyaW5nKDAsIG1laV9maWxlbmFtZS5sZW5ndGggLSA0KTtcbiAgLy8gbWFrZSBhbmQgYXBwZW5kIFVJIGVsZW1lbnRcbiAgY29uc3QgcGFpcmVkX2VsID0gY3JlYXRlUGFpcmVkRm9saW8oZmlsZW5hbWUsIG1laV9maWxlbmFtZSwgaW1hZ2VfZmlsZW5hbWUpO1xuICBwYWlyZWRfY29udGFpbmVyLmFwcGVuZENoaWxkKHBhaXJlZF9lbCk7XG4gIC8vIHJlZmxlY3QgaW4gZmlsZSBtYW5hZ2VyXG4gIGZtLmFkZEZvbGlvKGZpbGVuYW1lLCBtZWlfZmlsZW5hbWUsIGltYWdlX2ZpbGVuYW1lLCBpc0NyZWF0ZWQpO1xuICAvLyByZW1vdmUgZnJvbSB1bnBhaXJlZCBtZWkgYW5kIGltYWdlIGxpc3RzXG4gIGlmICghaXNDcmVhdGVkKSBzZWxlY3RlZE1laUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xuICBzZWxlY3RlZEltYWdlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhaXJlZEZvbGlvKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBtZWlfZmlsZW5hbWU6IHN0cmluZyxcbiAgaW1hZ2VfZmlsZW5hbWU6IHN0cmluZyxcbik6IEhUTUxEaXZFbGVtZW50IHtcbiAgY29uc3QgbWVpX2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWVpX2xpc3QnKTtcbiAgY29uc3QgaW1hZ2VfY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbWFnZV9saXN0Jyk7XG5cbiAgY29uc3QgZm9saW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9saW8uY2xhc3NOYW1lID0gJ2ZvbGlvX2l0ZW0nO1xuICBmb2xpby5zZXRBdHRyaWJ1dGUoJ21laScsIG1laV9maWxlbmFtZSk7XG4gIGZvbGlvLnNldEF0dHJpYnV0ZSgnaW1hZ2UnLCBpbWFnZV9maWxlbmFtZSk7XG5cbiAgY29uc3QgZm9saW9fZmlsZW5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9saW9fZmlsZW5hbWUuY2xhc3NMaXN0LmFkZCgnZm9saW8tZmlsZW5hbWUnKTtcbiAgZm9saW9fZmlsZW5hbWUuaW5uZXJIVE1MID0gZm9ybWF0RmlsZW5hbWUoZmlsZW5hbWUsIDUwKTtcbiAgZm9saW8uYXBwZW5kQ2hpbGQoZm9saW9fZmlsZW5hbWUpO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZVVucGFpcigpIHtcbiAgICAvLyByZW1vdmUgZm9saW8gZnJvbSBVSVxuICAgIGZvbGlvLnJlbW92ZSgpO1xuICAgIC8vIHJlbW92ZSBmb2xpbyBmcm9tIGZpbGUgbWFuYWdlclxuICAgIGNvbnN0IGlzQ3JlYXRlZCA9IGZtLmlzQ3JlYXRlZEZvbGlvKGZpbGVuYW1lKTtcbiAgICBmbS5yZW1vdmVGb2xpbyhmaWxlbmFtZSk7XG4gICAgLy8gYWRkIGl0ZW1zIGJhY2sgdG8gdW5wYWlyZWQgY29udGFpbmVyc1xuICAgIGlmICghaXNDcmVhdGVkKSB7XG4gICAgICBjb25zdCBtZWlJdGVtID0gY3JlYXRlVW5wYWlyZWRJdGVtKG1laV9maWxlbmFtZSwgJ21laScpO1xuICAgICAgbWVpX2NvbnRhaW5lci5hcHBlbmRDaGlsZChtZWlJdGVtKTtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VJdGVtID0gY3JlYXRlVW5wYWlyZWRJdGVtKGltYWdlX2ZpbGVuYW1lLCAnaW1hZ2UnKTtcbiAgICBpbWFnZV9jb250YWluZXIuYXBwZW5kQ2hpbGQoaW1hZ2VJdGVtKTtcbiAgfVxuXG4gIGNvbnN0IHVucGFpckJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICB1bnBhaXJCdG4uY2xhc3NOYW1lID0gJ3VucGFpcl9idG4nO1xuICB1bnBhaXJCdG4uc3JjID0gYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3VucGFpci1kb2Muc3ZnYDtcbiAgdW5wYWlyQnRuLnRpdGxlID0gJ3VucGFpcic7XG4gIHVucGFpckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVVucGFpcik7XG4gIGZvbGlvLmFwcGVuZENoaWxkKHVucGFpckJ0bik7XG5cbiAgcmV0dXJuIGZvbGlvO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzKFxuICBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLFxuKTogUHJvbWlzZTx7IHN0YXR1czogc3RyaW5nOyB2YWx1ZT86IHN0cmluZzsgcmVhc29uPzogYW55IH1bXT4ge1xuICBjb25zdCBmb2xpb1Byb21pc2VzID0gZm1cbiAgICAuZ2V0Rm9saW9zKClcbiAgICAubWFwKGFzeW5jIChbbmFtZSwgbWVpLCBpbWFnZV06IFtzdHJpbmcsIEZpbGUsIEZpbGVdKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHVwbG9hZEZvbGlvKGlkLCBuYW1lLCBtZWksIGltYWdlLCBjdXJyZW50Rm9sZGVyKTtcbiAgICB9KTtcblxuICBjb25zdCBtYW51c2NyaXB0UHJvbWlzZXMgPSBbXTsgLy9mbS5nZXRNYW51c2NyaXB0cygpXG4gIC8vIC5tYXAoIGFzeW5jIChmaWxlOiBGaWxlKSA9PiB7XG4gIC8vICAgcmV0dXJuIGF3YWl0IHVwbG9hZE1hbnVzY3JpcHQoZmlsZSk7XG4gIC8vIH0pO1xuXG4gIGNvbnN0IHByb21pc2VzID0gWy4uLmZvbGlvUHJvbWlzZXMsIC4uLm1hbnVzY3JpcHRQcm9taXNlc10ubWFwKChwKSA9PlxuICAgIFByb21pc2UucmVzb2x2ZShwKS50aGVuKFxuICAgICAgKHZhbHVlKSA9PiAoeyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZSB9KSxcbiAgICAgIChyZWFzb24pID0+ICh7IHN0YXR1czogJ3JlamVjdGVkJywgcmVhc29uIH0pLFxuICAgICksXG4gICk7XG5cbiAgZm0uY2xlYXIoKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkRm9saW8oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgbWVpOiBGaWxlLFxuICBpbWFnZTogRmlsZSxcbiAgY3VycmVudEZvbGRlcjogSUZvbGRlcixcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBuZXdOYW1lID0gZm5Db25mbGljdEhhbmRsZXIoXG4gICAgbmFtZSxcbiAgICBGaWxlU3lzdGVtVG9vbHMuZ2V0QWxsTmFtZXMoY3VycmVudEZvbGRlciksXG4gICk7XG4gIHJldHVybiAoXG4gICAgY3JlYXRlTWFuaWZlc3QoaWQsIG5ld05hbWUsIG1laSwgaW1hZ2UpXG4gICAgICAudGhlbigobWFuaWZlc3QpID0+IHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RCbG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKV0sIHtcbiAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpc1NpbmdsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBhZGREb2N1bWVudChpZCwgbmV3TmFtZSwgbWFuaWZlc3RCbG9iLCBpc1NpbmdsZSk7XG4gICAgICB9KVxuICAgICAgLy8gYWRkIHRvIGRhc2hib2FyZCBGaWxlU3lzdGVtXG4gICAgICAudGhlbigoc3VjY2VlZGVkKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZWVkZWQpIHtcbiAgICAgICAgICBjb25zdCBkYXRldGltZSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICBjb25zdCBmaWxlRW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlRmlsZShuZXdOYW1lLCBpZCk7XG4gICAgICAgICAgY29uc3QgZm9saW9FbnRyeSA9IEZpbGVTeXN0ZW1Ub29scy5hZGRNZXRhZGF0YShmaWxlRW50cnksIHtcbiAgICAgICAgICAgIHR5cGU6ICdmb2xpbycsXG4gICAgICAgICAgICBjcmVhdGVkX29uOiBkYXRldGltZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBpc0FkZGVkID0gRmlsZVN5c3RlbVRvb2xzLmFkZEVudHJ5KGZvbGlvRW50cnksIGN1cnJlbnRGb2xkZXIpO1xuICAgICAgICAgIHJldHVybiBpc0FkZGVkID8gbmV3TmFtZSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCB0byB1cGxvYWRGb2xpbzogJyArIG5hbWUpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICApO1xufVxuXG4vLyBhc3luYyBmdW5jdGlvbiB1cGxvYWRNYW51c2NyaXB0KG1hbnVzY3JpcHQ6IEZpbGUpOiBQcm9taXNlPGJvb2xlYW4+IHtcbi8vICAgcmV0dXJuIGFkZEVudHJ5KG1hbnVzY3JpcHQubmFtZSwgbWFudXNjcmlwdCwgZmFsc2UpO1xuLy8gfVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc29ydEZpbGVCeU5hbWUoc29ydEJ5TmFtZUJ0bjogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlTGlzdCA9IHNvcnRCeU5hbWVCdG4ucGFyZW50RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gIGNvbnN0IGZpbGVFbGVtZW50cyA9IEFycmF5LmZyb20oZmlsZUxpc3QuY2hpbGRyZW4pO1xuXG4gIGxldCBpc0FzY2VuZGluZyA9IHNvcnRCeU5hbWVCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdhcnJvdy11cCcpO1xuXG4gIGlmIChpc0FzY2VuZGluZykge1xuICAgIHNvcnRCeU5hbWVCdG4uY2xhc3NMaXN0LnJlbW92ZSgnYXJyb3ctdXAnKTtcbiAgICBzb3J0QnlOYW1lQnRuLmNsYXNzTGlzdC5hZGQoJ2Fycm93LWRvd24nKTtcbiAgICBzb3J0QnlOYW1lQnRuLmlubmVySFRNTCA9ICcmI3gyMkMxOyc7XG4gIH0gZWxzZSB7XG4gICAgc29ydEJ5TmFtZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhcnJvdy1kb3duJyk7XG4gICAgc29ydEJ5TmFtZUJ0bi5jbGFzc0xpc3QuYWRkKCdhcnJvdy11cCcpO1xuICAgIHNvcnRCeU5hbWVCdG4uaW5uZXJIVE1MID0gJyYjeDIyQzA7JztcbiAgfVxuXG4gIGlzQXNjZW5kaW5nID0gIWlzQXNjZW5kaW5nO1xuXG4gIGZpbGVFbGVtZW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgbmFtZUEgPSBhLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBjb25zdCBuYW1lQiA9IGIudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIHJldHVybiBpc0FzY2VuZGluZ1xuICAgICAgPyBuYW1lQS5sb2NhbGVDb21wYXJlKG5hbWVCKVxuICAgICAgOiBuYW1lQi5sb2NhbGVDb21wYXJlKG5hbWVBKTtcbiAgfSk7XG5cbiAgZmlsZUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBmaWxlTGlzdC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgfSk7XG5cbiAgc29ydEJ5TmFtZUJ0bi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2NvbG9yOiBibGFjaycpO1xufVxuXG4vLyBhc3luYyBmdW5jdGlvbiB1cGxvYWRNYW51c2NyaXB0KG1hbnVzY3JpcHQ6IEZpbGUsIGN1cnJlbnRGb2xkZXI6IElGb2xkZXIsIGV4aXN0aW5nTmFtZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4vLyAgIGNvbnN0IGlzU2luZ2xlID0gZmFsc2U7XG4vLyAgIGNvbnN0IGlkID0gbWFudXNjcmlwdFsnQGlkJ10gIT09IG51bGwgPyBtYW51c2NyaXB0WydAaWQnXSA6IG1hbnVzY3JpcHQubmFtZTtcbi8vICAgcmV0dXJuIGFkZEVudHJ5KGlkLCBtYW51c2NyaXB0Lm5hbWUsIG1hbnVzY3JpcHQsIGlzU2luZ2xlKVxuLy8gICAgIC8vIGFkZCB0byBkYXNoYm9hcmQgRmlsZVN5c3RlbVxuLy8gICAgIC50aGVuKHN1Y2NlZWRlZCA9PiB7XG4vLyAgICAgICBpZiAoc3VjY2VlZGVkKSB7XG4vLyAgICAgICAgIGNvbnN0IG5ld05hbWUgPSBmbkNvbmZsaWN0SGFuZGxlcihtYW51c2NyaXB0Lm5hbWUsIGV4aXN0aW5nTmFtZXMpO1xuLy8gICAgICAgICBjb25zdCBkYXRldGltZSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKTtcbi8vICAgICAgICAgY29uc3QgZmlsZUVudHJ5ID0gRmlsZVN5c3RlbVRvb2xzLmNyZWF0ZUZpbGUobmV3TmFtZSwgaWQpO1xuLy8gICAgICAgICBjb25zdCBtYW51c2NyaXB0RW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuYWRkTWV0YWRhdGEoZmlsZUVudHJ5LCB7IHR5cGU6ICdtYW51c2NyaXB0JywgY3JlYXRlZF9vbjogZGF0ZXRpbWUgfSk7XG4vLyAgICAgICAgIGNvbnN0IGlzQWRkZWQgPSBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkobWFudXNjcmlwdEVudHJ5LCBjdXJyZW50Rm9sZGVyKTtcbi8vICAgICAgICAgcmV0dXJuIGlzQWRkZWQ7XG4vLyAgICAgICB9XG4vLyAgICAgICBlbHNlIHtcbi8vICAgICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCB0byB1cGxvYWRGb2xpbzogJyArIG5hbWUpO1xuLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyB9XG5cbi8vIExpbWl0IGZpbGVuYW1lIGxlbmd0aFxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcsIG1heExlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2h1bmtMZW4gPSBNYXRoLmZsb29yKG1heExlbiAvIDIpO1xuICBjb25zdCBsZW4gPSBmaWxlbmFtZS5sZW5ndGg7XG4gIGlmIChsZW4gPD0gbWF4TGVuKSByZXR1cm4gZmlsZW5hbWU7XG4gIGVsc2VcbiAgICByZXR1cm4gYCR7ZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGNodW5rTGVuIC0gMSl9Li4uJHtmaWxlbmFtZS5zdWJzdHJpbmcoXG4gICAgICBsZW4gLSBjaHVua0xlbiArIDIsXG4gICAgICBsZW4sXG4gICAgKX1gO1xufVxuXG4vLyBSZW5hbWVzIGZpbGUgaWYgdGhlcmUgYXJlIG5hbWluZyBjb25mbGljdHMsIGluIHRoZSBmb3JtIG9mICdmb29iYXIgKDEpJ1xuZXhwb3J0IGZ1bmN0aW9uIGZuQ29uZmxpY3RIYW5kbGVyKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBleGlzdGluZ05hbWVzOiBzdHJpbmdbXSxcbik6IHN0cmluZyB7XG4gIGxldCBuZXdGaWxlbmFtZSA9IGZpbGVuYW1lO1xuICBsZXQgY291bnRlciA9IDE7XG5cbiAgd2hpbGUgKGV4aXN0aW5nTmFtZXMuaW5jbHVkZXMobmV3RmlsZW5hbWUpKSB7XG4gICAgbmV3RmlsZW5hbWUgPSBgJHtmaWxlbmFtZX0oJHtjb3VudGVyfSlgO1xuICAgIGNvdW50ZXIrKztcbiAgfVxuICByZXR1cm4gbmV3RmlsZW5hbWU7XG59XG4iLCJpbXBvcnQgeyB1dWlkdjQgfSBmcm9tICcuLi91dGlscy9yYW5kb20nO1xuaW1wb3J0ICogYXMgdmtiZWF1dGlmeSBmcm9tICd2a2JlYXV0aWZ5JztcblxuLyoqXG4gKiBNYW5hZ2VyIGZvciBmaWxlIHVwbG9hZGluZyBhbmQgcGFpcmluZyBwcm9jZXNzXG4gKi9cbmNsYXNzIFVwbG9hZEZpbGVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFVwbG9hZEZpbGVNYW5hZ2VyO1xuXG4gIHByaXZhdGUgYWxsRmlsZXMgPSBuZXcgTWFwPHN0cmluZywge2ZpbGU6IEZpbGUsIGNvdW50OiBudW1iZXJ9PigpO1xuICBwcml2YXRlIGZvbGlvcyA9IG5ldyBBcnJheTxmb2xpbz4oKTsgLy8gZmlsZW5hbWUsIG1laV9maWxlbmFtZSwgaW1hZ2VfZmlsZW5hbWVcbiAgLy8gcHJpdmF0ZSBtYW51c2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHByaXZhdGUgbWVpVGVtcGxhdGU6IHN0cmluZztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVXBsb2FkRmlsZU1hbmFnZXIge1xuICAgIGlmICghVXBsb2FkRmlsZU1hbmFnZXIuaW5zdGFuY2UpIHtcbiAgICAgIFVwbG9hZEZpbGVNYW5hZ2VyLmluc3RhbmNlID0gbmV3IFVwbG9hZEZpbGVNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBVcGxvYWRGaWxlTWFuYWdlci5pbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRGaWxlKGZpbGU6IEZpbGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsRmlsZXMuaGFzKGZpbGUubmFtZSkpIHtcbiAgICAgIGNvbnN0IG5ld0VudHJ5ID0geyBmaWxlOiBmaWxlLCBjb3VudDogMSB9O1xuICAgICAgdGhpcy5hbGxGaWxlcy5zZXQoZmlsZS5uYW1lLCBuZXdFbnRyeSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb3VudCA9IHRoaXMuZ2V0RmlsZUNvdW50KGZpbGUubmFtZSk7XG4gICAgICBjb25zdCB1cGRhdGVkRW50cnkgPSB7IGZpbGU6IGZpbGUsIGNvdW50OiBleGlzdGluZ0NvdW50KzEgfTtcbiAgICAgIHRoaXMuYWxsRmlsZXMuc2V0KGZpbGUubmFtZSwgdXBkYXRlZEVudHJ5KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0TWVpVGVtcGxhdGUodGVtcGxhdGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0ZW1wbGF0ZVBhdGgpO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIE1FSSB0ZW1wbGF0ZSBmcm9tICR7dGVtcGxhdGVQYXRofWApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1laVRlbXBsYXRlID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlTWVpRmlsZShmaWxlbmFtZTogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgc3RhZmZTcGFjZTogbnVtYmVyKTogRmlsZSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5tZWlUZW1wbGF0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIE1FSSB0ZW1wbGF0ZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTtcbiAgICAgIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGhpcy5tZWlUZW1wbGF0ZSwgJ3RleHQveG1sJyk7XG4gICAgICBjb25zdCBtZWkgPSBtZWlEb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICBjb25zdCBtZWlIZWFkID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ21laUhlYWQnKTtcbiAgICAgIG1laUhlYWQuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3QgZmlsZURlc2MgPSBtZWkucXVlcnlTZWxlY3RvcignZmlsZURlc2MnKTtcbiAgICAgIGZpbGVEZXNjLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHRpdGxlU3RtdCA9IG1laS5xdWVyeVNlbGVjdG9yKCd0aXRsZVN0bXQnKTtcbiAgICAgIHRpdGxlU3RtdC5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCB0aXRsZSA9IG1laS5xdWVyeVNlbGVjdG9yKCd0aXRsZScpO1xuICAgICAgdGl0bGUuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3QgcHViU3RtdCA9IG1laS5xdWVyeVNlbGVjdG9yKCdwdWJTdG10Jyk7XG4gICAgICBwdWJTdG10LnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IGZhY3NpbWlsZSA9IG1laS5xdWVyeVNlbGVjdG9yKCdmYWNzaW1pbGUnKTtcbiAgICAgIGZhY3NpbWlsZS5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzdXJmYWNlID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3N1cmZhY2UnKTtcbiAgICAgIGNvbnN0IHN1cmZhY2VJZCA9ICdtLScgKyB1dWlkdjQoKTtcbiAgICAgIHN1cmZhY2Uuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCBzdXJmYWNlSWQpO1xuICAgICAgc3VyZmFjZS5zZXRBdHRyaWJ1dGUoJ2xyeCcsIHdpZHRoLnRvU3RyaW5nKCkpO1xuICAgICAgc3VyZmFjZS5zZXRBdHRyaWJ1dGUoJ2xyeScsIGhlaWdodC50b1N0cmluZygpKTtcbiAgICAgIFxuICAgICAgY29uc3Qgem9uZSA9IG1laS5xdWVyeVNlbGVjdG9yKCd6b25lJyk7XG4gICAgICBjb25zdCB6b25lSWQgPSAnbS0nICsgdXVpZHY0KCk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgem9uZUlkKTtcbiAgICAgIGNvbnN0IG1hcmdpblJhdGVWID0gMC4xO1xuICAgICAgY29uc3QgbWFyZ2luUmF0ZUggPSAwLjE1O1xuICAgICAgY29uc3QgbWFyZ2luViA9IE1hdGgucm91bmQobWFyZ2luUmF0ZVYgKiB3aWR0aCk7XG4gICAgICBjb25zdCBtYXJnaW5IID0gTWF0aC5yb3VuZChtYXJnaW5SYXRlSCAqIHdpZHRoKTtcbiAgICAgIHpvbmUuc2V0QXR0cmlidXRlKCd1bHgnLCBtYXJnaW5ILnRvU3RyaW5nKCkpO1xuICAgICAgem9uZS5zZXRBdHRyaWJ1dGUoJ3VseScsIG1hcmdpblYudG9TdHJpbmcoKSk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgnbHJ4JywgKHdpZHRoIC0gbWFyZ2luSCkudG9TdHJpbmcoKSk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgnbHJ5JywgKG1hcmdpblYgKyAzICogc3RhZmZTcGFjZSkudG9TdHJpbmcoKSk7XG5cbiAgICAgIGNvbnN0IG1kaXYgPSBtZWkucXVlcnlTZWxlY3RvcignbWRpdicpO1xuICAgICAgbWRpdi5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzY29yZSA9IG1laS5xdWVyeVNlbGVjdG9yKCdzY29yZScpO1xuICAgICAgc2NvcmUuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3Qgc2NvcmVEZWYgPSBtZWkucXVlcnlTZWxlY3Rvcignc2NvcmVEZWYnKTtcbiAgICAgIHNjb3JlRGVmLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHN0YWZmR3JwID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3N0YWZmR3JwJyk7XG4gICAgICBzdGFmZkdycC5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzdGFmZkRlZiA9IG1laS5xdWVyeVNlbGVjdG9yKCdzdGFmZkRlZicpO1xuICAgICAgc3RhZmZEZWYuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IG1laS5xdWVyeVNlbGVjdG9yKCdzZWN0aW9uJyk7XG4gICAgICBzZWN0aW9uLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHBiID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3BiJyk7XG4gICAgICBwYi5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBwYi5zZXRBdHRyaWJ1dGUoJ2ZhY3MnLCAnIycgKyBzdXJmYWNlSWQpO1xuICAgICAgY29uc3Qgc2IgPSBtZWkucXVlcnlTZWxlY3Rvcignc2InKTtcbiAgICAgIHNiLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIHNiLnNldEF0dHJpYnV0ZSgnZmFjcycsICcjJyArIHpvbmVJZCk7XG5cbiAgICAgIGNvbnN0IG1laUZpbGVDb250ZW50ID0gdmtiZWF1dGlmeS54bWwoc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhtZWlEb2MpKTtcbiAgICAgIGNvbnN0IG1laUJsb2IgPSBuZXcgQmxvYihbbWVpRmlsZUNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L3htbCcgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgRmlsZShbbWVpQmxvYl0sIGZpbGVuYW1lLCB7IHR5cGU6ICd0ZXh0L3htbCcgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfSBcblxuICBwdWJsaWMgZ2V0SW1nRGltZW5zaW9uKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIsIHN0YWZmU3BhY2U6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZ0ZpbGUgPSB0aGlzLmdldEZpbGUoZmlsZW5hbWUpO1xuXG4gICAgICBpZiAoIWltZ0ZpbGUpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICAgICAgaWYgKCFjdHgpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgMkQgY29udGV4dCcpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuXG4gICAgICAgICAgLy8gQmluYXJpemF0aW9uXG4gICAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgIGNvbnN0IGJpbmFyeVRocmVzaG9sZCA9IDEyNztcbiAgICAgICAgICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGE7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgICBjb25zdCBncmF5c2NhbGUgPSAoZGF0YVtpXSArIGRhdGFbaSArIDFdICsgZGF0YVtpICsgMl0pIC8gMztcbiAgICAgICAgICAgIGNvbnN0IGJpbmFyeVZhbHVlID0gZ3JheXNjYWxlIDwgYmluYXJ5VGhyZXNob2xkID8gMCA6IDI1NTtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBiaW5hcnlWYWx1ZTtcbiAgICAgICAgICAgIGRhdGFbaSArIDFdID0gYmluYXJ5VmFsdWU7XG4gICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGJpbmFyeVZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG5cbiAgICAgICAgICAvLyBGaW5kaW5nIHN0YWZmIHNwYWNlXG4gICAgICAgICAgY29uc3Qgd2hpdGVSdW5MZW5ndGhzOiBudW1iZXJbXSA9IFtdOyAgXG4gICAgICAgICAgbGV0IGN1cnJTcGFjZUNvdW50ID0gMDtcbiAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNhbnZhcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAvLyBuZXcgY3VyclNwYWNlQ291bnQgZm9yIGV2ZXJ5IGNvbHVtblxuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gY3R4LmdldEltYWdlRGF0YSh4LCAwLCAxLCBjYW52YXMuaGVpZ2h0KS5kYXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBjb2x1bW4ubGVuZ3RoOyBwICs9IDQpIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpeGVsIGlzIGJsYWNrICgwKSBvciB3aGl0ZSAoMjU1KVxuICAgICAgICAgICAgICBpZiAoY29sdW1uW3BdID09PSAwICYmIGN1cnJTcGFjZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHdoaXRlUnVuTGVuZ3Rocy5wdXNoKGN1cnJTcGFjZUNvdW50KTtcbiAgICAgICAgICAgICAgICBjdXJyU3BhY2VDb3VudCA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclNwYWNlQ291bnQrKztcbiAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNlY29uZCBtb3N0IGNvbW1vbiB2YWx1ZSBhcyBzdGFmZiBzcGFjZVxuICAgICAgICAgIGNvbnN0IHN0YWZmU3BhY2UgPSB3aGl0ZVJ1bkxlbmd0aHMubGVuZ3RoID4gMCA/IHRoaXMuZmluZFNlY29uZE1vZGUod2hpdGVSdW5MZW5ndGhzKSA6IDA7XG5cbiAgICAgICAgICByZXNvbHZlKHsgd2lkdGg6IGltZy53aWR0aCwgaGVpZ2h0OiBpbWcuaGVpZ2h0LCBzdGFmZlNwYWNlOiAgc3RhZmZTcGFjZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgaW1hZ2U6ICR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICB9O1xuICAgICAgICBpbWcuc3JjID0gZXZlbnQudGFyZ2V0LnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICB9O1xuXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChpbWdGaWxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFNlY29uZE1vZGUoYXJyOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgY29uc3QgY291bnRNYXA6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICAvLyBDb3VudCBvY2N1cnJlbmNlcyBvZiBlYWNoIGVsZW1lbnRcbiAgICBhcnIuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IGNvdW50ID0gKGNvdW50TWFwLmdldChlbGVtZW50KSB8fCAwKSArIDE7XG4gICAgICBjb3VudE1hcC5zZXQoZWxlbWVudCwgY291bnQpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc29ydGVkTWFwID0gQXJyYXkuZnJvbShjb3VudE1hcC5lbnRyaWVzKCkpLnNvcnQoKGEsIGIpID0+IGJbMV0gLSBhWzFdKTtcblxuICAgIHJldHVybiBzb3J0ZWRNYXBbMV1bMF07XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRGaWxlKGtleTogc3RyaW5nKTogRmlsZSB7XG4gICAgaWYgKHRoaXMuYWxsRmlsZXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsbEZpbGVzLmdldChrZXkpLmZpbGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZUZpbGUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuZ2V0RmlsZUNvdW50KGtleSk7XG4gICAgaWYgKGNvdW50ID09PSAwKSByZXR1cm47XG4gICAgZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgIHRoaXMuYWxsRmlsZXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgdXBkYXRlZEVudHJ5ID0geyBmaWxlOiB0aGlzLmFsbEZpbGVzLmdldChrZXkpLmZpbGUsIGNvdW50OiBjb3VudC0xIH07XG4gICAgICB0aGlzLmFsbEZpbGVzLnNldChrZXksIHVwZGF0ZWRFbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEZpbGVDb3VudChrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKCB0aGlzLmFsbEZpbGVzLmhhcyhrZXkpICkge1xuICAgICAgcmV0dXJuIHRoaXMuYWxsRmlsZXMuZ2V0KGtleSkuY291bnQ7XG4gICAgfVxuICAgIGVsc2UgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgYWRkRm9saW8obmFtZTogc3RyaW5nLCBtZWk6IHN0cmluZywgaW1hZ2U6IHN0cmluZywgaXNDcmVhdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbmV3Rm9saW86IGZvbGlvID0ge1xuICAgICAgZmlsZW5hbWU6IG5hbWUsXG4gICAgICBtZWlfZmlsZW5hbWU6IG1laSxcbiAgICAgIGltYWdlX2ZpbGVuYW1lOiBpbWFnZSxcbiAgICAgIGlzQ3JlYXRlZDogaXNDcmVhdGVkLFxuICAgIH07XG4gICAgdGhpcy5mb2xpb3MucHVzaChuZXdGb2xpbyk7XG4gIH1cblxuICAvLyBwdWJsaWMgYWRkTWFudXNjcmlwdChmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vICAgdGhpcy5tYW51c2NyaXB0cy5wdXNoKGZpbGVuYW1lKTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBpc0NyZWF0ZWRGb2xpbyhmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9saW8gPSB0aGlzLmZvbGlvcy5maW5kKChmb2xpbykgPT4gZm9saW8uZmlsZW5hbWUgPT09IGZpbGVuYW1lKTtcbiAgICByZXR1cm4gZm9saW8gPyBmb2xpby5pc0NyZWF0ZWQgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVGb2xpbyhmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5mb2xpb3MuZmluZEluZGV4KCBmb2xpbyA9PiBmb2xpby5maWxlbmFtZSA9PT0gZmlsZW5hbWUpO1xuICAgIHRoaXMuZm9saW9zLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgLy8gcHVibGljIHJlbW92ZU1hbnVzY3JpcHQoZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAvLyAgIGNvbnN0IGlkeCA9IHRoaXMubWFudXNjcmlwdHMuZmluZEluZGV4KG1hbnVzY3JpcHQgPT4gbWFudXNjcmlwdCA9PT0gZmlsZW5hbWUpO1xuICAvLyAgIHRoaXMubWFudXNjcmlwdHMuc3BsaWNlKGlkeCk7XG4gIC8vICAgdGhpcy5yZW1vdmVGaWxlKGZpbGVuYW1lKTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBnZXRGb2xpb3MoKTogW3N0cmluZywgRmlsZSwgRmlsZV1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9saW9zLm1hcCggZm9saW8gPT4ge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBmb2xpby5maWxlbmFtZTtcbiAgICAgIGNvbnN0IG1laV9maWxlbmFtZSA9IGZvbGlvLm1laV9maWxlbmFtZTtcbiAgICAgIGNvbnN0IGltYWdlX2ZpbGVuYW1lID0gZm9saW8uaW1hZ2VfZmlsZW5hbWU7XG4gICAgICByZXR1cm4gW2ZpbGVuYW1lLCB0aGlzLmdldEZpbGUobWVpX2ZpbGVuYW1lKSwgdGhpcy5nZXRGaWxlKGltYWdlX2ZpbGVuYW1lKV07XG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0TWFudXNjcmlwdHMoKTogRmlsZVtdIHtcbiAgLy8gICByZXR1cm4gdGhpcy5tYW51c2NyaXB0cy5tYXAoIG1hbnVzY3JpcHQgPT4gdGhpcy5nZXRGaWxlKG1hbnVzY3JpcHQpKTtcbiAgLy8gfVxuXG4gIC8vIHB1YmxpYyBjbGVhck1hbnVzY3JpcHRzKCk6IHZvaWQge1xuICAvLyAgIHRoaXMubWFudXNjcmlwdHMuZm9yRWFjaCggZmlsZW5hbWUgPT4ge1xuICAvLyAgICAgdGhpcy5yZW1vdmVGaWxlKGZpbGVuYW1lKTtcbiAgLy8gICB9KTtcbiAgLy8gICB0aGlzLm1hbnVzY3JpcHRzID0gW107XG4gIC8vIH1cbiAgXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpbGVzLmNsZWFyKCk7XG4gICAgdGhpcy5mb2xpb3Muc3BsaWNlKDApO1xuICB9XG5cbiAgcHVibGljIHByaW50KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKHRoaXMuYWxsRmlsZXMpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuZm9saW9zKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLm1hbnVzY3JpcHRzKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVcGxvYWRGaWxlTWFuYWdlcjtcblxudHlwZSBmb2xpbyA9IHtcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgbWVpX2ZpbGVuYW1lOiBzdHJpbmcsXG4gIGltYWdlX2ZpbGVuYW1lOiBzdHJpbmcsXG4gIGlzQ3JlYXRlZDogYm9vbGVhbixcbn07IiwiLy8gSWYgdXNlciByaWdodC1jbGlja3Mgb24gYmFja2dyb3VuZCBhbmQgbm90aGluZyBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS11cGxvYWQtZG9jLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5VcGxvYWQgZG9jdW1lbnQ8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9uZXctZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1uZXctZm9sZGVyLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5OZXcgZm9sZGVyPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbmV3LWZvbGRlci5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBhIHNpbmdsZSBmaWxlIGlzIHNlbGVjdGVkXG5leHBvcnQgY29uc3Qgc2luZ2xlRmlsZU9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLW9wZW4tYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk9wZW48L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9vcGVuLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVuYW1lLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5SZW5hbWU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW5hbWUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1tb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbW92ZS1kb2MtaWNvbi5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBtdWx0aXBsZSBmaWxlcyBhcmUgc2VsZWN0ZWRcbmV4cG9ydCBjb25zdCBtdWx0aUZpbGVPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1vcGVuLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5PcGVuPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvb3Blbi1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImNtLXJlbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZSB0byBUcmFzaDwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlbW92ZS1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImNtLW1vdmUtYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk1vdmU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9tb3ZlLWRvYy1pY29uLnN2Z1wiPlxuICAgIDwvZGl2PmA7XG5cbi8vIElmIDEgb3IgbW9yZSBmaWxlcyBhbmQgMSBvciBtb3JlIGZvbGRlcnMgYXJlIHNlbGVjdGVkXG5leHBvcnQgY29uc3QgZm9sZGVyQW5kRmlsZU9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLXJlbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+RGVsZXRlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL21vdmUtZG9jLWljb24uc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuLy8gSWYgb25lIGZvbGRlciBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IHNpbmdsZUZvbGRlck9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLW9wZW4tYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk9wZW48L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9vcGVuLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVuYW1lLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5SZW5hbWU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW5hbWUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1tb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbW92ZS1kb2MtaWNvbi5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBtdWx0aXBsZSBmb2xkZXJzIGFyZSBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IG11bHRpRm9sZGVyT3B0aW9ucyA9IFxuICAgIGA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL21vdmUtZG9jLWljb24uc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuLy8gSWYgdHJhc2ggZm9sZGVyIGlzIHNlbGVjdGVkXG5leHBvcnQgY29uc3QgdHJhc2hGb2xkZXJPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1lbXB0eS10cmFzaC1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+RW1wdHkgVHJhc2g8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW1vdmUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PmA7XG5cbi8vIElmIGVudHJ5IGluIHRyYXNoIGZvbGRlciBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IHRyYXNoRW50cnlPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1yZWNvdmVyLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5QdXQgQmFjazwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlY292ZXItZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1kZWxldGUtYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPkRlbGV0ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlbW92ZS1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/Neon-gh/editor.js b/Neon-gh/editor.js
index a5a1f864..641ec80a 100644
--- a/Neon-gh/editor.js
+++ b/Neon-gh/editor.js
@@ -1,4 +1,4 @@
-!function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=58)}([function(e,t,n){"use strict";var i,r="object"==typeof Reflect?Reflect:null,s=r&&"function"==typeof r.apply?r.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};i=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var o=Number.isNaN||function(e){return e!=e};function a(){a.init.call(this)}e.exports=a,e.exports.once=function(e,t){return new Promise((function(n,i){function r(n){e.removeListener(t,s),i(n)}function s(){"function"==typeof e.removeListener&&e.removeListener("error",r),n([].slice.call(arguments))}v(e,t,s,{once:!0}),"error"!==t&&function(e,t,n){"function"==typeof e.on&&v(e,"error",t,n)}(e,r,{once:!0})}))},a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var c=10;function l(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function u(e){return void 0===e._maxListeners?a.defaultMaxListeners:e._maxListeners}function d(e,t,n,i){var r,s,o,a;if(l(n),void 0===(s=e._events)?(s=e._events=Object.create(null),e._eventsCount=0):(void 0!==s.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),s=e._events),o=s[t]),void 0===o)o=s[t]=n,++e._eventsCount;else if("function"==typeof o?o=s[t]=i?[n,o]:[o,n]:i?o.unshift(n):o.push(n),(r=u(e))>0&&o.length>r&&!o.warned){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,console&&console.warn&&console.warn(a)}return e}function h(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function f(e,t,n){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},r=h.bind(i);return r.listener=n,i.wrapFn=r,r}function g(e,t,n){var i=e._events;if(void 0===i)return[];var r=i[t];return void 0===r?[]:"function"==typeof r?n?[r.listener||r]:[r]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var c=r[e];if(void 0===c)return!1;if("function"==typeof c)s(c,this,t);else{var l=c.length,u=m(c,l);for(n=0;n=0;s--)if(n[s]===t||n[s].listener===t){o=n[s].listener,r=s;break}if(r<0)return this;0===r?n.shift():function(e,t){for(;t+1=0;i--)this.removeListener(e,t[i]);return this},a.prototype.listeners=function(e){return g(this,e,!0)},a.prototype.rawListeners=function(e){return g(this,e,!1)},a.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},a.prototype.listenerCount=p,a.prototype.eventNames=function(){return this._eventsCount>0?i(this._events):[]}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},function(e,t,n){"use strict";var i,r,s,o=[n(37),n(38),n(39),n(40),n(41),n(42)],a=-1,c=[],l=!1;function u(){i&&r&&(i=!1,r.length?c=r.concat(c):a=-1,c.length&&d())}function d(){if(!i){l=!1,i=!0;for(var e=c.length,t=setTimeout(u);e;){for(r=c,c=[];r&&++a1)for(var n=1;ne.classList.remove("no-moving")),document.querySelectorAll(".selected").forEach(e=>{e.classList.remove("selected"),e.classList.contains("staff")?(e.removeAttribute("style"),i.unhighlight(e)):(e.removeAttribute("style"),e.style.fill=""),Array.from(e.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""}),Array.from(e.querySelectorAll(".sylTextRect-display")).forEach(e=>{e.style.fill="blue"}),e.parentElement.classList.contains("syllable-highlighted")&&(e.parentElement.style.fill="",e.parentElement.classList.add("syllable"),e.parentElement.classList.remove("syllable-highlighted"),Array.from(e.parentElement.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.parentElement.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""})),c.selectAll("#resizeRect").remove(),c.selectAll(".resizePoint").remove(),c.selectAll(".rotatePoint").remove()}),Array.from(document.querySelectorAll(".text-select")).forEach(e=>{e.style.color="",e.style.fontWeight="",e.classList.remove("text-select")}),document.getElementById("selByStaff").classList.contains("is-active")?a.endOptionsSelection():s.endGroupingSelection(),document.getElementById("extraEdit").innerHTML="",document.getElementById("extraEdit").parentElement.classList.add("hidden"),(0,r.updateHighlight)()}function d(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),a.triggerSingleStaffActions(),s.initGroupingListeners(),t.dragInit())}function h(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),t.dragInit())}function f(e,t,n=!0){if(e){if(e.classList.contains("staff"))return d(e,t);if(e.classList.contains("layer"))return h(e,t);if(!e.classList.contains("selected")&&!e.classList.contains("sylTextRect")&&!e.classList.contains("sylTextRect-display")){let t;if(e.classList.add("selected"),e.style.fill="#d00",e.style.stroke=e.classList.contains("divLine")?"#d00":"black",e.querySelectorAll(".sylTextRect-display").length&&e.querySelectorAll(".sylTextRect-display").forEach(e=>{e.style.fill="#d00"}),e.querySelectorAll(".divLine").length&&e.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"}),e.classList.contains("syllable")&&e.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),e.classList.contains("syllable")?t=e.id:null!==e.closest(".syllable")&&(t=e.closest(".syllable").id),void 0!==t){document.querySelectorAll("span."+t).forEach(e=>{e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select")})}}n&&(0,r.updateHighlight)()}}async function g(e,t){const n=await t.getElementAttr(e.id,t.view.getCurrentPageURI());return Boolean(n.ligated)}function p(e,t){if(t.length<2)return!1;switch(e){case"selBySyllable":t.forEach(e=>{if(!e.classList.contains("syllable"))return!1});break;case"selByNeume":t.forEach(e=>{if(!e.classList.contains("neume"))return!1});break;case"selByStaff":t.forEach(e=>{if(!e.classList.contains("staff"))return!1});break;default:return!1}return!0}function m(e){const t=Array.from(e),n=t.pop().parentElement.parentElement;for(const e of t){if(e.parentElement.parentElement.id!==n.id)return!1}return!0}function v(e,t,n){const i=e,r=i.closest(".syl");if(!r.classList.contains("selected")){r.classList.add("selected"),i.style.fill="#d00";const s=e.closest(".syllable");s.style.fill="#d00",s.classList.add("syllable-highlighted"),s.querySelectorAll(".divLine").length&&(s.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),s.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"})),void 0!==n&&(0,o.resize)(r,n,t),void 0!==t&&t.dragInit();const a=e.closest(".syllable").id;if(void 0!==a){const e=document.querySelector("span."+a);e&&(e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select"))}}a.triggerBBoxActions()}t.getSelectionType=l,t.unselect=u,t.selectStaff=d,t.selectLayerElement=h,t.select=f,t.selectNcs=async function(e,t,n){if(!e.parentElement.classList.contains("selected")){const i=e.parentElement;if(u(),f(i),await g(i,t)){const e=i.previousSibling;if(await g(e,t))f(e);else{const e=i.nextSibling;await g(e,t)?f(e):console.warn("Error: Neither prev or next nc are ligatures")}s.triggerGrouping("ligature")}else i.classList.contains("nc")?a.triggerNcActions(i):console.warn("No action triggered!");n.dragInit()}},t.isLigature=g,t.areAdjacent=function(e,t){if(t.length<2)return!1;let n;switch(e){case"selBySyllable":n=Array.from(document.querySelectorAll(".syllable"));break;case"selByNeume":return!0;case"selByNc":n=Array.from(document.querySelectorAll(".nc"));break;case"selByStaff":n=Array.from(document.querySelectorAll(".staff"));break;default:return!1}const i=[];for(let e=0;e!(e.classList.contains("divLine")||e.classList.contains("accid")||e.classList.contains("clef")))))return!1;switch(e){case"selBySyllable":const e=t[0].closest(".staff");for(let n=0;n{const o=e.getAttribute("d").match(/\d+/g).map(e=>Number(e));void 0===s&&(s=Math.atan((o[3]-o[1])/(o[2]-o[0]))),(void 0===n||Math.min(o[1],o[3])r)&&(r=Math.max(o[1],o[3])),(void 0===i||o[2]>i)&&(i=o[2])}),{id:e.id,ulx:t,uly:n,lrx:i,lry:r,rotate:s}},t.selectBBox=v,t.selectNn=function(e){return!(e.length>0)||(e.forEach(e=>{f(e)}),!1)},t.selectAll=async function(e,t,n){const i=l();if(u(),0===e.length)return;let r,c=!1,d=!1;switch(i){case"selBySyllable":r=".syllable";break;case"selByNeume":r=".neume";break;case"selByNc":r=".nc";break;case"selByStaff":r=".staff";break;case"selByBBox":r=".sylTextRect-display";break;case"selByLayerElement":r=".clef, .custos, .accid, .divLine";break;default:return void console.error("Unknown selection type "+i)}const h=new Set;for(const t of e){let e=t.closest(r);if(null===e){if(e=t.closest(".clef, .custos, .accid, .divLine"),null===e){console.warn("Element "+t.id+" is not part of specified group and is not a clef or custos or accid or divLine.");continue}c=c||!0}else d=d||!0;h.add(e);let n=e,i=n.getAttribute("mei:follows"),s=n.getAttribute("mei:precedes");for(;i||s;){if(i){if(n=document.querySelector("#"+i.slice(1)),h.has(n))break;n.classList.add("no-moving"),h.add(n),i=n.getAttribute("mei:follows")}if(s){if(n=document.querySelector("#"+s.slice(1)),h.has(n))break;n.classList.add("no-moving"),h.add(n),s=n.getAttribute("mei:precedes")}}}h.forEach(e=>f(e,n,!1));const g=Array.from(h.values());if(!c||d)switch(i){case"selByStaff":switch(g.length){case 1:a.triggerSingleStaffActions(),s.initGroupingListeners(),(0,o.resize)(g[0],t,n);break;default:a.triggerMultiStaffActions(),s.initGroupingListeners()}break;case"selByLayerElement":1===h.size?a.triggerLayerElementActions(g[0]):a.triggerDefaultActions();break;case"selBySyllable":switch(g.length){case 1:a.triggerSyllableActions("singleSelect");break;default:s.isLinkable("selBySyllable",g)?a.triggerSyllableActions("linkableSelect"):s.isGroupable("selBySyllable",g)?a.triggerSyllableActions("multiSelect"):a.triggerSyllableActions("default")}break;case"selByNeume":switch(g.length){case 1:a.triggerNeumeActions(),s.initGroupingListeners();break;default:s.isGroupable("selByNeume",g)?s.triggerGrouping("neume"):a.triggerDefaultActions()}break;case"selByNc":switch(g.length){case 1:a.triggerNcActions(g[0]);break;case 2:if(m(g)){if(g[0].parentElement===g[1].parentElement){const e=Array.from(g[0].parentElement.children);if(1===Math.abs(e.indexOf(g[0])-e.indexOf(g[1]))){let e=g[0].children[0],t=g[1].children[0],n=e.x.baseVal.value,i=t.x.baseVal.value,r=e.y.baseVal.value,o=t.y.baseVal.value;if((n>i||n===i&&rv(e,n,void 0))}break;default:console.error("Unknown selection type. This should not have occurred.")}else 1===h.size?a.triggerLayerElementActions(g[0]):"selBySyllable"==i?a.triggerDefaultSylActions():a.triggerDefaultActions()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.queueNotification=t.Notification=void 0;const i=n(26),r=n(17),s=new Array(0);let o=null;const a={default:"",warning:"⚠️ ",error:"🔴 ",success:"✅ "};class c{constructor(e,t,n=null){this.message=a[t]+e,this.displayed=!1,this.id=(0,r.uuidv4)(),this.isModeMessage=-1!==e.search("Mode"),this.logInfo=n,this.timeoutID=-1,this.type=t}setTimeoutId(e){this.timeoutID=Math.max(e,-1)}display(){this.displayed=!0}getId(){return this.id}}function l(e){document.getElementById(e)&&document.getElementById(e).remove()}function u(e){!function(e){if(e.isModeMessage){if(null!==o)return void window.clearTimeout(o.timeoutID);o=e}if(s.push(e),s.length>3){l(s.shift().getId())}const t=document.getElementById("notification-content"),n=document.createElement("div");n.classList.add("neon-notification"),n.classList.add("neon-notification-"+e.type),n.id=e.getId(),n.innerHTML=e.message,t.append(n),t.style.display="",e.display()}(e),e.setTimeoutId(window.setTimeout(l,5e3,e.getId())),document.getElementById(e.getId()).addEventListener("click",()=>{window.clearTimeout(e.timeoutID),l(e.getId())})}function d(e,t="default",n=null){const r=new c(e,t,n);"error"!=r.type&&"warning"!=r.type||(0,i.recordNotification)(r),u(r)}t.Notification=c,t.queueNotification=d,t.default={queueNotification:d}},function(e,t,n){"use strict";e.exports=function(e){return function(){var t=arguments.length;if(t){for(var n=[],i=-1;++i\n \n \n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
',groupingTab:'\n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
',systemTab:'\n \n
\n Click upper left and lower right corners of new staff.
'},t.insertControlsPanel='\n\t',t.editControlsPanel='\n \n
\n
\n
Selection Mode:
\n
\n\n Syllable \n Neume \n Neume Component \n Staff \n Layer Element \n\n
\n
\n
\n\n
\n
\n
\n \n
\n \x3c!--\n * The extraEdit panel is added for edit options that have dropdown menus\n * Like the Neume and Clef menus\n * This is done because the moreEdit menu needs to have overflow for cases where it has lots of buttons\n * But overflow ruins dropdown menus\n --\x3e\n
\n
\n
\n
',t.ncActionContents='Change Head Shape: \n \n
\n \n Head Shapes \n \n \n
\n \n
',t.defaultNeumeActionContents='\n Delete \n Split Neumes \n
',t.neumeActionContents='Grouping Options: \n \n
\n
\n \n Groupings \n \n \n \n \n
\n \n
\n
Ungroup ',t.defaultActionContents='
\n Delete \n
',t.defaultSylActionContents='
Delete \n
Re-associate to nearest staff ',t.custosActionContents='
\n Delete \n Re-associate to nearest staff \n
',t.layerElementOutActionContents='
\n Delete \n Insert to nearest syllable \n Re-associate to nearest staff \n
',t.layerElementInActionContents='
\n Delete \n Move outside syllable \n Re-associate to nearest staff \n
',t.accidActionContents='
Change Accidental: \n
\n
\n \n Shapes \n \n \n
\n \n
',t.staffSplitActionContents='
Split System:
\n
\n Split \n Reset Rotate \n Delete \n
',t.staffMergeActionContents='
Merge Systems: \n
\n Merge \n Delete \n
',t.columnActionContents='
\n Edit Column Information:\n
\n
– \n
\n
+ \n
Confirm \n
\n
\n
',t.clefActionContents='\n
\n
\n
\n \n Displace Octave \n \n \n
\n \n
\n
\n
\n \n Change Clef Shape \n \n \n
\n \n
\n
\n ',t.divLineActionContents='
Change DivLine: \n
\n
\n \n Shapes \n \n \n
\n \n
',t.bboxActionContents='
\n Match Height for Entire Row \n Delete \n
',t.groupingMenu={nc:'
\n
\n Group Neume Components \n Delete \n
\n
',neume:'
\n
\n Group Neumes \n Delete \n
\n
',syl:'
\n
\n Merge Syllables \n Delete \n Re-associate to nearest staff \n
\n\t\t
',ligatureNc:'
\n
\n Group Neume Components \n Toggle Ligature \n Delete \n
\n
',ligature:'
\n
\n Toggle Ligature \n Delete \n
\n
',splitSyllable:'
\n
\n Toggle Linked Syllables \n Delete \n
\n
'},t.editTextModal='
\n
Enter Syllable Text: \n
\n
\n
',t.hotkeysModal='\n
\n \x3c!-- "Display" hotkeys --\x3e\n
\n
Display
\n
\n
\n
\n
\n
\n
\n
Scroll To Syllable Text
\n
\n
\n\n \x3c!-- "Edit" hotkeys --\x3e\n
\n
Edit
\n
\n
\n
Ctrl
\n
+
\n
z
\n
or
\n
⌘
\n
+
\n
z
\n
\n
Undo
\n
\n
\n
\n
Ctrl
\n
+
\n
Shift
\n
+
\n
z
\n
or
\n
⌘
\n
+
\n
Shift
\n
+
\n
z
\n
\n
Redo
\n
\n
\n
\n
\n Highlight by Staff/Syllable/Neume/LayerElement/Selection/Off\n
\n
\n
\n
\n
\n Select by Syllable/Neume/Neume Component/Staff/Layer Element/BBox\n
\n
\n
\n
\n
\n Begin Insert for the nth Option in the Selected Tab\n
\n
\n
\n
\n
\n Group/Ungroup Selected Element(s)\n
\n
\n
\n\n \x3c!-- "Other" hotkeys --\x3e\n
\n
Other
\n
\n
\n
\n
Return to Edit Mode
\n
\n
\n
',t.syllableActionsContent='\n
\n Merge Syllables \n Ungroup \n Delete \n Re-associate to nearest staff \n
\n',t.errorLogsPanelContents='
\n
'},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";for(var i=n(11),r=[],s=0;s<256;++s)r.push((s+256).toString(16).substr(1));t.a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(r[e[t+0]]+r[e[t+1]]+r[e[t+2]]+r[e[t+3]]+"-"+r[e[t+4]]+r[e[t+5]]+"-"+r[e[t+6]]+r[e[t+7]]+"-"+r[e[t+8]]+r[e[t+9]]+"-"+r[e[t+10]]+r[e[t+11]]+r[e[t+12]]+r[e[t+13]]+r[e[t+14]]+r[e[t+15]]).toLowerCase();if(!Object(i.a)(n))throw TypeError("Stringified UUID is invalid");return n}},function(e,t,n){"use strict";var i=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;t.a=function(e){return"string"==typeof e&&i.test(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initDisplayControls=t.loadHighlightSettings=t.updateDisplayAllBtn=t.updateHighlight=t.setHighlightSelectionControls=t.setHighlightControls=t.setHighlightOption=t.getHighlightType=t.setCircleSizeControls=t.setBgOpacityFromSlider=t.setGlyphOpacityFromSlider=t.setZoomControls=void 0;const i=n(18),r=n(3),s=n(7);let o,a,c;function l(e){const t=document.getElementById("opacityOutput");document.getElementById("opacitySlider").value=t.value,(0,r.setSettings)({glyphOpacity:Number(t.value)});const n=document.querySelector("#toggle-glyph-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show glyph")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide glyph"));try{document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=(Number(t.value)/100).toString()})}catch(e){console.warn("Unable to properly set opacity to pages")}}function u(e){const t=document.querySelector("#bgOpacityOutput");(0,r.setSettings)({imageOpacity:Number(t.value)});const n=document.querySelector("#toggle-bg-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show background image")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide background image"));const i=document.querySelector("."+e);i&&(i.style.opacity=String(Number(t.value)/100))}function d(e){const t=document.getElementById("highlight-"+e),n=document.getElementById("highlight-dropdown"),s=document.getElementById("highlight-type");if((0,r.setSettings)({highlightMode:e}),n.classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),"none"===e)return s.textContent=" - Off",void i.unsetGroupingHighlight();t.classList.add("highlight-selected"),s.textContent=" - "+(e[0].toUpperCase()+e.slice(1)),i.setGroupingHighlight(e)}function h(e){document.getElementById("highlight-"+e).addEventListener("click",()=>{d(e)})}function f(){document.body.removeEventListener("click",f),document.getElementById("highlight-dropdown").classList.remove("is-active")}function g(){const e=document.getElementById("highlight-dropdown");document.getElementById("highlight-button").addEventListener("click",t=>{t.stopPropagation(),e.classList.toggle("is-active"),e.classList.contains("is-active")?(document.body.addEventListener("click",f),h("column"),h("staff"),h("syllable"),h("neume"),h("layerElement"),h("none")):document.body.removeEventListener("click",f)})}function p(){const{highlightMode:e}=(0,r.getSettings)();d(e)}t.setZoomControls=function(e){if(void 0===e)return;const t=document.getElementById("zoomSlider"),n=document.getElementById("zoomOutput"),{zoom:i}=(0,r.getSettings)();t.value=String(i),n.value=String(i),e.zoomTo(i/100),document.getElementById("reset-zoom").addEventListener("click",()=>{n.value="100",t.value="100",e.resetZoomAndPan()}),document.querySelector("#set-zoom-easy-edit").addEventListener("click",()=>{n.value="180",t.value="180",e.zoomTo(1.8)}),t.addEventListener("mouseup",(function(){n.value=t.value,e.zoomTo(Number(n.value)/100)})),t.disabled=!1,document.body.addEventListener("keydown",i=>{const r=parseInt(n.value);if("ArrowUp"===i.key||"ArrowDown"===i.key||"ArrowRight"===i.key||"ArrowLeft"===i.key)i.preventDefault();else if("+"===i.key){const i=Math.min(r+20,parseInt(t.getAttribute("max")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else if("_"===i.key){const i=Math.max(r-20,parseInt(t.getAttribute("min")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else"0"===i.key&&(n.value="100",t.value="100",e.resetZoomAndPan())})},t.setGlyphOpacityFromSlider=l,t.setBgOpacityFromSlider=u,t.setCircleSizeControls=function(){const e=document.getElementById("circleSlider"),t=document.getElementById("circleOutput"),{circleSize:n}=(0,r.getSettings)();function i(){t.value=e.value,c=Number(e.value),(0,r.setSettings)({circleSize:Number(c)});const n=s.selectAll(".resizePoint");n.empty()||n.attr("r",c)}c=n,e.value=String(n),t.value=String(n),document.getElementById("reset-circle-size").addEventListener("click",()=>{const n=s.selectAll(".resizePoint");n.empty()||n.attr("r",25),c=Number(25),e.value=String(25),t.value=String(25),(0,r.setSettings)({circleSize:Number(25)}),i()}),e.addEventListener("input",i),e.addEventListener("change",i),e.disabled=!1},t.getHighlightType=function(){return document.getElementById("highlight-type").textContent.slice(3).toLowerCase()},t.setHighlightOption=h,t.setHighlightControls=g,t.setHighlightSelectionControls=function(){const e=document.getElementById("highlight-selection");e.addEventListener("click",()=>{document.getElementById("highlight-dropdown").classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),e.classList.add("highlight-selected"),document.getElementById("highlight-type").textContent=" - Selection",i.setGroupingHighlight("selection")})},t.updateHighlight=function(){let e;try{e=document.querySelector(".highlight-selected").id}catch(t){e=""}switch(e){case"highlight-column":i.setGroupingHighlight("column");break;case"highlight-staff":i.setGroupingHighlight("staff");break;case"highlight-syllable":i.setGroupingHighlight("syllable");break;case"highlight-neume":i.setGroupingHighlight("neume");break;case"highlight-layerElement":i.setGroupingHighlight("layerElement");break;case"highlight-selection":i.setGroupingHighlight("selection");break;default:i.unsetGroupingHighlight()}},t.updateDisplayAllBtn=function(){const e=document.getElementById("display-all-btn"),t=document.getElementById("displayInfo"),n=document.getElementById("displayBBox"),i=document.getElementById("displayText"),r=document.getElementById("display-errors");(null==t?void 0:t.checked)&&(null==n?void 0:n.checked)&&(null==i?void 0:i.checked)&&(null==r?void 0:r.checked)?(e.classList.add("selected"),e.innerHTML="Hide All"):e.classList.contains("selected")&&(e.classList.remove("selected"),e.innerHTML="Display All")},t.loadHighlightSettings=p,t.initDisplayControls=function(e,t){!function(e){const t=document.getElementById("opacitySlider"),n=document.getElementById("opacityOutput"),{glyphOpacity:i}=(0,r.getSettings)();function s(){n.value=t.value,o=Number(t.value),l(e)}o=i,t.value=String(i),n.value=String(i);const a=document.getElementById("toggle-glyph-opacity");100==i&&a.classList.add("hide-icon"),null==a||a.addEventListener("click",()=>{let i;a.classList.contains("hide-icon")?(a.classList.remove("hide-icon"),i=0):(a.classList.add("hide-icon"),i=1),document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=i.toString()}),o=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({glyphOpacity:100*i}),s()}),t.addEventListener("input",s),t.addEventListener("change",s),t.disabled=!1}(e),function(e){const t=document.getElementById("bgOpacitySlider"),n=document.getElementById("bgOpacityOutput"),{imageOpacity:i}=(0,r.getSettings)();function s(){n.value=t.value,a=Number(t.value),u(e)}a=i,t.value=String(i),n.value=String(i);const o=document.getElementById("toggle-bg-opacity");100==i&&o.classList.add("hide-icon"),o.addEventListener("click",()=>{let i;o.classList.contains("hide-icon")?(o.classList.remove("hide-icon"),i=0):(o.classList.add("hide-icon"),i=1),document.getElementsByClassName(e)[0].style.opacity=i.toString(),a=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({imageOpacity:100*i}),s()}),t.addEventListener("input",s),t.addEventListener("change",s),t.disabled=!1}(t),g(),document.getElementById("burgerMenu").addEventListener("click",()=>{document.getElementById("burgerMenu").classList.toggle("is-active"),document.getElementById("navMenu").classList.toggle("is-active")}),document.body.addEventListener("keydown",e=>{if(!e.metaKey)switch(e.key){case"q":d("staff");break;case"w":d("syllable");break;case"e":d("neume");break;case"r":d("layerElement");break;case"t":d("selection");break;case"y":d("none")}}),function(){const e=document.querySelector("#display-all-btn");e.addEventListener("click",()=>{if(e.classList.contains("selected")){e.classList.remove("selected"),e.innerHTML="Display All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked&&e.click()})}else{e.classList.add("selected"),e.innerHTML="Hide All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked||e.click()})}})}(),p();const n=document.getElementById("displayContents"),i=document.getElementById("toggleDisplay");document.getElementById("displayHeader").addEventListener("click",e=>{e.stopPropagation(),n.classList.contains("closed")?(n.classList.remove("closed"),n.style.padding="0.5em 0.75em",setTimeout(()=>{n.style.overflow="visible"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(n.classList.add("closed"),n.style.overflow="hidden",setTimeout(()=>{n.style.padding="0px"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalWindow=t.ModalWindowView=void 0;const i=n(8),r=n(33),s=n(4);var o,a;!function(e){e[e.EDIT_TEXT=0]="EDIT_TEXT",e[e.HOTKEYS=1]="HOTKEYS",e[e.ERROR_LOG=2]="ERROR_LOG",e[e.DOCUMENT_UPLOAD=3]="DOCUMENT_UPLOAD",e[e.MOVE_TO=4]="MOVE_TO",e[e.NEW_FOLDER=5]="NEW_FOLDER",e[e.RENAME=6]="RENAME"}(o=t.ModalWindowView||(t.ModalWindowView={})),function(e){e[e.OPEN=0]="OPEN",e[e.CLOSED=1]="CLOSED"}(a||(a={}));t.ModalWindow=class{constructor(e){this.openEditSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-save").removeEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-save").addEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.updateSylText=function(){const e=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0],t=e.textContent.replace(/\u{25CA}/u,"").trim(),n=document.getElementById("neon-modal-window-edit-text-input").value;if(null!==n&&n!==t){const t={action:"setText",param:{elementId:[...e.classList.entries()].filter(e=>"text-select"!==e[1]&&"selected-to-edit"!==e[1])[0][1],text:n}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(t=>{t&&this.neonView.updateForCurrentPage().then(()=>{this.updateSelectedBBox(e,this.dragHandler,this.neonView)})})}else this.updateSelectedBBox(e,this.dragHandler,this.neonView);this.hideModalWindow()},this.keydownListener=function(e){switch(e.stopImmediatePropagation(),this.modalWindowView){case o.EDIT_TEXT:"Enter"===e.key&&this.updateSylText();default:"Escape"===e.key&&this.hideModalWindow()}},this.focusModalWindow=function(){switch(this.modalWindowView){case o.EDIT_TEXT:document.getElementById("neon-modal-window-edit-text-input").select();break;case o.DOCUMENT_UPLOAD:case o.NEW_FOLDER:case o.RENAME:break;default:document.getElementById("neon-modal-window").focus()}},this.neonView=e,this.modalWindowState=a.CLOSED,this.setupEventListeners()}setupEventListeners(){document.getElementById("neon-modal-window-header-close").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").addEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").addEventListener("click",this.focusModalWindow.bind(this))}removeEventListeners(){document.getElementById("neon-modal-window-header-close").removeEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").removeEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").removeEventListener("click",this.focusModalWindow.bind(this))}setModalWindowView(e,t){this.modalWindowView=e,this.setModalWindowContent(t)}getModalWindowView(){return this.modalWindowView.toString()}openModalWindow(){switch(Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),this.modalWindowView){case o.EDIT_TEXT:this.openEditSylTextModalWindow();break;case o.HOTKEYS:document.getElementById("neon-modal-window-content-hotkeys").classList.add("visible");case o.DOCUMENT_UPLOAD:case o.MOVE_TO:case o.NEW_FOLDER:case o.RENAME:default:document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()}document.body.style.overflowX="hidden",document.body.style.overflowY="hidden",this.modalWindowState=a.OPEN}hideModalWindow(){switch(this.modalWindowView){case o.EDIT_TEXT:document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].classList.remove("selected-to-edit");break;case o.DOCUMENT_UPLOAD:case o.MOVE_TO:case o.NEW_FOLDER:case o.RENAME:document.getElementById("neon-modal-window-content-container").innerHTML=""}document.getElementById("neon-modal-window-container").style.display="none",document.body.style.overflowX="hidden",document.body.style.overflowY="scroll",this.modalWindowState=a.CLOSED,this.removeEventListeners()}setModalWindowContent(e){const t=document.getElementById("neon-modal-window-content-container"),n=document.getElementById("neon-modal-window-header-title");switch(this.modalWindowView){case o.EDIT_TEXT:t.innerHTML=i.editTextModal,n.innerText="EDIT SYLLABLE TEXT";const s=/\u{25CA}/u,a=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].textContent.replace(s,"").trim();document.getElementById("neon-modal-window-edit-text-input").value=a;break;case o.HOTKEYS:t.innerHTML=i.hotkeysModal,n.innerText="HOTKEYS";break;case o.ERROR_LOG:t.innerHTML=`
${e}
\n
`,n.innerText="ERROR LOG";break;case o.DOCUMENT_UPLOAD:n.innerText="DOCUMENT UPLOAD",t.innerHTML=r.uploadAreaHTML;break;case o.MOVE_TO:n.innerText="MOVE TO";break;case o.NEW_FOLDER:n.innerText="NEW FOLDER",t.innerHTML=r.newFolderHTML;break;case o.RENAME:n.innerText="RENAME",t.innerHTML=r.renameHTML;break;default:console.error("Unknown selection type. This should not have occurred.")}}updateSelectedBBox(e,t,n){(0,s.unselect)();const i=Array.from(e.classList).find(e=>"text-select"!==e&&"selected-to-edit"!==e);if(document.getElementById("displayBBox").checked&&document.getElementById(i)){const e=document.getElementById(i).querySelector(".sylTextRect-display");(0,s.selectBBox)(e,t,n)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.triggerDefaultActions=t.triggerDefaultSylActions=t.triggerBBoxActions=t.triggerSingleStaffActions=t.triggerStaffSplitMode=t.triggerMultiStaffActions=t.triggerLayerElementActions=t.triggerSyllableActions=t.triggerNeumeActions=t.triggerNcActions=t.addChangeStaffListener=t.matchHeightHandler=t.moveOutsideSyllableHandler=t.insertToSyllableHandler=t.changeStaffHandler=t.removeHandler=t.endOptionsSelection=t.deleteButtonHandler=t.unsetLiquescentAnticlockwiseAction=t.unsetLiquescentClockwiseAction=t.unsetVirgaReversedAction=t.unsetVirgaAction=t.unsetInclinatumAction=t.initNeonView=void 0;const i=n(8),r=n(24),s=n(5),o=n(35),a=n(36),c=n(4);let l;function u(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function d(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function h(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function f(e){return{action:"set",param:{elementId:e,attrType:"curve",attrValue:""}}}function g(e){return{action:"setLiquescent",param:{elementId:e,curve:""}}}function p(e){"d"!==e.key&&"Backspace"!==e.key||(v(),e.preventDefault())}function m(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden")),document.body.removeEventListener("keydown",p)}function v(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{t.classList.contains("syl")&&(t=t.closest(".syllable")),t.classList.contains("accid")&&(t=t.closest(".accid")),t.classList.contains("divLine")&&(t=t.closest(".divLine")),e.push({action:"remove",param:{elementId:t.id}})});const t={action:"chain",param:e};m(),l.edit(t,l.view.getCurrentPageURI()).then(()=>{l.updateForCurrentPage()})}function y(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"changeStaff",param:{elementId:t.id}})});const t={action:"chain",param:e};m(),l.edit(t,l.view.getCurrentPageURI()).then(()=>{l.updateForCurrentPage()})}function b(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"insertToSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Insert Success","success"):s.default.queueNotification("Insert Failed XoX","error"),m(),l.updateForCurrentPage()})}function w(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"moveOutsideSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Move Success","success"):s.default.queueNotification("Move Failed XoX","error"),m(),l.updateForCurrentPage()})}function _(){const e=Array.from(document.getElementsByClassName("selected"));e.length>1&&s.default.queueNotification("Cannot match height to multiple bbox","error");const t={action:"matchHeight",param:{elementId:e[0].id}};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Height Match Success","success"):s.default.queueNotification("Height Match Failed XoX","error"),m(),l.updateForCurrentPage()})}function E(){const e=document.getElementById("delete");e&&(e.removeEventListener("click",v),e.addEventListener("click",v),document.body.addEventListener("keydown",p))}function S(){const e=document.getElementById("changeStaff");null==e||e.removeEventListener("click",y),null==e||e.addEventListener("click",y)}function x(){const e=document.getElementById("col-input"),t=document.querySelectorAll(".staff.selected");let n;for(const e of t){const t=Array.from(e.classList).join(" ").match(/\bcolumn(\d+)\b/);if(t){const e=parseInt(t[1],10);if(n&&n!=e){document.getElementById("col-warning").innerText="The selected staves are not of the same column!",n=0;break}n=e}}n&&(e.value=n.toString())}function L(){const e=document.getElementById("col-decrement"),t=document.getElementById("col-increment"),n=document.getElementById("col-confirm"),i=document.getElementById("col-input");function r(e){let t=parseInt(i.value,10)||0;t+=e,t=Math.min(Math.max(t,1),5),t.toString()!=i.value&&(n.style.display=""),i.value=t.toString()}e.addEventListener("click",(function(){r(-1)})),t.addEventListener("click",(function(){r(1)})),n.addEventListener("click",(function(){const e=[];document.querySelectorAll(".staff.selected").forEach(t=>{e.push({action:"set",param:{elementId:t.id,attrType:"type",attrValue:"column"+i.value}})});const t={action:"chain",param:e};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Column Value Update Success","success"):s.default.queueNotification("Column Value Update Failed XoX","error"),m(),l.updateForCurrentPage()})}))}function A(e,t,n=!0){const i=document.getElementById(e);i&&(i.parentElement.classList.remove("hidden"),n?i.innerHTML=t:i.innerHTML+=t)}function k(e){l.edit(e,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}function C(){const e=document.querySelector(".staff.selected");if(null!==e){new o.SplitStaffHandler(l,e).startSplit(),m()}else console.error("No staff was selected!"),m()}function I(){document.querySelectorAll(".drop_select").forEach(e=>{const t=()=>{document.body.removeEventListener("click",t),e.classList.remove("is-active")};e.addEventListener("click",n=>{e.classList.toggle("is-active"),Array.from(document.querySelectorAll(".drop_select")).filter(t=>t!==e).forEach(e=>e.classList.remove("is-active")),n.stopPropagation(),e.classList.contains("is-active")?document.body.addEventListener("click",t):document.body.removeEventListener("click",t)})})}t.initNeonView=function(e){l=e,r.initNeonView(e)},t.unsetInclinatumAction=u,t.unsetVirgaAction=d,t.unsetVirgaReversedAction=h,t.unsetLiquescentClockwiseAction=f,t.unsetLiquescentAnticlockwiseAction=g,t.deleteButtonHandler=p,t.endOptionsSelection=m,t.removeHandler=v,t.changeStaffHandler=y,t.insertToSyllableHandler=b,t.moveOutsideSyllableHandler=w,t.matchHeightHandler=_,t.addChangeStaffListener=S,t.triggerNcActions=function(e){m(),A("moreEdit",i.defaultActionContents),A("extraEdit",i.ncActionContents),E(),document.querySelector("#Punctum.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=d(e.id),i=h(e.id),r=f(e.id),o=g(e.id);l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#Inclinatum.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=h(e.id),i=f(e.id),r=g(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"se"}};l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#Virga.dropdown-item").addEventListener("click",()=>{const t=h(e.id),n=u(e.id),i=f(e.id),r=g(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"s"}};l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#VirgaReversed.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=d(e.id),i=f(e.id),r=g(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"n"}};l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#LiquescentClockwise.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=d(e.id),i=h(e.id),r=g(e.id),o={action:"setLiquescent",param:{elementId:e.id,curve:"c"}};l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#LiquescentAnticlockwise.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=d(e.id),i=h(e.id),r=f(e.id),o={action:"setLiquescent",param:{elementId:e.id,curve:"a"}};l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),I()},t.triggerNeumeActions=function(){m(),A("moreEdit",i.defaultNeumeActionContents),A("extraEdit",i.neumeActionContents),E();const e=document.querySelectorAll(".selected");function t(t){const n={action:"changeGroup",param:{elementId:e[0].id,contour:t}};l.edit(n,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Grouping Changed","success"):s.default.queueNotification("Grouping Failed","error"),m(),l.updateForCurrentPage()})}1===e.length?(document.getElementById("split-neume").addEventListener("click",()=>{const e=document.querySelector(".neume.selected");if(null!==e){new a.SplitNeumeHandler(l,e).startSplit(),m()}else console.error("No staff was selected!"),m()}),document.querySelector("#Pes.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#PesSubpunctis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Clivis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Scandicus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusFlexus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusSubpunctis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Climacus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#ClimacusResupinus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Torculus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#TorculusResupinus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Porrectus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusFlexus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusSubpunctis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Pressus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),I()):console.warn("More than one neume selected! Cannot trigger Neume ClickSelect actions.")},t.triggerSyllableActions=function(e){m(),A("moreEdit",i.syllableActionsContent);let t="";switch(e){case"singleSelect":t+='
\n Ungroup \n Re-associate to nearest staff \n Delete \n
';break;case"linkableSelect":t+='
\n Toggle Linked Syllables \n Re-associate to nearest staff \n Delete \n
';break;case"multiSelect":t+='
\n Merge Syllables \n Re-associate to nearest staff \n Delete \n
';break;case"default":t+='
\n Re-associate to nearest staff \n Delete \n
'}A("moreEdit",t,!0),S(),E(),r.initGroupingListeners()},t.triggerLayerElementActions=function(e){var t,n,r,o;if(m(),e.classList.contains("custos"))return A("moreEdit",i.custosActionContents),S(),void E();A("moreEdit",e.parentElement.classList.contains("syllable")?i.layerElementInActionContents:i.layerElementOutActionContents,!1),e.classList.contains("accid")?(A("extraEdit",i.accidActionContents),function(e){document.querySelector("#ChangeToFlat.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"f"}})}),document.querySelector("#ChangeToNatural.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"n"}})}),I()}(e)):e.classList.contains("clef")?(A("extraEdit",i.clefActionContents),function(e){document.querySelector("#increment-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"above"}};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Clef octave incremented.","success"):s.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#decrement-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"below"}};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Clef octave decremented.","success"):s.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#CClef.dropdown-item").addEventListener("click",()=>{k({action:"setClef",param:{elementId:e.id,shape:"C"}})}),document.querySelector("#FClef.dropdown-item").addEventListener("click",()=>{k({action:"setClef",param:{elementId:e.id,shape:"F"}})}),I()}(e)):e.classList.contains("divLine")&&(A("extraEdit",i.divLineActionContents),function(e){document.querySelector("#ChangeToMinima.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"minima"}})}),document.querySelector("#ChangeToMaior.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maior"}})}),document.querySelector("#ChangeToMaxima.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maxima"}})}),document.querySelector("#ChangeToFinalis.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"finalis"}})}),document.querySelector("#ChangeToCaesura.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"caesura"}})}),document.querySelector("#ChangeToVirgula.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"virgula"}})}),I()}(e)),S(),null===(t=document.getElementById("insertToSyllable"))||void 0===t||t.addEventListener("click",b),null===(n=document.getElementById("moveOutsideSyllable"))||void 0===n||n.addEventListener("click",w),E(),S(),null===(r=document.getElementById("insertToSyllable"))||void 0===r||r.addEventListener("click",b),null===(o=document.getElementById("moveOutsideSyllable"))||void 0===o||o.addEventListener("click",w)},t.triggerMultiStaffActions=function(){m(),A("moreEdit",i.staffMergeActionContents),A("extraEdit",i.columnActionContents),E(),x(),L(),document.getElementById("merge-systems").addEventListener("click",()=>{r.mergeStaves()})},t.triggerStaffSplitMode=C,t.triggerSingleStaffActions=function(){m(),A("moreEdit",i.staffSplitActionContents),A("extraEdit",i.columnActionContents),E(),x(),L(),document.getElementById("split-system").addEventListener("click",()=>{C()}),document.getElementById("reset-rotate").addEventListener("click",()=>{const e=document.querySelector(".staff.selected"),t=(0,c.getStaffBBox)(e),n=Math.tan(t.rotate)*(t.lrx-t.ulx);if(null!==e){const i={action:"resizeRotate",param:{elementId:e.id,ulx:t.ulx,uly:t.rotate>0?t.uly+n/2:t.uly-n/2,lrx:t.lrx,lry:t.rotate>0?t.lry-n/2:t.lry+n/2,rotate:0}};l.edit(i,l.view.getCurrentPageURI()).then(async e=>{e&&await l.updateForCurrentPage()}),m()}else console.error("No staff was selected"),m()})},t.triggerBBoxActions=function(){m(),A("moreEdit",i.bboxActionContents),E(),document.getElementById("matchHeight").addEventListener("click",()=>{_()})},t.triggerDefaultSylActions=function(){m(),A("moreEdit",i.defaultSylActionContents),E(),S()},t.triggerDefaultActions=function(){m(),A("moreEdit",i.defaultActionContents),E()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getGlyphBBox=t.isOutOfSVGBounds=t.getStaffByCoords=t.getStaffIdByCoords=t.getSVGRelCoords=void 0;const i=n(4);function r(e,t){const n=new DOMPoint(e,t),i=document.querySelector(".active-page > .definition-scale").querySelector(".page-margin"),{x:r,y:s}=n.matrixTransform(i.getScreenCTM().inverse());return{x:r,y:s}}function s(e,t){const n=Array.from(document.querySelectorAll(".staff")).map(e=>(0,i.getStaffBBox)(e)),{x:s,y:o}=r(e,t),a=n.find(e=>s<=e.lrx&&s>=e.ulx&&o<=e.lry&&o>=e.uly);return a?a.id:null}t.getSVGRelCoords=r,t.getStaffIdByCoords=s,t.getStaffByCoords=function(e,t){const n=s(e,t);return document.querySelector("#"+n)},t.isOutOfSVGBounds=function(e,t){const n=document.querySelector("#bgimg");return e<=0||e>=Number(n.getAttribute("width"))||t<=0||t>=Number(n.getAttribute("height"))},t.getGlyphBBox=function(e){const t="rect"==e.tagName?e.getBBox():e.parentNode.getBBox();return{ulx:t.x,uly:t.y,lrx:t.x+t.width,lry:t.y+t.height}}},function(e,t,n){e.exports=function(e){"use strict";var t=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function n(e,t){var n=e[0],i=e[1],r=e[2],s=e[3];i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[0]-680876936|0)<<7|n>>>25)+i|0)&i|~n&r)+t[1]-389564586|0)<<12|s>>>20)+n|0)&n|~s&i)+t[2]+606105819|0)<<17|r>>>15)+s|0)&s|~r&n)+t[3]-1044525330|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[4]-176418897|0)<<7|n>>>25)+i|0)&i|~n&r)+t[5]+1200080426|0)<<12|s>>>20)+n|0)&n|~s&i)+t[6]-1473231341|0)<<17|r>>>15)+s|0)&s|~r&n)+t[7]-45705983|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[8]+1770035416|0)<<7|n>>>25)+i|0)&i|~n&r)+t[9]-1958414417|0)<<12|s>>>20)+n|0)&n|~s&i)+t[10]-42063|0)<<17|r>>>15)+s|0)&s|~r&n)+t[11]-1990404162|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[12]+1804603682|0)<<7|n>>>25)+i|0)&i|~n&r)+t[13]-40341101|0)<<12|s>>>20)+n|0)&n|~s&i)+t[14]-1502002290|0)<<17|r>>>15)+s|0)&s|~r&n)+t[15]+1236535329|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[1]-165796510|0)<<5|n>>>27)+i|0)&r|i&~r)+t[6]-1069501632|0)<<9|s>>>23)+n|0)&i|n&~i)+t[11]+643717713|0)<<14|r>>>18)+s|0)&n|s&~n)+t[0]-373897302|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[5]-701558691|0)<<5|n>>>27)+i|0)&r|i&~r)+t[10]+38016083|0)<<9|s>>>23)+n|0)&i|n&~i)+t[15]-660478335|0)<<14|r>>>18)+s|0)&n|s&~n)+t[4]-405537848|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[9]+568446438|0)<<5|n>>>27)+i|0)&r|i&~r)+t[14]-1019803690|0)<<9|s>>>23)+n|0)&i|n&~i)+t[3]-187363961|0)<<14|r>>>18)+s|0)&n|s&~n)+t[8]+1163531501|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[13]-1444681467|0)<<5|n>>>27)+i|0)&r|i&~r)+t[2]-51403784|0)<<9|s>>>23)+n|0)&i|n&~i)+t[7]+1735328473|0)<<14|r>>>18)+s|0)&n|s&~n)+t[12]-1926607734|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[5]-378558|0)<<4|n>>>28)+i|0)^i^r)+t[8]-2022574463|0)<<11|s>>>21)+n|0)^n^i)+t[11]+1839030562|0)<<16|r>>>16)+s|0)^s^n)+t[14]-35309556|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[1]-1530992060|0)<<4|n>>>28)+i|0)^i^r)+t[4]+1272893353|0)<<11|s>>>21)+n|0)^n^i)+t[7]-155497632|0)<<16|r>>>16)+s|0)^s^n)+t[10]-1094730640|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[13]+681279174|0)<<4|n>>>28)+i|0)^i^r)+t[0]-358537222|0)<<11|s>>>21)+n|0)^n^i)+t[3]-722521979|0)<<16|r>>>16)+s|0)^s^n)+t[6]+76029189|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[9]-640364487|0)<<4|n>>>28)+i|0)^i^r)+t[12]-421815835|0)<<11|s>>>21)+n|0)^n^i)+t[15]+530742520|0)<<16|r>>>16)+s|0)^s^n)+t[2]-995338651|0)<<23|i>>>9)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[0]-198630844|0)<<6|n>>>26)+i|0)|~r))+t[7]+1126891415|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[14]-1416354905|0)<<15|r>>>17)+s|0)|~n))+t[5]-57434055|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[12]+1700485571|0)<<6|n>>>26)+i|0)|~r))+t[3]-1894986606|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[10]-1051523|0)<<15|r>>>17)+s|0)|~n))+t[1]-2054922799|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[8]+1873313359|0)<<6|n>>>26)+i|0)|~r))+t[15]-30611744|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[6]-1560198380|0)<<15|r>>>17)+s|0)|~n))+t[13]+1309151649|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[4]-145523070|0)<<6|n>>>26)+i|0)|~r))+t[11]-1120210379|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[2]+718787259|0)<<15|r>>>17)+s|0)|~n))+t[9]-343485551|0)<<21|i>>>11)+r|0,e[0]=n+e[0]|0,e[1]=i+e[1]|0,e[2]=r+e[2]|0,e[3]=s+e[3]|0}function i(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return n}function r(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24);return n}function s(e){var t,r,s,o,a,c,l=e.length,u=[1732584193,-271733879,-1732584194,271733878];for(t=64;t<=l;t+=64)n(u,i(e.substring(t-64,t)));for(r=(e=e.substring(t-64)).length,s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;t
>2]|=e.charCodeAt(t)<<(t%4<<3);if(s[t>>2]|=128<<(t%4<<3),t>55)for(n(u,s),t=0;t<16;t+=1)s[t]=0;return o=(o=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(o[2],16),c=parseInt(o[1],16)||0,s[14]=a,s[15]=c,n(u,s),u}function o(e){var n,i="";for(n=0;n<4;n+=1)i+=t[e>>8*n+4&15]+t[e>>8*n&15];return i}function a(e){var t;for(t=0;tu?new ArrayBuffer(0):(r=u-l,s=new ArrayBuffer(r),o=new Uint8Array(s),a=new Uint8Array(this,l,r),o.set(a),s)}}(),u.prototype.append=function(e){return this.appendBinary(c(e)),this},u.prototype.appendBinary=function(e){this._buff+=e,this._length+=e.length;var t,r=this._buff.length;for(t=64;t<=r;t+=64)n(this._hash,i(this._buff.substring(t-64,t)));return this._buff=this._buff.substring(t-64),this},u.prototype.end=function(e){var t,n,i=this._buff,r=i.length,s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;t>2]|=i.charCodeAt(t)<<(t%4<<3);return this._finish(s,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},u.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},u.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},u.prototype.setState=function(e){return this._buff=e.buff,this._length=e.length,this._hash=e.hash,this},u.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},u.prototype._finish=function(e,t){var i,r,s,o=t;if(e[o>>2]|=128<<(o%4<<3),o>55)for(n(this._hash,e),o=0;o<16;o+=1)e[o]=0;i=(i=8*this._length).toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(i[2],16),s=parseInt(i[1],16)||0,e[14]=r,e[15]=s,n(this._hash,e)},u.hash=function(e,t){return u.hashBinary(c(e),t)},u.hashBinary=function(e,t){var n=a(s(e));return t?l(n):n},u.ArrayBuffer=function(){this.reset()},u.ArrayBuffer.prototype.append=function(e){var t,i,s,o,a,c=(i=this._buff.buffer,s=e,o=!0,(a=new Uint8Array(i.byteLength+s.byteLength)).set(new Uint8Array(i)),a.set(new Uint8Array(s),i.byteLength),o?a:a.buffer),l=c.length;for(this._length+=e.byteLength,t=64;t<=l;t+=64)n(this._hash,r(c.subarray(t-64,t)));return this._buff=t-64>2]|=i[t]<<(t%4<<3);return this._finish(s,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},u.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},u.ArrayBuffer.prototype.getState=function(){var e,t=u.prototype.getState.call(this);return t.buff=(e=t.buff,String.fromCharCode.apply(null,new Uint8Array(e))),t},u.ArrayBuffer.prototype.setState=function(e){return e.buff=function(e,t){var n,i=e.length,r=new ArrayBuffer(i),s=new Uint8Array(r);for(n=0;n>2]|=e[t]<<(t%4<<3);if(s[t>>2]|=128<<(t%4<<3),t>55)for(n(u,s),t=0;t<16;t+=1)s[t]=0;return o=(o=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(o[2],16),c=parseInt(o[1],16)||0,s[14]=a,s[15]=c,n(u,s),u}(new Uint8Array(e)));return t?l(i):i},u}()},function(e,t,n){"use strict";function i(e){if(16!==e.length)return"";function t(e,t){return e+t.toString(16).padStart(2,"0")}return e.slice(0,4).reduce(t,"")+"-"+e.slice(4,6).reduce(t,"")+"-"+e.slice(6,8).reduce(t,"")+"-"+e.slice(8,10).reduce(t,"")+"-"+e.slice(10).reduce(t,"")}Object.defineProperty(t,"__esModule",{value:!0}),t.uuidv4=void 0,t.uuidv4=function(){if(void 0===window.crypto)return i(new Uint8Array(16));const e=new Uint8Array(16),t=Uint8Array.from([parseInt("01000000",2),parseInt("10000000",2),parseInt("00001111",2),parseInt("00111111",2)]);return window.crypto.getRandomValues(e),e[6]=e[6]&t[2]|t[0],e[8]=e[8]&t[3]|t[1],i(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setGroupingHighlight=t.setStaffHighlight=t.highlight=t.unsetGroupingHighlight=t.unsetStaffHighlight=t.unhighlight=void 0;const i=["rgb(230, 159, 0)","rgb(86, 180, 233)","rgb(0, 158, 115)","rgb(240, 228, 66)","rgb(0, 114, 178)","rgb(213, 94, 0)","rgb(204, 121, 167)"];function r(e){let t;t=e?e.querySelectorAll(":not(.selected) .highlighted"):document.querySelectorAll(":not(.selected) .highlighted"),t.forEach(e=>{if("path"!==e.tagName||e.closest(".staff").classList.contains("selected"))if(e.classList.contains("divLine")&&!e.closest(".staff").classList.contains("selected"))e.setAttribute("stroke","#000000");else{e.removeAttribute("fill");let t=e.querySelectorAll(".sylTextRect-display");if(!t.length)try{t=e.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(e){t=[]}t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")}))}else e.setAttribute("stroke","#000000");e.classList.remove("highlighted")})}function s(){r()}function o(){s();Array.from(document.getElementsByClassName("highlighted")).filter(e=>!e.parentElement.classList.contains("selected")).forEach(e=>{e.setAttribute("#d00",null);let t=e.querySelectorAll(".sylTextRect-display");t.length||null!==e.closest(".syllable")&&(t=e.closest(".syllable").querySelectorAll("sylTextRect-display")),t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")})),e.classList.remove("highlighted"),e.querySelectorAll("sylTextRect-display").forEach(e=>{e.classList.remove("highlighted")})}),Array.from(document.getElementsByClassName("selected")).forEach(e=>{e.setAttribute("fill","")})}function a(e,t){const n=Array.from(e.children);for(let e=0;ee.querySelectorAll(".divLine")).forEach(e=>{n.push(e)});else{if(i.classList.contains("resizePoint")||"resizeRect"===i.id||i.classList.contains("rotatePoint"))return;if(i.classList.contains("layer"))Array.from(i.children).forEach(e=>{n.push(e)});else if(document.getElementsByClassName("highlight-selected").length&&"highlight-neume"===document.getElementsByClassName("highlight-selected")[0].id&&i.classList.contains("syllable"))Array.from(i.children).filter(e=>e.classList.contains("neume")).forEach(e=>{n.push(e)});else{i.setAttribute("fill",t);let e=i.querySelectorAll(".sylTextRect-display");if(!e.length)try{e=i.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(t){e=[]}e.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||(e.style.fill=t,e.classList.add("highlighted"))}))}}i.classList.add("highlighted")}let i;i="30px",e.querySelectorAll(".nc, .custos, .clef, .accid").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width",i)})}function c(){const e=Array.from(document.getElementsByClassName("staff"));for(let t=0;t{const n=Array.from(t.classList).join(" ").match(/\bcolumn(\d+)\b/);let i=0;n&&(i=parseInt(n[1],10)-1),e[i]||(e[i]=[]),e[i].push(t)});for(const[t,n]of Object.entries(e)){const e=i[Number(t)%i.length];for(const t of n)a(t,e)}}();if("selection"===t){switch(document.querySelector(".sel-by.is-active").id){case"selBySyllable":case"selByBBox":t="syllable";break;case"selByColumn":t="column";break;case"selByStaff":t="staff";break;case"selByLayerElement":t="layerElement";break;case"selByNeume":default:t="neume"}return void e(t)}let n;n="layerElement"==t?document.querySelectorAll(".accid, .clef, .custos, .divLine"):document.getElementsByClassName(t),document.querySelectorAll(".nc, .custos, .clef, .accid, .divLine").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width","30px")});for(let e=0;e{e.classList.add("highlighted")})}const r=n[e].querySelectorAll(".divLine");if(r)for(let e=0;e=0;s--)o=0===s?"":",",t.push({obj:i[s],prefix:o});t.push({val:"["})}else{for(c in a=[],i)i.hasOwnProperty(c)&&a.push(c);for(t.push({val:"}"}),s=a.length-1;s>=0;s--)u=i[l=a[s]],d=s>0?",":"",d+=JSON.stringify(l)+":",t.push({obj:u,prefix:d});t.push({val:"{"})}return h},t.parse=function(e){for(var t,n,r,s,o,a,c,l,u,d=[],h=[],f=0;;)if("}"!==(t=e[f++])&&"]"!==t&&void 0!==t)switch(t){case" ":case"\t":case"\n":case":":case",":break;case"n":f+=3,i(null,d,h);break;case"t":f+=3,i(!0,d,h);break;case"f":f+=4,i(!1,d,h);break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"-":for(n="",f--;;){if(r=e[f++],!/[\d\.\-e\+]/.test(r)){f--;break}n+=r}i(parseFloat(n),d,h);break;case'"':for(s="",o=void 0,a=0;'"'!==(c=e[f++])||"\\"===o&&a%2==1;)s+=c,"\\"===(o=c)?a++:a=0;i(JSON.parse('"'+s+'"'),d,h);break;case"[":l={element:[],index:d.length},d.push(l.element),h.push(l);break;case"{":u={element:{},index:d.length},d.push(u.element),h.push(u);break;default:throw new Error("unexpectedly reached end of input: "+t)}else{if(1===d.length)return d.pop();i(d.pop(),d,h)}}},function(e,t,n){"use strict";var i=n(20),r=n(10);t.a=function(e,t,n){var s=(e=e||{}).random||(e.rng||i.a)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t){n=n||0;for(var o=0;o<16;++o)t[n+o]=s[o];return t}return Object(r.a)(s)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(7),r=n(15),s=n(5),o=n(4);t.default=class{constructor(e,t){this.dragStartCoords=[-1,-1],this.neonView=e,this.selector=t}dragInit(){const e=i.drag().on("start",function(){this.dragStartCoords=[i.event.x,i.event.y],this.dx=0,this.dy=0,i.event.sourceEvent.target.classList.contains("staff")&&i.select(this.selector).call(e)}.bind(this)).on("drag",this.dragging.bind(this)).on("end",this.dragEnded.bind(this));i.selectAll(".selected").call(e);let t=Array.from(document.querySelectorAll(".selected"));this.noMovePrecedes=t.filter(e=>e.classList.contains("no-moving")&&e.hasAttribute("mei:precedes")),t=t.filter(e=>!e.classList.contains("no-moving")),this.selection=t.concat(Array.from(document.querySelectorAll(".resizePoint")))}dragging(){this.dx=i.event.x-this.dragStartCoords[0],this.dy=i.event.y-this.dragStartCoords[1],this.moveElements(this.selection,this.dx,this.dy);if(0===this.selection.filter(e=>e.classList.contains("syl")).length&&0===this.noMovePrecedes.length){const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));this.moveElements(e,-this.dx,-this.dy)}}dragEnded(){const e=Math.abs(this.dx),t=Math.abs(this.dy);if(e<=5&&t<=5)return this.reset(),void this.dragInit();const n=this.selection.filter(e=>!e.classList.contains("resizePoint"));if(this.isCursorOutOfBounds()||this.isDragOutOfBounds(n)){this.returnElements(this.selection);const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));return this.returnElements(e),this.reset(),this.dragInit(),(0,s.queueNotification)("[FAIL] Glyphs were placed out of bounds! Drag action failed.","error")}const i=[];n.forEach(e=>{const t={action:"drag",param:{elementId:"rect"===e.tagName?e.closest(".syl").id:e.id,x:this.dx,y:-this.dy}};i.push(t)});const r={action:"chain",param:i};this.neonView.edit(r,this.neonView.view.getCurrentPageURI()).then(async()=>{const e=Array.from(document.querySelectorAll(".selected")).filter(e=>!e.classList.contains("no-moving")).map(e=>e.id);await this.neonView.updateForCurrentPage(),this.endOptionsSelection(),this.reset(),await this.reselect(e),this.dragInit()})}async reselect(e){const t=e.map(e=>document.querySelector("#"+e));t.filter(e=>!e.classList.contains("syl")).forEach(async()=>await(0,o.selectAll)(t,this.neonView,this)),t.filter(e=>e.classList.contains("syl")).forEach(e=>(0,o.selectBBox)(e.querySelector(".sylTextRect-display"),this,this.neonView)),t.filter(e=>e.classList.contains("staff")).forEach(e=>(0,o.selectStaff)(e,this))}resetTo(e){this.resetToAction=e}reset(){void 0!==this.resetToAction&&i.select(this.selector).call(this.resetToAction)}endOptionsSelection(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden"))}moveElements(e,t,n){e.filter(e=>null!==e).forEach(e=>{e.setAttribute("transform",`translate(${t},${n})`)})}returnElements(e){e.filter(e=>null!==e).forEach(e=>{e.removeAttribute("transform")})}isCursorOutOfBounds(){const e=this.dragStartCoords[0]+this.dx,t=this.dragStartCoords[1]+this.dy;return(0,r.isOutOfSVGBounds)(e,t)}isDragOutOfBounds(e){let t=document.querySelector("#displayBBox").checked?"use, rect":"use";e[0].classList.contains("staff")&&(t="path");const n=e.reduce((e,n)=>e.concat(...n.querySelectorAll(t)),[]).map(r.getGlyphBBox).reduce((e,t)=>({ulx:Math.min(e.ulx,t.ulx),uly:Math.min(e.uly,t.uly),lrx:Math.max(e.lrx,t.lrx),lry:Math.max(e.lry,t.lry)}),{ulx:Number.MAX_VALUE,uly:Number.MAX_VALUE,lrx:Number.MIN_VALUE,lry:Number.MIN_VALUE}),{ulx:i,uly:s,lrx:o,lry:a}=n;return(0,r.isOutOfSVGBounds)(i+this.dx,s+this.dy)||(0,r.isOutOfSVGBounds)(o+this.dx,a+this.dy)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initGroupingListeners=t.endGroupingSelection=t.triggerGrouping=t.mergeStaves=t.isLinkable=t.canBeLinked=t.isLinked=t.isGroupable=t.initNeonView=void 0;const i=n(8),r=n(34),s=n(5),o=n(4),a=n(14),c=n(14);let l;function u(e,t){if(Array.from(t.values()).length<2)return!1;switch(e){case"selByNeume":if(o.sharedLogicalParent(e,t))return!1;default:return!!o.areAdjacent(e,t)}}function d(e,t){switch(t||(t=Array.from(document.querySelectorAll(".selected"))),e){case"selBySyllable":for(const e of t)if(e.hasAttribute("mei:follows")||e.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNeume":for(const e of t)if(e.parentElement.hasAttribute("mei:follows")||e.parentElement.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNc":for(const e of t)if(e.parentElement.parentElement.hasAttribute("mei:follows")||e.parentElement.parentElement.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1}}function h(e){for(const t of e)if(!t.hasAttribute("mei:precedes")&&!t.hasAttribute("mei:follows"))return!1;return!0}function f(e){e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1});const t=Array.from(document.querySelectorAll(".staff")),n=Array.from(document.querySelectorAll(".syllable"));for(let i=0;i!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));const i=e.filter(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(1!==i.length)return!1;const r=i[0];return 0===e.indexOf(r)||e.indexOf(r)===e.length-1}function g(e,t){return!(t.length<2)&&("selBySyllable"===e&&(function(e){e.sort((e,t)=>e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING?-1:e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING?1:0);for(let t=0;te.id===i&&(r=t,!0));if(!s)return!0;if(!s.hasAttribute("mei:follows"))return!0;if(s.getAttribute("mei:follows")!="#"+n.id)return!0;if(r!==t+1)return!0}if(n.hasAttribute("mei:follows")){const t=n.getAttribute("mei:follows").replace("#",""),i=e.find(e=>e.id===t);if(!i)return!0;if(!i.hasAttribute("mei:precedes"))return!0;if(i.getAttribute("mei:precedes")!="#"+n.id)return!0}return!1}}(t)?(s.queueNotification("The selected syllables include invalid linked syllable(s)!","warning"),!1):!!h(t)||!!f(t)))}function p(){const e=document.querySelectorAll(".staff.selected"),t=[];e.forEach(e=>{t.push(e.id)});const n={action:"merge",param:{elementIds:t}};l.edit(n,l.view.getCurrentPageURI()).then(e=>{e?(s.queueNotification("Staff Merged","success"),a.endOptionsSelection(),l.updateForCurrentPage()):s.queueNotification("Merge Failed","error")})}function m(){const e=document.getElementById("moreEdit");e.innerHTML="",e.parentElement.classList.add("hidden"),document.body.removeEventListener("keydown",c.deleteButtonHandler),document.body.removeEventListener("keydown",y)}function v(){const e=document.getElementById("delete");e.removeEventListener("click",c.removeHandler),e.addEventListener("click",c.removeHandler),document.body.addEventListener("keydown",c.deleteButtonHandler),document.body.addEventListener("keydown",y);try{document.getElementById("mergeSyls").addEventListener("click",()=>{if(d(o.getSelectionType()))return;b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNeumes").addEventListener("click",()=>{if(d(o.getSelectionType()))return;b("group","neume",E().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNcs").addEventListener("click",()=>{b("group","nc",E().filter(e=>document.getElementById(e).classList.contains("nc")))})}catch(e){}try{document.getElementById("ungroupNeumes").addEventListener("click",()=>{b("ungroup","neume",S())})}catch(e){}try{document.getElementById("ungroupNcs").addEventListener("click",()=>{b("ungroup","nc",S())})}catch(e){}try{document.getElementById("toggle-ligature").addEventListener("click",async()=>{const e={action:"toggleLigature",param:{elementIds:E()}};l.edit(e,l.view.getCurrentPageURI()).then(e=>{e?s.queueNotification("Ligature Toggled","success"):s.queueNotification("Ligature Toggle Failed","error"),m(),l.updateForCurrentPage()})})}catch(e){}try{document.getElementById("toggle-link").addEventListener("click",()=>{_()})}catch(e){}}t.initNeonView=function(e){l=e},t.isGroupable=u,t.isLinked=h,t.canBeLinked=f,t.isLinkable=g,t.mergeStaves=p,t.triggerGrouping=function(e){const t=document.getElementById("moreEdit");t.parentElement.classList.remove("hidden"),t.innerHTML+=i.groupingMenu[e],v()},t.endGroupingSelection=m,t.initGroupingListeners=v;const y=function(e){if("g"===e.key){const e=Array.from(document.querySelectorAll(".selected"));if(0==e.length)return;const t=o.getSelectionType();if(d(t,e))return;switch(t){case"selBySyllable":if(g(t,e))_();else if(u(t,e)){b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))}else if(1===e.length){b("ungroup","neume",S())}break;case"selByNeume":if(u(t,e)){b("group","neume",E())}else{b("ungroup","nc",S())}break;case"selByNc":if(u(t,e)){b("group","nc",E())}else{b("ungroup","nc",S())}break;case"selByStaff":u(t,e)?p():a.triggerStaffSplitMode();break;default:return void console.error(`Can't perform grouping/ungrouping action on selection type ${t}.`)}}};function b(e,t,n){const i={action:e,param:{groupType:t,elementIds:n}};l.edit(i,l.view.getCurrentPageURI()).then(i=>{if(i?"group"===e?s.queueNotification("Grouping Success","success"):s.queueNotification("Ungrouping Success","success"):"group"===e?s.queueNotification("Grouping Failed","error"):s.queueNotification("Ungrouping Failed","error"),l.updateForCurrentPage(),"nc"===t){const e=document.getElementById(n[0]).parentElement,t=Array.from(e.children);void 0===l.info.getContour(t)&&r.groupingNotRecognized()}m()})}function w(e){const t=document.getElementById(e);return t instanceof SVGGraphicsElement?t:null}function _(){const e=E(),t={action:"chain",param:[]},n=new Array,i=e.map(w).filter(e=>null!==e);if(h(i))n.push(...function(e){const t=new Array;for(const n of e){const e=document.getElementById(n);e.getAttribute("mei:precedes")&&t.push({action:"set",param:{elementId:n,attrType:"precedes",attrValue:""}}),e.getAttribute("mei:follows")&&(t.push({action:"set",param:{elementId:n,attrType:"follows",attrValue:""}}),t.push({action:"setText",param:{elementId:n,text:""}}))}return t}(e));else{const[e,t]=function(e){if(e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}),2===e.length)return[e[0],e[1]];const t=e.find(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(t){const n=e.indexOf(t);if(0===n)return[e[n],e[n+1]];if(n===e.length-1)return[e[n-1],e[n]]}}(i);console.log(e.id,t.id),n.push({action:"set",param:{elementId:e.id,attrType:"precedes",attrValue:"#"+t.id}}),n.push({action:"set",param:{elementId:t.id,attrType:"follows",attrValue:"#"+e.id}});const r=t.querySelector(".syl");null!==r&&n.push({action:"remove",param:{elementId:r.id}})}t.param=n,l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.queueNotification("Toggled Syllable Link","success"):s.queueNotification("Failed to Toggle Syllable Link","error"),m(),l.updateForCurrentPage()})}function E(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push(t.id)}),e}function S(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{if(t.classList.contains("divLine")||t.classList.contains("accid")||t.classList.contains("clef"))return;Array.from(t.children).forEach(t=>{e.push(t.id)})}),e}},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateErrorLogVisibility=t.initDisplayListener=t.initErrorLogControls=t.initErrorLog=t.recordNotification=void 0;const i=n(8),r=n(3),s=n(13);function o(e){const t=document.createElement("div");t.classList.add("notification-container"),t.innerHTML=`\n \n\n \n
\n
\n
\n\n
\n
\n
\n
\n `;const n=t.querySelector(".log-remove");if(n.onclick=()=>t.remove(),n.addEventListener("mouseover",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-open.svg")}),n.addEventListener("mouseout",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-closed.svg")}),e.logInfo){const i=t.querySelector(".notif-log-info-icon");i.style.display="",n.style.height="20px",i.addEventListener("mouseover",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-dark.svg")}),i.addEventListener("mouseout",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-light.svg")}),i.addEventListener("click",()=>function(e){const t=new s.ModalWindow;t.setModalWindowView(s.ModalWindowView.ERROR_LOG,e),t.openModalWindow()}(e.logInfo))}return t}function a(){const e=document.querySelector("#error_log"),t=document.querySelector("#errorLogHeading"),n=t.querySelector("svg > use"),i=document.querySelector("#errorLogContents"),{displayErrLog:s}=(0,r.getSettings)();s&&e.classList.add("visible"),t.addEventListener("click",e=>{e.stopPropagation(),i.classList.contains("closed")?(i.classList.remove("closed"),i.style.padding="0.5em 0.75em",setTimeout(()=>{i.style.overflow="visible"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(i.classList.add("closed"),i.style.overflow="hidden",setTimeout(()=>{i.style.padding="0px"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))}),c()}function c(){const e=document.querySelector("#display-single-container"),t=document.createElement("label"),n=document.createElement("input");n.classList.add("checkbox"),t.classList.add("checkbox-container","side-panel-btn"),t.textContent="Errors",n.id="display-errors",n.type="checkbox",n.checked=!1,t.appendChild(n),e.append(t);const{displayErrLog:i}=(0,r.getSettings)();n.checked=i,n.addEventListener("click",()=>{(0,r.setSettings)({displayErrLog:n.checked}),l()})}function l(){const e=document.querySelector("#error_log"),{debugMode:t,displayErrLog:n,displayInfo:i,displayBBox:s,displayText:o}=(0,r.getSettings)(),a=document.getElementById("display-all-btn");t?n?(e.classList.add("visible"),i&&s&&o&&n&&(a.classList.add("selected"),a.innerHTML="Hide All")):(e.classList.remove("visible"),a.classList.contains("selected")&&(a.classList.remove("selected"),a.innerHTML="Display All")):(e.classList.remove("visible"),i&&s&&o?(a.classList.add("selected"),a.innerHTML="Hide All"):(a.classList.remove("selected"),a.innerHTML="Display All"))}t.recordNotification=function(e){document.querySelector("#errorLogContents").prepend(o(e))},t.initErrorLog=function(){document.querySelector("#error_log").innerHTML=i.errorLogsPanelContents,a()},t.initErrorLogControls=a,t.initDisplayListener=c,t.updateErrorLogVisibility=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.resize=void 0;const i=n(4),r=n(7),s=n(15),o=n(5),a=n(3),c={TopLeft:0,Top:1,TopRight:2,Right:3,BottomRight:4,Bottom:5,BottomLeft:6,Left:7};function l(e,t,n,i,r){let s;if(r>=0)s=[{x:e,y:t,name:c.TopLeft},{x:(e+n)/2,y:t+(n-e)/2*Math.sin(r),name:c.Top},{x:n,y:t+(n-e)*Math.sin(r),name:c.TopRight},{x:n,y:(t+i+(n-e)*Math.sin(r))/2,name:c.Right},{x:n,y:i,name:c.BottomRight},{x:(e+n)/2,y:i-(n-e)/2*Math.sin(r),name:c.Bottom},{x:e,y:i-(n-e)*Math.sin(r),name:c.BottomLeft},{x:e,y:(t+i-(n-e)*Math.sin(r))/2,name:c.Left}];else{const o=(n-e)*Math.tan(Math.abs(r)),a=i-t-o;s=[{x:e,y:t+o,name:c.TopLeft},{x:(e+n)/2,y:t+o/2,name:c.Top},{x:n,y:t,name:c.TopRight},{x:n,y:t+a/2,name:c.Right},{x:n,y:t+a,name:c.BottomRight},{x:(e+n)/2,y:i-o/2,name:c.Bottom},{x:e,y:i,name:c.BottomLeft},{x:e,y:i-a/2,name:c.Left}]}return s}t.resize=function(e,t,n){let u,d,h,f,g,p,m,v,y,b,w,_,E,S,x;function L(){const e=l(u,d,h,f,g),t=e.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");document.querySelector("#resizeRect").setAttribute("points",t);const n=document.querySelector(".syl.selected > .sylTextRect-display");n&&(n.setAttribute("x",String(Math.min(u,h))),n.setAttribute("y",String(Math.min(d,f))),n.setAttribute("width",String(Math.abs(h-u))),n.setAttribute("height",String(Math.abs(f-d))));for(const t in c){const n=e[c[t]];r.select("#p-"+t).filter(".resizePoint").attr("cx",n.x).attr("cy",n.y)}let i=e[3].x,s=e[3].y;const o=i+100+","+(s+85)+" "+(i+70)+","+(s+50)+" "+(i+100)+","+(s+15)+" "+(i+130)+","+(s+50);i=e[7].x,s=e[7].y;const a=i-100+","+(s-15)+" "+(i-130)+","+(s-50)+" "+(i-100)+","+(s-85)+" "+(i-70)+","+(s-50);r.select("#rotateLeft").attr("points",a),r.select("#rotateRight").attr("points",o)}!function A(){if(null===e)return;if(r.selectAll(".resizePoint").remove(),r.selectAll("#resizeRect").remove(),r.selectAll(".rotatePoint").remove(),e.classList.contains("syl")){const t=e.querySelector(".sylTextRect-display");if(null===t)return void console.warn("Tried to draw resize rect for a sylTextRect that doesn't exist (or isn't displaying)");u=Number(t.getAttribute("x")),d=Number(t.getAttribute("y")),h=+u+ +t.getAttribute("width"),f=+d+ +t.getAttribute("height"),g=0}if(e.classList.contains("staff")){const t=(0,i.getStaffBBox)(e);u=t.ulx,d=t.uly,h=t.lrx,f=t.lry;const n=e.querySelector("path").getAttribute("d").match(/\d+/g).map(e=>Number(e));g=Math.atan((n[3]-n[1])/(n[2]-n[0]))}let k;p=u,y=d,m=h,b=f;const C=l(u,d,h,f,g);E=C[2].x-C[0].x;const I=C.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");r.select("#"+e.id).append("polygon").attr("points",I).attr("id","resizeRect").attr("stroke","black").attr("stroke-width",10).attr("fill","none").style("cursor","move").style("stroke-dasharray","20 10");const{circleSize:P}=(0,a.getSettings)();for(const t in c){const n=C[c[t]];r.select(e.viewportElement).append("circle").attr("cx",n.x).attr("cy",n.y).attr("r",P).attr("stroke","black").attr("stroke-width",4).attr("fill","#0099ff").attr("class","resizePoint").attr("id","p-"+t)}for(const e in c)r.select("#p-"+e).filter(".resizePoint").call(r.drag().on("start",()=>{O(e)}).on("drag",B).on("end",T.bind(this)));if(e.classList.contains("staff")){let t=C[3].x,n=C[3].y;const i=t+100+","+(n+85)+" "+(t+70)+","+(n+50)+" "+(t+100)+","+(n+15)+" "+(t+130)+","+(n+50);t=C[7].x,n=C[7].y;const s=t-100+","+(n-15)+" "+(t-130)+","+(n-50)+" "+(t-100)+","+(n-85)+" "+(t-70)+","+(n-50);r.select("#"+e.id).append("polygon").attr("points",i).attr("id","rotateRight").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#"+e.id).append("polygon").attr("points",s).attr("id","rotateLeft").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#rotateLeft").call(r.drag().on("start",N).on("drag",(function(){const e=r.mouse(this)[1]-w,t=x-Math.atan(e/E);t>-.2&&t<.2&&(S=e,d=_+S,g=t,g>=0?(d=S+C.filter(e=>e.name===c.TopLeft)[0].y,f=C.filter(e=>e.name===c.BottomRight)[0].y):(d=C.filter(e=>e.name===c.TopRight)[0].y,f=S+C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M)),r.select("#rotateRight").call(r.drag().on("start",N).on("drag",(function(){const e=r.mouse(this)[1]-w,t=x+Math.atan(e/E);t>-.2&&t<.2&&(S=e,g=t,g>=0?(f=S+C.filter(e=>e.name===c.BottomRight)[0].y,d=C.filter(e=>e.name===c.TopLeft)[0].y):(d=S+C.filter(e=>e.name===c.TopRight)[0].y,f=C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M))}function O(e){k=e;const t=C.find(t=>t.name===c[e]);v=[t.x,t.y],y=d,b=f}function B(){const e=r.mouse(this);switch(c[k]){case c.TopLeft:u=e[0],d=e[1];break;case c.Top:d=e[1]-(h-u)*Math.tan(g)/2;break;case c.TopRight:h=e[0],d=e[1]-(h-u)*Math.tan(g);break;case c.Right:h=e[0],f=b+(e[0]-v[0])*Math.tan(g);break;case c.BottomRight:h=e[0],f=e[1];break;case c.Bottom:f=e[1]+(h-u)*Math.tan(g)/2;break;case c.BottomLeft:u=e[0],f=e[1]+(h-u)*Math.tan(g);break;case c.Left:u=e[0],d=y+(e[0]-v[0])*Math.tan(g);break;default:console.error("Something that wasn't a side of the rectangle was dragged. This shouldn't happen.")}L()}function T(){if((0,s.isOutOfSVGBounds)(u,d)||(0,s.isOutOfSVGBounds)(h,f))return u=p,d=y,h=m,f=b,L(),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Resize action failed.","error");const r={action:"resize",param:{elementId:e.id,ulx:u,uly:d,lrx:h,lry:f}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{if(r&&await t.updateForCurrentPage(),e=document.querySelector("#"+e.id),u=void 0,d=void 0,h=void 0,f=void 0,A(),e.classList.contains("syl"))(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this);else{(0,i.selectAll)([document.querySelector("#"+e.id)],t,n);const r=document.querySelector("moreEdit");r&&(r.innerHTML="",r.parentElement.classList.add("hidden"))}})}function N(){const e=r.event.sourceEvent.target.id;w=r.mouse(this)[1],b=f,y=d,_="rotateRight"===e?f:d,x=g}function M(){if(void 0===S&&(S=0),(0,s.isOutOfSVGBounds)(u,d)||(0,s.isOutOfSVGBounds)(h,f))return document.querySelectorAll(".resizePoint").forEach(e=>e.remove()),document.querySelectorAll("#resizeRect").forEach(e=>e.remove()),document.querySelectorAll(".rotatePoint").forEach(e=>e.remove()),e=document.getElementById(e.id),u=void 0,d=void 0,h=void 0,f=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Rotate action failed.","error");const r={action:"resizeRotate",param:{elementId:e.id,ulx:u,uly:d,lrx:h,lry:f,rotate:180*g/Math.PI}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{r&&await t.updateForCurrentPage(),e=document.getElementById(e.id),u=void 0,d=void 0,h=void 0,f=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n)})}}()}},function(e,t,n){"use strict";n.r(t),function(e){var i,r,s=n(2),o=n.n(s),a=n(22),c=n(16),l=n.n(c),u=n(21),d=n.n(u),h=n(6),f=n.n(h),g=n(1),p=n.n(g),m=n(0),v=n.n(m);function y(e){return"$"+e}function b(e){return e.substring(1)}function w(){this._store={}}function _(e){if(this._store=new w,e&&Array.isArray(e))for(var t=0,n=e.length;tb(e))},w.prototype.delete=function(e){var t=y(e),n=t in this._store;return delete this._store[t],n},w.prototype.forEach=function(e){for(var t=Object.keys(this._store),n=0,i=t.length;n=u.length)){var n=Math.min(d+6,u.length),i=u.slice(d,n);!function(n,i){n.forEach((function(n,r){var o=i+r,a=s.get(n),u=I(a[0],["atts_since","attachments"]);u.open_revs=a.map((function(e){return e.rev})),u.open_revs=u.open_revs.filter(O);var d=O;0===u.open_revs.length&&(delete u.open_revs,d=B),["revs","attachments","binary","ajax","latest"].forEach((function(e){e in t&&(u[e]=t[e])})),e.get(n,u,(function(e,t){var i,r,s;i=e?[{error:e}]:d(t),r=n,s=i,c[o]={id:r,docs:s},l(),h()}))}))}(i,d),d+=i.length}}h()}try{localStorage.setItem("_pouch_check_localstorage",1),P=!!localStorage.getItem("_pouch_check_localstorage")}catch(e){P=!1}function N(){return P}function M(){v.a.call(this),this._listeners={},function(e){N()&&addEventListener("storage",(function(t){e.emit(t.key)}))}(this)}function q(e){if("undefined"!=typeof console&&"function"==typeof console[e]){var t=Array.prototype.slice.call(arguments,1);console[e].apply(console,t)}}function D(e){var t=0;return e||(t=2e3),function(e,t){return e=parseInt(e,10)||0,(t=parseInt(t,10))!=t||t<=e?t=(e||1)<<1:t+=1,t>6e5&&(e=3e5,t=6e5),~~((t-e)*Math.random()+e)}(e,t)}function F(e,t){q("info","The above "+e+" is totally normal. "+t)}p()(M,v.a),M.prototype.addListener=function(e,t,n,i){if(!this._listeners[t]){var r=this,s=!1;this._listeners[t]=a,this.on(e,a)}function a(){if(r._listeners[t])if(s)s="waiting";else{s=!0;var e=I(i,["style","include_docs","attachments","conflicts","filter","doc_ids","view","since","query_params","binary","return_docs"]);n.changes(e).on("change",(function(e){e.seq>i.since&&!i.cancelled&&(i.since=e.seq,i.onChange(e))})).on("complete",(function(){"waiting"===s&&o()(a),s=!1})).on("error",(function(){s=!1}))}}},M.prototype.removeListener=function(e,t){t in this._listeners&&(v.a.prototype.removeListener.call(this,e,this._listeners[t]),delete this._listeners[t])},M.prototype.notifyLocalWindows=function(e){N()&&(localStorage[e]="a"===localStorage[e]?"b":"a")},M.prototype.notify=function(e){this.emit(e),this.notifyLocalWindows(e)};var j="function"==typeof Object.assign?Object.assign:function(e){for(var t=Object(e),n=1;n0||i0||i>>1],t)<0?r=i+1:s=i;return r}(e,t,n);e.splice(i,0,t)}function Re(e,t){for(var n,i,r=t,s=e.length;r0;){var r=n.pop(),s=r.tree1,o=r.tree2;(s[1].status||o[1].status)&&(s[1].status="available"===s[1].status||"available"===o[1].status?"available":"missing");for(var a=0;a0;){var p=g.pop();if(0!==p.diff)for(var m=p.ids[2],v=0,y=m.length;vt){n||(n={});var u=l.length-t;a={pos:c.pos+u,ids:Re(l,u)};for(var d=0;d0&&i.emit("error",t)):i.emit("complete",n),i.removeAllListeners(),e.removeListener("destroyed",s)}));function s(){i.cancel()}n&&(i.on("complete",(function(e){n(null,e)})),i.on("error",n)),e.once("destroyed",s),t.onChange=function(e,t,n){i.isCancelled||function(e,t,n,i){try{e.emit("change",t,n,i)}catch(e){q("error",'Error in .on("change", function):',e)}}(i,e,t,n)};var o=new Promise((function(e,n){t.complete=function(t,i){t?n(t):e(i)}}));i.once("cancel",(function(){e.removeListener("destroyed",s),t.complete(null,{status:"cancelled"})})),this.then=o.then.bind(o),this.catch=o.catch.bind(o),this.then((function(e){r(null,e)}),r),e.taskqueue.isReady?i.validateChanges(t):e.taskqueue.addTask((function(e){e?t.complete(e):i.isCancelled?i.emit("cancel"):i.validateChanges(t)}))}function Ke(e,t,n){var i=[{rev:e._rev}];"all_docs"===n.style&&(i=Me(t.rev_tree).map((function(e){return{rev:e.rev}})));var r={id:t.id,changes:i,doc:e};return Ze(t,e._rev)&&(r.deleted=!0),n.conflicts&&(r.doc._conflicts=qe(t),r.doc._conflicts.length||delete r.doc._conflicts),r}function Ye(e,t){return et?1:0}function Xe(e,t){return function(n,i){n||i[0]&&i[0].error?((n=n||i[0]).docId=t,e(n)):e(null,i.length?i[0]:i)}}function Je(e,t){var n=Ye(e._id,t._id);return 0!==n?n:Ye(e._revisions?e._revisions.start:0,t._revisions?t._revisions.start:0)}function Qe(){for(var e in v.a.call(this),Qe.prototype)"function"==typeof this[e]&&(this[e]=this[e].bind(this))}function et(){this.isReady=!1,this.failed=!1,this.queue=[]}function tt(e,t){if(!(this instanceof tt))return new tt(e,t);var n=this;if(t=t||{},e&&"object"==typeof e&&(e=(t=e).name,delete t.name),void 0===t.deterministic_revs&&(t.deterministic_revs=!0),this.__opts=t=L(t),n.auto_compaction=t.auto_compaction,n.prefix=tt.prefix,"string"!=typeof e)throw new Error("Missing/invalid DB name");var i=function(e,t){var n=e.match(/([a-z-]*):\/\/(.*)/);if(n)return{name:/https?/.test(n[1])?n[1]+"://"+n[2]:n[2],adapter:n[1]};var i=tt.adapters,r=tt.preferredAdapters,s=tt.prefix,o=t.adapter;if(!o)for(var a=0;at&&a.push(e)})),Te(s,(function(e,t,n,i,r){var s=t+"-"+n;"available"===r.status&&-1!==a.indexOf(s)&&c.push(s)})),i._doCompaction(e,c,n)}))})),Qe.prototype.compact=C("compact",(function(e,t){"function"==typeof e&&(t=e,e={});e=e||{},this._compactionQueue=this._compactionQueue||[],this._compactionQueue.push({opts:e,callback:t}),1===this._compactionQueue.length&&function e(t){var n=t._compactionQueue[0],i=n.opts,r=n.callback;t.get("_local/compaction").catch((function(){return!1})).then((function(n){n&&n.last_seq&&(i.last_seq=n.last_seq),t._compact(i,(function(n,i){n?r(n):r(null,i),o()((function(){t._compactionQueue.shift(),t._compactionQueue.length&&e(t)}))}))}))}(this)})),Qe.prototype._compact=function(e,t){var n=this,i={return_docs:!1,last_seq:e.last_seq||0},r=[];n.changes(i).on("change",(function(e){r.push(n.compactDocument(e.id,0))})).on("complete",(function(e){var i=e.last_seq;Promise.all(r).then((function(){return pe(n,"_local/compaction",(function(e){return(!e.last_seq||e.last_seq0?e.keys.slice(e.skip):e.keys;e.keys=t,e.skip=0,delete e.limit,e.descending&&(t.reverse(),e.descending=!1)}(e),0===e.keys.length))return this._allDocs({limit:0},t)}return this._allDocs(e,t)})),Qe.prototype.changes=function(e,t){return"function"==typeof e&&(t=e,e={}),(e=e||{}).return_docs="return_docs"in e?e.return_docs:!e.live,new We(this,e,t)},Qe.prototype.close=C("close",(function(e){return this._closed=!0,this.emit("closed"),this._close(e)})),Qe.prototype.info=C("info",(function(e){var t=this;this._info((function(n,i){if(n)return e(n);i.db_name=i.db_name||t.name,i.auto_compaction=!(!t.auto_compaction||ae(t)),i.adapter=t.adapter,e(null,i)}))})),Qe.prototype.id=C("id",(function(e){return this._id(e)})),Qe.prototype.type=function(){return"function"==typeof this._type?this._type():this.adapter},Qe.prototype.bulkDocs=C("bulkDocs",(function(e,t,n){if("function"==typeof t&&(n=t,t={}),t=t||{},Array.isArray(e)&&(e={docs:e}),!e||!e.docs||!Array.isArray(e.docs))return n(ne(V));for(var i=0;i1?t.set(e.name,n):t.delete(e.name))}})),e.on("destroyed",(function(e){if(t.has(e)){var n=t.get(e);t.delete(e),n.forEach((function(e){e.emit("destroyed",!0)}))}}))}(tt),tt.adapter=function(e,t,n){t.valid()&&(tt.adapters[e]=t,n&&tt.preferredAdapters.push(e))},tt.plugin=function(e){if("function"==typeof e)e(tt);else{if("object"!=typeof e||0===Object.keys(e).length)throw new Error('Invalid plugin: got "'+e+'", expected an object or a function');Object.keys(e).forEach((function(t){tt.prototype[t]=e[t]}))}return this.__defaults&&(tt.__defaults=j({},this.__defaults)),tt},tt.defaults=function(e){function t(e,n){if(!(this instanceof t))return new t(e,n);n=n||{},e&&"object"==typeof e&&(e=(n=e).name,delete n.name),n=j({},t.__defaults,n),tt.call(this,e,n)}return p()(t,tt),t.preferredAdapters=tt.preferredAdapters.slice(),Object.keys(tt).forEach((function(e){e in t||(t[e]=tt[e])})),t.__defaults=j({},this.__defaults,e),t},tt.fetch=function(e,t){return it(e,t)};function ot(e,t){for(var n=e,i=0,r=t.length;i0&&"\\"===e[i-1]&&("$"===s||"."===s)?n=n.substring(0,n.length-1)+s:"."===s?(t.push(n),n=""):n+=s}return t.push(n),t}var ct=["$or","$nor","$not"];function lt(e){return ct.indexOf(e)>-1}function ut(e){return Object.keys(e)[0]}function dt(e){var t={},n={$or:!0,$nor:!0};return e.forEach((function(e){Object.keys(e).forEach((function(i){var r=e[i];if("object"!=typeof r&&(r={$eq:r}),lt(i))if(r instanceof Array){if(n[i])return n[i]=!1,void(t[i]=r);var s=[];t[i].forEach((function(e){Object.keys(r).forEach((function(t){var n=r[t],i=Math.max(Object.keys(e).length,Object.keys(n).length),o=dt([e,n]);Object.keys(o).length<=i||s.push(o)}))})),t[i]=s}else t[i]=dt([r]);else{var o=t[i]=t[i]||{};Object.keys(r).forEach((function(e){var t=r[e];return"$gt"===e||"$gte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$gte?"$gte"===e?t>n.$gte&&(n.$gte=t):t>=n.$gte&&(delete n.$gte,n.$gt=t):void 0!==n.$gt?"$gte"===e?t>n.$gt&&(delete n.$gt,n.$gte=t):t>n.$gt&&(n.$gt=t):n[e]=t}(e,t,o):"$lt"===e||"$lte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$lte?"$lte"===e?tt?1:-1}(e,t)}return Array.isArray(e)?function(e,t){for(var n=Math.min(e.length,t.length),i=0;it.length?1:-1}(e,t):function(e,t){for(var n=Object.keys(e),i=Object.keys(t),r=Math.min(n.length,i.length),s=0;si.length?1:-1}(e,t)}function gt(e){switch(typeof e){case"undefined":return null;case"number":return e===1/0||e===-1/0||isNaN(e)?null:e;case"object":var t=e;if(Array.isArray(e)){var n=e.length;e=new Array(n);for(var i=0;ir?1:0)}}(t.sort);e=e.sort(i),"string"!=typeof t.sort[0]&&"desc"===(r=t.sort[0])[ut(r)]&&(e=e.reverse())}var r;if("limit"in t||"skip"in t){var s=t.skip||0,o=("limit"in t?t.limit:e.length)+s;e=e.slice(s,o)}return e}function _t(e,t,n){return n.every((function(n){var i=t[n],r=at(n),s=ot(e,r);return lt(n)?function(e,t,n){if("$or"===e)return t.some((function(e){return _t(n,e,Object.keys(e))}));if("$not"===e)return!_t(n,t,Object.keys(t));return!t.find((function(e){return _t(n,e,Object.keys(e))}))}(n,i,e):Et(i,e,r,s)}))}function Et(e,t,n,i){return!e||("object"==typeof e?Object.keys(e).every((function(r){var s=e[r];if(0===r.indexOf("$"))return St(r,t,s,n,i);var o=at(r);if(void 0===i&&"object"!=typeof s&&o.length>0)return!1;var a=ot(i,o);return"object"==typeof s?Et(s,t,n,a):St("$eq",t,s,o,a)})):e===i)}function St(e,t,n,i,r){if(!kt[e])throw new Error('unknown operator "'+e+'" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, $nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');return kt[e](t,n,i,r)}function xt(e){return null!=e}function Lt(e){return void 0!==e}function At(e,t){return t.some((function(t){return e instanceof Array?e.some((function(e){return 0===ft(t,e)})):0===ft(t,e)}))}var kt={$elemMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.some((function(e){return _t(e,t,Object.keys(t))})):i.some((function(i){return Et(t,e,n,i)}))))},$allMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.every((function(e){return _t(e,t,Object.keys(t))})):i.every((function(i){return Et(t,e,n,i)}))))},$eq:function(e,t,n,i){return Lt(i)&&0===ft(i,t)},$gte:function(e,t,n,i){return Lt(i)&&ft(i,t)>=0},$gt:function(e,t,n,i){return Lt(i)&&ft(i,t)>0},$lte:function(e,t,n,i){return Lt(i)&&ft(i,t)<=0},$lt:function(e,t,n,i){return Lt(i)&&ft(i,t)<0},$exists:function(e,t,n,i){return t?Lt(i):!Lt(i)},$mod:function(e,t,n,i){return xt(i)&&function(e,t){return"number"==typeof e&&parseInt(e,10)===e&&e%t[0]===t[1]}(i,t)},$ne:function(e,t,n,i){return t.every((function(e){return 0!==ft(i,e)}))},$in:function(e,t,n,i){return xt(i)&&At(i,t)},$nin:function(e,t,n,i){return xt(i)&&!At(i,t)},$size:function(e,t,n,i){return xt(i)&&Array.isArray(i)&&function(e,t){return e.length===t}(i,t)},$all:function(e,t,n,i){return Array.isArray(i)&&function(e,t){return t.every((function(t){return e.some((function(e){return 0===ft(t,e)}))}))}(i,t)},$regex:function(e,t,n,i){return xt(i)&&"string"==typeof i&&t.every((function(e){return function(e,t){return new RegExp(t).test(e)}(i,e)}))},$type:function(e,t,n,i){return function(e,t){switch(t){case"null":return null===e;case"boolean":return"boolean"==typeof e;case"number":return"number"==typeof e;case"string":return"string"==typeof e;case"array":return e instanceof Array;case"object":return"[object Object]"==={}.toString.call(e)}}(i,t)}};function Ct(e,t){if(e.selector&&e.filter&&"_selector"!==e.filter){var n="string"==typeof e.filter?e.filter:"function";return t(new Error('selector invalid for filter "'+n+'"'))}t()}function It(e){e.view&&!e.filter&&(e.filter="_view"),e.selector&&!e.filter&&(e.filter="_selector"),e.filter&&"string"==typeof e.filter&&("_view"===e.filter?e.view=le(e.view):e.filter=le(e.filter))}function Pt(e,t){return t.filter&&"string"==typeof t.filter&&!t.doc_ids&&!ae(e.db)}function Ot(e,t){var n=t.complete;if("_view"===t.filter){if(!t.view||"string"!=typeof t.view){var i=ne(X,"`view` filter parameter not found or invalid.");return n(i)}var r=ce(t.view);e.db.get("_design/"+r[0],(function(i,s){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var o=s&&s.views&&s.views[r[1]]&&s.views[r[1]].map;if(!o)return n(ne(z,s.views?"missing json key: "+r[1]:"missing json key: views"));t.filter=ge(["return function(doc) {",' "use strict";'," var emitted = false;"," var emit = function (a, b) {"," emitted = true;"," };"," var view = "+o+";"," view(doc);"," if (emitted) {"," return true;"," }","};"].join("\n"),{}),e.doChanges(t)}))}else if(t.selector)t.filter=function(e){return function(e,t){if("object"!=typeof t)throw new Error("Selector error: expected a JSON object");var n=wt([{doc:e}],{selector:t=ht(t)},Object.keys(t));return n&&1===n.length}(e,t.selector)},e.doChanges(t);else{var s=ce(t.filter);e.db.get("_design/"+s[0],(function(i,r){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var o=r&&r.filters&&r.filters[s[1]];if(!o)return n(ne(z,r&&r.filters?"missing json key: "+s[1]:"missing json key: filters"));t.filter=ge('"use strict";\nreturn '+o+";",{}),e.doChanges(t)}))}}function Bt(e){return e.reduce((function(e,t){return e[t]=!0,e}),{})}tt.plugin((function(e){e._changesFilterPlugin={validate:Ct,normalize:It,shouldFilter:Pt,filter:Ot}})),tt.version="7.3.0";var Tt=Bt(["_id","_rev","_access","_attachments","_deleted","_revisions","_revs_info","_conflicts","_deleted_conflicts","_local_seq","_rev_tree","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats","_removed"]),Nt=Bt(["_access","_attachments","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats"]);function Mt(e){if(!/^\d+-/.test(e))return ne(ee);var t=e.indexOf("-"),n=e.substring(0,t),i=e.substring(t+1);return{prefix:parseInt(n,10),id:i}}function qt(e,t,n){var i,r,s;n||(n={deterministic_revs:!0});var o={status:"available"};if(e._deleted&&(o.deleted=!0),t)if(e._id||(e._id=Oe()),r=Pe(e,n.deterministic_revs),e._rev){if((s=Mt(e._rev)).error)return s;e._rev_tree=[{pos:s.prefix,ids:[s.id,{status:"missing"},[[r,o,[]]]]}],i=s.prefix+1}else e._rev_tree=[{pos:1,ids:[r,o,[]]}],i=1;else if(e._revisions&&(e._rev_tree=function(e,t){for(var n=e.start-e.ids.length+1,i=e.ids,r=[i[0],t,[]],s=1,o=i.length;s1&&!n?(a={continue:function(){if(!s.length)return r();var n,a=s[s.length-1];if(t&&t.upper)try{n=IDBKeyRange.bound(a,t.upper,!0,t.upperOpen)}catch(e){if("DataError"===e.name&&0===e.code)return r()}else n=IDBKeyRange.lowerBound(a,!0);t=n,s=null,o=null,e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l}},e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l):n?e.openCursor(t,"prev").onsuccess=u:e.openCursor(t).onsuccess=u}function nn(e,t,n){var i,r,s="startkey"in e&&e.startkey,o="endkey"in e&&e.endkey,a="key"in e&&e.key,c="keys"in e&&e.keys,l=e.skip||0,u="number"==typeof e.limit?e.limit:-1,d=!1!==e.inclusive_end;if(!c&&(r=(i=function(e,t,n,i,r){try{if(e&&t)return r?IDBKeyRange.bound(t,e,!n,!1):IDBKeyRange.bound(e,t,!1,!n);if(e)return r?IDBKeyRange.upperBound(e):IDBKeyRange.lowerBound(e);if(t)return r?IDBKeyRange.lowerBound(t,!n):IDBKeyRange.upperBound(t,!n);if(i)return IDBKeyRange.only(i)}catch(e){return{error:e}}return null}(s,o,d,a,e.descending))&&i.error)&&("DataError"!==r.name||0!==r.code))return n(ne(Q,r.name,r.message));var h=[Vt,"by-sequence",zt];e.attachments&&h.push("attach-store");var f=Jt(t,h,"readonly");if(f.error)return n(f.error);var g=f.txn;g.oncomplete=function(){e.attachments?Yt(E,e.binary).then(A):A()},g.onabort=Ut(n);var p,m,v,y=g.objectStore(Vt),b=g.objectStore("by-sequence"),w=g.objectStore(zt),_=b.index("_doc_id_rev"),E=[];function S(t,n){var i={id:n.id,key:n.id,value:{rev:t}};n.deleted?c&&(E.push(i),i.value.deleted=!0,i.doc=null):l--<=0&&(E.push(i),e.include_docs&&function(t,n,i){var r=t.id+"::"+i;_.get(r).onsuccess=function(i){if(n.doc=Gt(i.target.result)||{},e.conflicts){var r=qe(t);r.length&&(n.doc._conflicts=r)}Kt(n.doc,e,g)}}(n,i,t))}function x(e){for(var t=0,n=e.length;t0&&(m=e.target.result[0])},b.openCursor(null,"prev").onsuccess=function(e){var t=e.target.result,n=void 0;return t&&t.key&&(n=t.key),v({target:{result:[n]}})}),r||0===u?void 0:c?function(e,t,n){var i=new Array(e.length),r=0;e.forEach((function(s,o){t.get(s).onsuccess=function(t){t.target.result?i[o]=t.target.result:i[o]={key:s,error:"not_found"},++r===e.length&&n(e,i,{})}}))}(e.keys,y,L):-1===u?function(e,t,n){if("function"!=typeof e.getAll){var i=[];e.openCursor(t).onsuccess=function(e){var t=e.target.result;t?(i.push(t.value),t.continue()):n({target:{result:i}})}}else e.getAll(t).onsuccess=n}(y,i,(function(t){var n=t.target.result;e.descending&&(n=n.reverse()),x(n)})):void tn(y,i,e.descending,u+l,L)}var rn=!1,sn=[];function on(){!rn&&sn.length&&(rn=!0,sn.shift()())}function an(e,t,n,s){if((e=L(e)).continuous){var o=n+":"+Oe();return Qt.addListener(n,o,t,e),Qt.notify(n),{cancel:function(){Qt.removeListener(n,o)}}}var a=e.doc_ids&&new i(e.doc_ids);e.since=e.since||0;var c=e.since,l="limit"in e?e.limit:-1;0===l&&(l=1);var u,d,h,f,g=[],p=0,m=re(e),v=new r;function y(e,t,n,i){if(n.seq!==t)return i();if(n.winningRev===e._rev)return i(n,e);var r=e._id+"::"+n.winningRev;f.get(r).onsuccess=function(e){i(n,Gt(e.target.result))}}function b(){e.complete(null,{results:g,last_seq:c})}var w=[Vt,"by-sequence"];e.attachments&&w.push("attach-store");var _=Jt(s,w,"readonly");if(_.error)return e.complete(_.error);(u=_.txn).onabort=Ut(e.complete),u.oncomplete=function(){!e.continuous&&e.attachments?Yt(g).then(b):b()},d=u.objectStore("by-sequence"),h=u.objectStore(Vt),f=d.index("_doc_id_rev"),tn(d,e.since&&!e.descending?IDBKeyRange.lowerBound(e.since,!0):null,e.descending,l,(function(t,n,i){if(i&&t.length){var r=new Array(t.length),s=new Array(t.length),o=0;n.forEach((function(n,c){!function(e,t,n){if(a&&!a.has(e._id))return n();var i=v.get(e._id);if(i)return y(e,t,i,n);h.get(e._id).onsuccess=function(r){i=Zt(r.target.result),v.set(e._id,i),y(e,t,i,n)}}(Gt(n),t[c],(function(n,a){s[c]=n,r[c]=a,++o===t.length&&function(){for(var t=[],n=0,o=r.length;nr&&(r=n),t.continue()}}()}function o(){var e=$t(s,s.winningRev,s.deleted);n.put(e).onsuccess=function(){i.continue()}}}}e._meta=null,e._remote=!1,e.type=function(){return"idb"},e._id=k((function(t){t(null,e._meta.instanceId)})),e._bulkDocs=function(n,i,s){en(t,n,i,e,r,a(s))},e._get=function(e,t,n){var i,s,o,a=t.ctx;if(!a){var c=Jt(r,[Vt,"by-sequence","attach-store"],"readonly");if(c.error)return n(c.error);a=c.txn}function l(){n(o,{doc:i,metadata:s,ctx:a})}a.objectStore(Vt).get(e).onsuccess=function(e){if(!(s=Zt(e.target.result)))return o=ne(z,"missing"),l();var n;if(t.rev)n=t.latest?function(e,t){for(var n,i=t.rev_tree.slice();n=i.pop();){var r=n.pos,s=n.ids,o=s[0],a=s[1],c=s[2],l=0===c.length,u=n.history?n.history.slice():[];if(u.push({id:o,pos:r,opts:a}),l)for(var d=0,h=u.length;d=43)},i.onerror=e.onabort=function(e){e.preventDefault(),e.stopPropagation(),t(!1)}})).catch((function(){return!1}))}(u)),cn.then((function(e){c=e,h()})),u.oncomplete=function(){d=!0,h()},u.onabort=Ut(n)},f.onerror=function(e){var t=e.target.error&&e.target.error.message;t?-1!==t.indexOf("stored database is a higher version")&&(t=new Error('This DB was created with the newer "indexeddb" adapter, but you are trying to open it with the older "idb" adapter')):t="Failed to open indexedDB, are you in private browsing mode?",q("error",t),n(ne(Q,t))}}(n,e,t)}),t,n.constructor)}dn.valid=function(){try{return"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(e){return!1}};var hn={};function fn(e){var t=e.doc||e.ok,n=t&&t._attachments;n&&Object.keys(n).forEach((function(e){var t=n[e];t.data=_e(t.data,t.content_type)}))}function gn(e){return/^_design/.test(e)?"_design/"+encodeURIComponent(e.slice(8)):/^_local/.test(e)?"_local/"+encodeURIComponent(e.slice(7)):encodeURIComponent(e)}function pn(e){return e._attachments&&Object.keys(e._attachments)?Promise.all(Object.keys(e._attachments).map((function(t){var n=e._attachments[t];if(n.data&&"string"!=typeof n.data)return new Promise((function(e){xe(n.data,e)})).then((function(e){n.data=e}))}))):Promise.resolve()}function mn(e,t){if(function(e){if(!e.prefix)return!1;var t=fe(e.prefix).protocol;return"http"===t||"https"===t}(t)){var n=t.name.substr(t.prefix.length);e=t.prefix.replace(/\/?$/,"/")+encodeURIComponent(n)}var i=fe(e);(i.user||i.password)&&(i.auth={username:i.user,password:i.password});var r=i.path.replace(/(^\/|\/$)/g,"").split("/");return i.db=r.pop(),-1===i.db.indexOf("%")&&(i.db=encodeURIComponent(i.db)),i.path=r.join("/"),i}function vn(e,t){return yn(e,e.db+"/"+t)}function yn(e,t){var n=e.path?"/":"";return e.protocol+"://"+e.host+(e.port?":"+e.port:"")+"/"+e.path+n+t}function bn(e){return"?"+Object.keys(e).map((function(t){return t+"="+encodeURIComponent(e[t])})).join("&")}function wn(t,n){var i=this,r=mn(t.name,t),s=vn(r,"");t=L(t);var a,c=function(e,n){if((n=n||{}).headers=n.headers||new rt,n.credentials="include",t.auth||r.auth){var i=t.auth||r.auth,s=i.username+":"+i.password,o=ve(unescape(encodeURIComponent(s)));n.headers.set("Authorization","Basic "+o)}var a=t.headers||{};return Object.keys(a).forEach((function(e){n.headers.append(e,a[e])})),function(e){var t="undefined"!=typeof navigator&&navigator.userAgent?navigator.userAgent.toLowerCase():"",n=-1!==t.indexOf("msie"),i=-1!==t.indexOf("trident"),r=-1!==t.indexOf("edge"),s=!("method"in e)||"GET"===e.method;return(n||i||r)&&s}(n)&&(e+=(-1===e.indexOf("?")?"?":"&")+"_nonce="+Date.now()),(t.fetch||it)(e,n)};function l(e,t){return C(e,f()((function(e){d().then((function(){return t.apply(this,e)})).catch((function(t){e.pop()(t)}))}))).bind(i)}function u(e,t,n){var i={};return(t=t||{}).headers=t.headers||new rt,t.headers.get("Content-Type")||t.headers.set("Content-Type","application/json"),t.headers.get("Accept")||t.headers.set("Accept","application/json"),c(e,t).then((function(e){return i.ok=e.ok,i.status=e.status,e.json()})).then((function(e){if(i.data=e,!i.ok){i.data.status=i.status;var t=ie(i.data);if(n)return n(t);throw t}if(Array.isArray(i.data)&&(i.data=i.data.map((function(e){return e.error||e.missing?ie(e):e}))),!n)return i;n(null,i.data)}))}function d(){return t.skip_setup?Promise.resolve():a||((a=u(s).catch((function(e){return e&&e.status&&404===e.status?(F(404,"PouchDB is just detecting if the remote exists."),u(s,{method:"PUT"})):Promise.reject(e)})).catch((function(e){return!(!e||!e.status||412!==e.status)||Promise.reject(e)}))).catch((function(){a=null})),a)}function h(e){return e.split("/").map(encodeURIComponent).join("/")}o()((function(){n(null,i)})),i._remote=!0,i.type=function(){return"http"},i.id=l("id",(function(e){c(yn(r,"")).then((function(e){return e.json()})).catch((function(){return{}})).then((function(t){var n=t&&t.uuid?t.uuid+r.db:vn(r,"");e(null,n)}))})),i.compact=l("compact",(function(e,t){"function"==typeof e&&(t=e,e={}),e=L(e),u(vn(r,"_compact"),{method:"POST"}).then((function(){!function n(){i.info((function(i,r){r&&!r.compact_running?t(null,{ok:!0}):setTimeout(n,e.interval||200)}))}()}))})),i.bulkGet=C("bulkGet",(function(e,t){var n=this;function i(t){var n={};e.revs&&(n.revs=!0),e.attachments&&(n.attachments=!0),e.latest&&(n.latest=!0),u(vn(r,"_bulk_get"+bn(n)),{method:"POST",body:JSON.stringify({docs:e.docs})}).then((function(n){e.attachments&&e.binary&&n.data.results.forEach((function(e){e.docs.forEach(fn)})),t(null,n.data)})).catch(t)}function s(){var i=Math.ceil(e.docs.length/50),r=0,s=new Array(i);function o(e){return function(n,o){s[e]=o.results,++r===i&&t(null,{results:se(s)})}}for(var a=0;at?t:a;var c=vn(r,"_changes"+bn(i)),p={signal:g.signal,method:h,body:JSON.stringify(l)};f=n,e.aborted||d().then((function(){return u(c,p,o)})).catch(o)}},m={results:[]},v=function(n,i){if(!e.aborted){var r=0;if(i&&i.results){r=i.results.length,m.last_seq=i.last_seq;var c=null,l=null;"number"==typeof i.pending&&(c=i.pending),"string"!=typeof m.last_seq&&"number"!=typeof m.last_seq||(l=m.last_seq);e.query_params,i.results=i.results.filter((function(t){a--;var n=re(e)(t);return n&&(e.include_docs&&e.attachments&&e.binary&&fn(t),e.return_docs&&m.results.push(t),e.onChange(t,c,l)),n}))}else if(n)return e.aborted=!0,void e.complete(n);i&&i.last_seq&&(f=i.last_seq);var u=s&&a<=0||i&&r0?e.slice(n):e}function d(e){var t=e.value;return t&&"object"==typeof t&&t._id||e.id}function h(e){return function(t){return e.include_docs&&e.attachments&&e.binary&&function(e){e.rows.forEach((function(e){var t=e.doc&&e.doc._attachments;t&&Object.keys(t).forEach((function(e){var n=t[e];t[e].data=_e(n.data,n.content_type)}))}))}(t),t}}function g(e,t,n,i){var r=t[e];void 0!==r&&(i&&(r=encodeURIComponent(JSON.stringify(r))),n.push(e+"="+r))}function p(e){if(void 0!==e){var t=Number(e);return isNaN(t)||t!==parseInt(e,10)?e:t}}function m(e,t){var n=e.descending?"endkey":"startkey",i=e.descending?"startkey":"endkey";if(void 0!==e[n]&&void 0!==e[i]&&ft(e[n],e[i])>0)throw new _n("No rows can match your key range, reverse your start_key and end_key or set {descending : true}");if(t.reduce&&!1!==e.reduce){if(e.include_docs)throw new _n("{include_docs:true} is invalid for reduce");if(e.keys&&e.keys.length>1&&!e.group&&!e.group_level)throw new _n("Multi-key fetches for reduce views must use {group: true}")}["group_level","limit","skip"].forEach((function(t){var n=function(e){if(e){if("number"!=typeof e)return new _n('Invalid value for integer: "'+e+'"');if(e<0)return new _n('Invalid value for positive integer: "'+e+'"')}}(e[t]);if(n)throw n}))}function v(e){return function(t){if(404===t.status)return e;throw t}}function y(e,t,n){var r="_local/doc_"+e,s={_id:r,keys:[]},o=n.get(e),a=o[0];return(function(e){return 1===e.length&&/^1-/.test(e[0].rev)}(o[1])?Promise.resolve(s):t.db.get(r).catch(v(s))).then((function(e){return function(e){return e.keys.length?t.db.allDocs({keys:e.keys,include_docs:!0}):Promise.resolve({rows:[]})}(e).then((function(t){return function(e,t){for(var n=[],r=new i,s=0,o=t.rows.length;s0&&0===ft(o.key,t)&&a.push(i),n.set(mt(a),o),t=o.key}return n}return g().then((function(){return f.finish()})).then((function(){e.seq=c}))}(e,n)}))()}function _(e,t){return Ln(b(e),(function(){return function(e,t){var i,s=e.reduceFun&&!1!==t.reduce,o=t.skip||0;void 0===t.keys||t.keys.length||(t.limit=0,delete t.keys);function a(t){return t.include_docs=!0,e.db.allDocs(t).then((function(e){return i=e.total_rows,e.rows.map((function(e){if("value"in e.doc&&"object"==typeof e.doc.value&&null!==e.doc.value){var t=Object.keys(e.doc.value).sort(),n=["id","key","value"];if(!(tn))return e.doc.value}var i=function(e){for(var t=[],n=[],i=0;;){var r=e[i++];if("\0"!==r)switch(r){case"1":t.push(null);break;case"2":t.push("1"===e[i]),i++;break;case"3":var s=vt(e,i);t.push(s.num),i+=s.length;break;case"4":for(var o="";;){var a=e[i];if("\0"===a)break;o+=a,i++}o=o.replace(/\u0001\u0001/g,"\0").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,""),t.push(o);break;case"5":var c={element:[],index:t.length};t.push(c.element),n.push(c);break;case"6":var l={element:{},index:t.length};t.push(l.element),n.push(l);break;default:throw new Error("bad collationIndex or unexpectedly reached end of input: "+r)}else{if(1===t.length)return t.pop();yt(t,n)}}}(e.doc._id);return{key:i[0],id:i[1],value:"value"in e.doc?e.doc.value:null}}))}))}function l(a){var l;if(l=s?function(e,t,i){0===i.group_level&&delete i.group_level;var r=i.group||i.group_level,s=n(e.reduceFun),o=[],a=isNaN(i.group_level)?Number.POSITIVE_INFINITY:i.group_level;t.forEach((function(e){var t=o[o.length-1],n=r?e.key:null;if(r&&Array.isArray(n)&&(n=n.slice(0,a)),t&&0===ft(t.groupKey,n))return t.keys.push([e.key,e.id]),void t.values.push(e.value);o.push({keys:[[e.key,e.id]],values:[e.value],groupKey:n})})),t=[];for(var l=0,d=o.length;l0)||function(e){return e._conflicts&&e._conflicts.length>0}(e.doc)||(e.doc._conflicts&&delete e.doc._conflicts,r.push(e.doc),delete n[e.id])}))}))}return Promise.resolve().then((function(){var e=Object.keys(n).filter((function(e){var t=n[e].missing;return 1===t.length&&Zn(t[0])}));if(e.length>0)return o(e)})).then((function(){var o=function(e){var t=[];return Object.keys(e).forEach((function(n){e[n].missing.forEach((function(e){t.push({id:n,rev:e})}))})),{docs:t,revs:!0,latest:!0}}(n);if(o.docs.length)return e.bulkGet(o).then((function(n){if(i.cancelled)throw new Error("cancelled");return Promise.all(n.results.map((function(n){return Promise.all(n.docs.map((function(n){var i=n.ok;return n.error&&(s=!1),i&&i._attachments?function(e,t,n){var i=ae(t)&&!ae(e),r=Object.keys(n._attachments);return i?e.get(n._id).then((function(i){return Promise.all(r.map((function(r){return function(e,t,n){return!e._attachments||!e._attachments[n]||e._attachments[n].digest!==t._attachments[n].digest}(i,n,r)?t.getAttachment(n._id,r):e.getAttachment(i._id,r)})))})).catch((function(e){if(404!==e.status)throw e;return Gn(t,n)})):Gn(t,n)}(t,e,i).then((function(e){var t=Object.keys(i._attachments);return e.forEach((function(e,n){var r=i._attachments[t[n]];delete r.stub,delete r.length,r.data=e})),i})):i})))}))).then((function(e){r=r.concat(se(e).filter(Boolean))}))}))})).then((function(){return{ok:s,docs:r}}))}function Kn(e,t,n,i,r){return e.get(t).catch((function(n){if(404===n.status)return"http"!==e.adapter&&"https"!==e.adapter||F(404,"PouchDB is just checking if a remote checkpoint exists."),{session_id:i,_id:t,history:[],replicator:"pouchdb",version:1};throw n})).then((function(s){if(!r.cancelled&&s.last_seq!==n)return s.history=(s.history||[]).filter((function(e){return e.session_id!==i})),s.history.unshift({last_seq:n,session_id:i}),s.history=s.history.slice(0,5),s.version=1,s.replicator="pouchdb",s.session_id=i,s.last_seq=n,e.put(s).catch((function(s){if(409===s.status)return Kn(e,t,n,i,r);throw s}))}))}function Yn(e,t,n,i,r){this.src=e,this.target=t,this.id=n,this.returnValue=i,this.opts=r||{}}Yn.prototype.writeCheckpoint=function(e,t){var n=this;return this.updateTarget(e,t).then((function(){return n.updateSource(e,t)}))},Yn.prototype.updateTarget=function(e,t){return this.opts.writeTargetCheckpoint?Kn(this.target,this.id,e,t,this.returnValue):Promise.resolve(!0)},Yn.prototype.updateSource=function(e,t){if(this.opts.writeSourceCheckpoint){var n=this;return Kn(this.src,this.id,e,t,this.returnValue).catch((function(e){if(Qn(e))return n.opts.writeSourceCheckpoint=!1,!0;throw e}))}return Promise.resolve(!0)};var Xn={undefined:function(e,t){return 0===ft(e.last_seq,t.last_seq)?t.last_seq:0},1:function(e,t){return function(e,t){if(e.session_id===t.session_id)return{last_seq:e.last_seq,history:e.history};return function e(t,n){var i=t[0],r=t.slice(1),s=n[0],o=n.slice(1);if(!i||0===n.length)return{last_seq:0,history:[]};if(Jn(i.session_id,n))return{last_seq:i.last_seq,history:t};if(Jn(s.session_id,r))return{last_seq:s.last_seq,history:o};return e(r,o)}(e.history,t.history)}(t,e).last_seq}};function Jn(e,t){var n=t[0],i=t.slice(1);return!(!e||0===t.length)&&(e===n.session_id||Jn(e,i))}function Qn(e){return"number"==typeof e.status&&4===Math.floor(e.status/100)}Yn.prototype.getCheckpoint=function(){var e=this;return e.opts&&e.opts.writeSourceCheckpoint&&!e.opts.writeTargetCheckpoint?e.src.get(e.id).then((function(e){return e.last_seq||0})).catch((function(e){if(404!==e.status)throw e;return 0})):e.target.get(e.id).then((function(t){return e.opts&&e.opts.writeTargetCheckpoint&&!e.opts.writeSourceCheckpoint?t.last_seq||0:e.src.get(e.id).then((function(e){return t.version!==e.version?0:(n=t.version?t.version.toString():"undefined")in Xn?Xn[n](t,e):0;var n}),(function(n){if(404===n.status&&t.last_seq)return e.src.put({_id:e.id,last_seq:0}).then((function(){return 0}),(function(n){return Qn(n)?(e.opts.writeSourceCheckpoint=!1,t.last_seq):0}));throw n}))})).catch((function(e){if(404!==e.status)throw e;return 0}))};function ei(e,t,n){var i=n.doc_ids?n.doc_ids.sort(ft):"",r=n.filter?n.filter.toString():"",s="",o="",a="";return n.selector&&(a=JSON.stringify(n.selector)),n.filter&&n.query_params&&(s=JSON.stringify(function(e){return Object.keys(e).sort(ft).reduce((function(t,n){return t[n]=e[n],t}),{})}(n.query_params))),n.filter&&"_view"===n.filter&&(o=n.view.toString()),Promise.all([e.id(),t.id()]).then((function(e){var t=e[0]+e[1]+r+o+s+i+a;return new Promise((function(e){Ce(t,e)}))})).then((function(e){return"_local/"+(e=e.replace(/\//g,".").replace(/\+/g,"_"))}))}function ti(e,t,n,i,r){var s,a,c,l=[],u={seq:0,changes:[],docs:[]},d=!1,h=!1,f=!1,g=0,p=n.continuous||n.live||!1,m=n.batch_size||100,v=n.batches_limit||10,y=n.style||"all_docs",b=!1,w=n.doc_ids,_=n.selector,E=[],S=Oe();r=r||{ok:!0,start_time:(new Date).toISOString(),docs_read:0,docs_written:0,doc_write_failures:0,errors:[]};var x={};function A(){return c?Promise.resolve():ei(e,t,n).then((function(r){a=r;var s={};s=!1===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!1}:"source"===n.checkpoint?{writeSourceCheckpoint:!0,writeTargetCheckpoint:!1}:"target"===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!0}:{writeSourceCheckpoint:!0,writeTargetCheckpoint:!0},c=new Yn(e,t,a,i,s)}))}function k(){if(E=[],0!==s.docs.length){var e=s.docs,o={timeout:n.timeout};return t.bulkDocs({docs:e,new_edits:!1},o).then((function(t){if(i.cancelled)throw T(),new Error("cancelled");var n=Object.create(null);t.forEach((function(e){e.error&&(n[e.id]=e)}));var s=Object.keys(n).length;r.doc_write_failures+=s,r.docs_written+=e.length-s,e.forEach((function(e){var t=n[e._id];if(t){r.errors.push(t);var s=(t.name||"").toLowerCase();if("unauthorized"!==s&&"forbidden"!==s)throw t;i.emit("denied",L(t))}else E.push(e)}))}),(function(t){throw r.doc_write_failures+=e.length,t}))}}function C(){if(s.error)throw new Error("There was a problem getting docs.");r.last_seq=g=s.seq;var e=L(r);return E.length&&(e.docs=E,"number"==typeof s.pending&&(e.pending=s.pending,delete s.pending),i.emit("change",e)),d=!0,c.writeCheckpoint(s.seq,S).then((function(){if(i.emit("checkpoint",{checkpoint:s.seq}),d=!1,i.cancelled)throw T(),new Error("cancelled");s=void 0,F()})).catch((function(e){throw R(e),e}))}function I(){return Wn(e,t,s.diffs,i).then((function(e){s.error=!e.ok,e.docs.forEach((function(e){delete s.diffs[e._id],r.docs_read++,s.docs.push(e)}))}))}function P(){var e;i.cancelled||s||(0!==l.length?(s=l.shift(),i.emit("checkpoint",{start_next_batch:s.seq}),(e={},s.changes.forEach((function(t){i.emit("checkpoint",{revs_diff:t}),"_user/"!==t.id&&(e[t.id]=t.changes.map((function(e){return e.rev})))})),t.revsDiff(e).then((function(e){if(i.cancelled)throw T(),new Error("cancelled");s.diffs=e}))).then(I).then(k).then(C).then(P).catch((function(e){B("batch processing terminated with error",e)}))):O(!0))}function O(e){0!==u.changes.length?(e||h||u.changes.length>=m)&&(l.push(u),u={seq:0,changes:[],docs:[]},"pending"!==i.state&&"stopped"!==i.state||(i.state="active",i.emit("active")),P()):0!==l.length||s||((p&&x.live||h)&&(i.state="pending",i.emit("paused")),h&&T())}function B(e,t){f||(t.message||(t.message=e),r.ok=!1,r.status="aborting",l=[],u={seq:0,changes:[],docs:[]},T(t))}function T(s){if(!(f||i.cancelled&&(r.status="cancelled",d)))if(r.status=r.status||"complete",r.end_time=(new Date).toISOString(),r.last_seq=g,f=!0,s){(s=ne(s)).result=r;var o=(s.name||"").toLowerCase();"unauthorized"===o||"forbidden"===o?(i.emit("error",s),i.removeAllListeners()):function(e,t,n,i){if(!1===e.retry)return t.emit("error",n),void t.removeAllListeners();if("function"!=typeof e.back_off_function&&(e.back_off_function=D),t.emit("requestError",n),"active"===t.state||"pending"===t.state){t.emit("paused",n),t.state="stopped";var r=function(){e.current_back_off=0};t.once("paused",(function(){t.removeListener("active",r)})),t.once("active",r)}e.current_back_off=e.current_back_off||0,e.current_back_off=e.back_off_function(e.current_back_off),setTimeout(i,e.current_back_off)}(n,i,s,(function(){ti(e,t,n,i)}))}else i.emit("complete",r),i.removeAllListeners()}function N(e,t,r){if(i.cancelled)return T();"number"==typeof t&&(u.pending=t),re(n)(e)&&(u.seq=e.seq||r,u.changes.push(e),i.emit("checkpoint",{pending_batch:u.seq}),o()((function(){O(0===l.length&&x.live)})))}function M(e){if(b=!1,i.cancelled)return T();if(e.results.length>0)x.since=e.results[e.results.length-1].seq,F(),O(!0);else{var t=function(){p?(x.live=!0,F()):h=!0,O(!0)};s||0!==e.results.length?t():(d=!0,c.writeCheckpoint(e.last_seq,S).then((function(){d=!1,r.last_seq=g=e.last_seq,t()})).catch(R))}}function q(e){if(b=!1,i.cancelled)return T();B("changes rejected",e)}function F(){if(!b&&!h&&l.length1)for(var n=1;n0&&o.length>r&&!o.warned){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,console&&console.warn&&console.warn(a)}return e}function h(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function f(e,t,n){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},r=h.bind(i);return r.listener=n,i.wrapFn=r,r}function g(e,t,n){var i=e._events;if(void 0===i)return[];var r=i[t];return void 0===r?[]:"function"==typeof r?n?[r.listener||r]:[r]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var c=r[e];if(void 0===c)return!1;if("function"==typeof c)s(c,this,t);else{var l=c.length,u=m(c,l);for(n=0;n=0;s--)if(n[s]===t||n[s].listener===t){o=n[s].listener,r=s;break}if(r<0)return this;0===r?n.shift():function(e,t){for(;t+1=0;i--)this.removeListener(e,t[i]);return this},a.prototype.listeners=function(e){return g(this,e,!0)},a.prototype.rawListeners=function(e){return g(this,e,!1)},a.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},a.prototype.listenerCount=p,a.prototype.eventNames=function(){return this._eventsCount>0?i(this._events):[]}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},function(e,t,n){"use strict";var i,r,s,o=[n(37),n(38),n(39),n(40),n(41),n(42)],a=-1,c=[],l=!1;function u(){i&&r&&(i=!1,r.length?c=r.concat(c):a=-1,c.length&&d())}function d(){if(!i){l=!1,i=!0;for(var e=c.length,t=setTimeout(u);e;){for(r=c,c=[];r&&++a1)for(var n=1;n3){l(s.shift().getId())}const t=document.getElementById("notification-content"),n=document.createElement("div");n.classList.add("neon-notification"),n.classList.add("neon-notification-"+e.type),n.id=e.getId(),n.innerHTML=e.message,t.append(n),t.style.display="",e.display()}(e),e.setTimeoutId(window.setTimeout(l,5e3,e.getId())),document.getElementById(e.getId()).addEventListener("click",()=>{window.clearTimeout(e.timeoutID),l(e.getId())})}function d(e,t="default",n=null){const r=new c(e,t,n);"error"!=r.type&&"warning"!=r.type||(0,i.recordNotification)(r),u(r)}t.Notification=c,t.queueNotification=d,t.default={queueNotification:d}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setSettings=t.getSettings=void 0;let i=null;const r={zoom:100,glyphOpacity:100,imageOpacity:100,circleSize:25,highlightMode:"none",userMode:"edit",insertMode:"punctum",insertTab:"primitiveTab",selectionMode:"selBySyllable",debugMode:!1,displayBBox:!1,displayText:!1,displayInfo:!1,displayErrLog:!1,viewBox:null};t.getSettings=function(){return i.settings},t.setSettings=function(e){i.set(e)},t.default=class{constructor(e){i=this,this.id=e,this.load()}load(){try{const e=JSON.parse(window.localStorage.getItem(this.id));this.sync(e)}catch(e){this.sync({})}}set(e){this.settings=Object.assign(Object.assign({},this.settings),e),window.localStorage.setItem(this.id,JSON.stringify(this.settings))}sync(e){this.settings=Object.assign(Object.assign({},r),e),window.localStorage.setItem(this.id,JSON.stringify(this.settings))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.selectAll=t.selectNn=t.selectBBox=t.getStaffBBox=t.isMultiStaveSelection=t.sharedSecondLevelParent=t.elementsHaveCorrectType=t.sharedLogicalParent=t.areAdjacent=t.isLigature=t.selectNcs=t.select=t.selectLayerElement=t.selectStaff=t.unselect=t.getSelectionType=void 0;const i=n(18),r=n(13),s=n(24),o=n(27),a=n(14),c=n(3),l=n(7);function u(){const e=document.getElementsByClassName("sel-by is-active");return 0!==e.length?e[0].id:null}function d(){document.querySelectorAll(".no-moving").forEach(e=>e.classList.remove("no-moving")),document.querySelectorAll(".selected").forEach(e=>{e.classList.remove("selected"),e.classList.contains("staff")?(e.removeAttribute("style"),i.unhighlight(e)):(e.removeAttribute("style"),e.style.fill=""),Array.from(e.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""}),Array.from(e.querySelectorAll(".sylTextRect-display")).forEach(e=>{e.style.fill="blue"}),e.parentElement.classList.contains("syllable-highlighted")&&(e.parentElement.style.fill="",e.parentElement.classList.add("syllable"),e.parentElement.classList.remove("syllable-highlighted"),Array.from(e.parentElement.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.parentElement.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""})),l.selectAll("#resizeRect").remove(),l.selectAll(".resizePoint").remove(),l.selectAll(".rotatePoint").remove()}),Array.from(document.querySelectorAll(".text-select")).forEach(e=>{e.style.color="",e.style.fontWeight="",e.classList.remove("text-select")}),document.getElementById("selByStaff").classList.contains("is-active")?a.endOptionsSelection():s.endGroupingSelection(),document.getElementById("extraEdit").innerHTML="",document.getElementById("extraEdit").parentElement.classList.add("hidden"),(0,r.updateHighlight)()}function h(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),a.triggerSingleStaffActions(),s.initGroupingListeners(),t.dragInit())}function f(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),t.dragInit())}function g(e,t,n=!0){if(e){if(e.classList.contains("staff"))return h(e,t);if(e.classList.contains("layer"))return f(e,t);if(!e.classList.contains("selected")&&!e.classList.contains("sylTextRect")&&!e.classList.contains("sylTextRect-display")){let t;if(e.classList.add("selected"),e.style.fill="#d00",e.style.stroke=e.classList.contains("divLine")?"#d00":"black",e.querySelectorAll(".sylTextRect-display").length&&e.querySelectorAll(".sylTextRect-display").forEach(e=>{e.style.fill="#d00"}),e.querySelectorAll(".divLine").length&&e.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"}),e.classList.contains("syllable")&&e.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),e.classList.contains("syllable")?t=e.id:null!==e.closest(".syllable")&&(t=e.closest(".syllable").id),void 0!==t){document.querySelectorAll("span."+t).forEach(e=>{e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select")})}}n&&(0,r.updateHighlight)()}}async function p(e,t){const n=await t.getElementAttr(e.id,t.view.getCurrentPageURI());return Boolean(n.ligated)}function m(e,t){if(t.length<2)return!1;switch(e){case"selBySyllable":t.forEach(e=>{if(!e.classList.contains("syllable"))return!1});break;case"selByNeume":t.forEach(e=>{if(!e.classList.contains("neume"))return!1});break;case"selByStaff":t.forEach(e=>{if(!e.classList.contains("staff"))return!1});break;default:return!1}return!0}function v(e){const t=Array.from(e),n=t.pop().parentElement.parentElement;for(const e of t){if(e.parentElement.parentElement.id!==n.id)return!1}return!0}function y(e,t,n){const i=e,r=i.closest(".syl");if(!r.classList.contains("selected")){r.classList.add("selected"),i.style.fill="#d00";const s=e.closest(".syllable");s.style.fill="#d00",s.classList.add("syllable-highlighted"),s.querySelectorAll(".divLine").length&&(s.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),s.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"})),void 0!==n&&(0,o.resize)(r,n,t),void 0!==t&&t.dragInit();const a=e.closest(".syllable").id;if(void 0!==a){const e=document.querySelector("span."+a);e&&(e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select"))}}a.triggerBBoxActions()}t.getSelectionType=u,t.unselect=d,t.selectStaff=h,t.selectLayerElement=f,t.select=g,t.selectNcs=async function(e,t,n){if(!e.parentElement.classList.contains("selected")){const i=e.parentElement;if(d(),g(i),await p(i,t)){const e=i.previousSibling;if(await p(e,t))g(e);else{const e=i.nextSibling;await p(e,t)?g(e):console.warn("Error: Neither prev or next nc are ligatures")}s.triggerGrouping("ligature")}else i.classList.contains("nc")?a.triggerNcActions(i):console.warn("No action triggered!");n.dragInit()}},t.isLigature=p,t.areAdjacent=function(e,t){if(t.length<2)return!1;let n;switch(e){case"selBySyllable":n=Array.from(document.querySelectorAll(".syllable"));break;case"selByNeume":return!0;case"selByNc":n=Array.from(document.querySelectorAll(".nc"));break;case"selByStaff":n=Array.from(document.querySelectorAll(".staff"));break;default:return!1}const i=[];for(let e=0;e!(e.classList.contains("divLine")||e.classList.contains("accid")||e.classList.contains("clef")))))return!1;switch(e){case"selBySyllable":const e=t[0].closest(".staff");for(let n=0;n{const o=e.getAttribute("d").match(/\d+/g).map(e=>Number(e));void 0===s&&(s=Math.atan((o[3]-o[1])/(o[2]-o[0]))),(void 0===n||Math.min(o[1],o[3])r)&&(r=Math.max(o[1],o[3])),(void 0===i||o[2]>i)&&(i=o[2])}),{id:e.id,ulx:t,uly:n,lrx:i,lry:r,rotate:s}},t.selectBBox=y,t.selectNn=function(e){return!(e.length>0)||(e.forEach(e=>{g(e)}),!1)},t.selectAll=async function(e,t,n){const i=u();if(d(),0===e.length)return;let r,l=!1,h=!1;switch(i){case"selBySyllable":r=".syllable";break;case"selByNeume":r=".neume";break;case"selByNc":r=".nc";break;case"selByStaff":r=".staff";break;case"selByBBox":r=".sylTextRect-display";break;case"selByLayerElement":r=".clef, .custos, .accid, .divLine";break;default:return void console.error("Unknown selection type "+i)}const f=new Set;for(const t of e){let e=t.closest(r);if(null===e){if(e=t.closest(".clef, .custos, .accid, .divLine"),null===e){console.warn("Element "+t.id+" is not part of specified group and is not a clef or custos or accid or divLine.");continue}l=l||!0}else h=h||!0;f.add(e);let n=e,i=n.getAttribute("mei:follows"),s=n.getAttribute("mei:precedes");for(;i||s;){if(i){if(n=document.querySelector("#"+i.slice(1)),f.has(n))break;n.classList.add("no-moving"),f.add(n),i=n.getAttribute("mei:follows")}if(s){if(n=document.querySelector("#"+s.slice(1)),f.has(n))break;n.classList.add("no-moving"),f.add(n),s=n.getAttribute("mei:precedes")}}}f.forEach(e=>g(e,n,!1));const p=Array.from(f.values());if(!l||h)switch(i){case"selByStaff":switch(p.length){case 1:a.triggerSingleStaffActions(),s.initGroupingListeners(),(0,o.resize)(p[0],t,n);break;default:a.triggerMultiStaffActions(),s.initGroupingListeners()}break;case"selByLayerElement":1===f.size?a.triggerLayerElementActions(p[0]):a.triggerDefaultActions();break;case"selBySyllable":switch(p.length){case 1:null===p[0].querySelector(".syl > rect")?(c.queueNotification('The selected syllable does not contain a <syl> element, please insert one using button "Add Syllable Text".',"warning"),a.triggerSyllableActions("noSyl"),a.addAddSylListener()):a.triggerSyllableActions("singleSelect");break;default:s.isLinkable("selBySyllable",p)?a.triggerSyllableActions("linkableSelect"):s.isGroupable("selBySyllable",p)?a.triggerSyllableActions("multiSelect"):a.triggerSyllableActions("default")}break;case"selByNeume":switch(p.length){case 1:a.triggerNeumeActions(),s.initGroupingListeners();break;default:s.isGroupable("selByNeume",p)?s.triggerGrouping("neume"):a.triggerDefaultActions()}break;case"selByNc":switch(p.length){case 1:a.triggerNcActions(p[0]);break;case 2:if(v(p)){if(p[0].parentElement===p[1].parentElement){const e=Array.from(p[0].parentElement.children);if(1===Math.abs(e.indexOf(p[0])-e.indexOf(p[1]))){let e=p[0].children[0],t=p[1].children[0],n=e.x.baseVal.value,i=t.x.baseVal.value,r=e.y.baseVal.value,o=t.y.baseVal.value;if((n>i||n===i&&ry(e,n,void 0))}break;default:console.error("Unknown selection type. This should not have occurred.")}else 1===f.size?a.triggerLayerElementActions(p[0]):"selBySyllable"==i?a.triggerDefaultSylActions():a.triggerDefaultActions()}},function(e,t,n){"use strict";e.exports=function(e){return function(){var t=arguments.length;if(t){for(var n=[],i=-1;++i\n \n \n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
',groupingTab:'\n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
',systemTab:'\n \n
\n Click upper left and lower right corners of new staff.
'},t.insertControlsPanel='\n\t',t.editControlsPanel='\n \n
\n
\n
Selection Mode:
\n
\n\n Syllable \n Neume \n Neume Component \n Staff \n Layer Element \n\n
\n
\n
\n\n
\n
\n
\n \n
\n \x3c!--\n * The extraEdit panel is added for edit options that have dropdown menus\n * Like the Neume and Clef menus\n * This is done because the moreEdit menu needs to have overflow for cases where it has lots of buttons\n * But overflow ruins dropdown menus\n --\x3e\n
\n
\n
\n
',t.ncActionContents='Change Head Shape: \n \n
\n \n Head Shapes \n \n \n
\n \n
',t.defaultNeumeActionContents='\n Delete \n Split Neumes \n
',t.neumeActionContents='Grouping Options: \n \n
\n
\n \n Groupings \n \n \n \n \n
\n \n
\n
Ungroup ',t.defaultActionContents='
\n Delete \n
',t.defaultSylActionContents='
Delete \n
Re-associate to nearest staff ',t.custosActionContents='
\n Delete \n Re-associate to nearest staff \n
',t.layerElementOutActionContents='
\n Delete \n Insert to nearest syllable \n Re-associate to nearest staff \n
',t.layerElementInActionContents='
\n Delete \n Move outside syllable \n Re-associate to nearest staff \n
',t.accidActionContents='
Change Accidental: \n
\n
\n \n Shapes \n \n \n
\n \n
',t.staffSplitActionContents='
Split System:
\n
\n Split \n Reset Rotate \n Delete \n
',t.staffMergeActionContents='
Merge Systems: \n
\n Merge \n Delete \n
',t.columnActionContents='
\n Edit Column Information:\n
\n
– \n
\n
+ \n
Confirm \n
\n
\n
',t.clefActionContents='\n
\n
\n
\n \n Displace Octave \n \n \n
\n \n
\n
\n
\n \n Change Clef Shape \n \n \n
\n \n
\n
\n ',t.divLineActionContents='
Change DivLine: \n
\n
\n \n Shapes \n \n \n
\n \n
',t.bboxActionContents='
\n Match Height for Entire Row \n Delete \n
',t.groupingMenu={nc:'
\n
\n Group Neume Components \n Delete \n
\n
',neume:'
\n
\n Group Neumes \n Delete \n
\n
',syl:'
\n
\n Merge Syllables \n Delete \n Re-associate to nearest staff \n
\n\t\t
',ligatureNc:'
\n
\n Group Neume Components \n Toggle Ligature \n Delete \n
\n
',ligature:'
\n
\n Toggle Ligature \n Delete \n
\n
',splitSyllable:'
\n
\n Toggle Linked Syllables \n Delete \n
\n
'},t.addTextModal='
\n
Enter Syllable Text: \n
\n
\n
',t.editTextModal='
\n
Enter Syllable Text: \n
\n
\n
',t.hotkeysModal='\n
\n \x3c!-- "Display" hotkeys --\x3e\n
\n
Display
\n
\n
\n
\n
\n
\n
\n
Scroll To Syllable Text
\n
\n
\n\n \x3c!-- "Edit" hotkeys --\x3e\n
\n
Edit
\n
\n
\n
Ctrl
\n
+
\n
z
\n
or
\n
⌘
\n
+
\n
z
\n
\n
Undo
\n
\n
\n
\n
Ctrl
\n
+
\n
Shift
\n
+
\n
z
\n
or
\n
⌘
\n
+
\n
Shift
\n
+
\n
z
\n
\n
Redo
\n
\n
\n
\n
\n Highlight by Staff/Syllable/Neume/LayerElement/Selection/Off\n
\n
\n
\n
\n
\n Select by Syllable/Neume/Neume Component/Staff/Layer Element/BBox\n
\n
\n
\n
\n
\n Begin Insert for the nth Option in the Selected Tab\n
\n
\n
\n
\n
\n Group/Ungroup Selected Element(s)\n
\n
\n
\n\n \x3c!-- "Other" hotkeys --\x3e\n
\n
Other
\n
\n
\n
\n
Return to Edit Mode
\n
\n
\n
',t.syllableActionsContent='\n
\n Merge Syllables \n Ungroup \n Delete \n Re-associate to nearest staff \n
\n',t.errorLogsPanelContents='
\n
'},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalWindow=t.ModalWindowView=void 0;const i=n(8),r=n(33),s=n(5);var o,a;!function(e){e[e.ADD_TEXT=0]="ADD_TEXT",e[e.EDIT_TEXT=1]="EDIT_TEXT",e[e.HOTKEYS=2]="HOTKEYS",e[e.ERROR_LOG=3]="ERROR_LOG",e[e.DOCUMENT_UPLOAD=4]="DOCUMENT_UPLOAD",e[e.MOVE_TO=5]="MOVE_TO",e[e.NEW_FOLDER=6]="NEW_FOLDER",e[e.RENAME=7]="RENAME"}(o=t.ModalWindowView||(t.ModalWindowView={})),function(e){e[e.OPEN=0]="OPEN",e[e.CLOSED=1]="CLOSED"}(a||(a={}));t.ModalWindow=class{constructor(e){this.openAddSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-add").removeEventListener("click",this.addSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-add").addEventListener("click",this.addSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.openEditSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-save").removeEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-save").addEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.addSylText=function(){const e={action:"addSyl",param:{elementId:document.getElementsByClassName("syllable selected")[0].id,sylText:document.getElementById("neon-modal-window-edit-text-input").value}};this.neonView.edit(e,this.neonView.view.getCurrentPageURI()).then(e=>{e&&this.neonView.updateForCurrentPage().then(()=>{})}),this.hideModalWindow()},this.updateSylText=function(){const e=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0],t=e.textContent.replace(/\u{25CA}/u,"").trim(),n=document.getElementById("neon-modal-window-edit-text-input").value;if(null!==n&&n!==t){const t={action:"setText",param:{elementId:[...e.classList.entries()].filter(e=>"text-select"!==e[1]&&"selected-to-edit"!==e[1])[0][1],text:n}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(t=>{t&&this.neonView.updateForCurrentPage().then(()=>{this.updateSelectedBBox(e,this.dragHandler,this.neonView)})})}else this.updateSelectedBBox(e,this.dragHandler,this.neonView);this.hideModalWindow()},this.keydownListener=function(e){switch(e.stopImmediatePropagation(),this.modalWindowView){case o.ADD_TEXT:"Enter"===e.key&&this.addSylText(),"Escape"===e.key&&this.hideModalWindow();break;case o.EDIT_TEXT:"Enter"===e.key&&this.updateSylText(),"Escape"===e.key&&this.hideModalWindow();break;default:"Escape"===e.key&&this.hideModalWindow()}},this.focusModalWindow=function(){switch(this.modalWindowView){case o.ADD_TEXT:case o.EDIT_TEXT:document.getElementById("neon-modal-window-edit-text-input").select();break;case o.DOCUMENT_UPLOAD:case o.NEW_FOLDER:case o.RENAME:break;default:document.getElementById("neon-modal-window").focus()}},this.neonView=e,this.modalWindowState=a.CLOSED,this.setupEventListeners()}setupEventListeners(){document.getElementById("neon-modal-window-header-close").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").addEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").addEventListener("click",this.focusModalWindow.bind(this))}removeEventListeners(){document.getElementById("neon-modal-window-header-close").removeEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").removeEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").removeEventListener("click",this.focusModalWindow.bind(this))}setModalWindowView(e,t){this.modalWindowView=e,this.setModalWindowContent(t)}getModalWindowView(){return this.modalWindowView.toString()}openModalWindow(){switch(Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),this.modalWindowView){case o.ADD_TEXT:this.openAddSylTextModalWindow();break;case o.EDIT_TEXT:this.openEditSylTextModalWindow();break;case o.HOTKEYS:document.getElementById("neon-modal-window-content-hotkeys").classList.add("visible");case o.DOCUMENT_UPLOAD:case o.MOVE_TO:case o.NEW_FOLDER:case o.RENAME:default:document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()}document.body.style.overflowX="hidden",document.body.style.overflowY="hidden",this.modalWindowState=a.OPEN}hideModalWindow(){switch(this.modalWindowView){case o.EDIT_TEXT:document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].classList.remove("selected-to-edit");break;case o.DOCUMENT_UPLOAD:case o.MOVE_TO:case o.NEW_FOLDER:case o.RENAME:document.getElementById("neon-modal-window-content-container").innerHTML=""}document.getElementById("neon-modal-window-container").style.display="none",document.body.style.overflowX="hidden",document.body.style.overflowY="scroll",this.modalWindowState=a.CLOSED,this.removeEventListeners()}setModalWindowContent(e){const t=document.getElementById("neon-modal-window-content-container"),n=document.getElementById("neon-modal-window-header-title");switch(this.modalWindowView){case o.ADD_TEXT:t.innerHTML=i.addTextModal,n.innerText="ENTER SYLLABLE TEXT";break;case o.EDIT_TEXT:t.innerHTML=i.editTextModal,n.innerText="EDIT SYLLABLE TEXT";const s=/\u{25CA}/u,a=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].textContent.replace(s,"").trim();document.getElementById("neon-modal-window-edit-text-input").value=a;break;case o.HOTKEYS:t.innerHTML=i.hotkeysModal,n.innerText="HOTKEYS";break;case o.ERROR_LOG:t.innerHTML=`
${e}
\n
`,n.innerText="ERROR LOG";break;case o.DOCUMENT_UPLOAD:n.innerText="DOCUMENT UPLOAD",t.innerHTML=r.uploadAreaHTML;break;case o.MOVE_TO:n.innerText="MOVE TO";break;case o.NEW_FOLDER:n.innerText="NEW FOLDER",t.innerHTML=r.newFolderHTML;break;case o.RENAME:n.innerText="RENAME",t.innerHTML=r.renameHTML;break;default:console.error("Unknown selection type. This should not have occurred.")}}updateSelectedBBox(e,t,n){(0,s.unselect)();const i=Array.from(e.classList).find(e=>"text-select"!==e&&"selected-to-edit"!==e);if(document.getElementById("displayBBox").checked&&document.getElementById(i)){const e=document.getElementById(i).querySelector(".sylTextRect-display");(0,s.selectBBox)(e,t,n)}}}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";for(var i=n(12),r=[],s=0;s<256;++s)r.push((s+256).toString(16).substr(1));t.a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(r[e[t+0]]+r[e[t+1]]+r[e[t+2]]+r[e[t+3]]+"-"+r[e[t+4]]+r[e[t+5]]+"-"+r[e[t+6]]+r[e[t+7]]+"-"+r[e[t+8]]+r[e[t+9]]+"-"+r[e[t+10]]+r[e[t+11]]+r[e[t+12]]+r[e[t+13]]+r[e[t+14]]+r[e[t+15]]).toLowerCase();if(!Object(i.a)(n))throw TypeError("Stringified UUID is invalid");return n}},function(e,t,n){"use strict";var i=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;t.a=function(e){return"string"==typeof e&&i.test(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initDisplayControls=t.loadHighlightSettings=t.updateDisplayAllBtn=t.updateHighlight=t.setHighlightSelectionControls=t.setHighlightControls=t.setHighlightOption=t.getHighlightType=t.setCircleSizeControls=t.setBgOpacityFromSlider=t.setGlyphOpacityFromSlider=t.setZoomControls=void 0;const i=n(18),r=n(4),s=n(7);let o,a,c;function l(e){const t=document.getElementById("opacityOutput");document.getElementById("opacitySlider").value=t.value,(0,r.setSettings)({glyphOpacity:Number(t.value)});const n=document.querySelector("#toggle-glyph-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show glyph")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide glyph"));try{document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=(Number(t.value)/100).toString()})}catch(e){console.warn("Unable to properly set opacity to pages")}}function u(e){const t=document.querySelector("#bgOpacityOutput");(0,r.setSettings)({imageOpacity:Number(t.value)});const n=document.querySelector("#toggle-bg-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show background image")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide background image"));const i=document.querySelector("."+e);i&&(i.style.opacity=String(Number(t.value)/100))}function d(e){const t=document.getElementById("highlight-"+e),n=document.getElementById("highlight-dropdown"),s=document.getElementById("highlight-type");if((0,r.setSettings)({highlightMode:e}),n.classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),"none"===e)return s.textContent=" - Off",void i.unsetGroupingHighlight();t.classList.add("highlight-selected"),s.textContent=" - "+(e[0].toUpperCase()+e.slice(1)),i.setGroupingHighlight(e)}function h(e){document.getElementById("highlight-"+e).addEventListener("click",()=>{d(e)})}function f(){document.body.removeEventListener("click",f),document.getElementById("highlight-dropdown").classList.remove("is-active")}function g(){const e=document.getElementById("highlight-dropdown");document.getElementById("highlight-button").addEventListener("click",t=>{t.stopPropagation(),e.classList.toggle("is-active"),e.classList.contains("is-active")?(document.body.addEventListener("click",f),h("column"),h("staff"),h("syllable"),h("neume"),h("layerElement"),h("none")):document.body.removeEventListener("click",f)})}function p(){const{highlightMode:e}=(0,r.getSettings)();d(e)}t.setZoomControls=function(e){if(void 0===e)return;const t=document.getElementById("zoomSlider"),n=document.getElementById("zoomOutput"),{zoom:i}=(0,r.getSettings)();t.value=String(i),n.value=String(i),e.zoomTo(i/100),document.getElementById("reset-zoom").addEventListener("click",()=>{n.value="100",t.value="100",e.resetZoomAndPan()}),document.querySelector("#set-zoom-easy-edit").addEventListener("click",()=>{n.value="180",t.value="180",e.zoomTo(1.8)}),t.addEventListener("mouseup",(function(){n.value=t.value,e.zoomTo(Number(n.value)/100)})),t.disabled=!1,document.body.addEventListener("keydown",i=>{const r=parseInt(n.value);if("ArrowUp"===i.key||"ArrowDown"===i.key||"ArrowRight"===i.key||"ArrowLeft"===i.key)i.preventDefault();else if("+"===i.key){const i=Math.min(r+20,parseInt(t.getAttribute("max")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else if("_"===i.key){const i=Math.max(r-20,parseInt(t.getAttribute("min")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else"0"===i.key&&(n.value="100",t.value="100",e.resetZoomAndPan())})},t.setGlyphOpacityFromSlider=l,t.setBgOpacityFromSlider=u,t.setCircleSizeControls=function(){const e=document.getElementById("circleSlider"),t=document.getElementById("circleOutput"),{circleSize:n}=(0,r.getSettings)();function i(){t.value=e.value,c=Number(e.value),(0,r.setSettings)({circleSize:Number(c)});const n=s.selectAll(".resizePoint");n.empty()||n.attr("r",c)}c=n,e.value=String(n),t.value=String(n),document.getElementById("reset-circle-size").addEventListener("click",()=>{const n=s.selectAll(".resizePoint");n.empty()||n.attr("r",25),c=Number(25),e.value=String(25),t.value=String(25),(0,r.setSettings)({circleSize:Number(25)}),i()}),e.addEventListener("input",i),e.addEventListener("change",i),e.disabled=!1},t.getHighlightType=function(){return document.getElementById("highlight-type").textContent.slice(3).toLowerCase()},t.setHighlightOption=h,t.setHighlightControls=g,t.setHighlightSelectionControls=function(){const e=document.getElementById("highlight-selection");e.addEventListener("click",()=>{document.getElementById("highlight-dropdown").classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),e.classList.add("highlight-selected"),document.getElementById("highlight-type").textContent=" - Selection",i.setGroupingHighlight("selection")})},t.updateHighlight=function(){let e;try{e=document.querySelector(".highlight-selected").id}catch(t){e=""}switch(e){case"highlight-column":i.setGroupingHighlight("column");break;case"highlight-staff":i.setGroupingHighlight("staff");break;case"highlight-syllable":i.setGroupingHighlight("syllable");break;case"highlight-neume":i.setGroupingHighlight("neume");break;case"highlight-layerElement":i.setGroupingHighlight("layerElement");break;case"highlight-selection":i.setGroupingHighlight("selection");break;default:i.unsetGroupingHighlight()}},t.updateDisplayAllBtn=function(){const e=document.getElementById("display-all-btn"),t=document.getElementById("displayInfo"),n=document.getElementById("displayBBox"),i=document.getElementById("displayText"),r=document.getElementById("display-errors");(null==t?void 0:t.checked)&&(null==n?void 0:n.checked)&&(null==i?void 0:i.checked)&&(null==r?void 0:r.checked)?(e.classList.add("selected"),e.innerHTML="Hide All"):e.classList.contains("selected")&&(e.classList.remove("selected"),e.innerHTML="Display All")},t.loadHighlightSettings=p,t.initDisplayControls=function(e,t){!function(e){const t=document.getElementById("opacitySlider"),n=document.getElementById("opacityOutput"),{glyphOpacity:i}=(0,r.getSettings)();function s(){n.value=t.value,o=Number(t.value),l(e)}o=i,t.value=String(i),n.value=String(i);const a=document.getElementById("toggle-glyph-opacity");100==i&&a.classList.add("hide-icon"),null==a||a.addEventListener("click",()=>{let i;a.classList.contains("hide-icon")?(a.classList.remove("hide-icon"),i=0):(a.classList.add("hide-icon"),i=1),document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=i.toString()}),o=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({glyphOpacity:100*i}),s()}),t.addEventListener("input",s),t.addEventListener("change",s),t.disabled=!1}(e),function(e){const t=document.getElementById("bgOpacitySlider"),n=document.getElementById("bgOpacityOutput"),{imageOpacity:i}=(0,r.getSettings)();function s(){n.value=t.value,a=Number(t.value),u(e)}a=i,t.value=String(i),n.value=String(i);const o=document.getElementById("toggle-bg-opacity");100==i&&o.classList.add("hide-icon"),o.addEventListener("click",()=>{let i;o.classList.contains("hide-icon")?(o.classList.remove("hide-icon"),i=0):(o.classList.add("hide-icon"),i=1),document.getElementsByClassName(e)[0].style.opacity=i.toString(),a=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({imageOpacity:100*i}),s()}),t.addEventListener("input",s),t.addEventListener("change",s),t.disabled=!1}(t),g(),document.getElementById("burgerMenu").addEventListener("click",()=>{document.getElementById("burgerMenu").classList.toggle("is-active"),document.getElementById("navMenu").classList.toggle("is-active")}),document.body.addEventListener("keydown",e=>{if(!e.metaKey)switch(e.key){case"q":d("staff");break;case"w":d("syllable");break;case"e":d("neume");break;case"r":d("layerElement");break;case"t":d("selection");break;case"y":d("none")}}),function(){const e=document.querySelector("#display-all-btn");e.addEventListener("click",()=>{if(e.classList.contains("selected")){e.classList.remove("selected"),e.innerHTML="Display All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked&&e.click()})}else{e.classList.add("selected"),e.innerHTML="Hide All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked||e.click()})}})}(),p();const n=document.getElementById("displayContents"),i=document.getElementById("toggleDisplay");document.getElementById("displayHeader").addEventListener("click",e=>{e.stopPropagation(),n.classList.contains("closed")?(n.classList.remove("closed"),n.style.padding="0.5em 0.75em",setTimeout(()=>{n.style.overflow="visible"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(n.classList.add("closed"),n.style.overflow="hidden",setTimeout(()=>{n.style.padding="0px"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.triggerDefaultActions=t.triggerDefaultSylActions=t.triggerBBoxActions=t.triggerSingleStaffActions=t.triggerStaffSplitMode=t.triggerMultiStaffActions=t.triggerLayerElementActions=t.triggerSyllableActions=t.triggerNeumeActions=t.triggerNcActions=t.addChangeStaffListener=t.addAddSylListener=t.matchHeightHandler=t.moveOutsideSyllableHandler=t.insertToSyllableHandler=t.changeStaffHandler=t.removeHandler=t.endOptionsSelection=t.deleteButtonHandler=t.unsetLiquescentAnticlockwiseAction=t.unsetLiquescentClockwiseAction=t.unsetVirgaReversedAction=t.unsetVirgaAction=t.unsetInclinatumAction=t.initNeonView=void 0;const i=n(8),r=n(24),s=n(3),o=n(35),a=n(36),c=n(5),l=n(9);let u;function d(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function h(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function f(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function g(e){return{action:"set",param:{elementId:e,attrType:"curve",attrValue:""}}}function p(e){return{action:"setLiquescent",param:{elementId:e,curve:""}}}function m(e){"d"!==e.key&&"Backspace"!==e.key||(y(),e.preventDefault())}function v(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden")),document.body.removeEventListener("keydown",m)}function y(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{t.classList.contains("syl")&&(t=t.closest(".syllable")),t.classList.contains("accid")&&(t=t.closest(".accid")),t.classList.contains("divLine")&&(t=t.closest(".divLine")),e.push({action:"remove",param:{elementId:t.id}})});const t={action:"chain",param:e};v(),u.edit(t,u.view.getCurrentPageURI()).then(()=>{u.updateForCurrentPage()})}function b(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"changeStaff",param:{elementId:t.id}})});const t={action:"chain",param:e};v(),u.edit(t,u.view.getCurrentPageURI()).then(()=>{u.updateForCurrentPage()})}function w(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"insertToSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Insert Success","success"):s.default.queueNotification("Insert Failed XoX","error"),v(),u.updateForCurrentPage()})}function _(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"moveOutsideSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Move Success","success"):s.default.queueNotification("Move Failed XoX","error"),v(),u.updateForCurrentPage()})}function E(){const e=Array.from(document.getElementsByClassName("selected"));e.length>1&&s.default.queueNotification("Cannot match height to multiple bbox","error");const t={action:"matchHeight",param:{elementId:e[0].id}};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Height Match Success","success"):s.default.queueNotification("Height Match Failed XoX","error"),v(),u.updateForCurrentPage()})}function S(){const e=u.modal;e.setModalWindowView(l.ModalWindowView.ADD_TEXT),e.openModalWindow()}function x(){const e=document.getElementById("delete");e&&(e.removeEventListener("click",y),e.addEventListener("click",y),document.body.addEventListener("keydown",m))}function L(){const e=document.getElementById("changeStaff");null==e||e.removeEventListener("click",b),null==e||e.addEventListener("click",b)}function A(){const e=document.getElementById("col-input"),t=document.querySelectorAll(".staff.selected");let n;for(const e of t){const t=Array.from(e.classList).join(" ").match(/\bcolumn(\d+)\b/);if(t){const e=parseInt(t[1],10);if(n&&n!=e){document.getElementById("col-warning").innerText="The selected staves are not of the same column!",n=0;break}n=e}}n&&(e.value=n.toString())}function k(){const e=document.getElementById("col-decrement"),t=document.getElementById("col-increment"),n=document.getElementById("col-confirm"),i=document.getElementById("col-input");function r(e){let t=parseInt(i.value,10)||0;t+=e,t=Math.min(Math.max(t,1),5),t.toString()!=i.value&&(n.style.display=""),i.value=t.toString()}e.addEventListener("click",(function(){r(-1)})),t.addEventListener("click",(function(){r(1)})),n.addEventListener("click",(function(){const e=[];document.querySelectorAll(".staff.selected").forEach(t=>{e.push({action:"set",param:{elementId:t.id,attrType:"type",attrValue:"column"+i.value}})});const t={action:"chain",param:e};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Column Value Update Success","success"):s.default.queueNotification("Column Value Update Failed XoX","error"),v(),u.updateForCurrentPage()})}))}function C(e,t,n=!0){const i=document.getElementById(e);i&&(i.parentElement.classList.remove("hidden"),n?i.innerHTML=t:i.innerHTML+=t)}function I(e){u.edit(e,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}function P(){const e=document.querySelector(".staff.selected");if(null!==e){new o.SplitStaffHandler(u,e).startSplit(),v()}else console.error("No staff was selected!"),v()}function O(){document.querySelectorAll(".drop_select").forEach(e=>{const t=()=>{document.body.removeEventListener("click",t),e.classList.remove("is-active")};e.addEventListener("click",n=>{e.classList.toggle("is-active"),Array.from(document.querySelectorAll(".drop_select")).filter(t=>t!==e).forEach(e=>e.classList.remove("is-active")),n.stopPropagation(),e.classList.contains("is-active")?document.body.addEventListener("click",t):document.body.removeEventListener("click",t)})})}t.initNeonView=function(e){u=e,r.initNeonView(e)},t.unsetInclinatumAction=d,t.unsetVirgaAction=h,t.unsetVirgaReversedAction=f,t.unsetLiquescentClockwiseAction=g,t.unsetLiquescentAnticlockwiseAction=p,t.deleteButtonHandler=m,t.endOptionsSelection=v,t.removeHandler=y,t.changeStaffHandler=b,t.insertToSyllableHandler=w,t.moveOutsideSyllableHandler=_,t.matchHeightHandler=E,t.addAddSylListener=function(){const e=document.getElementById("addSyl");null==e||e.removeEventListener("click",S),null==e||e.addEventListener("click",S)},t.addChangeStaffListener=L,t.triggerNcActions=function(e){v(),C("moreEdit",i.defaultActionContents),C("extraEdit",i.ncActionContents),x(),document.querySelector("#Punctum.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=h(e.id),i=f(e.id),r=g(e.id),o=p(e.id);u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#Inclinatum.dropdown-item").addEventListener("click",()=>{const t=h(e.id),n=f(e.id),i=g(e.id),r=p(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"se"}};u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#Virga.dropdown-item").addEventListener("click",()=>{const t=f(e.id),n=d(e.id),i=g(e.id),r=p(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"s"}};u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#VirgaReversed.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=h(e.id),i=g(e.id),r=p(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"n"}};u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#LiquescentClockwise.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=h(e.id),i=f(e.id),r=p(e.id),o={action:"setLiquescent",param:{elementId:e.id,curve:"c"}};u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#LiquescentAnticlockwise.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=h(e.id),i=f(e.id),r=g(e.id),o={action:"setLiquescent",param:{elementId:e.id,curve:"a"}};u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),O()},t.triggerNeumeActions=function(){v(),C("moreEdit",i.defaultNeumeActionContents),C("extraEdit",i.neumeActionContents),x();const e=document.querySelectorAll(".selected");function t(t){const n={action:"changeGroup",param:{elementId:e[0].id,contour:t}};u.edit(n,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Grouping Changed","success"):s.default.queueNotification("Grouping Failed","error"),v(),u.updateForCurrentPage()})}1===e.length?(document.getElementById("split-neume").addEventListener("click",()=>{const e=document.querySelector(".neume.selected");if(null!==e){new a.SplitNeumeHandler(u,e).startSplit(),v()}else console.error("No staff was selected!"),v()}),document.querySelector("#Pes.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#PesSubpunctis.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Clivis.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Scandicus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusFlexus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusSubpunctis.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Climacus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#ClimacusResupinus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Torculus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#TorculusResupinus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Porrectus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusFlexus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusSubpunctis.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Pressus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),O()):console.warn("More than one neume selected! Cannot trigger Neume ClickSelect actions.")},t.triggerSyllableActions=function(e){v(),C("moreEdit",i.syllableActionsContent);let t="";switch(e){case"noSyl":t+='
\n Add Syllable Text \n Delete \n
';break;case"singleSelect":t+='
\n Ungroup \n Re-associate to nearest staff \n Delete \n
';break;case"linkableSelect":t+='
\n Toggle Linked Syllables \n Re-associate to nearest staff \n Delete \n
';break;case"multiSelect":t+='
\n Merge Syllables \n Re-associate to nearest staff \n Delete \n
';break;case"default":t+='
\n Re-associate to nearest staff \n Delete \n
'}C("moreEdit",t,!0),L(),x(),r.initGroupingListeners()},t.triggerLayerElementActions=function(e){var t,n,r,o;if(v(),e.classList.contains("custos"))return C("moreEdit",i.custosActionContents),L(),void x();C("moreEdit",e.parentElement.classList.contains("syllable")?i.layerElementInActionContents:i.layerElementOutActionContents,!1),e.classList.contains("accid")?(C("extraEdit",i.accidActionContents),function(e){document.querySelector("#ChangeToFlat.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"f"}})}),document.querySelector("#ChangeToNatural.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"n"}})}),O()}(e)):e.classList.contains("clef")?(C("extraEdit",i.clefActionContents),function(e){document.querySelector("#increment-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"above"}};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Clef octave incremented.","success"):s.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#decrement-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"below"}};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Clef octave decremented.","success"):s.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#CClef.dropdown-item").addEventListener("click",()=>{I({action:"setClef",param:{elementId:e.id,shape:"C"}})}),document.querySelector("#FClef.dropdown-item").addEventListener("click",()=>{I({action:"setClef",param:{elementId:e.id,shape:"F"}})}),O()}(e)):e.classList.contains("divLine")&&(C("extraEdit",i.divLineActionContents),function(e){document.querySelector("#ChangeToMinima.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"minima"}})}),document.querySelector("#ChangeToMaior.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maior"}})}),document.querySelector("#ChangeToMaxima.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maxima"}})}),document.querySelector("#ChangeToFinalis.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"finalis"}})}),document.querySelector("#ChangeToCaesura.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"caesura"}})}),document.querySelector("#ChangeToVirgula.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"virgula"}})}),O()}(e)),L(),null===(t=document.getElementById("insertToSyllable"))||void 0===t||t.addEventListener("click",w),null===(n=document.getElementById("moveOutsideSyllable"))||void 0===n||n.addEventListener("click",_),x(),L(),null===(r=document.getElementById("insertToSyllable"))||void 0===r||r.addEventListener("click",w),null===(o=document.getElementById("moveOutsideSyllable"))||void 0===o||o.addEventListener("click",_)},t.triggerMultiStaffActions=function(){v(),C("moreEdit",i.staffMergeActionContents),C("extraEdit",i.columnActionContents),x(),A(),k(),document.getElementById("merge-systems").addEventListener("click",()=>{r.mergeStaves()})},t.triggerStaffSplitMode=P,t.triggerSingleStaffActions=function(){v(),C("moreEdit",i.staffSplitActionContents),C("extraEdit",i.columnActionContents),x(),A(),k(),document.getElementById("split-system").addEventListener("click",()=>{P()}),document.getElementById("reset-rotate").addEventListener("click",()=>{const e=document.querySelector(".staff.selected"),t=(0,c.getStaffBBox)(e),n=Math.tan(t.rotate)*(t.lrx-t.ulx);if(null!==e){const i={action:"resizeRotate",param:{elementId:e.id,ulx:t.ulx,uly:t.rotate>0?t.uly+n/2:t.uly-n/2,lrx:t.lrx,lry:t.rotate>0?t.lry-n/2:t.lry+n/2,rotate:0}};u.edit(i,u.view.getCurrentPageURI()).then(async e=>{e&&await u.updateForCurrentPage()}),v()}else console.error("No staff was selected"),v()})},t.triggerBBoxActions=function(){v(),C("moreEdit",i.bboxActionContents),x(),document.getElementById("matchHeight").addEventListener("click",()=>{E()})},t.triggerDefaultSylActions=function(){v(),C("moreEdit",i.defaultSylActionContents),x(),L()},t.triggerDefaultActions=function(){v(),C("moreEdit",i.defaultActionContents),x()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getGlyphBBox=t.isOutOfSVGBounds=t.getStaffByCoords=t.getStaffIdByCoords=t.getSVGRelCoords=void 0;const i=n(5);function r(e,t){const n=new DOMPoint(e,t),i=document.querySelector(".active-page > .definition-scale").querySelector(".page-margin"),{x:r,y:s}=n.matrixTransform(i.getScreenCTM().inverse());return{x:r,y:s}}function s(e,t){const n=Array.from(document.querySelectorAll(".staff")).map(e=>(0,i.getStaffBBox)(e)),{x:s,y:o}=r(e,t),a=n.find(e=>s<=e.lrx&&s>=e.ulx&&o<=e.lry&&o>=e.uly);return a?a.id:null}t.getSVGRelCoords=r,t.getStaffIdByCoords=s,t.getStaffByCoords=function(e,t){const n=s(e,t);return document.querySelector("#"+n)},t.isOutOfSVGBounds=function(e,t){const n=document.querySelector("#bgimg");return e<=0||e>=Number(n.getAttribute("width"))||t<=0||t>=Number(n.getAttribute("height"))},t.getGlyphBBox=function(e){const t="rect"==e.tagName?e.getBBox():e.parentNode.getBBox();return{ulx:t.x,uly:t.y,lrx:t.x+t.width,lry:t.y+t.height}}},function(e,t,n){e.exports=function(e){"use strict";var t=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function n(e,t){var n=e[0],i=e[1],r=e[2],s=e[3];i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[0]-680876936|0)<<7|n>>>25)+i|0)&i|~n&r)+t[1]-389564586|0)<<12|s>>>20)+n|0)&n|~s&i)+t[2]+606105819|0)<<17|r>>>15)+s|0)&s|~r&n)+t[3]-1044525330|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[4]-176418897|0)<<7|n>>>25)+i|0)&i|~n&r)+t[5]+1200080426|0)<<12|s>>>20)+n|0)&n|~s&i)+t[6]-1473231341|0)<<17|r>>>15)+s|0)&s|~r&n)+t[7]-45705983|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[8]+1770035416|0)<<7|n>>>25)+i|0)&i|~n&r)+t[9]-1958414417|0)<<12|s>>>20)+n|0)&n|~s&i)+t[10]-42063|0)<<17|r>>>15)+s|0)&s|~r&n)+t[11]-1990404162|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[12]+1804603682|0)<<7|n>>>25)+i|0)&i|~n&r)+t[13]-40341101|0)<<12|s>>>20)+n|0)&n|~s&i)+t[14]-1502002290|0)<<17|r>>>15)+s|0)&s|~r&n)+t[15]+1236535329|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[1]-165796510|0)<<5|n>>>27)+i|0)&r|i&~r)+t[6]-1069501632|0)<<9|s>>>23)+n|0)&i|n&~i)+t[11]+643717713|0)<<14|r>>>18)+s|0)&n|s&~n)+t[0]-373897302|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[5]-701558691|0)<<5|n>>>27)+i|0)&r|i&~r)+t[10]+38016083|0)<<9|s>>>23)+n|0)&i|n&~i)+t[15]-660478335|0)<<14|r>>>18)+s|0)&n|s&~n)+t[4]-405537848|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[9]+568446438|0)<<5|n>>>27)+i|0)&r|i&~r)+t[14]-1019803690|0)<<9|s>>>23)+n|0)&i|n&~i)+t[3]-187363961|0)<<14|r>>>18)+s|0)&n|s&~n)+t[8]+1163531501|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[13]-1444681467|0)<<5|n>>>27)+i|0)&r|i&~r)+t[2]-51403784|0)<<9|s>>>23)+n|0)&i|n&~i)+t[7]+1735328473|0)<<14|r>>>18)+s|0)&n|s&~n)+t[12]-1926607734|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[5]-378558|0)<<4|n>>>28)+i|0)^i^r)+t[8]-2022574463|0)<<11|s>>>21)+n|0)^n^i)+t[11]+1839030562|0)<<16|r>>>16)+s|0)^s^n)+t[14]-35309556|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[1]-1530992060|0)<<4|n>>>28)+i|0)^i^r)+t[4]+1272893353|0)<<11|s>>>21)+n|0)^n^i)+t[7]-155497632|0)<<16|r>>>16)+s|0)^s^n)+t[10]-1094730640|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[13]+681279174|0)<<4|n>>>28)+i|0)^i^r)+t[0]-358537222|0)<<11|s>>>21)+n|0)^n^i)+t[3]-722521979|0)<<16|r>>>16)+s|0)^s^n)+t[6]+76029189|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[9]-640364487|0)<<4|n>>>28)+i|0)^i^r)+t[12]-421815835|0)<<11|s>>>21)+n|0)^n^i)+t[15]+530742520|0)<<16|r>>>16)+s|0)^s^n)+t[2]-995338651|0)<<23|i>>>9)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[0]-198630844|0)<<6|n>>>26)+i|0)|~r))+t[7]+1126891415|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[14]-1416354905|0)<<15|r>>>17)+s|0)|~n))+t[5]-57434055|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[12]+1700485571|0)<<6|n>>>26)+i|0)|~r))+t[3]-1894986606|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[10]-1051523|0)<<15|r>>>17)+s|0)|~n))+t[1]-2054922799|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[8]+1873313359|0)<<6|n>>>26)+i|0)|~r))+t[15]-30611744|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[6]-1560198380|0)<<15|r>>>17)+s|0)|~n))+t[13]+1309151649|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[4]-145523070|0)<<6|n>>>26)+i|0)|~r))+t[11]-1120210379|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[2]+718787259|0)<<15|r>>>17)+s|0)|~n))+t[9]-343485551|0)<<21|i>>>11)+r|0,e[0]=n+e[0]|0,e[1]=i+e[1]|0,e[2]=r+e[2]|0,e[3]=s+e[3]|0}function i(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return n}function r(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24);return n}function s(e){var t,r,s,o,a,c,l=e.length,u=[1732584193,-271733879,-1732584194,271733878];for(t=64;t<=l;t+=64)n(u,i(e.substring(t-64,t)));for(r=(e=e.substring(t-64)).length,s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;t
>2]|=e.charCodeAt(t)<<(t%4<<3);if(s[t>>2]|=128<<(t%4<<3),t>55)for(n(u,s),t=0;t<16;t+=1)s[t]=0;return o=(o=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(o[2],16),c=parseInt(o[1],16)||0,s[14]=a,s[15]=c,n(u,s),u}function o(e){var n,i="";for(n=0;n<4;n+=1)i+=t[e>>8*n+4&15]+t[e>>8*n&15];return i}function a(e){var t;for(t=0;tu?new ArrayBuffer(0):(r=u-l,s=new ArrayBuffer(r),o=new Uint8Array(s),a=new Uint8Array(this,l,r),o.set(a),s)}}(),u.prototype.append=function(e){return this.appendBinary(c(e)),this},u.prototype.appendBinary=function(e){this._buff+=e,this._length+=e.length;var t,r=this._buff.length;for(t=64;t<=r;t+=64)n(this._hash,i(this._buff.substring(t-64,t)));return this._buff=this._buff.substring(t-64),this},u.prototype.end=function(e){var t,n,i=this._buff,r=i.length,s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;t>2]|=i.charCodeAt(t)<<(t%4<<3);return this._finish(s,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},u.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},u.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},u.prototype.setState=function(e){return this._buff=e.buff,this._length=e.length,this._hash=e.hash,this},u.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},u.prototype._finish=function(e,t){var i,r,s,o=t;if(e[o>>2]|=128<<(o%4<<3),o>55)for(n(this._hash,e),o=0;o<16;o+=1)e[o]=0;i=(i=8*this._length).toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(i[2],16),s=parseInt(i[1],16)||0,e[14]=r,e[15]=s,n(this._hash,e)},u.hash=function(e,t){return u.hashBinary(c(e),t)},u.hashBinary=function(e,t){var n=a(s(e));return t?l(n):n},u.ArrayBuffer=function(){this.reset()},u.ArrayBuffer.prototype.append=function(e){var t,i,s,o,a,c=(i=this._buff.buffer,s=e,o=!0,(a=new Uint8Array(i.byteLength+s.byteLength)).set(new Uint8Array(i)),a.set(new Uint8Array(s),i.byteLength),o?a:a.buffer),l=c.length;for(this._length+=e.byteLength,t=64;t<=l;t+=64)n(this._hash,r(c.subarray(t-64,t)));return this._buff=t-64>2]|=i[t]<<(t%4<<3);return this._finish(s,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},u.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},u.ArrayBuffer.prototype.getState=function(){var e,t=u.prototype.getState.call(this);return t.buff=(e=t.buff,String.fromCharCode.apply(null,new Uint8Array(e))),t},u.ArrayBuffer.prototype.setState=function(e){return e.buff=function(e,t){var n,i=e.length,r=new ArrayBuffer(i),s=new Uint8Array(r);for(n=0;n>2]|=e[t]<<(t%4<<3);if(s[t>>2]|=128<<(t%4<<3),t>55)for(n(u,s),t=0;t<16;t+=1)s[t]=0;return o=(o=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(o[2],16),c=parseInt(o[1],16)||0,s[14]=a,s[15]=c,n(u,s),u}(new Uint8Array(e)));return t?l(i):i},u}()},function(e,t,n){"use strict";function i(e){if(16!==e.length)return"";function t(e,t){return e+t.toString(16).padStart(2,"0")}return e.slice(0,4).reduce(t,"")+"-"+e.slice(4,6).reduce(t,"")+"-"+e.slice(6,8).reduce(t,"")+"-"+e.slice(8,10).reduce(t,"")+"-"+e.slice(10).reduce(t,"")}Object.defineProperty(t,"__esModule",{value:!0}),t.uuidv4=void 0,t.uuidv4=function(){if(void 0===window.crypto)return i(new Uint8Array(16));const e=new Uint8Array(16),t=Uint8Array.from([parseInt("01000000",2),parseInt("10000000",2),parseInt("00001111",2),parseInt("00111111",2)]);return window.crypto.getRandomValues(e),e[6]=e[6]&t[2]|t[0],e[8]=e[8]&t[3]|t[1],i(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setGroupingHighlight=t.setStaffHighlight=t.highlight=t.unsetGroupingHighlight=t.unsetStaffHighlight=t.unhighlight=void 0;const i=["rgb(230, 159, 0)","rgb(86, 180, 233)","rgb(0, 158, 115)","rgb(240, 228, 66)","rgb(0, 114, 178)","rgb(213, 94, 0)","rgb(204, 121, 167)"];function r(e){let t;t=e?e.querySelectorAll(":not(.selected) .highlighted"):document.querySelectorAll(":not(.selected) .highlighted"),t.forEach(e=>{if("path"!==e.tagName||e.closest(".staff").classList.contains("selected"))if(e.classList.contains("divLine")&&!e.closest(".staff").classList.contains("selected"))e.setAttribute("stroke","#000000");else{e.removeAttribute("fill");let t=e.querySelectorAll(".sylTextRect-display");if(!t.length)try{t=e.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(e){t=[]}t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")}))}else e.setAttribute("stroke","#000000");e.classList.remove("highlighted")})}function s(){r()}function o(){s();Array.from(document.getElementsByClassName("highlighted")).filter(e=>!e.parentElement.classList.contains("selected")).forEach(e=>{e.setAttribute("#d00",null);let t=e.querySelectorAll(".sylTextRect-display");t.length||null!==e.closest(".syllable")&&(t=e.closest(".syllable").querySelectorAll("sylTextRect-display")),t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")})),e.classList.remove("highlighted"),e.querySelectorAll("sylTextRect-display").forEach(e=>{e.classList.remove("highlighted")})}),Array.from(document.getElementsByClassName("selected")).forEach(e=>{e.setAttribute("fill","")})}function a(e,t){const n=Array.from(e.children);for(let e=0;ee.querySelectorAll(".divLine")).forEach(e=>{n.push(e)});else{if(i.classList.contains("resizePoint")||"resizeRect"===i.id||i.classList.contains("rotatePoint"))return;if(i.classList.contains("layer"))Array.from(i.children).forEach(e=>{n.push(e)});else if(document.getElementsByClassName("highlight-selected").length&&"highlight-neume"===document.getElementsByClassName("highlight-selected")[0].id&&i.classList.contains("syllable"))Array.from(i.children).filter(e=>e.classList.contains("neume")).forEach(e=>{n.push(e)});else{i.setAttribute("fill",t);let e=i.querySelectorAll(".sylTextRect-display");if(!e.length)try{e=i.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(t){e=[]}e.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||(e.style.fill=t,e.classList.add("highlighted"))}))}}i.classList.add("highlighted")}let i;i="30px",e.querySelectorAll(".nc, .custos, .clef, .accid").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width",i)})}function c(){const e=Array.from(document.getElementsByClassName("staff"));for(let t=0;t{const n=Array.from(t.classList).join(" ").match(/\bcolumn(\d+)\b/);let i=0;n&&(i=parseInt(n[1],10)-1),e[i]||(e[i]=[]),e[i].push(t)});for(const[t,n]of Object.entries(e)){const e=i[Number(t)%i.length];for(const t of n)a(t,e)}}();if("selection"===t){switch(document.querySelector(".sel-by.is-active").id){case"selBySyllable":case"selByBBox":t="syllable";break;case"selByColumn":t="column";break;case"selByStaff":t="staff";break;case"selByLayerElement":t="layerElement";break;case"selByNeume":default:t="neume"}return void e(t)}let n;n="layerElement"==t?document.querySelectorAll(".accid, .clef, .custos, .divLine"):document.getElementsByClassName(t),document.querySelectorAll(".nc, .custos, .clef, .accid, .divLine").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width","30px")});for(let e=0;e{e.classList.add("highlighted")})}const r=n[e].querySelectorAll(".divLine");if(r)for(let e=0;e=0;s--)o=0===s?"":",",t.push({obj:i[s],prefix:o});t.push({val:"["})}else{for(c in a=[],i)i.hasOwnProperty(c)&&a.push(c);for(t.push({val:"}"}),s=a.length-1;s>=0;s--)u=i[l=a[s]],d=s>0?",":"",d+=JSON.stringify(l)+":",t.push({obj:u,prefix:d});t.push({val:"{"})}return h},t.parse=function(e){for(var t,n,r,s,o,a,c,l,u,d=[],h=[],f=0;;)if("}"!==(t=e[f++])&&"]"!==t&&void 0!==t)switch(t){case" ":case"\t":case"\n":case":":case",":break;case"n":f+=3,i(null,d,h);break;case"t":f+=3,i(!0,d,h);break;case"f":f+=4,i(!1,d,h);break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"-":for(n="",f--;;){if(r=e[f++],!/[\d\.\-e\+]/.test(r)){f--;break}n+=r}i(parseFloat(n),d,h);break;case'"':for(s="",o=void 0,a=0;'"'!==(c=e[f++])||"\\"===o&&a%2==1;)s+=c,"\\"===(o=c)?a++:a=0;i(JSON.parse('"'+s+'"'),d,h);break;case"[":l={element:[],index:d.length},d.push(l.element),h.push(l);break;case"{":u={element:{},index:d.length},d.push(u.element),h.push(u);break;default:throw new Error("unexpectedly reached end of input: "+t)}else{if(1===d.length)return d.pop();i(d.pop(),d,h)}}},function(e,t,n){"use strict";var i=n(20),r=n(11);t.a=function(e,t,n){var s=(e=e||{}).random||(e.rng||i.a)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t){n=n||0;for(var o=0;o<16;++o)t[n+o]=s[o];return t}return Object(r.a)(s)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(7),r=n(15),s=n(3),o=n(5);t.default=class{constructor(e,t){this.dragStartCoords=[-1,-1],this.neonView=e,this.selector=t}dragInit(){const e=i.drag().on("start",function(){this.dragStartCoords=[i.event.x,i.event.y],this.dx=0,this.dy=0,i.event.sourceEvent.target.classList.contains("staff")&&i.select(this.selector).call(e)}.bind(this)).on("drag",this.dragging.bind(this)).on("end",this.dragEnded.bind(this));i.selectAll(".selected").call(e);let t=Array.from(document.querySelectorAll(".selected"));this.noMovePrecedes=t.filter(e=>e.classList.contains("no-moving")&&e.hasAttribute("mei:precedes")),t=t.filter(e=>!e.classList.contains("no-moving")),this.selection=t.concat(Array.from(document.querySelectorAll(".resizePoint")))}dragging(){this.dx=i.event.x-this.dragStartCoords[0],this.dy=i.event.y-this.dragStartCoords[1],this.moveElements(this.selection,this.dx,this.dy);if(0===this.selection.filter(e=>e.classList.contains("syl")).length&&0===this.noMovePrecedes.length){const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));this.moveElements(e,-this.dx,-this.dy)}}dragEnded(){const e=Math.abs(this.dx),t=Math.abs(this.dy);if(e<=5&&t<=5)return this.reset(),void this.dragInit();const n=this.selection.filter(e=>!e.classList.contains("resizePoint"));if(this.isCursorOutOfBounds()||this.isDragOutOfBounds(n)){this.returnElements(this.selection);const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));return this.returnElements(e),this.reset(),this.dragInit(),(0,s.queueNotification)("[FAIL] Glyphs were placed out of bounds! Drag action failed.","error")}const i=[];n.forEach(e=>{const t={action:"drag",param:{elementId:"rect"===e.tagName?e.closest(".syl").id:e.id,x:this.dx,y:-this.dy}};i.push(t)});const r={action:"chain",param:i};this.neonView.edit(r,this.neonView.view.getCurrentPageURI()).then(async()=>{const e=Array.from(document.querySelectorAll(".selected")).filter(e=>!e.classList.contains("no-moving")).map(e=>e.id);await this.neonView.updateForCurrentPage(),this.endOptionsSelection(),this.reset(),await this.reselect(e),this.dragInit()})}async reselect(e){const t=e.map(e=>document.querySelector("#"+e));t.filter(e=>!e.classList.contains("syl")).forEach(async()=>await(0,o.selectAll)(t,this.neonView,this)),t.filter(e=>e.classList.contains("syl")).forEach(e=>(0,o.selectBBox)(e.querySelector(".sylTextRect-display"),this,this.neonView)),t.filter(e=>e.classList.contains("staff")).forEach(e=>(0,o.selectStaff)(e,this))}resetTo(e){this.resetToAction=e}reset(){void 0!==this.resetToAction&&i.select(this.selector).call(this.resetToAction)}endOptionsSelection(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden"))}moveElements(e,t,n){e.filter(e=>null!==e).forEach(e=>{e.setAttribute("transform",`translate(${t},${n})`)})}returnElements(e){e.filter(e=>null!==e).forEach(e=>{e.removeAttribute("transform")})}isCursorOutOfBounds(){const e=this.dragStartCoords[0]+this.dx,t=this.dragStartCoords[1]+this.dy;return(0,r.isOutOfSVGBounds)(e,t)}isDragOutOfBounds(e){let t=document.querySelector("#displayBBox").checked?"use, rect":"use";e[0].classList.contains("staff")&&(t="path");const n=e.reduce((e,n)=>e.concat(...n.querySelectorAll(t)),[]).map(r.getGlyphBBox).reduce((e,t)=>({ulx:Math.min(e.ulx,t.ulx),uly:Math.min(e.uly,t.uly),lrx:Math.max(e.lrx,t.lrx),lry:Math.max(e.lry,t.lry)}),{ulx:Number.MAX_VALUE,uly:Number.MAX_VALUE,lrx:Number.MIN_VALUE,lry:Number.MIN_VALUE}),{ulx:i,uly:s,lrx:o,lry:a}=n;return(0,r.isOutOfSVGBounds)(i+this.dx,s+this.dy)||(0,r.isOutOfSVGBounds)(o+this.dx,a+this.dy)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initGroupingListeners=t.endGroupingSelection=t.triggerGrouping=t.mergeStaves=t.isLinkable=t.canBeLinked=t.isLinked=t.isGroupable=t.initNeonView=void 0;const i=n(8),r=n(34),s=n(3),o=n(5),a=n(14),c=n(14);let l;function u(e,t){if(Array.from(t.values()).length<2)return!1;switch(e){case"selByNeume":if(o.sharedLogicalParent(e,t))return!1;default:return!!o.areAdjacent(e,t)}}function d(e,t){switch(t||(t=Array.from(document.querySelectorAll(".selected"))),e){case"selBySyllable":for(const e of t)if(e.hasAttribute("mei:follows")||e.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNeume":for(const e of t)if(e.parentElement.hasAttribute("mei:follows")||e.parentElement.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNc":for(const e of t)if(e.parentElement.parentElement.hasAttribute("mei:follows")||e.parentElement.parentElement.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1}}function h(e){for(const t of e)if(!t.hasAttribute("mei:precedes")&&!t.hasAttribute("mei:follows"))return!1;return!0}function f(e){e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1});const t=Array.from(document.querySelectorAll(".staff")),n=Array.from(document.querySelectorAll(".syllable"));for(let i=0;i!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));const i=e.filter(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(1!==i.length)return!1;const r=i[0];return 0===e.indexOf(r)||e.indexOf(r)===e.length-1}function g(e,t){return!(t.length<2)&&("selBySyllable"===e&&(function(e){e.sort((e,t)=>e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING?-1:e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING?1:0);for(let t=0;te.id===i&&(r=t,!0));if(!s)return!0;if(!s.hasAttribute("mei:follows"))return!0;if(s.getAttribute("mei:follows")!="#"+n.id)return!0;if(r!==t+1)return!0}if(n.hasAttribute("mei:follows")){const t=n.getAttribute("mei:follows").replace("#",""),i=e.find(e=>e.id===t);if(!i)return!0;if(!i.hasAttribute("mei:precedes"))return!0;if(i.getAttribute("mei:precedes")!="#"+n.id)return!0}return!1}}(t)?(s.queueNotification("The selected syllables include invalid linked syllable(s)!","warning"),!1):!!h(t)||!!f(t)))}function p(){const e=document.querySelectorAll(".staff.selected"),t=[];e.forEach(e=>{t.push(e.id)});const n={action:"merge",param:{elementIds:t}};l.edit(n,l.view.getCurrentPageURI()).then(e=>{e?(s.queueNotification("Staff Merged","success"),a.endOptionsSelection(),l.updateForCurrentPage()):s.queueNotification("Merge Failed","error")})}function m(){const e=document.getElementById("moreEdit");e.innerHTML="",e.parentElement.classList.add("hidden"),document.body.removeEventListener("keydown",c.deleteButtonHandler),document.body.removeEventListener("keydown",y)}function v(){const e=document.getElementById("delete");e.removeEventListener("click",c.removeHandler),e.addEventListener("click",c.removeHandler),document.body.addEventListener("keydown",c.deleteButtonHandler),document.body.addEventListener("keydown",y);try{document.getElementById("mergeSyls").addEventListener("click",()=>{if(d(o.getSelectionType()))return;b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNeumes").addEventListener("click",()=>{if(d(o.getSelectionType()))return;b("group","neume",E().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNcs").addEventListener("click",()=>{b("group","nc",E().filter(e=>document.getElementById(e).classList.contains("nc")))})}catch(e){}try{document.getElementById("ungroupNeumes").addEventListener("click",()=>{b("ungroup","neume",S())})}catch(e){}try{document.getElementById("ungroupNcs").addEventListener("click",()=>{b("ungroup","nc",S())})}catch(e){}try{document.getElementById("toggle-ligature").addEventListener("click",async()=>{const e={action:"toggleLigature",param:{elementIds:E()}};l.edit(e,l.view.getCurrentPageURI()).then(e=>{e?s.queueNotification("Ligature Toggled","success"):s.queueNotification("Ligature Toggle Failed","error"),m(),l.updateForCurrentPage()})})}catch(e){}try{document.getElementById("toggle-link").addEventListener("click",()=>{_()})}catch(e){}}t.initNeonView=function(e){l=e},t.isGroupable=u,t.isLinked=h,t.canBeLinked=f,t.isLinkable=g,t.mergeStaves=p,t.triggerGrouping=function(e){const t=document.getElementById("moreEdit");t.parentElement.classList.remove("hidden"),t.innerHTML+=i.groupingMenu[e],v()},t.endGroupingSelection=m,t.initGroupingListeners=v;const y=function(e){if("g"===e.key){const e=Array.from(document.querySelectorAll(".selected"));if(0==e.length)return;const t=o.getSelectionType();if(d(t,e))return;switch(t){case"selBySyllable":if(g(t,e))_();else if(u(t,e)){b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))}else if(1===e.length){b("ungroup","neume",S())}break;case"selByNeume":if(u(t,e)){b("group","neume",E())}else{b("ungroup","nc",S())}break;case"selByNc":if(u(t,e)){b("group","nc",E())}else{b("ungroup","nc",S())}break;case"selByStaff":u(t,e)?p():a.triggerStaffSplitMode();break;default:return void console.error(`Can't perform grouping/ungrouping action on selection type ${t}.`)}}};function b(e,t,n){const i={action:e,param:{groupType:t,elementIds:n}};l.edit(i,l.view.getCurrentPageURI()).then(i=>{if(i?"group"===e?s.queueNotification("Grouping Success","success"):s.queueNotification("Ungrouping Success","success"):"group"===e?s.queueNotification("Grouping Failed","error"):s.queueNotification("Ungrouping Failed","error"),l.updateForCurrentPage(),"nc"===t){const e=document.getElementById(n[0]).parentElement,t=Array.from(e.children);void 0===l.info.getContour(t)&&r.groupingNotRecognized()}m()})}function w(e){const t=document.getElementById(e);return t instanceof SVGGraphicsElement?t:null}function _(){const e=E(),t={action:"chain",param:[]},n=new Array,i=e.map(w).filter(e=>null!==e);if(h(i))n.push(...function(e){const t=new Array;for(const n of e){const e=document.getElementById(n);e.getAttribute("mei:precedes")&&t.push({action:"set",param:{elementId:n,attrType:"precedes",attrValue:""}}),e.getAttribute("mei:follows")&&(t.push({action:"set",param:{elementId:n,attrType:"follows",attrValue:""}}),t.push({action:"setText",param:{elementId:n,text:""}}))}return t}(e));else{const[e,t]=function(e){if(e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}),2===e.length)return[e[0],e[1]];const t=e.find(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(t){const n=e.indexOf(t);if(0===n)return[e[n],e[n+1]];if(n===e.length-1)return[e[n-1],e[n]]}}(i);console.log(e.id,t.id),n.push({action:"set",param:{elementId:e.id,attrType:"precedes",attrValue:"#"+t.id}}),n.push({action:"set",param:{elementId:t.id,attrType:"follows",attrValue:"#"+e.id}});const r=t.querySelector(".syl");null!==r&&n.push({action:"remove",param:{elementId:r.id}})}t.param=n,l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.queueNotification("Toggled Syllable Link","success"):s.queueNotification("Failed to Toggle Syllable Link","error"),m(),l.updateForCurrentPage()})}function E(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push(t.id)}),e}function S(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{if(t.classList.contains("divLine")||t.classList.contains("accid")||t.classList.contains("clef"))return;Array.from(t.children).forEach(t=>{e.push(t.id)})}),e}},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateErrorLogVisibility=t.initDisplayListener=t.initErrorLogControls=t.initErrorLog=t.recordNotification=void 0;const i=n(8),r=n(4),s=n(9);function o(e){const t=document.createElement("div");t.classList.add("notification-container"),t.innerHTML=`\n \n\n \n
\n
\n
\n\n
\n
\n
\n
\n `;const n=t.querySelector(".log-remove");if(n.onclick=()=>t.remove(),n.addEventListener("mouseover",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-open.svg")}),n.addEventListener("mouseout",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-closed.svg")}),e.logInfo){const i=t.querySelector(".notif-log-info-icon");i.style.display="",n.style.height="20px",i.addEventListener("mouseover",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-dark.svg")}),i.addEventListener("mouseout",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-light.svg")}),i.addEventListener("click",()=>function(e){const t=new s.ModalWindow;t.setModalWindowView(s.ModalWindowView.ERROR_LOG,e),t.openModalWindow()}(e.logInfo))}return t}function a(){const e=document.querySelector("#error_log"),t=document.querySelector("#errorLogHeading"),n=t.querySelector("svg > use"),i=document.querySelector("#errorLogContents"),{displayErrLog:s}=(0,r.getSettings)();s&&e.classList.add("visible"),t.addEventListener("click",e=>{e.stopPropagation(),i.classList.contains("closed")?(i.classList.remove("closed"),i.style.padding="0.5em 0.75em",setTimeout(()=>{i.style.overflow="visible"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(i.classList.add("closed"),i.style.overflow="hidden",setTimeout(()=>{i.style.padding="0px"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))}),c()}function c(){const e=document.querySelector("#display-single-container"),t=document.createElement("label"),n=document.createElement("input");n.classList.add("checkbox"),t.classList.add("checkbox-container","side-panel-btn"),t.textContent="Errors",n.id="display-errors",n.type="checkbox",n.checked=!1,t.appendChild(n),e.append(t);const{displayErrLog:i}=(0,r.getSettings)();n.checked=i,n.addEventListener("click",()=>{(0,r.setSettings)({displayErrLog:n.checked}),l()})}function l(){const e=document.querySelector("#error_log"),{debugMode:t,displayErrLog:n,displayInfo:i,displayBBox:s,displayText:o}=(0,r.getSettings)(),a=document.getElementById("display-all-btn");t?n?(e.classList.add("visible"),i&&s&&o&&n&&(a.classList.add("selected"),a.innerHTML="Hide All")):(e.classList.remove("visible"),a.classList.contains("selected")&&(a.classList.remove("selected"),a.innerHTML="Display All")):(e.classList.remove("visible"),i&&s&&o?(a.classList.add("selected"),a.innerHTML="Hide All"):(a.classList.remove("selected"),a.innerHTML="Display All"))}t.recordNotification=function(e){document.querySelector("#errorLogContents").prepend(o(e))},t.initErrorLog=function(){document.querySelector("#error_log").innerHTML=i.errorLogsPanelContents,a()},t.initErrorLogControls=a,t.initDisplayListener=c,t.updateErrorLogVisibility=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.resize=void 0;const i=n(5),r=n(7),s=n(15),o=n(3),a=n(4),c={TopLeft:0,Top:1,TopRight:2,Right:3,BottomRight:4,Bottom:5,BottomLeft:6,Left:7};function l(e,t,n,i,r){let s;if(r>=0)s=[{x:e,y:t,name:c.TopLeft},{x:(e+n)/2,y:t+(n-e)/2*Math.sin(r),name:c.Top},{x:n,y:t+(n-e)*Math.sin(r),name:c.TopRight},{x:n,y:(t+i+(n-e)*Math.sin(r))/2,name:c.Right},{x:n,y:i,name:c.BottomRight},{x:(e+n)/2,y:i-(n-e)/2*Math.sin(r),name:c.Bottom},{x:e,y:i-(n-e)*Math.sin(r),name:c.BottomLeft},{x:e,y:(t+i-(n-e)*Math.sin(r))/2,name:c.Left}];else{const o=(n-e)*Math.tan(Math.abs(r)),a=i-t-o;s=[{x:e,y:t+o,name:c.TopLeft},{x:(e+n)/2,y:t+o/2,name:c.Top},{x:n,y:t,name:c.TopRight},{x:n,y:t+a/2,name:c.Right},{x:n,y:t+a,name:c.BottomRight},{x:(e+n)/2,y:i-o/2,name:c.Bottom},{x:e,y:i,name:c.BottomLeft},{x:e,y:i-a/2,name:c.Left}]}return s}t.resize=function(e,t,n){let u,d,h,f,g,p,m,v,y,b,w,_,E,S,x;function L(){const e=l(u,d,h,f,g),t=e.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");document.querySelector("#resizeRect").setAttribute("points",t);const n=document.querySelector(".syl.selected > .sylTextRect-display");n&&(n.setAttribute("x",String(Math.min(u,h))),n.setAttribute("y",String(Math.min(d,f))),n.setAttribute("width",String(Math.abs(h-u))),n.setAttribute("height",String(Math.abs(f-d))));for(const t in c){const n=e[c[t]];r.select("#p-"+t).filter(".resizePoint").attr("cx",n.x).attr("cy",n.y)}let i=e[3].x,s=e[3].y;const o=i+100+","+(s+85)+" "+(i+70)+","+(s+50)+" "+(i+100)+","+(s+15)+" "+(i+130)+","+(s+50);i=e[7].x,s=e[7].y;const a=i-100+","+(s-15)+" "+(i-130)+","+(s-50)+" "+(i-100)+","+(s-85)+" "+(i-70)+","+(s-50);r.select("#rotateLeft").attr("points",a),r.select("#rotateRight").attr("points",o)}!function A(){if(null===e)return;if(r.selectAll(".resizePoint").remove(),r.selectAll("#resizeRect").remove(),r.selectAll(".rotatePoint").remove(),e.classList.contains("syl")){const t=e.querySelector(".sylTextRect-display");if(null===t)return void console.warn("Tried to draw resize rect for a sylTextRect that doesn't exist (or isn't displaying)");u=Number(t.getAttribute("x")),d=Number(t.getAttribute("y")),h=+u+ +t.getAttribute("width"),f=+d+ +t.getAttribute("height"),g=0}if(e.classList.contains("staff")){const t=(0,i.getStaffBBox)(e);u=t.ulx,d=t.uly,h=t.lrx,f=t.lry;const n=e.querySelector("path").getAttribute("d").match(/\d+/g).map(e=>Number(e));g=Math.atan((n[3]-n[1])/(n[2]-n[0]))}let k;p=u,y=d,m=h,b=f;const C=l(u,d,h,f,g);E=C[2].x-C[0].x;const I=C.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");r.select("#"+e.id).append("polygon").attr("points",I).attr("id","resizeRect").attr("stroke","black").attr("stroke-width",10).attr("fill","none").style("cursor","move").style("stroke-dasharray","20 10");const{circleSize:P}=(0,a.getSettings)();for(const t in c){const n=C[c[t]];r.select(e.viewportElement).append("circle").attr("cx",n.x).attr("cy",n.y).attr("r",P).attr("stroke","black").attr("stroke-width",4).attr("fill","#0099ff").attr("class","resizePoint").attr("id","p-"+t)}for(const e in c)r.select("#p-"+e).filter(".resizePoint").call(r.drag().on("start",()=>{O(e)}).on("drag",B).on("end",T.bind(this)));if(e.classList.contains("staff")){let t=C[3].x,n=C[3].y;const i=t+100+","+(n+85)+" "+(t+70)+","+(n+50)+" "+(t+100)+","+(n+15)+" "+(t+130)+","+(n+50);t=C[7].x,n=C[7].y;const s=t-100+","+(n-15)+" "+(t-130)+","+(n-50)+" "+(t-100)+","+(n-85)+" "+(t-70)+","+(n-50);r.select("#"+e.id).append("polygon").attr("points",i).attr("id","rotateRight").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#"+e.id).append("polygon").attr("points",s).attr("id","rotateLeft").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#rotateLeft").call(r.drag().on("start",N).on("drag",(function(){const e=r.mouse(this)[1]-w,t=x-Math.atan(e/E);t>-.2&&t<.2&&(S=e,d=_+S,g=t,g>=0?(d=S+C.filter(e=>e.name===c.TopLeft)[0].y,f=C.filter(e=>e.name===c.BottomRight)[0].y):(d=C.filter(e=>e.name===c.TopRight)[0].y,f=S+C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M)),r.select("#rotateRight").call(r.drag().on("start",N).on("drag",(function(){const e=r.mouse(this)[1]-w,t=x+Math.atan(e/E);t>-.2&&t<.2&&(S=e,g=t,g>=0?(f=S+C.filter(e=>e.name===c.BottomRight)[0].y,d=C.filter(e=>e.name===c.TopLeft)[0].y):(d=S+C.filter(e=>e.name===c.TopRight)[0].y,f=C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M))}function O(e){k=e;const t=C.find(t=>t.name===c[e]);v=[t.x,t.y],y=d,b=f}function B(){const e=r.mouse(this);switch(c[k]){case c.TopLeft:u=e[0],d=e[1];break;case c.Top:d=e[1]-(h-u)*Math.tan(g)/2;break;case c.TopRight:h=e[0],d=e[1]-(h-u)*Math.tan(g);break;case c.Right:h=e[0],f=b+(e[0]-v[0])*Math.tan(g);break;case c.BottomRight:h=e[0],f=e[1];break;case c.Bottom:f=e[1]+(h-u)*Math.tan(g)/2;break;case c.BottomLeft:u=e[0],f=e[1]+(h-u)*Math.tan(g);break;case c.Left:u=e[0],d=y+(e[0]-v[0])*Math.tan(g);break;default:console.error("Something that wasn't a side of the rectangle was dragged. This shouldn't happen.")}L()}function T(){if((0,s.isOutOfSVGBounds)(u,d)||(0,s.isOutOfSVGBounds)(h,f))return u=p,d=y,h=m,f=b,L(),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Resize action failed.","error");const r={action:"resize",param:{elementId:e.id,ulx:u,uly:d,lrx:h,lry:f}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{if(r&&await t.updateForCurrentPage(),e=document.querySelector("#"+e.id),u=void 0,d=void 0,h=void 0,f=void 0,A(),e.classList.contains("syl"))(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this);else{(0,i.selectAll)([document.querySelector("#"+e.id)],t,n);const r=document.querySelector("moreEdit");r&&(r.innerHTML="",r.parentElement.classList.add("hidden"))}})}function N(){const e=r.event.sourceEvent.target.id;w=r.mouse(this)[1],b=f,y=d,_="rotateRight"===e?f:d,x=g}function M(){if(void 0===S&&(S=0),(0,s.isOutOfSVGBounds)(u,d)||(0,s.isOutOfSVGBounds)(h,f))return document.querySelectorAll(".resizePoint").forEach(e=>e.remove()),document.querySelectorAll("#resizeRect").forEach(e=>e.remove()),document.querySelectorAll(".rotatePoint").forEach(e=>e.remove()),e=document.getElementById(e.id),u=void 0,d=void 0,h=void 0,f=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Rotate action failed.","error");const r={action:"resizeRotate",param:{elementId:e.id,ulx:u,uly:d,lrx:h,lry:f,rotate:180*g/Math.PI}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{r&&await t.updateForCurrentPage(),e=document.getElementById(e.id),u=void 0,d=void 0,h=void 0,f=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n)})}}()}},function(e,t,n){"use strict";n.r(t),function(e){var i,r,s=n(2),o=n.n(s),a=n(22),c=n(16),l=n.n(c),u=n(21),d=n.n(u),h=n(6),f=n.n(h),g=n(1),p=n.n(g),m=n(0),v=n.n(m);function y(e){return"$"+e}function b(e){return e.substring(1)}function w(){this._store={}}function _(e){if(this._store=new w,e&&Array.isArray(e))for(var t=0,n=e.length;tb(e))},w.prototype.delete=function(e){var t=y(e),n=t in this._store;return delete this._store[t],n},w.prototype.forEach=function(e){for(var t=Object.keys(this._store),n=0,i=t.length;n=u.length)){var n=Math.min(d+6,u.length),i=u.slice(d,n);!function(n,i){n.forEach((function(n,r){var o=i+r,a=s.get(n),u=I(a[0],["atts_since","attachments"]);u.open_revs=a.map((function(e){return e.rev})),u.open_revs=u.open_revs.filter(O);var d=O;0===u.open_revs.length&&(delete u.open_revs,d=B),["revs","attachments","binary","ajax","latest"].forEach((function(e){e in t&&(u[e]=t[e])})),e.get(n,u,(function(e,t){var i,r,s;i=e?[{error:e}]:d(t),r=n,s=i,c[o]={id:r,docs:s},l(),h()}))}))}(i,d),d+=i.length}}h()}try{localStorage.setItem("_pouch_check_localstorage",1),P=!!localStorage.getItem("_pouch_check_localstorage")}catch(e){P=!1}function N(){return P}function M(){v.a.call(this),this._listeners={},function(e){N()&&addEventListener("storage",(function(t){e.emit(t.key)}))}(this)}function q(e){if("undefined"!=typeof console&&"function"==typeof console[e]){var t=Array.prototype.slice.call(arguments,1);console[e].apply(console,t)}}function D(e){var t=0;return e||(t=2e3),function(e,t){return e=parseInt(e,10)||0,(t=parseInt(t,10))!=t||t<=e?t=(e||1)<<1:t+=1,t>6e5&&(e=3e5,t=6e5),~~((t-e)*Math.random()+e)}(e,t)}function F(e,t){q("info","The above "+e+" is totally normal. "+t)}p()(M,v.a),M.prototype.addListener=function(e,t,n,i){if(!this._listeners[t]){var r=this,s=!1;this._listeners[t]=a,this.on(e,a)}function a(){if(r._listeners[t])if(s)s="waiting";else{s=!0;var e=I(i,["style","include_docs","attachments","conflicts","filter","doc_ids","view","since","query_params","binary","return_docs"]);n.changes(e).on("change",(function(e){e.seq>i.since&&!i.cancelled&&(i.since=e.seq,i.onChange(e))})).on("complete",(function(){"waiting"===s&&o()(a),s=!1})).on("error",(function(){s=!1}))}}},M.prototype.removeListener=function(e,t){t in this._listeners&&(v.a.prototype.removeListener.call(this,e,this._listeners[t]),delete this._listeners[t])},M.prototype.notifyLocalWindows=function(e){N()&&(localStorage[e]="a"===localStorage[e]?"b":"a")},M.prototype.notify=function(e){this.emit(e),this.notifyLocalWindows(e)};var j="function"==typeof Object.assign?Object.assign:function(e){for(var t=Object(e),n=1;n0||i0||i>>1],t)<0?r=i+1:s=i;return r}(e,t,n);e.splice(i,0,t)}function Re(e,t){for(var n,i,r=t,s=e.length;r0;){var r=n.pop(),s=r.tree1,o=r.tree2;(s[1].status||o[1].status)&&(s[1].status="available"===s[1].status||"available"===o[1].status?"available":"missing");for(var a=0;a0;){var p=g.pop();if(0!==p.diff)for(var m=p.ids[2],v=0,y=m.length;vt){n||(n={});var u=l.length-t;a={pos:c.pos+u,ids:Re(l,u)};for(var d=0;d0&&i.emit("error",t)):i.emit("complete",n),i.removeAllListeners(),e.removeListener("destroyed",s)}));function s(){i.cancel()}n&&(i.on("complete",(function(e){n(null,e)})),i.on("error",n)),e.once("destroyed",s),t.onChange=function(e,t,n){i.isCancelled||function(e,t,n,i){try{e.emit("change",t,n,i)}catch(e){q("error",'Error in .on("change", function):',e)}}(i,e,t,n)};var o=new Promise((function(e,n){t.complete=function(t,i){t?n(t):e(i)}}));i.once("cancel",(function(){e.removeListener("destroyed",s),t.complete(null,{status:"cancelled"})})),this.then=o.then.bind(o),this.catch=o.catch.bind(o),this.then((function(e){r(null,e)}),r),e.taskqueue.isReady?i.validateChanges(t):e.taskqueue.addTask((function(e){e?t.complete(e):i.isCancelled?i.emit("cancel"):i.validateChanges(t)}))}function Ke(e,t,n){var i=[{rev:e._rev}];"all_docs"===n.style&&(i=Me(t.rev_tree).map((function(e){return{rev:e.rev}})));var r={id:t.id,changes:i,doc:e};return Ze(t,e._rev)&&(r.deleted=!0),n.conflicts&&(r.doc._conflicts=qe(t),r.doc._conflicts.length||delete r.doc._conflicts),r}function Ye(e,t){return et?1:0}function Xe(e,t){return function(n,i){n||i[0]&&i[0].error?((n=n||i[0]).docId=t,e(n)):e(null,i.length?i[0]:i)}}function Je(e,t){var n=Ye(e._id,t._id);return 0!==n?n:Ye(e._revisions?e._revisions.start:0,t._revisions?t._revisions.start:0)}function Qe(){for(var e in v.a.call(this),Qe.prototype)"function"==typeof this[e]&&(this[e]=this[e].bind(this))}function et(){this.isReady=!1,this.failed=!1,this.queue=[]}function tt(e,t){if(!(this instanceof tt))return new tt(e,t);var n=this;if(t=t||{},e&&"object"==typeof e&&(e=(t=e).name,delete t.name),void 0===t.deterministic_revs&&(t.deterministic_revs=!0),this.__opts=t=L(t),n.auto_compaction=t.auto_compaction,n.prefix=tt.prefix,"string"!=typeof e)throw new Error("Missing/invalid DB name");var i=function(e,t){var n=e.match(/([a-z-]*):\/\/(.*)/);if(n)return{name:/https?/.test(n[1])?n[1]+"://"+n[2]:n[2],adapter:n[1]};var i=tt.adapters,r=tt.preferredAdapters,s=tt.prefix,o=t.adapter;if(!o)for(var a=0;at&&a.push(e)})),Te(s,(function(e,t,n,i,r){var s=t+"-"+n;"available"===r.status&&-1!==a.indexOf(s)&&c.push(s)})),i._doCompaction(e,c,n)}))})),Qe.prototype.compact=C("compact",(function(e,t){"function"==typeof e&&(t=e,e={});e=e||{},this._compactionQueue=this._compactionQueue||[],this._compactionQueue.push({opts:e,callback:t}),1===this._compactionQueue.length&&function e(t){var n=t._compactionQueue[0],i=n.opts,r=n.callback;t.get("_local/compaction").catch((function(){return!1})).then((function(n){n&&n.last_seq&&(i.last_seq=n.last_seq),t._compact(i,(function(n,i){n?r(n):r(null,i),o()((function(){t._compactionQueue.shift(),t._compactionQueue.length&&e(t)}))}))}))}(this)})),Qe.prototype._compact=function(e,t){var n=this,i={return_docs:!1,last_seq:e.last_seq||0},r=[];n.changes(i).on("change",(function(e){r.push(n.compactDocument(e.id,0))})).on("complete",(function(e){var i=e.last_seq;Promise.all(r).then((function(){return pe(n,"_local/compaction",(function(e){return(!e.last_seq||e.last_seq0?e.keys.slice(e.skip):e.keys;e.keys=t,e.skip=0,delete e.limit,e.descending&&(t.reverse(),e.descending=!1)}(e),0===e.keys.length))return this._allDocs({limit:0},t)}return this._allDocs(e,t)})),Qe.prototype.changes=function(e,t){return"function"==typeof e&&(t=e,e={}),(e=e||{}).return_docs="return_docs"in e?e.return_docs:!e.live,new We(this,e,t)},Qe.prototype.close=C("close",(function(e){return this._closed=!0,this.emit("closed"),this._close(e)})),Qe.prototype.info=C("info",(function(e){var t=this;this._info((function(n,i){if(n)return e(n);i.db_name=i.db_name||t.name,i.auto_compaction=!(!t.auto_compaction||ae(t)),i.adapter=t.adapter,e(null,i)}))})),Qe.prototype.id=C("id",(function(e){return this._id(e)})),Qe.prototype.type=function(){return"function"==typeof this._type?this._type():this.adapter},Qe.prototype.bulkDocs=C("bulkDocs",(function(e,t,n){if("function"==typeof t&&(n=t,t={}),t=t||{},Array.isArray(e)&&(e={docs:e}),!e||!e.docs||!Array.isArray(e.docs))return n(ne(V));for(var i=0;i1?t.set(e.name,n):t.delete(e.name))}})),e.on("destroyed",(function(e){if(t.has(e)){var n=t.get(e);t.delete(e),n.forEach((function(e){e.emit("destroyed",!0)}))}}))}(tt),tt.adapter=function(e,t,n){t.valid()&&(tt.adapters[e]=t,n&&tt.preferredAdapters.push(e))},tt.plugin=function(e){if("function"==typeof e)e(tt);else{if("object"!=typeof e||0===Object.keys(e).length)throw new Error('Invalid plugin: got "'+e+'", expected an object or a function');Object.keys(e).forEach((function(t){tt.prototype[t]=e[t]}))}return this.__defaults&&(tt.__defaults=j({},this.__defaults)),tt},tt.defaults=function(e){function t(e,n){if(!(this instanceof t))return new t(e,n);n=n||{},e&&"object"==typeof e&&(e=(n=e).name,delete n.name),n=j({},t.__defaults,n),tt.call(this,e,n)}return p()(t,tt),t.preferredAdapters=tt.preferredAdapters.slice(),Object.keys(tt).forEach((function(e){e in t||(t[e]=tt[e])})),t.__defaults=j({},this.__defaults,e),t},tt.fetch=function(e,t){return it(e,t)};function ot(e,t){for(var n=e,i=0,r=t.length;i0&&"\\"===e[i-1]&&("$"===s||"."===s)?n=n.substring(0,n.length-1)+s:"."===s?(t.push(n),n=""):n+=s}return t.push(n),t}var ct=["$or","$nor","$not"];function lt(e){return ct.indexOf(e)>-1}function ut(e){return Object.keys(e)[0]}function dt(e){var t={},n={$or:!0,$nor:!0};return e.forEach((function(e){Object.keys(e).forEach((function(i){var r=e[i];if("object"!=typeof r&&(r={$eq:r}),lt(i))if(r instanceof Array){if(n[i])return n[i]=!1,void(t[i]=r);var s=[];t[i].forEach((function(e){Object.keys(r).forEach((function(t){var n=r[t],i=Math.max(Object.keys(e).length,Object.keys(n).length),o=dt([e,n]);Object.keys(o).length<=i||s.push(o)}))})),t[i]=s}else t[i]=dt([r]);else{var o=t[i]=t[i]||{};Object.keys(r).forEach((function(e){var t=r[e];return"$gt"===e||"$gte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$gte?"$gte"===e?t>n.$gte&&(n.$gte=t):t>=n.$gte&&(delete n.$gte,n.$gt=t):void 0!==n.$gt?"$gte"===e?t>n.$gt&&(delete n.$gt,n.$gte=t):t>n.$gt&&(n.$gt=t):n[e]=t}(e,t,o):"$lt"===e||"$lte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$lte?"$lte"===e?tt?1:-1}(e,t)}return Array.isArray(e)?function(e,t){for(var n=Math.min(e.length,t.length),i=0;it.length?1:-1}(e,t):function(e,t){for(var n=Object.keys(e),i=Object.keys(t),r=Math.min(n.length,i.length),s=0;si.length?1:-1}(e,t)}function gt(e){switch(typeof e){case"undefined":return null;case"number":return e===1/0||e===-1/0||isNaN(e)?null:e;case"object":var t=e;if(Array.isArray(e)){var n=e.length;e=new Array(n);for(var i=0;ir?1:0)}}(t.sort);e=e.sort(i),"string"!=typeof t.sort[0]&&"desc"===(r=t.sort[0])[ut(r)]&&(e=e.reverse())}var r;if("limit"in t||"skip"in t){var s=t.skip||0,o=("limit"in t?t.limit:e.length)+s;e=e.slice(s,o)}return e}function _t(e,t,n){return n.every((function(n){var i=t[n],r=at(n),s=ot(e,r);return lt(n)?function(e,t,n){if("$or"===e)return t.some((function(e){return _t(n,e,Object.keys(e))}));if("$not"===e)return!_t(n,t,Object.keys(t));return!t.find((function(e){return _t(n,e,Object.keys(e))}))}(n,i,e):Et(i,e,r,s)}))}function Et(e,t,n,i){return!e||("object"==typeof e?Object.keys(e).every((function(r){var s=e[r];if(0===r.indexOf("$"))return St(r,t,s,n,i);var o=at(r);if(void 0===i&&"object"!=typeof s&&o.length>0)return!1;var a=ot(i,o);return"object"==typeof s?Et(s,t,n,a):St("$eq",t,s,o,a)})):e===i)}function St(e,t,n,i,r){if(!kt[e])throw new Error('unknown operator "'+e+'" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, $nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');return kt[e](t,n,i,r)}function xt(e){return null!=e}function Lt(e){return void 0!==e}function At(e,t){return t.some((function(t){return e instanceof Array?e.some((function(e){return 0===ft(t,e)})):0===ft(t,e)}))}var kt={$elemMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.some((function(e){return _t(e,t,Object.keys(t))})):i.some((function(i){return Et(t,e,n,i)}))))},$allMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.every((function(e){return _t(e,t,Object.keys(t))})):i.every((function(i){return Et(t,e,n,i)}))))},$eq:function(e,t,n,i){return Lt(i)&&0===ft(i,t)},$gte:function(e,t,n,i){return Lt(i)&&ft(i,t)>=0},$gt:function(e,t,n,i){return Lt(i)&&ft(i,t)>0},$lte:function(e,t,n,i){return Lt(i)&&ft(i,t)<=0},$lt:function(e,t,n,i){return Lt(i)&&ft(i,t)<0},$exists:function(e,t,n,i){return t?Lt(i):!Lt(i)},$mod:function(e,t,n,i){return xt(i)&&function(e,t){return"number"==typeof e&&parseInt(e,10)===e&&e%t[0]===t[1]}(i,t)},$ne:function(e,t,n,i){return t.every((function(e){return 0!==ft(i,e)}))},$in:function(e,t,n,i){return xt(i)&&At(i,t)},$nin:function(e,t,n,i){return xt(i)&&!At(i,t)},$size:function(e,t,n,i){return xt(i)&&Array.isArray(i)&&function(e,t){return e.length===t}(i,t)},$all:function(e,t,n,i){return Array.isArray(i)&&function(e,t){return t.every((function(t){return e.some((function(e){return 0===ft(t,e)}))}))}(i,t)},$regex:function(e,t,n,i){return xt(i)&&"string"==typeof i&&t.every((function(e){return function(e,t){return new RegExp(t).test(e)}(i,e)}))},$type:function(e,t,n,i){return function(e,t){switch(t){case"null":return null===e;case"boolean":return"boolean"==typeof e;case"number":return"number"==typeof e;case"string":return"string"==typeof e;case"array":return e instanceof Array;case"object":return"[object Object]"==={}.toString.call(e)}}(i,t)}};function Ct(e,t){if(e.selector&&e.filter&&"_selector"!==e.filter){var n="string"==typeof e.filter?e.filter:"function";return t(new Error('selector invalid for filter "'+n+'"'))}t()}function It(e){e.view&&!e.filter&&(e.filter="_view"),e.selector&&!e.filter&&(e.filter="_selector"),e.filter&&"string"==typeof e.filter&&("_view"===e.filter?e.view=le(e.view):e.filter=le(e.filter))}function Pt(e,t){return t.filter&&"string"==typeof t.filter&&!t.doc_ids&&!ae(e.db)}function Ot(e,t){var n=t.complete;if("_view"===t.filter){if(!t.view||"string"!=typeof t.view){var i=ne(X,"`view` filter parameter not found or invalid.");return n(i)}var r=ce(t.view);e.db.get("_design/"+r[0],(function(i,s){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var o=s&&s.views&&s.views[r[1]]&&s.views[r[1]].map;if(!o)return n(ne(z,s.views?"missing json key: "+r[1]:"missing json key: views"));t.filter=ge(["return function(doc) {",' "use strict";'," var emitted = false;"," var emit = function (a, b) {"," emitted = true;"," };"," var view = "+o+";"," view(doc);"," if (emitted) {"," return true;"," }","};"].join("\n"),{}),e.doChanges(t)}))}else if(t.selector)t.filter=function(e){return function(e,t){if("object"!=typeof t)throw new Error("Selector error: expected a JSON object");var n=wt([{doc:e}],{selector:t=ht(t)},Object.keys(t));return n&&1===n.length}(e,t.selector)},e.doChanges(t);else{var s=ce(t.filter);e.db.get("_design/"+s[0],(function(i,r){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var o=r&&r.filters&&r.filters[s[1]];if(!o)return n(ne(z,r&&r.filters?"missing json key: "+s[1]:"missing json key: filters"));t.filter=ge('"use strict";\nreturn '+o+";",{}),e.doChanges(t)}))}}function Bt(e){return e.reduce((function(e,t){return e[t]=!0,e}),{})}tt.plugin((function(e){e._changesFilterPlugin={validate:Ct,normalize:It,shouldFilter:Pt,filter:Ot}})),tt.version="7.3.0";var Tt=Bt(["_id","_rev","_access","_attachments","_deleted","_revisions","_revs_info","_conflicts","_deleted_conflicts","_local_seq","_rev_tree","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats","_removed"]),Nt=Bt(["_access","_attachments","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats"]);function Mt(e){if(!/^\d+-/.test(e))return ne(ee);var t=e.indexOf("-"),n=e.substring(0,t),i=e.substring(t+1);return{prefix:parseInt(n,10),id:i}}function qt(e,t,n){var i,r,s;n||(n={deterministic_revs:!0});var o={status:"available"};if(e._deleted&&(o.deleted=!0),t)if(e._id||(e._id=Oe()),r=Pe(e,n.deterministic_revs),e._rev){if((s=Mt(e._rev)).error)return s;e._rev_tree=[{pos:s.prefix,ids:[s.id,{status:"missing"},[[r,o,[]]]]}],i=s.prefix+1}else e._rev_tree=[{pos:1,ids:[r,o,[]]}],i=1;else if(e._revisions&&(e._rev_tree=function(e,t){for(var n=e.start-e.ids.length+1,i=e.ids,r=[i[0],t,[]],s=1,o=i.length;s1&&!n?(a={continue:function(){if(!s.length)return r();var n,a=s[s.length-1];if(t&&t.upper)try{n=IDBKeyRange.bound(a,t.upper,!0,t.upperOpen)}catch(e){if("DataError"===e.name&&0===e.code)return r()}else n=IDBKeyRange.lowerBound(a,!0);t=n,s=null,o=null,e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l}},e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l):n?e.openCursor(t,"prev").onsuccess=u:e.openCursor(t).onsuccess=u}function nn(e,t,n){var i,r,s="startkey"in e&&e.startkey,o="endkey"in e&&e.endkey,a="key"in e&&e.key,c="keys"in e&&e.keys,l=e.skip||0,u="number"==typeof e.limit?e.limit:-1,d=!1!==e.inclusive_end;if(!c&&(r=(i=function(e,t,n,i,r){try{if(e&&t)return r?IDBKeyRange.bound(t,e,!n,!1):IDBKeyRange.bound(e,t,!1,!n);if(e)return r?IDBKeyRange.upperBound(e):IDBKeyRange.lowerBound(e);if(t)return r?IDBKeyRange.lowerBound(t,!n):IDBKeyRange.upperBound(t,!n);if(i)return IDBKeyRange.only(i)}catch(e){return{error:e}}return null}(s,o,d,a,e.descending))&&i.error)&&("DataError"!==r.name||0!==r.code))return n(ne(Q,r.name,r.message));var h=[Vt,"by-sequence",zt];e.attachments&&h.push("attach-store");var f=Jt(t,h,"readonly");if(f.error)return n(f.error);var g=f.txn;g.oncomplete=function(){e.attachments?Yt(E,e.binary).then(A):A()},g.onabort=Ut(n);var p,m,v,y=g.objectStore(Vt),b=g.objectStore("by-sequence"),w=g.objectStore(zt),_=b.index("_doc_id_rev"),E=[];function S(t,n){var i={id:n.id,key:n.id,value:{rev:t}};n.deleted?c&&(E.push(i),i.value.deleted=!0,i.doc=null):l--<=0&&(E.push(i),e.include_docs&&function(t,n,i){var r=t.id+"::"+i;_.get(r).onsuccess=function(i){if(n.doc=Gt(i.target.result)||{},e.conflicts){var r=qe(t);r.length&&(n.doc._conflicts=r)}Kt(n.doc,e,g)}}(n,i,t))}function x(e){for(var t=0,n=e.length;t0&&(m=e.target.result[0])},b.openCursor(null,"prev").onsuccess=function(e){var t=e.target.result,n=void 0;return t&&t.key&&(n=t.key),v({target:{result:[n]}})}),r||0===u?void 0:c?function(e,t,n){var i=new Array(e.length),r=0;e.forEach((function(s,o){t.get(s).onsuccess=function(t){t.target.result?i[o]=t.target.result:i[o]={key:s,error:"not_found"},++r===e.length&&n(e,i,{})}}))}(e.keys,y,L):-1===u?function(e,t,n){if("function"!=typeof e.getAll){var i=[];e.openCursor(t).onsuccess=function(e){var t=e.target.result;t?(i.push(t.value),t.continue()):n({target:{result:i}})}}else e.getAll(t).onsuccess=n}(y,i,(function(t){var n=t.target.result;e.descending&&(n=n.reverse()),x(n)})):void tn(y,i,e.descending,u+l,L)}var rn=!1,sn=[];function on(){!rn&&sn.length&&(rn=!0,sn.shift()())}function an(e,t,n,s){if((e=L(e)).continuous){var o=n+":"+Oe();return Qt.addListener(n,o,t,e),Qt.notify(n),{cancel:function(){Qt.removeListener(n,o)}}}var a=e.doc_ids&&new i(e.doc_ids);e.since=e.since||0;var c=e.since,l="limit"in e?e.limit:-1;0===l&&(l=1);var u,d,h,f,g=[],p=0,m=re(e),v=new r;function y(e,t,n,i){if(n.seq!==t)return i();if(n.winningRev===e._rev)return i(n,e);var r=e._id+"::"+n.winningRev;f.get(r).onsuccess=function(e){i(n,Gt(e.target.result))}}function b(){e.complete(null,{results:g,last_seq:c})}var w=[Vt,"by-sequence"];e.attachments&&w.push("attach-store");var _=Jt(s,w,"readonly");if(_.error)return e.complete(_.error);(u=_.txn).onabort=Ut(e.complete),u.oncomplete=function(){!e.continuous&&e.attachments?Yt(g).then(b):b()},d=u.objectStore("by-sequence"),h=u.objectStore(Vt),f=d.index("_doc_id_rev"),tn(d,e.since&&!e.descending?IDBKeyRange.lowerBound(e.since,!0):null,e.descending,l,(function(t,n,i){if(i&&t.length){var r=new Array(t.length),s=new Array(t.length),o=0;n.forEach((function(n,c){!function(e,t,n){if(a&&!a.has(e._id))return n();var i=v.get(e._id);if(i)return y(e,t,i,n);h.get(e._id).onsuccess=function(r){i=Zt(r.target.result),v.set(e._id,i),y(e,t,i,n)}}(Gt(n),t[c],(function(n,a){s[c]=n,r[c]=a,++o===t.length&&function(){for(var t=[],n=0,o=r.length;nr&&(r=n),t.continue()}}()}function o(){var e=$t(s,s.winningRev,s.deleted);n.put(e).onsuccess=function(){i.continue()}}}}e._meta=null,e._remote=!1,e.type=function(){return"idb"},e._id=k((function(t){t(null,e._meta.instanceId)})),e._bulkDocs=function(n,i,s){en(t,n,i,e,r,a(s))},e._get=function(e,t,n){var i,s,o,a=t.ctx;if(!a){var c=Jt(r,[Vt,"by-sequence","attach-store"],"readonly");if(c.error)return n(c.error);a=c.txn}function l(){n(o,{doc:i,metadata:s,ctx:a})}a.objectStore(Vt).get(e).onsuccess=function(e){if(!(s=Zt(e.target.result)))return o=ne(z,"missing"),l();var n;if(t.rev)n=t.latest?function(e,t){for(var n,i=t.rev_tree.slice();n=i.pop();){var r=n.pos,s=n.ids,o=s[0],a=s[1],c=s[2],l=0===c.length,u=n.history?n.history.slice():[];if(u.push({id:o,pos:r,opts:a}),l)for(var d=0,h=u.length;d=43)},i.onerror=e.onabort=function(e){e.preventDefault(),e.stopPropagation(),t(!1)}})).catch((function(){return!1}))}(u)),cn.then((function(e){c=e,h()})),u.oncomplete=function(){d=!0,h()},u.onabort=Ut(n)},f.onerror=function(e){var t=e.target.error&&e.target.error.message;t?-1!==t.indexOf("stored database is a higher version")&&(t=new Error('This DB was created with the newer "indexeddb" adapter, but you are trying to open it with the older "idb" adapter')):t="Failed to open indexedDB, are you in private browsing mode?",q("error",t),n(ne(Q,t))}}(n,e,t)}),t,n.constructor)}dn.valid=function(){try{return"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(e){return!1}};var hn={};function fn(e){var t=e.doc||e.ok,n=t&&t._attachments;n&&Object.keys(n).forEach((function(e){var t=n[e];t.data=_e(t.data,t.content_type)}))}function gn(e){return/^_design/.test(e)?"_design/"+encodeURIComponent(e.slice(8)):/^_local/.test(e)?"_local/"+encodeURIComponent(e.slice(7)):encodeURIComponent(e)}function pn(e){return e._attachments&&Object.keys(e._attachments)?Promise.all(Object.keys(e._attachments).map((function(t){var n=e._attachments[t];if(n.data&&"string"!=typeof n.data)return new Promise((function(e){xe(n.data,e)})).then((function(e){n.data=e}))}))):Promise.resolve()}function mn(e,t){if(function(e){if(!e.prefix)return!1;var t=fe(e.prefix).protocol;return"http"===t||"https"===t}(t)){var n=t.name.substr(t.prefix.length);e=t.prefix.replace(/\/?$/,"/")+encodeURIComponent(n)}var i=fe(e);(i.user||i.password)&&(i.auth={username:i.user,password:i.password});var r=i.path.replace(/(^\/|\/$)/g,"").split("/");return i.db=r.pop(),-1===i.db.indexOf("%")&&(i.db=encodeURIComponent(i.db)),i.path=r.join("/"),i}function vn(e,t){return yn(e,e.db+"/"+t)}function yn(e,t){var n=e.path?"/":"";return e.protocol+"://"+e.host+(e.port?":"+e.port:"")+"/"+e.path+n+t}function bn(e){return"?"+Object.keys(e).map((function(t){return t+"="+encodeURIComponent(e[t])})).join("&")}function wn(t,n){var i=this,r=mn(t.name,t),s=vn(r,"");t=L(t);var a,c=function(e,n){if((n=n||{}).headers=n.headers||new rt,n.credentials="include",t.auth||r.auth){var i=t.auth||r.auth,s=i.username+":"+i.password,o=ve(unescape(encodeURIComponent(s)));n.headers.set("Authorization","Basic "+o)}var a=t.headers||{};return Object.keys(a).forEach((function(e){n.headers.append(e,a[e])})),function(e){var t="undefined"!=typeof navigator&&navigator.userAgent?navigator.userAgent.toLowerCase():"",n=-1!==t.indexOf("msie"),i=-1!==t.indexOf("trident"),r=-1!==t.indexOf("edge"),s=!("method"in e)||"GET"===e.method;return(n||i||r)&&s}(n)&&(e+=(-1===e.indexOf("?")?"?":"&")+"_nonce="+Date.now()),(t.fetch||it)(e,n)};function l(e,t){return C(e,f()((function(e){d().then((function(){return t.apply(this,e)})).catch((function(t){e.pop()(t)}))}))).bind(i)}function u(e,t,n){var i={};return(t=t||{}).headers=t.headers||new rt,t.headers.get("Content-Type")||t.headers.set("Content-Type","application/json"),t.headers.get("Accept")||t.headers.set("Accept","application/json"),c(e,t).then((function(e){return i.ok=e.ok,i.status=e.status,e.json()})).then((function(e){if(i.data=e,!i.ok){i.data.status=i.status;var t=ie(i.data);if(n)return n(t);throw t}if(Array.isArray(i.data)&&(i.data=i.data.map((function(e){return e.error||e.missing?ie(e):e}))),!n)return i;n(null,i.data)}))}function d(){return t.skip_setup?Promise.resolve():a||((a=u(s).catch((function(e){return e&&e.status&&404===e.status?(F(404,"PouchDB is just detecting if the remote exists."),u(s,{method:"PUT"})):Promise.reject(e)})).catch((function(e){return!(!e||!e.status||412!==e.status)||Promise.reject(e)}))).catch((function(){a=null})),a)}function h(e){return e.split("/").map(encodeURIComponent).join("/")}o()((function(){n(null,i)})),i._remote=!0,i.type=function(){return"http"},i.id=l("id",(function(e){c(yn(r,"")).then((function(e){return e.json()})).catch((function(){return{}})).then((function(t){var n=t&&t.uuid?t.uuid+r.db:vn(r,"");e(null,n)}))})),i.compact=l("compact",(function(e,t){"function"==typeof e&&(t=e,e={}),e=L(e),u(vn(r,"_compact"),{method:"POST"}).then((function(){!function n(){i.info((function(i,r){r&&!r.compact_running?t(null,{ok:!0}):setTimeout(n,e.interval||200)}))}()}))})),i.bulkGet=C("bulkGet",(function(e,t){var n=this;function i(t){var n={};e.revs&&(n.revs=!0),e.attachments&&(n.attachments=!0),e.latest&&(n.latest=!0),u(vn(r,"_bulk_get"+bn(n)),{method:"POST",body:JSON.stringify({docs:e.docs})}).then((function(n){e.attachments&&e.binary&&n.data.results.forEach((function(e){e.docs.forEach(fn)})),t(null,n.data)})).catch(t)}function s(){var i=Math.ceil(e.docs.length/50),r=0,s=new Array(i);function o(e){return function(n,o){s[e]=o.results,++r===i&&t(null,{results:se(s)})}}for(var a=0;at?t:a;var c=vn(r,"_changes"+bn(i)),p={signal:g.signal,method:h,body:JSON.stringify(l)};f=n,e.aborted||d().then((function(){return u(c,p,o)})).catch(o)}},m={results:[]},v=function(n,i){if(!e.aborted){var r=0;if(i&&i.results){r=i.results.length,m.last_seq=i.last_seq;var c=null,l=null;"number"==typeof i.pending&&(c=i.pending),"string"!=typeof m.last_seq&&"number"!=typeof m.last_seq||(l=m.last_seq);e.query_params,i.results=i.results.filter((function(t){a--;var n=re(e)(t);return n&&(e.include_docs&&e.attachments&&e.binary&&fn(t),e.return_docs&&m.results.push(t),e.onChange(t,c,l)),n}))}else if(n)return e.aborted=!0,void e.complete(n);i&&i.last_seq&&(f=i.last_seq);var u=s&&a<=0||i&&r0?e.slice(n):e}function d(e){var t=e.value;return t&&"object"==typeof t&&t._id||e.id}function h(e){return function(t){return e.include_docs&&e.attachments&&e.binary&&function(e){e.rows.forEach((function(e){var t=e.doc&&e.doc._attachments;t&&Object.keys(t).forEach((function(e){var n=t[e];t[e].data=_e(n.data,n.content_type)}))}))}(t),t}}function g(e,t,n,i){var r=t[e];void 0!==r&&(i&&(r=encodeURIComponent(JSON.stringify(r))),n.push(e+"="+r))}function p(e){if(void 0!==e){var t=Number(e);return isNaN(t)||t!==parseInt(e,10)?e:t}}function m(e,t){var n=e.descending?"endkey":"startkey",i=e.descending?"startkey":"endkey";if(void 0!==e[n]&&void 0!==e[i]&&ft(e[n],e[i])>0)throw new _n("No rows can match your key range, reverse your start_key and end_key or set {descending : true}");if(t.reduce&&!1!==e.reduce){if(e.include_docs)throw new _n("{include_docs:true} is invalid for reduce");if(e.keys&&e.keys.length>1&&!e.group&&!e.group_level)throw new _n("Multi-key fetches for reduce views must use {group: true}")}["group_level","limit","skip"].forEach((function(t){var n=function(e){if(e){if("number"!=typeof e)return new _n('Invalid value for integer: "'+e+'"');if(e<0)return new _n('Invalid value for positive integer: "'+e+'"')}}(e[t]);if(n)throw n}))}function v(e){return function(t){if(404===t.status)return e;throw t}}function y(e,t,n){var r="_local/doc_"+e,s={_id:r,keys:[]},o=n.get(e),a=o[0];return(function(e){return 1===e.length&&/^1-/.test(e[0].rev)}(o[1])?Promise.resolve(s):t.db.get(r).catch(v(s))).then((function(e){return function(e){return e.keys.length?t.db.allDocs({keys:e.keys,include_docs:!0}):Promise.resolve({rows:[]})}(e).then((function(t){return function(e,t){for(var n=[],r=new i,s=0,o=t.rows.length;s0&&0===ft(o.key,t)&&a.push(i),n.set(mt(a),o),t=o.key}return n}return g().then((function(){return f.finish()})).then((function(){e.seq=c}))}(e,n)}))()}function _(e,t){return Ln(b(e),(function(){return function(e,t){var i,s=e.reduceFun&&!1!==t.reduce,o=t.skip||0;void 0===t.keys||t.keys.length||(t.limit=0,delete t.keys);function a(t){return t.include_docs=!0,e.db.allDocs(t).then((function(e){return i=e.total_rows,e.rows.map((function(e){if("value"in e.doc&&"object"==typeof e.doc.value&&null!==e.doc.value){var t=Object.keys(e.doc.value).sort(),n=["id","key","value"];if(!(tn))return e.doc.value}var i=function(e){for(var t=[],n=[],i=0;;){var r=e[i++];if("\0"!==r)switch(r){case"1":t.push(null);break;case"2":t.push("1"===e[i]),i++;break;case"3":var s=vt(e,i);t.push(s.num),i+=s.length;break;case"4":for(var o="";;){var a=e[i];if("\0"===a)break;o+=a,i++}o=o.replace(/\u0001\u0001/g,"\0").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,""),t.push(o);break;case"5":var c={element:[],index:t.length};t.push(c.element),n.push(c);break;case"6":var l={element:{},index:t.length};t.push(l.element),n.push(l);break;default:throw new Error("bad collationIndex or unexpectedly reached end of input: "+r)}else{if(1===t.length)return t.pop();yt(t,n)}}}(e.doc._id);return{key:i[0],id:i[1],value:"value"in e.doc?e.doc.value:null}}))}))}function l(a){var l;if(l=s?function(e,t,i){0===i.group_level&&delete i.group_level;var r=i.group||i.group_level,s=n(e.reduceFun),o=[],a=isNaN(i.group_level)?Number.POSITIVE_INFINITY:i.group_level;t.forEach((function(e){var t=o[o.length-1],n=r?e.key:null;if(r&&Array.isArray(n)&&(n=n.slice(0,a)),t&&0===ft(t.groupKey,n))return t.keys.push([e.key,e.id]),void t.values.push(e.value);o.push({keys:[[e.key,e.id]],values:[e.value],groupKey:n})})),t=[];for(var l=0,d=o.length;l0)||function(e){return e._conflicts&&e._conflicts.length>0}(e.doc)||(e.doc._conflicts&&delete e.doc._conflicts,r.push(e.doc),delete n[e.id])}))}))}return Promise.resolve().then((function(){var e=Object.keys(n).filter((function(e){var t=n[e].missing;return 1===t.length&&Zn(t[0])}));if(e.length>0)return o(e)})).then((function(){var o=function(e){var t=[];return Object.keys(e).forEach((function(n){e[n].missing.forEach((function(e){t.push({id:n,rev:e})}))})),{docs:t,revs:!0,latest:!0}}(n);if(o.docs.length)return e.bulkGet(o).then((function(n){if(i.cancelled)throw new Error("cancelled");return Promise.all(n.results.map((function(n){return Promise.all(n.docs.map((function(n){var i=n.ok;return n.error&&(s=!1),i&&i._attachments?function(e,t,n){var i=ae(t)&&!ae(e),r=Object.keys(n._attachments);return i?e.get(n._id).then((function(i){return Promise.all(r.map((function(r){return function(e,t,n){return!e._attachments||!e._attachments[n]||e._attachments[n].digest!==t._attachments[n].digest}(i,n,r)?t.getAttachment(n._id,r):e.getAttachment(i._id,r)})))})).catch((function(e){if(404!==e.status)throw e;return Gn(t,n)})):Gn(t,n)}(t,e,i).then((function(e){var t=Object.keys(i._attachments);return e.forEach((function(e,n){var r=i._attachments[t[n]];delete r.stub,delete r.length,r.data=e})),i})):i})))}))).then((function(e){r=r.concat(se(e).filter(Boolean))}))}))})).then((function(){return{ok:s,docs:r}}))}function Kn(e,t,n,i,r){return e.get(t).catch((function(n){if(404===n.status)return"http"!==e.adapter&&"https"!==e.adapter||F(404,"PouchDB is just checking if a remote checkpoint exists."),{session_id:i,_id:t,history:[],replicator:"pouchdb",version:1};throw n})).then((function(s){if(!r.cancelled&&s.last_seq!==n)return s.history=(s.history||[]).filter((function(e){return e.session_id!==i})),s.history.unshift({last_seq:n,session_id:i}),s.history=s.history.slice(0,5),s.version=1,s.replicator="pouchdb",s.session_id=i,s.last_seq=n,e.put(s).catch((function(s){if(409===s.status)return Kn(e,t,n,i,r);throw s}))}))}function Yn(e,t,n,i,r){this.src=e,this.target=t,this.id=n,this.returnValue=i,this.opts=r||{}}Yn.prototype.writeCheckpoint=function(e,t){var n=this;return this.updateTarget(e,t).then((function(){return n.updateSource(e,t)}))},Yn.prototype.updateTarget=function(e,t){return this.opts.writeTargetCheckpoint?Kn(this.target,this.id,e,t,this.returnValue):Promise.resolve(!0)},Yn.prototype.updateSource=function(e,t){if(this.opts.writeSourceCheckpoint){var n=this;return Kn(this.src,this.id,e,t,this.returnValue).catch((function(e){if(Qn(e))return n.opts.writeSourceCheckpoint=!1,!0;throw e}))}return Promise.resolve(!0)};var Xn={undefined:function(e,t){return 0===ft(e.last_seq,t.last_seq)?t.last_seq:0},1:function(e,t){return function(e,t){if(e.session_id===t.session_id)return{last_seq:e.last_seq,history:e.history};return function e(t,n){var i=t[0],r=t.slice(1),s=n[0],o=n.slice(1);if(!i||0===n.length)return{last_seq:0,history:[]};if(Jn(i.session_id,n))return{last_seq:i.last_seq,history:t};if(Jn(s.session_id,r))return{last_seq:s.last_seq,history:o};return e(r,o)}(e.history,t.history)}(t,e).last_seq}};function Jn(e,t){var n=t[0],i=t.slice(1);return!(!e||0===t.length)&&(e===n.session_id||Jn(e,i))}function Qn(e){return"number"==typeof e.status&&4===Math.floor(e.status/100)}Yn.prototype.getCheckpoint=function(){var e=this;return e.opts&&e.opts.writeSourceCheckpoint&&!e.opts.writeTargetCheckpoint?e.src.get(e.id).then((function(e){return e.last_seq||0})).catch((function(e){if(404!==e.status)throw e;return 0})):e.target.get(e.id).then((function(t){return e.opts&&e.opts.writeTargetCheckpoint&&!e.opts.writeSourceCheckpoint?t.last_seq||0:e.src.get(e.id).then((function(e){return t.version!==e.version?0:(n=t.version?t.version.toString():"undefined")in Xn?Xn[n](t,e):0;var n}),(function(n){if(404===n.status&&t.last_seq)return e.src.put({_id:e.id,last_seq:0}).then((function(){return 0}),(function(n){return Qn(n)?(e.opts.writeSourceCheckpoint=!1,t.last_seq):0}));throw n}))})).catch((function(e){if(404!==e.status)throw e;return 0}))};function ei(e,t,n){var i=n.doc_ids?n.doc_ids.sort(ft):"",r=n.filter?n.filter.toString():"",s="",o="",a="";return n.selector&&(a=JSON.stringify(n.selector)),n.filter&&n.query_params&&(s=JSON.stringify(function(e){return Object.keys(e).sort(ft).reduce((function(t,n){return t[n]=e[n],t}),{})}(n.query_params))),n.filter&&"_view"===n.filter&&(o=n.view.toString()),Promise.all([e.id(),t.id()]).then((function(e){var t=e[0]+e[1]+r+o+s+i+a;return new Promise((function(e){Ce(t,e)}))})).then((function(e){return"_local/"+(e=e.replace(/\//g,".").replace(/\+/g,"_"))}))}function ti(e,t,n,i,r){var s,a,c,l=[],u={seq:0,changes:[],docs:[]},d=!1,h=!1,f=!1,g=0,p=n.continuous||n.live||!1,m=n.batch_size||100,v=n.batches_limit||10,y=n.style||"all_docs",b=!1,w=n.doc_ids,_=n.selector,E=[],S=Oe();r=r||{ok:!0,start_time:(new Date).toISOString(),docs_read:0,docs_written:0,doc_write_failures:0,errors:[]};var x={};function A(){return c?Promise.resolve():ei(e,t,n).then((function(r){a=r;var s={};s=!1===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!1}:"source"===n.checkpoint?{writeSourceCheckpoint:!0,writeTargetCheckpoint:!1}:"target"===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!0}:{writeSourceCheckpoint:!0,writeTargetCheckpoint:!0},c=new Yn(e,t,a,i,s)}))}function k(){if(E=[],0!==s.docs.length){var e=s.docs,o={timeout:n.timeout};return t.bulkDocs({docs:e,new_edits:!1},o).then((function(t){if(i.cancelled)throw T(),new Error("cancelled");var n=Object.create(null);t.forEach((function(e){e.error&&(n[e.id]=e)}));var s=Object.keys(n).length;r.doc_write_failures+=s,r.docs_written+=e.length-s,e.forEach((function(e){var t=n[e._id];if(t){r.errors.push(t);var s=(t.name||"").toLowerCase();if("unauthorized"!==s&&"forbidden"!==s)throw t;i.emit("denied",L(t))}else E.push(e)}))}),(function(t){throw r.doc_write_failures+=e.length,t}))}}function C(){if(s.error)throw new Error("There was a problem getting docs.");r.last_seq=g=s.seq;var e=L(r);return E.length&&(e.docs=E,"number"==typeof s.pending&&(e.pending=s.pending,delete s.pending),i.emit("change",e)),d=!0,c.writeCheckpoint(s.seq,S).then((function(){if(i.emit("checkpoint",{checkpoint:s.seq}),d=!1,i.cancelled)throw T(),new Error("cancelled");s=void 0,F()})).catch((function(e){throw R(e),e}))}function I(){return Wn(e,t,s.diffs,i).then((function(e){s.error=!e.ok,e.docs.forEach((function(e){delete s.diffs[e._id],r.docs_read++,s.docs.push(e)}))}))}function P(){var e;i.cancelled||s||(0!==l.length?(s=l.shift(),i.emit("checkpoint",{start_next_batch:s.seq}),(e={},s.changes.forEach((function(t){i.emit("checkpoint",{revs_diff:t}),"_user/"!==t.id&&(e[t.id]=t.changes.map((function(e){return e.rev})))})),t.revsDiff(e).then((function(e){if(i.cancelled)throw T(),new Error("cancelled");s.diffs=e}))).then(I).then(k).then(C).then(P).catch((function(e){B("batch processing terminated with error",e)}))):O(!0))}function O(e){0!==u.changes.length?(e||h||u.changes.length>=m)&&(l.push(u),u={seq:0,changes:[],docs:[]},"pending"!==i.state&&"stopped"!==i.state||(i.state="active",i.emit("active")),P()):0!==l.length||s||((p&&x.live||h)&&(i.state="pending",i.emit("paused")),h&&T())}function B(e,t){f||(t.message||(t.message=e),r.ok=!1,r.status="aborting",l=[],u={seq:0,changes:[],docs:[]},T(t))}function T(s){if(!(f||i.cancelled&&(r.status="cancelled",d)))if(r.status=r.status||"complete",r.end_time=(new Date).toISOString(),r.last_seq=g,f=!0,s){(s=ne(s)).result=r;var o=(s.name||"").toLowerCase();"unauthorized"===o||"forbidden"===o?(i.emit("error",s),i.removeAllListeners()):function(e,t,n,i){if(!1===e.retry)return t.emit("error",n),void t.removeAllListeners();if("function"!=typeof e.back_off_function&&(e.back_off_function=D),t.emit("requestError",n),"active"===t.state||"pending"===t.state){t.emit("paused",n),t.state="stopped";var r=function(){e.current_back_off=0};t.once("paused",(function(){t.removeListener("active",r)})),t.once("active",r)}e.current_back_off=e.current_back_off||0,e.current_back_off=e.back_off_function(e.current_back_off),setTimeout(i,e.current_back_off)}(n,i,s,(function(){ti(e,t,n,i)}))}else i.emit("complete",r),i.removeAllListeners()}function N(e,t,r){if(i.cancelled)return T();"number"==typeof t&&(u.pending=t),re(n)(e)&&(u.seq=e.seq||r,u.changes.push(e),i.emit("checkpoint",{pending_batch:u.seq}),o()((function(){O(0===l.length&&x.live)})))}function M(e){if(b=!1,i.cancelled)return T();if(e.results.length>0)x.since=e.results[e.results.length-1].seq,F(),O(!0);else{var t=function(){p?(x.live=!0,F()):h=!0,O(!0)};s||0!==e.results.length?t():(d=!0,c.writeCheckpoint(e.last_seq,S).then((function(){d=!1,r.last_seq=g=e.last_seq,t()})).catch(R))}}function q(e){if(b=!1,i.cancelled)return T();B("changes rejected",e)}function F(){if(!b&&!h&&l.length1)for(var n=1;n
@@ -6,7 +6,7 @@
* Released under MIT license
* Based on Underscore.js 1.8.3
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */(function(){var s="Expected a function",o="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",u="[object Boolean]",d="[object Date]",h="[object Error]",f="[object Function]",g="[object GeneratorFunction]",p="[object Map]",m="[object Number]",v="[object Object]",y="[object RegExp]",b="[object Set]",w="[object String]",_="[object Symbol]",E="[object WeakMap]",S="[object ArrayBuffer]",x="[object DataView]",L="[object Float32Array]",A="[object Float64Array]",k="[object Int8Array]",C="[object Int16Array]",I="[object Int32Array]",P="[object Uint8Array]",O="[object Uint16Array]",B="[object Uint32Array]",T=/\b__p \+= '';/g,N=/\b(__p \+=) '' \+/g,M=/(__e\(.*?\)|\b__t\)) \+\n'';/g,q=/&(?:amp|lt|gt|quot|#39);/g,D=/[&<>"']/g,F=RegExp(q.source),j=RegExp(D.source),R=/<%-([\s\S]+?)%>/g,V=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,H=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,U=/^\w*$/,$=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Z=/[\\^$.*+?()[\]{}|]/g,G=RegExp(Z.source),W=/^\s+/,K=/\s/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,X=/\{\n\/\* \[wrapped with (.+)\] \*/,J=/,? & /,Q=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ee=/[()=,{}\[\]\/\s]/,te=/\\(\\)?/g,ne=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ie=/\w*$/,re=/^[-+]0x[0-9a-f]+$/i,se=/^0b[01]+$/i,oe=/^\[object .+?Constructor\]$/,ae=/^0o[0-7]+$/i,ce=/^(?:0|[1-9]\d*)$/,le=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ue=/($^)/,de=/['\n\r\u2028\u2029\\]/g,he="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",fe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",ge="[\\ud800-\\udfff]",pe="["+fe+"]",me="["+he+"]",ve="\\d+",ye="[\\u2700-\\u27bf]",be="[a-z\\xdf-\\xf6\\xf8-\\xff]",we="[^\\ud800-\\udfff"+fe+ve+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",_e="\\ud83c[\\udffb-\\udfff]",Ee="[^\\ud800-\\udfff]",Se="(?:\\ud83c[\\udde6-\\uddff]){2}",xe="[\\ud800-\\udbff][\\udc00-\\udfff]",Le="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Ae="(?:"+be+"|"+we+")",ke="(?:"+Le+"|"+we+")",Ce="(?:"+me+"|"+_e+")"+"?",Ie="[\\ufe0e\\ufe0f]?"+Ce+("(?:\\u200d(?:"+[Ee,Se,xe].join("|")+")[\\ufe0e\\ufe0f]?"+Ce+")*"),Pe="(?:"+[ye,Se,xe].join("|")+")"+Ie,Oe="(?:"+[Ee+me+"?",me,Se,xe,ge].join("|")+")",Be=RegExp("['’]","g"),Te=RegExp(me,"g"),Ne=RegExp(_e+"(?="+_e+")|"+Oe+Ie,"g"),Me=RegExp([Le+"?"+be+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[pe,Le,"$"].join("|")+")",ke+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[pe,Le+Ae,"$"].join("|")+")",Le+"?"+Ae+"+(?:['’](?:d|ll|m|re|s|t|ve))?",Le+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ve,Pe].join("|"),"g"),qe=RegExp("[\\u200d\\ud800-\\udfff"+he+"\\ufe0e\\ufe0f]"),De=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Fe=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],je=-1,Re={};Re[L]=Re[A]=Re[k]=Re[C]=Re[I]=Re[P]=Re["[object Uint8ClampedArray]"]=Re[O]=Re[B]=!0,Re[c]=Re[l]=Re[S]=Re[u]=Re[x]=Re[d]=Re[h]=Re[f]=Re[p]=Re[m]=Re[v]=Re[y]=Re[b]=Re[w]=Re[E]=!1;var Ve={};Ve[c]=Ve[l]=Ve[S]=Ve[x]=Ve[u]=Ve[d]=Ve[L]=Ve[A]=Ve[k]=Ve[C]=Ve[I]=Ve[p]=Ve[m]=Ve[v]=Ve[y]=Ve[b]=Ve[w]=Ve[_]=Ve[P]=Ve["[object Uint8ClampedArray]"]=Ve[O]=Ve[B]=!0,Ve[h]=Ve[f]=Ve[E]=!1;var ze={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},He=parseFloat,Ue=parseInt,$e="object"==typeof e&&e&&e.Object===Object&&e,Ze="object"==typeof self&&self&&self.Object===Object&&self,Ge=$e||Ze||Function("return this")(),We=t&&!t.nodeType&&t,Ke=We&&"object"==typeof i&&i&&!i.nodeType&&i,Ye=Ke&&Ke.exports===We,Xe=Ye&&$e.process,Je=function(){try{var e=Ke&&Ke.require&&Ke.require("util").types;return e||Xe&&Xe.binding&&Xe.binding("util")}catch(e){}}(),Qe=Je&&Je.isArrayBuffer,et=Je&&Je.isDate,tt=Je&&Je.isMap,nt=Je&&Je.isRegExp,it=Je&&Je.isSet,rt=Je&&Je.isTypedArray;function st(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function ot(e,t,n,i){for(var r=-1,s=null==e?0:e.length;++r-1}function ht(e,t,n){for(var i=-1,r=null==e?0:e.length;++i-1;);return n}function Mt(e,t){for(var n=e.length;n--&&_t(t,e[n],0)>-1;);return n}function qt(e,t){for(var n=e.length,i=0;n--;)e[n]===t&&++i;return i}var Dt=At({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Ft=At({"&":"&","<":"<",">":">",'"':""","'":"'"});function jt(e){return"\\"+ze[e]}function Rt(e){return qe.test(e)}function Vt(e){var t=-1,n=Array(e.size);return e.forEach((function(e,i){n[++t]=[i,e]})),n}function zt(e,t){return function(n){return e(t(n))}}function Ht(e,t){for(var n=-1,i=e.length,r=0,s=[];++n",""":'"',"'":"'"});var Yt=function e(t){var n,i=(t=null==t?Ge:Yt.defaults(Ge.Object(),t,Yt.pick(Ge,Fe))).Array,r=t.Date,K=t.Error,he=t.Function,fe=t.Math,ge=t.Object,pe=t.RegExp,me=t.String,ve=t.TypeError,ye=i.prototype,be=he.prototype,we=ge.prototype,_e=t["__core-js_shared__"],Ee=be.toString,Se=we.hasOwnProperty,xe=0,Le=(n=/[^.]+$/.exec(_e&&_e.keys&&_e.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Ae=we.toString,ke=Ee.call(ge),Ce=Ge._,Ie=pe("^"+Ee.call(Se).replace(Z,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Pe=Ye?t.Buffer:void 0,Oe=t.Symbol,Ne=t.Uint8Array,qe=Pe?Pe.allocUnsafe:void 0,ze=zt(ge.getPrototypeOf,ge),$e=ge.create,Ze=we.propertyIsEnumerable,We=ye.splice,Ke=Oe?Oe.isConcatSpreadable:void 0,Xe=Oe?Oe.iterator:void 0,Je=Oe?Oe.toStringTag:void 0,yt=function(){try{var e=es(ge,"defineProperty");return e({},"",{}),e}catch(e){}}(),At=t.clearTimeout!==Ge.clearTimeout&&t.clearTimeout,Xt=r&&r.now!==Ge.Date.now&&r.now,Jt=t.setTimeout!==Ge.setTimeout&&t.setTimeout,Qt=fe.ceil,en=fe.floor,tn=ge.getOwnPropertySymbols,nn=Pe?Pe.isBuffer:void 0,rn=t.isFinite,sn=ye.join,on=zt(ge.keys,ge),an=fe.max,cn=fe.min,ln=r.now,un=t.parseInt,dn=fe.random,hn=ye.reverse,fn=es(t,"DataView"),gn=es(t,"Map"),pn=es(t,"Promise"),mn=es(t,"Set"),vn=es(t,"WeakMap"),yn=es(ge,"create"),bn=vn&&new vn,wn={},_n=ks(fn),En=ks(gn),Sn=ks(pn),xn=ks(mn),Ln=ks(vn),An=Oe?Oe.prototype:void 0,kn=An?An.valueOf:void 0,Cn=An?An.toString:void 0;function In(e){if($o(e)&&!No(e)&&!(e instanceof Tn)){if(e instanceof Bn)return e;if(Se.call(e,"__wrapped__"))return Cs(e)}return new Bn(e)}var Pn=function(){function e(){}return function(t){if(!Uo(t))return{};if($e)return $e(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();function On(){}function Bn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Tn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Nn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Xn(e,t,n,i,r,s){var o,a=1&t,l=2&t,h=4&t;if(n&&(o=r?n(e,i,r,s):n(e)),void 0!==o)return o;if(!Uo(e))return e;var E=No(e);if(E){if(o=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&Se.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!a)return yr(e,o)}else{var T=is(e),N=T==f||T==g;if(Fo(e))return hr(e,a);if(T==v||T==c||N&&!r){if(o=l||N?{}:ss(e),!a)return l?function(e,t){return br(e,ns(e),t)}(e,function(e,t){return e&&br(t,Ea(t),e)}(o,e)):function(e,t){return br(e,ts(e),t)}(e,Gn(o,e))}else{if(!Ve[T])return r?e:{};o=function(e,t,n){var i=e.constructor;switch(t){case S:return fr(e);case u:case d:return new i(+e);case x:return function(e,t){var n=t?fr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case L:case A:case k:case C:case I:case P:case"[object Uint8ClampedArray]":case O:case B:return gr(e,n);case p:return new i;case m:case w:return new i(e);case y:return function(e){var t=new e.constructor(e.source,ie.exec(e));return t.lastIndex=e.lastIndex,t}(e);case b:return new i;case _:return r=e,kn?ge(kn.call(r)):{}}var r}(e,T,a)}}s||(s=new Fn);var M=s.get(e);if(M)return M;s.set(e,o),Yo(e)?e.forEach((function(i){o.add(Xn(i,t,n,i,e,s))})):Zo(e)&&e.forEach((function(i,r){o.set(r,Xn(i,t,n,r,e,s))}));var q=E?void 0:(h?l?Gr:Zr:l?Ea:_a)(e);return at(q||e,(function(i,r){q&&(i=e[r=i]),Un(o,r,Xn(i,t,n,r,e,s))})),o}function Jn(e,t,n){var i=n.length;if(null==e)return!i;for(e=ge(e);i--;){var r=n[i],s=t[r],o=e[r];if(void 0===o&&!(r in e)||!s(o))return!1}return!0}function Qn(e,t,n){if("function"!=typeof e)throw new ve(s);return ws((function(){e.apply(void 0,n)}),t)}function ei(e,t,n,i){var r=-1,s=dt,o=!0,a=e.length,c=[],l=t.length;if(!a)return c;n&&(t=ft(t,Ot(n))),i?(s=ht,o=!1):t.length>=200&&(s=Tt,o=!1,t=new Dn(t));e:for(;++r-1},Mn.prototype.set=function(e,t){var n=this.__data__,i=$n(n,e);return i<0?(++this.size,n.push([e,t])):n[i][1]=t,this},qn.prototype.clear=function(){this.size=0,this.__data__={hash:new Nn,map:new(gn||Mn),string:new Nn}},qn.prototype.delete=function(e){var t=Jr(this,e).delete(e);return this.size-=t?1:0,t},qn.prototype.get=function(e){return Jr(this,e).get(e)},qn.prototype.has=function(e){return Jr(this,e).has(e)},qn.prototype.set=function(e,t){var n=Jr(this,e),i=n.size;return n.set(e,t),this.size+=n.size==i?0:1,this},Dn.prototype.add=Dn.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Dn.prototype.has=function(e){return this.__data__.has(e)},Fn.prototype.clear=function(){this.__data__=new Mn,this.size=0},Fn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Fn.prototype.get=function(e){return this.__data__.get(e)},Fn.prototype.has=function(e){return this.__data__.has(e)},Fn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Mn){var i=n.__data__;if(!gn||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new qn(i)}return n.set(e,t),this.size=n.size,this};var ti=Er(li),ni=Er(ui,!0);function ii(e,t){var n=!0;return ti(e,(function(e,i,r){return n=!!t(e,i,r)})),n}function ri(e,t,n){for(var i=-1,r=e.length;++i0&&n(a)?t>1?oi(a,t-1,n,i,r):gt(r,a):i||(r[r.length]=a)}return r}var ai=Sr(),ci=Sr(!0);function li(e,t){return e&&ai(e,t,_a)}function ui(e,t){return e&&ci(e,t,_a)}function di(e,t){return ut(t,(function(t){return Vo(e[t])}))}function hi(e,t){for(var n=0,i=(t=cr(t,e)).length;null!=e&&nt}function mi(e,t){return null!=e&&Se.call(e,t)}function vi(e,t){return null!=e&&t in ge(e)}function yi(e,t,n){for(var r=n?ht:dt,s=e[0].length,o=e.length,a=o,c=i(o),l=1/0,u=[];a--;){var d=e[a];a&&t&&(d=ft(d,Ot(t))),l=cn(d.length,l),c[a]=!n&&(t||s>=120&&d.length>=120)?new Dn(a&&d):void 0}d=e[0];var h=-1,f=c[0];e:for(;++h=a)return c;var l=n[i];return c*("desc"==l?-1:1)}}return e.index-t.index}(e,t,n)}))}function Ni(e,t,n){for(var i=-1,r=t.length,s={};++i-1;)a!==e&&We.call(a,c,1),We.call(e,c,1);return e}function qi(e,t){for(var n=e?t.length:0,i=n-1;n--;){var r=t[n];if(n==i||r!==s){var s=r;as(r)?We.call(e,r,1):er(e,r)}}return e}function Di(e,t){return e+en(dn()*(t-e+1))}function Fi(e,t){var n="";if(!e||t<1||t>9007199254740991)return n;do{t%2&&(n+=e),(t=en(t/2))&&(e+=e)}while(t);return n}function ji(e,t){return _s(ps(e,t,Ga),e+"")}function Ri(e){return Rn(Pa(e))}function Vi(e,t){var n=Pa(e);return xs(n,Yn(t,0,n.length))}function zi(e,t,n,i){if(!Uo(e))return e;for(var r=-1,s=(t=cr(t,e)).length,o=s-1,a=e;null!=a&&++rs?0:s+t),(n=n>s?s:n)<0&&(n+=s),s=t>n?0:n-t>>>0,t>>>=0;for(var o=i(s);++r>>1,o=e[s];null!==o&&!Jo(o)&&(n?o<=t:o=200){var l=t?null:Fr(e);if(l)return Ut(l);o=!1,r=Tt,c=new Dn}else c=t?[]:a;e:for(;++i=i?e:Zi(e,t,n)}var dr=At||function(e){return Ge.clearTimeout(e)};function hr(e,t){if(t)return e.slice();var n=e.length,i=qe?qe(n):new e.constructor(n);return e.copy(i),i}function fr(e){var t=new e.constructor(e.byteLength);return new Ne(t).set(new Ne(e)),t}function gr(e,t){var n=t?fr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function pr(e,t){if(e!==t){var n=void 0!==e,i=null===e,r=e==e,s=Jo(e),o=void 0!==t,a=null===t,c=t==t,l=Jo(t);if(!a&&!l&&!s&&e>t||s&&o&&c&&!a&&!l||i&&o&&c||!n&&c||!r)return 1;if(!i&&!s&&!l&&e1?n[r-1]:void 0,o=r>2?n[2]:void 0;for(s=e.length>3&&"function"==typeof s?(r--,s):void 0,o&&cs(n[0],n[1],o)&&(s=r<3?void 0:s,r=1),t=ge(t);++i-1?r[s?t[o]:o]:void 0}}function Cr(e){return $r((function(t){var n=t.length,i=n,r=Bn.prototype.thru;for(e&&t.reverse();i--;){var o=t[i];if("function"!=typeof o)throw new ve(s);if(r&&!a&&"wrapper"==Kr(o))var a=new Bn([],!0)}for(i=a?i:n;++i1&&b.reverse(),d&&la))return!1;var l=s.get(e),u=s.get(t);if(l&&u)return l==t&&u==e;var d=-1,h=!0,f=2&n?new Dn:void 0;for(s.set(e,t),s.set(t,e);++d-1&&e%1==0&&e1?"& ":"")+t[i],t=t.join(n>2?", ":" "),e.replace(Y,"{\n/* [wrapped with "+t+"] */\n")}(i,function(e,t){return at(a,(function(n){var i="_."+n[0];t&n[1]&&!dt(e,i)&&e.push(i)})),e.sort()}(function(e){var t=e.match(X);return t?t[1].split(J):[]}(i),n)))}function Ss(e){var t=0,n=0;return function(){var i=ln(),r=16-(i-n);if(n=i,r>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function xs(e,t){var n=-1,i=e.length,r=i-1;for(t=void 0===t?i:t;++n1?e[t-1]:void 0;return n="function"==typeof n?(e.pop(),n):void 0,Ws(e,n)}));function to(e){var t=In(e);return t.__chain__=!0,t}function no(e,t){return t(e)}var io=$r((function(e){var t=e.length,n=t?e[0]:0,i=this.__wrapped__,r=function(t){return Kn(t,e)};return!(t>1||this.__actions__.length)&&i instanceof Tn&&as(n)?((i=i.slice(n,+n+(t?1:0))).__actions__.push({func:no,args:[r],thisArg:void 0}),new Bn(i,this.__chain__).thru((function(e){return t&&!e.length&&e.push(void 0),e}))):this.thru(r)}));var ro=wr((function(e,t,n){Se.call(e,n)?++e[n]:Wn(e,n,1)}));var so=kr(Bs),oo=kr(Ts);function ao(e,t){return(No(e)?at:ti)(e,Xr(t,3))}function co(e,t){return(No(e)?ct:ni)(e,Xr(t,3))}var lo=wr((function(e,t,n){Se.call(e,n)?e[n].push(t):Wn(e,n,[t])}));var uo=ji((function(e,t,n){var r=-1,s="function"==typeof t,o=qo(e)?i(e.length):[];return ti(e,(function(e){o[++r]=s?st(t,e,n):bi(e,t,n)})),o})),ho=wr((function(e,t,n){Wn(e,n,t)}));function fo(e,t){return(No(e)?ft:Ci)(e,Xr(t,3))}var go=wr((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var po=ji((function(e,t){if(null==e)return[];var n=t.length;return n>1&&cs(e,t[0],t[1])?t=[]:n>2&&cs(t[0],t[1],t[2])&&(t=[t[0]]),Ti(e,oi(t,1),[])})),mo=Xt||function(){return Ge.Date.now()};function vo(e,t,n){return t=n?void 0:t,Rr(e,128,void 0,void 0,void 0,void 0,t=e&&null==t?e.length:t)}function yo(e,t){var n;if("function"!=typeof t)throw new ve(s);return e=ra(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=void 0),n}}var bo=ji((function(e,t,n){var i=1;if(n.length){var r=Ht(n,Yr(bo));i|=32}return Rr(e,i,t,n,r)})),wo=ji((function(e,t,n){var i=3;if(n.length){var r=Ht(n,Yr(wo));i|=32}return Rr(t,i,e,n,r)}));function _o(e,t,n){var i,r,o,a,c,l,u=0,d=!1,h=!1,f=!0;if("function"!=typeof e)throw new ve(s);function g(t){var n=i,s=r;return i=r=void 0,u=t,a=e.apply(s,n)}function p(e){return u=e,c=ws(v,t),d?g(e):a}function m(e){var n=e-l;return void 0===l||n>=t||n<0||h&&e-u>=o}function v(){var e=mo();if(m(e))return y(e);c=ws(v,function(e){var n=t-(e-l);return h?cn(n,o-(e-u)):n}(e))}function y(e){return c=void 0,f&&i?g(e):(i=r=void 0,a)}function b(){var e=mo(),n=m(e);if(i=arguments,r=this,l=e,n){if(void 0===c)return p(l);if(h)return dr(c),c=ws(v,t),g(l)}return void 0===c&&(c=ws(v,t)),a}return t=oa(t)||0,Uo(n)&&(d=!!n.leading,o=(h="maxWait"in n)?an(oa(n.maxWait)||0,t):o,f="trailing"in n?!!n.trailing:f),b.cancel=function(){void 0!==c&&dr(c),u=0,i=l=r=c=void 0},b.flush=function(){return void 0===c?a:y(mo())},b}var Eo=ji((function(e,t){return Qn(e,1,t)})),So=ji((function(e,t,n){return Qn(e,oa(t)||0,n)}));function xo(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new ve(s);var n=function(){var i=arguments,r=t?t.apply(this,i):i[0],s=n.cache;if(s.has(r))return s.get(r);var o=e.apply(this,i);return n.cache=s.set(r,o)||s,o};return n.cache=new(xo.Cache||qn),n}function Lo(e){if("function"!=typeof e)throw new ve(s);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}xo.Cache=qn;var Ao=lr((function(e,t){var n=(t=1==t.length&&No(t[0])?ft(t[0],Ot(Xr())):ft(oi(t,1),Ot(Xr()))).length;return ji((function(i){for(var r=-1,s=cn(i.length,n);++r=t})),To=wi(function(){return arguments}())?wi:function(e){return $o(e)&&Se.call(e,"callee")&&!Ze.call(e,"callee")},No=i.isArray,Mo=Qe?Ot(Qe):function(e){return $o(e)&&gi(e)==S};function qo(e){return null!=e&&Ho(e.length)&&!Vo(e)}function Do(e){return $o(e)&&qo(e)}var Fo=nn||oc,jo=et?Ot(et):function(e){return $o(e)&&gi(e)==d};function Ro(e){if(!$o(e))return!1;var t=gi(e);return t==h||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!Wo(e)}function Vo(e){if(!Uo(e))return!1;var t=gi(e);return t==f||t==g||"[object AsyncFunction]"==t||"[object Proxy]"==t}function zo(e){return"number"==typeof e&&e==ra(e)}function Ho(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Uo(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function $o(e){return null!=e&&"object"==typeof e}var Zo=tt?Ot(tt):function(e){return $o(e)&&is(e)==p};function Go(e){return"number"==typeof e||$o(e)&&gi(e)==m}function Wo(e){if(!$o(e)||gi(e)!=v)return!1;var t=ze(e);if(null===t)return!0;var n=Se.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&Ee.call(n)==ke}var Ko=nt?Ot(nt):function(e){return $o(e)&&gi(e)==y};var Yo=it?Ot(it):function(e){return $o(e)&&is(e)==b};function Xo(e){return"string"==typeof e||!No(e)&&$o(e)&&gi(e)==w}function Jo(e){return"symbol"==typeof e||$o(e)&&gi(e)==_}var Qo=rt?Ot(rt):function(e){return $o(e)&&Ho(e.length)&&!!Re[gi(e)]};var ea=Mr(ki),ta=Mr((function(e,t){return e<=t}));function na(e){if(!e)return[];if(qo(e))return Xo(e)?Gt(e):yr(e);if(Xe&&e[Xe])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Xe]());var t=is(e);return(t==p?Vt:t==b?Ut:Pa)(e)}function ia(e){return e?(e=oa(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function ra(e){var t=ia(e),n=t%1;return t==t?n?t-n:t:0}function sa(e){return e?Yn(ra(e),0,4294967295):0}function oa(e){if("number"==typeof e)return e;if(Jo(e))return NaN;if(Uo(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Uo(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=Pt(e);var n=se.test(e);return n||ae.test(e)?Ue(e.slice(2),n?2:8):re.test(e)?NaN:+e}function aa(e){return br(e,Ea(e))}function ca(e){return null==e?"":Ji(e)}var la=_r((function(e,t){if(hs(t)||qo(t))br(t,_a(t),e);else for(var n in t)Se.call(t,n)&&Un(e,n,t[n])})),ua=_r((function(e,t){br(t,Ea(t),e)})),da=_r((function(e,t,n,i){br(t,Ea(t),e,i)})),ha=_r((function(e,t,n,i){br(t,_a(t),e,i)})),fa=$r(Kn);var ga=ji((function(e,t){e=ge(e);var n=-1,i=t.length,r=i>2?t[2]:void 0;for(r&&cs(t[0],t[1],r)&&(i=1);++n1),t})),br(e,Gr(e),n),i&&(n=Xn(n,7,Hr));for(var r=t.length;r--;)er(n,t[r]);return n}));var Aa=$r((function(e,t){return null==e?{}:function(e,t){return Ni(e,t,(function(t,n){return va(e,n)}))}(e,t)}));function ka(e,t){if(null==e)return{};var n=ft(Gr(e),(function(e){return[e]}));return t=Xr(t),Ni(e,n,(function(e,n){return t(e,n[0])}))}var Ca=jr(_a),Ia=jr(Ea);function Pa(e){return null==e?[]:Bt(e,_a(e))}var Oa=Lr((function(e,t,n){return t=t.toLowerCase(),e+(n?Ba(t):t)}));function Ba(e){return Ra(ca(e).toLowerCase())}function Ta(e){return(e=ca(e))&&e.replace(le,Dt).replace(Te,"")}var Na=Lr((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),Ma=Lr((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),qa=xr("toLowerCase");var Da=Lr((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var Fa=Lr((function(e,t,n){return e+(n?" ":"")+Ra(t)}));var ja=Lr((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Ra=xr("toUpperCase");function Va(e,t,n){return e=ca(e),void 0===(t=n?void 0:t)?function(e){return De.test(e)}(e)?function(e){return e.match(Me)||[]}(e):function(e){return e.match(Q)||[]}(e):e.match(t)||[]}var za=ji((function(e,t){try{return st(e,void 0,t)}catch(e){return Ro(e)?e:new K(e)}})),Ha=$r((function(e,t){return at(t,(function(t){t=As(t),Wn(e,t,bo(e[t],e))})),e}));function Ua(e){return function(){return e}}var $a=Cr(),Za=Cr(!0);function Ga(e){return e}function Wa(e){return xi("function"==typeof e?e:Xn(e,1))}var Ka=ji((function(e,t){return function(n){return bi(n,e,t)}})),Ya=ji((function(e,t){return function(n){return bi(e,n,t)}}));function Xa(e,t,n){var i=_a(t),r=di(t,i);null!=n||Uo(t)&&(r.length||!i.length)||(n=t,t=e,e=this,r=di(t,_a(t)));var s=!(Uo(n)&&"chain"in n&&!n.chain),o=Vo(e);return at(r,(function(n){var i=t[n];e[n]=i,o&&(e.prototype[n]=function(){var t=this.__chain__;if(s||t){var n=e(this.__wrapped__),r=n.__actions__=yr(this.__actions__);return r.push({func:i,args:arguments,thisArg:e}),n.__chain__=t,n}return i.apply(e,gt([this.value()],arguments))})})),e}function Ja(){}var Qa=Br(ft),ec=Br(lt),tc=Br(vt);function nc(e){return ls(e)?Lt(As(e)):function(e){return function(t){return hi(t,e)}}(e)}var ic=Nr(),rc=Nr(!0);function sc(){return[]}function oc(){return!1}var ac=Or((function(e,t){return e+t}),0),cc=Dr("ceil"),lc=Or((function(e,t){return e/t}),1),uc=Dr("floor");var dc,hc=Or((function(e,t){return e*t}),1),fc=Dr("round"),gc=Or((function(e,t){return e-t}),0);return In.after=function(e,t){if("function"!=typeof t)throw new ve(s);return e=ra(e),function(){if(--e<1)return t.apply(this,arguments)}},In.ary=vo,In.assign=la,In.assignIn=ua,In.assignInWith=da,In.assignWith=ha,In.at=fa,In.before=yo,In.bind=bo,In.bindAll=Ha,In.bindKey=wo,In.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return No(e)?e:[e]},In.chain=to,In.chunk=function(e,t,n){t=(n?cs(e,t,n):void 0===t)?1:an(ra(t),0);var r=null==e?0:e.length;if(!r||t<1)return[];for(var s=0,o=0,a=i(Qt(r/t));sr?0:r+n),(i=void 0===i||i>r?r:ra(i))<0&&(i+=r),i=n>i?0:sa(i);n>>0)?(e=ca(e))&&("string"==typeof t||null!=t&&!Ko(t))&&!(t=Ji(t))&&Rt(e)?ur(Gt(e),0,n):e.split(t,n):[]},In.spread=function(e,t){if("function"!=typeof e)throw new ve(s);return t=null==t?0:an(ra(t),0),ji((function(n){var i=n[t],r=ur(n,0,t);return i&>(r,i),st(e,this,r)}))},In.tail=function(e){var t=null==e?0:e.length;return t?Zi(e,1,t):[]},In.take=function(e,t,n){return e&&e.length?Zi(e,0,(t=n||void 0===t?1:ra(t))<0?0:t):[]},In.takeRight=function(e,t,n){var i=null==e?0:e.length;return i?Zi(e,(t=i-(t=n||void 0===t?1:ra(t)))<0?0:t,i):[]},In.takeRightWhile=function(e,t){return e&&e.length?nr(e,Xr(t,3),!1,!0):[]},In.takeWhile=function(e,t){return e&&e.length?nr(e,Xr(t,3)):[]},In.tap=function(e,t){return t(e),e},In.throttle=function(e,t,n){var i=!0,r=!0;if("function"!=typeof e)throw new ve(s);return Uo(n)&&(i="leading"in n?!!n.leading:i,r="trailing"in n?!!n.trailing:r),_o(e,t,{leading:i,maxWait:t,trailing:r})},In.thru=no,In.toArray=na,In.toPairs=Ca,In.toPairsIn=Ia,In.toPath=function(e){return No(e)?ft(e,As):Jo(e)?[e]:yr(Ls(ca(e)))},In.toPlainObject=aa,In.transform=function(e,t,n){var i=No(e),r=i||Fo(e)||Qo(e);if(t=Xr(t,4),null==n){var s=e&&e.constructor;n=r?i?new s:[]:Uo(e)&&Vo(s)?Pn(ze(e)):{}}return(r?at:li)(e,(function(e,i,r){return t(n,e,i,r)})),n},In.unary=function(e){return vo(e,1)},In.union=Us,In.unionBy=$s,In.unionWith=Zs,In.uniq=function(e){return e&&e.length?Qi(e):[]},In.uniqBy=function(e,t){return e&&e.length?Qi(e,Xr(t,2)):[]},In.uniqWith=function(e,t){return t="function"==typeof t?t:void 0,e&&e.length?Qi(e,void 0,t):[]},In.unset=function(e,t){return null==e||er(e,t)},In.unzip=Gs,In.unzipWith=Ws,In.update=function(e,t,n){return null==e?e:tr(e,t,ar(n))},In.updateWith=function(e,t,n,i){return i="function"==typeof i?i:void 0,null==e?e:tr(e,t,ar(n),i)},In.values=Pa,In.valuesIn=function(e){return null==e?[]:Bt(e,Ea(e))},In.without=Ks,In.words=Va,In.wrap=function(e,t){return ko(ar(t),e)},In.xor=Ys,In.xorBy=Xs,In.xorWith=Js,In.zip=Qs,In.zipObject=function(e,t){return sr(e||[],t||[],Un)},In.zipObjectDeep=function(e,t){return sr(e||[],t||[],zi)},In.zipWith=eo,In.entries=Ca,In.entriesIn=Ia,In.extend=ua,In.extendWith=da,Xa(In,In),In.add=ac,In.attempt=za,In.camelCase=Oa,In.capitalize=Ba,In.ceil=cc,In.clamp=function(e,t,n){return void 0===n&&(n=t,t=void 0),void 0!==n&&(n=(n=oa(n))==n?n:0),void 0!==t&&(t=(t=oa(t))==t?t:0),Yn(oa(e),t,n)},In.clone=function(e){return Xn(e,4)},In.cloneDeep=function(e){return Xn(e,5)},In.cloneDeepWith=function(e,t){return Xn(e,5,t="function"==typeof t?t:void 0)},In.cloneWith=function(e,t){return Xn(e,4,t="function"==typeof t?t:void 0)},In.conformsTo=function(e,t){return null==t||Jn(e,t,_a(t))},In.deburr=Ta,In.defaultTo=function(e,t){return null==e||e!=e?t:e},In.divide=lc,In.endsWith=function(e,t,n){e=ca(e),t=Ji(t);var i=e.length,r=n=void 0===n?i:Yn(ra(n),0,i);return(n-=t.length)>=0&&e.slice(n,r)==t},In.eq=Po,In.escape=function(e){return(e=ca(e))&&j.test(e)?e.replace(D,Ft):e},In.escapeRegExp=function(e){return(e=ca(e))&&G.test(e)?e.replace(Z,"\\$&"):e},In.every=function(e,t,n){var i=No(e)?lt:ii;return n&&cs(e,t,n)&&(t=void 0),i(e,Xr(t,3))},In.find=so,In.findIndex=Bs,In.findKey=function(e,t){return bt(e,Xr(t,3),li)},In.findLast=oo,In.findLastIndex=Ts,In.findLastKey=function(e,t){return bt(e,Xr(t,3),ui)},In.floor=uc,In.forEach=ao,In.forEachRight=co,In.forIn=function(e,t){return null==e?e:ai(e,Xr(t,3),Ea)},In.forInRight=function(e,t){return null==e?e:ci(e,Xr(t,3),Ea)},In.forOwn=function(e,t){return e&&li(e,Xr(t,3))},In.forOwnRight=function(e,t){return e&&ui(e,Xr(t,3))},In.get=ma,In.gt=Oo,In.gte=Bo,In.has=function(e,t){return null!=e&&rs(e,t,mi)},In.hasIn=va,In.head=Ms,In.identity=Ga,In.includes=function(e,t,n,i){e=qo(e)?e:Pa(e),n=n&&!i?ra(n):0;var r=e.length;return n<0&&(n=an(r+n,0)),Xo(e)?n<=r&&e.indexOf(t,n)>-1:!!r&&_t(e,t,n)>-1},In.indexOf=function(e,t,n){var i=null==e?0:e.length;if(!i)return-1;var r=null==n?0:ra(n);return r<0&&(r=an(i+r,0)),_t(e,t,r)},In.inRange=function(e,t,n){return t=ia(t),void 0===n?(n=t,t=0):n=ia(n),function(e,t,n){return e>=cn(t,n)&&e=-9007199254740991&&e<=9007199254740991},In.isSet=Yo,In.isString=Xo,In.isSymbol=Jo,In.isTypedArray=Qo,In.isUndefined=function(e){return void 0===e},In.isWeakMap=function(e){return $o(e)&&is(e)==E},In.isWeakSet=function(e){return $o(e)&&"[object WeakSet]"==gi(e)},In.join=function(e,t){return null==e?"":sn.call(e,t)},In.kebabCase=Na,In.last=js,In.lastIndexOf=function(e,t,n){var i=null==e?0:e.length;if(!i)return-1;var r=i;return void 0!==n&&(r=(r=ra(n))<0?an(i+r,0):cn(r,i-1)),t==t?function(e,t,n){for(var i=n+1;i--;)if(e[i]===t)return i;return i}(e,t,r):wt(e,St,r,!0)},In.lowerCase=Ma,In.lowerFirst=qa,In.lt=ea,In.lte=ta,In.max=function(e){return e&&e.length?ri(e,Ga,pi):void 0},In.maxBy=function(e,t){return e&&e.length?ri(e,Xr(t,2),pi):void 0},In.mean=function(e){return xt(e,Ga)},In.meanBy=function(e,t){return xt(e,Xr(t,2))},In.min=function(e){return e&&e.length?ri(e,Ga,ki):void 0},In.minBy=function(e,t){return e&&e.length?ri(e,Xr(t,2),ki):void 0},In.stubArray=sc,In.stubFalse=oc,In.stubObject=function(){return{}},In.stubString=function(){return""},In.stubTrue=function(){return!0},In.multiply=hc,In.nth=function(e,t){return e&&e.length?Bi(e,ra(t)):void 0},In.noConflict=function(){return Ge._===this&&(Ge._=Ce),this},In.noop=Ja,In.now=mo,In.pad=function(e,t,n){e=ca(e);var i=(t=ra(t))?Zt(e):0;if(!t||i>=t)return e;var r=(t-i)/2;return Tr(en(r),n)+e+Tr(Qt(r),n)},In.padEnd=function(e,t,n){e=ca(e);var i=(t=ra(t))?Zt(e):0;return t&&it){var i=e;e=t,t=i}if(n||e%1||t%1){var r=dn();return cn(e+r*(t-e+He("1e-"+((r+"").length-1))),t)}return Di(e,t)},In.reduce=function(e,t,n){var i=No(e)?pt:kt,r=arguments.length<3;return i(e,Xr(t,4),n,r,ti)},In.reduceRight=function(e,t,n){var i=No(e)?mt:kt,r=arguments.length<3;return i(e,Xr(t,4),n,r,ni)},In.repeat=function(e,t,n){return t=(n?cs(e,t,n):void 0===t)?1:ra(t),Fi(ca(e),t)},In.replace=function(){var e=arguments,t=ca(e[0]);return e.length<3?t:t.replace(e[1],e[2])},In.result=function(e,t,n){var i=-1,r=(t=cr(t,e)).length;for(r||(r=1,e=void 0);++i9007199254740991)return[];var n=4294967295,i=cn(e,4294967295);e-=4294967295;for(var r=It(i,t=Xr(t));++n=s)return e;var a=n-Zt(i);if(a<1)return i;var c=o?ur(o,0,a).join(""):e.slice(0,a);if(void 0===r)return c+i;if(o&&(a+=c.length-a),Ko(r)){if(e.slice(a).search(r)){var l,u=c;for(r.global||(r=pe(r.source,ca(ie.exec(r))+"g")),r.lastIndex=0;l=r.exec(u);)var d=l.index;c=c.slice(0,void 0===d?a:d)}}else if(e.indexOf(Ji(r),a)!=a){var h=c.lastIndexOf(r);h>-1&&(c=c.slice(0,h))}return c+i},In.unescape=function(e){return(e=ca(e))&&F.test(e)?e.replace(q,Kt):e},In.uniqueId=function(e){var t=++xe;return ca(e)+t},In.upperCase=ja,In.upperFirst=Ra,In.each=ao,In.eachRight=co,In.first=Ms,Xa(In,(dc={},li(In,(function(e,t){Se.call(In.prototype,t)||(dc[t]=e)})),dc),{chain:!1}),In.VERSION="4.17.21",at(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){In[e].placeholder=In})),at(["drop","take"],(function(e,t){Tn.prototype[e]=function(n){n=void 0===n?1:an(ra(n),0);var i=this.__filtered__&&!t?new Tn(this):this.clone();return i.__filtered__?i.__takeCount__=cn(n,i.__takeCount__):i.__views__.push({size:cn(n,4294967295),type:e+(i.__dir__<0?"Right":"")}),i},Tn.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),at(["filter","map","takeWhile"],(function(e,t){var n=t+1,i=1==n||3==n;Tn.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Xr(e,3),type:n}),t.__filtered__=t.__filtered__||i,t}})),at(["head","last"],(function(e,t){var n="take"+(t?"Right":"");Tn.prototype[e]=function(){return this[n](1).value()[0]}})),at(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");Tn.prototype[e]=function(){return this.__filtered__?new Tn(this):this[n](1)}})),Tn.prototype.compact=function(){return this.filter(Ga)},Tn.prototype.find=function(e){return this.filter(e).head()},Tn.prototype.findLast=function(e){return this.reverse().find(e)},Tn.prototype.invokeMap=ji((function(e,t){return"function"==typeof e?new Tn(this):this.map((function(n){return bi(n,e,t)}))})),Tn.prototype.reject=function(e){return this.filter(Lo(Xr(e)))},Tn.prototype.slice=function(e,t){e=ra(e);var n=this;return n.__filtered__&&(e>0||t<0)?new Tn(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),void 0!==t&&(n=(t=ra(t))<0?n.dropRight(-t):n.take(t-e)),n)},Tn.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Tn.prototype.toArray=function(){return this.take(4294967295)},li(Tn.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),i=/^(?:head|last)$/.test(t),r=In[i?"take"+("last"==t?"Right":""):t],s=i||/^find/.test(t);r&&(In.prototype[t]=function(){var t=this.__wrapped__,o=i?[1]:arguments,a=t instanceof Tn,c=o[0],l=a||No(t),u=function(e){var t=r.apply(In,gt([e],o));return i&&d?t[0]:t};l&&n&&"function"==typeof c&&1!=c.length&&(a=l=!1);var d=this.__chain__,h=!!this.__actions__.length,f=s&&!d,g=a&&!h;if(!s&&l){t=g?t:new Tn(this);var p=e.apply(t,o);return p.__actions__.push({func:no,args:[u],thisArg:void 0}),new Bn(p,d)}return f&&g?e.apply(this,o):(p=this.thru(u),f?i?p.value()[0]:p.value():p)})})),at(["pop","push","shift","sort","splice","unshift"],(function(e){var t=ye[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",i=/^(?:pop|shift)$/.test(e);In.prototype[e]=function(){var e=arguments;if(i&&!this.__chain__){var r=this.value();return t.apply(No(r)?r:[],e)}return this[n]((function(n){return t.apply(No(n)?n:[],e)}))}})),li(Tn.prototype,(function(e,t){var n=In[t];if(n){var i=n.name+"";Se.call(wn,i)||(wn[i]=[]),wn[i].push({name:t,func:n})}})),wn[Ir(void 0,2).name]=[{name:"wrapper",func:void 0}],Tn.prototype.clone=function(){var e=new Tn(this.__wrapped__);return e.__actions__=yr(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=yr(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=yr(this.__views__),e},Tn.prototype.reverse=function(){if(this.__filtered__){var e=new Tn(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Tn.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=No(e),i=t<0,r=n?e.length:0,s=function(e,t,n){var i=-1,r=n.length;for(;++i=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},In.prototype.plant=function(e){for(var t,n=this;n instanceof On;){var i=Cs(n);i.__index__=0,i.__values__=void 0,t?r.__wrapped__=i:t=i;var r=i;n=n.__wrapped__}return r.__wrapped__=e,t},In.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Tn){var t=e;return this.__actions__.length&&(t=new Tn(this)),(t=t.reverse()).__actions__.push({func:no,args:[Hs],thisArg:void 0}),new Bn(t,this.__chain__)}return this.thru(Hs)},In.prototype.toJSON=In.prototype.valueOf=In.prototype.value=function(){return ir(this.__wrapped__,this.__actions__)},In.prototype.first=In.prototype.head,Xe&&(In.prototype[Xe]=function(){return this}),In}();Ge._=Yt,void 0===(r=function(){return Yt}.call(t,n,t,i))||(i.exports=r)}).call(this)}).call(this,n(9),n(50)(e))},function(e,t){
+ */(function(){var s="Expected a function",o="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",u="[object Boolean]",d="[object Date]",h="[object Error]",f="[object Function]",g="[object GeneratorFunction]",p="[object Map]",m="[object Number]",v="[object Object]",y="[object RegExp]",b="[object Set]",w="[object String]",_="[object Symbol]",E="[object WeakMap]",S="[object ArrayBuffer]",x="[object DataView]",L="[object Float32Array]",A="[object Float64Array]",k="[object Int8Array]",C="[object Int16Array]",I="[object Int32Array]",P="[object Uint8Array]",O="[object Uint16Array]",B="[object Uint32Array]",T=/\b__p \+= '';/g,N=/\b(__p \+=) '' \+/g,M=/(__e\(.*?\)|\b__t\)) \+\n'';/g,q=/&(?:amp|lt|gt|quot|#39);/g,D=/[&<>"']/g,F=RegExp(q.source),j=RegExp(D.source),R=/<%-([\s\S]+?)%>/g,V=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,H=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,U=/^\w*$/,$=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Z=/[\\^$.*+?()[\]{}|]/g,G=RegExp(Z.source),W=/^\s+/,K=/\s/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,X=/\{\n\/\* \[wrapped with (.+)\] \*/,J=/,? & /,Q=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ee=/[()=,{}\[\]\/\s]/,te=/\\(\\)?/g,ne=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ie=/\w*$/,re=/^[-+]0x[0-9a-f]+$/i,se=/^0b[01]+$/i,oe=/^\[object .+?Constructor\]$/,ae=/^0o[0-7]+$/i,ce=/^(?:0|[1-9]\d*)$/,le=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ue=/($^)/,de=/['\n\r\u2028\u2029\\]/g,he="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",fe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",ge="[\\ud800-\\udfff]",pe="["+fe+"]",me="["+he+"]",ve="\\d+",ye="[\\u2700-\\u27bf]",be="[a-z\\xdf-\\xf6\\xf8-\\xff]",we="[^\\ud800-\\udfff"+fe+ve+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",_e="\\ud83c[\\udffb-\\udfff]",Ee="[^\\ud800-\\udfff]",Se="(?:\\ud83c[\\udde6-\\uddff]){2}",xe="[\\ud800-\\udbff][\\udc00-\\udfff]",Le="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Ae="(?:"+be+"|"+we+")",ke="(?:"+Le+"|"+we+")",Ce="(?:"+me+"|"+_e+")"+"?",Ie="[\\ufe0e\\ufe0f]?"+Ce+("(?:\\u200d(?:"+[Ee,Se,xe].join("|")+")[\\ufe0e\\ufe0f]?"+Ce+")*"),Pe="(?:"+[ye,Se,xe].join("|")+")"+Ie,Oe="(?:"+[Ee+me+"?",me,Se,xe,ge].join("|")+")",Be=RegExp("['’]","g"),Te=RegExp(me,"g"),Ne=RegExp(_e+"(?="+_e+")|"+Oe+Ie,"g"),Me=RegExp([Le+"?"+be+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[pe,Le,"$"].join("|")+")",ke+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[pe,Le+Ae,"$"].join("|")+")",Le+"?"+Ae+"+(?:['’](?:d|ll|m|re|s|t|ve))?",Le+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ve,Pe].join("|"),"g"),qe=RegExp("[\\u200d\\ud800-\\udfff"+he+"\\ufe0e\\ufe0f]"),De=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Fe=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],je=-1,Re={};Re[L]=Re[A]=Re[k]=Re[C]=Re[I]=Re[P]=Re["[object Uint8ClampedArray]"]=Re[O]=Re[B]=!0,Re[c]=Re[l]=Re[S]=Re[u]=Re[x]=Re[d]=Re[h]=Re[f]=Re[p]=Re[m]=Re[v]=Re[y]=Re[b]=Re[w]=Re[E]=!1;var Ve={};Ve[c]=Ve[l]=Ve[S]=Ve[x]=Ve[u]=Ve[d]=Ve[L]=Ve[A]=Ve[k]=Ve[C]=Ve[I]=Ve[p]=Ve[m]=Ve[v]=Ve[y]=Ve[b]=Ve[w]=Ve[_]=Ve[P]=Ve["[object Uint8ClampedArray]"]=Ve[O]=Ve[B]=!0,Ve[h]=Ve[f]=Ve[E]=!1;var ze={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},He=parseFloat,Ue=parseInt,$e="object"==typeof e&&e&&e.Object===Object&&e,Ze="object"==typeof self&&self&&self.Object===Object&&self,Ge=$e||Ze||Function("return this")(),We=t&&!t.nodeType&&t,Ke=We&&"object"==typeof i&&i&&!i.nodeType&&i,Ye=Ke&&Ke.exports===We,Xe=Ye&&$e.process,Je=function(){try{var e=Ke&&Ke.require&&Ke.require("util").types;return e||Xe&&Xe.binding&&Xe.binding("util")}catch(e){}}(),Qe=Je&&Je.isArrayBuffer,et=Je&&Je.isDate,tt=Je&&Je.isMap,nt=Je&&Je.isRegExp,it=Je&&Je.isSet,rt=Je&&Je.isTypedArray;function st(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function ot(e,t,n,i){for(var r=-1,s=null==e?0:e.length;++r-1}function ht(e,t,n){for(var i=-1,r=null==e?0:e.length;++i-1;);return n}function Mt(e,t){for(var n=e.length;n--&&_t(t,e[n],0)>-1;);return n}function qt(e,t){for(var n=e.length,i=0;n--;)e[n]===t&&++i;return i}var Dt=At({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Ft=At({"&":"&","<":"<",">":">",'"':""","'":"'"});function jt(e){return"\\"+ze[e]}function Rt(e){return qe.test(e)}function Vt(e){var t=-1,n=Array(e.size);return e.forEach((function(e,i){n[++t]=[i,e]})),n}function zt(e,t){return function(n){return e(t(n))}}function Ht(e,t){for(var n=-1,i=e.length,r=0,s=[];++n",""":'"',"'":"'"});var Yt=function e(t){var n,i=(t=null==t?Ge:Yt.defaults(Ge.Object(),t,Yt.pick(Ge,Fe))).Array,r=t.Date,K=t.Error,he=t.Function,fe=t.Math,ge=t.Object,pe=t.RegExp,me=t.String,ve=t.TypeError,ye=i.prototype,be=he.prototype,we=ge.prototype,_e=t["__core-js_shared__"],Ee=be.toString,Se=we.hasOwnProperty,xe=0,Le=(n=/[^.]+$/.exec(_e&&_e.keys&&_e.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Ae=we.toString,ke=Ee.call(ge),Ce=Ge._,Ie=pe("^"+Ee.call(Se).replace(Z,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Pe=Ye?t.Buffer:void 0,Oe=t.Symbol,Ne=t.Uint8Array,qe=Pe?Pe.allocUnsafe:void 0,ze=zt(ge.getPrototypeOf,ge),$e=ge.create,Ze=we.propertyIsEnumerable,We=ye.splice,Ke=Oe?Oe.isConcatSpreadable:void 0,Xe=Oe?Oe.iterator:void 0,Je=Oe?Oe.toStringTag:void 0,yt=function(){try{var e=es(ge,"defineProperty");return e({},"",{}),e}catch(e){}}(),At=t.clearTimeout!==Ge.clearTimeout&&t.clearTimeout,Xt=r&&r.now!==Ge.Date.now&&r.now,Jt=t.setTimeout!==Ge.setTimeout&&t.setTimeout,Qt=fe.ceil,en=fe.floor,tn=ge.getOwnPropertySymbols,nn=Pe?Pe.isBuffer:void 0,rn=t.isFinite,sn=ye.join,on=zt(ge.keys,ge),an=fe.max,cn=fe.min,ln=r.now,un=t.parseInt,dn=fe.random,hn=ye.reverse,fn=es(t,"DataView"),gn=es(t,"Map"),pn=es(t,"Promise"),mn=es(t,"Set"),vn=es(t,"WeakMap"),yn=es(ge,"create"),bn=vn&&new vn,wn={},_n=ks(fn),En=ks(gn),Sn=ks(pn),xn=ks(mn),Ln=ks(vn),An=Oe?Oe.prototype:void 0,kn=An?An.valueOf:void 0,Cn=An?An.toString:void 0;function In(e){if($o(e)&&!No(e)&&!(e instanceof Tn)){if(e instanceof Bn)return e;if(Se.call(e,"__wrapped__"))return Cs(e)}return new Bn(e)}var Pn=function(){function e(){}return function(t){if(!Uo(t))return{};if($e)return $e(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();function On(){}function Bn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Tn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Nn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Xn(e,t,n,i,r,s){var o,a=1&t,l=2&t,h=4&t;if(n&&(o=r?n(e,i,r,s):n(e)),void 0!==o)return o;if(!Uo(e))return e;var E=No(e);if(E){if(o=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&Se.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!a)return yr(e,o)}else{var T=is(e),N=T==f||T==g;if(Fo(e))return hr(e,a);if(T==v||T==c||N&&!r){if(o=l||N?{}:ss(e),!a)return l?function(e,t){return br(e,ns(e),t)}(e,function(e,t){return e&&br(t,Ea(t),e)}(o,e)):function(e,t){return br(e,ts(e),t)}(e,Gn(o,e))}else{if(!Ve[T])return r?e:{};o=function(e,t,n){var i=e.constructor;switch(t){case S:return fr(e);case u:case d:return new i(+e);case x:return function(e,t){var n=t?fr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case L:case A:case k:case C:case I:case P:case"[object Uint8ClampedArray]":case O:case B:return gr(e,n);case p:return new i;case m:case w:return new i(e);case y:return function(e){var t=new e.constructor(e.source,ie.exec(e));return t.lastIndex=e.lastIndex,t}(e);case b:return new i;case _:return r=e,kn?ge(kn.call(r)):{}}var r}(e,T,a)}}s||(s=new Fn);var M=s.get(e);if(M)return M;s.set(e,o),Yo(e)?e.forEach((function(i){o.add(Xn(i,t,n,i,e,s))})):Zo(e)&&e.forEach((function(i,r){o.set(r,Xn(i,t,n,r,e,s))}));var q=E?void 0:(h?l?Gr:Zr:l?Ea:_a)(e);return at(q||e,(function(i,r){q&&(i=e[r=i]),Un(o,r,Xn(i,t,n,r,e,s))})),o}function Jn(e,t,n){var i=n.length;if(null==e)return!i;for(e=ge(e);i--;){var r=n[i],s=t[r],o=e[r];if(void 0===o&&!(r in e)||!s(o))return!1}return!0}function Qn(e,t,n){if("function"!=typeof e)throw new ve(s);return ws((function(){e.apply(void 0,n)}),t)}function ei(e,t,n,i){var r=-1,s=dt,o=!0,a=e.length,c=[],l=t.length;if(!a)return c;n&&(t=ft(t,Ot(n))),i?(s=ht,o=!1):t.length>=200&&(s=Tt,o=!1,t=new Dn(t));e:for(;++r-1},Mn.prototype.set=function(e,t){var n=this.__data__,i=$n(n,e);return i<0?(++this.size,n.push([e,t])):n[i][1]=t,this},qn.prototype.clear=function(){this.size=0,this.__data__={hash:new Nn,map:new(gn||Mn),string:new Nn}},qn.prototype.delete=function(e){var t=Jr(this,e).delete(e);return this.size-=t?1:0,t},qn.prototype.get=function(e){return Jr(this,e).get(e)},qn.prototype.has=function(e){return Jr(this,e).has(e)},qn.prototype.set=function(e,t){var n=Jr(this,e),i=n.size;return n.set(e,t),this.size+=n.size==i?0:1,this},Dn.prototype.add=Dn.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Dn.prototype.has=function(e){return this.__data__.has(e)},Fn.prototype.clear=function(){this.__data__=new Mn,this.size=0},Fn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Fn.prototype.get=function(e){return this.__data__.get(e)},Fn.prototype.has=function(e){return this.__data__.has(e)},Fn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Mn){var i=n.__data__;if(!gn||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new qn(i)}return n.set(e,t),this.size=n.size,this};var ti=Er(li),ni=Er(ui,!0);function ii(e,t){var n=!0;return ti(e,(function(e,i,r){return n=!!t(e,i,r)})),n}function ri(e,t,n){for(var i=-1,r=e.length;++i0&&n(a)?t>1?oi(a,t-1,n,i,r):gt(r,a):i||(r[r.length]=a)}return r}var ai=Sr(),ci=Sr(!0);function li(e,t){return e&&ai(e,t,_a)}function ui(e,t){return e&&ci(e,t,_a)}function di(e,t){return ut(t,(function(t){return Vo(e[t])}))}function hi(e,t){for(var n=0,i=(t=cr(t,e)).length;null!=e&&nt}function mi(e,t){return null!=e&&Se.call(e,t)}function vi(e,t){return null!=e&&t in ge(e)}function yi(e,t,n){for(var r=n?ht:dt,s=e[0].length,o=e.length,a=o,c=i(o),l=1/0,u=[];a--;){var d=e[a];a&&t&&(d=ft(d,Ot(t))),l=cn(d.length,l),c[a]=!n&&(t||s>=120&&d.length>=120)?new Dn(a&&d):void 0}d=e[0];var h=-1,f=c[0];e:for(;++h