UNPKG

prestashop_corp_tests_base_framework

Version:

Base framework for new tests project

2 lines 96.7 kB
var e={"./src/helpers/browserHelper.ts":function(e,t,o){var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o);var n=Object.getOwnPropertyDescriptor(t,o);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[o]}}),Object.defineProperty(e,r,n)}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&r(t,e,o);return n(t,e),t},s=this&&this.__awaiter||function(e,t,o,r){return new(o||(o=Promise))((function(n,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function l(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,l)}c((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.browserHelper=t.deleteRoute=t.addRoute=t.addInitScript=t.getTab=t.closeTab=t.addTab=t.getBrowserContext=t.closeContext=t.createContext=t.closeBrowser=t.createBrowser=void 0;const l=o("playwright"),c=o("./src/helpers/globalVars.ts"),a={chromium:l.chromium,firefox:l.firefox,webkit:l.webkit};t.createBrowser=function(){return s(this,void 0,void 0,(function*(){const e=c.GlobalVars.getBrowserOptions();let t=1;for(;t<=3;)try{return yield a[c.GlobalVars.browser.name].launch(e)}catch(e){if(3===t)throw new Error(e.message);yield new Promise((e=>setTimeout(e,5e3))),t+=1}return null}))},t.closeBrowser=function(e){return s(this,void 0,void 0,(function*(){yield e.close()}))},t.createContext=function(e,t=[]){return s(this,void 0,void 0,(function*(){const o=c.GlobalVars.getBrowserContextOptions(),r=yield e.newContext(o);return yield r.addCookies(t),r}))},t.closeContext=function(e){return s(this,void 0,void 0,(function*(){yield e.close()}))},t.getBrowserContext=function(e,t=-1){const o=e.contexts();if(0===o.length)throw new Error("0 Context was found for this browser");if(t<-1||t>=o.length)throw new Error(`Position ${t} is wrong to get the context`);return-1===t?o[o.length-1]:o[t]},t.addTab=function(e){return s(this,void 0,void 0,(function*(){return e.newPage()}))},t.closeTab=function(e){return s(this,void 0,void 0,(function*(){yield e.close()}))},t.getTab=function(e,t=-1){const o=e.pages();if(0===o.length)throw new Error("0 Page was found for this context");if(t<-1||t>=o.length)throw new Error(`Position ${t} is wrong to get the browser tab`);return-1===t?o[o.length-1]:o[t]},t.addRoute=function(e,t,o){return s(this,void 0,void 0,(function*(){yield e.route(t,o)}))},t.deleteRoute=function(e,t,o){return s(this,void 0,void 0,(function*(){yield e.unroute(t,o)}))},t.addInitScript=function(e,t,o){return s(this,void 0,void 0,(function*(){yield e.addInitScript(t,o)}))},t.browserHelper=i(o("./src/helpers/browserHelper.ts"))},"./src/helpers/dbHelper.ts":function(e,t,o){var r=this&&this.__awaiter||function(e,t,o,r){return new(o||(o=Promise))((function(n,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function l(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,l)}c((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.dbHelper=void 0;const n=o("mysql2/promise"),i=o("./src/helpers/globalVars.ts");t.dbHelper=new class{createPool(e=i.GlobalVars.db){return(0,n.createPool)(e)}executeQuery(e){return r(this,void 0,void 0,(function*(){const t=this.createPool(),o=yield t.execute(e);return yield this.destroyConnection(t),o}))}getQueryResults(e){return r(this,void 0,void 0,(function*(){return(yield this.executeQuery(e))[0]}))}createCustomSelectQuery(e,t="*",o){const r=t=>`SELECT ${t} FROM ${e} ${o?`where ${o}`:""};`;return r("string"==typeof t?t:t.join(","))}getResultsCustomSelectQuery(e,t="*",o){return r(this,void 0,void 0,(function*(){return this.getQueryResults(this.createCustomSelectQuery(e,t,o))}))}getQueryFields(e){return r(this,void 0,void 0,(function*(){return(yield this.executeQuery(e))[1]}))}destroyConnection(e){return r(this,void 0,void 0,(function*(){yield e.end()}))}}},"./src/helpers/globalVars.ts":(e,t,o)=>{var r,n,i,s,l,c,a,u,d,h,v,f,p,b,w;Object.defineProperty(t,"__esModule",{value:!0}),t.GlobalVars=void 0;const g=o("dotenv"),m=o("playwright");(0,g.config)({path:".env"});class y{static getBrowserOptions(){if(!this.platformsList.includes(this.platform))throw new Error(`The framework can't handle the platform ${this.platform}`);if(!this.browsersList.includes(this.browser.name))throw new Error(`The framework can't handle the browser ${this.browser.name}`);let e;return"mobile"===this.platform||"chromium"===this.browser.name?(e=Object.assign(Object.assign({},this.browser.options),{chromiumSandbox:!1}),e.args.push("--disable-web-security")):e=this.browser.options,e}static getBrowserContextOptions(){let e=this.browserContext.options;if("mobile"===this.platform){const t=m.devices[this.device.name];e=Object.assign(Object.assign({},e),t)}return e}}t.GlobalVars=y,y.browsersList=["chromium","firefox","webkit"],y.platformsList=["desktop","mobile"],y.platform=null!==(r=process.env.PLATFORM)&&void 0!==r?r:"desktop",y.browser={name:null!==(n=process.env.BROWSER)&&void 0!==n?n:"chromium",options:{headless:!("false"===process.env.HEADLESS),timeout:0,slowMo:parseInt(null!==(i=process.env.SLOW_MO)&&void 0!==i?i:"5",10),acceptDownloads:!(null===(s=process.env.ACCEPT_DOWNLOADS)||void 0===s||s),args:[]}},y.browserContext={options:{viewport:{width:parseInt(null!==(l=process.env.WIDTH)&&void 0!==l?l:"1680",10),height:parseInt(null!==(c=process.env.HEIGHT)&&void 0!==c?c:"900",10)},locale:null!==(a=process.env.LOCALE)&&void 0!==a?a:"fr-FR",httpCredentials:{username:null!==(u=process.env.HTTP_CRED_USERNAME)&&void 0!==u?u:"",password:null!==(d=process.env.HTTP_CRED_PASSWORD)&&void 0!==d?d:""}}},y.device={name:process.env.DEVICE},y.url=process.env.URL,y.db={host:null!==(h=process.env.DB_HOST)&&void 0!==h?h:"localhost",user:null!==(v=process.env.DB_USER)&&void 0!==v?v:"root",password:null!==(f=process.env.DB_PASSWORD)&&void 0!==f?f:"",database:null!==(p=process.env.DB_NAME)&&void 0!==p?p:"mydatabase"},y.screenshots={active:null===(b=process.env.SCREENSHOTS_ON)||void 0===b||b,folder:null!==(w=process.env.SCREENSHOTS_FOLDER)&&void 0!==w?w:"./screenshots"}},"./src/utils/mocha/setup.ts":function(e,t,o){var r=this&&this.__awaiter||function(e,t,o,r){return new(o||(o=Promise))((function(n,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function l(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,l)}c((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.mochaHooks=void 0;const n=o("./src/helpers/globalVars.ts"),i=o("./src/helpers/browserHelper.ts");let s=1;t.mochaHooks={beforeAll:function(){return r(this,void 0,void 0,(function*(){this.browser=yield(0,i.createBrowser)()}))},afterEach:function(){var e;return r(this,void 0,void 0,(function*(){if(n.GlobalVars.screenshots.active&&"failed"===(null===(e=this.currentTest)||void 0===e?void 0:e.state)){const e=(0,i.getBrowserContext)(this.browser),t=(0,i.getTab)(e);yield t.screenshot({path:`${n.GlobalVars.screenshots.folder}/${s}.png`,fullPage:!0}),s++}}))},afterAll:function(){return r(this,void 0,void 0,(function*(){yield(0,i.closeBrowser)(this.browser)}))}}},"./src/utils/pages/commonPage.ts":function(e,t){var o=this&&this.__awaiter||function(e,t,o,r){return new(o||(o=Promise))((function(n,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function l(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,l)}c((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonPage=void 0;t.CommonPage=class{getPageTitle(e){return o(this,void 0,void 0,(function*(){return e.title()}))}goTo(e,t,r="networkidle"){return o(this,void 0,void 0,(function*(){yield e.goto(t,{waitUntil:r})}))}getCurrentURL(e){return decodeURIComponent(e.url())}waitForTimeout(e,t=1e4){return o(this,void 0,void 0,(function*(){yield e.waitForTimeout(t)}))}waitForSelector(e,t,r,n=1e4){return o(this,void 0,void 0,(function*(){yield e.waitForSelector(t,{state:r,timeout:n})}))}waitForVisibleSelector(e,t,r=1e4){return o(this,void 0,void 0,(function*(){yield this.waitForSelector(e,t,"visible",r)}))}waitForHiddenSelector(e,t,r=1e4){return o(this,void 0,void 0,(function*(){yield this.waitForSelector(e,t,"hidden",r)}))}waitForAttachedSelector(e,t,r=1e4){return o(this,void 0,void 0,(function*(){yield this.waitForSelector(e,t,"attached",r)}))}waitForDetachedSelector(e,t,r=1e4){return o(this,void 0,void 0,(function*(){yield this.waitForSelector(e,t,"detached",r)}))}getTextContent(e,t,r=!0){return o(this,void 0,void 0,(function*(){r&&(yield this.waitForVisibleSelector(e,t));const o=yield e.$eval(t,(e=>e.textContent));return o?o.replace(/\s+/g," ").trim():null}))}getAttributeContent(e,t,r){return o(this,void 0,void 0,(function*(){return yield e.waitForSelector(t,{state:"attached"}),e.$eval(t,((e,t)=>e.getAttribute(t)),r)}))}elementVisible(e,t,r=10){return o(this,void 0,void 0,(function*(){try{return yield this.waitForVisibleSelector(e,t,r),!0}catch(e){return!1}}))}elementNotVisible(e,t,r=10){return o(this,void 0,void 0,(function*(){try{return yield this.waitForHiddenSelector(e,t,r),!0}catch(e){return!1}}))}openLinkWithTargetBlank(e,t,r="body .logo"){return o(this,void 0,void 0,(function*(){const[o]=yield Promise.all([e.waitForEvent("popup"),e.click(t)]);return yield o.waitForLoadState("networkidle"),yield this.waitForVisibleSelector(o,r),o}))}waitForSelectorAndClick(e,t,r=5e3){return o(this,void 0,void 0,(function*(){yield this.waitForVisibleSelector(e,t,r),yield e.click(t)}))}reloadPage(e){return o(this,void 0,void 0,(function*(){yield e.reload()}))}setValue(e,t,r){return o(this,void 0,void 0,(function*(){yield e.fill(t,r)}))}deleteTextFromInput(e,t){return o(this,void 0,void 0,(function*(){yield this.waitForSelectorAndClick(e,t),yield e.click(t,{clickCount:3}),yield e.waitForTimeout(100),yield e.press(t,"Delete")}))}dialogListener(e,t,o){e.once("dialog",(e=>{t?""!==o?e.accept(o):e.accept():e.dismiss()}))}closePage(e,t,r=-1){return o(this,void 0,void 0,(function*(){return yield t.close(),-1!==r?e.pages()[r]:null}))}scrollTo(e,t){return o(this,void 0,void 0,(function*(){yield e.$eval(t,(e=>e.scrollIntoView()))}))}selectByVisibleText(e,t,r,n=!1){return o(this,void 0,void 0,(function*(){yield e.selectOption(t,{label:r.toString()},{force:n})}))}getNumberFromText(e,t,r=0){return o(this,void 0,void 0,(function*(){yield e.waitForTimeout(r);const o=yield this.getTextContent(e,t),n=/\d+/g.exec(o).toString();return parseInt(n,10)}))}clickAndWaitForNavigation(e,t,r="networkidle"){return o(this,void 0,void 0,(function*(){yield Promise.all([e.waitForNavigation({waitUntil:r}),e.click(t)])}))}goToPreviousPage(e,t="load"){return o(this,void 0,void 0,(function*(){yield e.goBack({waitUntil:t})}))}isCheckboxSelected(e,t){return o(this,void 0,void 0,(function*(){return e.isChecked(t)}))}changeCheckboxValue(e,t,r=!0){return o(this,void 0,void 0,(function*(){r?yield e.check(t):yield e.uncheck(t)}))}dragAndDrop(e,t,r){return o(this,void 0,void 0,(function*(){yield e.dragAndDrop(t,r)}))}uploadFile(e,t,r){return o(this,void 0,void 0,(function*(){const o=yield e.$(t);yield o.setInputFiles(r)}))}uploadOnFileChooser(e,t,r){return o(this,void 0,void 0,(function*(){e.once("filechooser",(e=>{e.setFiles(r)})),yield e.click(t)}))}getParentElement(e,t){return e.evaluateHandle((e=>document.querySelector(e).parentElement),t)}clickAndWaitForDownload(e,t,r=!1){return o(this,void 0,void 0,(function*(){r&&(yield e.$eval(t,(e=>e.target="")));const[o]=yield Promise.all([e.waitForEvent("download"),e.click(t)]);return o.path()}))}getBoundingClientRect(e,t){return e.evaluate((e=>{var t;return null===(t=document.querySelector(e))||void 0===t?void 0:t.getBoundingClientRect().toJSON()}),t)}getDocumentClientSize(e){return e.evaluate((()=>({vw:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),vh:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)})))}isElementVisibleAfterScroll(e,t){return o(this,void 0,void 0,(function*(){const o=yield this.getBoundingClientRect(e,t);if(o.top>=0&&o.left>=0){const t=yield this.getDocumentClientSize(e);return o.right<=t.vw&&o.bottom<=t.vh}return!1}))}}},dotenv:e=>{e.exports=require("dotenv")},"mysql2/promise":e=>{e.exports=require("mysql2/promise")},playwright:e=>{e.exports=require("playwright")}},t={};function o(r){var n=t[r];if(void 0!==n)return n.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,o),i.exports}var r={};(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),e.mochaHooks=e.CommonPage=e.deleteRoute=e.addRoute=e.addInitScript=e.getTab=e.closeTab=e.addTab=e.getBrowserContext=e.closeContext=e.createContext=e.closeBrowser=e.createBrowser=e.browserHelper=e.dbHelper=e.GlobalVars=void 0;var t=o("./src/helpers/globalVars.ts");Object.defineProperty(e,"GlobalVars",{enumerable:!0,get:function(){return t.GlobalVars}});var n=o("./src/helpers/dbHelper.ts");Object.defineProperty(e,"dbHelper",{enumerable:!0,get:function(){return n.dbHelper}});var i=o("./src/helpers/browserHelper.ts");Object.defineProperty(e,"browserHelper",{enumerable:!0,get:function(){return i.browserHelper}});var s=o("./src/helpers/browserHelper.ts");Object.defineProperty(e,"createBrowser",{enumerable:!0,get:function(){return s.createBrowser}}),Object.defineProperty(e,"closeBrowser",{enumerable:!0,get:function(){return s.closeBrowser}}),Object.defineProperty(e,"createContext",{enumerable:!0,get:function(){return s.createContext}}),Object.defineProperty(e,"closeContext",{enumerable:!0,get:function(){return s.closeContext}}),Object.defineProperty(e,"getBrowserContext",{enumerable:!0,get:function(){return s.getBrowserContext}}),Object.defineProperty(e,"addTab",{enumerable:!0,get:function(){return s.addTab}}),Object.defineProperty(e,"closeTab",{enumerable:!0,get:function(){return s.closeTab}}),Object.defineProperty(e,"getTab",{enumerable:!0,get:function(){return s.getTab}}),Object.defineProperty(e,"addInitScript",{enumerable:!0,get:function(){return s.addInitScript}}),Object.defineProperty(e,"addRoute",{enumerable:!0,get:function(){return s.addRoute}}),Object.defineProperty(e,"deleteRoute",{enumerable:!0,get:function(){return s.deleteRoute}});var l=o("./src/utils/pages/commonPage.ts");Object.defineProperty(e,"CommonPage",{enumerable:!0,get:function(){return l.CommonPage}});var c=o("./src/utils/mocha/setup.ts");Object.defineProperty(e,"mochaHooks",{enumerable:!0,get:function(){return c.mochaHooks}})})(),exports.CommonPage=r.CommonPage,exports.GlobalVars=r.GlobalVars,exports.__esModule=r.__esModule,exports.addInitScript=r.addInitScript,exports.addRoute=r.addRoute,exports.addTab=r.addTab,exports.browserHelper=r.browserHelper,exports.closeBrowser=r.closeBrowser,exports.closeContext=r.closeContext,exports.closeTab=r.closeTab,exports.createBrowser=r.createBrowser,exports.createContext=r.createContext,exports.dbHelper=r.dbHelper,exports.deleteRoute=r.deleteRoute,exports.getBrowserContext=r.getBrowserContext,exports.getTab=r.getTab,exports.mochaHooks=r.mochaHooks,Object.defineProperty(exports,"__esModule",{value:!0}); //# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFBZ0I1USxXQUFhLElBRXpILElBQUk2USxFQUFlLEVBQVEsbUNBQzNCdlQsT0FBT2MsZUFBZTBCLEVBQVMsYUFBYyxDQUFFNUIsWUFBWSxFQUFNQyxJQUFLLFdBQWMsT0FBTzBTLEVBQWExSCxVQUFZLElBRXBILElBQUkySCxFQUFVLEVBQVEsOEJBQ3RCeFQsT0FBT2MsZUFBZTBCLEVBQVMsYUFBYyxDQUFFNUIsWUFBWSxFQUFNQyxJQUFLLFdBQWMsT0FBTzJTLEVBQVF0SSxVQUFZLEciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wcmVzdGFzaG9wX2NvcnBfdGVzdHNfYmFzZV9mcmFtZXdvcmsvLi9zcmMvaGVscGVycy9icm93c2VySGVscGVyLnRzIiwid2VicGFjazovL3ByZXN0YXNob3BfY29ycF90ZXN0c19iYXNlX2ZyYW1ld29yay8uL3NyYy9oZWxwZXJzL2RiSGVscGVyLnRzIiwid2VicGFjazovL3ByZXN0YXNob3BfY29ycF90ZXN0c19iYXNlX2ZyYW1ld29yay8uL3NyYy9oZWxwZXJzL2dsb2JhbFZhcnMudHMiLCJ3ZWJwYWNrOi8vcHJlc3Rhc2hvcF9jb3JwX3Rlc3RzX2Jhc2VfZnJhbWV3b3JrLy4vc3JjL3V0aWxzL21vY2hhL3NldHVwLnRzIiwid2VicGFjazovL3ByZXN0YXNob3BfY29ycF90ZXN0c19iYXNlX2ZyYW1ld29yay8uL3NyYy91dGlscy9wYWdlcy9jb21tb25QYWdlLnRzIiwid2VicGFjazovL3ByZXN0YXNob3BfY29ycF90ZXN0c19iYXNlX2ZyYW1ld29yay9leHRlcm5hbCBjb21tb25qcyBcImRvdGVudlwiIiwid2VicGFjazovL3ByZXN0YXNob3BfY29ycF90ZXN0c19iYXNlX2ZyYW1ld29yay9leHRlcm5hbCBjb21tb25qcyBcIm15c3FsMi9wcm9taXNlXCIiLCJ3ZWJwYWNrOi8vcHJlc3Rhc2hvcF9jb3JwX3Rlc3RzX2Jhc2VfZnJhbWV3b3JrL2V4dGVybmFsIGNvbW1vbmpzIFwicGxheXdyaWdodFwiIiwid2VicGFjazovL3ByZXN0YXNob3BfY29ycF90ZXN0c19iYXNlX2ZyYW1ld29yay93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9wcmVzdGFzaG9wX2NvcnBfdGVzdHNfYmFzZV9mcmFtZXdvcmsvLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5icm93c2VySGVscGVyID0gZXhwb3J0cy5kZWxldGVSb3V0ZSA9IGV4cG9ydHMuYWRkUm91dGUgPSBleHBvcnRzLmFkZEluaXRTY3JpcHQgPSBleHBvcnRzLmdldFRhYiA9IGV4cG9ydHMuY2xvc2VUYWIgPSBleHBvcnRzLmFkZFRhYiA9IGV4cG9ydHMuZ2V0QnJvd3NlckNvbnRleHQgPSBleHBvcnRzLmNsb3NlQ29udGV4dCA9IGV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGV4cG9ydHMuY2xvc2VCcm93c2VyID0gZXhwb3J0cy5jcmVhdGVCcm93c2VyID0gdm9pZCAwO1xuLy8gSW1wb3J0IG1vZHVsZXNcbmNvbnN0IHBsYXl3cmlnaHRfMSA9IHJlcXVpcmUoXCJwbGF5d3JpZ2h0XCIpO1xuLy8gSW1wb3J0IGhlbHBlcnNcbmNvbnN0IGdsb2JhbFZhcnNfMSA9IHJlcXVpcmUoXCJzcmMvaGVscGVycy9nbG9iYWxWYXJzXCIpO1xuY29uc3QgcGxheXdyaWdodCA9IHsgY2hyb21pdW06IHBsYXl3cmlnaHRfMS5jaHJvbWl1bSwgZmlyZWZveDogcGxheXdyaWdodF8xLmZpcmVmb3gsIHdlYmtpdDogcGxheXdyaWdodF8xLndlYmtpdCB9O1xuLyogQnJvd3NlciBmdW5jdGlvbnMqL1xuLyoqXG4gKiBDcmVhdGUgYnJvd3NlciB3aXRoIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJyb3dzZXJ8bnVsbD59XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJyb3dzZXIoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gR2V0IGJyb3dzZXIgb3B0aW9uc1xuICAgICAgICBjb25zdCBicm93c2VyT3B0aW9ucyA9IGdsb2JhbFZhcnNfMS5HbG9iYWxWYXJzLmdldEJyb3dzZXJPcHRpb25zKCk7XG4gICAgICAgIGxldCBhdHRlbXB0ID0gMTtcbiAgICAgICAgLy8gU29tZXRpbWVzLCB0aGUgYnJvd3NlciBjcmFzaCBpbiBjcmVhdGlvblxuICAgICAgICAvLyBUcnlpbmcgdG8gY3JlYXRlIHRoZSBicm93c2VyIGZvciAzIHRpbWVzXG4gICAgICAgIHdoaWxlIChhdHRlbXB0IDw9IDMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHBsYXl3cmlnaHRbZ2xvYmFsVmFyc18xLkdsb2JhbFZhcnMuYnJvd3Nlci5uYW1lXS5sYXVuY2goYnJvd3Nlck9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMDApKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbn1cbmV4cG9ydHMuY3JlYXRlQnJvd3NlciA9IGNyZWF0ZUJyb3dzZXI7XG4vKipcbiAqIENsb3NlIHRoZSBicm93c2VyXG4gKiBAcGFyYW0gYnJvd3NlciB7QnJvd3Nlcn0gQnJvd3NlciBsYXVuY2hlZCBmb3IgdGVzdHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5mdW5jdGlvbiBjbG9zZUJyb3dzZXIoYnJvd3Nlcikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIGJyb3dzZXIuY2xvc2UoKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuY2xvc2VCcm93c2VyID0gY2xvc2VCcm93c2VyO1xuLyogQ29udGV4dCBmdW5jdGlvbnMgKi9cbi8qKlxuICogQ3JlYXRlIGJyb3dzZXIgY29udGV4dCB3aXRoIHZpZXdwb3J0IGFuZCBsYW5ndWFnZVxuICogQHBhcmFtIGJyb3dzZXIge0Jyb3dzZXJ9IEJyb3dzZXIgY3JlYXRlZCB3aXRoIGZ1bmN0aW9uIGFib3ZlXG4gKiBAcGFyYW0gY29va2llcyB7Q29va2llW119IENvb2tpZXMgdG8gYWRkIGJlZm9yZSB0ZXN0XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCcm93c2VyQ29udGV4dD59XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoYnJvd3NlciwgY29va2llcyA9IFtdKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dE9wdGlvbnMgPSBnbG9iYWxWYXJzXzEuR2xvYmFsVmFycy5nZXRCcm93c2VyQ29udGV4dE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgYnJvd3NlckNvbnRleHQgPSB5aWVsZCBicm93c2VyLm5ld0NvbnRleHQoY29udGV4dE9wdGlvbnMpO1xuICAgICAgICB5aWVsZCBicm93c2VyQ29udGV4dC5hZGRDb29raWVzKGNvb2tpZXMpO1xuICAgICAgICByZXR1cm4gYnJvd3NlckNvbnRleHQ7XG4gICAgfSk7XG59XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuLyoqXG4gKiBDbG9zZSBicm93c2VyIGNvbnRleHRcbiAqIEBwYXJhbSBjb250ZXh0IHtCcm93c2VyQ29udGV4dH0gQnJvd3NlciBjb250ZXh0IGNyZWF0ZWQgYWJvdmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5mdW5jdGlvbiBjbG9zZUNvbnRleHQoY29udGV4dCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIGNvbnRleHQuY2xvc2UoKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuY2xvc2VDb250ZXh0ID0gY2xvc2VDb250ZXh0O1xuLyoqXG4gKiBHZXQgYnJvd3NlciBjb250ZXh0IGJ5IHBvc2l0aW9uXG4gKiBAcGFyYW0gYnJvd3NlciB7QnJvd3Nlcn0gQnJvd3NlciBsYXVuY2hlZCBmb3IgdGVzdHNcbiAqIEBwYXJhbSBwb3NpdGlvbiB7bnVtYmVyfSBQb3NpdGlvbiBvZiB0aGUgY29udGV4dCAoLTEgZm9yIHRoZSBsYXN0IGNvbnRleHQpXG4gKiBAcmV0dXJucyB7QnJvd3NlckNvbnRleHR9XG4gKi9cbmZ1bmN0aW9uIGdldEJyb3dzZXJDb250ZXh0KGJyb3dzZXIsIHBvc2l0aW9uID0gLTEpIHtcbiAgICBjb25zdCBjb250ZXh0cyA9IGJyb3dzZXIuY29udGV4dHMoKTtcbiAgICBpZiAoY29udGV4dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignMCBDb250ZXh0IHdhcyBmb3VuZCBmb3IgdGhpcyBicm93c2VyJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHBvc2l0aW9uIDwgLTEgfHwgcG9zaXRpb24gPj0gY29udGV4dHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUG9zaXRpb24gJHtwb3NpdGlvbn0gaXMgd3JvbmcgdG8gZ2V0IHRoZSBjb250ZXh0YCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHBvc2l0aW9uID09PSAtMSkge1xuICAgICAgICByZXR1cm4gY29udGV4dHNbY29udGV4dHMubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0c1twb3NpdGlvbl07XG59XG5leHBvcnRzLmdldEJyb3dzZXJDb250ZXh0ID0gZ2V0QnJvd3NlckNvbnRleHQ7XG4vKiBUYWIgZnVuY3Rpb25zICovXG4vKipcbiAqIEFkZCBuZXcgdGFiIG9uIHRoZSBicm93c2VyXG4gKiBAcGFyYW0gY29udGV4dCB7QnJvd3NlckNvbnRleHR9IEJyb3dzZXIgY29udGV4dCBjcmVhdGVkIGFib3ZlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYWdlPn1cbiAqL1xuZnVuY3Rpb24gYWRkVGFiKGNvbnRleHQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4gY29udGV4dC5uZXdQYWdlKCk7XG4gICAgfSk7XG59XG5leHBvcnRzLmFkZFRhYiA9IGFkZFRhYjtcbi8qKlxuICogQ2xvc2UgYnJvd3NlciB0YWJcbiAqIEBwYXJhbSB0YWIge1BhZ2V9IEJyb3dzZXIgdGFiIGNyZWF0ZWQgYWJvdmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5mdW5jdGlvbiBjbG9zZVRhYih0YWIpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB5aWVsZCB0YWIuY2xvc2UoKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuY2xvc2VUYWIgPSBjbG9zZVRhYjtcbi8qKlxuICogR2V0IEJyb3dzZXIgdGFiIGZyb20gcG9zaXRpb25cbiAqIEBwYXJhbSBjb250ZXh0IHtCcm93c2VyQ29udGV4dH0gQ29udGV4dCB0byBnZXQgdGFiIGZyb21cbiAqIEBwYXJhbSBwb3NpdGlvbiB7bnVtYmVyfSBQb3NpdGlvbiBvZiB0aGUgdGFiICgtMSBmb3IgbGFzdCB0YWIpXG4gKiBAcmV0dXJucyB7UGFnZX1cbiAqL1xuZnVuY3Rpb24gZ2V0VGFiKGNvbnRleHQsIHBvc2l0aW9uID0gLTEpIHtcbiAgICBjb25zdCB0YWJzID0gY29udGV4dC5wYWdlcygpO1xuICAgIGlmICh0YWJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJzAgUGFnZSB3YXMgZm91bmQgZm9yIHRoaXMgY29udGV4dCcpO1xuICAgIH1cbiAgICBlbHNlIGlmIChwb3NpdGlvbiA8IC0xIHx8IHBvc2l0aW9uID49IHRhYnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUG9zaXRpb24gJHtwb3NpdGlvbn0gaXMgd3JvbmcgdG8gZ2V0IHRoZSBicm93c2VyIHRhYmApO1xuICAgIH1cbiAgICBlbHNlIGlmIChwb3NpdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRhYnNbdGFicy5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcmV0dXJuIHRhYnNbcG9zaXRpb25dO1xufVxuZXhwb3J0cy5nZXRUYWIgPSBnZXRUYWI7XG4vKiBSb3V0ZXMgZnVuY3Rpb25zICovXG4vKipcbiAqIEFkZCByb3V0ZSB0byB0aGUgYnJvd3NlciB0YWIgb3IgdG8gdGhlIGJyb3dzZXIgY29udGV4dFxuICogQHBhcmFtIGJyb3dzZXJFbGVtZW50IHtQYWdlfEJyb3dzZXJDb250ZXh0fVxuICogQHBhcmFtIHVybCB7c3RyaW5nfFJlZ0V4cHxmdW5jdGlvbihVUkwpOmJvb2xlYW59XG4gKiBAcGFyYW0gaGFuZGxlciB7ZnVuY3Rpb24oUm91dGUsIFJlcXVlc3QpfVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZnVuY3Rpb24gYWRkUm91dGUoYnJvd3NlckVsZW1lbnQsIHVybCwgaGFuZGxlcikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIGJyb3dzZXJFbGVtZW50LnJvdXRlKHVybCwgaGFuZGxlcik7XG4gICAgfSk7XG59XG5leHBvcnRzLmFkZFJvdXRlID0gYWRkUm91dGU7XG4vKipcbiAqIERlbGV0ZSByb3V0ZSB0byB0aGUgYnJvd3NlciB0YWIgb3IgdG8gdGhlIGJyb3dzZXIgY29udGV4dFxuICogQHBhcmFtIGJyb3dzZXJFbGVtZW50IHtQYWdlfEJyb3dzZXJDb250ZXh0fVxuICogQHBhcmFtIHVybCB7c3RyaW5nfFJlZ0V4cHxmdW5jdGlvbihVUkwpOmJvb2xlYW59XG4gKiBAcGFyYW0gaGFuZGxlciB7ZnVuY3Rpb24oUm91dGUsIFJlcXVlc3QpfVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZnVuY3Rpb24gZGVsZXRlUm91dGUoYnJvd3NlckVsZW1lbnQsIHVybCwgaGFuZGxlcikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIGJyb3dzZXJFbGVtZW50LnVucm91dGUodXJsLCBoYW5kbGVyKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlUm91dGUgPSBkZWxldGVSb3V0ZTtcbi8qKlxuICogQWRkIGluaXQgc2NyaXB0IHRvIHRoZSBicm93c2VyIHRhYiBvciB0byB0aGUgYnJvd3NlciBjb250ZXh0XG4gKiBAcGFyYW0gYnJvd3NlckVsZW1lbnQge1BhZ2V8QnJvd3NlckNvbnRleHR9XG4gKiBAcGFyYW0gc2NyaXB0IHtGdW5jdGlvbnxzdHJpbmd8e3BhdGg6ID9zdHJpbmcsIGNvbnRlbnQ6ID9zdHJpbmd9fVxuICogQHBhcmFtIGFyZ3Mge25ldmVyfVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZnVuY3Rpb24gYWRkSW5pdFNjcmlwdChicm93c2VyRWxlbWVudCwgc2NyaXB0LCBhcmdzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgeWllbGQgYnJvd3NlckVsZW1lbnQuYWRkSW5pdFNjcmlwdChzY3JpcHQsIGFyZ3MpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5hZGRJbml0U2NyaXB0ID0gYWRkSW5pdFNjcmlwdDtcbmV4cG9ydHMuYnJvd3NlckhlbHBlciA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9icm93c2VySGVscGVyXCIpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRiSGVscGVyID0gdm9pZCAwO1xuLy8gSW1wb3J0IG1vZHVsZXNcbmNvbnN0IHByb21pc2VfMSA9IHJlcXVpcmUoXCJteXNxbDIvcHJvbWlzZVwiKTtcbi8vIEltcG9ydCBoZWxwZXJzXG5jb25zdCBnbG9iYWxWYXJzXzEgPSByZXF1aXJlKFwic3JjL2hlbHBlcnMvZ2xvYmFsVmFyc1wiKTtcbmNsYXNzIERiSGVscGVyIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwb29sXG4gICAgICogQHBhcmFtIGRiXG4gICAgICogQHJldHVybnMge1Bvb2x9XG4gICAgICovXG4gICAgY3JlYXRlUG9vbChkYiA9IGdsb2JhbFZhcnNfMS5HbG9iYWxWYXJzLmRiKSB7XG4gICAgICAgIHJldHVybiAoMCwgcHJvbWlzZV8xLmNyZWF0ZVBvb2wpKGRiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBhbiBzcWwgcXVlcnlcbiAgICAgKiBAcGFyYW0gcXVlcnkge3N0cmluZ30gUXVlcnkgdG8gZXhlY3V0ZVxuICAgICAqIEByZXR1cm5zIHtRdWVyeX1cbiAgICAgKi9cbiAgICBleGVjdXRlUXVlcnkocXVlcnkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmNyZWF0ZVBvb2woKTtcbiAgICAgICAgICAgIGNvbnN0IHJ